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
760 glBindTexture(GL_TEXTURE_2D, _heightTextureID);760 glBindTexture(GL_TEXTURE_2D, _heightTextureID);
761 761
762 if (!cursor) {762 if (!cursor) {
763 DefaultMetavoxelRendererImplementation::getHeightfieldProgram().setUniformValue(763 int heightScaleLocation = DefaultMetavoxelRendererImplementation::getHeightScaleLocation();
764 DefaultMetavoxelRendererImplementation::getHeightScaleLocation(), 1.0f / _heightSize);764 int colorScaleLocation = DefaultMetavoxelRendererImplementation::getColorScaleLocation();
765 DefaultMetavoxelRendererImplementation::getHeightfieldProgram().setUniformValue(765 ProgramObject* program = &DefaultMetavoxelRendererImplementation::getHeightfieldProgram();
766 DefaultMetavoxelRendererImplementation::getColorScaleLocation(), (float)_heightSize / innerSize);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);
767 glActiveTexture(GL_TEXTURE1);778 glActiveTexture(GL_TEXTURE1);
768 glBindTexture(GL_TEXTURE_2D, _colorTextureID);779 glBindTexture(GL_TEXTURE_2D, _colorTextureID);
769 }780 }
@@ -858,6 +869,35 @@ void DefaultMetavoxelRendererImplementation::init() { · 88 unmodified lines
858 _colorScaleLocation = _heightfieldProgram.uniformLocation("colorScale");869 _colorScaleLocation = _heightfieldProgram.uniformLocation("colorScale");
859 _heightfieldProgram.release();870 _heightfieldProgram.release();
860 871
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
861 _heightfieldCursorProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +901 _heightfieldCursorProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +
862 "shaders/metavoxel_heightfield_cursor.vert");902 "shaders/metavoxel_heightfield_cursor.vert");
863 _heightfieldCursorProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() +903 _heightfieldCursorProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() +
@@ -1394,15 +1434,34 @@ void DefaultMetavoxelRendererImplementation::render(MetavoxelData& data, Metavox · 530 unmodified lines
1394 1434
1395 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);1435 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
1396 1436
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();
1398 1453
1399 glEnableClientState(GL_TEXTURE_COORD_ARRAY);1454 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1400 1455
1401 BufferRenderVisitor heightfieldRenderVisitor(Application::getInstance()->getMetavoxels()->getHeightfieldBufferAttribute());1456 BufferRenderVisitor heightfieldRenderVisitor(Application::getInstance()->getMetavoxels()->getHeightfieldBufferAttribute());
1402 data.guide(heightfieldRenderVisitor);1457 data.guide(heightfieldRenderVisitor);
1403 1458
1404 _heightfieldProgram.release();1459 program->release();
1405 1460
1461 glActiveTexture(GL_TEXTURE2);
1462 glBindTexture(GL_TEXTURE_2D, 0);
1463 glActiveTexture(GL_TEXTURE0);
1464
1406 glDisableClientState(GL_TEXTURE_COORD_ARRAY);1465 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1407 glDisableClientState(GL_VERTEX_ARRAY);1466 glDisableClientState(GL_VERTEX_ARRAY);
1408 1467
@@ -1416,6 +1475,13 @@ int DefaultMetavoxelRendererImplementation::_pointScaleLocation; · 7 unmodified lines
1416ProgramObject DefaultMetavoxelRendererImplementation::_heightfieldProgram;1475ProgramObject DefaultMetavoxelRendererImplementation::_heightfieldProgram;
1417int DefaultMetavoxelRendererImplementation::_heightScaleLocation;1476int DefaultMetavoxelRendererImplementation::_heightScaleLocation;
1418int DefaultMetavoxelRendererImplementation::_colorScaleLocation;1477int DefaultMetavoxelRendererImplementation::_colorScaleLocation;
1478ProgramObject DefaultMetavoxelRendererImplementation::_shadowMapHeightfieldProgram;
1479int DefaultMetavoxelRendererImplementation::_shadowMapHeightScaleLocation;
1480int DefaultMetavoxelRendererImplementation::_shadowMapColorScaleLocation;
1481ProgramObject DefaultMetavoxelRendererImplementation::_cascadedShadowMapHeightfieldProgram;
1482int DefaultMetavoxelRendererImplementation::_cascadedShadowMapHeightScaleLocation;
1483int DefaultMetavoxelRendererImplementation::_cascadedShadowMapColorScaleLocation;
1484int DefaultMetavoxelRendererImplementation::_shadowDistancesLocation;
1419ProgramObject DefaultMetavoxelRendererImplementation::_heightfieldCursorProgram;1485ProgramObject DefaultMetavoxelRendererImplementation::_heightfieldCursorProgram;
1420 1486
1421static void enableClipPlane(GLenum plane, float x, float y, float z, float w) {1487static void enableClipPlane(GLenum plane, float x, float y, float z, float w) {