source: GTP/branches/IllumWPdeliver2008dec/IlluminationWP/demos/Standalone/Hierarchical Systems Demo [OpenGL]/RESOURCES/include/My3DGraphRes/Impostor.cpp @ 3255

Revision 3255, 4.2 KB checked in by szirmay, 15 years ago (diff)
Line 
1#include ".\impostor.h"
2
3#include <GL/glut.h>
4#include <GL/glext.h>
5#include <glh/glh_extensions.h>
6
7Impostor::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
28Impostor::~Impostor(void)
29{
30}
31void 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
66void 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
99void 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}
Note: See TracBrowser for help on using the repository browser.