Edit: Минимальный тест в противном случае в настоящее время на GitHub здесь: https://github.com/shadowmint/Panda-setRamImage-problemКак вы используете setRamImage в panda3d?
-
У меня есть библиотека C, которая проходит без знака символ * указатель обратно питона с пиксельными данными RGB в нем.
Питон апи, чтобы сделать это:
# 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
Это работает ... но он работает с потрясающим 1 кадром каждые 2 секунды.
Если я называю 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' длина приходит, из-за свалки первых 20 нечетных значений в массиве RGB, как:
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
Там должен быть способ, чтобы преобразовать мой неподписанные символ * массив в то, что может кормить в PTAUchar.setData или PTAUchar.setSubdata, но я не могу понять это.
помощь!
Если вы используете недавнюю сборку разработки Panda, вы можете передать любой объект, подвергая протокол буфера Python конструктору PTAUchar, который будет намного эффективнее, чем копирование через строку. См. Также последнее сообщение в блоге Panda3D. – rdb