2012-04-09 37 views
0

編輯: 一個最小的失敗測試用例現在在GitHub上的位置: https://github.com/shadowmint/Panda-setRamImage-problem如何在panda3d中使用setRamImage?

-

我有一個傳遞一個無符號字符*指針回到與它的RGB像素數據蟒蛇C庫。

Python API中要做到這一點:

# 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): 

我困惑的是這個地方 '4' 長從何而來,因爲RGB排列在第20個多值的垃圾場是這樣的:

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 

必須有我無符號的char *數組轉換成的東西,可以送入PTAUchar.setData或PTAUchar.setSubdata的方式,但我無法弄清楚。

幫助!

+0

如果您使用Panda的最新開發版本,您應該能夠將任何公開Python緩衝區協議的對象傳遞給PTAUchar構造函數,這比通過字符串進行復制要高效得多。另請參閱Panda3D博客上的最新帖子。 – rdb 2014-04-20 11:13:52

回答

1

setData函數的定義是:

PTAUchar.setData(string data) 

你不及格的字符串。你傳遞一個指向字符串的指針。我想你想要做的是讓你的C庫傳遞一個python字節字符串回到你的python代碼,然後把它傳遞給setData

PS:來到freenode的#panda3d是獲得實時幫助的好地方。

+0

很有幫助,但這是非常通用的建議。你可以說得更詳細點嗎? c_char_p類型使c返回一個python字符串,但它是NULL終止的,這意味着你不能將例如BLACK PIXELS(或任何具有0分量的像素)傳遞回去,從而使API完全無用。 – Doug 2012-04-11 00:56:52

+0

一個python字符串肯定可以有一個0字節。也許你想PyString_FromStringAndSize? – jterrace 2012-04-11 01:11:49

+0

缺少的步驟是使用rgb = rgb [:expectedSize] // PTAUchar.setData(rgb)將POINTER(c_char)轉換爲字符串。 – Doug 2012-04-11 03:15:51