00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <stdio.h>
00023 #include <stdlib.h>
00024
00025 #include "framework/visual/visor_cv.h"
00026 #include "toolkits/geom/geometria.h"
00027 #include "matriz4.h"
00028 #include "lista.cc"
00029
00030 #include "toolkits/media/jed_img.h"
00031
00032
00033
00034
00035
00036 #define ESPERO(tipo, msg) \
00037 if ( tipo_token != (tipo) ) { \
00038 fprintf(stderr, "<VISOR_CAMPO_VECTORIAL> " \
00039 "ERROR: Esperaba %s y recibi [%s].\n", \
00040 (msg), cad); fflush(stderr); return FALSE; \
00041 }
00042
00043 #define VERIFICAR(c) \
00044 if ( !(c) ) {\
00045 fprintf(stderr, \
00046 "<VISOR_CAMPO_VECTORIAL> " \
00047 "ERROR: No se pudo crear un objeto dinamico!\n");\
00048 fflush(stderr);\
00049 exit(1);\
00050 }
00051
00052
00053
00054
00055
00056 VISOR_CAMPO_VECTORIAL::VISOR_CAMPO_VECTORIAL(CAMPO_VECTORIAL *c)
00057 {
00058 Campo = c;
00059 init();
00060 }
00061
00062 VISOR_CAMPO_VECTORIAL::VISOR_CAMPO_VECTORIAL()
00063 {
00064 Campo = NULL;
00065 init();
00066 }
00067
00068 VISOR_CAMPO_VECTORIAL::~VISOR_CAMPO_VECTORIAL()
00069 {
00070
00071
00072 delete Material;
00073 }
00074
00075 void
00076 VISOR_CAMPO_VECTORIAL::init(void)
00077 {
00078 _nombre_campo = NULL;
00079
00080
00081 min.x = -5; min.y = -5; min.z = 0;
00082 max.x = 5; max.y = 5; max.z = 0;
00083 offset_plano = 0;
00084 luz.set_id(0);
00085
00086
00087 VECTOR p(2.5, 0.5, 0.5);
00088 MATRIZ_4x4 R;
00089
00090 camara.set_posicion(p);
00091 R.rotacion_angulos_euler(DEG2RAD(175), DEG2RAD(-25), 0);
00092 camara.set_orientacion(R.exportar_quaternion());
00093
00094
00095 COLOR col(0.5f, 0.7f, 0.5f);
00096
00097 Material = new MATERIAL;
00098 Material->set_difusa(col);
00099 }
00100
00101 char *
00102 VISOR_CAMPO_VECTORIAL::nombre_campo(void)
00103 {
00104 return _nombre_campo;
00105 }
00106
00107 void
00108 VISOR_CAMPO_VECTORIAL::set_campo(CAMPO_VECTORIAL *c)
00109 {
00110 Campo = c;
00111 }
00112
00113 #ifdef GL_ENABLED
00114 void
00115 VISOR_CAMPO_VECTORIAL::pintar_gl(void)
00116 {
00117
00118 glColor3f(0.5f, 0.5f, 0.5f);
00119 PINTAR_FONDO_VISOR();
00120 camara.activar_gl();
00121 glCullFace(GL_BACK);
00122 glEnable(GL_CULL_FACE);
00123 glEnable(GL_DEPTH_TEST);
00124 glClear(GL_DEPTH_BUFFER_BIT);
00125
00126
00127 static VECTOR lp(90, 90, 150);
00128
00129 glEnable(GL_LIGHTING);
00130 luz.set_posicion(lp);
00131 luz.activar_gl();
00132 Material->activar_gl();
00133 glShadeModel(GL_SMOOTH);
00134 glDisable(GL_TEXTURE_2D);
00135
00136
00137 VECTOR p, deltav;
00138 double delta = 2;
00139
00140 for ( p.x = min.x; p.x <= max.x; p.x += delta ) {
00141 for ( p.y = min.y; p.y <= max.y; p.y += delta ) {
00142 for ( p.z = min.z; p.z <= max.z; p.z += delta ) {
00143 deltav = Campo->valor(p);
00144 deltav = deltav * 0.1;
00145 PINTAR_VECTOR_GL(p, p + deltav, 0.03, 0.3, 0.1);
00146 }
00147 }
00148 }
00149
00150
00151 pintar_visores_subordinados_gl(&camara);
00152 }
00153 #endif // GL_ENABLED
00154
00155 int
00156 VISOR_CAMPO_VECTORIAL::procesar_teclado(EVENTO_GUI *e)
00157 {
00158 static int modo = 1;
00159
00160 switch( e->key_code ) {
00161 case JK_1:
00162
00163
00164
00165 modo = 1;
00166 break;
00167 case JK_2:
00168
00169
00170
00171 modo = 2;
00172 break;
00173 case JK_3:
00174
00175
00176
00177 modo = 3;
00178 break;
00179 case JK_4:
00180
00181
00182 modo = 0;
00183 break;
00184 case JK_O:
00185 offset_plano += 1.0;
00186
00187
00188 break;
00189 case JK_o:
00190 offset_plano -= 1.0;
00191
00192
00193 break;
00194 default:
00195 return calidad.procesar_teclado(e) || camara.procesar_teclado(e);
00196 }
00197 min.x = -5; min.y = -5; min.z = -5;
00198 max.x = 5; max.y = 5; max.z = 5;
00199 switch ( modo ) {
00200 case 1: min.z = max.z = offset_plano; break;
00201 case 2: min.x = max.x = offset_plano; break;
00202 case 3: min.y = max.y = offset_plano; break;
00203 default: break;
00204 }
00205 return 1;
00206 }
00207
00208 void
00209 VISOR_CAMPO_VECTORIAL::procesar_resize(int , int ,
00210 int x_tam, int y_tam)
00211 {
00212 camara.procesar_resize(x_tam, y_tam);
00213 }
00214
00215
00216
00217 BOOLEAN
00218 VISOR_CAMPO_VECTORIAL::leer(TOKENIZADOR *Sabiondo)
00219 {
00220 char cad[1000];
00221 int tipo_token = TK_DESCONOCIDO, pos;
00222
00223
00224 pos = 1;
00225 while ( tipo_token != TK_CERRAR) {
00226 tipo_token = Sabiondo->siguiente_token(cad);
00227 switch ( pos ) {
00228 case 1:
00229 ESPERO(TK_CADENA, "una cadena con un nombre de un VISOR");
00230 if ( strlen(cad) > MAX_CAD-1 ) cad[MAX_CAD-1] = '\0';
00231 des_comille(cad);
00232
00233 pos++;
00234 break;
00235 case 2: ESPERO(TK_ABRIR, "\"{\""); pos++; break;
00236 default:
00237 if ( tipo_token == TK_CERRAR ) break;
00238 ESPERO(TK_IDENTIFICADOR, "un identificador (3)");
00239 if ( strcmp(cad, "objetivo") == 0 ) {
00240 tipo_token = Sabiondo->siguiente_token(cad);
00241 ESPERO(TK_CADENA, "una cadena con el nombre de una COSA");
00242 des_comille(cad);
00243 _nombre_campo = new char [strlen(cad) + 1];
00244 VERIFICAR(_nombre_campo);
00245 strcpy(_nombre_campo, cad);
00246 }
00247 else if ( !leer_visor_subordinado(Sabiondo, cad) ) {
00248 return FALSE;
00249 }
00250 ;
00251 break;
00252 }
00253 }
00254
00255 return TRUE;
00256 }
00257
00258
00259
00260
00261