#include "main.h" float CONST_CAM_ALPHA_MOUSE_SENSITIVETY = 0.005f; float CONST_CAM_PHI_MOUSE_SENSITIVETY = 0.005f; float CONST_CAM_ZOOM_SENSITIVITY = 1.0f/120.0f; cardinal CONST_CUBEMAP_UPDATE_INTERVAL = 5000; void TMyApplication::DrawToCubemap() { Renderer->PushShader("Directlight"); Renderer->SwitchToCubemapBuffer("Skybox",0); Renderer->SetGlPosXView(false, true); DrawCubemapDay(); Renderer->SetGlPosXView(true, true); GameMap.DrawVBO(); //glClearColor() //glClearColor(1.0f, 0.0f, 0.0f, 1.0f); //glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); Renderer->SwitchToCubemapBuffer("Skybox",1); Renderer->SetGlNegXView(false, true); DrawCubemapDay(); Renderer->SetGlNegXView(true, true); //glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); GameMap.DrawVBO(); Renderer->SwitchToCubemapBuffer("Skybox",2); Renderer->SetGlPosYView(false, true); DrawCubemapDay(); Renderer->SetGlPosYView(true, true); GameMap.DrawVBO(); //glClearColor(0.0f, 1.0f, 0.0f, 1.0f); //glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); Renderer->SwitchToCubemapBuffer("Skybox",3); Renderer->SetGlNegYView(false, true); DrawCubemapDay(); Renderer->SetGlNegYView(true, true); //glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); GameMap.DrawVBO(); Renderer->SwitchToCubemapBuffer("Skybox",4); Renderer->SetGlPosZView(false, true); DrawCubemapDay(); Renderer->SetGlPosZView(true, true); GameMap.DrawVBO(); //glClearColor(0.0f, 0.0f, 1.0f, 1.0f); //glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); Renderer->SwitchToCubemapBuffer("Skybox",5); Renderer->SetGlNegZView(false, true); DrawCubemapDay(); Renderer->SetGlNegZView(true, true); //glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); GameMap.DrawVBO(); Renderer->SwitchToScreen(); Renderer->PopShader(); } void TMyApplication::DrawToShadowMap() { Renderer->PushShader("Lightview"); Renderer->BeginDrawToDepthBufferGlobal(std::string("ShadowBufferGlobal")); DrawSceneWithoutWater(); Renderer->BeginDrawToDepthBufferLocal(std::string("ShadowBufferLocal")); DrawSceneWithoutWater(); Renderer->EndDrawToDepthBuffer(); Renderer->PopShader(); } void TMyApplication::DrawSceneWithoutWater() { Renderer->SetGLCamAngleView(); DrawCubemapDay(); Renderer->SetGLCamView(); GameMap.DrawVBO(); } void TMyApplication::DrawWaterSurface() { Renderer->PushShader("Water"); RenderUniform1f("WaterTimer", WaterTimer); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["normalmap.bmp"]); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_CUBE_MAP, ResourceManager->FrameManager.GetFrameTexture("Skybox")); RenderUniformMatrix3fv(CONST_STRING_MODELROTATEMATRIX_UNIFORM, false, (float*)IdentityMatrix.m); RenderUniform3fv(CONST_STRING_MODELTRANSLATEVECTOR_UNIFORM, (float*)ZeroVec3.v); EnableVertexAttribArray("vPosition"); EnableVertexAttribArray("vTexCoord"); //Renderer->DrawTriangleList(TriangleList); DrawVertexDataStruct(waterVertexDataStruct); DisableVertexAttribArray("vPosition"); DisableVertexAttribArray("vTexCoord"); Renderer->PopShader(); } void TMyApplication::DrawCubemap() { Renderer->PushShader("Env"); //Renderer->SetGLCamAngleView(); Renderer->SetGLCamAngleView(); //Renderer->LoadIdentity(); RenderUniformMatrix3fv(CONST_STRING_MODELROTATEMATRIX_UNIFORM, false, (float*)IdentityMatrix.m); RenderUniform3fv(CONST_STRING_MODELTRANSLATEVECTOR_UNIFORM, (float*)ZeroVec3.v); glBindTexture(GL_TEXTURE_CUBE_MAP, ResourceManager->FrameManager.GetFrameTexture("Skybox")); //glBindTexture(GL_TEXTURE_CUBE_MAP, cubemapTexture); EnableVertexAttribArray("vPosition"); DrawVertexDataStruct(cubemapVertexDataStruct); DisableVertexAttribArray("vPosition"); Renderer->PopShader(); } void TMyApplication::DrawCubemapDay() { Renderer->PushShader("EnvReverse"); //Renderer->SetGLCamAngleView(); //Renderer->SetGLCamAngleView(); //Renderer->LoadIdentity(); RenderUniformMatrix3fv(CONST_STRING_MODELROTATEMATRIX_UNIFORM, false, (float*)IdentityMatrix.m); RenderUniform3fv(CONST_STRING_MODELTRANSLATEVECTOR_UNIFORM, (float*)ZeroVec3.v); //glBindTexture(GL_TEXTURE_CUBE_MAP, ResourceManager->FrameManager.GetFrameTexture("Skybox")); glBindTexture(GL_TEXTURE_CUBE_MAP, cubemapTextureDay); EnableVertexAttribArray("vPosition"); DrawVertexDataStruct(cubemapVertexDataStruct); DisableVertexAttribArray("vPosition"); glClear(GL_DEPTH_BUFFER_BIT); Renderer->PopShader(); } //What to do on init void TMyApplication::InnerInit() { ResourceManager->PathToResources = "C:\\Work\\OldProjects\\ho3\\resources\\"; glDisable(GL_CULL_FACE); ResourceManager->ShaderManager.AddShader("GUI", "shaders/gui_transparent.vertex", "shaders/gui_transparent.fragment"); ResourceManager->ShaderManager.AddShader("Parallax", "shaders/directlight_parallax_shadow.vertex", "shaders/directlight_parallax_shadow.fragment"); ResourceManager->ShaderManager.AddShader("Directlight", "shaders/directlight.vertex", "shaders/directlight.fragment"); ResourceManager->ShaderManager.AddShader("Env", "shaders/env.vertex", "shaders/env.fragment"); ResourceManager->ShaderManager.AddShader("EnvReverse", "shaders/env_reverse.vertex", "shaders/env_reverse.fragment"); ResourceManager->ShaderManager.AddShader("Water", "shaders/water.vertex", "shaders/water.fragment"); ResourceManager->ShaderManager.AddShader("Frame", "shaders/frame.vertex", "shaders/frame.fragment"); ResourceManager->ShaderManager.AddShader("Lightview", "shaders/lightview.vertex", "shaders/lightview.fragment"); ResourceManager->ShaderManager.AddShader("Simple3D", "shaders/simple3d.vertex", "shaders/simple3d.fragment"); Renderer->SetBackgroundShader("Env"); Renderer->PushShader("Parallax"); //Renderer->PushShader("GUI"); ResourceManager->ModelManager.AddLiteModel("models/bt_box_yellow.lm1"); ResourceManager->ModelManager.AddLiteModel("models/bt_cone.lm1"); ResourceManager->ModelManager.AddLiteModel("models/girl.lm1"); ResourceManager->ModelAnimManager.AddAnimationToModel("girl.lm1","models/girl.bn2"); ResourceManager->ModelAnimManager["girl.lm1"]->LoadAnimSequenceFromFileAn1("models/girl.an1"); ResourceManager->ModelManager.AddLiteModel("models/bonemodel.lm1"); ResourceManager->ModelAnimManager.AddAnimationToModel("bonemodel.lm1","models/bonemodel.bn2"); ResourceManager->ModelAnimManager["bonemodel.lm1"]->LoadAnimSequenceFromFileAn1("models/bonemodel.an1"); GameMap.LoadMap(); Renderer->SetLandToCalcCollision(GameMap.GetLand()); Renderer->MoveDist(15.0f); Renderer->MovePhi(pi/6); float len = 50.0f; //ResourceManager->LightManager.SetLightPos(0, vec4(-len * cos(pi/4), len * sin(pi/4), 0.0f, 0.0f)); ResourceManager->FrameManager.AddCubemapBuffer("Skybox",512,512); Renderer->SetBackgroundCubemap(ResourceManager->FrameManager.GetFrameTexture("Skybox")); ResourceManager->TexList.AddTexture("../resources/normalmap.bmp"); std::array cubemapTextureStr = { "../resources/sky/posx.bmp", "../resources/sky/negx.bmp", "../resources/sky/posy.bmp", "../resources/sky/negy.bmp", "../resources/sky/posz.bmp", "../resources/sky/negz.bmp" }; cubemapTexture = ResourceManager->TexList.AddCubemapTexture(cubemapTextureStr); //!!!! for some reason up and down switched std::array cubemapTextureDayStr = { "../resources/sky/yavin_rt.bmp", "../resources/sky/yavin_lf.bmp", "../resources/sky/yavin_dn.bmp", "../resources/sky/yavin_up.bmp", "../resources/sky/yavin_bk.bmp", "../resources/sky/yavin_ft.bmp" }; cubemapTextureDay = ResourceManager->TexList.AddCubemapTexture(cubemapTextureDayStr); std::array cubemapTextureNightStr = { "../resources/sky/space_rt.bmp", "../resources/sky/space_lf.bmp", "../resources/sky/space_up.bmp", "../resources/sky/space_dn.bmp", "../resources/sky/space_bk.bmp", "../resources/sky/space_ft.bmp" }; cubemapTextureNight = ResourceManager->TexList.AddCubemapTexture(cubemapTextureNightStr); //."posx.bmp","negx.bmp","posy.bmp","negy.bmp","posz.bmp","negz.bmp" ResourceManager->FrameManager.AddFrameRenderBuffer("ScreenBlur", 512, 512); ResourceManager->FrameManager.AddDepthBuffer("ShadowBufferGlobal", 512, 512); ResourceManager->FrameManager.AddDepthBuffer("ShadowBufferLocal", 1024, 1024); glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, ResourceManager->FrameManager.GetFrameTexture("ShadowBufferGlobal")); glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, ResourceManager->FrameManager.GetFrameTexture("ShadowBufferLocal")); glActiveTexture(GL_TEXTURE0); glClearColor(0.2f, 0.5f, 1.0f, 1.0f); //Renderer->SetShadowClampValue(0.3f); //Renderer->SetShadowClampValue(0.0f); Renderer->SetFogBeginDistance(15.f); Renderer->SetFogEndDistance(30.f); // +x cubemapVertexDataStruct.PositionData.push_back({ 10.0f, -10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, 10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, 10.0f, 10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, -10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, 10.0f, 10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, -10.0f, 10.0f }); // -x cubemapVertexDataStruct.PositionData.push_back({ -10.0f, -10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ -10.0f, 10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ -10.0f, 10.0f, 10.0f }); cubemapVertexDataStruct.PositionData.push_back({ -10.0f, -10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ -10.0f, 10.0f, 10.0f }); cubemapVertexDataStruct.PositionData.push_back({ -10.0f, -10.0f, 10.0f }); // +y cubemapVertexDataStruct.PositionData.push_back({ -10.0f, 10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, 10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, 10.0f, 10.0f }); cubemapVertexDataStruct.PositionData.push_back({ -10.0f, 10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, 10.0f, 10.0f }); cubemapVertexDataStruct.PositionData.push_back({ -10.0f, 10.0f, 10.0f }); // -y cubemapVertexDataStruct.PositionData.push_back({ -10.0f, -10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, -10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, -10.0f, 10.0f }); cubemapVertexDataStruct.PositionData.push_back({ -10.0f, -10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, -10.0f, 10.0f }); cubemapVertexDataStruct.PositionData.push_back({ -10.0f, -10.0f, 10.0f }); // +z cubemapVertexDataStruct.PositionData.push_back({ -10.0f, -10.0f, 10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, -10.0f, 10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, 10.0f, 10.0f }); cubemapVertexDataStruct.PositionData.push_back({ -10.0f, -10.0f, 10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, 10.0f, 10.0f }); cubemapVertexDataStruct.PositionData.push_back({ -10.0f, 10.0f, 10.0f }); // -z cubemapVertexDataStruct.PositionData.push_back({ -10.0f, -10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, -10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, 10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ -10.0f, -10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ 10.0f, 10.0f, -10.0f }); cubemapVertexDataStruct.PositionData.push_back({ -10.0f, 10.0f, -10.0f }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); cubemapVertexDataStruct.RefreshVBO(); /* glBegin(GL_POLYGON); glTexCoord2f(2, 2); glVertex3f(20, 0, 20); glTexCoord2f(2, 0); glVertex3f(20, 0, -20); glTexCoord2f(0, 0); glVertex3f(-20, 0, -20); glTexCoord2f(0, 2); glVertex3f(-20, 0, 20); glEnd();*/ waterVertexDataStruct.PositionData.push_back({ -20, 0, -20 }); waterVertexDataStruct.PositionData.push_back({ 20, 0, -20 }); waterVertexDataStruct.PositionData.push_back({ 20, 0, 20 }); waterVertexDataStruct.PositionData.push_back({ -20, 0, -20 }); waterVertexDataStruct.PositionData.push_back({ 20, 0, 20 }); waterVertexDataStruct.PositionData.push_back({ -20, 0, 20 }); waterVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); waterVertexDataStruct.TexCoordData.push_back({ 2.0, 0.0 }); waterVertexDataStruct.TexCoordData.push_back({ 2.0, 2.0 }); waterVertexDataStruct.TexCoordData.push_back({ 0.0, 0.0 }); waterVertexDataStruct.TexCoordData.push_back({ 2.0, 2.0 }); waterVertexDataStruct.TexCoordData.push_back({ 0.0, 2.0 }); waterVertexDataStruct.RefreshVBO(); } //What to do on deinit void TMyApplication::InnerDeinit() { GameMap.FreeMap(); ResourceManager->FrameManager.DeleteFrameRenderBuffer("Skybox"); } //What to do on draw void TMyApplication::InnerDraw() { Renderer->SwitchToScreen(); glClearColor(0.2f, 0.55f, 1.0f, 1.0f); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); Renderer->PushShader("Directlight"); //DrawCubemapDay(); DrawToCubemap(); //Renderer->SwitchToCubemapBuffer("Skybox", 0); //Renderer->SetGlPosXView(); DrawSceneWithoutWater(); //DrawCubemap(); /* if (view % 3 == 0) { //DrawCubemap(); Renderer->SetGlPosXView(); DrawSceneWithoutWater(); } else if (view % 3 == 1) { DrawCubemap(); } else { DrawSceneWithoutWater(); }*/ Renderer->PopShader(); DrawWaterSurface(); /* Renderer->PushShader("Directlight"); DrawSceneWithoutWater(); Renderer->PopShader(); */ //DrawToCubemap(); /* DrawToCubemap(); DrawToShadowMap(); Renderer->SwitchToFrameBuffer(std::string("ScreenBlur")); DrawSceneWithoutWater(); DrawWaterSurface(); Renderer->SwitchToScreen(); Renderer->PushShader("Frame"); Renderer->DrawFrameFullScreen(std::string("ScreenBlur")); Renderer->PopShader();*/ /* Renderer->SwitchToFrameBuffer(std::string("ScreenBlur")); Renderer->PushShader("GUI"); DrawSceneWithoutWater(); Renderer->PopShader(); Renderer->SwitchToScreen(); Renderer->PushShader("Frame"); Renderer->DrawFrameFullScreen(std::string("ScreenBlur")); Renderer->PopShader();*/ } //What to do on update. timer means how many ms passed since last update void TMyApplication::InnerUpdate(cardinal timer) { WaterTimer += 0.001f * timer; GameMap.Update(timer); } void TMyApplication::UpdateQuick() { if (GetKeyState(VK_UP) >> 15) { Renderer->MoveForward(); } if (GetKeyState(VK_DOWN) >> 15) { Renderer->MoveBackward(); } if (GetKeyState(VK_LEFT) >> 15) { Renderer->MoveLeft(); } if (GetKeyState(VK_RIGHT) >> 15) { Renderer->MoveRight(); } } void TMyApplication::OnMouseMove(TMouseState& mouseState) { if (MouseRightButtonPressed) { int dx = mouseState.X - MouseX0; int dy = mouseState.Y - MouseY0; MouseX0 = mouseState.X; MouseY0 = mouseState.Y; Renderer->MoveAlpha(dx * CONST_CAM_ALPHA_MOUSE_SENSITIVETY); Renderer->MovePhi(dy * CONST_CAM_PHI_MOUSE_SENSITIVETY); } } void TMyApplication::OnMouseDown(TMouseState& mouseState) { if (mouseState.RightButtonPressed) { MouseRightButtonPressed = true; MouseX0 = mouseState.X; MouseY0 = mouseState.Y; } if (mouseState.LeftButtonPressed) { MouseLeftButtonPressed = true; view += 1; if (view == 7) { view = 0; } } } void TMyApplication::OnMouseUp(TMouseState& mouseState) { MouseRightButtonPressed = false; if (MouseLeftButtonPressed) { MouseLeftButtonPressed = false; GameMap.PlayerClicked(mouseState.X, mouseState.Y); } } void TMyApplication::OnMouseWheel(short int delta) { Renderer->MoveDist(-CONST_CAM_ZOOM_SENSITIVITY * delta); } int APIENTRY WinMain(HINSTANCE hCurrentInst, HINSTANCE hPreviousInst, LPSTR lpszCmdLine, int nCmdShow) { //Create application TMyApplication Application; //Start application return MainLoop(Application); }