//#include <osgDB/ReadFile>
#include <osgDB/FileNameUtils>
//#include <osg/Material>
#include "GameNode.h"
#include "Game.h"
#include "LuaScript.h"
static int n_addModel(lua_State *L) {
INIT_WRAPPER(GameNode);/*
const char *mdl= luaL_checkstring(L, 1);
osg::Node *nd= osgDB::readNodeFile(mdl);
if (nd)
{
if (osgDB::getLowerCaseFileExtension(mdl).compare("3ds")==0)
{
ResetMaterials rm;
nd->accept(rm);
}
self->addModel(nd);
}*/
const char *buf= lua_tostring(L, 2);
if (buf)
osgDB::Registry::instance()->getDataFilePathList().push_back(buf);
self->addModel(Game::readNodeFile(luaL_checkstring(L, 1)));
if (buf)
osgDB::Registry::instance()->getDataFilePathList().pop_back();
return 0; /* number of results */
}
static int n_addModelEx(lua_State *L) {
INIT_WRAPPER(GameNode);
const char *mdl= luaL_checkstring(L, 1);
osg::Vec3d trans(luaL_checknumber(L, 2),luaL_checknumber(L, 3),luaL_checknumber(L, 4));
osg::Quat rot( osg::DegreesToRadians(luaL_checknumber(L, 7)),osg::Vec3d(0,1,0),
osg::DegreesToRadians(luaL_checknumber(L, 5)),osg::Vec3d(1,0,0),
osg::DegreesToRadians(luaL_checknumber(L, 6)),osg::Vec3d(0,0,1));
osg::Matrixd mat(rot);
mat.setTrans(trans);
osg::Node *nd= osgDB::readNodeFile(mdl);
if (nd)
{
if (osgDB::getLowerCaseFileExtension(mdl).compare("3ds")==0)
{
ResetMaterials rm;
nd->accept(rm);
}
osg::MatrixTransform *mt= new osg::MatrixTransform(mat);
mt->addChild(nd);
self->addModel(mt);
}
return 0; /* number of results */
}
static int n_loadSound(lua_State *L) {
INIT_WRAPPER(GameNode);
const char *name= luaL_checkstring(L, 1);
const char *file= luaL_checkstring(L, 2);
SoundNode *sn= self->addSoundNode(name,file);
if (sn)
{
sn->setBase(luaL_checknumber(L,3));
float s= luaL_checknumber(L,4);
sn->setScale( s>0.0001 ? s : 0.0001 );
sn->looping(luaL_checkint(L,5));
}
return 0; /* number of results */
}
static int n_addCommand(lua_State *L) {
INIT_WRAPPER(GameNode);
const char *name= luaL_checkstring(L, 1);
Event *ev= self->getOrCreateEvent(name);
ev->addCommand(L);
return 0; /* number of results */
}
static int n_setDelay(lua_State *L) {
INIT_WRAPPER(GameNode);
const char *name= luaL_checkstring(L, 1);
Event *ev= self->getOrCreateEvent(name);
ev->delay= luaL_checknumber(L, 2);
return 0; /* number of results */
}
static int n_addKey(lua_State *L) {
INIT_WRAPPER(GameNode);
//const char *name= luaL_checkstring(L, 1);
osg::Node *mdl= self->getModel();
if (mdl)
{
//osg::Matrixd mat;
//mat.makeIdentity();
//if (lua_tonumber(L, 6))
// mat.makeRotate(osg::DegreesToRadians(luaL_checknumber(L, 6)),luaL_checknumber(L, 7),luaL_checknumber(L, 8),luaL_checknumber(L, 9));
//mat.setTrans(luaL_checknumber(L, 3),luaL_checknumber(L, 4),luaL_checknumber(L, 5));
osg::Vec3d trans(luaL_checknumber(L, 3),luaL_checknumber(L, 4),luaL_checknumber(L, 5));
osg::Quat rot(osg::DegreesToRadians(luaL_checknumber(L, 6)),osg::Vec3d(luaL_checknumber(L, 7),luaL_checknumber(L, 8),luaL_checknumber(L, 9)));
//Game::UpdateAnimationCallback *uac= Game::addKey(*mdl,luaL_checkstring(L, 1),luaL_checknumber(L, 2),mat);
Game::UpdateAnimationCallback *uac= Game::addKey(*mdl,luaL_checkstring(L, 1),luaL_checknumber(L, 2),trans,rot);
if (uac)
if (dynamic_cast<class NewtonVehicle*>(self))
{
uac->loop= false;
uac->v= 0;
}
}
/*
Event *ev= self->getOrCreateEvent(name);
ev->addCommand(L);*/
return 0; /* number of results */
}
static int n_pivotPoint(lua_State *L) {
INIT_WRAPPER(GameNode);
//const char *name= luaL_checkstring(L, 1);
osg::Node *mdl= self->getModel();
if (mdl)
{
osg::AnimationPathCallback *apc= Game::getAnimationPathCallback(*mdl,luaL_checkstring(L, 1));
if (apc)
apc->setPivotPoint(osg::Vec3d(luaL_checknumber(L, 2),luaL_checknumber(L, 3),luaL_checknumber(L, 4)));
}
/*
Event *ev= self->getOrCreateEvent(name);
ev->addCommand(L);*/
return 0; /* number of results */
}
static int n_addState(lua_State *L) {
INIT_WRAPPER(GameNode);
const char *name= luaL_checkstring(L, 1);
State *st= self->getOrCreateState(name);
int i= luaL_checkint(L, 2);
if (i>=0)
st->states.resize(i+1);
st->states[i].onEnter= self->getEvent(lua_tostring(L, 3));
st->states[i].onLeave= self->getEvent(lua_tostring(L, 4));
return 0; /* number of results */
}
static int n_addPick(lua_State *L) {
INIT_WRAPPER(GameNode);
const char *name= luaL_checkstring(L, 1);
const char *event= luaL_checkstring(L, 2);
Event *ev= self->getEvent(event);
osg::Node *mdl= self->getModel();
int t= lua_tonumber(L, 3);
if (mdl && ev && t>=0 && t<2)
{
//osg::ref_ptr
Game::addHitCallback(*mdl,name,*ev,t);
}
return 0; /* number of results */
}
static int n_setOffset(lua_State *L) {
INIT_WRAPPER(GameNode);
int i= luaL_checkint(L, 1);
osg::Vec3d trans(luaL_checknumber(L, 2),luaL_checknumber(L, 3),luaL_checknumber(L, 4));
osg::Quat rot(osg::DegreesToRadians(luaL_checknumber(L, 5)),osg::Vec3d(1,0,0),osg::DegreesToRadians(luaL_checknumber(L, 6)),osg::Vec3d(0,0,1),0,osg::Vec3d(0,1,0));
// ,osg::Vec3d(luaL_checknumber(L, 6),luaL_checknumber(L, 7),luaL_checknumber(L, 8)));
osg::Matrixd mat(rot);
mat.setTrans(trans);
self->setOffset(i,mat);
return 0; /* number of results */
}
void GameNode::registerCommands()
{
Scripted::registerCommands();
REGISTER_FUNC(n_addModel);
REGISTER_FUNC(n_addModelEx);
REGISTER_FUNC(n_loadSound);
REGISTER_FUNC(n_addCommand);
REGISTER_FUNC(n_setDelay);
REGISTER_FUNC(n_addKey);
REGISTER_FUNC(n_pivotPoint);
REGISTER_FUNC(n_addState);
REGISTER_FUNC(n_addPick);
REGISTER_FUNC(n_setOffset);
}