Browse Source

Merge pull request #217 from DavidWyand-GG/ScriptTickObject

New ScriptTickObject
David Wyand 12 years ago
parent
commit
f43e878a26
2 changed files with 148 additions and 15 deletions
  1. 96 14
      Engine/source/console/scriptObjects.cpp
  2. 52 1
      Engine/source/console/scriptObjects.h

+ 96 - 14
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();

+ 52 - 1
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