00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "toolkits/geom/geometria.h"
00023
00024 #ifdef VEL_ROSITA
00025 #include "toolkits/geom/paralele.h"
00026 #endif
00027
00028 #include <stdio.h>
00029
00030
00031
00032
00033
00034 PARALELEPIPEDO::PARALELEPIPEDO(VECTOR l)
00035 {
00036 _lados = l;
00037 imagen = NULL;
00038 }
00039
00040 PARALELEPIPEDO::PARALELEPIPEDO(double lx, double ly, double lz)
00041 {
00042 _lados.x = lx;
00043 _lados.y = ly;
00044 _lados.z = lz;
00045
00046 if ( _lados.x < EPSILON ) _lados.x = EPSILON;
00047 if ( _lados.y < EPSILON ) _lados.y = EPSILON;
00048 if ( _lados.z < EPSILON ) _lados.z = EPSILON;
00049 imagen = NULL;
00050 }
00051
00052 PARALELEPIPEDO::~PARALELEPIPEDO()
00053 {
00054 if ( imagen ) delete imagen;
00055 }
00056
00057 VECTOR
00058 PARALELEPIPEDO::lados(void)
00059 {
00060 return _lados;
00061 }
00062
00063 void
00064 PARALELEPIPEDO::set_lados(VECTOR l)
00065 {
00066 _lados = l;
00067 if ( _lados.x < EPSILON ) _lados.x = EPSILON;
00068 if ( _lados.y < EPSILON ) _lados.y = EPSILON;
00069 if ( _lados.z < EPSILON ) _lados.z = EPSILON;
00070 }
00071
00072 void
00073 PARALELEPIPEDO::anexar_textura(IMAGEN *img)
00074 {
00075 if ( imagen ) delete imagen;
00076 imagen = img;
00077 }
00078
00079 int
00080 PARALELEPIPEDO::clasificar_punto(VECTOR p)
00087 {
00088 double lx = _lados.x/2;
00089 double ly = _lados.y/2;
00090 double lz = _lados.z/2;
00091
00092 if ( p.x > -lx + EPSILON && p.y + EPSILON > -ly && p.z > -lz + EPSILON &&
00093 p.x < lx - EPSILON && p.y < ly - EPSILON && p.z < lz - EPSILON ) {
00094 return 1;
00095 }
00096 else if (
00097 p.x < -lx - EPSILON || p.y - EPSILON < -ly || p.z < -lz - EPSILON ||
00098 p.x > lx + EPSILON || p.y > ly + EPSILON || p.z > lz + EPSILON ) {
00099 return -1;
00100 }
00101 else {
00102 return 0;
00103 }
00104 ;
00105 }
00106 void
00107 PARALELEPIPEDO::minmax(VECTOR *min, VECTOR *max)
00108 {
00109 (*min) = _lados*(-0.5);
00110 (*max) = _lados*0.5;
00111 }
00112
00113 #ifdef GL_ENABLED
00114
00115 void
00116 PARALELEPIPEDO::pintar_gl(CALIDAD_VISUAL *Calidad, MATERIAL* Material,
00117 CAMARA * )
00118 {
00119 int i;
00120 VECTOR min = _lados*(-0.5), max = _lados*0.5;
00121
00122
00123 COLOR cb(1, 0, 0);
00124
00125 if ( Calidad->con_bordes ) {
00126 Calidad->activar_bordes_gl(cb, Material);
00127 pintar_paralelepipedo(min, max);
00128 }
00129
00130 if ( Calidad->con_cajas && !Calidad->con_bordes ) PINTAR_MINMAX_GL();
00131
00132
00133 COLOR c(1, 1, 1);
00134
00135 if ( Calidad->con_caras ) {
00136 Material->activar_gl();
00137 Calidad->activar_caras_gl(c, Material);
00138
00139 if ( imagen && Calidad->con_textura ) {
00140 imagen->activar_gl();
00141 glEnable(GL_TEXTURE_2D);
00142 Calidad->activar_textura_gl();
00143 }
00144 else if ( Calidad->con_caustics ) {
00145 Calidad->activar_textura_gl();
00146 }
00147 else {
00148 glDisable(GL_TEXTURE_2D);
00149 }
00150
00151 ACTIVAR_POLYGON_OFFSET();
00152 for ( i = 0; i < 6; i++ ) {
00153 glBegin(GL_POLYGON);
00154 glNormal3dv(NORMALES_cubo[i]);
00155 glTexCoord2dv(TEXTURAS_cubo[i][0]);
00156 glVertex3d(_lados.x * COORDENADAS_cubo[i][0][0],
00157 _lados.y * COORDENADAS_cubo[i][0][1],
00158 _lados.z * COORDENADAS_cubo[i][0][2]);
00159 glNormal3dv(NORMALES_cubo[i]);
00160 glTexCoord2dv(TEXTURAS_cubo[i][1]);
00161 glVertex3d(_lados.x * COORDENADAS_cubo[i][1][0],
00162 _lados.y * COORDENADAS_cubo[i][1][1],
00163 _lados.z * COORDENADAS_cubo[i][1][2]);
00164 glNormal3dv(NORMALES_cubo[i]);
00165 glTexCoord2dv(TEXTURAS_cubo[i][2]);
00166 glVertex3d(_lados.x * COORDENADAS_cubo[i][2][0],
00167 _lados.y * COORDENADAS_cubo[i][2][1],
00168 _lados.z * COORDENADAS_cubo[i][2][2]);
00169 glNormal3dv(NORMALES_cubo[i]);
00170 glTexCoord2dv(TEXTURAS_cubo[i][3]);
00171 glVertex3d(_lados.x * COORDENADAS_cubo[i][3][0],
00172 _lados.y * COORDENADAS_cubo[i][3][1],
00173 _lados.z * COORDENADAS_cubo[i][3][2]);
00174 glEnd();
00175 }
00176 DESACTIVAR_POLYGON_OFFSET();
00177 }
00178 glDisable(GL_TEXTURE_2D);
00179 }
00180 #endif
00181
00182 void
00183 PARALELEPIPEDO::pintar_aqz(FILE *fd)
00184 {
00185 fprintf(fd, " // Pilas: No hay pintar_aqz... \n");
00186 fprintf(fd, " geometria ESFERA 1 \"\"\n");
00187 }
00188
00189 void
00190 PARALELEPIPEDO::pintar_povray(FILE *fd)
00191 {
00192 fprintf(fd,
00193 "box {\n"
00194 " <%f, %f, %f>, <%f, %f, %f>\n",
00195 -_lados.x/2, -_lados.y/2, -_lados.z/2,
00196 _lados.x/2, _lados.y/2, _lados.z/2
00197 );
00198 }
00199
00200 void
00201 PARALELEPIPEDO::pintar_vrml(FILE *fd)
00202 {
00203 fprintf(fd,
00204 " geometry Box { size %f, %f, %f }\n",
00205 _lados.x, _lados.y, _lados.z
00206 );
00207 }
00208
00209 GEOMETRIA *
00210 PARALELEPIPEDO::crear_copia(void)
00211 {
00212 PARALELEPIPEDO *p;
00213
00214 p = new PARALELEPIPEDO(_lados);
00215 if ( !p ) return NULL;
00216
00217 (*p) = (*this);
00218
00219 if ( imagen ) {
00220 p->imagen = imagen->copie();
00221 if ( !p->imagen ) {
00222 fprintf(stderr,
00223 "<PARALELEPIPEDO> Warning: no se pudo replicar una textura.\n");
00224 fflush(stderr);
00225 }
00226 }
00227
00228 return (GEOMETRIA *)p;
00229 }
00230
00231
00232
00233
00234
00235