diff --git a/common/lc_context.cpp b/common/lc_context.cpp index 1a67282a..0e290459 100644 --- a/common/lc_context.cpp +++ b/common/lc_context.cpp @@ -48,13 +48,15 @@ lcContext::lcContext() mViewMatrix = lcMatrix44Identity(); mProjectionMatrix = lcMatrix44Identity(); mViewProjectionMatrix = lcMatrix44Identity(); - mHighlightColor = lcVector4(0.0f, 0.0f, 0.0f, 0.0f); + mHighlightParams[0] = lcVector4(0.0f, 0.0f, 0.0f, 0.0f); + mHighlightParams[1] = lcVector4(0.0f, 0.0f, 0.0f, 0.0f); + mHighlightParams[2] = lcVector4(0.0f, 0.0f, 0.0f, 0.0f); mColorDirty = false; mWorldMatrixDirty = false; mViewMatrixDirty = false; mProjectionMatrixDirty = false; mViewProjectionMatrixDirty = false; - mHighlightColorDirty = false; + mHighlightParamsDirty = false; mMaterialType = LC_NUM_MATERIALS; } @@ -204,7 +206,7 @@ void lcContext::CreateShaderPrograms() mPrograms[MaterialType].MaterialColorLocation = glGetUniformLocation(Program, "MaterialColor"); mPrograms[MaterialType].LightPositionLocation = glGetUniformLocation(Program, "LightPosition"); mPrograms[MaterialType].EyePositionLocation = glGetUniformLocation(Program, "EyePosition"); - mPrograms[MaterialType].HighlightColorLocation = glGetUniformLocation(Program, "HighlightColor"); + mPrograms[MaterialType].HighlightParamsLocation = glGetUniformLocation(Program, "HighlightParams"); } } @@ -333,7 +335,7 @@ void lcContext::SetMaterial(lcMaterialType MaterialType) mColorDirty = true; mWorldMatrixDirty = true; // todo: change dirty to a bitfield and set the lighting constants dirty here mViewMatrixDirty = true; - mHighlightColorDirty = true; + mHighlightParamsDirty = true; } else { @@ -1174,10 +1176,10 @@ void lcContext::FlushState() mColorDirty = false; } - if (mHighlightColorDirty && Program.HighlightColorLocation != -1) + if (mHighlightParamsDirty && Program.HighlightParamsLocation != -1) { - glUniform4fv(Program.HighlightColorLocation, 1, mHighlightColor); - mHighlightColorDirty = false; + glUniform4fv(Program.HighlightParamsLocation, 2, mHighlightParams[0]); + mHighlightParamsDirty = false; } } else diff --git a/common/lc_context.h b/common/lc_context.h index fc978fbd..ccfcd848 100644 --- a/common/lc_context.h +++ b/common/lc_context.h @@ -73,7 +73,7 @@ struct lcProgram GLint MaterialColorLocation; GLint LightPositionLocation; GLint EyePositionLocation; - GLint HighlightColorLocation; + GLint HighlightParamsLocation; }; class lcFramebuffer @@ -153,10 +153,11 @@ public: mColorDirty = true; } - void SetHighlightColor(const lcVector4& HighlightColor) + void SetHighlightParams(const lcVector4& HighlightMin, const lcVector4& HighlightMax) { - mHighlightColor = HighlightColor; - mHighlightColorDirty = true; + mHighlightParams[0] = HighlightMin; + mHighlightParams[1] = HighlightMax; + mHighlightParamsDirty = true; } void SetColor(float Red, float Green, float Blue, float Alpha); @@ -226,13 +227,13 @@ protected: lcMatrix44 mViewMatrix; lcMatrix44 mProjectionMatrix; lcMatrix44 mViewProjectionMatrix; - lcVector4 mHighlightColor; + lcVector4 mHighlightParams[3]; bool mColorDirty; bool mWorldMatrixDirty; bool mViewMatrixDirty; bool mProjectionMatrixDirty; bool mViewProjectionMatrixDirty; - bool mHighlightColorDirty; + bool mHighlightParamsDirty; GLuint mFramebufferObject; diff --git a/common/lc_viewsphere.cpp b/common/lc_viewsphere.cpp index c49532f8..c699ed92 100644 --- a/common/lc_viewsphere.cpp +++ b/common/lc_viewsphere.cpp @@ -179,13 +179,28 @@ void lcViewSphere::Draw() Context->SetVertexFormatPosition(3); Context->SetIndexBuffer(mIndexBuffer); - Context->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - Context->SetHighlightColor(lcVector4(0.0f, 0.0f, 0.0f, 1.0f)); + Context->SetHighlightParams(lcVector4(10.0f, 10.0f, 10.0f, 0.0f), lcVector4(-10.0f, -10.0f, -10.0f, 0.0f)); Context->DrawIndexedPrimitives(GL_TRIANGLES, mSubdivisions * mSubdivisions * 6 * 6, GL_UNSIGNED_SHORT, 0); if (mIntersectionFlags.any()) { - Context->SetHighlightColor(lcVector4(1.0, 0, 0, 1.0)); + lcVector4 HighlightMin(-10.0f, -10.0f, -10.0f, 0.0f), HighlightMax(10.0f, 10.0f, 10.0f, 0.0f); + + for (int AxisIdx = 0; AxisIdx < 3; AxisIdx++) + { + if (mIntersectionFlags.test(2 * AxisIdx)) + { + HighlightMin[AxisIdx] = 0.5f; + HighlightMax[AxisIdx] = 10.0f; + } + else if (mIntersectionFlags.test(2 * AxisIdx + 1)) + { + HighlightMin[AxisIdx] = -10.0f; + HighlightMax[AxisIdx] = -0.5f; + } + } + + Context->SetHighlightParams(HighlightMin, HighlightMax); for (int FlagIdx = 0; FlagIdx < 6; FlagIdx++) { diff --git a/resources/shaders/unlit_view_sphere_ps.glsl b/resources/shaders/unlit_view_sphere_ps.glsl index c401fecc..17d10efd 100644 --- a/resources/shaders/unlit_view_sphere_ps.glsl +++ b/resources/shaders/unlit_view_sphere_ps.glsl @@ -1,12 +1,20 @@ LC_PIXEL_INPUT vec3 PixelNormal; LC_PIXEL_OUTPUT -uniform mediump vec4 MaterialColor; -uniform mediump vec4 HighlightColor; +uniform mediump vec4 HighlightParams[2]; uniform samplerCube Texture; +const mediump vec4 TextColor = vec4(0.0, 0.0, 0.0, 1.0); +const mediump vec4 BackgroundColor = vec4(1.0, 1.0, 1.0, 1.0); +const mediump vec4 HighlightColor = vec4(1.0, 0.0, 0.0, 1.0); + void main() { LC_SHADER_PRECISION float TexelAlpha = textureCube(Texture, PixelNormal).a; - gl_FragColor = mix(MaterialColor, HighlightColor, TexelAlpha); + + if (PixelNormal.x > HighlightParams[0].x && PixelNormal.y > HighlightParams[0].y && PixelNormal.z > HighlightParams[0].z && + PixelNormal.x < HighlightParams[1].x && PixelNormal.y < HighlightParams[1].y && PixelNormal.z < HighlightParams[1].z) + gl_FragColor = mix(HighlightColor, TextColor, TexelAlpha); + else + gl_FragColor = mix(BackgroundColor, TextColor, TexelAlpha); }