#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(); DrawSceneWithoutWater(); Renderer->SwitchToCubemapBuffer("Skybox",1); Renderer->SetGlNegXView(); DrawSceneWithoutWater(); Renderer->SwitchToCubemapBuffer("Skybox",2); Renderer->SetGlPosYView(); DrawSceneWithoutWater(); Renderer->SwitchToCubemapBuffer("Skybox",3); Renderer->SetGlNegYView(); DrawSceneWithoutWater(); Renderer->SwitchToCubemapBuffer("Skybox",4); Renderer->SetGlPosZView(); DrawSceneWithoutWater(); Renderer->SwitchToCubemapBuffer("Skybox",5); Renderer->SetGlNegZView(); DrawSceneWithoutWater(); 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() { 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")); 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(); Renderer->PopShader(); } //What to do on init void TMyApplication::InnerInit() { ResourceManager->PathToResources = "C:\\Work\\OldProjects\\ho3\\resources\\"; 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("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",256,256); Renderer->SetBackgroundCubemap(ResourceManager->FrameManager.GetFrameTexture("Skybox")); ResourceManager->TexList.AddTexture("../resources/normalmap.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); } //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.0f, 1.0f, 0.0f, 1.0f); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); Renderer->PushShader("GUI"); DrawSceneWithoutWater(); Renderer->PopShader(); /* 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; } } 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); }