diff options
author | Germano Cavalcante <mano-wii> | 2022-09-01 14:21:10 +0300 |
---|---|---|
committer | Germano Cavalcante <germano.costa@ig.com.br> | 2022-09-01 14:25:55 +0300 |
commit | 6269d66da29ae000f214e775ee54dfc71623e642 (patch) | |
tree | cbf2fb0f29c3d770ede527e844a1e749f78c5522 /release/scripts/modules | |
parent | 05fe7ca5af93208e56e3b120fa9caf157f43fc75 (diff) |
PyGPU: GPUShader: implementation of 'attrs_info_get' method
With the new `attrs_info_get` method, we can get information about
the attributes used in a `GPUShader` and thus have more freedom in the
automatic creation of `GPUVertFormat`s
Reviewed By: fclem, campbellbarton
Differential Revision: https://developer.blender.org/D15764
Diffstat (limited to 'release/scripts/modules')
-rw-r--r-- | release/scripts/modules/gpu_extras/batch.py | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/release/scripts/modules/gpu_extras/batch.py b/release/scripts/modules/gpu_extras/batch.py index 34dd1f16665..ba8e3879a8e 100644 --- a/release/scripts/modules/gpu_extras/batch.py +++ b/release/scripts/modules/gpu_extras/batch.py @@ -22,15 +22,46 @@ def batch_for_shader(shader, type, content, *, indices=None): GPUBatch, GPUIndexBuf, GPUVertBuf, + GPUVertFormat, ) + def recommended_comp_type(attr_type): + if attr_type in {'FLOAT', 'VEC2', 'VEC3', 'VEC4', 'MAT3', 'MAT4'}: + return 'F32' + if attr_type in {'UINT', 'UVEC2', 'UVEC3', 'UVEC4'}: + return 'U32' + # `attr_type` in {'INT', 'IVEC2', 'IVEC3', 'IVEC4', 'BOOL'}. + return 'I32' + + def recommended_attr_len(attr_name): + item = content[attr_name][0] + attr_len = 1 + try: + while True: + attr_len *= len(item) + item = item[0] + except TypeError: + pass + return attr_len + + def recommended_fetch_mode(comp_type): + if comp_type == 'F32': + return 'FLOAT' + return 'INT' + for data in content.values(): vbo_len = len(data) break else: raise ValueError("Empty 'content'") - vbo_format = shader.format_calc() + vbo_format = GPUVertFormat() + attrs_info = shader.attrs_info_get() + for name, attr_type in attrs_info: + comp_type = recommended_comp_type(attr_type) + attr_len = recommended_attr_len(name) + vbo_format.attr_add(id=name, comp_type=comp_type, len=attr_len, fetch_mode=recommended_fetch_mode(comp_type)) + vbo = GPUVertBuf(vbo_format, vbo_len) for id, data in content.items(): |