diff --git a/testbed/shaders/phong.frag b/testbed/shaders/phong.frag index bb6354e0..565df414 100644 --- a/testbed/shaders/phong.frag +++ b/testbed/shaders/phong.frag @@ -70,15 +70,19 @@ void main() { vec3 specular = light0SpecularColor * specularFactor; // Compute shadow factor - float shadowBias = 0.005; + float bias = 0.00001; + float shadowBias = -0.000; vec4 shadowMapUV = shadowMapCoords; shadowMapUV.z -= shadowBias; vec4 shadowMapCoordsOverW = shadowMapUV / shadowMapUV.w ; - float distanceInShadowMap = texture(shadowMapSampler, shadowMapCoordsOverW.xy).r; + float distanceInShadowMap = texture(shadowMapSampler, shadowMapCoordsOverW.xy).r + bias; float shadow = 0.0; if (shadowMapCoords.w > 0) { shadow = distanceInShadowMap < shadowMapCoordsOverW.z ? 0.5 : 1.0; } + if (abs(dot(N, L0)) < 0.01) { + shadow = 0.5; + } // Compute the final color color = vec4(ambient + shadow * vertexColor.rgb, 1.0); diff --git a/testbed/src/Gui.cpp b/testbed/src/Gui.cpp index c7619add..290bca0d 100644 --- a/testbed/src/Gui.cpp +++ b/testbed/src/Gui.cpp @@ -135,11 +135,39 @@ void Gui::displayLeftPane() { app.mWindowToFramebufferRatio.x * LEFT_PANE_WIDTH, app.mWindowToFramebufferRatio.y * LEFT_PANE_HEADER_HEIGHT, &scrollarea); + // ------ Header ----- // + + imguiHorizontalSpace(10); + imguiVerticalSpace(20); + imguiStartLine(); + + const int button_width = 150; + + // Play/Pause + if (imguiButton(app.mTimer.isRunning() ? "Pause" : "Play", true, button_width)) { + app.togglePlayPauseSimulation(); + } + imguiHorizontalSpace(5); + + // Step + if (imguiButton("Step", !app.mTimer.isRunning(), button_width)) { + app.toggleTakeSinglePhysicsStep(); + } + imguiHorizontalSpace(5); + + // Restart + if (imguiButton("Restart", true, button_width)) { + app.restartSimulation(); + } + + imguiEndLine(); + imguiSeparatorLine(); imguiVerticalSpace(5); imguiStartLine(); - // ----- Left Pane Header ----- // + // ----- Left Pane Tabs ----- // + int widthButton = app.mWindowToFramebufferRatio.x * LEFT_PANE_WIDTH / 4.3; if (imguiButton("Scenes", true, widthButton)) { mLeftPane = SCENES; @@ -323,7 +351,7 @@ void Gui::render() { - app.mWindowToFramebufferRatio.y * mScrollY); resetScroll(); - displayHeader(); + //displayHeader(); displayLeftPane(); imguiEndFrame(); diff --git a/testbed/src/SceneDemo.cpp b/testbed/src/SceneDemo.cpp index 52f4fe8a..5fc1a37f 100644 --- a/testbed/src/SceneDemo.cpp +++ b/testbed/src/SceneDemo.cpp @@ -44,7 +44,7 @@ SceneDemo::SceneDemo(const std::string& name, float sceneRadius) : Scene(name), mShadowMapLightCamera.rotateLocal(Vector3(1, 0, 0), -PI / 4.0f); mShadowMapLightCamera.setDimensions(SHADOWMAP_WIDTH, SHADOWMAP_HEIGHT); mShadowMapLightCamera.setFieldOfView(70.0f); - mShadowMapLightCamera.setSceneRadius(200); + mShadowMapLightCamera.setSceneRadius(100); //mShadowMapLightCamera.setZoom(1.0); @@ -76,6 +76,9 @@ void SceneDemo::render() { // ---------- Render the scene to generate the shadow map (first pass) ----------- // + //glEnable(GL_POLYGON_OFFSET_FILL); + //glPolygonOffset(8.0, 4.0); + // Culling switching, rendering only backface, this is done to avoid self-shadowing glCullFace(GL_BACK); @@ -109,6 +112,8 @@ void SceneDemo::render() { mFBOShadowMap.unbind(); + glDisable(GL_POLYGON_OFFSET_FILL); + // ---------- Render the scene for final rendering (second pass) ----------- //