尝试用属性(ctypes.c\u float*60)对类进行cythonize

2024-09-30 12:22:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试对一些pi3d模块进行cythonize(已经正常工作了好几年了)。Shape类包含一个统一变量数组,该数组传递给一个OpenGL ES 2.0函数,其规范为: void glUniform3fv(GLint location, GLsizei count, const GLfloat *value)在纯python版本中,变量在Shape.__init__()中定义

self.unif = (ctypes.c_float * 60) (x, y, z, rx, ry, rz...
#... then later passed as an argument to a function as unif and used like
opengles.glUniform3fv(shader.unif_unif, 20, ctypes.byref(unif))

我希望保持py文件不变,并在pxd文件中添加cython规范

cdef class Shape(Loadable):
  cdef:
    public float[60] unif
    public object shader
    public list textures, buf, children
    ...

它可以编译,但是unif已经变成了list而不是c_float_Array_60对象,在纯python和ctypes.byref类型(unif)失败。你知道吗

如果我把unif变成一个numpy数组,那么它将编译,并且我可以使用可怕的

opengles.glUniform3fv(shader.unif_unif, 20, ctypes.byref(
                  unif.ctypes.data_as(ctypes.POINTER(ctypes.c_float)))
                     )

所以我的问题是:我应该如何指定unif属性是pxd文件中的c_float_Array_60对象这一事实。或者这是不可能的?你知道吗


Tags: 文件规范as数组publicfloatctypesshape

热门问题