00001
00008 #include "scene.h"
00009
00011 float lpos_dist;
00013 float tmp;
00015 TVector lpos;
00017 TVector eye;
00019 TMatrix view;
00021 TMatrix eye_matrix(
00022 1.0, 0.0, 0.0, 0.0,
00023 0.0, 1.0, 0.0, 0.0,
00024 0.0, 0.0, 1.0, 0.0,
00025 1.0, 1.0, 1.0, 1.0 );
00026
00027
00034 bool TScene::CreateShadowMap(vector<TLight>::iterator ii)
00035 {
00036 cout<<"Shadow Map \""<<ii->GetShadowCache()<<"\": "<<ii->ShadowSize()<<"x"<<ii->ShadowSize()<<endl;
00037
00039
00040 glGenTextures(1, &tex_cache[ii->GetShadowCache()]);
00041 glBindTexture(GL_TEXTURE_2D, tex_cache[ii->GetShadowCache()]);
00042 glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, ii->ShadowSize(), ii->ShadowSize(), 0,
00043 GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
00044
00046 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
00047 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
00048 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
00049 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
00050 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
00051
00053 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
00054
00055 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
00056
00057 glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
00058
00060 glGenFramebuffers(1, &ii->fbo);
00061 glBindFramebufferEXT(GL_FRAMEBUFFER, ii->fbo);
00062
00063 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, tex_cache[ii->GetShadowCache()], 0);
00064 glDrawBuffer(GL_NONE); glReadBuffer(GL_NONE);
00065
00066 if( glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
00067 {
00068 ShowMessage("ERROR: FBO creation for shadow map failed!",false);
00069 return false;
00070 }
00071 glBindFramebufferEXT(GL_FRAMEBUFFER, 0);
00072
00073 glLoadIdentity();
00074 gluPerspective(fovy, (GLfloat)resx/resy, near_p, far_p);
00075 glGetFloatv(GL_MODELVIEW_MATRIX, ii->cameraProjectionMatrix);
00076
00077 return true;
00078 }
00079
00080
00087 void TScene::RenderShadowMap(TLight l)
00088 {
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00104 glGetFloatv(GL_MODELVIEW_MATRIX, l.cameraViewMatrix);
00105
00107 glLoadIdentity();
00108 gluPerspective(120.0f, 1.0f, 1.0f, 1000.0f);
00109 glGetFloatv(GL_MODELVIEW_MATRIX, l.lightProjectionMatrix);
00110
00112 glLoadIdentity();
00113 lpos = l.GetPos();
00114
00115
00116
00117
00118
00119
00120
00121 gluLookAt(lpos.x, lpos.y, lpos.z,
00122
00123 cam.GetPos().x, cam.GetPos().y, cam.GetPos().z,
00124 0.0f, 1.0f, 0.0f);
00125 glGetFloatv(GL_MODELVIEW_MATRIX, l.lightViewMatrix);
00126
00128 glBindFramebufferEXT(GL_FRAMEBUFFER, l.fbo);
00129
00130 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, tex_cache[l.GetShadowCache()], 0);
00131 glDrawBuffer(GL_NONE);
00132
00133 glMatrixMode(GL_PROJECTION);
00134 glLoadMatrixf(l.lightProjectionMatrix);
00135 glMatrixMode(GL_MODELVIEW);
00136 glLoadMatrixf(l.lightViewMatrix);
00137
00139 glCullFace(GL_FRONT);
00140 glColorMask(0, 0, 0, 0);
00141 glClear(GL_DEPTH_BUFFER_BIT);
00142
00143
00144 glViewport(0,0,l.ShadowSize() - 1, l.ShadowSize() - 1);
00145
00147 glPolygonOffset(4,1);
00148 glEnable(GL_POLYGON_OFFSET_FILL);
00149
00151 for(io = objects.begin(); io != objects.end(); io++)
00152 io->second.Draw(l.lightViewMatrix,false);
00153
00154
00155 glPolygonOffset(0,0);
00156 glDisable(GL_POLYGON_OFFSET_FILL);
00157
00158 glCullFace(GL_BACK);
00159 glColorMask(1, 1, 1, 1);
00160 glBindFramebufferEXT(GL_FRAMEBUFFER, 0);
00161 glClear(GL_DEPTH_BUFFER_BIT);
00162
00163
00165
00166 glMatrixMode(GL_PROJECTION);
00167 glLoadMatrixf(l.cameraProjectionMatrix);
00168 glMatrixMode(GL_MODELVIEW);
00169 glLoadMatrixf(l.cameraViewMatrix);
00170 glViewport(0, 0, resx, resy);
00171
00173 glGetFloatv(GL_MODELVIEW_MATRIX, view);
00174
00175
00176 for(int i=0;i<3;i++)
00177 for(int j=0;j<i;j++)
00178 std::swap(*view[4 * i + j], *view[4 * j + i]);
00179
00180
00181 for(int i=0; i<3; i++)
00182 eye[i] = -*view[12 + i];
00183 eye[3] = 0;
00184
00185
00186 for(int i=0;i<3;i++) {
00187 *view[4 * i + 3] = 0;
00188 *view[12 + i] = 0;
00189 }
00190
00192 *eye_matrix[12] = eye[0];
00193 *eye_matrix[13] = eye[1];
00194 *eye_matrix[14] = eye[2];
00195 l.textureMatrix = l.biasMatrix * l.lightProjectionMatrix * l.lightViewMatrix * view * eye_matrix;
00196
00198 for(im = materials.begin(); im != materials.end(); im++)
00199 im->second.SetShadowMatrix(l.textureMatrix, l.GetOrd() );
00200 }