samples/guiAndGfx: eC port of JFD's Mekano
[sdk] / samples / guiAndGfx / mekano / mekanosimulation.ec
diff --git a/samples/guiAndGfx/mekano/mekanosimulation.ec b/samples/guiAndGfx/mekano/mekanosimulation.ec
new file mode 100644 (file)
index 0000000..8bc4adc
--- /dev/null
@@ -0,0 +1,75 @@
+import "mekanodisplay"
+
+class MekanoSimulation
+{
+private:
+   List<MekanoObject> m_Objects { };
+
+   float m_fTimeMultiplier;
+   Time m_LastTime;
+
+public:
+   timeMultiplier = 1.0f;
+   m_LastTime = GetTime();
+
+   property float timeMultiplier
+   {
+      get { return m_fTimeMultiplier; }
+      set { m_fTimeMultiplier=value; }
+   }
+
+   property List<MekanoObject> objectList
+   {
+      get { return m_Objects; }
+   }
+
+   property Time elapsedSeconds
+   {
+      get
+      {
+         Time time = GetTime(), diff=time - m_LastTime;
+         m_LastTime = time;
+         return diff;
+      }
+   }
+
+   void render(MekanoDisplay display)
+   {
+      for(o : m_Objects)
+         o.draw(display);
+   }
+
+   void step(Time dt)
+   {
+      for(o : m_Objects; !o.attributes.steady)
+         o.step(dt);
+   }
+
+   void stepDelta()
+   {
+      step(elapsedSeconds * m_fTimeMultiplier);
+   }
+
+   void exertForces()
+   {
+      for(o : m_Objects)
+         o.exertForces(this);
+   }
+
+   void resetForces()
+   {
+      for(o : m_Objects)
+         o.resetForces();
+   }
+
+   void addObject(MekanoObject object)
+   {
+      incref object;
+      m_Objects.Add(object);
+   }
+
+   void empty()
+   {
+      m_Objects.Free();
+   }
+}