2012-04-09 2 views
0

편집 : 최소한의 실패한 테스트 케이스가 여기 GitHub의에 지금 : https://github.com/shadowmint/Panda-setRamImage-problem어떻게 panda3d에서 setRamImage를 사용합니까?

-

나는 * 거기에 RGB 픽셀 데이터를 파이썬으로 다시 포인터 부호없는 문자를 전달하는 C 라이브러리를 가지고있다. 이 작업을 수행하는

파이썬 API는 다음과 같습니다 Panda3D를에서

# unsigned char *ar_get_rgb(void *handle); 
libar.ar_get_rgb.argtypes = [ c_void_p ] 
libar.ar_get_rgb.restype = POINTER(c_char) 

나는 질감으로이 데이터를 렌더링하기 위해 노력하고있어. 내가 지금를 사용하기 위해 노력하고있어 결과로 http://www.panda3d.org/forums/viewtopic.php?t=13183, 그리고 : http://www.panda3d.org/blog/?p=96

는 그러나, 나는이 일을하는 것은 내가 여기서 논의했습니다 꽤 심각한 한계를 가지고 있음을 발견 :이 블로그 포스트는 방법에 대해 여기 텍스처 메모리를 설정하기위한 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)의 데이터를 설정하기 위해 호출하면 내가 얻을 :

나는이 '4'길이의 출처에 관해서는 의아해 해요
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 개 홀수 값의 덤프의 같은 수 있습니다 :

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 라이브러리가 파이썬 바이트 문자열을 파이썬 코드에 전달한 다음 그 패스를 setData으로 전달하는 것입니다.

추 신 : freenode에서 # panda3d를 사용하면 실시간 도움말을 얻을 수 있습니다.

+0

도움이되었지만, 이것은 정말로 일반적인 조언입니다. 더 자세하게 얘기해 주 시겠어요? c_char_p 형식을 사용하면 파이썬 문자열을 반환하지만 NULL로 끝나기 때문에 BLACK PIXELS (또는 0 구성 요소가있는 픽셀)를 전달할 수 없으므로 API가 완전히 쓸모 없게됩니다. – Doug

+0

파이썬 문자열은 확실히 0 바이트를 가질 수 있습니다. 어쩌면 PyString_FromStringAndSize를 원하겠습니까? – jterrace

+0

누락 된 단계는 POINTER (c_char)를 rgb = rgb [: expectedSize] // PTAUchar.setData (rgb)를 사용하여 문자열로 변환하는 것입니다. – Doug

관련 문제