diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index 5545075..2eb2259 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -45,16 +45,22 @@ void GameWorld::Initialize() RegisterComponents(); - //auto camera = CreateEntity(); - //{ - // auto transform = AddComponent(camera); - // transform->Position.z = 20.f; - // transform->Position.y = 20.f; - // //transform->Orientation = glm::quat(glm::vec3(glm::pi() / 8.f, 0.f, 0.f)); - // auto cameraComp = AddComponent(camera); - // cameraComp->FarClip = 2000.f; - // auto freeSteering = AddComponent(camera); - //} + auto camera = CreateEntity(); + { + auto transform = AddComponent(camera); + transform->Position.z = 20.f; + transform->Position.y = 20.f; + //transform->Orientation = glm::quat(glm::vec3(glm::pi() / 8.f, 0.f, 0.f)); + auto cameraComp = AddComponent(camera); + cameraComp->FarClip = 2000.f; + auto freeSteering = AddComponent(camera); + } + { + Events::SetViewportCamera e; + e.CameraEntity = camera; + e.ViewportFrame = "Viewport2"; + EventBroker->Publish(e); + } auto player1 = CreateEntity(); @@ -70,32 +76,71 @@ void GameWorld::Initialize() } + //{ + // auto ground = CreateEntity(); + // auto transform = AddComponent(ground); + // transform->Position = glm::vec3(0, -50, 0); + // //transform->Scale = glm::vec3(400.0f, 10.0f, 400.0f); + // transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f)); + // auto model = AddComponent(ground); + // model->ModelFile = "Models/TestScene3/testScene.obj"; + // //model->ModelFile = "Models/Placeholders/Terrain/Terrain2.obj"; + // + // auto physics = AddComponent(ground); + // physics->Mass = 10; + // physics->Static = true; + + + // auto groundshape = CreateEntity(ground); + // auto transformshape = AddComponent(groundshape); + // auto meshShape = AddComponent(groundshape); + // //meshShape->ResourceName = "Models/Placeholders/Terrain/Terrain2.obj"; + // meshShape->ResourceName = "Models/TestScene3/testScene.obj"; + + // + // CommitEntity(groundshape); + // CommitEntity(ground); + //} + + { auto ground = CreateEntity(); auto transform = AddComponent(ground); - transform->Position = glm::vec3(0, -50, 0); - //transform->Scale = glm::vec3(400.0f, 10.0f, 400.0f); + transform->Position = glm::vec3(0, -5, 0); + transform->Scale = glm::vec3(1600.0f, 10.0f, 1600.0f); transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f)); auto model = AddComponent(ground); - model->ModelFile = "Models/TestScene3/testScene.obj"; - //model->ModelFile = "Models/Placeholders/Terrain/Terrain2.obj"; - + model->ModelFile = "Models/Placeholders/PhysicsTest/Cube.obj"; + auto physics = AddComponent(ground); physics->Mass = 10; physics->Static = true; - auto groundshape = CreateEntity(ground); auto transformshape = AddComponent(groundshape); - auto meshShape = AddComponent(groundshape); - //meshShape->ResourceName = "Models/Placeholders/Terrain/Terrain2.obj"; - meshShape->ResourceName = "Models/TestScene3/testScene.obj"; + auto box = AddComponent(groundshape); + box->Width = 800; + box->Height = 5; + box->Depth = 800; - CommitEntity(groundshape); CommitEntity(ground); } + //for (int i = 0; i < 500; i++) + //{ + // auto Light = CreateEntity(); + // auto transform = AddComponent(Light); + // transform->Position = glm::vec3((5 + (i*2.f))*cos(i*2.f), 3.f, (5 + (i*2.f))*sin(i*2.f)); + // auto light = AddComponent(Light); + // light->Specular = glm::vec3(0.5f, 0.5f, 0.5f); + // light->Diffuse = glm::vec3(0.5f, 0.5f, 0.5f); + // light->Radius = 15.f; + // light->specularExponent = 100.f; + // CommitEntity(Light); + // //auto model = AddComponent(Light, "Model"); + // //model->ModelFile = "Models/Placeholders/PhysicsTest/PointLight.obj"; + //} /*{ @@ -336,17 +381,17 @@ void GameWorld::Initialize() } } - { - auto lightentity = CreateEntity(tank); - auto transform = AddComponent(lightentity); - transform->Position = glm::vec3(0, 0, 0); - auto light = AddComponent(lightentity); - //light->Diffuse = glm::vec3(128.f/255.f, 172.f/255.f, 242.f/255.f); - //light->Specular = glm::vec3(1.f); - /*light->ConstantAttenuation = 0.3f; - light->LinearAttenuation = 0.003f; - light->QuadraticAttenuation = 0.002f;*/ - } + //{ + // auto lightentity = CreateEntity(tank); + // auto transform = AddComponent(lightentity); + // transform->Position = glm::vec3(0, 0, 0); + // auto light = AddComponent(lightentity); + // //light->Diffuse = glm::vec3(128.f/255.f, 172.f/255.f, 242.f/255.f); + // //light->Specular = glm::vec3(1.f); + // /*light->ConstantAttenuation = 0.3f; + // light->LinearAttenuation = 0.003f; + // light->QuadraticAttenuation = 0.002f;*/ + //} // auto wheelpair = CreateEntity(tank); // SetProperty(wheelpair, "Name", "WheelPair"); @@ -751,25 +796,19 @@ void GameWorld::Initialize() //auto freeSteering = AddComponent(cameraTower); } CommitEntity(cameraTower); - { - Events::SetViewportCamera e; - e.CameraEntity = cameraTower; - e.ViewportFrame = "Viewport2"; - EventBroker->Publish(e); - } } - { - auto lightentity = CreateEntity(tank); - auto transform = AddComponent(lightentity); - transform->Position = glm::vec3(0, 0, 0); - auto light = AddComponent(lightentity); - //light->Diffuse = glm::vec3(128.f/255.f, 172.f/255.f, 242.f/255.f); - //light->Specular = glm::vec3(1.f); - /*light->ConstantAttenuation = 0.3f; - light->LinearAttenuation = 0.003f; - light->QuadraticAttenuation = 0.002f;*/ - } + //{ + // auto lightentity = CreateEntity(tank); + // auto transform = AddComponent(lightentity); + // transform->Position = glm::vec3(0, 0, 0); + // auto light = AddComponent(lightentity); + // //light->Diffuse = glm::vec3(128.f/255.f, 172.f/255.f, 242.f/255.f); + // //light->Specular = glm::vec3(1.f); + // /*light->ConstantAttenuation = 0.3f; + // light->LinearAttenuation = 0.003f; + // light->QuadraticAttenuation = 0.002f;*/ + //} // auto wheelpair = CreateEntity(tank); // SetProperty(wheelpair, "Name", "WheelPair"); diff --git a/src/Renderer.cpp b/src/Renderer.cpp index 0409dbc..a0051fd 100755 --- a/src/Renderer.cpp +++ b/src/Renderer.cpp @@ -23,7 +23,7 @@ Renderer::Renderer(std::shared_ptr<::ResourceManager> resourceManager) m_SunTarget = glm::vec3(0, 0, 0); m_SunProjection_height = glm::vec2(-40.f, 40.f); m_SunProjection_width = glm::vec2(-40.f, 40.f); - m_SunProjection_length = glm::vec2(500.f, -500.f); + m_SunProjection_length = glm::vec2(-500.f, 500.f); m_SunProjection = glm::ortho(m_SunProjection_width.x, m_SunProjection_width.y, m_SunProjection_height.x, m_SunProjection_height.y, m_SunProjection_length.x, m_SunProjection_length.y); /* Lights = 0;*/ } @@ -106,12 +106,12 @@ void Renderer::LoadContent() m_ShaderProgramDebugAABB.AddShader(standardVS); m_ShaderProgramDebugAABB.AddShader(std::shared_ptr(new FragmentShader("Shaders/AABB.frag.glsl"))); m_ShaderProgramDebugAABB.Compile(); - m_ShaderProgramDebugAABB.Link(); + m_ShaderProgramDebugAABB.Link();*/ m_ShaderProgramSkybox.AddShader(std::shared_ptr(new VertexShader("Shaders/Skybox.vert.glsl"))); m_ShaderProgramSkybox.AddShader(std::shared_ptr(new FragmentShader("Shaders/Skybox.frag.glsl"))); m_ShaderProgramSkybox.Compile(); - m_ShaderProgramSkybox.Link();*/ + m_ShaderProgramSkybox.Link(); m_SunPassProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/SunPass.vert.glsl"))); m_SunPassProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/SunPass.frag.glsl"))); @@ -156,6 +156,7 @@ void Renderer::LoadContent() FrameBufferTextures(); m_sphereModel = ResourceManager->Load("Model", "Models/Placeholders/PhysicsTest/Sphere.obj"); + m_Skybox = std::make_shared("Textures/Skybox/Sunset", "jpg"); } void Renderer::Draw(double dt) @@ -368,7 +369,7 @@ void Renderer::DrawWorld(RenderQueue &rq) // Clear G-buffer GLenum windowBuffClear[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 }; glDrawBuffers(4, windowBuffClear); - glClearColor(0.0f, 0.7f, 0.3f, 0.f); + glClearColor(115.f / 255, 192.f / 255, 255.f / 255, 0.f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Execute the first render stage which will fill out the internal buffers with data(??) @@ -400,6 +401,7 @@ void Renderer::DrawWorld(RenderQueue &rq) glCullFace(GL_FRONT); DrawLightScene(rq); + DrawSunLightScene(); /* Final pass @@ -436,8 +438,9 @@ void Renderer::Swap() void Renderer::DrawSkybox() { - glBindFramebuffer(GL_FRAMEBUFFER, 0); - glViewport(0, 0, m_Width, m_Height); + //glBindFramebuffer(GL_FRAMEBUFFER, 0); + //glViewport(0, 0, m_Width, m_Height); + //glScissor(0, 0, m_Width, m_Height); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); m_ShaderProgramSkybox.Bind(); @@ -483,12 +486,13 @@ void Renderer::DrawShadowMap(RenderQueue &rq) //Binds the FBO and sets the veiwport, witch in effect is how large the shadowmap is and what resolution it has. glBindFramebuffer(GL_FRAMEBUFFER, m_ShadowFrameBuffer); glViewport(0, 0, m_ShadowMapRes, m_ShadowMapRes); + glScissor(0, 0, m_ShadowMapRes, m_ShadowMapRes); glClear(GL_DEPTH_BUFFER_BIT); //glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //Creates the "camera" for the shadowmap from the direction of the sun. - glm::mat4 depthViewMatrix = glm::lookAt(m_SunPosition, m_SunTarget, glm::vec3(0, 1, 0)) * glm::translate(-m_Camera->Position() * glm::vec3(1, 1, 1)); + glm::mat4 depthViewMatrix = glm::lookAt(m_SunPosition, m_SunTarget, glm::vec3(0, 1, 0)) * glm::translate(m_Camera->Position() * glm::vec3(1, 1, 1)); //glm::mat4 depthViewMatrix = glm::lookAt(m_SunPosition, m_SunTarget, glm::vec3(0, 1, 0)) * glm::translate((-m_Camera->Position() + (glm::vec3(40.0) * -m_Camera->Forward())) * glm::vec3(1, 1, 1)); glm::mat4 depthCamera = m_SunProjection * depthViewMatrix; glm::mat4 MVP; @@ -505,7 +509,7 @@ void Renderer::DrawShadowMap(RenderQueue &rq) glm::mat4 modelMatrix = modelJob->ModelMatrix; MVP = depthCamera * modelMatrix; - glUniformMatrix4fv(glGetUniformLocation(m_FirstPassProgram.GetHandle(), "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); + glUniformMatrix4fv(glGetUniformLocation(m_ShaderProgramShadows.GetHandle(), "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); //glUniform3fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "SunDirection_cameraspace"), 1, glm::value_ptr(sunDirection_cameraview)); glBindVertexArray(modelJob->VAO); @@ -514,25 +518,6 @@ void Renderer::DrawShadowMap(RenderQueue &rq) continue; } } - for (auto tuple : ModelsToRender) - { - Model* model; - glm::mat4 modelMatrix; - bool shadow; - std::tie(model, modelMatrix, std::ignore, shadow) = tuple; - if (!shadow) - continue; - - MVP = depthCamera * modelMatrix; - glUniformMatrix4fv(glGetUniformLocation(m_ShaderProgramShadows.GetHandle(), "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); - - glBindVertexArray(model->VAO); - for (auto texGroup : model->TextureGroups) - { - glDrawArrays(GL_TRIANGLES, texGroup.StartIndex, texGroup.EndIndex - texGroup.StartIndex + 1); - } - } - } void Renderer::DrawDebugShadowMap() @@ -1001,12 +986,12 @@ void Renderer::DrawFBOScene(RenderQueue &rq) MVP = cameraMatrix * modelMatrix; depthMVP = depthCameraMatrix * modelMatrix; - glUniformMatrix4fv(glGetUniformLocation(ShaderProgramHandle, "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); - glUniformMatrix4fv(glGetUniformLocation(ShaderProgramHandle, "DepthMVP"), 1, GL_FALSE, glm::value_ptr(depthMVP)); - glUniformMatrix4fv(glGetUniformLocation(ShaderProgramHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); - glUniformMatrix4fv(glGetUniformLocation(ShaderProgramHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix())); - glUniformMatrix4fv(glGetUniformLocation(ShaderProgramHandle, "P"), 1, GL_FALSE, glm::value_ptr(cameraProjection)); - glUniform3fv(glGetUniformLocation(ShaderProgramHandle, "SunDirection_cameraspace"), 1, glm::value_ptr(sunDirection_cameraview)); + glUniformMatrix4fv(glGetUniformLocation(ShaderProgramHandle, "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); + glUniformMatrix4fv(glGetUniformLocation(ShaderProgramHandle, "DepthMVP"), 1, GL_FALSE, glm::value_ptr(depthMVP)); + glUniformMatrix4fv(glGetUniformLocation(ShaderProgramHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); + glUniformMatrix4fv(glGetUniformLocation(ShaderProgramHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(ShaderProgramHandle, "P"), 1, GL_FALSE, glm::value_ptr(cameraProjection)); + glUniform3fv(glGetUniformLocation(ShaderProgramHandle, "SunDirection_cameraspace"), 1, glm::value_ptr(sunDirection_cameraview)); glBindVertexArray(modelJob->VAO); glActiveTexture(GL_TEXTURE0); diff --git a/src/Shaders/Fragment.glsl b/src/Shaders/Fragment.glsl index e2b972d..51a2cf5 100755 --- a/src/Shaders/Fragment.glsl +++ b/src/Shaders/Fragment.glsl @@ -32,6 +32,8 @@ out vec4 frag_Specular; float Shadow(vec4 ShadowCoord, vec3 normal) { + return 1.0; + if (Input.ShadowCoord.x < 0.0 || Input.ShadowCoord.x > 1.0 || Input.ShadowCoord.y < 0.0 || Input.ShadowCoord.y > 1.0) return 0.9; @@ -43,7 +45,7 @@ float Shadow(vec4 ShadowCoord, vec3 normal) bias = clamp(bias, 0.0, 0.00003); //Fixed bias - //float bias = 0.0005; + bias = 0; if( texture(ShadowTexture, Input.ShadowCoord.xy).z < ShadowCoord.z + bias) {