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/octree.h"
00026 #endif
00027
00028 #include <stdio.h>
00029
00030
00031
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 * )
00109 {
00110 VECTOR cero(0, 0, 0);
00111
00112 if ( Calidad->con_cajas && !Calidad->con_bordes ) PINTAR_MINMAX_GL();
00113
00114
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
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
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 * , VECTOR & ,
00206 VECTOR & )
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
00231
00232 Raiz = (NODO_OCTREE *)malloc(sizeof(NODO_OCTREE));
00233 Raiz->init();
00234 Raiz->calcular(Fuente, nivel, cero, _lado);
00235 }
00236
00237
00238
00239
00240