00001
00002
00003
00004
00005 #include "jed_gl.h"
00006 #include "matriz4.h"
00007
00008
00009
00010
00011
00012 GLenum (*THE_key_callback)(int, GLenum);
00013 void (*THE_draw_callback)(void);
00014 void (*THE_idle_callback)(void);
00015
00016
00017
00018
00019
00025 double COORDENADAS_cubo[6][4][3] = {
00026 { {-.5, .5, .5}, {-.5, .5, -.5}, {-.5, -.5, -.5}, {-.5, -.5, .5} },
00027 { { .5, .5, -.5}, { .5, .5, .5}, { .5, -.5, .5}, { .5, -.5, -.5} },
00028 { {-.5, -.5, .5}, {-.5, -.5, -.5}, { .5, -.5, -.5}, { .5, -.5, .5} },
00029 { {-.5, .5, -.5}, {-.5, .5, .5}, { .5, .5, .5}, { .5, .5, -.5} },
00030 { {-.5, .5, -.5}, { .5, .5, -.5}, { .5, -.5, -.5}, {-.5, -.5, -.5} },
00031 { { .5, .5, .5}, {-.5, .5, .5}, {-.5, -.5, .5}, { .5, -.5, .5} }
00032 };
00033
00034 double NORMALES_cubo[6][3] = {
00035 {-1, 0, 0},
00036 { 1, 0, 0},
00037 { 0, -1, 0},
00038 { 0, 1, 0},
00039 { 0, 0, -1},
00040 { 0, 0, 1}
00041 };
00042
00043 double TEXTURAS_cubo[6][4][2] = {
00044 { {1, 1}, {0, 1}, {0, 0}, {1, 0} },
00045 { {1, 1}, {0, 1}, {0, 0}, {1, 0} },
00046 { {1, 1}, {0, 1}, {0, 0}, {1, 0} },
00047 { {1, 1}, {0, 1}, {0, 0}, {1, 0} },
00048 { {1, 1}, {0, 1}, {0, 0}, {1, 0} },
00049 { {1, 1}, {0, 1}, {0, 0}, {1, 0} }
00050 };
00051
00052
00053
00054
00055
00056
00057
00058 #ifdef GL_ENABLED
00059
00060 GLUquadricObj *TEXTURA_glu_global = NULL;
00061
00062 void
00063 PINTAR_VECTOR_GL(VECTOR p1, VECTOR p2, double grosor_cuerpo,
00064 double longitud_flecha, double grosor_flecha)
00086 {
00087
00088 if ( !TEXTURA_glu_global ) TEXTURA_glu_global = gluNewQuadric();
00089
00090
00091 double longitud_tronco, longitud_total;
00092
00093 longitud_total = DISTANCIA_V(p1, p2);
00094 if ( longitud_flecha < longitud_total ) {
00095 longitud_tronco = longitud_total - longitud_flecha;
00096 }
00097 else {
00098 longitud_tronco = longitud_total;
00099 longitud_flecha = 0;
00100 }
00101
00102
00103 MATRIZ_4x4 R;
00104 VECTOR pm, v;
00105
00106 R.rotacion_punto_punto(p1, p2);
00107
00108
00109 glPushMatrix();
00110 glTranslatef((float)p1.x, (float)p1.y, (float)p1.z);
00111 R.cargar_gl();
00112 gluCylinder(TEXTURA_glu_global,
00113 grosor_cuerpo, grosor_cuerpo, longitud_tronco, 6, 1);
00114 glRotated(180, 1, 0, 0);
00115 gluDisk(TEXTURA_glu_global, 0, grosor_cuerpo, 6, 1);
00116 glPopMatrix();
00117
00118
00119 if ( longitud_flecha > EPSILON ) {
00120
00121 v = p2 - p1;
00122 v.normalizar();
00123 pm = p2 - v * longitud_flecha;
00124 glPushMatrix();
00125 glTranslatef((float)pm.x, (float)pm.y, (float)pm.z);
00126 R.cargar_gl();
00127 gluCylinder(TEXTURA_glu_global,
00128 grosor_flecha, 0, longitud_flecha, 6, 1);
00129
00130 if ( fabs(grosor_flecha - grosor_cuerpo) > EPSILON ) {
00131 if ( grosor_flecha > grosor_cuerpo ) glRotated(180, 1, 0, 0);
00132 gluDisk(TEXTURA_glu_global,grosor_cuerpo,grosor_flecha,6,1);
00133 }
00134 glPopMatrix();
00135 }
00136 else {
00137
00138 glPushMatrix();
00139 glTranslatef((float)p2.x, (float)p2.y, (float)p2.z);
00140 R.cargar_gl();
00141 gluDisk(TEXTURA_glu_global,0,grosor_cuerpo,6,1);
00142 glPopMatrix();
00143 }
00144 }
00145 #endif // GL_ENABLED
00146
00147 void
00148 PINTAR_VECTOR_POVRAY(FILE *fd, VECTOR p1, VECTOR p2, double grosor_cuerpo,
00149 double largo_punta, double grosor_punta)
00153 {
00154 VECTOR v = p2 - p1;
00155 VECTOR pb;
00156 double largo_flecha = v.norma();
00157
00158 v.normalizar();
00159 pb = p1 + v * (largo_flecha - largo_punta);
00160
00161 fprintf(fd,
00162 "union {\n"
00163 " cone {\n"
00164 " <%f, %f, %f>, %f\n"
00165 " <%f, %f, %f>, 0\n"
00166 " }\n"
00167 " cone {\n"
00168 " <%f, %f, %f>, %f\n"
00169 " <%f, %f, %f>, %f\n"
00170 " }\n",
00171 pb.x, pb.y, pb.z, grosor_punta, p2.x, p2.y, p2.z,
00172 p1.x, p1.y, p1.z, grosor_cuerpo, pb.x, pb.y, pb.z, grosor_cuerpo
00173 );
00174 }
00175
00176 #if PLATAFORMA==i386_WIN32_VC
00177
00178
00179
00180
00181
00182 void tkDisplayFunc(void (*f)(void)){ THE_draw_callback = (f); }
00183
00184 static void CALLBACK TK_RETURN_callback(void) {THE_key_callback(TK_RETURN,0);};
00185 static void CALLBACK TK_ESCAPE_callback(void) {THE_key_callback(TK_ESCAPE,0);};
00186 static void CALLBACK TK_SPACE_callback(void) { THE_key_callback(TK_SPACE, 0);};
00187 static void CALLBACK TK_LEFT_callback(void) { THE_key_callback(TK_LEFT, 0); };
00188 static void CALLBACK TK_UP_callback(void) { THE_key_callback(TK_UP, 0); };
00189 static void CALLBACK TK_RIGHT_callback(void) { THE_key_callback(TK_RIGHT, 0);};
00190 static void CALLBACK TK_DOWN_callback(void) { THE_key_callback(TK_DOWN, 0); };
00191 static void CALLBACK TK_A_callback(void) { THE_key_callback(TK_A, 0); };
00192 static void CALLBACK TK_B_callback(void) { THE_key_callback(TK_B, 0); };
00193 static void CALLBACK TK_C_callback(void) { THE_key_callback(TK_C, 0); };
00194 static void CALLBACK TK_D_callback(void) { THE_key_callback(TK_D, 0); };
00195 static void CALLBACK TK_E_callback(void) { THE_key_callback(TK_E, 0); };
00196 static void CALLBACK TK_F_callback(void) { THE_key_callback(TK_F, 0); };
00197 static void CALLBACK TK_G_callback(void) { THE_key_callback(TK_G, 0); };
00198 static void CALLBACK TK_H_callback(void) { THE_key_callback(TK_H, 0); };
00199 static void CALLBACK TK_I_callback(void) { THE_key_callback(TK_I, 0); };
00200 static void CALLBACK TK_J_callback(void) { THE_key_callback(TK_J, 0); };
00201 static void CALLBACK TK_K_callback(void) { THE_key_callback(TK_K, 0); };
00202 static void CALLBACK TK_L_callback(void) { THE_key_callback(TK_L, 0); };
00203 static void CALLBACK TK_M_callback(void) { THE_key_callback(TK_M, 0); };
00204 static void CALLBACK TK_N_callback(void) { THE_key_callback(TK_N, 0); };
00205 static void CALLBACK TK_O_callback(void) { THE_key_callback(TK_O, 0); };
00206 static void CALLBACK TK_P_callback(void) { THE_key_callback(TK_P, 0); };
00207 static void CALLBACK TK_Q_callback(void) { THE_key_callback(TK_Q, 0); };
00208 static void CALLBACK TK_R_callback(void) { THE_key_callback(TK_R, 0); };
00209 static void CALLBACK TK_S_callback(void) { THE_key_callback(TK_S, 0); };
00210 static void CALLBACK TK_T_callback(void) { THE_key_callback(TK_T, 0); };
00211 static void CALLBACK TK_U_callback(void) { THE_key_callback(TK_U, 0); };
00212 static void CALLBACK TK_V_callback(void) { THE_key_callback(TK_V, 0); };
00213 static void CALLBACK TK_W_callback(void) { THE_key_callback(TK_W, 0); };
00214 static void CALLBACK TK_X_callback(void) { THE_key_callback(TK_X, 0); };
00215 static void CALLBACK TK_Y_callback(void) { THE_key_callback(TK_Y, 0); };
00216 static void CALLBACK TK_Z_callback(void) { THE_key_callback(TK_Z, 0); };
00217 static void CALLBACK TK_a_callback(void) { THE_key_callback(TK_a, 0); };
00218 static void CALLBACK TK_b_callback(void) { THE_key_callback(TK_b, 0); };
00219 static void CALLBACK TK_c_callback(void) { THE_key_callback(TK_c, 0); };
00220 static void CALLBACK TK_d_callback(void) { THE_key_callback(TK_d, 0); };
00221 static void CALLBACK TK_e_callback(void) { THE_key_callback(TK_e, 0); };
00222 static void CALLBACK TK_f_callback(void) { THE_key_callback(TK_f, 0); };
00223 static void CALLBACK TK_g_callback(void) { THE_key_callback(TK_g, 0); };
00224 static void CALLBACK TK_h_callback(void) { THE_key_callback(TK_h, 0); };
00225 static void CALLBACK TK_i_callback(void) { THE_key_callback(TK_i, 0); };
00226 static void CALLBACK TK_j_callback(void) { THE_key_callback(TK_j, 0); };
00227 static void CALLBACK TK_k_callback(void) { THE_key_callback(TK_k, 0); };
00228 static void CALLBACK TK_l_callback(void) { THE_key_callback(TK_l, 0); };
00229 static void CALLBACK TK_m_callback(void) { THE_key_callback(TK_m, 0); };
00230 static void CALLBACK TK_n_callback(void) { THE_key_callback(TK_n, 0); };
00231 static void CALLBACK TK_o_callback(void) { THE_key_callback(TK_o, 0); };
00232 static void CALLBACK TK_p_callback(void) { THE_key_callback(TK_p, 0); };
00233 static void CALLBACK TK_q_callback(void) { THE_key_callback(TK_q, 0); };
00234 static void CALLBACK TK_r_callback(void) { THE_key_callback(TK_r, 0); };
00235 static void CALLBACK TK_s_callback(void) { THE_key_callback(TK_s, 0); };
00236 static void CALLBACK TK_t_callback(void) { THE_key_callback(TK_t, 0); };
00237 static void CALLBACK TK_u_callback(void) { THE_key_callback(TK_u, 0); };
00238 static void CALLBACK TK_v_callback(void) { THE_key_callback(TK_v, 0); };
00239 static void CALLBACK TK_w_callback(void) { THE_key_callback(TK_w, 0); };
00240 static void CALLBACK TK_x_callback(void) { THE_key_callback(TK_x, 0); };
00241 static void CALLBACK TK_y_callback(void) { THE_key_callback(TK_y, 0); };
00242 static void CALLBACK TK_z_callback(void) { THE_key_callback(TK_z, 0); };
00243 static void CALLBACK TK_0_callback(void) { THE_key_callback(TK_0, 0); };
00244 static void CALLBACK TK_1_callback(void) { THE_key_callback(TK_1, 0); };
00245 static void CALLBACK TK_2_callback(void) { THE_key_callback(TK_2, 0); };
00246 static void CALLBACK TK_3_callback(void) { THE_key_callback(TK_3, 0); };
00247 static void CALLBACK TK_4_callback(void) { THE_key_callback(TK_4, 0); };
00248 static void CALLBACK TK_5_callback(void) { THE_key_callback(TK_5, 0); };
00249 static void CALLBACK TK_6_callback(void) { THE_key_callback(TK_6, 0); };
00250 static void CALLBACK TK_7_callback(void) { THE_key_callback(TK_7, 0); };
00251 static void CALLBACK TK_8_callback(void) { THE_key_callback(TK_8, 0); };
00252 static void CALLBACK TK_9_callback(void) { THE_key_callback(TK_9, 0); };
00253
00254 #ifdef TK_ENABLED
00255 void
00256 tkKeyDownFunc(GLenum (*tk_key_callback)(int,GLenum))
00257 {
00258 THE_key_callback = tk_key_callback;
00259 auxKeyFunc(TK_RETURN, TK_RETURN_callback);
00260 auxKeyFunc(TK_ESCAPE, TK_ESCAPE_callback);
00261 auxKeyFunc(TK_SPACE, TK_SPACE_callback);
00262 auxKeyFunc(TK_LEFT, TK_LEFT_callback);
00263 auxKeyFunc(TK_UP, TK_UP_callback);
00264 auxKeyFunc(TK_RIGHT, TK_RIGHT_callback);
00265 auxKeyFunc(TK_DOWN, TK_DOWN_callback);
00266 auxKeyFunc(TK_A, TK_A_callback);
00267 auxKeyFunc(TK_B, TK_B_callback);
00268 auxKeyFunc(TK_C, TK_C_callback);
00269 auxKeyFunc(TK_D, TK_D_callback);
00270 auxKeyFunc(TK_E, TK_E_callback);
00271 auxKeyFunc(TK_F, TK_F_callback);
00272 auxKeyFunc(TK_G, TK_G_callback);
00273 auxKeyFunc(TK_H, TK_H_callback);
00274 auxKeyFunc(TK_I, TK_I_callback);
00275 auxKeyFunc(TK_J, TK_J_callback);
00276 auxKeyFunc(TK_K, TK_K_callback);
00277 auxKeyFunc(TK_L, TK_L_callback);
00278 auxKeyFunc(TK_M, TK_M_callback);
00279 auxKeyFunc(TK_N, TK_N_callback);
00280 auxKeyFunc(TK_O, TK_O_callback);
00281 auxKeyFunc(TK_P, TK_P_callback);
00282 auxKeyFunc(TK_Q, TK_Q_callback);
00283 auxKeyFunc(TK_R, TK_R_callback);
00284 auxKeyFunc(TK_S, TK_S_callback);
00285 auxKeyFunc(TK_T, TK_T_callback);
00286 auxKeyFunc(TK_U, TK_U_callback);
00287 auxKeyFunc(TK_V, TK_V_callback);
00288 auxKeyFunc(TK_W, TK_W_callback);
00289 auxKeyFunc(TK_X, TK_X_callback);
00290 auxKeyFunc(TK_Y, TK_Y_callback);
00291 auxKeyFunc(TK_Z, TK_Z_callback);
00292 auxKeyFunc(TK_a, TK_a_callback);
00293 auxKeyFunc(TK_b, TK_b_callback);
00294 auxKeyFunc(TK_c, TK_c_callback);
00295 auxKeyFunc(TK_d, TK_d_callback);
00296 auxKeyFunc(TK_e, TK_e_callback);
00297 auxKeyFunc(TK_f, TK_f_callback);
00298 auxKeyFunc(TK_g, TK_g_callback);
00299 auxKeyFunc(TK_h, TK_h_callback);
00300 auxKeyFunc(TK_i, TK_i_callback);
00301 auxKeyFunc(TK_j, TK_j_callback);
00302 auxKeyFunc(TK_k, TK_k_callback);
00303 auxKeyFunc(TK_l, TK_l_callback);
00304 auxKeyFunc(TK_m, TK_m_callback);
00305 auxKeyFunc(TK_n, TK_n_callback);
00306 auxKeyFunc(TK_o, TK_o_callback);
00307 auxKeyFunc(TK_p, TK_p_callback);
00308 auxKeyFunc(TK_q, TK_q_callback);
00309 auxKeyFunc(TK_r, TK_r_callback);
00310 auxKeyFunc(TK_s, TK_s_callback);
00311 auxKeyFunc(TK_t, TK_t_callback);
00312 auxKeyFunc(TK_u, TK_u_callback);
00313 auxKeyFunc(TK_v, TK_v_callback);
00314 auxKeyFunc(TK_w, TK_w_callback);
00315 auxKeyFunc(TK_x, TK_x_callback);
00316 auxKeyFunc(TK_y, TK_y_callback);
00317 auxKeyFunc(TK_z, TK_z_callback);
00318 auxKeyFunc(TK_0, TK_0_callback);
00319 auxKeyFunc(TK_1, TK_1_callback);
00320 auxKeyFunc(TK_2, TK_2_callback);
00321 auxKeyFunc(TK_3, TK_3_callback);
00322 auxKeyFunc(TK_4, TK_4_callback);
00323 auxKeyFunc(TK_5, TK_5_callback);
00324 auxKeyFunc(TK_6, TK_6_callback);
00325 auxKeyFunc(TK_7, TK_7_callback);
00326 auxKeyFunc(TK_8, TK_8_callback);
00327 auxKeyFunc(TK_9, TK_9_callback);
00328 }
00329 #endif
00330
00331 GLenum (*THE_locatorup_callback)(int, int, GLenum);
00332 GLenum (*THE_locatordown_callback)(int, int, GLenum);
00333 GLenum (*THE_locatormove_callback)(int, int, GLenum);
00334
00335 static void CALLBACK
00336 JED_idle()
00337 {
00338 THE_idle_callback();
00339 }
00340
00341 static void CALLBACK
00342 JED_locatorup(AUX_EVENTREC *e)
00343 {
00344 THE_locatorup_callback(e->data[AUX_MOUSEX], e->data[AUX_MOUSEY],
00345 e->data[AUX_MOUSESTATUS]);
00346 }
00347
00348 static void CALLBACK
00349 JED_locatordown(AUX_EVENTREC *e)
00350 {
00351 THE_locatordown_callback(e->data[AUX_MOUSEX], e->data[AUX_MOUSEY],
00352 e->data[AUX_MOUSESTATUS]);
00353 }
00354
00355 static void CALLBACK
00356 JED_locatormove(AUX_EVENTREC *e)
00357 {
00358 THE_locatormove_callback(e->data[AUX_MOUSEX], e->data[AUX_MOUSEY],
00359 e->data[AUX_MOUSESTATUS]);
00360 }
00361
00362 #ifdef TK_ENABLED
00363 void
00364 tkMouseUpFunc(GLenum (*locator_callback)(int, int, GLenum))
00365 {
00366 THE_locatorup_callback = locator_callback;
00367 auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSEUP, JED_locatorup);
00368 auxMouseFunc(AUX_MIDDLEBUTTON, AUX_MOUSEUP, JED_locatorup);
00369 auxMouseFunc(AUX_RIGHTBUTTON, AUX_MOUSEUP, JED_locatorup);
00370 }
00371
00372 void
00373 tkMouseDownFunc(GLenum (*locator_callback)(int, int, GLenum))
00374 {
00375 THE_locatordown_callback = locator_callback;
00376 auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSEDOWN, JED_locatordown);
00377 auxMouseFunc(AUX_MIDDLEBUTTON, AUX_MOUSEDOWN, JED_locatordown);
00378 auxMouseFunc(AUX_RIGHTBUTTON, AUX_MOUSEDOWN, JED_locatordown);
00379 }
00380
00381 void
00382 tkMouseMoveFunc(GLenum (*locator_callback)(int, int, GLenum))
00383 {
00384 THE_locatormove_callback = locator_callback;
00385 auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSELOC, JED_locatormove);
00386 auxMouseFunc(AUX_MIDDLEBUTTON, AUX_MOUSELOC, JED_locatormove);
00387 auxMouseFunc(AUX_RIGHTBUTTON, AUX_MOUSELOC, JED_locatormove);
00388 }
00389
00390
00391 void
00392 tkIdleFunc(void (*idle_callback)(void))
00393 {
00394 THE_idle_callback = idle_callback;
00395 auxIdleFunc(JED_idle);
00396 }
00397 #endif
00398
00399
00400
00401 #endif // PLATAFORMA == i386_WIN32_VC
00402