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/cubo.h"
00026 #endif
00027
00028 #include <stdio.h>
00029
00030
00031
00032
00033
00034 CUBO::CUBO(double l)
00035 {
00036 _lado = l;
00037 imagen = NULL;
00038 }
00039
00040 CUBO::~CUBO()
00041 {
00042 if ( imagen ) delete imagen;
00043 }
00044
00045 double
00046 CUBO::lado(void)
00047 {
00048 return _lado;
00049 }
00050
00051 void
00052 CUBO::set_lado(double l)
00053 {
00054 _lado = l;
00055 }
00056
00057 void
00058 CUBO::anexar_textura(IMAGEN *img)
00059 {
00060 if ( imagen ) delete imagen;
00061 imagen = img;
00062 }
00063
00064 int
00065 CUBO::clasificar_punto(VECTOR p)
00072 {
00073 double l = _lado/2;
00074
00075 if ( p.x > -l + EPSILON && p.y + EPSILON > -l && p.z > -l + EPSILON &&
00076 p.x < l - EPSILON && p.y < l - EPSILON && p.z < l - EPSILON ) {
00077 return 1;
00078 }
00079 else if (
00080 p.x < -l - EPSILON || p.y - EPSILON < -l || p.z < -l - EPSILON ||
00081 p.x > l + EPSILON || p.y > l + EPSILON || p.z > l + EPSILON ) {
00082 return -1;
00083 }
00084 else {
00085 return 0;
00086 }
00087 ;
00088 }
00089
00090
00091 void
00092 CUBO::minmax(VECTOR *min, VECTOR *max)
00093 {
00094 min->x = -_lado/2;
00095 min->y = -_lado/2;
00096 min->z = -_lado/2;
00097 max->x = _lado/2;
00098 max->y = _lado/2;
00099 max->z = _lado/2;
00100 }
00101
00102 #ifdef GL_ENABLED
00103
00104 void
00105 CUBO::pintar_gl(CALIDAD_VISUAL *Calidad, MATERIAL* Material,
00106 CAMARA * )
00107 {
00108 if ( Calidad->con_cajas && !Calidad->con_bordes ) PINTAR_MINMAX_GL();
00109
00110
00111 COLOR cb(1, 0, 0);
00112
00113 if ( Calidad->con_bordes ) {
00114 Calidad->activar_bordes_gl(cb, Material);
00115 pintar_cubo(_lado);
00116 }
00117
00118
00119 COLOR c(1, 1, 1);
00120
00121 if ( Calidad->con_caras ) {
00122 Material->activar_gl();
00123 Calidad->activar_caras_gl(c, Material);
00124
00125 if ( imagen && Calidad->con_textura ) {
00126 imagen->activar_gl();
00127 glEnable(GL_TEXTURE_2D);
00128 Calidad->activar_textura_gl();
00129 }
00130 else if ( Calidad->con_caustics ) {
00131 Calidad->activar_textura_gl();
00132 }
00133 else {
00134 glDisable(GL_TEXTURE_2D);
00135 }
00136
00137 ACTIVAR_POLYGON_OFFSET();
00138 pintar_cubo_solido(_lado);
00139 DESACTIVAR_POLYGON_OFFSET();
00140 }
00141 glDisable(GL_TEXTURE_2D);
00142 }
00143 #endif
00144
00145 void
00146 CUBO::pintar_aqz(FILE *fd)
00147 {
00148 fprintf(fd, " // Pilas: No hay pintar_aqz... \n");
00149 fprintf(fd, " geometria ESFERA 1 \"\"\n");
00150 }
00151
00152 void
00153 CUBO::pintar_povray(FILE *fd)
00154 {
00155 double l2 = _lado/2;
00156
00157 fprintf(fd,
00158 "box {\n"
00159 " <%f, %f, %f>, <%f, %f, %f>\n",
00160 -l2, -l2, -l2, l2, l2, l2
00161 );
00162 }
00163
00164 GEOMETRIA *
00165 CUBO::crear_copia(void)
00166 {
00167 CUBO *c;
00168
00169 c = new CUBO(_lado);
00170 if ( !c ) return NULL;
00171
00172 (*c) = (*this);
00173
00174 if ( imagen ) {
00175 c->imagen = imagen->copie();
00176 if ( !c->imagen ) {
00177 fprintf(stderr,
00178 "<CUBO> Warning: no se pudo replicar una textura.\n");
00179 fflush(stderr);
00180 }
00181 }
00182
00183 return (GEOMETRIA *)c;
00184 }
00185
00186
00187
00188
00189