2a1a4dc723c6b649e914c5846c9ab4c0b17c69a3
[blender.git] / release / scripts / modules / gpu_extras / batch.py
1 # ***** BEGIN GPL LICENSE BLOCK *****
2 #
3 # This program is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU General Public License
5 # as published by the Free Software Foundation; either version 2
6 # of the License, or (at your option) any later version.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software Foundation,
15 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ***** END GPL LICENSE BLOCK *****
18
19 __all__ = (
20     "batch_for_shader",
21 )
22
23
24 def batch_for_shader(shader, type, content, indices=None):
25     """
26     Return a batch already configured and compatible with the shader.
27
28     :arg shader: shader for which a compatible format will be computed.
29     :type shader: :class:`gpu.types.GPUShader`
30     :arg type: "'POINTS', 'LINES', 'TRIS' or 'LINES_ADJ'".
31     :type type: str
32     :arg content: Maps the name of the shader attribute with the data to fill the vertex buffer.
33     :type content: dict
34     :return: compatible batch
35     :rtype: :class:`gpu.types.Batch`
36     """
37     import gpu
38     from gpu.types import (
39         GPUBatch,
40         GPUIndexBuf,
41         GPUVertBuf,
42     )
43
44     for data in content.values():
45         vbo_len = len(data)
46         break
47     else:
48         raise ValueError("Empty 'content'")
49
50     vbo_format = shader.format_calc()
51     vbo = GPUVertBuf(vbo_format, vbo_len)
52
53     for id, data in content.items():
54         if len(data) != vbo_len:
55             raise ValueError("Length mismatch for 'content' values")
56         vbo.attr_fill(id, data)
57
58     if indices is None:
59         return GPUBatch(type=type, buf=vbo)
60     else:
61         ibo = GPUIndexBuf(type=type, seq=indices)
62         return GPUBatch(type=type, buf=vbo, elem=ibo)