def setup_framebuffer(surface,flip=False):
#Create texture if not done already
if surface.texture is None:
create_texture(surface)
#Render child to parent
if surface.frame_buffer is None:
surface.frame_buffer = glGenFramebuffersEXT(1)
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, c_uint(int(surface.frame_buffer)))
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, surface.texture, 0)
glPushAttrib(GL_VIEWPORT_BIT)
glViewport(0,0,surface._scale[0],surface._scale[1])
glMatrixMode(GL_PROJECTION)
glLoadIdentity() #Load the projection matrix
if flip:
gluOrtho2D(0,surface._scale[0],surface._scale[1],0)
else:
gluOrtho2D(0,surface._scale[0],0,surface._scale[1])
这个函数调用CuraTyType纹理,所以我必须把这个函数传递给C++函数,我将用第三个参数来处理它。这是到目前为止我所掌握的信息,同时我还试图了解python文档的相关信息:
^{pr2}$
从Python整数中获取C
int
的方法是使用PyInt_AsLong()
和一个向下转换(尽管您可能希望改用C long)。我不清楚您想在代码中的哪个位置执行此操作,尽管我对您的代码有一些其他注释:从概念上讲,
PyObject_IsTrue()
返回一个布尔值。不要将其与1比较,只需将其用作布尔值。但是,您应该检查它是否返回错误,即-1。(通常的检查是< 0
)如果不检查返回的错误,则最终会吞下异常,但会留下异常对象。这很糟糕。不需要
create_texture
的Py_XINCREF()
。您有一个对args
元组的引用,而元组又拥有对create_texture
对象的引用。在函数返回之前,create_texture
无法离开。如果要使它保持比此functioncall更长的时间,则只需要增加它。如果必须增加它,就不需要使用Py_XINCREF()
,因为它永远不会为NULL。如果你真的要增加它,你需要记住在你的错误返回情况下减少它。与其创建一个参数元组来调用}。
PyEval_CallObject()
,不如调用PyObject_CallFunctionObjectArgs(create_texture, arglist, NULL)
或{Py_BuildValue("s", "frame_buffer")
并不是为"frame_buffer"
获取Python字符串的正确方法。更好的方法是PyString_FromString()
。但是,这两种方法都返回新的引用,并且PyObject_GetAttr()
不接受对属性名的引用,因此最终会泄漏该引用。您不应该使用这些,而是使用PyObject_GetAttrString()
,它将属性名作为const char*
。记住要检查所有可以返回错误值的函数的返回值(几乎所有的Python API函数都是这样的),除了}也会忘记这一点。
PyTrue_IsTrue()
之外,Py_BuildValue()
和{我可以在此提出一个真诚的建议吗?在尝试类似这样的新东西时,不要向自己扔上一百行代码,首先尝试最简单的测试用例。尝试获得一个C++扩展,它只会传递值123。(选择0或1可能会意外地起作用,所以我选择了一个易于识别的不太可能是意外的值。)然后让扩展名将传入的数字加倍,然后添加两个数字,等等
偷偷摸摸地发现问题!:-)
相关问题 更多 >
编程相关推荐