GPU Python: optionally init the vertexformat in the vertexbuffer itself.
This commit is contained in:
@@ -98,7 +98,7 @@ static bool bpygpu_vertbuf_fill_impl(
|
||||
GPUVertBuf *vbo,
|
||||
uint data_id, PyObject *seq)
|
||||
{
|
||||
const char *exc_str_size_mismatch = "Expected a %s of size %d, got %d";
|
||||
const char *exc_str_size_mismatch = "Expected a %s of size %d, got %u";
|
||||
|
||||
bool ok = true;
|
||||
const GPUVertAttr *attr = &vbo->format.attribs[data_id];
|
||||
@@ -111,7 +111,7 @@ static bool bpygpu_vertbuf_fill_impl(
|
||||
return false;
|
||||
}
|
||||
|
||||
int comp_len = pybuffer.ndim == 1 ? 1 : pybuffer.shape[1];
|
||||
uint comp_len = pybuffer.ndim == 1 ? 1 : (uint)pybuffer.shape[1];
|
||||
|
||||
if (pybuffer.shape[0] != vbo->vertex_len) {
|
||||
PyErr_Format(PyExc_ValueError, exc_str_size_mismatch,
|
||||
@@ -221,22 +221,43 @@ static int bpygpu_fill_attribute(GPUVertBuf *buf, int id, PyObject *py_seq_data)
|
||||
|
||||
static PyObject *bpygpu_VertBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
|
||||
{
|
||||
const char *error_prefix = "GPUVertBuf.__new__";
|
||||
|
||||
struct {
|
||||
BPyGPUVertFormat *py_fmt;
|
||||
PyObject *py_fmt;
|
||||
uint len;
|
||||
} params;
|
||||
|
||||
static const char *_keywords[] = {"format", "len", NULL};
|
||||
static _PyArg_Parser _parser = {"O!I:GPUVertBuf.__new__", _keywords, 0};
|
||||
static _PyArg_Parser _parser = {"OI:GPUVertBuf.__new__", _keywords, 0};
|
||||
if (!_PyArg_ParseTupleAndKeywordsFast(
|
||||
args, kwds, &_parser,
|
||||
&BPyGPUVertFormat_Type, ¶ms.py_fmt,
|
||||
¶ms.py_fmt,
|
||||
¶ms.len))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct GPUVertBuf *vbo = GPU_vertbuf_create_with_format(¶ms.py_fmt->fmt);
|
||||
GPUVertFormat *fmt, fmt_stack;
|
||||
|
||||
if (BPyGPUVertFormat_Check(params.py_fmt)) {
|
||||
fmt = &((BPyGPUVertFormat *)params.py_fmt)->fmt;
|
||||
}
|
||||
else if (PyList_Check(params.py_fmt)) {
|
||||
fmt = &fmt_stack;
|
||||
GPU_vertformat_clear(fmt);
|
||||
if (!bpygpu_vertformat_from_PyList(
|
||||
(PyListObject *)params.py_fmt, error_prefix, fmt))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
PyErr_SetString(PyExc_TypeError, "format not understood");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct GPUVertBuf *vbo = GPU_vertbuf_create_with_format(fmt);
|
||||
|
||||
GPU_vertbuf_data_alloc(vbo, params.len);
|
||||
|
||||
|
||||
@@ -193,25 +193,9 @@ static int add_attribute_from_tuple(GPUVertFormat *format, PyObject *data)
|
||||
return add_attribute_simple(format, name, comp_type, length);
|
||||
}
|
||||
|
||||
static int insert_attributes_from_list(GPUVertFormat *format, PyObject *list)
|
||||
{
|
||||
Py_ssize_t amount = PyList_Size(list);
|
||||
|
||||
for (Py_ssize_t i = 0; i < amount; i++) {
|
||||
PyObject *element = PyList_GET_ITEM(list, i);
|
||||
if (!PyTuple_Check(element)) {
|
||||
PyErr_SetString(PyExc_TypeError, "expected a list of tuples");
|
||||
return 0;
|
||||
}
|
||||
if (!add_attribute_from_tuple(format, element)) return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static PyObject *bpygpu_VertFormat_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
|
||||
{
|
||||
PyObject *format_list;
|
||||
PyListObject *format_list;
|
||||
|
||||
static const char *_keywords[] = {"format", NULL};
|
||||
static _PyArg_Parser _parser = {"O!:VertFormat.__new__", _keywords, 0};
|
||||
@@ -224,8 +208,8 @@ static PyObject *bpygpu_VertFormat_new(PyTypeObject *UNUSED(type), PyObject *arg
|
||||
|
||||
BPyGPUVertFormat *ret = (BPyGPUVertFormat *)BPyGPUVertFormat_CreatePyObject(NULL);
|
||||
|
||||
if (!insert_attributes_from_list(&ret->fmt, format_list)) {
|
||||
Py_DecRef((PyObject *)ret);
|
||||
if (!bpygpu_vertformat_from_PyList(format_list, "VertFormat.__new__", &ret->fmt)) {
|
||||
Py_DECREF(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -310,4 +294,27 @@ PyObject *BPyGPUVertFormat_CreatePyObject(GPUVertFormat *fmt)
|
||||
return (PyObject *)self;
|
||||
}
|
||||
|
||||
bool bpygpu_vertformat_from_PyList(
|
||||
const PyListObject *list, const char *error_prefix, GPUVertFormat *r_fmt)
|
||||
{
|
||||
BLI_assert(PyList_Check(list));
|
||||
|
||||
Py_ssize_t amount = Py_SIZE(list);
|
||||
|
||||
for (Py_ssize_t i = 0; i < amount; i++) {
|
||||
PyObject *element = PyList_GET_ITEM(list, i);
|
||||
if (!PyTuple_Check(element)) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%.200s expected a list of tuples", error_prefix);
|
||||
|
||||
return false;
|
||||
}
|
||||
if (!add_attribute_from_tuple(r_fmt, element)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
@@ -37,5 +37,7 @@ typedef struct BPyGPUVertFormat {
|
||||
} BPyGPUVertFormat;
|
||||
|
||||
PyObject *BPyGPUVertFormat_CreatePyObject(struct GPUVertFormat *fmt);
|
||||
bool bpygpu_vertformat_from_PyList(
|
||||
const PyListObject *list, const char *error_prefix, GPUVertFormat *r_fmt);
|
||||
|
||||
#endif /* __GPU_PY_VERTEX_FORMAT_H__ */
|
||||
|
||||
Reference in New Issue
Block a user