ho3/Template/main.cpp
2024-06-08 20:55:56 +03:00

501 lines
14 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->PushPerspectiveProjectionMatrix(pi/2, 1.0, 1, 1000);
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();
Renderer->PopProjectionMatrix();
}
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();
}
void TMyApplication::DrawCubemap()
{
Renderer->PushShader("Env");
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();
}
//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("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");
std::array<std::string, 6> cubemapTextureStr = {
"../resources/posx.bmp", "../resources/negx.bmp", "../resources/posy.bmp", "../resources/negy.bmp", "../resources/posz.bmp", "../resources/negz.bmp"
};
cubemapTexture = ResourceManager->TexList.AddCubemapTexture(cubemapTextureStr);
//."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();
}
//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");
DrawToCubemap();
//Renderer->SwitchToCubemapBuffer("Skybox", 0);
//Renderer->SetGlPosXView();
//DrawSceneWithoutWater();
if (view == 6)
{
DrawCubemap();
}
else
{
Renderer->PushPerspectiveProjectionMatrix(pi / 2, 1.0, 1, 1000);
if (view == 0)
{
Renderer->SetGlNegZView();
}
else if (view == 1)
{
Renderer->SetGlNegYView();
}
else if (view == 2)
{
Renderer->SetGlPosXView();
}
else if (view == 3)
{
Renderer->SetGlNegXView();
}
else if (view == 4)
{
Renderer->SetGlPosZView();
}
else if (view == 5)
{
Renderer->SetGlPosYView();
}
DrawSceneWithoutWater();
Renderer->PopProjectionMatrix();
}
//DrawCubemap();
Renderer->PopShader();
/*
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);
}