00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00023 #ifndef STEPCORE_WORLD_H
00024 #define STEPCORE_WORLD_H
00025
00026 #include "types.h"
00027 #include "util.h"
00028 #include "object.h"
00029 #include "vector.h"
00030
00031 #include <vector>
00032 #include <QHash>
00033
00034
00035
00036 namespace StepCore
00037 {
00038
00039 class World;
00040 class Solver;
00041 class Item;
00042 class ItemGroup;
00043 class CollisionSolver;
00044 class ConstraintSolver;
00045
00049 class ObjectErrors: public Object
00050 {
00051 STEPCORE_OBJECT(ObjectErrors)
00052
00053 public:
00055 ObjectErrors(Item* owner = NULL): _owner(owner) {}
00056
00058 Item* owner() const { return _owner; }
00060 void setOwner(Item* owner) { _owner = owner; }
00061
00062 private:
00063 Item* _owner;
00064 };
00065
00069 class Item : public Object
00070 {
00071
00072 STEPCORE_OBJECT(Item)
00073
00074 public:
00076 Item(const QString& name = QString())
00077 : Object(name), _world(NULL), _group(NULL),
00078 _objectErrors(NULL), _color(0xff000000) {}
00080 Item(const Item& item) : Object() { *this = item; }
00082 virtual ~Item() { delete _objectErrors; }
00083
00085 Item& operator=(const Item& item);
00086
00088 virtual void setWorld(World* world) { _world = world; }
00089
00091 World* world() const { return _world; }
00092
00094 virtual void setGroup(ItemGroup* group) { _group = group; }
00095
00097 ItemGroup* group() const { return _group; }
00098
00100 ObjectErrors* tryGetObjectErrors() const { return _objectErrors; }
00101
00103 ObjectErrors* objectErrors();
00104
00106 void deleteObjectErrors() { delete _objectErrors; _objectErrors = NULL; }
00107
00109 Color color() const { return _color; }
00110
00112 void setColor(Color color) { _color = color; }
00113
00119 virtual void worldItemRemoved(Item* item STEPCORE_UNUSED) {}
00120
00121 protected:
00124 virtual ObjectErrors* createObjectErrors() { return NULL; }
00125
00126 private:
00127 World* _world;
00128 ItemGroup* _group;
00129 ObjectErrors* _objectErrors;
00130 Color _color;
00131 };
00132
00138 class Body
00139 {
00140 STEPCORE_OBJECT(Body)
00141
00142 public:
00143 Body(): _variablesOffset(0) {}
00144 virtual ~Body() {}
00145
00147 virtual int variablesCount() = 0;
00148
00152 virtual void setVariables(const double* position, const double* velocity,
00153 const double* positionVariance, const double* velocityVariance) = 0;
00154
00157 virtual void getVariables(double* position, double* velocity,
00158 double* positionVariance, double* velocityVariance) = 0;
00159
00163 virtual void addForce(const double* force, const double* forceVariance) = 0;
00164
00167 virtual void resetForce(bool resetVariance) = 0;
00168
00172 virtual void getAccelerations(double* acceleration, double* accelerationVariance) = 0;
00173
00176 virtual void getInverseMass(GmmSparseRowMatrix* inverseMass,
00177 GmmSparseRowMatrix* variance, int offset) = 0;
00178
00181 int variablesOffset() const { return _variablesOffset; }
00182
00183 private:
00184 friend class World;
00185
00187 void setVariablesOffset(int variablesOffset) {
00188 _variablesOffset = variablesOffset;
00189 }
00190
00191 int _variablesOffset;
00192 };
00193
00199 class Force
00200 {
00201 STEPCORE_OBJECT(Force)
00202
00203 public:
00204 virtual ~Force() {}
00205
00209 virtual void calcForce(bool calcVariances) = 0;
00210 };
00211
00216 struct ConstraintsInfo
00217 {
00218 int variablesCount;
00219 int constraintsCount;
00220 int contactsCount;
00221
00222
00223 GmmStdVector value;
00224 GmmStdVector derivative;
00225 GmmSparseRowMatrix jacobian;
00226 GmmSparseRowMatrix jacobianDerivative;
00227 GmmSparseRowMatrix inverseMass;
00228
00229 GmmArrayVector position;
00230 GmmArrayVector velocity;
00231 GmmArrayVector acceleration;
00232
00233 GmmStdVector forceMin;
00234 GmmStdVector forceMax;
00235
00236 GmmStdVector force;
00237
00238 bool collisionFlag;
00239
00240 ConstraintsInfo(): variablesCount(0), constraintsCount(0), contactsCount(0),
00241 position(0,0), velocity(0,0), acceleration(0,0) {}
00242
00245 void setDimension(int newVariablesCount, int newConstraintsCount);
00246
00249 int addContact();
00250
00252 void clearContacts();
00253
00255 void clear();
00256
00257 private:
00258 ConstraintsInfo(const ConstraintsInfo&);
00259 ConstraintsInfo& operator=(const ConstraintsInfo&);
00260 };
00261
00265 class Joint
00266 {
00267 STEPCORE_OBJECT(Joint)
00268
00269 public:
00270 virtual ~Joint() {}
00271
00273 virtual int constraintsCount() = 0;
00274
00276 virtual void getConstraintsInfo(ConstraintsInfo* info, int offset) = 0;
00277
00278 #if 0
00279
00280 virtual void getConstraints(double* value, double* derivative) = 0;
00281
00283 virtual void getForceLimits(double* forceMin STEPCORE_UNUSED, double* forceMax STEPCORE_UNUSED) {}
00284
00287 virtual void getJacobian(GmmSparseRowMatrix* value, GmmSparseRowMatrix* derivative, int offset) = 0;
00288 #endif
00289 };
00290
00297 class Tool
00298 {
00299 STEPCORE_OBJECT(Tool)
00300 public:
00301 virtual ~Tool() {}
00302 };
00303
00305 typedef std::vector<Item*> ItemList;
00307 typedef std::vector<Body*> BodyList;
00309 typedef std::vector<Force*> ForceList;
00311 typedef std::vector<Joint*> JointList;
00312
00316 class ItemGroup : public Item
00317 {
00318 STEPCORE_OBJECT(ItemGroup)
00319
00320 public:
00322 ItemGroup(const QString& name = QString()) : Item(name) {}
00324 ItemGroup(const ItemGroup& group);
00326 ~ItemGroup();
00327
00330 ItemGroup& operator=(const ItemGroup& group);
00331
00333 const ItemList& items() const { return _items; }
00334
00338 ItemList allItems() const { ItemList l; allItems(&l); return l; }
00343 void allItems(ItemList* items) const;
00344
00346 virtual void addItem(Item* item);
00348 virtual void removeItem(Item* item);
00350 virtual void deleteItem(Item* item) { removeItem(item); delete item; }
00351
00353 void clear();
00354
00356 int childItemIndex(const Item* item) const;
00358 int childItemCount() const { return _items.size(); }
00360 Item* childItem(int index) const { return _items[index]; }
00362 Item* childItem(const QString& name) const;
00364 Item* item(const QString& name) const;
00365
00367 void setWorld(World* world);
00369 void worldItemRemoved(Item* item);
00370
00371 private:
00372 ItemList _items;
00373 };
00374
00379 class World : public ItemGroup
00380 {
00381
00382 STEPCORE_OBJECT(World)
00383
00384 public:
00386 World();
00388 World(const World& world);
00390 ~World();
00391
00393 World& operator=(const World& world);
00394
00395
00397 void clear();
00398
00400 double time() const { return _time; }
00402 void setTime(double t) { _time = t; }
00403
00405 double timeScale() const { return _timeScale; }
00407 void setTimeScale(double timeScale) { _timeScale = timeScale; }
00408
00410 bool errorsCalculation() const { return _errorsCalculation; }
00412 void setErrorsCalculation(bool errorsCalculation) {
00413 _errorsCalculation = errorsCalculation; }
00414
00416
00418
00420
00422
00423
00425
00427
00429 Object* object(const QString& name);
00430
00432
00434 const BodyList& bodies() const { return _bodies; }
00436 const ForceList& forces() const { return _forces; }
00438 const JointList& joints() const { return _joints; }
00439
00441 Solver* solver() const { return _solver; }
00443 void setSolver(Solver* solver);
00445 Solver* removeSolver();
00446
00448 CollisionSolver* collisionSolver() const { return _collisionSolver; }
00450 void setCollisionSolver(CollisionSolver* collisionSolver);
00452 CollisionSolver* removeCollisionSolver();
00453
00455 ConstraintSolver* constraintSolver() const { return _constraintSolver; }
00457 void setConstraintSolver(ConstraintSolver* constraintSolver);
00459 ConstraintSolver* removeConstraintSolver();
00460
00462 int doCalcFn();
00468 int doEvolve(double delta);
00469
00471 bool evolveAbort() { return _evolveAbort; }
00474 void setEvolveAbort(bool evolveAbort = true) { _evolveAbort = evolveAbort; }
00475
00476 private:
00477 friend class ItemGroup;
00478
00481 void fillCopyMap(QHash<const Object*, Object*>* map,
00482 const ItemGroup* g1, ItemGroup* g2);
00484 void applyCopyMap(QHash<const Object*, Object*>* map, Object* obj);
00488 void worldItemCopied(QHash<const Object*, Object*>* map, Item* item);
00491 void worldItemAdded(Item* item);
00495 void worldItemRemoved(Item* item);
00496
00501 void checkVariablesCount();
00502
00505 void gatherAccelerations(double* acceleration, double* variance);
00506
00509 void gatherVariables(double* variables, double* variances);
00510
00513 void scatterVariables(const double* variables, const double* variances);
00514
00516 void gatherJointsInfo(ConstraintsInfo* info);
00517
00519 static int solverFunction(double t, const double* y, const double* yvar,
00520 double* f, double* fvar, void* params);
00527 int solverFunction(double t, const double* y, const double* yvar,
00528 double* f, double* fvar);
00529
00530 private:
00531 double _time;
00532 double _timeScale;
00533 bool _errorsCalculation;
00534
00535
00536 BodyList _bodies;
00537 ForceList _forces;
00538 JointList _joints;
00539
00540 Solver* _solver;
00541 CollisionSolver* _collisionSolver;
00542 ConstraintSolver* _constraintSolver;
00543
00544 int _variablesCount;
00545 GmmStdVector _variables;
00546 GmmStdVector _variances;
00547 ConstraintsInfo _constraintsInfo;
00548
00549 GmmStdVector _tempArray;
00550
00551 bool _stopOnCollision;
00552 bool _stopOnIntersection;
00553 bool _evolveAbort;
00554 };
00555
00556 }
00557
00571 #endif
00572