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/esfera.h"
00026 #endif
00027
00028 #include <stdio.h>
00029
00030
00031
00032
00033
00034 ESFERA::ESFERA(double r)
00042 {
00043 _radio = r;
00044 _lod = 500;
00045
00046 #ifdef GL_ENABLED
00047 Textura_glu = gluNewQuadric();
00048 _paralelos = 10;
00049 _meridianos = 16;
00050 #endif
00051 imagen = NULL;
00052 }
00053
00054 ESFERA::~ESFERA()
00059 {
00060 if ( imagen ) delete imagen;
00061 #ifdef GL_ENABLED
00062 if ( Textura_glu ) gluDeleteQuadric(Textura_glu);
00063 #endif
00064 }
00065
00066 double
00067 ESFERA::radio(void)
00077 {
00078 return _radio;
00079 }
00080
00081 void
00082 ESFERA::set_radio(double r)
00092 {
00093 if ( r > EPSILON ) {
00094 _radio = r;
00095 }
00096 }
00097
00098 void
00099 ESFERA::activar_lod(void)
00106 {
00107 unsigned long int p, nt;
00108
00109 for ( p = 2; p < 400; p++ ) {
00110 nt = 2 * p * (long int)((double)p * 1.5);
00111 if ( nt >= _lod ) {
00112 _paralelos = (int)p;
00113 _meridianos = (int)((double)p * 1.5);
00114 break;
00115 }
00116 }
00117 if ( p == 400 ) {
00118 _paralelos = (int)p;
00119 _meridianos = (int)((double)p * 1.5);
00120 }
00121 }
00122
00123 void
00124 ESFERA::set_lod(unsigned long int lod)
00133 {
00134 _lod = lod;
00135 activar_lod();
00136 }
00137
00138 void
00139 ESFERA::anexar_textura(IMAGEN *img)
00146 {
00147 if ( imagen ) delete imagen;
00148 imagen = img;
00149 }
00150
00151 int
00152 ESFERA::clasificar_punto(VECTOR p)
00159 {
00160 double d = DISTANCIA(0, 0, 0, p.x, p.y, p.z);
00161
00162 if ( IGUAL(_radio, d ) ) {
00163 return 0;
00164 }
00165 else if ( d < _radio ) {
00166 return 1;
00167 }
00168 else {
00169 return -1;
00170 }
00171 ;
00172 }
00173
00174 void
00175 ESFERA::minmax(VECTOR *min, VECTOR *max)
00178 {
00179 min->x = -_radio;
00180 min->y = -_radio;
00181 min->z = -_radio;
00182 max->x = _radio;
00183 max->y = _radio;
00184 max->z = _radio;
00185 }
00186
00187 #ifdef GL_ENABLED
00188
00189 void
00190 ESFERA::pintar_gl(CALIDAD_VISUAL *Calidad, MATERIAL* Material,
00191 CAMARA * )
00197 {
00198
00199 COLOR cb(1, 0, 0);
00200
00201 if ( Calidad->con_bordes ) {
00202 Calidad->activar_bordes_gl(cb, Material);
00203
00204 gluQuadricDrawStyle(Textura_glu, (GLenum)GLU_LINE);
00205 gluQuadricOrientation(Textura_glu, (GLenum)GLU_OUTSIDE);
00206 gluQuadricNormals(Textura_glu, (GLenum)GLU_FLAT);
00207 gluQuadricTexture(Textura_glu, GL_FALSE);
00208 gluSphere(Textura_glu, _radio, _meridianos, _paralelos);
00209 }
00210
00211 if ( Calidad->con_cajas ) PINTAR_MINMAX_GL();
00212
00213
00214 COLOR c(1, 1, 1);
00215
00216 if ( Calidad->con_caras ) {
00217
00218 gluQuadricDrawStyle(Textura_glu, (GLenum)GLU_FILL);
00219 gluQuadricOrientation(Textura_glu, (GLenum)GLU_OUTSIDE);
00220
00221
00222 Material->activar_gl();
00223 Calidad->activar_caras_gl(c, Material);
00224
00225 switch ( Calidad->calidad_caras ) {
00226 case CVC_CONSTANTE: gluQuadricNormals(Textura_glu, (GLenum)GLU_FLAT);
00227 break;
00228 case CVC_SHADE:
00229 gluQuadricNormals(Textura_glu, (GLenum)GLU_SMOOTH);
00230 break;
00231 case CVC_FLAT: default:
00232 gluQuadricNormals(Textura_glu, (GLenum)GLU_FLAT);
00233 break;
00234 }
00235
00236 if ( imagen && Calidad->con_textura ) {
00237 imagen->activar_gl();
00238 gluQuadricTexture(Textura_glu, GL_TRUE);
00239 glEnable(GL_TEXTURE_2D);
00240 Calidad->activar_textura_gl();
00241 }
00242 else if ( Calidad->con_caustics ) {
00243 gluQuadricTexture(Textura_glu, GL_TRUE);
00244 Calidad->activar_textura_gl();
00245 }
00246 else {
00247 gluQuadricTexture(Textura_glu, GL_FALSE);
00248 glDisable(GL_TEXTURE_2D);
00249 }
00250
00251 ACTIVAR_POLYGON_OFFSET();
00252 gluSphere(Textura_glu, _radio, _meridianos, _paralelos);
00253 DESACTIVAR_POLYGON_OFFSET();
00254 glDisable(GL_TEXTURE_2D);
00255 }
00256
00257 }
00258 #endif
00259
00260 void
00261 ESFERA::pintar_povray(FILE *fd)
00267 {
00268 fprintf(fd,
00269 "sphere {\n"
00270 " <0, 0, 0>, %f\n",
00271 _radio
00272 );
00273 }
00274
00275 void
00276 ESFERA::pintar_aqz(FILE *fd)
00282 {
00283 char num[200];
00284
00285 sprintf(num, "%f", _radio);
00286 simplifique_real(num);
00287 fprintf(fd, " geometria ESFERA %s \"%s\"\n", num, "");
00288 }
00289
00290 GEOMETRIA *
00291 ESFERA::crear_copia(void)
00297 {
00298 ESFERA *e;
00299
00300 e = new ESFERA(_radio);
00301 if ( !e ) return NULL;
00302
00303 (*e) = (*this);
00304
00305 #ifdef GL_ENABLED
00306 e->Textura_glu = gluNewQuadric();
00307
00308 if ( imagen ) {
00309 e->imagen = imagen->copie();
00310 if ( !e->imagen ) {
00311 fprintf(stderr,
00312 "<ESFERA> Warning: no se pudo replicar una textura.\n");
00313 fflush(stderr);
00314 }
00315 }
00316 #endif
00317
00318 return (GEOMETRIA *)e;
00319 }
00320
00321
00322
00323
00324