Página principal | Jerarquía de la clase | Lista alfabética | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros | Páginas relacionadas

control_3d_vector.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= control_3d_vector.C                                    Abril 17 de 2003 =
00003 //=-------------------------------------------------------------------------=
00004 //= <descripcion del modulo>                                                =
00005 //=-------------------------------------------------------------------------=
00006 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO   =
00007 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN   =
00008 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES,     = 
00009 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO,        =
00010 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO,  =
00011 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA   =
00012 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES       =
00013 //= ("ACTIVIDADES DE ALGO RIESGO").                                         =
00014 //=-------------------------------------------------------------------------=
00015 //= Autor original: Oscar J. Chavarro G.  A.K.A. JEDILINK. Copyright (c),   =
00016 //= 1997 - 2003, oscarchavarro@hotmail.com                                  =
00017 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia   =
00018 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la  =
00019 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. =
00020 //= Copyright (c), 1997-2003.                                               =
00021 //===========================================================================
00022 
00023 #include "jed_defs.h"
00024 #include "framework/visual/control_3d.h"
00025 
00026 //===========================================================================
00027 //= Clases GIZMO. No deberian estar en este modulo!                         =
00028 //===========================================================================
00029 
00030 GIZMO_3D_IMPLEMENTADOR::GIZMO_3D_IMPLEMENTADOR(CONTROL_3D_VECTOR *in_Padre)
00031 {
00032     _Padre = in_Padre;
00033 }
00034 
00035 GIZMO_3D_IMPLEMENTADOR::~GIZMO_3D_IMPLEMENTADOR()
00036 {
00037     ;
00038 }
00039 
00040 //===========================================================================
00041 
00042 GIZMO_3D_TRANSLACION_3DSMAX::GIZMO_3D_TRANSLACION_3DSMAX(
00043     CONTROL_3D_VECTOR *in_Padre) : GIZMO_3D_IMPLEMENTADOR(in_Padre)
00044 {
00045     _zona_seleccionada_temporal = 0;
00046 }
00047 
00048 GIZMO_3D_TRANSLACION_3DSMAX::~GIZMO_3D_TRANSLACION_3DSMAX()
00049 {
00050     ;
00051 }
00052 
00053 #ifdef GL_ENABLED
00054 void
00055 GIZMO_3D_TRANSLACION_3DSMAX::pintar_gl(CALIDAD_VISUAL *Calidad, 
00056                        MATERIAL* Material, CAMARA *Camara)
00061 {
00062     COLOR r(1, 0, 0);
00063     COLOR g(0, 1, 0);
00064     COLOR b(0, 0, 1);
00065     COLOR a(1, 1, 0);
00066 
00067     //- Zona 1: Vector I ----------------------------------------------------
00068     glPushMatrix();
00069     glTranslated(0.5, 0, 0);
00070     if ( _zona_seleccionada_temporal == 1 ) {
00071         Material->set_difusa(a);
00072       }
00073       else {
00074         Material->set_difusa(r);
00075     }
00076     _Padre->_Eje->pintar_gl(Calidad, Material, Camara);
00077     glPopMatrix();
00078 
00079     //- Zona 2: Vector J ----------------------------------------------------
00080     glPushMatrix();
00081     glTranslated(0, 0.5, 0);
00082     glRotated(90, 0, 0, 1);
00083     if ( _zona_seleccionada_temporal == 2 ) {
00084         Material->set_difusa(a);
00085       }
00086       else {
00087         Material->set_difusa(g);
00088     }
00089     _Padre->_Eje->pintar_gl(Calidad, Material, Camara);
00090     glPopMatrix();
00091 
00092     //- Zona 3: Vector K ----------------------------------------------------
00093     glPushMatrix();
00094     glTranslated(0, 0, 0.5);
00095     glRotated(90, 0, -1, 0);
00096     if ( _zona_seleccionada_temporal == 3 ) {
00097         Material->set_difusa(a);
00098       }
00099       else {
00100         Material->set_difusa(b);
00101     }
00102     _Padre->_Eje->pintar_gl(Calidad, Material, Camara);
00103     glPopMatrix();
00104 
00105     //- Zona 4: Cuadrante de control para el plano XY -----------------------
00106 
00107     //- Zona 5: Cuadrante de control para el plano XZ -----------------------
00108 
00109     //- Zona 6: Cuadrante de control para el plano YZ -----------------------
00110 
00111     //- Zona 7: Cubo central de acceso a los tres ejes ----------------------
00112 
00113 }
00114 #endif // GL_ENABLED
00115 
00116 BOOLEAN
00117 GIZMO_3D_TRANSLACION_3DSMAX::procesar_mouse(EVENTO_GUI *e)
00134 {
00135     RAYO r, r_prima;
00136     VECTOR p, n;
00137 //    int antigua_zona = _zona_seleccionada_temporal;
00138     MATRIZ_4x4 R, R_i;
00139 
00140     if ( e->tipo_de_evento == ETYPE_BUTTON_DOWN &&
00141          (e->mouse_button_mask & 0x01) ) {
00142         _Padre->_boton1_mouse_abajo = TRUE;
00143         return TRUE;
00144       }
00145       else if ( e->tipo_de_evento == ETYPE_BUTTON_UP ) {
00146         _Padre->_boton1_mouse_abajo = FALSE;
00147         return TRUE;
00148       }
00149       else {
00150           if ( _Padre->_boton1_mouse_abajo &&
00151                (e->mouse_button_mask & 0x01) ) {
00152               // Estamos en modo de actualizacion de informacion
00153           switch ( _zona_seleccionada_temporal ) {
00154             case 1:
00155                   _Padre->_valor.x += ((double)e->mouse_delta_x)/60;
00156                   _Padre->set_valor(_Padre->_valor);
00157           break;
00158             case 2:
00159                   _Padre->_valor.y += ((double)e->mouse_delta_x)/60;
00160                   _Padre->set_valor(_Padre->_valor);
00161           break;
00162             case 3:
00163                   _Padre->_valor.z -= ((double)e->mouse_delta_y)/60;
00164                   _Padre->set_valor(_Padre->_valor);
00165           break;
00166             default: break;
00167           }
00168               return TRUE;
00169           }
00170           else {
00171               // Estamos en modo de seleccion
00172               if ( !_Padre->_Ultima_camara ) return FALSE;
00173               _Padre->_Ultima_camara->preprocesar_vista();
00174               r = _Padre->_Ultima_camara->generar_rayo(e->mouse_x, e->mouse_y);
00175           _zona_seleccionada_temporal = 0;
00176 
00177               // Intersectar con la zona 1
00178           r_prima.origen = r.origen - _Padre->_valor;
00179           r_prima.origen.x -= 0.5;
00180           r_prima.direccion = r.direccion;
00181               if ( _Padre->_Eje_gravedad->interseccion(&r_prima, p, n) ) {
00182           _zona_seleccionada_temporal = 1;
00183               }
00184 
00185               // Intersectar con la zona 2
00186           R.rotacion_angulos_euler(DEG2RAD(90), 0, 0);
00187           R_i = R.inversa();
00188           r_prima.origen = r.origen - _Padre->_valor;
00189           r_prima.origen.y -= 0.5;
00190               r_prima.origen = R_i * r_prima.origen;
00191           r_prima.direccion = R_i * r.direccion;
00192               if ( _Padre->_Eje_gravedad->interseccion(&r_prima, p, n) ) {
00193           _zona_seleccionada_temporal = 2;
00194               }
00195 
00196               // Intersectar con la zona 2
00197           R.rotacion_angulos_euler(0, -DEG2RAD(90), 0);
00198           R_i = R.inversa();
00199           r_prima.origen = r.origen - _Padre->_valor;
00200           r_prima.origen.z -= 0.5;
00201               r_prima.origen = R_i * r_prima.origen;
00202           r_prima.direccion = R_i * r.direccion;
00203               if ( _Padre->_Eje_gravedad->interseccion(&r_prima, p, n) ) {
00204           _zona_seleccionada_temporal = 3;
00205               }
00206           }
00207       }
00208     ;
00209 
00210 // OJO: Esto deberia funcionar... pero no funciona! porque sera?
00211 //      Por ahora toca hacer la super-INEFICIENTE salida de retornar siempre
00212 //      TRUE!
00213 //    printf("[%d,%d] ", _zona_seleccionada_temporal, antigua_zona);
00214 //    fflush(stdout);
00215 //    if ( _zona_seleccionada_temporal == antigua_zona ) return FALSE;
00216 
00217     return TRUE;
00218 }
00219 
00220 //===========================================================================
00221 //= Clase CONTROL_3D_VECTOR                                                 =
00222 //===========================================================================
00223 
00224 CONTROL_3D_VECTOR::CONTROL_3D_VECTOR(JED_INTERFACE **p) : CONTROL_3D(p)
00225 {
00226     Entidad_controlada = NULL;
00227     _nombre_subvariable = NULL;
00228     _boton1_mouse_abajo = FALSE;
00229 
00230     _Eje = new FLECHA(1, 0.3, 0.03, 0.075);
00231     _Eje_gravedad = new FLECHA(1, 0.3, 0.03, 0.075);
00232 //    _Eje_gravedad = new FLECHA(1, 0.3, 0.08, 0.15);
00233     _Ultima_camara = NULL;
00234     _Implementador = new GIZMO_3D_TRANSLACION_3DSMAX(this);
00235 }
00236 
00237 CONTROL_3D_VECTOR::~CONTROL_3D_VECTOR()
00238 {
00239     ;
00240 }
00241 
00242 void
00243 CONTROL_3D_VECTOR::set_valor(VECTOR val)
00244 {
00245     _valor = val;
00246     if ( Entidad_controlada ) {
00247         Entidad_controlada->actualizar_variable(_nombre_subvariable,
00248             T_VECTOR, (void *)(&_valor));
00249         Entidad_controlada->propagar_cambios();
00250         (*_Padre)->solicitar_repintado();
00251     }
00252 }
00253 
00254 void
00255 CONTROL_3D_VECTOR::actualizar(ENTIDAD *Entidad)
00256 {
00257     //-----------------------------------------------------------------------
00258     VECTOR *Nuevo_valor;
00259     int tipo = T_FLOAT;
00260 
00261     if ( !Entidad || !Entidad->consultar_variable(
00262           (const char *)_nombre_subvariable,
00263           tipo, (void**)(&Nuevo_valor)) ) return;
00264 
00265     _valor = *Nuevo_valor;
00266 }
00267 
00268 #ifdef GL_ENABLED
00269 void
00270 CONTROL_3D_VECTOR::pintar_gl(CALIDAD_VISUAL * /*Calidad*/, 
00271                              MATERIAL * /*Material*/, CAMARA *Camara)
00279 {
00280     _Ultima_camara = Camara;
00281 
00282     //-----------------------------------------------------------------------
00283     CALIDAD_VISUAL cv_propia;
00284     MATERIAL m_propio;
00285 
00286     //-----------------------------------------------------------------------
00287     // OJO! Esto hace que estas funciones solo puedan ser llamadas una vez
00288     //      terminada de pintar la escena principal!
00289     glClear(GL_DEPTH_BUFFER_BIT);
00290     glEnable(GL_DEPTH_TEST);
00291     glEnable(GL_LIGHTING);
00292     glPushMatrix();
00293     glLoadIdentity();
00294 
00295     // OJO: ESTO ESTA MAL: Solo es cierto si se esta controlando una posicion,
00296     //      de lo contrario la clase requiere un VECTOR adicional para poder
00297     //      localizar su gizmo... (y el valor de la translacion ya se puede
00298     //      pedir a `Entidad_controlada`.
00299     glTranslated(_valor.x, _valor.y, _valor.z);
00300 
00301     //-----------------------------------------------------------------------
00302     _Implementador->pintar_gl(&cv_propia, &m_propio, Camara);
00303 
00304     //-----------------------------------------------------------------------
00305     glPopMatrix();
00306 }
00307 #endif // GL_ENABLED
00308 
00309 BOOLEAN
00310 CONTROL_3D_VECTOR::procesar_mouse(EVENTO_GUI *e)
00311 {
00312     return _Implementador->procesar_mouse(e);
00313 }
00314 
00315 void
00316 CONTROL_3D_VECTOR::crear(REPOSITORIO_DE_ENTIDADES *Repositorio, char *nombre)
00317 {
00318     ENTIDAD *e = Repositorio->buscar_entidad("_default", nombre);
00319     if ( e ) {
00320         Entidad_controlada = e;
00321         e->registrar_controlador(this);
00322     }
00323     _nombre_subvariable = new char[2];
00324     strcpy(_nombre_subvariable, "posicion");
00325 }
00326 
00327 //===========================================================================
00328 //= EOF                                                                     =
00329 //===========================================================================
00330 

Este archivo HTML ha sido generado automáticamente a partir del código fuente AQUYNZA. NO LO EDITE. Para mayor información contacte al autor.