00001 #ifndef SYSTEM_H 00002 #define SYSTEM_H 00003 00004 #include "Point.h" 00005 #include "Spring.h" 00006 #include "Force.h" 00007 #include "Gravity.h" 00008 #include "Damp.h" 00009 #include "Constraint.h" 00010 #include "Graph.h" 00011 #include "BoxConstraint.h" 00012 #include "interfaces/NodeLook.h" 00013 00014 #include <vector> 00015 #include <unordered_map> 00016 00017 namespace Elve { 00018 00019 enum GravityMode { 00020 FULL, 00021 GHOST, 00022 NONE 00023 }; 00024 00025 typedef std::unordered_map<NodeID,QVector2D> NodePositions; 00026 typedef std::unordered_map<NodeID,Point*> PointsByID; 00027 00028 class System 00029 { 00030 public: 00031 System(); 00032 void tick(float dt,bool update = true); 00033 Point* addPoint(qreal mass, const NodeID& id, QVector2D pos, qreal damp, GravityMode g = FULL); 00034 Point* point(const NodeID& id); 00035 void addSpring(unsigned i, unsigned j, qreal k, qreal l0); 00036 void addSpring(Point* mi, Point* mj, qreal k, qreal l0); 00037 void addVConstraint(Point* m, qreal height); 00038 void addHConstraint(Point* m, qreal pos); 00039 void addPConstrain(Point* m, const QVector2D& p); 00040 void addForce(Point* m, Force* f); 00041 void pin(const NodeID& id, const QVector2D& pnt); 00042 void unpin(const NodeID& id); 00043 void clear(); 00044 const PointsByID& pinnedPoints() const; 00045 void clearMovables(); 00046 size_t massCount() const; 00047 size_t forceCount() const; 00048 const Point* nearest(const QVector2D& p) const; 00049 NodePositions positions() const; 00050 const PointsByID& pointsByID() const; 00051 void debug(QPainter* p) const; 00052 void setSizeHint(const QRectF& rect); 00053 void setOrientationHint(OrientationHint hint); 00054 void setRepulsionForce(float f); 00055 OrientationHint orientationHint() const; 00056 QVector2D transformPoint(const QVector2D& p) const; 00057 const QRectF& sizeHint() const; 00058 ~System(); 00059 private: 00060 QRectF mSizeHint; 00061 QRectF mGSizeHint; 00062 OrientationHint mOrHint; 00063 void computeForces(size_t from,size_t until); 00064 Gravity mGravity; 00065 Damp mDamp; 00066 BoxConstraint mBox; 00067 std::vector<Point*> mPoints; 00068 PointsByID mPointsById; 00069 PointsByID mPinnedPoints; 00070 std::vector<Force*> mForces; 00071 std::vector<Constraint*> mConstraints; 00072 }; 00073 00074 } 00075 00076 #endif // SYSTEM_H