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

paralele.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= paralele.cc                                      Julio - agosto de 1998 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definiciones de la clase PARALELEPIPEDO                                 =
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/paralele.h"
00026 #endif
00027 
00028 #include <stdio.h>
00029 
00030 //===========================================================================
00031 //= Clase PARALELEPIPEDO                                                    =
00032 //===========================================================================
00033 
00034 PARALELEPIPEDO::PARALELEPIPEDO(VECTOR l)
00035 {
00036     _lados = l;
00037     imagen = NULL;
00038 }
00039 
00040 PARALELEPIPEDO::PARALELEPIPEDO(double lx, double ly, double lz)
00041 {
00042     _lados.x = lx;
00043     _lados.y = ly;
00044     _lados.z = lz;
00045 
00046     if ( _lados.x < EPSILON ) _lados.x = EPSILON;
00047     if ( _lados.y < EPSILON ) _lados.y = EPSILON;
00048     if ( _lados.z < EPSILON ) _lados.z = EPSILON;
00049     imagen = NULL;
00050 }
00051 
00052 PARALELEPIPEDO::~PARALELEPIPEDO()
00053 {
00054     if ( imagen ) delete imagen;
00055 }
00056 
00057 VECTOR
00058 PARALELEPIPEDO::lados(void)
00059 {
00060     return _lados;
00061 }
00062 
00063 void
00064 PARALELEPIPEDO::set_lados(VECTOR l)
00065 {
00066     _lados = l;
00067     if ( _lados.x < EPSILON ) _lados.x = EPSILON;
00068     if ( _lados.y < EPSILON ) _lados.y = EPSILON;
00069     if ( _lados.z < EPSILON ) _lados.z = EPSILON;
00070 }
00071 
00072 void
00073 PARALELEPIPEDO::anexar_textura(IMAGEN *img)
00074 {
00075     if ( imagen ) delete imagen;
00076     imagen = img;
00077 }
00078 
00079 int
00080 PARALELEPIPEDO::clasificar_punto(VECTOR p)
00087 {
00088     double lx = _lados.x/2;
00089     double ly = _lados.y/2;
00090     double lz = _lados.z/2;
00091 
00092     if ( p.x > -lx + EPSILON && p.y + EPSILON > -ly && p.z > -lz + EPSILON &&
00093          p.x < lx - EPSILON && p.y < ly - EPSILON && p.z < lz - EPSILON ) {
00094         return 1;
00095       }
00096       else if ( 
00097          p.x < -lx - EPSILON || p.y - EPSILON < -ly || p.z < -lz - EPSILON ||
00098          p.x > lx + EPSILON || p.y > ly + EPSILON || p.z > lz + EPSILON ) {
00099         return -1;
00100       }
00101       else {
00102         return 0;
00103       }
00104     ;
00105 }
00106 void
00107 PARALELEPIPEDO::minmax(VECTOR *min, VECTOR *max)
00108 {
00109     (*min) = _lados*(-0.5);
00110     (*max) = _lados*0.5;
00111 }
00112 
00113 #ifdef GL_ENABLED
00114 
00115 void
00116 PARALELEPIPEDO::pintar_gl(CALIDAD_VISUAL *Calidad, MATERIAL* Material,
00117                           CAMARA * /*Camara*/)
00118 {
00119     int i;
00120     VECTOR min = _lados*(-0.5), max = _lados*0.5;
00121 
00122     //- Pintado de bordes --------------------------------------------------
00123     COLOR cb(1, 0, 0);
00124 
00125     if ( Calidad->con_bordes ) {
00126         Calidad->activar_bordes_gl(cb, Material);
00127         pintar_paralelepipedo(min, max);
00128     }
00129 
00130     if ( Calidad->con_cajas && !Calidad->con_bordes ) PINTAR_MINMAX_GL();
00131 
00132     //- Pintado de caras ---------------------------------------------------
00133     COLOR c(1, 1, 1);
00134 
00135     if ( Calidad->con_caras ) {
00136         Material->activar_gl();
00137         Calidad->activar_caras_gl(c, Material);
00138 
00139         if ( imagen && Calidad->con_textura ) {
00140             imagen->activar_gl();
00141             glEnable(GL_TEXTURE_2D);
00142             Calidad->activar_textura_gl();
00143           }
00144           else if ( Calidad->con_caustics ) {
00145             Calidad->activar_textura_gl();
00146           }
00147           else {
00148             glDisable(GL_TEXTURE_2D);
00149         }
00150 
00151         ACTIVAR_POLYGON_OFFSET();
00152         for ( i = 0; i < 6; i++ ) {
00153           glBegin(GL_POLYGON);
00154             glNormal3dv(NORMALES_cubo[i]);
00155             glTexCoord2dv(TEXTURAS_cubo[i][0]);
00156             glVertex3d(_lados.x * COORDENADAS_cubo[i][0][0],
00157                        _lados.y * COORDENADAS_cubo[i][0][1],
00158                        _lados.z * COORDENADAS_cubo[i][0][2]);
00159             glNormal3dv(NORMALES_cubo[i]);
00160             glTexCoord2dv(TEXTURAS_cubo[i][1]);
00161             glVertex3d(_lados.x * COORDENADAS_cubo[i][1][0],
00162                        _lados.y * COORDENADAS_cubo[i][1][1],
00163                        _lados.z * COORDENADAS_cubo[i][1][2]);
00164             glNormal3dv(NORMALES_cubo[i]);
00165             glTexCoord2dv(TEXTURAS_cubo[i][2]);
00166             glVertex3d(_lados.x * COORDENADAS_cubo[i][2][0],
00167                        _lados.y * COORDENADAS_cubo[i][2][1],
00168                        _lados.z * COORDENADAS_cubo[i][2][2]);
00169             glNormal3dv(NORMALES_cubo[i]);
00170             glTexCoord2dv(TEXTURAS_cubo[i][3]);
00171             glVertex3d(_lados.x * COORDENADAS_cubo[i][3][0],
00172                        _lados.y * COORDENADAS_cubo[i][3][1],
00173                        _lados.z * COORDENADAS_cubo[i][3][2]);
00174           glEnd();
00175         }
00176         DESACTIVAR_POLYGON_OFFSET();
00177     }
00178     glDisable(GL_TEXTURE_2D);
00179 }
00180 #endif
00181 
00182 void
00183 PARALELEPIPEDO::pintar_aqz(FILE *fd)
00184 {
00185     fprintf(fd, "    // Pilas: No hay pintar_aqz... \n");
00186     fprintf(fd, "    geometria ESFERA 1 \"\"\n");
00187 }
00188 
00189 void
00190 PARALELEPIPEDO::pintar_povray(FILE *fd)
00191 {
00192     fprintf(fd,
00193         "box {\n"
00194         "    <%f, %f, %f>, <%f, %f, %f>\n",
00195         -_lados.x/2, -_lados.y/2, -_lados.z/2,
00196         _lados.x/2, _lados.y/2, _lados.z/2
00197     );
00198 }
00199 
00200 void
00201 PARALELEPIPEDO::pintar_vrml(FILE *fd)
00202 {
00203     fprintf(fd,
00204             "        geometry Box { size %f, %f, %f }\n",
00205         _lados.x, _lados.y, _lados.z
00206     );
00207 }
00208 
00209 GEOMETRIA *
00210 PARALELEPIPEDO::crear_copia(void)
00211 {
00212     PARALELEPIPEDO *p;
00213 
00214     p = new PARALELEPIPEDO(_lados);
00215     if ( !p ) return NULL;
00216 
00217     (*p) = (*this);
00218 
00219     if ( imagen ) {
00220         p->imagen = imagen->copie();
00221         if ( !p->imagen ) {
00222             fprintf(stderr,
00223             "<PARALELEPIPEDO> Warning: no se pudo replicar una textura.\n");
00224             fflush(stderr);
00225         }
00226     }
00227 
00228     return (GEOMETRIA *)p;
00229 }
00230 
00231 
00232 //===========================================================================
00233 //= EOF                                                                     =
00234 //===========================================================================
00235 

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.