samples/guiAndGfx: eC port of JFD's Mekano
[sdk] / samples / guiAndGfx / mekano / mekanoobject.ec
diff --git a/samples/guiAndGfx/mekano/mekanoobject.ec b/samples/guiAndGfx/mekano/mekanoobject.ec
new file mode 100644 (file)
index 0000000..2ab84a5
--- /dev/null
@@ -0,0 +1,164 @@
+import "mekanopoint"
+import "mekanosimulation"
+
+class ObjectAttributes : uint { bool selected:1, steady:1, highlighted:1; };
+
+class MekanoObject
+{
+   void addPoint(MekanoPoint point)
+   {
+      m_Points.Add(point);
+   }
+
+   float m_fMass;
+   float m_fInertiaMoment;
+
+   float m_fCosRotation;
+   float m_fSinRotation;
+
+   float m_fAppliedTorque;
+   float m_fAngularAcceleration;
+   float m_fAngularSpeed;
+   float m_fRotation;
+   float m_fAngularFriction;
+
+   float m_fBoundingRadius;
+
+   Vector2D m_AppliedForce;
+   Vector2D m_Acceleration;
+   Vector2D m_Speed;
+   Vector2D m_Position;
+   Vector2D m_LastPosition;
+
+   ObjectAttributes m_Attributes;
+   List<MekanoPoint> m_Points { };
+
+public:
+
+   ~MekanoObject()
+   {
+      m_Points.Free();
+   }
+
+   property MekanoSimulation simulation { set { value.addObject(this); } }
+
+   mass = 1.0f;
+   inertiaMoment = 10;
+   angularFriction = 0.1f;
+
+   property float cosRotation { get { return m_fCosRotation; } };
+   property float sinRotation { get { return m_fSinRotation; } };
+
+   property float mass
+   {
+      set { m_fMass=value; }
+      get { return m_fMass; }
+   }
+
+   property float inertiaMoment
+   {
+      set { m_fInertiaMoment=value; }
+      get { return m_fInertiaMoment; }
+   }
+
+   property float boundingRadius
+   {
+      set { m_fBoundingRadius=value; }
+      get { return m_fBoundingRadius; }
+   }
+
+   property float angularSpeed
+   {
+      set { m_fAngularSpeed=value; }
+      get { return m_fAngularSpeed; }
+   }
+
+   property float angularAcceleration
+   {
+      set { m_fAngularAcceleration=value; }
+      get { return m_fAngularAcceleration; }
+   }
+
+   property float angularFriction
+   {
+      set { m_fAngularFriction=value; }
+      get { return m_fAngularFriction; }
+   }
+
+   property Vector2D lastPosition
+   {
+      set { m_LastPosition=value; }
+      get { value = m_LastPosition; }
+   }
+
+   property Vector2D position
+   {
+      set { m_Position=value; }
+      get { value = m_Position; }
+   }
+
+   property Vector2D speed
+   {
+      set { m_Speed=value; }
+      get { value = m_Speed; }
+   }
+
+   property Vector2D acceleration
+   {
+      set { m_Acceleration=value; }
+      get { value = m_Acceleration; }
+   }
+
+   property Vector2D deltaPosition { get { value.subtract(m_Position, m_LastPosition); } };
+
+   property ObjectAttributes attributes { set { m_Attributes=value; } get { return m_Attributes; } }
+
+   property Vector2D AppliedForce
+   {
+      set { m_AppliedForce=value; }
+      get { value = m_AppliedForce; }
+   }
+
+   property float appliedTorque
+   {
+      set { m_fAppliedTorque=value; }
+      get { return m_fAppliedTorque; }
+   }
+
+   property List<MekanoPoint> points { get { return m_Points; } };
+
+   property MekanoPoint centerPoint
+   {
+      get
+      {
+         for(p : m_Points; p.type == center)
+            return p;
+         return null;
+      }
+   }
+
+   property float rotation
+   {
+      get { return m_fRotation; }
+      set
+      {
+         m_fRotation=value;
+         m_fCosRotation=(float)cos(value);
+         m_fSinRotation=(float)sin(value);
+      }
+   }
+
+   virtual void resetForces() { m_AppliedForce = { }, m_fAppliedTorque = 0; };
+   virtual void exertForces(MekanoSimulation sim);
+   virtual void applyForce(Vector2D f, MekanoPoint pt);
+   virtual void draw(MekanoDisplay display);
+   virtual void step(Time dt) { lastPosition = m_Position; }
+   virtual bool isInside(Vector2D v) { return false; }
+   virtual bool isColliding(MekanoPoint pt, Vector2D normal) { return false; }
+
+   void computeBoundingRadius()
+   {
+      for(p : m_Points; p.type == vertex)
+         p.computeBoundingRadius();
+   }
+}