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

octree.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= octree.cc                                             Diciembre de 1999 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definiciones de la clase OCTREE                                         =
00005 //=-------------------------------------------------------------------------=
00006 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO   =
00007 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN   =
00008 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES,     = 
00009 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO,        =
00010 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO,  =
00011 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA   =
00012 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES       =
00013 //= ("ACTIVIDADES DE ALGO RIESGO").                                         =
00014 //=-------------------------------------------------------------------------=
00015 //= Autor original: Oscar J. Chavarro G.  A.K.A. JEDILINK. Copyright (c),   =
00016 //= 1997 - 2003, oscarchavarro@hotmail.com                                  =
00017 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia   =
00018 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la  =
00019 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. =
00020 //===========================================================================
00021 
00022 #include "toolkits/geom/geometria.h"
00023 
00024 #ifdef VEL_ROSITA
00025     #include "toolkits/geom/octree.h"
00026 #endif
00027 
00028 #include <stdio.h>
00029 
00030 //===========================================================================
00031 //= Clase OCTREE                                                              =
00032 //===========================================================================
00033 
00034 OCTREE::OCTREE(double l)
00035 {
00036     _lado = l;
00037     imagen = NULL;
00038     Raiz = NULL;
00039 }
00040 
00041 OCTREE::~OCTREE()
00042 {
00043     if ( imagen ) delete imagen;
00044     if ( Raiz ) Raiz->elim();
00045 }
00046 
00047 double
00048 OCTREE::lado(void)
00049 {
00050     return _lado;
00051 }
00052 
00053 void
00054 OCTREE::set_lado(double l)
00055 {
00056     _lado = l;
00057 }
00058 
00059 void
00060 OCTREE::anexar_textura(IMAGEN *img)
00061 {
00062     if ( imagen ) delete imagen;
00063     imagen = img;
00064 }
00065 
00066 int
00067 OCTREE::clasificar_punto(VECTOR p)
00074 {
00075     double l = _lado/2;
00076 
00077     if ( p.x > -l + EPSILON && p.y + EPSILON > -l && p.z > -l + EPSILON &&
00078          p.x < l - EPSILON && p.y < l - EPSILON && p.z < l - EPSILON ) {
00079         return 1;
00080       }
00081       else if ( 
00082          p.x < -l - EPSILON || p.y - EPSILON < -l || p.z < -l - EPSILON ||
00083          p.x > l + EPSILON || p.y > l + EPSILON || p.z > l + EPSILON ) {
00084         return -1;
00085       }
00086       else {
00087         return 0;
00088       }
00089     ;
00090 }
00091 
00092 
00093 void
00094 OCTREE::minmax(VECTOR *min, VECTOR *max)
00095 {
00096     min->x = -_lado/2;
00097     min->y = -_lado/2;
00098     min->z = -_lado/2;
00099     max->x = _lado/2;
00100     max->y = _lado/2;
00101     max->z = _lado/2;
00102 }
00103 
00104 #ifdef GL_ENABLED
00105 
00106 void
00107 OCTREE::pintar_gl(CALIDAD_VISUAL *Calidad, MATERIAL* Material,
00108                   CAMARA * /*Camara*/)
00109 {
00110     VECTOR cero(0, 0, 0);
00111 
00112     if ( Calidad->con_cajas && !Calidad->con_bordes ) PINTAR_MINMAX_GL();
00113 
00114     //- Pintado de bordes --------------------------------------------------
00115     COLOR cb(1, 0, 0);
00116 
00117     if ( Calidad->con_bordes ) {
00118         Calidad->activar_bordes_gl(cb, Material);
00119         glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
00120         if ( Raiz ) Raiz->pintar_gl(cero, _lado);
00121     }
00122 
00123     //- Pintado de caras ---------------------------------------------------
00124     COLOR c(1, 1, 1);
00125 
00126     if ( Calidad->con_caras ) {
00127         Material->activar_gl();
00128         Calidad->activar_caras_gl(c, Material);
00129         glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
00130 
00131         if ( imagen && Calidad->con_textura ) {
00132             imagen->activar_gl();
00133             glEnable(GL_TEXTURE_2D);
00134             Calidad->activar_textura_gl();
00135           }
00136           else if ( Calidad->con_caustics ) {
00137             Calidad->activar_textura_gl();
00138           }
00139           else {
00140             glDisable(GL_TEXTURE_2D);
00141         }
00142 
00143         ACTIVAR_POLYGON_OFFSET();
00144         if ( Raiz ) Raiz->pintar_gl(cero, _lado);
00145         DESACTIVAR_POLYGON_OFFSET();
00146     }
00147     glDisable(GL_TEXTURE_2D);
00148 }
00149 #endif
00150 
00151 int OFFSET_octree;
00152 BYTE BYTE_octree;
00153 
00154 void
00155 OCTREE::leer(FILE *fd)
00156 {
00157     OFFSET_octree = 0;
00158     elim();
00159     Raiz = (NODO_OCTREE *)malloc(sizeof(NODO_OCTREE));
00160     Raiz->init();
00161     Raiz->leer(fd);
00162 }
00163 
00164 void
00165 OCTREE::escribir(FILE *fd)
00166 {
00167     OFFSET_octree = 0;
00168     if ( Raiz ) {
00169         Raiz->escribir(fd);
00170     }
00171 
00172     // Esto nos asegura que todos los datos se escribieron...
00173     escribir_elemento_octree(fd, 3);
00174     escribir_elemento_octree(fd, 3);
00175     escribir_elemento_octree(fd, 3);
00176     escribir_elemento_octree(fd, 3);
00177 }
00178 
00179 void
00180 OCTREE::pintar_aqz(FILE *fd)
00181 {
00182     fprintf(fd, "    // Pilas: No hay pintar_aqz... \n");
00183     fprintf(fd, "    geometria ESFERA 1 \"\"\n");
00184 }
00185 
00186 void
00187 OCTREE::pintar_povray(FILE *fd)
00188 {
00189     double l2 = _lado/2;
00190 
00191     fprintf(fd,
00192         "box {\n"
00193         "    <%f, %f, %f>, <%f, %f, %f>\n",
00194         -l2, -l2, -l2, l2, l2, l2
00195     );
00196 }
00197 
00198 GEOMETRIA *
00199 OCTREE::crear_copia(void)
00200 {
00201     return NULL;;
00202 }
00203 
00204 double
00205 OCTREE::interseccion(RAYO * /*Rayo*/, VECTOR & /*punto*/,
00206                      VECTOR & /*normal*/)
00210 {
00211     return 0;
00212 }
00213 
00214 void
00215 OCTREE::elim(void)
00216 {
00217     if ( Raiz ) {
00218         Raiz->elim();
00219         free((void *)Raiz);
00220         Raiz = NULL;
00221     }
00222 }
00223 
00224 void
00225 OCTREE::calcular(GEOMETRIA *Fuente, int nivel)
00226 {
00227     VECTOR cero(0, 0, 0);
00228 
00229     elim();
00230     // OJO: Es importante no usar new, y LLAMAR EXPLICITAMENTE a `init`
00231     //      (la constructora)... 
00232     Raiz = (NODO_OCTREE *)malloc(sizeof(NODO_OCTREE));
00233     Raiz->init();
00234     Raiz->calcular(Fuente, nivel, cero, _lado);
00235 }
00236 
00237 //===========================================================================
00238 //= EOF                                                                     =
00239 //===========================================================================
00240 

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.