[852] | 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 | } |
---|