1 | #include ".\impostor.h"
|
---|
2 |
|
---|
3 | #include <GL/glut.h>
|
---|
4 | #include <GL/glext.h>
|
---|
5 | #include <glh/glh_extensions.h>
|
---|
6 |
|
---|
7 | Impostor::Impostor(void)
|
---|
8 | {
|
---|
9 | m_OwnCamera.setAspectRatio(1);
|
---|
10 | m_OwnCamera.SetUpVector(0,1,0);
|
---|
11 | NeedRefresh=true;
|
---|
12 |
|
---|
13 | m_ErrorTolerance=0.1;
|
---|
14 |
|
---|
15 | UVs[0]=0;
|
---|
16 | UVs[1]=1;
|
---|
17 |
|
---|
18 | UVs[2]=1;
|
---|
19 | UVs[3]=1;
|
---|
20 |
|
---|
21 | UVs[4]=1;
|
---|
22 | UVs[5]=0;
|
---|
23 |
|
---|
24 | UVs[6]=0;
|
---|
25 | UVs[7]=0;
|
---|
26 | }
|
---|
27 |
|
---|
28 | Impostor::~Impostor(void)
|
---|
29 | {
|
---|
30 | }
|
---|
31 | void Impostor::DisplayScreenQuad(int u,int v)
|
---|
32 | {
|
---|
33 | glDisable(GL_LIGHTING);
|
---|
34 | glShadeModel(GL_FLAT);
|
---|
35 |
|
---|
36 | //glViewport(0,0,u, v);
|
---|
37 | glMatrixMode(GL_MODELVIEW);
|
---|
38 | glPushMatrix();
|
---|
39 | glLoadIdentity();
|
---|
40 | glMatrixMode(GL_PROJECTION);
|
---|
41 | glPushMatrix();
|
---|
42 | glLoadIdentity();
|
---|
43 |
|
---|
44 | glBegin(GL_QUADS);
|
---|
45 |
|
---|
46 | glTexCoord2f(0,v);
|
---|
47 | glVertex3f(-1,1,0);
|
---|
48 |
|
---|
49 | glTexCoord2f(u,v);
|
---|
50 | glVertex3f(1,1,0);
|
---|
51 |
|
---|
52 | glTexCoord2f(u,0);
|
---|
53 | glVertex3f(1,-1,0);
|
---|
54 |
|
---|
55 | glTexCoord2f(0,0);
|
---|
56 | glVertex3f(-1,-1,0);
|
---|
57 |
|
---|
58 | glEnd();
|
---|
59 |
|
---|
60 | glPopMatrix();
|
---|
61 | glMatrixMode(GL_MODELVIEW);
|
---|
62 | glPopMatrix();
|
---|
63 |
|
---|
64 | }
|
---|
65 |
|
---|
66 | void Impostor::Display()
|
---|
67 | {
|
---|
68 | glDisable(GL_LIGHTING);
|
---|
69 | glShadeModel(GL_FLAT);
|
---|
70 |
|
---|
71 | /*
|
---|
72 | glEnableClientState(GL_VERTEX_ARRAY);
|
---|
73 | glVertexPointer (3, GL_DOUBLE, 0, Vertices);
|
---|
74 | glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
---|
75 | glTexCoordPointer(2,GL_DOUBLE,0,UVs);
|
---|
76 | glDrawArrays(GL_QUADS, 0, 4);*/
|
---|
77 |
|
---|
78 | glDisableClientState( GL_VERTEX_ARRAY );
|
---|
79 | glDisableClientState( GL_TEXTURE_COORD_ARRAY );
|
---|
80 |
|
---|
81 |
|
---|
82 | glBegin(GL_QUADS);
|
---|
83 |
|
---|
84 | glTexCoord2dv(&UVs[0]);
|
---|
85 | glVertex3dv(&Vertices[0]);
|
---|
86 |
|
---|
87 | glTexCoord2dv(&UVs[2]);
|
---|
88 | glVertex3dv(&Vertices[3]);
|
---|
89 |
|
---|
90 | glTexCoord2dv(&UVs[4]);
|
---|
91 | glVertex3dv(&Vertices[6]);
|
---|
92 |
|
---|
93 | glTexCoord2dv(&UVs[6]);
|
---|
94 | glVertex3dv(&Vertices[9]);
|
---|
95 |
|
---|
96 | glEnd();
|
---|
97 | }
|
---|
98 |
|
---|
99 | void Impostor::updateCamera(bool forceRefresh)
|
---|
100 | {
|
---|
101 | bool needRefresh=false;
|
---|
102 |
|
---|
103 | Vector prevViewdir=m_ObjectPosition-m_OwnCamera.getPosition();
|
---|
104 |
|
---|
105 | if(prevViewdir.x==0&&prevViewdir.y==0&&prevViewdir.z==0)
|
---|
106 | {
|
---|
107 | needRefresh=true;
|
---|
108 | }
|
---|
109 |
|
---|
110 | if(!forceRefresh&&!needRefresh)
|
---|
111 | {
|
---|
112 | //compute error
|
---|
113 | double error;
|
---|
114 |
|
---|
115 | prevViewdir.Normalize();
|
---|
116 | prevViewdir*=m_ObjectBSphereRadius;
|
---|
117 |
|
---|
118 | Vector point1=m_ObjectPosition+prevViewdir;
|
---|
119 | Vector point2=m_ObjectPosition-prevViewdir;
|
---|
120 |
|
---|
121 | Vector v1=point1-m_ViewCamera->getPosition();
|
---|
122 | Vector v2=point2-m_ViewCamera->getPosition();
|
---|
123 |
|
---|
124 | error=acos((v1*v2)/(v1.Length()*v2.Length()));
|
---|
125 | error*=180/M_PI;
|
---|
126 |
|
---|
127 | //if error > error tolerance then refresh is needed
|
---|
128 | if(error>m_ErrorTolerance)
|
---|
129 | {
|
---|
130 | needRefresh=true;
|
---|
131 | }
|
---|
132 | }
|
---|
133 |
|
---|
134 | //refresh camera
|
---|
135 | if(forceRefresh||needRefresh)
|
---|
136 | {
|
---|
137 | //to tell the object to refresh the impostor image
|
---|
138 | NeedRefresh=true;
|
---|
139 |
|
---|
140 | //refresh own camera:position, viewangle, clipplanes
|
---|
141 |
|
---|
142 | m_OwnCamera.SetPosition(m_ViewCamera->getPosition());
|
---|
143 |
|
---|
144 | Vector toObject=m_ObjectPosition-m_OwnCamera.getPosition();
|
---|
145 | double distance=toObject.Length();
|
---|
146 | double nearplane=distance-m_ObjectBSphereRadius;
|
---|
147 | double farplane=distance+m_ObjectBSphereRadius;
|
---|
148 |
|
---|
149 | double angle=atan(m_ObjectBSphereRadius/distance);
|
---|
150 |
|
---|
151 | m_OwnCamera.setFovY(2*angle/M_PI*180);
|
---|
152 | m_OwnCamera.setFovX(m_OwnCamera.getFovY());
|
---|
153 | m_OwnCamera.setNearClipDistance(nearplane);
|
---|
154 | m_OwnCamera.setFarClipDistance(farplane);
|
---|
155 | m_OwnCamera.setCorners(-m_ObjectBSphereRadius,m_ObjectBSphereRadius,m_ObjectBSphereRadius,-m_ObjectBSphereRadius);
|
---|
156 |
|
---|
157 | //if object has moved
|
---|
158 | m_OwnCamera.setLookAt(m_ObjectPosition);
|
---|
159 |
|
---|
160 |
|
---|
161 | }
|
---|
162 | else NeedRefresh=false;
|
---|
163 |
|
---|
164 | m_UpLeft=m_ViewCamera->getUpVector()-m_ViewCamera->getRightVector();
|
---|
165 | m_UpRight=m_ViewCamera->getUpVector()+m_ViewCamera->getRightVector();
|
---|
166 | m_DownLeft=m_ViewCamera->getUpVector()*-1-m_ViewCamera->getRightVector();
|
---|
167 | m_DownRight=m_ViewCamera->getUpVector()*-1+m_ViewCamera->getRightVector();
|
---|
168 |
|
---|
169 |
|
---|
170 | m_UpLeft.Normalize();
|
---|
171 | m_DownLeft.Normalize();
|
---|
172 | m_UpRight.Normalize();
|
---|
173 | m_DownRight.Normalize();
|
---|
174 |
|
---|
175 | double corndist=m_ObjectBSphereRadius*sqrt(2.0);
|
---|
176 | m_UpLeft*=corndist;
|
---|
177 | m_DownLeft*=corndist;
|
---|
178 | m_UpRight*=corndist;
|
---|
179 | m_DownRight*=corndist;
|
---|
180 |
|
---|
181 | //update corner vertices
|
---|
182 | Vertices[9]=m_UpLeft.x;
|
---|
183 | Vertices[10]=m_UpLeft.y;
|
---|
184 | Vertices[11]=m_UpLeft.z;
|
---|
185 |
|
---|
186 | Vertices[6]=m_UpRight.x;
|
---|
187 | Vertices[7]=m_UpRight.y;
|
---|
188 | Vertices[8]=m_UpRight.z;
|
---|
189 |
|
---|
190 | Vertices[3]=m_DownRight.x;
|
---|
191 | Vertices[4]=m_DownRight.y;
|
---|
192 | Vertices[5]=m_DownRight.z;
|
---|
193 |
|
---|
194 | Vertices[0]=m_DownLeft.x;
|
---|
195 | Vertices[1]=m_DownLeft.y;
|
---|
196 | Vertices[2]=m_DownLeft.z;
|
---|
197 |
|
---|
198 | } |
---|