/* ----------------------------------------------------------------------------- GSFramework Copyright 2001-2013 Emmanuel Julien. All Rights Reserved. ----------------------------------------------------------------------------- */ #include "binding_helpers.h" #include "script_squirrel/cobject/matrix_decl.h" #include "math/matrix4.h" #include "math/matrix3.h" using namespace GS; //------------------------------------------------------------------------------ SQInteger PushMatrix4(HSQUIRRELVM vm, const Matrix4 &mtx) { push_Matrix4(vm, mtx); /* if (!CreateClassInstance(vm, "Matrix4", true)) return sq_suspendvm(vm); SetTableKey("m00", sq_pushfloat, -1, mtx.m[0][0]); SetTableKey("m10", sq_pushfloat, -1, mtx.m[1][0]); SetTableKey("m20", sq_pushfloat, -1, mtx.m[2][0]); SetTableKey("m30", sq_pushfloat, -1, mtx.m[3][0]); SetTableKey("m01", sq_pushfloat, -1, mtx.m[0][1]); SetTableKey("m11", sq_pushfloat, -1, mtx.m[1][1]); SetTableKey("m21", sq_pushfloat, -1, mtx.m[2][1]); SetTableKey("m31", sq_pushfloat, -1, mtx.m[3][1]); SetTableKey("m02", sq_pushfloat, -1, mtx.m[0][2]); SetTableKey("m12", sq_pushfloat, -1, mtx.m[1][2]); SetTableKey("m22", sq_pushfloat, -1, mtx.m[2][2]); SetTableKey("m32", sq_pushfloat, -1, mtx.m[3][2]); SetTableKey("m03", sq_pushfloat, -1, mtx.m[0][3]); SetTableKey("m13", sq_pushfloat, -1, mtx.m[1][3]); SetTableKey("m23", sq_pushfloat, -1, mtx.m[2][3]); SetTableKey("m33", sq_pushfloat, -1, mtx.m[3][3]); */ return 1; } SQInteger GetMatrix4(HSQUIRRELVM vm, int idx, Matrix4 &mtx) { GetTableKey("m00", sq_getfloat, idx, mtx.m[0][0]); GetTableKey("m10", sq_getfloat, idx, mtx.m[1][0]); GetTableKey("m20", sq_getfloat, idx, mtx.m[2][0]); GetTableKey("m30", sq_getfloat, idx, mtx.m[3][0]); GetTableKey("m01", sq_getfloat, idx, mtx.m[0][1]); GetTableKey("m11", sq_getfloat, idx, mtx.m[1][1]); GetTableKey("m21", sq_getfloat, idx, mtx.m[2][1]); GetTableKey("m31", sq_getfloat, idx, mtx.m[3][1]); GetTableKey("m02", sq_getfloat, idx, mtx.m[0][2]); GetTableKey("m12", sq_getfloat, idx, mtx.m[1][2]); GetTableKey("m22", sq_getfloat, idx, mtx.m[2][2]); GetTableKey("m32", sq_getfloat, idx, mtx.m[3][2]); GetTableKey("m03", sq_getfloat, idx, mtx.m[0][3]); GetTableKey("m13", sq_getfloat, idx, mtx.m[1][3]); GetTableKey("m23", sq_getfloat, idx, mtx.m[2][3]); GetTableKey("m33", sq_getfloat, idx, mtx.m[3][3]); return 0; } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ SQInteger PushMatrix3(HSQUIRRELVM vm, const Matrix3 &mtx) { push_Matrix3(vm, mtx); /* if (!CreateClassInstance(vm, "Matrix3", true)) return sq_suspendvm(vm); SetTableKey("m00", sq_pushfloat, -1, mtx.m[0][0]); SetTableKey("m10", sq_pushfloat, -1, mtx.m[1][0]); SetTableKey("m20", sq_pushfloat, -1, mtx.m[2][0]); SetTableKey("m01", sq_pushfloat, -1, mtx.m[0][1]); SetTableKey("m11", sq_pushfloat, -1, mtx.m[1][1]); SetTableKey("m21", sq_pushfloat, -1, mtx.m[2][1]); SetTableKey("m02", sq_pushfloat, -1, mtx.m[0][2]); SetTableKey("m12", sq_pushfloat, -1, mtx.m[1][2]); SetTableKey("m22", sq_pushfloat, -1, mtx.m[2][2]); */ return 1; } SQInteger GetMatrix3(HSQUIRRELVM vm, int idx, Matrix3 &mtx) { GetTableKey("m00", sq_getfloat, idx, mtx.m[0][0]); GetTableKey("m10", sq_getfloat, idx, mtx.m[1][0]); GetTableKey("m20", sq_getfloat, idx, mtx.m[2][0]); GetTableKey("m01", sq_getfloat, idx, mtx.m[0][1]); GetTableKey("m11", sq_getfloat, idx, mtx.m[1][1]); GetTableKey("m21", sq_getfloat, idx, mtx.m[2][1]); GetTableKey("m02", sq_getfloat, idx, mtx.m[0][2]); GetTableKey("m12", sq_getfloat, idx, mtx.m[1][2]); GetTableKey("m22", sq_getfloat, idx, mtx.m[2][2]); return 0; } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ SQInteger RotationMatrixFromDirection(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETVECTOR(direction)) __SQ_RETURNMATRIX3(Matrix3::FromOrthonormalBasis(direction)) } SQInteger RotationMatrixFromDirectionAndUp(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETVECTOR(direction) __SQ_GETVECTOR(up) __SQ_GETEND __SQ_RETURNMATRIX3(Matrix3::FromOrthonormalBasis(direction, &up)) } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ SQInteger EulerFromDirection(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETVECTOR(direction)) __SQ_RETURNVECTOR(Matrix3::FromOrthonormalBasis(direction).AsEuler()) } SQInteger EulerFromDirectionAndUp(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETVECTOR(direction) __SQ_GETVECTOR(up) __SQ_GETEND __SQ_RETURNVECTOR(Matrix3::FromOrthonormalBasis(direction, &up).AsEuler()) } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ SQInteger MatrixToEuler(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETMATRIX3(matrix) __SQ_GETINT(rorder) __SQ_GETEND __SQ_RETURNVECTOR(matrix.AsEuler((Math::rOrder)rorder)) } SQInteger TransformationMatrix(HSQUIRRELVM vm) { __SQ_GETSTART(4) __SQ_GETVECTOR(p) __SQ_GETVECTOR(r) __SQ_GETVECTOR(s) __SQ_GETVECTOR(t) __SQ_GETEND __SQ_RETURNMATRIX4(Matrix4::TransformationMatrix(p, r, s, &t)) } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ void RegisterMatrixBinding(HSQUIRRELVM vm) { using namespace GS::Script; sq_register(vm, MatrixToEuler, "MatrixToEuler", _SC(".xi")); sq_register(vm, TransformationMatrix, "TransformationMatrix", _SC(".xxxx")); sq_register(vm, RotationMatrixFromDirection, "RotationMatrixFromDirection", _SC(".x")); sq_register(vm, RotationMatrixFromDirectionAndUp, "RotationMatrixFromDirectionAndUp", _SC(".xx")); sq_register(vm, EulerFromDirection, "EulerFromDirection", _SC(".x")); sq_register(vm, EulerFromDirectionAndUp, "EulerFromDirectionAndUp", _SC(".xx")); } //------------------------------------------------------------------------------