From b56f8674cd40cf750f1301c5cf06dc464060243f Mon Sep 17 00:00:00 2001 From: DavidWyand-GG Date: Tue, 22 Jan 2013 17:09:14 -0500 Subject: [PATCH] New ScriptTickObject ScriptTickObject is a ScriptObject that adds callbacks for tick and frame events. Use setProcessTicks() to enable or disable the onInterpolateTick() and onProcessTick() callbacks. The callOnAdvanceTime property determines if the onAdvanceTime() callback is called. --- Engine/source/console/scriptObjects.cpp | 110 +++++++++++++++++++++--- Engine/source/console/scriptObjects.h | 53 +++++++++++- 2 files changed, 148 insertions(+), 15 deletions(-) diff --git a/Engine/source/console/scriptObjects.cpp b/Engine/source/console/scriptObjects.cpp index 2f7869976..e5916fb64 100644 --- a/Engine/source/console/scriptObjects.cpp +++ b/Engine/source/console/scriptObjects.cpp @@ -27,6 +27,10 @@ #include "console/simBase.h" #include "console/engineAPI.h" +//----------------------------------------------------------------------------- +// ScriptObject +//----------------------------------------------------------------------------- + IMPLEMENT_CONOBJECT(ScriptObject); ConsoleDocClass( ScriptObject, @@ -83,23 +87,103 @@ void ScriptObject::onRemove() } //----------------------------------------------------------------------------- -// Script group placeholder +// ScriptTickObject //----------------------------------------------------------------------------- -class ScriptGroup : public SimGroup +IMPLEMENT_CONOBJECT(ScriptTickObject); + +ConsoleDocClass( ScriptTickObject, + "@brief A ScriptObject that responds to tick and frame events.\n\n" + + "ScriptTickObject is a ScriptObject that adds callbacks for tick and frame events. Use " + "setProcessTicks() to enable or disable the onInterpolateTick() and onProcessTick() callbacks. " + "The callOnAdvanceTime property determines if the onAdvanceTime() callback is called.\n\n" + + "@see ScriptObject\n" + "@ingroup Console\n" + "@ingroup Scripting" +); + +IMPLEMENT_CALLBACK( ScriptTickObject, onInterpolateTick, void, ( F32 delta ), ( delta ), + "This is called every frame, but only if the object is set to process ticks.\n" + "@param delta The time delta for this frame.\n" +); + +IMPLEMENT_CALLBACK( ScriptTickObject, onProcessTick, void, (), (), + "Called once every 32ms if this object is set to process ticks.\n" +); + +IMPLEMENT_CALLBACK( ScriptTickObject, onAdvanceTime, void, ( F32 timeDelta ), ( timeDelta ), + "This is called every frame regardless if the object is set to process ticks, but only " + "if the callOnAdvanceTime property is set to true.\n" + "@param timeDelta The time delta for this frame.\n" + "@see callOnAdvanceTime\n" +); + +ScriptTickObject::ScriptTickObject() { - typedef SimGroup Parent; - -public: - ScriptGroup(); - bool onAdd(); - void onRemove(); + mCallOnAdvanceTime = false; +} - DECLARE_CONOBJECT(ScriptGroup); +void ScriptTickObject::initPersistFields() +{ + addField("callOnAdvanceTime", TypeBool, Offset(mCallOnAdvanceTime, ScriptTickObject), "Call the onAdvaceTime() callback."); - DECLARE_CALLBACK(void, onAdd, (SimObjectId ID) ); - DECLARE_CALLBACK(void, onRemove, (SimObjectId ID)); -}; + Parent::initPersistFields(); +} + +bool ScriptTickObject::onAdd() +{ + if (!Parent::onAdd()) + return false; + + return true; +} + +void ScriptTickObject::onRemove() +{ + Parent::onRemove(); +} + +void ScriptTickObject::interpolateTick( F32 delta ) +{ + onInterpolateTick_callback(delta); +} + +void ScriptTickObject::processTick() +{ + onProcessTick_callback(); +} + +void ScriptTickObject::advanceTime( F32 timeDelta ) +{ + if(mCallOnAdvanceTime) + { + onAdvanceTime_callback(timeDelta); + } +} + +DefineEngineMethod( ScriptTickObject, setProcessTicks, void, ( bool tick ),, + "@brief Sets this object as either tick processing or not.\n\n" + + "@param tick This object's onInterpolateTick() and onProcessTick() callbacks are called if set to true.\n\n") +{ + object->setProcessTicks(tick); +} + +DefineEngineMethod( ScriptTickObject, isProcessingTicks, bool, ( ),, + "@brief Is this object wanting to receive tick notifications.\n\n" + + "If this object is set to receive tick notifications then its onInterpolateTick() and " + "onProcessTick() callbacks are called.\n" + "@return True if object wants tick notifications\n\n" ) +{ + return object->isProcessingTicks(); +} + +//----------------------------------------------------------------------------- +// ScriptGroup +//----------------------------------------------------------------------------- IMPLEMENT_CONOBJECT(ScriptGroup); @@ -157,7 +241,6 @@ bool ScriptGroup::onAdd() return false; // Call onAdd in script! - //Con::executef(this, "onAdd", Con::getIntArg(getId())); onAdd_callback(getId()); return true; } @@ -165,7 +248,6 @@ bool ScriptGroup::onAdd() void ScriptGroup::onRemove() { // Call onRemove in script! - //Con::executef(this, "onRemove", Con::getIntArg(getId())); onRemove_callback(getId()); Parent::onRemove(); diff --git a/Engine/source/console/scriptObjects.h b/Engine/source/console/scriptObjects.h index 65780b633..4686a547b 100644 --- a/Engine/source/console/scriptObjects.h +++ b/Engine/source/console/scriptObjects.h @@ -27,8 +27,12 @@ #include "console/consoleInternal.h" #endif +#ifndef _ITICKABLE_H_ +#include "core/iTickable.h" +#endif + //----------------------------------------------------------------------------- -// Script object placeholder +// ScriptObject //----------------------------------------------------------------------------- class ScriptObject : public SimObject @@ -46,4 +50,51 @@ public: DECLARE_CALLBACK(void, onRemove, (SimObjectId ID)); }; +//----------------------------------------------------------------------------- +// ScriptTickObject +//----------------------------------------------------------------------------- + +class ScriptTickObject : public ScriptObject, public virtual ITickable +{ + typedef ScriptObject Parent; + +protected: + bool mCallOnAdvanceTime; + +public: + ScriptTickObject(); + static void initPersistFields(); + bool onAdd(); + void onRemove(); + + virtual void interpolateTick( F32 delta ); + virtual void processTick(); + virtual void advanceTime( F32 timeDelta ); + + DECLARE_CONOBJECT(ScriptTickObject); + + DECLARE_CALLBACK(void, onInterpolateTick, (F32 delta) ); + DECLARE_CALLBACK(void, onProcessTick, () ); + DECLARE_CALLBACK(void, onAdvanceTime, (F32 timeDelta) ); +}; + +//----------------------------------------------------------------------------- +// ScriptGroup +//----------------------------------------------------------------------------- + +class ScriptGroup : public SimGroup +{ + typedef SimGroup Parent; + +public: + ScriptGroup(); + bool onAdd(); + void onRemove(); + + DECLARE_CONOBJECT(ScriptGroup); + + DECLARE_CALLBACK(void, onAdd, (SimObjectId ID) ); + DECLARE_CALLBACK(void, onRemove, (SimObjectId ID)); +}; + #endif \ No newline at end of file