編集:最小限の失敗したテストケースがここのgithubにあります: https ://github.com/shadowmint/Panda-setRamImage-problem
-
符号なしのchar*ポインタをRGBピクセルデータを含むPythonに返すCライブラリがあります。
これを行うためのPythonAPIは次のとおりです。
# unsigned char *ar_get_rgb(void *handle);
libar.ar_get_rgb.argtypes = [ c_void_p ]
libar.ar_get_rgb.restype = POINTER(c_char)
panda3dでは、このデータをテクスチャとしてレンダリングしようとしています。その方法についてのブログ投稿がここにあります:http: //www.panda3d.org/blog/?p = 96
ただし、これを行うにはかなり深刻な制限があることがわかりました。これについては、http://www.panda3d.org/forums/viewtopic.php?t = 13183で説明しました。その結果、現在、次のことを試みています。 setRamImage()APIを使用して、テクスチャメモリを設定します。
これを行う方法があるはずですが、現時点で私ができる唯一の方法は、次のように、テクスチャでピクセルごとのセット呼び出しを使用することです。
def updateTextureTask(self, t):
expectedSize = self.getExpectedRamImageSize()
print("Expected length: " + str(expectedSize))
(rgb, depth) = self.__vision.next()
p = PTAUchar.emptyArray(expectedSize)
for i in range(0, self.__vision.width * self.__vision.height * 3):
p.setElement(i, ord(rgb[i]))
print("PTAU length: " + str(p.size()))
self.setRamImage(CPTAUchar(p))
return Task.cont
これは機能します...しかし、2秒ごとに見事な1フレームで実行されます。
p.setData(rgb)を呼び出してPTAUcharのデータを設定すると(ヒント: http: //www.panda3d.org/dox/python/html/classpanda3d_1_1core_1_1PTAUchar.html)次のようになります。
Expected length: 921600
RGB buffer size: 921600 <-- C debugging data
PTAU length: 4
Assertion failed: compression != CM_off || image.size() == do_get_expected_ram_image_size() at line 833 of panda/src/gobj/texture.cxx
Traceback (most recent call last):
RGB配列の最初の20個の奇数値のダンプは次のようになっているため、この「4」の長さがどこから来ているのか困惑しています。
0: 163, 1: 151, 2: 162, 3: 85, 4: 83, 5: 190, 6: 241, 7: 252, 8: 249, 9: 121, 10: 107, 11: 82, 12: 20, 13: 19, 14: 233, 15: 226, 16: 45, 17: 81, 18: 142, 19: 31
PTAU length: 4
unsigned char *配列を、PTAUchar.setDataまたはPTAUchar.setSubdataにフィードできるものに変換する方法が必要ですが、理解できません。
ヘルプ!