1 #ifdef _WIN32
2 #include "windows.h"
3 #endif
4
5 #include "stdio.h"
6
7 #include "GL/gl.h"
8 #include "vector.h"
9 #include "cmc.h"
10 #include "3dobject.h"
11 #include "shadow3dobject.h"
12
13 #include "myglutaux.h"
14
Shadow3DObject()15 Shadow3DObject::Shadow3DObject() : C3DObject()
16 {
17 shdw_npuntos=0;
18 shdw_ncaras=0;
19 shdw_puntos=0;
20 shdw_caras=0;
21 } /* Shadow3DObject::Shadow3DObject */
22
23
Shadow3DObject(char * file,char * texturedir)24 Shadow3DObject::Shadow3DObject(char *file,char *texturedir) : C3DObject(file,texturedir)
25 {
26 shdw_npuntos=0;
27 shdw_ncaras=0;
28 shdw_puntos=0;
29 shdw_caras=0;
30 } /* Shadow3DObject::Shadow3DObject */
31
32
~Shadow3DObject()33 Shadow3DObject::~Shadow3DObject()
34 {
35 delete shdw_puntos;
36 delete shdw_caras;
37 shdw_puntos=0;
38 shdw_caras=0;
39 } /* Shadow3DObject::~Shadow3DObject */
40
41
DrawShadow(float r,float g,float b,float a)42 void Shadow3DObject::DrawShadow(float r,float g,float b,float a)
43 {
44 int i;
45
46 /* Dibuja el objeto: */
47 glEnableClientState(GL_VERTEX_ARRAY);
48 glVertexPointer(3,GL_FLOAT,0,shdw_puntos);
49 glColor4f(r,g,b,a);
50 glNormal3f(0,1,0);
51
52 if (a!=1) {
53 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
54 glEnable(GL_BLEND);
55 } /* if */
56 glBegin(GL_TRIANGLES);
57 for(i=0;i<shdw_ncaras;i++) {
58 glArrayElement(shdw_caras[i*3]);
59 glArrayElement(shdw_caras[i*3+1]);
60 glArrayElement(shdw_caras[i*3+2]);
61 } /* for */
62 glEnd();
63
64 if (a!=1) glDisable(GL_BLEND);
65 } /* Shadow3DObject::DraqwShadow */
66
67
ComputeShadow(Vector light)68 void Shadow3DObject::ComputeShadow(Vector light)
69 {
70 int i;
71 int pry_npuntos;
72 float *pry_puntos;
73 int *pry_caras,pry_ncaras;
74 float plane[4];
75 float l[3];
76 float n[3],v[3],w[3],value;
77 float p[3];
78 float tmp[3];
79
80 plane[0]=0;
81 plane[1]=0;
82 plane[2]=1;
83 plane[3]=0;
84
85 l[0]=float(light.x);
86 l[1]=float(light.y);
87 l[2]=float(light.z);
88
89 pry_npuntos=npuntos;
90 pry_puntos=new float[npuntos*3];
91 /* Proyectar TODOS los tri�ngulos sobre el plano Z: */
92 for(i=0;i<npuntos;i++) {
93 p[0]=puntos[i*3];
94 p[1]=puntos[i*3+1];
95 p[2]=puntos[i*3+2];
96
97 PlaneLineCollision(plane,p,l,tmp);
98
99 pry_puntos[i*3]=tmp[0];
100 pry_puntos[i*3+1]=tmp[1];
101 pry_puntos[i*3+2]=0;
102 } /* for */
103
104 /* Crear los tri�ngulos proyectadas: */
105 shdw_ncaras=0;
106 pry_ncaras=ncaras;
107 pry_caras=new int[ncaras*3];
108 for(i=0;i<ncaras;i++) {
109 /* Comprobar que el tri�ngulo es visible: */
110
111 v[0]=puntos[caras[i*3+1]*3]-puntos[caras[i*3]*3];;
112 v[1]=puntos[caras[i*3+1]*3+1]-puntos[caras[i*3]*3+1];
113 v[2]=puntos[caras[i*3+1]*3+2]-puntos[caras[i*3]*3+2];
114 w[0]=puntos[caras[i*3+2]*3]-puntos[caras[i*3+1]*3];
115 w[1]=puntos[caras[i*3+2]*3+1]-puntos[caras[i*3+1]*3+1];
116 w[2]=puntos[caras[i*3+2]*3+2]-puntos[caras[i*3+1]*3+2];
117 Normalf(v,w,n);
118
119 value=n[0]*l[0]+n[1]*l[1]+n[2]*l[2];
120 if (value>0) {
121 pry_caras[shdw_ncaras*3]=caras[i*3];
122 pry_caras[shdw_ncaras*3+1]=caras[i*3+1];
123 pry_caras[shdw_ncaras*3+2]=caras[i*3+2];
124 shdw_ncaras++;
125 } /* if */
126 } /* for */
127
128
129 /* Unir los tri�ngulos proyectados: */
130 /* ... */
131
132 /* Copiarlos a las variables del objeto: */
133 shdw_caras=new int[shdw_ncaras*3];
134 for(i=0;i<shdw_ncaras*3;i++) shdw_caras[i]=pry_caras[i];
135 delete pry_caras;
136 pry_caras=0;
137 shdw_npuntos=pry_npuntos;
138 shdw_puntos=pry_puntos;
139 shdw_cmc.set(shdw_puntos,shdw_npuntos);
140 } /* Shadow3DObject::ComputeShadow */
141