Added ability for scripts to run other scripts and bound getFrameNumber for Skeletal animations to get current frame
This commit is contained in:
parent
b7e3329d83
commit
069c25653c
@ -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");
|
||||
|
||||
}
|
||||
|
10
data/scripts/sheep_dance.as
Normal file
10
data/scripts/sheep_dance.as
Normal 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");
|
||||
}
|
@ -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);
|
||||
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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))
|
||||
{
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user