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 /source/blender/python | |
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 'source/blender/python')
-rw-r--r-- | source/blender/python/gpu/gpu_py_shader.c | 43 | ||||
-rw-r--r-- | source/blender/python/gpu/gpu_py_shader.h | 5 | ||||
-rw-r--r-- | source/blender/python/gpu/gpu_py_shader_create_info.cc | 2 |
3 files changed, 49 insertions, 1 deletions
diff --git a/source/blender/python/gpu/gpu_py_shader.c b/source/blender/python/gpu/gpu_py_shader.c index 216f98202d4..ce250df1589 100644 --- a/source/blender/python/gpu/gpu_py_shader.c +++ b/source/blender/python/gpu/gpu_py_shader.c @@ -16,6 +16,7 @@ #include "GPU_uniform_buffer.h" #include "../generic/py_capi_utils.h" +#include "../generic/python_utildefines.h" #include "../mathutils/mathutils.h" #include "gpu_py.h" @@ -614,6 +615,44 @@ static PyObject *pygpu_shader_format_calc(BPyGPUShader *self, PyObject *UNUSED(a return (PyObject *)ret; } +PyDoc_STRVAR( + pygpu_shader_attrs_info_get_doc, + ".. method:: attrs_info_get()\n" + "\n" + " Information about the attributes used in the Shader.\n" + "\n" + " :return: tuples containing information about the attributes in order (name, type)\n" + " :rtype: tuple\n"); +static PyObject *pygpu_shader_attrs_info_get(BPyGPUShader *self, PyObject *UNUSED(arg)) +{ + uint attr_len = GPU_shader_get_attribute_len(self->shader); + int location_test = 0, attrs_added = 0; + ; + PyObject *ret = PyTuple_New(attr_len); + while (attrs_added < attr_len) { + char name[256]; + int type; + if (!GPU_shader_get_attribute_info(self->shader, location_test++, name, &type)) { + continue; + } + PyObject *py_type; + if (type != -1) { + py_type = PyUnicode_InternFromString( + PyC_StringEnum_FindIDFromValue(pygpu_attrtype_items, type)); + } + else { + py_type = Py_None; + Py_INCREF(py_type); + } + + PyObject *attr_info = PyTuple_New(2); + PyTuple_SET_ITEMS(attr_info, PyUnicode_FromString(name), py_type); + PyTuple_SetItem(ret, attrs_added, attr_info); + attrs_added++; + } + return ret; +} + static struct PyMethodDef pygpu_shader__tp_methods[] = { {"bind", (PyCFunction)pygpu_shader_bind, METH_NOARGS, pygpu_shader_bind_doc}, {"uniform_from_name", @@ -660,6 +699,10 @@ static struct PyMethodDef pygpu_shader__tp_methods[] = { (PyCFunction)pygpu_shader_format_calc, METH_NOARGS, pygpu_shader_format_calc_doc}, + {"attrs_info_get", + (PyCFunction)pygpu_shader_attrs_info_get, + METH_NOARGS, + pygpu_shader_attrs_info_get_doc}, {NULL, NULL, 0, NULL}, }; diff --git a/source/blender/python/gpu/gpu_py_shader.h b/source/blender/python/gpu/gpu_py_shader.h index b5944c4b3a0..82d83d5716a 100644 --- a/source/blender/python/gpu/gpu_py_shader.h +++ b/source/blender/python/gpu/gpu_py_shader.h @@ -6,6 +6,10 @@ #pragma once +#ifndef __cplusplus +#include "../generic/py_capi_utils.h" +#endif + /* Make sure that there is always a reference count for PyObjects of type String as the strings are * passed by reference in the #GPUStageInterfaceInfo and #GPUShaderCreateInfo APIs. */ #define USE_GPU_PY_REFERENCES @@ -31,6 +35,7 @@ extern "C" { /* gpu_py_shader_create_info.cc */ +extern const struct PyC_StringEnumItems pygpu_attrtype_items[]; extern PyTypeObject BPyGPUShaderCreateInfo_Type; extern PyTypeObject BPyGPUStageInterfaceInfo_Type; diff --git a/source/blender/python/gpu/gpu_py_shader_create_info.cc b/source/blender/python/gpu/gpu_py_shader_create_info.cc index e00d01174f4..fbab39efe24 100644 --- a/source/blender/python/gpu/gpu_py_shader_create_info.cc +++ b/source/blender/python/gpu/gpu_py_shader_create_info.cc @@ -58,7 +58,7 @@ static const struct PyC_FlagSet pygpu_qualifiers[] = { " - ``IVEC3``\n" \ " - ``IVEC4``\n" \ " - ``BOOL``\n" -static const struct PyC_StringEnumItems pygpu_attrtype_items[] = { +const struct PyC_StringEnumItems pygpu_attrtype_items[] = { {(int)Type::FLOAT, "FLOAT"}, {(int)Type::VEC2, "VEC2"}, {(int)Type::VEC3, "VEC3"}, |