00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __COSA__
00023 #define __COSA__
00024
00025 #include "jed_defs.h"
00026 #include "entidad.h"
00027 #include "toolkits/geom/geometria.h"
00028 #include "toolkits/geom/mesh.h"
00029 #include "core/simul/solver.h"
00030 #include "matriz4.h"
00031 #include "core/campos/campo.h"
00032
00033
00034
00035
00036
00037 class FUERZA_PUNTO
00046 {
00047 public:
00048 VECTOR fuerza;
00049 VECTOR punto;
00050 };
00051
00052 class RESORTE;
00053
00054
00055
00056
00057
00058 enum ENUM_CATEGORIAS_COSAS {
00059 CC_DESCONOCIDA = 0,
00060 CC_MASA_PUNTUAL,
00061 CC_COSA_RIGIDA,
00062 CC_TELA,
00063 CC_AVATAR_QUAKE,
00064 CC_ESPACIO_ABIERTO
00065 };
00066
00067 class COSA : public ENTIDAD, public ECUACION_DIFERENCIAL
00101 {
00102 private:
00103 void leer_material(char *nombre);
00104
00105 protected:
00106
00107 VECTOR _posicion;
00108
00109 VECTOR _velocidad;
00110 double _masa;
00111 double _ke;
00112
00113
00114
00115 BOOLEAN _estoy_fijo;
00116
00117 MATERIAL *Material;
00118 COLOR _color;
00119 COSA *Padre;
00120
00121 char *_nombre_padre;
00122
00123
00124 int _tipo_de_cosa;
00125 LISTA<FUERZA_PUNTO *>
00126 lista_fuerzas_externas;
00127
00128
00129 void limpiar_fuerzas(void);
00130 BOOLEAN
00131 leer_basico(TOKENIZADOR *Sabiondo, char *cad, BOOLEAN *cmc);
00132 void grabar_basico(FILE *fd);
00133
00134 public:
00135
00136 COSA();
00137 virtual ~COSA();
00138 virtual COSA *crear_copia(void);
00139 inline double masa(void);
00140 inline double ke(void);
00141 virtual BOOLEAN
00142 consultar_variable(const char *nombre_variable, int &tipo, void **ref);
00143 BOOLEAN
00144 actualizar_variable(const char *nombre_variable, int tipo, void *ref);
00145 char *nombre_padre(void);
00146 void asociar_padre(COSA *p);
00147 BOOLEAN estoy_fijo(void);
00148 int tipo_de_cosa(void);
00149
00150
00151 VECTOR posicion(void);
00152
00153 virtual VECTOR posicion_absoluta(VECTOR p);
00157 virtual QUATERNION orientacion_absoluta(void);
00158 inline VECTOR velocidad_absoluta(void);
00159 inline void set_posicion_absoluta(VECTOR p);
00160 inline void set_velocidad_absoluta(VECTOR v);
00161 virtual VECTOR velocidad_angular_absoluta(void);
00162 virtual void set_velocidad_angular_absoluta(VECTOR omega);
00163 virtual MATRIZ_4x4 tensor_de_inercia(void);
00164 virtual GEOMETRIA *geometria(void) = 0;
00165 inline void anexar_fuerza(VECTOR fuerza, VECTOR p);
00166 virtual void aplicar_campo_vectorial(CAMPO_VECTORIAL *Campo);
00167 virtual void aplicar_drag(double Kd);
00168 double altura(VECTOR p);
00169
00170
00171 virtual void actualizar(double delta_t) = 0;
00172 virtual int ODE_numero_de_variables_de_estado(void) = 0;
00173 virtual void ODE_reportar_variables_de_estado(double *Datos) = 0;
00174 virtual void ODE_actualizar_variables_de_estado(double *Datos) = 0;
00175 virtual void ODE_calcular_la_primera_derivada(double *Datos) = 0;
00176
00177
00178 virtual void minmax(VECTOR *min, VECTOR *max) = 0;
00179 virtual double interseccion(RAYO *Rayo, VECTOR *Punto, VECTOR *Normal);
00180
00181 #ifdef GL_ENABLED
00182 virtual void pintar_gl(CALIDAD_VISUAL *Calidad, CAMARA *Camara) = 0;
00183 #endif
00184 virtual void pintar_povray(FILE *fd);
00185 MATERIAL *material(void);
00186 COLOR color(void);
00187
00188
00189 virtual BOOLEAN leer(TOKENIZADOR *Sabiondo) = 0;
00190 virtual BOOLEAN resolver(LISTA <COSA *> *Cosas);
00191 virtual void grabar(FILE *fd) = 0;
00192 };
00193
00194 inline double
00195 COSA::masa(void)
00196 {
00197 return _masa;
00198 }
00199
00200 inline double
00201 COSA::ke(void)
00202 {
00203 return _ke;
00204 }
00205
00206 inline VECTOR
00207 COSA::velocidad_absoluta(void)
00208 {
00209
00210
00211 return _velocidad;
00212 }
00213
00214 inline void
00215 COSA::set_velocidad_absoluta(VECTOR v)
00216 {
00217
00218
00219 _velocidad = v;
00220 }
00221
00222 inline void
00223 COSA::set_posicion_absoluta(VECTOR p)
00224 {
00225
00226
00227 _posicion = p;
00228 }
00229
00230 inline void
00231 COSA::anexar_fuerza(VECTOR fuerza, VECTOR p)
00240 {
00241 FUERZA_PUNTO *F = new FUERZA_PUNTO;
00242
00243 if ( !F ) {
00244 fprintf(stderr, "<COSA> - ERROR de memoria insertando una fuerza!\n");
00245 fflush(stderr);
00246 return;
00247 }
00248
00249 F->fuerza = fuerza;
00250 F->punto = p;
00251 lista_fuerzas_externas.anx(F);
00252 }
00253
00254
00255
00256
00257
00258 class TELA;
00259
00260 class MASA_PUNTUAL : public COSA
00267 {
00268 public:
00269 BOOLEAN en_colision;
00270
00271
00272 MASA_PUNTUAL();
00273 virtual ~MASA_PUNTUAL();
00274 virtual COSA *crear_copia(void);
00275 BOOLEAN
00276 consultar_variable(const char *nombre_variable, int &tipo, void **ref);
00277
00278
00279 GEOMETRIA *geometria(void);
00280
00281
00282 void actualizar(double delta_t);
00283 int ODE_numero_de_variables_de_estado(void);
00284 void ODE_reportar_variables_de_estado(double *Datos);
00285 void ODE_actualizar_variables_de_estado(double *Datos);
00286 void ODE_calcular_la_primera_derivada(double *Datos);
00287
00288
00289 void minmax(VECTOR *min, VECTOR *max);
00290 #ifdef GL_ENABLED
00291 void pintar_gl(CALIDAD_VISUAL *Calidad, CAMARA *Camara);
00292 #endif
00293 void pintar_povray(FILE *fd);
00294
00295
00296 BOOLEAN leer(TOKENIZADOR *Sabiondo);
00297 void grabar(FILE *fd);
00298
00299 friend class TELA;
00300 };
00301
00302 class COSA_RIGIDA : public COSA
00317 {
00318 protected:
00319
00320 VECTOR _centro_de_masa;
00321 VECTOR _velocidad_angular;
00322 QUATERNION _orientacion;
00323 MATRIZ_4x4 tensor_de_inercia_0;
00324
00325 BOOLEAN leer_rigida(TOKENIZADOR *Sabiondo, char *cad);
00326 void resolver_tensor_de_inercia(void);
00327
00328 private:
00329 GEOMETRIA *Geometria;
00330 double _ultimo_Kd;
00331
00332 public:
00333
00334 COSA_RIGIDA();
00335 virtual ~COSA_RIGIDA();
00336 virtual COSA *crear_copia(void);
00337 BOOLEAN
00338 consultar_variable(const char *nombre_variable, int &tipo, void **ref);
00339 BOOLEAN
00340 actualizar_variable(const char *nombre_variable, int tipo, void *ref);
00341
00342 GEOMETRIA *geometria(void);
00343 VECTOR posicion_absoluta(VECTOR p);
00344 VECTOR velocidad_angular_absoluta(void);
00345 void set_velocidad_angular_absoluta(VECTOR omega);
00346 MATRIZ_4x4 tensor_de_inercia(void);
00347 QUATERNION orientacion_absoluta(void);
00348 void set_orientacion_absoluta(QUATERNION q);
00349 void aplicar_drag(double Kd);
00350
00351
00352 void tick(void);
00353 void actualizar(double delta_t);
00354 int ODE_numero_de_variables_de_estado(void);
00355 void ODE_reportar_variables_de_estado(double *Datos);
00356 void ODE_actualizar_variables_de_estado(double *Datos);
00357 void ODE_calcular_la_primera_derivada(double *Datos);
00358
00359
00360 void minmax(VECTOR *min, VECTOR *max);
00361 virtual double interseccion(RAYO *Rayo, VECTOR *Punto, VECTOR *Normal);
00362 #ifdef GL_ENABLED
00363 void pintar_gl(CALIDAD_VISUAL *Calidad, CAMARA *Camara);
00364 #endif
00365 void pintar_povray(FILE *fd);
00366
00367
00368 BOOLEAN leer(TOKENIZADOR *Sabiondo);
00369 BOOLEAN resolver(LISTA <COSA *> *Cosa);
00370 void grabar(FILE *fd);
00371 };
00372
00373 class COSA_FLEXIBLE : public COSA {
00374 public:
00375 COSA_FLEXIBLE();
00376 virtual ~COSA_FLEXIBLE();
00377
00378
00379 virtual GEOMETRIA *geometria(void) = 0;
00380
00381
00382 virtual void actualizar(double delta_t) = 0;
00383 virtual int ODE_numero_de_variables_de_estado(void) = 0;
00384 virtual void ODE_reportar_variables_de_estado(double *Datos) = 0;
00385 virtual void ODE_actualizar_variables_de_estado(double *Datos) = 0;
00386 virtual void ODE_calcular_la_primera_derivada(double *Datos) = 0;
00387
00388
00389 virtual void minmax(VECTOR *min, VECTOR *max) = 0;
00390 #ifdef GL_ENABLED
00391 virtual void pintar_gl(CALIDAD_VISUAL *Calidad, CAMARA *Camara) = 0;
00392 #endif
00393 virtual void pintar_povray(FILE *fd) = 0;
00394
00395
00396 virtual BOOLEAN leer(TOKENIZADOR *Sabiondo) = 0;
00397 };
00398
00399 class TELA : public COSA_FLEXIBLE {
00400 private:
00401
00402 RESORTE *plantilla[3];
00403
00404 int x_tam;
00405 int y_tam;
00406 MASA_PUNTUAL *Arr_masas;
00407 RESORTE *Resortes1;
00408 int num_resortes1;
00409 RESORTE *Resortes2;
00410 int num_resortes2;
00411 RESORTE *Resortes3;
00412 int num_resortes3;
00413
00414
00415 BOOLEAN recien_simulado;
00416 IMAGEN *Textura;
00417 MESH *Superficie;
00418
00419 BOOLEAN leer_resortes(TOKENIZADOR *Sabiondo, int tipo);
00420 BOOLEAN leer_malla(TOKENIZADOR *Sabiondo);
00421 BOOLEAN precalcular_resortes(void);
00422
00423
00424 VECTOR calcule_subnormal(int i1,int j1,int i2,int j2,int i3,int j3);
00425 VECTOR calcule_normal(int i, int j);
00426
00427 public:
00428 TELA();
00429 virtual ~TELA();
00430
00431
00432 GEOMETRIA *geometria(void);
00433 void aplicar_campo_vectorial(CAMPO_VECTORIAL *Campo);
00434 void aplicar_drag(double Kd);
00435
00436
00437 void actualizar(double delta_t);
00438 int ODE_numero_de_variables_de_estado(void);
00439 void ODE_reportar_variables_de_estado(double *Datos);
00440 void ODE_actualizar_variables_de_estado(double *Datos);
00441 void ODE_calcular_la_primera_derivada(double *Datos);
00442
00443
00444 void minmax(VECTOR *min, VECTOR *max);
00445 #ifdef GL_ENABLED
00446 void pintar_gl(CALIDAD_VISUAL *Calidad, CAMARA *Camara);
00447 #endif
00448 void pintar_povray(FILE *fd);
00449
00450
00451 BOOLEAN leer(TOKENIZADOR *Sabiondo);
00452 void grabar(FILE *fd);
00453
00454
00455 inline int num_masas(void);
00456 inline MASA_PUNTUAL *masa_puntual(int i);
00457 };
00458
00459 class AVATAR_QUAKE : public COSA_FLEXIBLE {
00460 private:
00461
00462 IMAGEN *Textura;
00463 MESH *Superficie;
00464
00465 public:
00466 AVATAR_QUAKE();
00467 virtual ~AVATAR_QUAKE();
00468
00469
00470 GEOMETRIA *geometria(void);
00471
00472
00473 void actualizar(double delta_t);
00474
00475
00476 #ifdef GL_ENABLED
00477 void pintar_gl(CALIDAD_VISUAL *Calidad, CAMARA *Camara);
00478 #endif
00479 void pintar_povray(FILE *fd);
00480
00481
00482 BOOLEAN leer(TOKENIZADOR *Sabiondo);
00483 void grabar(FILE *fd);
00484 };
00485
00486 inline int
00487 TELA::num_masas(void)
00488 {
00489 return x_tam * y_tam;
00490 }
00491
00492 inline MASA_PUNTUAL *
00493 TELA::masa_puntual(int i)
00494 {
00495 return &Arr_masas[i];
00496 }
00497
00498 #ifndef VEL_ROSITA
00499 #include "core/uniones/union.h"
00500 #endif
00501
00502 #endif // __COSA__
00503
00504
00505
00506
00507