[질문] D3DXVECTOR3 변수 바인딩...

9 views
Skip to first unread message

Farts

unread,
Oct 10, 2007, 5:25:14 AM10/10/07
to squirrelusers-kr
오늘의 주제는 D3DXVECTOR3 바인딩... orz...

DXSquirrel의 예제를 봤지만 클래스를 만드는게 아니라 각각의 함수를 만들어 바인드 하는 식인거 같았습니다.

클래스에 있는 D3DXVECTOR3 맴버 변수를 바인딩하고 싶은데, 마땅한 방법이 위키를 찾아봐도 없어서 질문을...

class CObject
{
protected:
D3DXVECTOR3 m_vecPos;
.
.
.
}

m_vecPos를 스크립트에서도 쓰고 싶은데, DXSquirrel에 쓰이는 방식은 안되더라고요. 어떻게 해야하나요?

Farts

unread,
Oct 10, 2007, 6:19:19 AM10/10/07
to squirrelusers-kr
바인딩은...

SqPlus::BindVariable( root, &m_vecTestVector, TEXT( "vecTest" ) );

했더니 에러...

Farts

unread,
Oct 10, 2007, 8:46:50 AM10/10/07
to squirrelusers-kr
// Using global functions to construct and release classes.
int releaseD3DXVECTOR3(SQUserPointer up,SQInteger size) {
SQ_DELETE_CLASS(D3DXVECTOR3);
} // releaseNewTestObj

int constructD3DXVECTOR3( HSQUIRRELVM v )
{
StackHandler sa(v);
int paramCount = sa.GetParamCount();
if (paramCount == 1) {
return SqPlus::PostConstruct<D3DXVECTOR3>(v,new
D3DXVECTOR3(),releaseD3DXVECTOR3);
} else if (paramCount == 2) {
D3DXVECTOR3 *vecParam = (D3DXVECTOR3 *)sa.GetUserPointer( 2 );
return SqPlus::PostConstruct<D3DXVECTOR3>(v,new
D3DXVECTOR3( vecParam->x, vecParam->y, vecParam-
>z ),releaseD3DXVECTOR3);
} else if (paramCount == 4) {
return SqPlus::PostConstruct<D3DXVECTOR3>(v,new
D3DXVECTOR3(sa.GetFloat(2),sa.GetFloat(3),sa.GetFloat(4)),releaseD3DXVECTOR3);
} // if
return sq_throwerror(v,_T("Invalid Constructor arguments"));
}

.
.
.

D3DXVECTOR3 *CObject::GetTest( void ) { return &m_vecPos; }

.
.
.

SqPlus::SQClassDef<D3DXVECTOR3>( TEXT( "D3DXVECTOR3" ) ).

staticFuncVarArgs(constructD3DXVECTOR3,_T("constructor"),_T("*")). //
Using a global constructor: useful in cases where a custom constructor/
destructor are required and the original class is not to be modified.
var( &D3DXVECTOR3::x, TEXT( "x" ) ).
var( &D3DXVECTOR3::y, TEXT( "y" ) ).
var( &D3DXVECTOR3::z, TEXT( "z" ) );

SqPlus::RegisterGlobal( v, *this, &CObject::GetTest,
TEXT( "GetTest" ) );

이렇게 코드 추가하고, 스크립트에서...

local test = D3DXVECTOR3( GetTest() );

이런 식으로 해서 해결봤습니다. 그런데 미심쩍은 부분이 한 두개가 아니라는거....

1) 직접 변수를 바인딩을 하는 방법은 없을까요? 꼭 Get*()함수가 필요한건지...
2) 꼭, D3DXVECTOR3( GetTest() )처럼 생성자에다 인자로 넘겨주어야 하는지요? local test =
GetTest() 같이 안되는건가요?

yagur

unread,
Oct 10, 2007, 3:41:06 PM10/10/07
to squirrelusers-kr
1) 바인딩.
SqPlus::BindVariable(&kVariable, _T("bindVariable"));
위와같이 하시면 간편히 바인딩 됩니다.

2) 생성인자로 구지 넘기지 않고 원하시는대로 동작합니다.
아래와 같이 했는데 문제없이 동작하는군요.
class MyVector
{
public:
float m_fX;
float m_fY;
float m_fZ;
};

DECLARE_INSTANCE_TYPE(MyVector);
SqPlus::SQClassDef<MyVector>(_T("MyVector"))
.var(&MyVector::m_fX,_T("x"))
.var(&MyVector::m_fY,_T("y"))
.var(&MyVector::m_fZ,_T("z"));

MyVector kVector;
SqPlus::BindVariable(&kVector, _T("bindVector"));

- test.nut -
local vector = MyVector();
bindVector.y = 1.0;

Farts

unread,
Oct 11, 2007, 12:36:02 AM10/11/07
to squirrelusers-kr
감사합니다. 답변대로 고쳤더니, 에러가 있었냐는 듯이 아무 문제없이 되네요.

DECLARE_INSTANCE_TYPE()이 키포인트였던듯...

Reply all
Reply to author
Forward
0 new messages