History

Support for shadows on heightmaps.

Andrzej Kapolka committed 12 years ago

Commit 668f6d31 parent 28abc6a6 files · +190 −13Browse files

Showing the changes to interface/src/MetavoxelSystem.cpp (1 of 6 files). Show all

Unified · Split

interface/src/MetavoxelSystem.cpp+72−6
@@ -760,10 +760,21 @@ void HeightfieldBuffer::render(bool cursor) { · 759 unmodified lines
760760 glBindTexture(GL_TEXTURE_2D, _heightTextureID);
761761
762762 if (!cursor) {
763− DefaultMetavoxelRendererImplementation::getHeightfieldProgram().setUniformValue(
764− DefaultMetavoxelRendererImplementation::getHeightScaleLocation(), 1.0f / _heightSize);
765− DefaultMetavoxelRendererImplementation::getHeightfieldProgram().setUniformValue(
766− DefaultMetavoxelRendererImplementation::getColorScaleLocation(), (float)_heightSize / innerSize);
763+ int heightScaleLocation = DefaultMetavoxelRendererImplementation::getHeightScaleLocation();
764+ int colorScaleLocation = DefaultMetavoxelRendererImplementation::getColorScaleLocation();
765+ ProgramObject* program = &DefaultMetavoxelRendererImplementation::getHeightfieldProgram();
766+ if (Menu::getInstance()->isOptionChecked(MenuOption::SimpleShadows)) {
767+ heightScaleLocation = DefaultMetavoxelRendererImplementation::getShadowMapHeightScaleLocation();
768+ colorScaleLocation = DefaultMetavoxelRendererImplementation::getShadowMapColorScaleLocation();
769+ program = &DefaultMetavoxelRendererImplementation::getShadowMapHeightfieldProgram();
770+
771+ } else if (Menu::getInstance()->isOptionChecked(MenuOption::CascadedShadows)) {
772+ heightScaleLocation = DefaultMetavoxelRendererImplementation::getCascadedShadowMapHeightScaleLocation();
773+ colorScaleLocation = DefaultMetavoxelRendererImplementation::getCascadedShadowMapColorScaleLocation();
774+ program = &DefaultMetavoxelRendererImplementation::getCascadedShadowMapHeightfieldProgram();
775+ }
776+ program->setUniformValue(heightScaleLocation, 1.0f / _heightSize);
777+ program->setUniformValue(colorScaleLocation, (float)_heightSize / innerSize);
767778 glActiveTexture(GL_TEXTURE1);
768779 glBindTexture(GL_TEXTURE_2D, _colorTextureID);
769780 }
@@ -858,6 +869,35 @@ void DefaultMetavoxelRendererImplementation::init() { · 88 unmodified lines
858869 _colorScaleLocation = _heightfieldProgram.uniformLocation("colorScale");
859870 _heightfieldProgram.release();
860871
872+ _shadowMapHeightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +
873+ "shaders/metavoxel_heightfield.vert");
874+ _shadowMapHeightfieldProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() +
875+ "shaders/metavoxel_heightfield_shadow_map.frag");
876+ _shadowMapHeightfieldProgram.link();
877+
878+ _shadowMapHeightfieldProgram.bind();
879+ _shadowMapHeightfieldProgram.setUniformValue("heightMap", 0);
880+ _shadowMapHeightfieldProgram.setUniformValue("diffuseMap", 1);
881+ _shadowMapHeightfieldProgram.setUniformValue("shadowMap", 2);
882+ _shadowMapHeightScaleLocation = _shadowMapHeightfieldProgram.uniformLocation("heightScale");
883+ _shadowMapColorScaleLocation = _shadowMapHeightfieldProgram.uniformLocation("colorScale");
884+ _shadowMapHeightfieldProgram.release();
885+
886+ _cascadedShadowMapHeightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +
887+ "shaders/metavoxel_heightfield.vert");
888+ _cascadedShadowMapHeightfieldProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() +
889+ "shaders/metavoxel_heightfield_cascaded_shadow_map.frag");
890+ _cascadedShadowMapHeightfieldProgram.link();
891+
892+ _cascadedShadowMapHeightfieldProgram.bind();
893+ _cascadedShadowMapHeightfieldProgram.setUniformValue("heightMap", 0);
894+ _cascadedShadowMapHeightfieldProgram.setUniformValue("diffuseMap", 1);
895+ _cascadedShadowMapHeightfieldProgram.setUniformValue("shadowMap", 2);
896+ _cascadedShadowMapHeightScaleLocation = _cascadedShadowMapHeightfieldProgram.uniformLocation("heightScale");
897+ _cascadedShadowMapColorScaleLocation = _cascadedShadowMapHeightfieldProgram.uniformLocation("colorScale");
898+ _shadowDistancesLocation = _cascadedShadowMapHeightfieldProgram.uniformLocation("shadowDistances");
899+ _cascadedShadowMapHeightfieldProgram.release();
900+
861901 _heightfieldCursorProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +
862902 "shaders/metavoxel_heightfield_cursor.vert");
863903 _heightfieldCursorProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() +
@@ -1394,15 +1434,34 @@ void DefaultMetavoxelRendererImplementation::render(MetavoxelData& data, Metavox · 530 unmodified lines
13941434
13951435 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
13961436
1397− _heightfieldProgram.bind();
1437+ ProgramObject* program = &_heightfieldProgram;
1438+ if (Menu::getInstance()->getShadowsEnabled()) {
1439+ if (Menu::getInstance()->isOptionChecked(MenuOption::CascadedShadows)) {
1440+ program = &_cascadedShadowMapHeightfieldProgram;
1441+ program->bind();
1442+ program->setUniform(_shadowDistancesLocation, Application::getInstance()->getShadowDistances());
1443+
1444+ } else {
1445+ program = &_shadowMapHeightfieldProgram;
1446+ }
1447+ glActiveTexture(GL_TEXTURE2);
1448+ glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getShadowDepthTextureID());
1449+ glActiveTexture(GL_TEXTURE0);
1450+ }
1451+
1452+ program->bind();
13981453
13991454 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
14001455
14011456 BufferRenderVisitor heightfieldRenderVisitor(Application::getInstance()->getMetavoxels()->getHeightfieldBufferAttribute());
14021457 data.guide(heightfieldRenderVisitor);
14031458
1404− _heightfieldProgram.release();
1459+ program->release();
14051460
1461+ glActiveTexture(GL_TEXTURE2);
1462+ glBindTexture(GL_TEXTURE_2D, 0);
1463+ glActiveTexture(GL_TEXTURE0);
1464+
14061465 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
14071466 glDisableClientState(GL_VERTEX_ARRAY);
14081467
@@ -1416,6 +1475,13 @@ int DefaultMetavoxelRendererImplementation::_pointScaleLocation; · 7 unmodified lines
14161475 ProgramObject DefaultMetavoxelRendererImplementation::_heightfieldProgram;
14171476 int DefaultMetavoxelRendererImplementation::_heightScaleLocation;
14181477 int DefaultMetavoxelRendererImplementation::_colorScaleLocation;
1478+ProgramObject DefaultMetavoxelRendererImplementation::_shadowMapHeightfieldProgram;
1479+int DefaultMetavoxelRendererImplementation::_shadowMapHeightScaleLocation;
1480+int DefaultMetavoxelRendererImplementation::_shadowMapColorScaleLocation;
1481+ProgramObject DefaultMetavoxelRendererImplementation::_cascadedShadowMapHeightfieldProgram;
1482+int DefaultMetavoxelRendererImplementation::_cascadedShadowMapHeightScaleLocation;
1483+int DefaultMetavoxelRendererImplementation::_cascadedShadowMapColorScaleLocation;
1484+int DefaultMetavoxelRendererImplementation::_shadowDistancesLocation;
14191485 ProgramObject DefaultMetavoxelRendererImplementation::_heightfieldCursorProgram;
14201486
14211487 static void enableClipPlane(GLenum plane, float x, float y, float z, float w) {