2013-08-27 4 views
0

이전 3D 모델 파일 형식 (관심이 있다면 Carbon Graphics 'GEO)을 사용하는 시뮬레이션 및이 모델 형식의 OpenSceneGraph 플러그인이 내부 변수는 값을 업데이트 할 때 모델이 호출 할 콜백 메소드를 등록하는 것입니다. 콜백에는 시뮬레이션 시간, 변수 이름 및 현재 값이 있습니다. 해당 변수에 대한 새 값을 되돌려 야합니다.콜백 메소드가 멤버 변수 또는 인스턴스에 액세스 할 수 없습니다.

headerNode->setUserUpdate(&FlightDriver::updateGeoVariable); 

클래스 headerNode은 있습니다 다음 변수가 속한 : 다음과 같이 그래서, 내 코드에서, 내가 콜백을 설정

double (* uvarupdate)(const double t, const double val, const std::string name); 

모든 간격이 uvarupdate를 호출하는 I

updateGeoVariable(const double time, const double val, const std::string name) 
{ 
    return flightData->getValue(name); 
} 

(모델에서 각 변수에 대해 하나씩) 예. 인스턴스마다 고유해야하므로 메소드 또는 flightData 멤버를 정적으로 만들 수 없습니다.

나는이 콜백이 C 코드에서 호출되었다는 직감을 가지고있다. 왜냐하면 내가 깨졌을 때 그것이 클래스 내부에 있다는 것을 알지 못하는 것 같다. 그리고 서명을 바꾸면 동일한 세 값이 전달된다. 어떤 매개 변수가 먼저 쓰 였는지 구두로 신으십시오.

그러나 정말로 더러운 kludge를 피하기 위해 클래스 멤버에게 액세스 권한이 필요합니다. 클래스 자체가 3D 세계에서 모델을 구동하는 것이기 때문에 2 개 이상을 사용하면 "234, pitch, 90"이라고하는 콜백을 얻을 수 있으며 데이터가 속한 모델의 변수를 알 수있는 방법이 없습니다.

OSG 플러그인이므로 DLL을 다시 컴파일하여 해당 인스턴스 또는 ID 또는 뭔가에 대한 포인터를 가져 와서 콜백에서 반환 할 수는 있지만 실제로이를 피하고 싶습니다. 가능하다면.

썽킹에 대해 읽었지만 대부분의 다른 아이디어는 콜백을 생성하는 코드에 액세스해야합니다. 어떤 아이디어?

답변

0

메서드에 대한 포인터를 전달해야하지만 uvarupdate은 함수를 가리키는 포인터입니다. 이들은 다른 유형입니다. 메서드에 대한 포인터는 인스턴스의 this에 대한 암시 적 포인터를 포함하며 함수 포인터에 맞지 않습니다. 다른 방법으로 this을 전달해야합니다.

콜백 서명을 변경하지 않으면 어떻게 든 인스턴스 (this)를 계산해야합니다. name 매개 변수에서 확인할 수 있다면 쉽습니다. 또 다른 방법은 각각의 인스턴스에 대해 트램펄린을 만드는 것입니다. 인스턴스가 거의없는 경우 각 인스턴스에 대해 개별 트램 폴린 기능을 작성할 수 있습니다. trampolines를 동적으로 (런타임에) 생성하는 것은 까다 롭고 이식성이 없습니다. 사실, 올바른 기계 번호 this 매개 변수로 메소드를 호출 할 수 있도록 RAM에 일부 기계 명령어를 작성해야합니다. 그러나 이것도 가능합니다. 일부 라이브러리가 이에 해당합니다 (예 : Delphi의 VCL).

+0

나는 트램펄린에 대해 들어 본 적이 없다. 나는 그것에 대해 읽을 것이다. 그래도 uvarupdate의 서명을 변경해야합니까? 그렇다면 필자는 필자가 필요로하는 추가 기능으로 직접 플러그인을 다시 컴파일하려고 시도 할 것이라고 생각합니다. – drearyworlds

+0

trampoline은 C++ 메서드를 호출하는 일반 (비 멤버) 함수입니다. 이 경우'uvarupdate '의 서명을 변경할 필요가 없습니다. 단지'setUserUpdate'에 트램펄린에 대한 포인터를 전달하기 만하면됩니다.그러나 클래스의 각 인스턴스마다 다른 트램펄린이 필요합니다. 즉 인스턴스가 어떻게 구별되는지입니다. – Inspired