00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "toolkits/geom/geometria.h"
00021
00022 #ifdef VEL_ROSITA
00023 #include "toolkits/geom/cilindro.h"
00024 #endif
00025
00026 #include <stdio.h>
00027
00028
00029
00030
00031
00032 #define PINTAR_CILINDRO_GL() \
00033 glPushMatrix(); \
00034 glTranslated(0, 0, -_altura/2); \
00035 gluCylinder(Textura_glu, _radio1, _radio2, _altura, \
00036 meridianos, paralelos); \
00037 glRotated(180, 1, 0, 0); \
00038 gluDisk(Textura_glu, 0, _radio1, meridianos, 1); \
00039 glPopMatrix(); \
00040 glPushMatrix(); \
00041 glTranslated(0, 0, _altura/2); \
00042 gluDisk(Textura_glu, 0, _radio2, meridianos, 1); \
00043 glPopMatrix();
00044
00045
00046
00047
00048
00049 CILINDRO::CILINDRO(double r1, double r2, double h)
00050 {
00051 _radio1 = r1;
00052 _radio2 = r2;
00053 _altura = h;
00054
00055 #ifdef GL_ENABLED
00056 Textura_glu = gluNewQuadric();
00057 paralelos = 10;
00058 meridianos = 16;
00059 imagen = NULL;
00060 #endif
00061 }
00062
00063 CILINDRO::~CILINDRO()
00064 {
00065 if ( imagen ) delete imagen;
00066 #ifdef GL_ENABLED
00067 if ( Textura_glu ) gluDeleteQuadric(Textura_glu);
00068 #endif
00069 }
00070
00071 void CILINDRO::valores(double *r1, double *r2, double *h)
00072 {
00073 (*r1) = _radio1;
00074 (*r2) = _radio2;
00075 (*h) = _altura;
00076 }
00077
00078 void CILINDRO::set_valores(double r1, double r2, double h)
00079 {
00080 _radio1 = r1;
00081 _radio2 = r2;
00082 _altura = h;
00083 }
00084
00085 void
00086 CILINDRO::anexar_textura(IMAGEN *img)
00087 {
00088 #ifdef GL_ENABLED
00089 if ( imagen ) delete imagen;
00090 imagen = img;
00091 #endif
00092 }
00093
00094 int
00095 CILINDRO::clasificar_punto(VECTOR )
00104 {
00105 return 1;
00106 }
00107
00108 void
00109 CILINDRO::minmax(VECTOR *min, VECTOR *max)
00110 {
00111 double mmx;
00112
00113 mmx = MAXIMO(_radio1, _radio2);
00114
00115 min->x = -mmx;
00116 min->y = -mmx;
00117 min->z = -_altura/2;
00118 max->x = mmx;
00119 max->y = mmx;
00120 max->z = _altura/2;
00121 }
00122
00123 #ifdef GL_ENABLED
00124
00125 void
00126 CILINDRO::pintar_gl(CALIDAD_VISUAL *Calidad, MATERIAL* Material,
00127 CAMARA * )
00128 {
00129
00130
00131
00132 COLOR cb(1, 0, 0);
00133
00134 if ( Calidad->con_bordes ) {
00135 Calidad->activar_bordes_gl(cb, Material);
00136
00137 gluQuadricDrawStyle(Textura_glu, (GLenum)GLU_LINE);
00138 gluQuadricOrientation(Textura_glu, (GLenum)GLU_OUTSIDE);
00139 gluQuadricNormals(Textura_glu, (GLenum)GLU_FLAT);
00140 gluQuadricTexture(Textura_glu, GL_FALSE);
00141
00142 PINTAR_CILINDRO_GL();
00143 }
00144
00145 if ( Calidad->con_cajas ) PINTAR_MINMAX_GL();
00146
00147
00148 COLOR c(1, 1, 1);
00149
00150 if ( Calidad->con_caras ) {
00151 Material->activar_gl();
00152
00153
00154 gluQuadricDrawStyle(Textura_glu, (GLenum)GLU_FILL);
00155
00156 gluQuadricOrientation(Textura_glu, (GLenum)GLU_OUTSIDE);
00157
00158
00159 Calidad->activar_caras_gl(c, Material);
00160
00161 switch ( Calidad->calidad_caras ) {
00162 case CVC_CONSTANTE: gluQuadricNormals(Textura_glu, (GLenum)GLU_FLAT);
00163 break;
00164 case CVC_SHADE:
00165 gluQuadricNormals(Textura_glu, (GLenum)GLU_SMOOTH);
00166 break;
00167 case CVC_FLAT: default:
00168 gluQuadricNormals(Textura_glu, (GLenum)GLU_FLAT);
00169 break;
00170 }
00171
00172 if ( imagen && Calidad->con_textura ) {
00173 imagen->activar_gl();
00174 gluQuadricTexture(Textura_glu, GL_TRUE);
00175 glEnable(GL_TEXTURE_2D);
00176 Calidad->activar_textura_gl();
00177 }
00178 else if ( Calidad->con_caustics ) {
00179 gluQuadricTexture(Textura_glu, GL_TRUE);
00180 Calidad->activar_textura_gl();
00181 }
00182 else {
00183 gluQuadricTexture(Textura_glu, GL_FALSE);
00184 glDisable(GL_TEXTURE_2D);
00185 }
00186
00187 ACTIVAR_POLYGON_OFFSET();
00188 PINTAR_CILINDRO_GL();
00189 DESACTIVAR_POLYGON_OFFSET();
00190 glDisable(GL_TEXTURE_2D);
00191 }
00192
00193 }
00194 #endif
00195
00196 void
00197 CILINDRO::pintar_aqz(FILE *fd)
00198 {
00199 fprintf(fd, " // Pilas: No hay pintar_aqz... \n");
00200 fprintf(fd, " geometria ESFERA 1 \"\"\n");
00201 }
00202
00203 void
00204 CILINDRO::pintar_povray(FILE *fd)
00205 {
00206 fprintf(fd,
00207 "cone {\n"
00208 " <0, 0, %f>, %f\n"
00209 " <0, 0, %f>, %f\n",
00210 -_altura/2, _radio1, _altura/2, _radio2
00211 );
00212 }
00213
00214 GEOMETRIA *
00215 CILINDRO::crear_copia(void)
00216 {
00217 CILINDRO *e;
00218
00219 e = new CILINDRO(_radio1, _radio2, _altura);
00220 if ( !e ) return NULL;
00221
00222 (*e) = (*this);
00223
00224 #ifdef GL_ENABLED
00225 e->Textura_glu = gluNewQuadric();
00226
00227 if ( imagen ) {
00228 e->imagen = imagen->copie();
00229 if ( !e->imagen ) {
00230 fprintf(stderr,
00231 "<CILINDRO> Warning: no se pudo replicar una textura.\n");
00232 fflush(stderr);
00233 }
00234 }
00235 #endif
00236
00237 return (GEOMETRIA *)e;
00238 }
00239
00240
00241
00242
00243