00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __CT_ENTITY_H__
00022 #define __CT_ENTITY_H__
00023
00024 #include <stdarg.h>
00025
00026 #include "csphyzik/phyztype.h"
00027 #include "csphyzik/force.h"
00028 #include "csphyzik/linklist.h"
00029 #include "csphyzik/refframe.h"
00030
00031 class ctSolver;
00032 class ctPhysicalEntity;
00033
00034
00035
00036 #define CTF_NOREWIND 0x1
00037
00038
00039 class ctEntity
00040 {
00041 protected:
00042 int state_offset;
00043
00048 ctSolver *solver;
00049
00051 ctLinkList<ctForce> forces;
00052
00053 public:
00054
00055
00056
00057 ctEntity();
00058 virtual ~ctEntity();
00059
00060
00061
00062
00068 virtual void solve ( real t );
00069
00071 void set_solver ( ctSolver *pslv )
00072 { solver = pslv; }
00073
00074
00075
00076
00077 virtual void init_state() {}
00078
00079 virtual int get_state_size() { return 0; }
00080
00081 virtual int set_state( real *sa ) = 0;
00082
00083 virtual int get_state( const real *sa ) = 0;
00084
00085 virtual int set_delta_state( real *state_array ) = 0;
00086
00087 int get_state_offset() { return state_offset; }
00088 void set_state_offset(int of) { state_offset = of; }
00089
00090 void add_force( ctForce *f ){ forces.add_link( f ); }
00091 void remove_force( ctForce *f ){ forces.remove_link( f ); }
00092
00093
00094 virtual void apply_given_F( ctForce &frc );
00095 void print_force() {}
00096
00097
00098 virtual ctPhysicalEntity *get_collidable_entity(){ return NULL; }
00099
00100
00101 virtual bool will_rewind () { return !(flags & CTF_NOREWIND); }
00102 virtual void set_rewind (bool dorewind)
00103 {
00104 flags &= ~CTF_NOREWIND;
00105 if(!dorewind) flags |= CTF_NOREWIND;
00106 }
00107
00109 unsigned long flags;
00110 };
00111
00112 #endif // __CT_ENTITY_H__