302 lines
7.4 KiB
C++
302 lines
7.4 KiB
C++
|
#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);
|
||
|
}
|