#include "RenderPCH.h" #include "GL_Renderer.h" #include "I3dengine.h" void CGLRenderer::PrepareOutSpaceTextures(CREOutSpace * pRE) { int arrnResult[2]; ScanOutSpaceCube(pRE->m_TexID, iSystem->GetViewCamera().GetPos(), arrnResult); // vPrevPos[arrnResult[0]] = iSystem->GetViewCamera().GetPos(); //vPrevPos[arrnResult[1]] = iSystem->GetViewCamera().GetPos(); /* int nTempX, nTempY, nTempWidth, nTempHeight; int nTexSize = 512; gRenDev->GetViewport(&nTempX, &nTempY, &nTempWidth, &nTempHeight); gRenDev->SetViewport( 0, 0, nTexSize, nTexSize ); I3DEngine * pEngine = iSystem->GetI3DEngine(); CCamera prevCamera = gRenDev->GetCamera(); CCamera tmp_cam = prevCamera; tmp_cam.SetAngle(Vec3d(0,0,0)); tmp_cam.Init(nTexSize, nTexSize); tmp_cam.Update(); iSystem->SetViewCamera(tmp_cam); gRenDev->SetCamera(tmp_cam); pEngine->SetCamera(tmp_cam,false); pEngine->DrawLowDetail(); if(!pRE->m_TexID[0]) glGenTextures(1,&(pRE->m_TexID[0])); glBindTexture(GL_TEXTURE_2D, pRE->m_TexID[0]); { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 0, 0, nTexSize, nTexSize, 0); } glBindTexture(GL_TEXTURE_2D, 0); pEngine->SetCamera(prevCamera); iSystem->SetViewCamera(prevCamera); gRenDev->SetCamera(prevCamera); gRenDev->SetViewport(nTempX, nTempY, nTempWidth, nTempHeight); glClear(GL_DEPTH_BUFFER_BIT);*/ } void CGLRenderer::DrawOutSpaceSide( const float *angle, const Vec3d & Pos, int tex_size, int offsetX, int offsetY) { if (!iSystem) return; CRenderer * renderer = gRenDev; CCamera tmp_camera = renderer->GetCamera(); CCamera prevCamera = tmp_camera; tmp_camera.Init(tex_size,tex_size); tmp_camera.SetPos(Pos); tmp_camera.SetAngle(Vec3d(angle[0], angle[1], angle[2])); tmp_camera.Update(); iSystem->SetViewCamera(tmp_camera); gRenDev->SetCamera(tmp_camera); gRenDev->SetViewport(tex_size*offsetX, tex_size*offsetY, tex_size, tex_size); I3DEngine *eng = (I3DEngine *)iSystem->GetIProcess(); eng->SetCamera(tmp_camera,false ); eng->DrawLowDetail(0); iSystem->SetViewCamera(prevCamera); gRenDev->SetCamera(prevCamera); } void CGLRenderer::ScanOutSpaceCube(uint & nTexID, const Vec3d & vPos, int * pResult) { // get normalized camera angle float fAngle = iSystem->GetViewCamera().GetAngles().z; while(fAngle>360) fAngle-=360; while(fAngle<0) fAngle+=360; // get 2 visible sides int nSide = int(fAngle+45)/90; int nSide2 = int(fAngle+45+45)/90; if(nSide == nSide2) nSide2 = int(fAngle+45-45)/90; // normalize if(nSide2<0) nSide2=3; if(nSide2>3) nSide2=0; if(nSide<0) nSide=3; if(nSide>3) nSide=0; static Vec3d vPrevPos[4]; // is images valid if (GetDistance(vPrevPos[nSide ],iSystem->GetViewCamera().GetPos())<1.0f && GetDistance(vPrevPos[nSide2],iSystem->GetViewCamera().GetPos())<1.0f ) return; // no need to update iLog->Log("nSides = %d, %d",nSide,nSide2); // now render 2 cubemap sides CRenderer * renderer = gRenDev; int tex_size = 512; while(true) { if (tex_size>renderer->GetWidth() || tex_size>renderer->GetHeight()) tex_size >>= 1; else break; } if (tex_size <= 8) return; static const GLenum OutSpaceCubeFaces[6] = { GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT, GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT, GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT, GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT, }; static const float sAngles[6][5] = { { 0, 180, 0, 0, 0 }, { 0, 180, 90, 1, 0 }, { 0, 180, 180, 2, 0 }, { 0, 180, 270, 0, 1 }, { -90, 180, 0, 1, 1 }, { 90, 180, 0, 2, 1 } }; if(!nTexID) { // create empty if not created glGenTextures(1,&nTexID); assert(nTexID<14000); glBindTexture(GL_TEXTURE_CUBE_MAP_EXT, nTexID); for(int n=0; n<6; n++) glTexImage2D(OutSpaceCubeFaces[n], 0, GL_RGB, tex_size, tex_size, 0, GL_RGB, GL_FLOAT, 0); glBindTexture(GL_TEXTURE_CUBE_MAP_EXT, 0); } glClear(GL_DEPTH_BUFFER_BIT); int vX, vY, vWidth, vHeight; gRenDev->GetViewport(&vX, &vY, &vWidth, &vHeight); int bFog=0; // remember fog value glGetIntegerv(GL_FOG,&bFog); m_RP.m_bDrawToTexture = true; DrawOutSpaceSide( &sAngles[nSide ][0], vPos, tex_size, 0, 0 ); DrawOutSpaceSide( &sAngles[nSide2][0], vPos, tex_size, 1, 0 ); glBindTexture(GL_TEXTURE_CUBE_MAP_EXT, nTexID); glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_R,GL_CLAMP_TO_EDGE); /* int width = tex_size*3; int height = tex_size*2; byte *pic = new byte [width * height * 3]; glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pic); CImage::SaveJPG(pic,FORMAT_24_BIT,width,height,"CubeEnv.jpg"); delete [] pic; */ glCopyTexSubImage2D(OutSpaceCubeFaces[nSide ], 0, 0, 0, (int)(tex_size*0), (int)(tex_size*0), tex_size, tex_size); glCopyTexSubImage2D(OutSpaceCubeFaces[nSide2], 0, 0, 0, (int)(tex_size*1), (int)(tex_size*0), tex_size, tex_size); vPrevPos[nSide] = iSystem->GetViewCamera().GetPos(); vPrevPos[nSide2] = iSystem->GetViewCamera().GetPos(); pResult[0] = nSide; pResult[1] = nSide2; gRenDev->SetViewport(vX, vY, vWidth, vHeight); glClear(GL_DEPTH_BUFFER_BIT); m_RP.m_bDrawToTexture = false; if(bFog) glEnable(GL_FOG); } bool CREOutSpace::mfDraw(SShader *ef, SShaderPass *sfm) { if(!m_TexID) return true; gRenDev->ResetToDefault(); gRenDev->SetEnviMode(R_MODE_MODULATE); gRenDev->EnableDepthTest(false); gRenDev->EnableDepthWrites(false); int bFog=0; // remember fog value glGetIntegerv(GL_FOG,&bFog); glDisable(GL_FOG); glBindTexture(GL_TEXTURE_CUBE_MAP_EXT,m_TexID); glEnable(GL_TEXTURE_CUBE_MAP_EXT); float scale = 1.f/1; float eyePlaneS[] = { scale, 0, 0, 0 }; float eyePlaneT[] = { 0, scale, 0, 0 }; float eyePlaneR[] = { 0, 0, scale, 0 }; glTexGenfv(GL_S, GL_OBJECT_PLANE, eyePlaneS); glTexGenfv(GL_T, GL_OBJECT_PLANE, eyePlaneT); glTexGenfv(GL_R, GL_OBJECT_PLANE, eyePlaneR); glTexGenf(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); glTexGenf(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); glTexGenf(GL_R,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_GEN_R); glMatrixMode(GL_TEXTURE); glRotatef(-90,1,0,0); glMatrixMode(GL_MODELVIEW); // glRotatef(-45,0,0,1); float D = 8; // box size { // top struct_VERTEX_FORMAT_P3F_TEX2F data[] = { D,-D, D, 1, 1.f-1, -D,-D, D, 0, 1.f-1, D, D, D, 1, 1.f-0, -D, D, D, 0, 1.f-0, }; // gRenDev->SetTexture(m_TexID[0]); // gRenDev->SetTexClampMode(true); gRenDev->DrawTriStrip(&(CVertexBuffer (data,VERTEX_FORMAT_P3F_TEX2F)),4); } { // s struct_VERTEX_FORMAT_P3F_TEX2F data[] = { -D,-D, D, 1.0, 1.f-1.0, D,-D, D, 0.0, 1.f-1.0, -D,-D,-D, 1.0, 1.f-0.0, D,-D,-D, 0.0, 1.f-0.0, }; // gRenDev->SetTexture(m_TexID[0]); // gRenDev->SetTexClampMode(true); gRenDev->DrawTriStrip(&(CVertexBuffer (data,VERTEX_FORMAT_P3F_TEX2F)),4); } { // e struct_VERTEX_FORMAT_P3F_TEX2F data[] = { -D, D, D, 1.0, 1.f-0.0, -D,-D, D, 0.0, 1.f-0.0, -D, D,-D, 1.0, 1.f-0.0, -D,-D,-D, 0.0, 1.f-0.0, }; // gRenDev->SetTexture(m_TexID[0]); // gRenDev->SetTexClampMode(true); gRenDev->DrawTriStrip(&(CVertexBuffer (data,VERTEX_FORMAT_P3F_TEX2F)),4); } { // n struct_VERTEX_FORMAT_P3F_TEX2F data[] = { D, D, D, 1.0, 1.f-1.0, -D, D, D, 0.0, 1.f-1.0, D, D,-D, 1.0, 1.f-0.0, -D, D,-D, 0.0, 1.f-0.0, }; // gRenDev->SetTexture(m_TexID[0]); // gRenDev->SetTexClampMode(true); gRenDev->DrawTriStrip(&(CVertexBuffer (data,VERTEX_FORMAT_P3F_TEX2F)),4); } { // w struct_VERTEX_FORMAT_P3F_TEX2F data[] = { D,-D, D, 1.0, 1.f-0.0, D, D, D, 0.0, 1.f-0.0, D,-D,-D, 1.0, 1.f-0.0, D, D,-D, 0.0, 1.f-0.0, }; // gRenDev->SetTexture(m_TexID[0]); // gRenDev->SetTexClampMode(true); gRenDev->DrawTriStrip(&(CVertexBuffer (data,VERTEX_FORMAT_P3F_TEX2F)),4); } { // bottom struct_VERTEX_FORMAT_P3F_TEX2F data[] = { D,-D, -D, 1, 1.f-1, -D,-D, -D, 0, 1.f-1, D, D, -D, 1, 1.f-0, -D, D, -D, 0, 1.f-0, }; // gRenDev->SetTexture(m_TexID[0]); // gRenDev->SetTexClampMode(true); gRenDev->DrawTriStrip(&(CVertexBuffer (data,VERTEX_FORMAT_P3F_TEX2F)),4); } gRenDev->ResetToDefault(); gRenDev->ResetTextureMatrix(); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_R); glDisable(GL_TEXTURE_GEN_Q); glDisable(GL_TEXTURE_CUBE_MAP_EXT); if(bFog) glEnable(GL_FOG); return true; }