Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/physics/physics_interface.cc @ 9869

Last change on this file since 9869 was 9869, checked in by bensch, 18 years ago

orxonox/trunk: merged the new_class_id branche back to the trunk.
merged with command:
svn merge https://svn.orxonox.net/orxonox/branches/new_class_id trunk -r9683:HEAD
no conflicts… puh..

File size: 2.9 KB
Line 
1
2
3/*
4   orxonox - the future of 3D-vertical-scrollers
5
6   Copyright (C) 2004 orx
7
8   This program is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 2, or (at your option)
11   any later version.
12
13   ### File Specific:
14   main-programmer: Patrick Boenzli
15   co-programmer: Benjamin Grauer
16
17   bensch: renamed the file
18*/
19
20#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_PHYSICS
21
22#include "physics_interface.h"
23#include "physics_engine.h"
24
25#include "fields/field.h"
26#include "p_node.h"
27
28#include "string.h"
29#include "stdincl.h"
30
31
32
33ObjectListDefinition(PhysicsInterface);
34/**
35 * @brief standard constructor
36 */
37PhysicsInterface::PhysicsInterface ()
38{
39  this->registerObject(this, PhysicsInterface::_objectList);
40
41  this->mass = 1;
42  this->massChildren = 0;
43  this->forceSum = Vector(0, 0, 0);
44  this->bForceApplied = false;
45}
46
47/**
48 *  standard deconstructor
49*/
50PhysicsInterface::~PhysicsInterface ()
51{
52}
53
54/**
55 *  recalculates the total mass of all the children of this node
56
57   (only availiable for PNodes)
58*/
59void PhysicsInterface::recalcMass()
60{
61  /*
62    PNode* massCalcPNode = dynamic_cast<PNode*>(this);  //! @todo not sure if this will work ....
63    float massSum = 0;
64
65    tIterator<PNode>* iterator = massCalcPNode->children->getIterator();
66    PNode* pn = iterator->firstElement();
67    while( pn != NULL)
68    {
69    // todo: find out if children are PhysicsInterface in an efficient way
70    if (strcmp( pn->getClassCName(), "PhysicsInterface")) {
71    massSum += ((PhysicsInterface*)pn)->getTotalMass();
72    }
73    pn = iterator->nextElement();
74    }
75    delete iterator;
76
77    if (massSum != this->massChildren ) {
78    this->massChildren = massSum;
79    if (strcmp( massCalcPNode->parent->getClassCName(), "PhysicsInterface"))
80    ((PhysicsInterface*)massCalcPNode->parent)->recalcMass();
81    } else {
82    this->massChildren = massSum;
83    }
84  */
85}
86
87/**
88 *  applyes a field to this Object
89 * @param field the field to apply
90 *
91 * this function is virtual, and !must be reimplemented if the Member is !NOT! a PNode
92*/
93void PhysicsInterface::applyField(Field* field)
94{
95  PNode* tmp = dynamic_cast<PNode*>((BaseObject*)this);
96  this->forceSum += field->calcForce(tmp->getAbsCoor());
97  this->bForceApplied = true;
98}
99
100void PhysicsInterface::applyForce(const Vector& force)
101{
102  this->forceSum += force;
103  this->bForceApplied = true;
104}
105
106/**
107 *  ticks the PhysicsEffect
108 * @param dt: the value about which to tick
109*/
110void PhysicsInterface::tickPhys( float dt )
111{
112  //  Vector acc = this->forceSum / ( this->massChildren + this->mass );
113  PNode* coorTick =  dynamic_cast<PNode*>((BaseObject*)this);
114  if (coorTick != NULL )
115    coorTick->shiftCoor((coorTick->getVelocity()+ this->forceSum/this->mass*dt)*dt);
116
117  if (this->bForceApplied)
118  {
119    this->bForceApplied = false;
120    this->forceSum = Vector(0,0,0);
121  }
122}
Note: See TracBrowser for help on using the repository browser.