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