00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "jed_defs.h"
00024 #include "framework/visual/control_3d.h"
00025
00026
00027
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
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
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
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
00106
00107
00108
00109
00110
00111
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
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
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
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
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
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
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
00211
00212
00213
00214
00215
00216
00217 return TRUE;
00218 }
00219
00220
00221
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
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 * ,
00271 MATERIAL * , CAMARA *Camara)
00279 {
00280 _Ultima_camara = Camara;
00281
00282
00283 CALIDAD_VISUAL cv_propia;
00284 MATERIAL m_propio;
00285
00286
00287
00288
00289 glClear(GL_DEPTH_BUFFER_BIT);
00290 glEnable(GL_DEPTH_TEST);
00291 glEnable(GL_LIGHTING);
00292 glPushMatrix();
00293 glLoadIdentity();
00294
00295
00296
00297
00298
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
00329
00330