From 724ca795f0def611f8f37171fb14b425e2abc394 Mon Sep 17 00:00:00 2001 From: Benau Date: Sat, 13 Oct 2018 00:43:59 +0800 Subject: [PATCH] Add the required code for advanced meta library animation handling --- lib/irrlicht/include/IAnimatedMeshSceneNode.h | 1 + .../source/Irrlicht/CAnimatedMeshSceneNode.h | 1 + src/scriptengine/script_track.cpp | 66 ++++++++++++++++++- 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/lib/irrlicht/include/IAnimatedMeshSceneNode.h b/lib/irrlicht/include/IAnimatedMeshSceneNode.h index 79de58e12..1c698737d 100644 --- a/lib/irrlicht/include/IAnimatedMeshSceneNode.h +++ b/lib/irrlicht/include/IAnimatedMeshSceneNode.h @@ -183,6 +183,7 @@ namespace scene virtual void addAnimationSet(u32 start, u32 end) = 0; virtual void useAnimationSet(u32 set_num) = 0; virtual void removeAllAnimationSet() = 0; + virtual core::array& getAnimationSetFrames() = 0; }; } // end namespace scene diff --git a/lib/irrlicht/source/Irrlicht/CAnimatedMeshSceneNode.h b/lib/irrlicht/source/Irrlicht/CAnimatedMeshSceneNode.h index f17086d01..911f933e5 100644 --- a/lib/irrlicht/source/Irrlicht/CAnimatedMeshSceneNode.h +++ b/lib/irrlicht/source/Irrlicht/CAnimatedMeshSceneNode.h @@ -170,6 +170,7 @@ namespace scene virtual void removeAllAnimationSet() { m_animation_set.clear(); } virtual void useAnimationSet(u32 set_num); virtual void setFrameLoopOnce(s32 begin, s32 end); + virtual core::array& getAnimationSetFrames() { return m_animation_set; } protected: //! Get a static mesh for the current frame of this animated mesh diff --git a/src/scriptengine/script_track.cpp b/src/scriptengine/script_track.cpp index 38d2d5476..5335c39d6 100644 --- a/src/scriptengine/script_track.cpp +++ b/src/scriptengine/script_track.cpp @@ -31,6 +31,7 @@ #include "modes/world.hpp" #include "scriptengine/property_animator.hpp" #include "scriptengine/aswrappedcall.hpp" +#include "scriptengine/scriptarray.hpp" #include "states_screens/dialogs/tutorial_message_dialog.hpp" #include "states_screens/dialogs/race_paused_dialog.hpp" #include "tracks/track.hpp" @@ -73,6 +74,20 @@ namespace Scripting ->getTrackObject(*libraryInstance, *objID); } + CScriptArray* getTrackObjectList() + { + std::vector& tl = ::Track::getCurrentTrack() + ->getTrackObjectManager()->getObjects().m_contents_vector; + asIScriptContext* ctx = asGetActiveContext(); + asIScriptEngine* engine = ctx->GetEngine(); + asITypeInfo* t = engine->GetTypeInfoByDecl("array"); + CScriptArray* script_array = CScriptArray::Create(t, tl.size()); + for (uint i = 0; i < tl.size(); ++i) + script_array->SetValue(i, &tl[i]); + + return script_array; + } + /** Creates a trigger at the specified location */ void createTrigger(std::string* triggerID, SimpleVec3* creation_loc, float distance) { @@ -288,7 +303,7 @@ namespace Scripting return -1; } - /** Gets the animation set for a skeletal animation */ + /** Gets the animation set id for a skeletal animation */ int getAnimationSet(/** \cond DOXYGEN_IGNORE */void *memory /** \endcond */) { if (memory) @@ -298,6 +313,35 @@ namespace Scripting return -1; } + /** Gets the animation set frames for a skeletal animation */ + CScriptArray* getAnimationSetFrames(/** \cond DOXYGEN_IGNORE */void *memory /** \endcond */) + { + asIScriptContext* ctx = asGetActiveContext(); + asIScriptEngine* engine = ctx->GetEngine(); + asITypeInfo* t = engine->GetTypeInfoByDecl("array"); + if (memory) + { + scene::IAnimatedMeshSceneNode* node = + ((scene::IAnimatedMeshSceneNode*)(memory)); + core::array& f = node->getAnimationSetFrames(); + CScriptArray* script_array = CScriptArray::Create(t, f.size()); + for (uint i = 0; i < f.size(); ++i) + script_array->SetValue(i, &f[i]); + + return script_array; + } + return CScriptArray::Create(t, (unsigned)0); + } + /** Gets the animation set count for a skeletal animation */ + int getAnimationSetNum(/** \cond DOXYGEN_IGNORE */void *memory /** \endcond */) + { + if (memory) + { + return ((scene::IAnimatedMeshSceneNode*)(memory))->getAnimationSetNum(); + } + return -1; + } + /** Remove all animation set for a skeletal animation */ void removeAllAnimationSet(/** \cond DOXYGEN_IGNORE */void *memory /** \endcond */) { @@ -498,7 +542,11 @@ namespace Scripting r = engine->RegisterGlobalFunction("TrackObject@ getTrackObject(const string &in, const string &in)", mp ? WRAP_FN(getTrackObject) : asFUNCTION(getTrackObject), call_conv); assert(r >= 0); - + + r = engine->RegisterGlobalFunction("array@ getTrackObjectList()", + mp ? WRAP_FN(getTrackObjectList) : asFUNCTION(getTrackObjectList), + call_conv); assert(r >= 0); + r = engine->RegisterGlobalFunction("void exitRace()", mp ? WRAP_FN(exitRace) : asFUNCTION(exitRace), call_conv); assert(r >= 0); @@ -584,6 +632,10 @@ namespace Scripting mp ? WRAP_MFN(::TrackObject, getName) : asMETHOD(::TrackObject, getName), call_conv_thiscall); assert(r >= 0); + r = engine->RegisterObjectMethod("TrackObject", "string getID()", + mp ? WRAP_MFN(::TrackObject, getID) : asMETHOD(::TrackObject, getID), + call_conv_thiscall); assert(r >= 0); + // PhysicalObject r = engine->RegisterObjectMethod("PhysicalObject", "bool isFlattenKartObject()", mp ? WRAP_MFN(PhysicalObject, isFlattenKartObject) : asMETHOD(PhysicalObject, @@ -613,7 +665,15 @@ namespace Scripting r = engine->RegisterObjectMethod("Mesh", "int getAnimationSet()", mp ? WRAP_OBJ_LAST(Mesh::getAnimationSet) : asFUNCTION(Mesh::getAnimationSet), call_conv_objlast); assert(r >= 0); - + + r = engine->RegisterObjectMethod("Mesh", "array@ getAnimationSetFrames()", + mp ? WRAP_OBJ_LAST(Mesh::getAnimationSetFrames) : asFUNCTION(Mesh::getAnimationSetFrames), + call_conv_objlast); assert(r >= 0); + + r = engine->RegisterObjectMethod("Mesh", "int getAnimationSetNum()", + mp ? WRAP_OBJ_LAST(Mesh::getAnimationSetNum) : asFUNCTION(Mesh::getAnimationSetNum), + call_conv_objlast); assert(r >= 0); + r = engine->RegisterObjectMethod("Mesh", "void useAnimationSet(int set_num)", mp ? WRAP_OBJ_LAST(Mesh::useAnimationSet) : asFUNCTION(Mesh::useAnimationSet), call_conv_objlast); assert(r >= 0);