bluecore/engine/ScriptSystem_Camera.cpp
2008-01-20 10:16:37 +00:00

126 lines
2.1 KiB
C++

#include "ScriptSystem_Camera.h"
#include "ScriptSystem_Math.h"
#include "Camera.h"
namespace BlueCore
{
static SQInteger _camera_releasehook(SQUserPointer p, SQInteger size)
{
Camera *camera = (Camera *)p;
if (camera)
camera->removeReference();
return 1;
}
static SQInteger _camera_constructor(HSQUIRRELVM vm)
{
SQInteger argc = sq_gettop(vm);
if (argc < 1)
return 0;
Camera *camera = new Camera();
camera->addReference();
sq_setinstanceup(vm, 1, (void *)camera );
sq_setreleasehook(vm, 1, _camera_releasehook);
return 0;
}
static SQInteger _camera_setposition(HSQUIRRELVM v)
{
Camera *camera = 0;
sq_getinstanceup(v, 1, ( void ** ) &camera, 0);
if (camera)
{
Vector3 position;
int argc = sq_gettop(v);
if (argc == 2)
{
_getvectorvalues(v, 2, position.x, position.y, position.z);
}
else if (argc == 4)
{
sq_getfloat(v, 2, &position.x);
sq_getfloat(v, 3, &position.y);
sq_getfloat(v, 4, &position.z);
}
camera->setPosition(position);
}
return 0;
}
static SQInteger _camera_lookat(HSQUIRRELVM v)
{
Camera *camera = 0;
sq_getinstanceup(v, 1, ( void ** ) &camera, 0);
if (camera)
{
Vector3 position;
int argc = sq_gettop(v);
if (argc == 2)
{
_getvectorvalues(v, 2, position.x, position.y, position.z);
}
else if (argc == 4)
{
sq_getfloat(v, 2, &position.x);
sq_getfloat(v, 3, &position.y);
sq_getfloat(v, 4, &position.z);
}
camera->lookAt(position);
}
return 0;
}
void setupScriptSystem_Camera(ScriptSystem* scriptsystem)
{
if (scriptsystem == 0)
return;
HSQUIRRELVM vm = scriptsystem->getVM();
sq_pushroottable(vm);
// push class
sq_pushstring(vm, "Camera", -1);
if (SQ_SUCCEEDED(sq_newclass(vm, SQFalse) ) )
{
// register constructor
sq_pushstring(vm, "constructor", -1);
sq_newclosure(vm, _camera_constructor, 0);
sq_newslot(vm, -3, false);
sq_pushstring(vm, "setPosition", -1);
sq_newclosure(vm, _camera_setposition, 0);
sq_newslot(vm, -3, false);
sq_pushstring(vm, "lookAt", -1);
sq_newclosure(vm, _camera_lookat, 0);
sq_newslot(vm, -3, false);
// create class
sq_newslot(vm, -3, false);
}
sq_poptop(vm);
}
}