00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "toolkits/geom/geometria.h"
00026
00027 #include <stdio.h>
00028 #include <stdlib.h>
00029
00030 #include <time.h>
00031
00032 #ifdef VEL_ROSITA
00033 #include "toolkits/geom/planta_f.h"
00034 #endif
00035
00036 #define RANGO_LONG 0x7FFFFFFFL
00037
00038
00039
00040
00041
00042 #define VERIFICAR_LISTA_GL(id_lista, cad) \
00043 if ( !(id_lista) ) { \
00044 fprintf(stderr, \
00045 "<PLANTA_FRACTAL> ERROR creando la lista GL \"%s\".\n", \
00046 (cad)); \
00047 fflush(stderr); \
00048 }
00049
00050
00051
00052
00053
00054 PLANTA_FRACTAL::PLANTA_FRACTAL(int n, double e)
00055 {
00056
00057 semilla_azar = time(NULL);
00058 niveles_de_recursion = n;
00059 hojas_por_rama = 2;
00060
00061
00062 id_lista_planta = 0;
00063 id_lista_tallo = 0;
00064 id_lista_tallo_y_hojas = 0;
00065 id_lista_tallo_terminal = 0;
00066 id_lista_hoja = 0;
00067 preprocesada_gl = FALSE;
00068 escala = e;
00069
00070
00071 COLOR t(0.4f, 0.25f, 0.1f);
00072 COLOR h(0, 0.8f, 0);
00073
00074 material_tallos.set_difusa(t);
00075 material_hojas.set_difusa(h);
00076 material_hojas.set_doble_cara(TRUE);
00077 }
00078
00079 PLANTA_FRACTAL::~PLANTA_FRACTAL()
00080 {
00081 ;
00082 }
00083
00084 #ifdef GL_ENABLED
00085 void
00086 PLANTA_FRACTAL::pintar_fractal_gl(int nivel)
00087
00088 {
00089 long savedseed;
00090
00091 if ( nivel == niveles_de_recursion ) {
00092 glPushMatrix();
00093 glRotated(RANDOM()*180, 0, 1, 0);
00094 glCallList(id_lista_tallo_y_hojas);
00095 glPopMatrix();
00096 }
00097 else {
00098
00099 glCallList(id_lista_tallo);
00100 glPushMatrix();
00101 glRotated(RANDOM()*180, 0, 1, 0);
00102 glTranslated(0, 1, 0);
00103 glScaled(0.7, 0.7, 0.7);
00104
00105
00106 savedseed = (long)(RANDOM()*RANGO_LONG);
00107 glPushMatrix();
00108 glRotated(110 + RANDOM()*40, 0, 1, 0);
00109 glRotated(30 + RANDOM()*20, 0, 0, 1);
00110 pintar_fractal_gl(nivel + 1);
00111 glPopMatrix();
00112
00113 SRANDOM(savedseed);
00114 savedseed = (long)(RANDOM()*RANGO_LONG);
00115 glPushMatrix();
00116 glRotated(-130 + RANDOM()*40, 0, 1, 0);
00117 glRotated(30 + RANDOM()*20, 0, 0, 1);
00118 pintar_fractal_gl(nivel + 1);
00119 glPopMatrix();
00120
00121 SRANDOM(savedseed);
00122 glPushMatrix();
00123 glRotated(-20 + RANDOM()*40, 0, 1, 0);
00124 glRotated(30 + RANDOM()*20, 0, 0, 1);
00125 pintar_fractal_gl(nivel + 1);
00126 glPopMatrix();
00127
00128 glPopMatrix();
00129 }
00130 }
00131
00132 void
00133 PLANTA_FRACTAL::pintar_gl(CALIDAD_VISUAL *Calidad, MATERIAL * , CAMARA * )
00137 {
00138
00139 if ( !preprocesada_gl ) {
00140 compilar_listas_gl();
00141 preprocesada_gl = TRUE;
00142 }
00143
00144
00145 glEnable(GL_LIGHTING);
00146 glDepthFunc(GL_LEQUAL);
00147 glEnable(GL_NORMALIZE);
00148 glShadeModel(GL_SMOOTH);
00149
00150
00151
00152 COLOR cb(1, 0, 0);
00153
00154 if ( Calidad->con_bordes ) {
00155 if (Calidad->con_caras) {
00156 Calidad->activar_bordes_gl(cb, &material_tallos);
00157 }
00158 glPushMatrix();
00159 glScaled(escala, escala, escala);
00160 glRotated(90, 1, 0, 0);
00161 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
00162 SRANDOM(semilla_azar);
00163 pintar_fractal_gl(0);
00164 glPopMatrix();
00165 }
00166
00167 if ( Calidad->con_cajas ) PINTAR_MINMAX_GL();
00168
00169
00170 COLOR c(1, 1, 1);
00171 if ( Calidad->con_caras ) {
00172 Calidad->activar_caras_gl(c, &material_tallos);
00173 material_tallos.activar_gl();
00174 glPushMatrix();
00175 glScaled(escala, escala, escala);
00176 glRotated(90, 1, 0, 0);
00177 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
00178 if ( Calidad->con_caustics ) {
00179 Calidad->activar_textura_gl();
00180 }
00181 SRANDOM(semilla_azar);
00182 pintar_fractal_gl(0);
00183 glPopMatrix();
00184 }
00185
00186
00187
00188 }
00189
00190 void
00191 PLANTA_FRACTAL::compilar_listas_gl(void)
00192
00193 {
00194 GLUquadricObj *cylquad = gluNewQuadric();
00195 int i;
00196
00197
00198 id_lista_tallo = glGenLists(1);
00199 VERIFICAR_LISTA_GL(id_lista_tallo, "tallo");
00200
00201 glNewList(id_lista_tallo, GL_COMPILE);
00202 glPushMatrix();
00203 glRotatef(-90, 1, 0, 0);
00204 gluCylinder(cylquad, 0.1, 0.06, 1, 5, 1);
00205 glPopMatrix();
00206 glEndList();
00207
00208
00209 id_lista_tallo_terminal = glGenLists(1);
00210 VERIFICAR_LISTA_GL(id_lista_tallo_terminal, "tallo_terminal");
00211 glNewList(id_lista_tallo_terminal, GL_COMPILE);
00212 glPushMatrix();
00213 glRotatef(-90, 1, 0, 0);
00214 gluCylinder(cylquad, 0.1, 0.01, 1, 5, 1);
00215 glPopMatrix();
00216 glEndList();
00217
00218
00219 id_lista_hoja = glGenLists(1);
00220 VERIFICAR_LISTA_GL(id_lista_hoja, "hoja");
00221 glNewList(id_lista_hoja, GL_COMPILE);
00222 glBegin(GL_TRIANGLES);
00223 glNormal3d(-0.1, 0, 0.25);
00224 glVertex3d(0, 0, 0);
00225 glVertex3d(0.25, 0.25, 0.1);
00226 glVertex3d(0, 0.5, 0);
00227
00228 glNormal3d(0.1, 0, 0.25);
00229 glVertex3d(0, 0, 0);
00230 glVertex3d(0, 0.5, 0);
00231 glVertex3d(-0.25, 0.25, 0.1);
00232 glEnd();
00233 glEndList();
00234
00235
00236 id_lista_tallo_y_hojas = glGenLists(1);
00237 VERIFICAR_LISTA_GL(id_lista_tallo_y_hojas, "tallo_y_hojas");
00238
00239 glNewList(id_lista_tallo_y_hojas, GL_COMPILE);
00240 glPushMatrix();
00241 glPushAttrib(GL_LIGHTING_BIT);
00242 glCallList(id_lista_tallo_terminal);
00243 material_hojas.activar_gl();
00244 for( i = 0; i < hojas_por_rama; i++ ) {
00245 glTranslated(0, 0.333, 0);
00246 glRotated(90, 0, 1, 0);
00247 glPushMatrix();
00248 glRotated(0, 0, 1, 0);
00249 glRotated(50, 1, 0, 0);
00250 glCallList(id_lista_hoja);
00251 glPopMatrix();
00252 glPushMatrix();
00253 glRotated(180, 0, 1, 0);
00254 glRotated(60, 1, 0, 0);
00255 glCallList(id_lista_hoja);
00256 glPopMatrix();
00257 }
00258 glPopAttrib();
00259 glPopMatrix();
00260 glEndList();
00261
00262 }
00263 #endif // GL_ENABLED
00264
00265 void
00266 PLANTA_FRACTAL::config(int semilla, int recursion, int hojas)
00267 {
00268 semilla_azar = semilla;
00269 niveles_de_recursion = recursion;
00270 hojas_por_rama = hojas;
00271 #ifdef GL_ENABLED
00272 compilar_listas_gl();
00273 #endif
00274 }
00275
00276 GEOMETRIA *
00277 PLANTA_FRACTAL::crear_copia(void)
00278 {
00279 fprintf(stderr, "<PLANTA_FRACTAL> OJO: crear_copia no implementada!\n");
00280 fflush(stderr);
00281
00282 return NULL;
00283 }
00284
00285 void
00286 PLANTA_FRACTAL::anexar_textura(IMAGEN * )
00290 {
00291 fprintf(stderr, "<PLANTA_FRACTAL> OJO: anexar_textura no implementada!\n");
00292 fflush(stderr);
00293 }
00294
00295 int
00296 PLANTA_FRACTAL::clasificar_punto(VECTOR )
00297 {
00298 return 0;
00299 }
00300
00301 void
00302 PLANTA_FRACTAL::pintar_aqz(FILE *fd)
00303 {
00304 fprintf(fd, " // Pilas: No hay pintar_aqz... \n");
00305 fprintf(fd, " geometria ESFERA 1 \"\"\n");
00306 }
00307
00308 void
00309 PLANTA_FRACTAL::pintar_povray(FILE * )
00313 {
00314 fprintf(stderr, "<PLANTA_FRACTAL> OJO: pintar_povray no implementada!\n");
00315 fflush(stderr);
00316 exit(1);
00317 }
00318
00319
00320
00321
00322
00323