Added ability for scripts to run other scripts and bound getFrameNumber for Skeletal animations to get current frame

This commit is contained in:
Sachith Hasaranga Seneviratne 2014-06-18 13:12:51 +05:30
parent b7e3329d83
commit 069c25653c
8 changed files with 66 additions and 26 deletions

View File

@ -1,10 +1,11 @@
void onTrigger()
{
TrackObject @t_obj = getTrackObject("anim_sheep2.b3d");
//TrackObject @t_obj = getTrackObject("anim_sheep2.b3d");
//t_obj.setEnable(false);
Mesh @sheepMesh = t_obj.getMesh();
displayMessage("moo");
sheepMesh.setLoop(1,3); //rapid-nod sheep
//Mesh @sheepMesh = t_obj.getMesh();
//displayMessage("moo");
//sheepMesh.setLoop(6,9); //rapid-nod sheep
runScript("sheep_dance");
}

View File

@ -0,0 +1,10 @@
void onTrigger()
{
TrackObject @t_obj = getTrackObject("anim_sheep2.b3d");
//t_obj.setEnable(false);
Mesh @sheepMesh = t_obj.getMesh();
//displayMessage("moo");
sheepMesh.setLoop(1,3); //rapid-nod sheep
//runScript("sheep_approach");
}

View File

@ -1,6 +1,11 @@
void onUpdate()
{
//displayMessage("Haybail deactivated");
TrackObject @t_obj = getTrackObject("anim_sheep2.b3d");
//t_obj.setEnable(false);
Mesh @sheepMesh = t_obj.getMesh();
//displayMessage("moo");
//sheepMesh.setLoop(1,1); //rapid-nod sheep
if (sheepMesh.getCurrentFrame()>=0)sheepMesh.setLoop(1,15);
}

View File

@ -69,12 +69,22 @@ namespace Scripting
{
((TrackObjectPresentationMesh*)(memory))->setLoop(start,end);
}
void getCurrentFrame(void *memory)
{
((TrackObjectPresentationMesh*)(memory))->getCurrentFrame();
}
void getTrackObject(asIScriptGeneric *gen)
{
std::string *str = (std::string*)gen->GetArgAddress(0);
TrackObject* t_obj = World::getWorld()->getTrack()->getTrackObjectManager()->getTrackObject(*str);
gen->SetReturnObject(t_obj);
}
void runScript(asIScriptGeneric *gen)
{
std::string *str = (std::string*)gen->GetArgAddress(0);
ScriptEngine* script_engine = World::getWorld()->getScriptEngine();
script_engine->runScript(*str);
}
/*TrackObject* getTrackObject(std::string *name)
{
TrackObject* t_obj = World::getWorld()->getTrack()->getTrackObjectManager()->getTrackObject(*name);
@ -104,22 +114,31 @@ namespace Scripting
//r = engine->RegisterObjectMethod("TrackObjectManager", "void disable(string &in name)", asFUNCTION(disableAnimation), asCALL_GENERIC); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObjectManager", "void disable(string &in)", asFUNCTION(disableAnimation), asCALL_CDECL_OBJLAST); assert(r >= 0);
*/
//TrackObject
r = engine->RegisterObjectType("TrackObject", 0, asOBJ_REF | asOBJ_NOCOUNT); assert(r >= 0);
r = engine->RegisterGlobalFunction("TrackObject @getTrackObject(string &in)", asFUNCTION(getTrackObject), asCALL_GENERIC); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "void setEnable(bool status)", asMETHOD(TrackObject, setEnable), asCALL_THISCALL); assert(r >= 0);
//PhysicalObject
r = engine->RegisterObjectType("PhysicalObject", 0, asOBJ_REF | asOBJ_NOCOUNT); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "PhysicalObject @getPhysicalObject()", asMETHOD(TrackObject, getPhysicalObjectForScript), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("PhysicalObject", "bool isFlattener()", asMETHOD(PhysicalObject, isFlattenKartObject), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("PhysicalObject", "void disable()", asFUNCTION(disable), asCALL_CDECL_OBJLAST); assert(r >= 0);
//Mesh or Skeletal Animation
r = engine->RegisterObjectType("Mesh", 0, asOBJ_REF | asOBJ_NOCOUNT); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "Mesh @getMesh()", asMETHOD(TrackObject, getMesh), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "void setLoop(int start, int end)", asFUNCTION(setLoop), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterObjectMethod("Mesh", "int getCurrentFrame()", asFUNCTION(getCurrentFrame), asCALL_CDECL_OBJLAST); assert(r >= 0);
//Curve based Animation
r = engine->RegisterObjectType("Animator", 0, asOBJ_REF | asOBJ_NOCOUNT); assert(r >= 0);
r = engine->RegisterObjectMethod("TrackObject", "Animator @getAnimator()", asMETHOD(TrackObject, getAnimatorForScript), asCALL_THISCALL); assert(r >= 0);
//fails due to insufficient visibility to scripts TODO : Decide whether to fix visibility or introduce wrappers
//r = engine->RegisterObjectMethod("Animator", "void setPaused(bool mode)", asMETHOD(ThreeDAnimation, setPaused), asCALL_THISCALL); assert(r >= 0);
r = engine->RegisterObjectMethod("Animator", "void setPaused(bool mode)", asFUNCTION( setPaused ), asCALL_CDECL_OBJLAST); assert(r >= 0);
r = engine->RegisterGlobalFunction("void runScript(string &in)", asFUNCTION(runScript), asCALL_GENERIC); assert(r >= 0);
}
@ -137,26 +156,22 @@ namespace Scripting
void disableAnimation(asIScriptGeneric *gen)
{
std::string *str = (std::string*)gen->GetArgAddress(0);
std::string type = "mesh";
World::getWorld()->getTrack()->getTrackObjectManager()->disable(*str, type);
World::getWorld()->getTrack()->getTrackObjectManager()->disable(*str);
}
void enableAnimation(asIScriptGeneric *gen)
{
std::string *str = (std::string*)gen->GetArgAddress(0);
std::string type = "mesh";
World::getWorld()->getTrack()->getTrackObjectManager()->enable(*str, type);
World::getWorld()->getTrack()->getTrackObjectManager()->enable(*str);
}
void disableTrigger(asIScriptGeneric *gen)
{
std::string *str = (std::string*)gen->GetArgAddress(0);
std::string type = "action-trigger";
World::getWorld()->getTrack()->getTrackObjectManager()->disable(*str, type);
World::getWorld()->getTrack()->getTrackObjectManager()->disable(*str);
}
void enableTrigger(asIScriptGeneric *gen)
{
std::string *str = (std::string*)gen->GetArgAddress(0);
std::string type = "action-trigger";
World::getWorld()->getTrack()->getTrackObjectManager()->enable(*str, type);
World::getWorld()->getTrack()->getTrackObjectManager()->enable(*str);
}
void createTrigger(asIScriptGeneric *gen)
{

View File

@ -87,35 +87,33 @@ void TrackObjectManager::reset()
} // reset
// ----------------------------------------------------------------------------
void TrackObjectManager::disable(std::string name , std::string type)
void TrackObjectManager::disable(std::string name)
{
TrackObject* curr;
for_in (curr,m_all_objects){
if (type != curr->getType())continue;
if (curr->getName() == (name) || curr->getID() == (name))
{
curr->setEnable(false);
if (type == "mesh")
if (curr->getType() == "mesh")
{
curr->getPhysicalObject()->removeBody();
}
}
}
}
void TrackObjectManager::enable(std::string name , std::string type)
void TrackObjectManager::enable(std::string name)
{
TrackObject* curr;
for_in (curr,m_all_objects){
if (type != curr->getType())continue;
if (curr->getName() == (name) || curr->getID() == (name))
{
curr->reset();
curr->setEnable(true);
if (type == "mesh")
if (curr->getType() == "mesh")
{
curr->getPhysicalObject()->addBody();
}
@ -141,7 +139,8 @@ bool TrackObjectManager::getStatus(std::string name)
TrackObject* TrackObjectManager::getTrackObject(std::string name)
{
TrackObject* curr;
for_in(curr, m_all_objects){
for_in(curr, m_all_objects)
{
if (curr->getName() == (name) || curr->getID() == (name))
{

View File

@ -55,8 +55,8 @@ public:
bool secondary_hits=true);
void reset();
void init();
void disable(std::string name , std::string type);
void enable (std::string name , std::string type);
void disable(std::string name);
void enable (std::string name);
bool getStatus(std::string name);
/** Enable or disable fog on objects */

View File

@ -420,6 +420,18 @@ void TrackObjectPresentationMesh::reset()
}
}
int TrackObjectPresentationMesh::getCurrentFrame()
{
if (m_node->getType() == scene::ESNT_ANIMATED_MESH)
{
scene::IAnimatedMeshSceneNode *a_node =
(scene::IAnimatedMeshSceneNode*)m_node;
return (int)a_node->getFrameNr();
}
return -1; //Not a skeletal animation
}
void TrackObjectPresentationMesh::setLoop(int start, int end)
{
@ -428,10 +440,6 @@ void TrackObjectPresentationMesh::setLoop(int start, int end)
scene::IAnimatedMeshSceneNode *a_node =
(scene::IAnimatedMeshSceneNode*)m_node;
// trick to reset the animation AND also the timer inside it
//a_node->OnAnimate(0);
//a_node->OnAnimate(0);
// irrlicht's "setFrameLoop" is a misnomer, it just sets the first and
// last frame, even if looping is disabled
a_node->setFrameLoop(start, end);

View File

@ -224,6 +224,8 @@ public:
void setLoop(int start, int end); //set custom loops, as well as pause by scripts
int getCurrentFrame();
virtual ~TrackObjectPresentationMesh();
virtual void reset() OVERRIDE;