Página principal | Jerarquía de la clase | Lista alfabética | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros | Páginas relacionadas

planta_f.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= planta_f.h                                            Noviembre de 1999 =
00003 //=-------------------------------------------------------------------------=
00004 //= Especificacion de un modelo geometrico fractal 3D para especificar      =
00005 //= estructuras vegetales.                                                  =
00006 //=-------------------------------------------------------------------------=
00007 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO   =
00008 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN   =
00009 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES,     = 
00010 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO,        =
00011 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO,  =
00012 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA   =
00013 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES       =
00014 //= ("ACTIVIDADES DE ALGO RIESGO").                                         =
00015 //=-------------------------------------------------------------------------=
00016 //= Este codigo esta basado en el ejemplo "fractals" de Philip Winston      =
00017 //= pwinston@hmc.edu, http://www.cs.hmc.edu/people/pwinston. Modificado por =
00018 //= Autor original: Oscar J. Chavarro G.  A.K.A. JEDILINK. Copyright (c),   =
00019 //= 1997 - 2003, oscarchavarro@hotmail.com                                  =
00020 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia   =
00021 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la  =
00022 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. =
00023 //===========================================================================
00024 
00025 #include "toolkits/geom/geometria.h"
00026 
00027 #include <stdio.h>
00028 #include <stdlib.h>
00029 //#include <limits.h>
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 //= Constantes y macros                                                     =
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 //= CLASE PLANTA_FRACTAL                                                    =
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 /* recursive tree drawing thing, fleshed out from class notes pseudocode */
00088 {
00089     long savedseed;  /* need to save seeds while building tree too */
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         //- Siempre hay un tallo o rama padre...
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         //- Y recursivamente, tiene 3 ramas hijas...
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 * /*Material*/, CAMARA * /*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     //- Pintado de bordes --------------------------------------------------
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     //- Pintado de caras ---------------------------------------------------
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 /* Create display lists for a leaf, a set of HOJAS, and a TALLO */
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);  /* not normalized */
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++ ) { // Esto coloca parejitas de hojas
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         /*exit(1);*/
00282     return NULL;
00283 }
00284 
00285 void
00286 PLANTA_FRACTAL::anexar_textura(IMAGEN * /*img*/)
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 /*p*/)
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 * /*fd*/)
00313 {
00314     fprintf(stderr, "<PLANTA_FRACTAL> OJO: pintar_povray no implementada!\n");
00315     fflush(stderr);
00316     exit(1);
00317 }
00318 
00319 
00320 //===========================================================================
00321 //= EOF                                                                     =
00322 //===========================================================================
00323 

Este archivo HTML ha sido generado automáticamente a partir del código fuente AQUYNZA. NO LO EDITE. Para mayor información contacte al autor.