2012-04-09 2 views
0

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, но я не могу понять это.

помощь!

+0

Если вы используете недавнюю сборку разработки Panda, вы можете передать любой объект, подвергая протокол буфера Python конструктору PTAUchar, который будет намного эффективнее, чем копирование через строку. См. Также последнее сообщение в блоге Panda3D. – rdb

ответ

1

определение для функции setData является:

PTAUchar.setData(string data) 

Вы не передавая строку. Вы передаете указатель на строку. Я думаю, что вы хотите, чтобы ваша библиотека C передала байтовую строку python обратно в ваш код на Python, а затем передайте ее setData.

PS: Переход на # panda3d на freenode - отличное место для получения справки в реальном времени.

+0

Полезно, но это действительно общий совет. Можете быть более конкретными? Тип c_char_p заставляет c возвращать строку python, но она NULL завершена, что означает, что вы не можете передать, например, BLACK PIXELS (или любой пиксель с компонентом 0), назад, что делает API совершенно бесполезным. – Doug

+0

Строка python может иметь 0 байт. Может быть, вы хотите PyString_FromStringAndSize? – jterrace

+0

Отсутствующий шаг преобразовывал POINTER (c_char) в строку, используя rgb = rgb [: expectedSize] // PTAUchar.setData (rgb). – Doug

Смежные вопросы