• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • kdeedu
  • Sitemap
  • Contact Us
 

step/stepcore

world.h

Go to the documentation of this file.
00001 /* This file is part of StepCore library.
00002    Copyright (C) 2007 Vladimir Kuznetsov <ks.vladimir@gmail.com>
00003 
00004    StepCore library is free software; you can redistribute it and/or modify
00005    it under the terms of the GNU General Public License as published by
00006    the Free Software Foundation; either version 2 of the License, or
00007    (at your option) any later version.
00008 
00009    StepCore library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012    GNU General Public License for more details.
00013 
00014    You should have received a copy of the GNU General Public License
00015    along with StepCore; if not, write to the Free Software
00016    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
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> // XXX: replace if QT is enabled
00032 #include <QHash>
00033 
00034 // TODO: split this file
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     /*Q_OBJECT*/
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; } // XXX: rename to createObjectVariances
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(); // XXX: make dimensions dynamic
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     /*Q_OBJECT*/
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     //void addItem(Item* item);
00418     //void removeItem(Item* item);
00420     //void deleteItem(Item* item) { removeItem(item); delete item; }
00422     //int  itemIndex(const Item* item) const;
00423 
00425     //Item* item(int index) const { return _items[index]; }
00427     //Item* item(const QString& name) const;
00429     Object* object(const QString& name);
00430 
00432     //const ItemList&  items() const  { return _items; }
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     //ItemList  _items;
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 } // namespace StepCore
00557 
00571 #endif
00572 

step/stepcore

Skip menu "step/stepcore"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdeedu

Skip menu "kdeedu"
  • kalzium
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  •   docs
  •   src
  • parley
  •   stepcore
Generated for kdeedu by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal