Showing the changes to interface/src/MetavoxelSystem.cpp (1 of 14 files). Show all
Unified · Split
| @@ -602,24 +602,23 @@ const int HeightfieldBuffer::SHARED_EDGE = 1; · 601 unmodified lines | ||
| 602 | 602 | const int HeightfieldBuffer::HEIGHT_EXTENSION = 2 * HeightfieldBuffer::HEIGHT_BORDER + HeightfieldBuffer::SHARED_EDGE; |
| 603 | 603 | |
| 604 | 604 | HeightfieldBuffer::HeightfieldBuffer(const glm::vec3& translation, float scale, |
| 605 | − const QByteArray& height, const QByteArray& color, const QByteArray& texture) : | |
| 605 | + const QByteArray& height, const QByteArray& color, const QByteArray& texture, | |
| 606 | + const QVector<SharedObjectPointer>& textures) : | |
| 606 | 607 | _translation(translation), |
| 607 | 608 | _scale(scale), |
| 608 | 609 | _heightBounds(translation, translation + glm::vec3(scale, scale, scale)), |
| 609 | 610 | _colorBounds(_heightBounds), |
| 610 | − _textureBounds(_heightBounds), | |
| 611 | 611 | _height(height), |
| 612 | 612 | _color(color), |
| 613 | 613 | _texture(texture), |
| 614 | + _textures(textures), | |
| 614 | 615 | _heightTextureID(0), |
| 615 | 616 | _colorTextureID(0), |
| 616 | 617 | _textureTextureID(0), |
| 617 | 618 | _heightSize(glm::sqrt(height.size())), |
| 618 | 619 | _heightIncrement(scale / (_heightSize - HEIGHT_EXTENSION)), |
| 619 | 620 | _colorSize(glm::sqrt(color.size() / HeightfieldData::COLOR_BYTES)), |
| 620 | − _colorIncrement(scale / (_colorSize - SHARED_EDGE)), | |
| 621 | − _textureSize(glm::sqrt(texture.size())), | |
| 622 | − _textureIncrement(scale / (_textureSize - SHARED_EDGE)) { | |
| 621 | + _colorIncrement(scale / (_colorSize - SHARED_EDGE)) { | |
| 623 | 622 | |
| 624 | 623 | _heightBounds.minimum.x -= _heightIncrement * HEIGHT_BORDER; |
| 625 | 624 | _heightBounds.minimum.z -= _heightIncrement * HEIGHT_BORDER; |
| @@ -628,9 +627,6 @@ HeightfieldBuffer::HeightfieldBuffer(const glm::vec3& translation, float scale, · 2 unmodified lines | ||
| 628 | 627 | |
| 629 | 628 | _colorBounds.maximum.x += _colorIncrement * SHARED_EDGE; |
| 630 | 629 | _colorBounds.maximum.z += _colorIncrement * SHARED_EDGE; |
| 631 | − | |
| 632 | − _textureBounds.maximum.x += _textureIncrement * SHARED_EDGE; | |
| 633 | − _textureBounds.maximum.z += _textureIncrement * SHARED_EDGE; | |
| 634 | 630 | } |
| 635 | 631 | |
| 636 | 632 | HeightfieldBuffer::~HeightfieldBuffer() { |
| @@ -712,6 +708,15 @@ void HeightfieldBuffer::render(bool cursor) { · 75 unmodified lines | ||
| 712 | 708 | int textureSize = glm::sqrt(_texture.size()); |
| 713 | 709 | glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, textureSize, textureSize, 0, |
| 714 | 710 | GL_LUMINANCE, GL_UNSIGNED_BYTE, _texture.constData()); |
| 711 | + | |
| 712 | + _networkTextures.resize(_textures.size()); | |
| 713 | + for (int i = 0; i < _textures.size(); i++) { | |
| 714 | + const SharedObjectPointer texture = _textures.at(i); | |
| 715 | + if (texture) { | |
| 716 | + _networkTextures[i] = Application::getInstance()->getTextureCache()->getTexture( | |
| 717 | + static_cast<HeightfieldTexture*>(texture.data())->getURL()); | |
| 718 | + } | |
| 719 | + } | |
| 715 | 720 | } |
| 716 | 721 | } |
| 717 | 722 | // create the buffer objects lazily |
| @@ -780,7 +785,56 @@ void HeightfieldBuffer::render(bool cursor) { · 62 unmodified lines | ||
| 780 | 785 | |
| 781 | 786 | glBindTexture(GL_TEXTURE_2D, _heightTextureID); |
| 782 | 787 | |
| 783 | − if (!cursor) { | |
| 788 | + if (cursor) { | |
| 789 | + glDrawRangeElements(GL_TRIANGLES, 0, vertexCount - 1, indexCount, GL_UNSIGNED_INT, 0); | |
| 790 | + | |
| 791 | + } else if (!_textures.isEmpty()) { | |
| 792 | + DefaultMetavoxelRendererImplementation::getBaseHeightfieldProgram().bind(); | |
| 793 | + DefaultMetavoxelRendererImplementation::getBaseHeightfieldProgram().setUniformValue( | |
| 794 | + DefaultMetavoxelRendererImplementation::getBaseHeightScaleLocation(), 1.0f / _heightSize); | |
| 795 | + DefaultMetavoxelRendererImplementation::getBaseHeightfieldProgram().setUniformValue( | |
| 796 | + DefaultMetavoxelRendererImplementation::getBaseColorScaleLocation(), (float)_heightSize / innerSize); | |
| 797 | + glActiveTexture(GL_TEXTURE1); | |
| 798 | + glBindTexture(GL_TEXTURE_2D, _colorTextureID); | |
| 799 | + | |
| 800 | + glDrawRangeElements(GL_TRIANGLES, 0, vertexCount - 1, indexCount, GL_UNSIGNED_INT, 0); | |
| 801 | + | |
| 802 | + glDepthFunc(GL_LEQUAL); | |
| 803 | + glEnable(GL_BLEND); | |
| 804 | + glBlendFunc(GL_DST_COLOR, GL_ZERO); | |
| 805 | + glEnable(GL_POLYGON_OFFSET_FILL); | |
| 806 | + glPolygonOffset(-1.0f, -1.0f); | |
| 807 | + | |
| 808 | + glBindTexture(GL_TEXTURE_2D, 0); | |
| 809 | + | |
| 810 | + if (Menu::getInstance()->isOptionChecked(MenuOption::SimpleShadows)) { | |
| 811 | + DefaultMetavoxelRendererImplementation::getShadowLightHeightfieldProgram().bind(); | |
| 812 | + DefaultMetavoxelRendererImplementation::getShadowLightHeightfieldProgram().setUniformValue( | |
| 813 | + DefaultMetavoxelRendererImplementation::getShadowLightHeightScaleLocation(), 1.0f / _heightSize); | |
| 814 | + | |
| 815 | + } else if (Menu::getInstance()->isOptionChecked(MenuOption::CascadedShadows)) { | |
| 816 | + DefaultMetavoxelRendererImplementation::getCascadedShadowLightHeightfieldProgram().bind(); | |
| 817 | + DefaultMetavoxelRendererImplementation::getCascadedShadowLightHeightfieldProgram().setUniformValue( | |
| 818 | + DefaultMetavoxelRendererImplementation::getCascadedShadowLightHeightScaleLocation(), 1.0f / _heightSize); | |
| 819 | + | |
| 820 | + } else { | |
| 821 | + DefaultMetavoxelRendererImplementation::getLightHeightfieldProgram().bind(); | |
| 822 | + DefaultMetavoxelRendererImplementation::getLightHeightfieldProgram().setUniformValue( | |
| 823 | + DefaultMetavoxelRendererImplementation::getBaseHeightScaleLocation(), 1.0f / _heightSize); | |
| 824 | + } | |
| 825 | + | |
| 826 | + glDrawRangeElements(GL_TRIANGLES, 0, vertexCount - 1, indexCount, GL_UNSIGNED_INT, 0); | |
| 827 | + | |
| 828 | + DefaultMetavoxelRendererImplementation::getHeightfieldProgram().bind(); | |
| 829 | + | |
| 830 | + glDisable(GL_POLYGON_OFFSET_FILL); | |
| 831 | + glDisable(GL_BLEND); | |
| 832 | + glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); | |
| 833 | + glDepthFunc(GL_LESS); | |
| 834 | + | |
| 835 | + glActiveTexture(GL_TEXTURE0); | |
| 836 | + | |
| 837 | + } else { | |
| 784 | 838 | int heightScaleLocation = DefaultMetavoxelRendererImplementation::getHeightScaleLocation(); |
| 785 | 839 | int colorScaleLocation = DefaultMetavoxelRendererImplementation::getColorScaleLocation(); |
| 786 | 840 | ProgramObject* program = &DefaultMetavoxelRendererImplementation::getHeightfieldProgram(); |
| @@ -798,11 +852,9 @@ void HeightfieldBuffer::render(bool cursor) { · 11 unmodified lines | ||
| 798 | 852 | program->setUniformValue(colorScaleLocation, (float)_heightSize / innerSize); |
| 799 | 853 | glActiveTexture(GL_TEXTURE1); |
| 800 | 854 | glBindTexture(GL_TEXTURE_2D, _colorTextureID); |
| 801 | − } | |
| 802 | − | |
| 803 | − glDrawRangeElements(GL_TRIANGLES, 0, vertexCount - 1, indexCount, GL_UNSIGNED_INT, 0); | |
| 804 | − | |
| 805 | − if (!cursor) { | |
| 855 | + | |
| 856 | + glDrawRangeElements(GL_TRIANGLES, 0, vertexCount - 1, indexCount, GL_UNSIGNED_INT, 0); | |
| 857 | + | |
| 806 | 858 | glBindTexture(GL_TEXTURE_2D, 0); |
| 807 | 859 | glActiveTexture(GL_TEXTURE0); |
| 808 | 860 | } |
| @@ -919,6 +971,68 @@ void DefaultMetavoxelRendererImplementation::init() { · 110 unmodified lines | ||
| 919 | 971 | _shadowDistancesLocation = _cascadedShadowMapHeightfieldProgram.uniformLocation("shadowDistances"); |
| 920 | 972 | _cascadedShadowMapHeightfieldProgram.release(); |
| 921 | 973 | |
| 974 | + _baseHeightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() + | |
| 975 | + "shaders/metavoxel_heightfield_base.vert"); | |
| 976 | + _baseHeightfieldProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() + | |
| 977 | + "shaders/metavoxel_heightfield_base.frag"); | |
| 978 | + _baseHeightfieldProgram.link(); | |
| 979 | + | |
| 980 | + _baseHeightfieldProgram.bind(); | |
| 981 | + _baseHeightfieldProgram.setUniformValue("heightMap", 0); | |
| 982 | + _baseHeightfieldProgram.setUniformValue("diffuseMap", 1); | |
| 983 | + _baseHeightScaleLocation = _heightfieldProgram.uniformLocation("heightScale"); | |
| 984 | + _baseColorScaleLocation = _heightfieldProgram.uniformLocation("colorScale"); | |
| 985 | + _baseHeightfieldProgram.release(); | |
| 986 | + | |
| 987 | + _splatHeightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() + | |
| 988 | + "shaders/metavoxel_heightfield_splat.vert"); | |
| 989 | + _splatHeightfieldProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() + | |
| 990 | + "shaders/metavoxel_heightfield_splat.frag"); | |
| 991 | + _splatHeightfieldProgram.link(); | |
| 992 | + | |
| 993 | + _splatHeightfieldProgram.bind(); | |
| 994 | + _splatHeightfieldProgram.setUniformValue("heightMap", 0); | |
| 995 | + _splatHeightfieldProgram.setUniformValue("diffuseMap", 1); | |
| 996 | + _splatHeightScaleLocation = _splatHeightfieldProgram.uniformLocation("heightScale"); | |
| 997 | + _splatTextureScaleLocation = _splatHeightfieldProgram.uniformLocation("textureScale"); | |
| 998 | + _splatHeightfieldProgram.release(); | |
| 999 | + | |
| 1000 | + _lightHeightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() + | |
| 1001 | + "shaders/metavoxel_heightfield_light.vert"); | |
| 1002 | + _lightHeightfieldProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() + | |
| 1003 | + "shaders/metavoxel_heightfield_light.frag"); | |
| 1004 | + _lightHeightfieldProgram.link(); | |
| 1005 | + | |
| 1006 | + _lightHeightfieldProgram.bind(); | |
| 1007 | + _lightHeightfieldProgram.setUniformValue("heightMap", 0); | |
| 1008 | + _lightHeightScaleLocation = _lightHeightfieldProgram.uniformLocation("heightScale"); | |
| 1009 | + _lightHeightfieldProgram.release(); | |
| 1010 | + | |
| 1011 | + _shadowLightHeightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() + | |
| 1012 | + "shaders/metavoxel_heightfield_light.vert"); | |
| 1013 | + _shadowLightHeightfieldProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() + | |
| 1014 | + "shaders/metavoxel_heightfield_light_shadow_map.frag"); | |
| 1015 | + _shadowLightHeightfieldProgram.link(); | |
| 1016 | + | |
| 1017 | + _shadowLightHeightfieldProgram.bind(); | |
| 1018 | + _shadowLightHeightfieldProgram.setUniformValue("heightMap", 0); | |
| 1019 | + _shadowLightHeightfieldProgram.setUniformValue("shadowMap", 2); | |
| 1020 | + _shadowLightHeightScaleLocation = _shadowLightHeightfieldProgram.uniformLocation("heightScale"); | |
| 1021 | + _shadowLightHeightfieldProgram.release(); | |
| 1022 | + | |
| 1023 | + _cascadedShadowLightHeightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() + | |
| 1024 | + "shaders/metavoxel_heightfield_light.vert"); | |
| 1025 | + _cascadedShadowLightHeightfieldProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() + | |
| 1026 | + "shaders/metavoxel_heightfield_light_cascaded_shadow_map.frag"); | |
| 1027 | + _cascadedShadowLightHeightfieldProgram.link(); | |
| 1028 | + | |
| 1029 | + _cascadedShadowLightHeightfieldProgram.bind(); | |
| 1030 | + _cascadedShadowLightHeightfieldProgram.setUniformValue("heightMap", 0); | |
| 1031 | + _cascadedShadowLightHeightfieldProgram.setUniformValue("shadowMap", 2); | |
| 1032 | + _cascadedShadowLightHeightScaleLocation = _cascadedShadowLightHeightfieldProgram.uniformLocation("heightScale"); | |
| 1033 | + _shadowLightDistancesLocation = _cascadedShadowLightHeightfieldProgram.uniformLocation("shadowDistances"); | |
| 1034 | + _cascadedShadowLightHeightfieldProgram.release(); | |
| 1035 | + | |
| 922 | 1036 | _heightfieldCursorProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() + |
| 923 | 1037 | "shaders/metavoxel_heightfield_cursor.vert"); |
| 924 | 1038 | _heightfieldCursorProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() + |
| @@ -1019,8 +1133,7 @@ private: · 94 unmodified lines | ||
| 1019 | 1133 | |
| 1020 | 1134 | HeightfieldFetchVisitor::HeightfieldFetchVisitor(const MetavoxelLOD& lod, const QVector<Box>& intersections) : |
| 1021 | 1135 | MetavoxelVisitor(QVector<AttributePointer>() << AttributeRegistry::getInstance()->getHeightfieldAttribute() << |
| 1022 | − AttributeRegistry::getInstance()->getHeightfieldColorAttribute() << | |
| 1023 | − AttributeRegistry::getInstance()->getHeightfieldTextureAttribute(), QVector<AttributePointer>(), lod), | |
| 1136 | + AttributeRegistry::getInstance()->getHeightfieldColorAttribute(), QVector<AttributePointer>(), lod), | |
| 1024 | 1137 | _intersections(intersections) { |
| 1025 | 1138 | } |
| 1026 | 1139 | |
| @@ -1135,50 +1248,6 @@ int HeightfieldFetchVisitor::visit(MetavoxelInfo& info) { · 108 unmodified lines | ||
| 1135 | 1248 | } |
| 1136 | 1249 | } |
| 1137 | 1250 | } |
| 1138 | − | |
| 1139 | − int textureSize = _buffer->getTextureSize(); | |
| 1140 | − if (textureSize == 0) { | |
| 1141 | − continue; | |
| 1142 | − } | |
| 1143 | − HeightfieldTextureDataPointer texture = info.inputValues.at(2).getInlineValue<HeightfieldTextureDataPointer>(); | |
| 1144 | − if (!texture) { | |
| 1145 | − continue; | |
| 1146 | − } | |
| 1147 | − const Box& textureBounds = _buffer->getTextureBounds(); | |
| 1148 | − overlap = textureBounds.getIntersection(overlap); | |
| 1149 | − float textureIncrement = _buffer->getTextureIncrement(); | |
| 1150 | − destX = (overlap.minimum.x - textureBounds.minimum.x) / textureIncrement; | |
| 1151 | − destY = (overlap.minimum.z - textureBounds.minimum.z) / textureIncrement; | |
| 1152 | − destWidth = glm::ceil((overlap.maximum.x - overlap.minimum.x) / textureIncrement); | |
| 1153 | − destHeight = glm::ceil((overlap.maximum.z - overlap.minimum.z) / textureIncrement); | |
| 1154 | − dest = _buffer->getTexture().data() + destY * textureSize + destX; | |
| 1155 | − | |
| 1156 | − const QByteArray& srcTexture = texture->getContents(); | |
| 1157 | − srcSize = glm::sqrt(srcTexture.size()); | |
| 1158 | − srcIncrement = info.size / srcSize; | |
| 1159 | − | |
| 1160 | − if (srcIncrement == textureIncrement) { | |
| 1161 | − // easy case: same resolution | |
| 1162 | − int srcX = (overlap.minimum.x - info.minimum.x) / srcIncrement; | |
| 1163 | − int srcY = (overlap.minimum.z - info.minimum.z) / srcIncrement; | |
| 1164 | − | |
| 1165 | − const char* src = srcTexture.constData() + srcY * srcSize + srcX; | |
| 1166 | − for (int y = 0; y < destHeight; y++, src += srcSize, dest += textureSize) { | |
| 1167 | − memcpy(dest, src, destWidth); | |
| 1168 | − } | |
| 1169 | − } else { | |
| 1170 | − // more difficult: different resolutions | |
| 1171 | − float srcX = (overlap.minimum.x - info.minimum.x) / srcIncrement; | |
| 1172 | − float srcY = (overlap.minimum.z - info.minimum.z) / srcIncrement; | |
| 1173 | − float srcAdvance = textureIncrement / srcIncrement; | |
| 1174 | − for (int y = 0; y < destHeight; y++, dest += textureSize, srcY += srcAdvance) { | |
| 1175 | − const char* src = srcTexture.constData() + (int)srcY * srcSize; | |
| 1176 | − float lineSrcX = srcX; | |
| 1177 | − for (char* lineDest = dest, *end = dest + destWidth; lineDest != end; lineDest++, lineSrcX += srcAdvance) { | |
| 1178 | − *lineDest = src[(int)lineSrcX]; | |
| 1179 | − } | |
| 1180 | − } | |
| 1181 | − } | |
| 1182 | 1251 | } |
| 1183 | 1252 | return STOP_RECURSION; |
| 1184 | 1253 | } |
| @@ -1233,42 +1302,43 @@ int HeightfieldRegionVisitor::visit(MetavoxelInfo& info) { · 48 unmodified lines | ||
| 1233 | 1302 | } |
| 1234 | 1303 | |
| 1235 | 1304 | HeightfieldTextureDataPointer texture = info.inputValues.at(2).getInlineValue<HeightfieldTextureDataPointer>(); |
| 1236 | − int textureContentsSize = 0; | |
| 1305 | + QByteArray textureContents; | |
| 1306 | + QVector<SharedObjectPointer> textures; | |
| 1237 | 1307 | if (texture) { |
| 1238 | − const QByteArray& textureContents = texture->getContents(); | |
| 1239 | − int textureSize = glm::sqrt(textureContents.size()); | |
| 1240 | − int extendedTextureSize = textureSize + HeightfieldBuffer::SHARED_EDGE; | |
| 1241 | − textureContentsSize = extendedTextureSize * extendedTextureSize; | |
| 1308 | + textureContents = texture->getContents(); | |
| 1309 | + textures = texture->getTextures(); | |
| 1242 | 1310 | } |
| 1243 | 1311 | |
| 1244 | 1312 | const HeightfieldBuffer* existingBuffer = static_cast<const HeightfieldBuffer*>( |
| 1245 | 1313 | info.inputValues.at(3).getInlineValue<BufferDataPointer>().data()); |
| 1246 | 1314 | Box bounds = info.getBounds(); |
| 1247 | 1315 | if (existingBuffer && existingBuffer->getHeight().size() == heightContentsSize && |
| 1248 | − existingBuffer->getColor().size() == colorContentsSize && | |
| 1249 | − existingBuffer->getTexture().size() == textureContentsSize) { | |
| 1316 | + existingBuffer->getColor().size() == colorContentsSize) { | |
| 1250 | 1317 | // we already have a buffer of the correct resolution |
| 1251 | 1318 | addRegion(bounds, existingBuffer->getHeightBounds()); |
| 1252 | − return STOP_RECURSION; | |
| 1319 | + buffer = new HeightfieldBuffer(info.minimum, info.size, existingBuffer->getHeight(), | |
| 1320 | + existingBuffer->getColor(), textureContents, textures); | |
| 1321 | + | |
| 1322 | + } else { | |
| 1323 | + // we must create a new buffer and update its borders | |
| 1324 | + buffer = new HeightfieldBuffer(info.minimum, info.size, QByteArray(heightContentsSize, 0), | |
| 1325 | + QByteArray(colorContentsSize, 0), textureContents, textures); | |
| 1326 | + const Box& heightBounds = buffer->getHeightBounds(); | |
| 1327 | + addRegion(bounds, heightBounds); | |
| 1328 | + | |
| 1329 | + _intersections.clear(); | |
| 1330 | + _intersections.append(Box(heightBounds.minimum, | |
| 1331 | + glm::vec3(bounds.maximum.x, heightBounds.maximum.y, bounds.minimum.z))); | |
| 1332 | + _intersections.append(Box(glm::vec3(bounds.maximum.x, heightBounds.minimum.y, heightBounds.minimum.z), | |
| 1333 | + glm::vec3(heightBounds.maximum.x, heightBounds.maximum.y, bounds.maximum.z))); | |
| 1334 | + _intersections.append(Box(glm::vec3(bounds.minimum.x, heightBounds.minimum.y, bounds.maximum.z), | |
| 1335 | + heightBounds.maximum)); | |
| 1336 | + _intersections.append(Box(glm::vec3(heightBounds.minimum.x, heightBounds.minimum.y, bounds.minimum.z), | |
| 1337 | + glm::vec3(bounds.minimum.x, heightBounds.maximum.y, heightBounds.maximum.z))); | |
| 1338 | + | |
| 1339 | + _fetchVisitor.init(buffer); | |
| 1340 | + _data->guide(_fetchVisitor); | |
| 1253 | 1341 | } |
| 1254 | − // we must create a new buffer and update its borders | |
| 1255 | − buffer = new HeightfieldBuffer(info.minimum, info.size, QByteArray(heightContentsSize, 0), | |
| 1256 | − QByteArray(colorContentsSize, 0), QByteArray(textureContentsSize, 0)); | |
| 1257 | − const Box& heightBounds = buffer->getHeightBounds(); | |
| 1258 | − addRegion(bounds, heightBounds); | |
| 1259 | − | |
| 1260 | − _intersections.clear(); | |
| 1261 | − _intersections.append(Box(heightBounds.minimum, | |
| 1262 | − glm::vec3(bounds.maximum.x, heightBounds.maximum.y, bounds.minimum.z))); | |
| 1263 | − _intersections.append(Box(glm::vec3(bounds.maximum.x, heightBounds.minimum.y, heightBounds.minimum.z), | |
| 1264 | − glm::vec3(heightBounds.maximum.x, heightBounds.maximum.y, bounds.maximum.z))); | |
| 1265 | − _intersections.append(Box(glm::vec3(bounds.minimum.x, heightBounds.minimum.y, bounds.maximum.z), | |
| 1266 | − heightBounds.maximum)); | |
| 1267 | − _intersections.append(Box(glm::vec3(heightBounds.minimum.x, heightBounds.minimum.y, bounds.minimum.z), | |
| 1268 | − glm::vec3(bounds.minimum.x, heightBounds.maximum.y, heightBounds.maximum.z))); | |
| 1269 | − | |
| 1270 | − _fetchVisitor.init(buffer); | |
| 1271 | − _data->guide(_fetchVisitor); | |
| 1272 | 1342 | } |
| 1273 | 1343 | info.outputValues[0] = AttributeValue(_outputs.at(0), encodeInline(BufferDataPointer(buffer))); |
| 1274 | 1344 | return STOP_RECURSION; |
| @@ -1326,7 +1396,7 @@ int HeightfieldUpdateVisitor::visit(MetavoxelInfo& info) { · 51 unmodified lines | ||
| 1326 | 1396 | return STOP_RECURSION; |
| 1327 | 1397 | } |
| 1328 | 1398 | HeightfieldBuffer* newBuffer = new HeightfieldBuffer(info.minimum, info.size, |
| 1329 | − buffer->getHeight(), buffer->getColor(), buffer->getTexture()); | |
| 1399 | + buffer->getHeight(), buffer->getColor(), buffer->getTexture(), buffer->getTextures()); | |
| 1330 | 1400 | _fetchVisitor.init(newBuffer); |
| 1331 | 1401 | _data->guide(_fetchVisitor); |
| 1332 | 1402 | info.outputValues[0] = AttributeValue(_outputs.at(0), encodeInline(BufferDataPointer(newBuffer))); |
| @@ -1514,6 +1584,9 @@ void DefaultMetavoxelRendererImplementation::render(MetavoxelData& data, Metavox · 181 unmodified lines | ||
| 1514 | 1584 | ProgramObject* program = &_heightfieldProgram; |
| 1515 | 1585 | if (Menu::getInstance()->getShadowsEnabled()) { |
| 1516 | 1586 | if (Menu::getInstance()->isOptionChecked(MenuOption::CascadedShadows)) { |
| 1587 | + _cascadedShadowLightHeightfieldProgram.bind(); | |
| 1588 | + _cascadedShadowLightHeightfieldProgram.setUniform(_shadowLightDistancesLocation, | |
| 1589 | + Application::getInstance()->getShadowDistances()); | |
| 1517 | 1590 | program = &_cascadedShadowMapHeightfieldProgram; |
| 1518 | 1591 | program->bind(); |
| 1519 | 1592 | program->setUniform(_shadowDistancesLocation, Application::getInstance()->getShadowDistances()); |
| @@ -1559,6 +1632,19 @@ ProgramObject DefaultMetavoxelRendererImplementation::_cascadedShadowMapHeightfi · 39 unmodified lines | ||
| 1559 | 1632 | int DefaultMetavoxelRendererImplementation::_cascadedShadowMapHeightScaleLocation; |
| 1560 | 1633 | int DefaultMetavoxelRendererImplementation::_cascadedShadowMapColorScaleLocation; |
| 1561 | 1634 | int DefaultMetavoxelRendererImplementation::_shadowDistancesLocation; |
| 1635 | +ProgramObject DefaultMetavoxelRendererImplementation::_baseHeightfieldProgram; | |
| 1636 | +int DefaultMetavoxelRendererImplementation::_baseHeightScaleLocation; | |
| 1637 | +int DefaultMetavoxelRendererImplementation::_baseColorScaleLocation; | |
| 1638 | +ProgramObject DefaultMetavoxelRendererImplementation::_splatHeightfieldProgram; | |
| 1639 | +int DefaultMetavoxelRendererImplementation::_splatHeightScaleLocation; | |
| 1640 | +int DefaultMetavoxelRendererImplementation::_splatTextureScaleLocation; | |
| 1641 | +ProgramObject DefaultMetavoxelRendererImplementation::_lightHeightfieldProgram; | |
| 1642 | +int DefaultMetavoxelRendererImplementation::_lightHeightScaleLocation; | |
| 1643 | +ProgramObject DefaultMetavoxelRendererImplementation::_shadowLightHeightfieldProgram; | |
| 1644 | +int DefaultMetavoxelRendererImplementation::_shadowLightHeightScaleLocation; | |
| 1645 | +ProgramObject DefaultMetavoxelRendererImplementation::_cascadedShadowLightHeightfieldProgram; | |
| 1646 | +int DefaultMetavoxelRendererImplementation::_cascadedShadowLightHeightScaleLocation; | |
| 1647 | +int DefaultMetavoxelRendererImplementation::_shadowLightDistancesLocation; | |
| 1562 | 1648 | ProgramObject DefaultMetavoxelRendererImplementation::_heightfieldCursorProgram; |
| 1563 | 1649 | |
| 1564 | 1650 | static void enableClipPlane(GLenum plane, float x, float y, float z, float w) { |