History

Switch to deferred lighting for metavoxels.

Andrzej Kapolka committed 12 years ago

Commit 21f3f2b1 parent a02656022 files · +666 −531Browse files

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

Unified · Split

interface/src/MetavoxelSystem.cpp+311−203
@@ -9,7 +9,11 @@ · 8 unmodified lines
9// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html9// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10//10//
11 11
12// include this before QOpenGLFramebufferObject, which includes an earlier version of OpenGL
13#include "InterfaceConfig.h"
14
12#include <QMutexLocker>15#include <QMutexLocker>
16#include <QOpenGLFramebufferObject>
13#include <QReadLocker>17#include <QReadLocker>
14#include <QWriteLocker>18#include <QWriteLocker>
15#include <QtDebug>19#include <QtDebug>
@@ -24,6 +28,7 @@ · 8 unmodified lines
24#include "Application.h"28#include "Application.h"
25#include "MetavoxelSystem.h"29#include "MetavoxelSystem.h"
26#include "renderer/Model.h"30#include "renderer/Model.h"
31#include "renderer/RenderUtil.h"
27 32
28REGISTER_META_OBJECT(DefaultMetavoxelRendererImplementation)33REGISTER_META_OBJECT(DefaultMetavoxelRendererImplementation)
29REGISTER_META_OBJECT(SphereRenderer)34REGISTER_META_OBJECT(SphereRenderer)
@@ -46,6 +51,12 @@ void MetavoxelSystem::init() { · 16 unmodified lines
46 new BufferDataAttribute("voxelBuffer"));51 new BufferDataAttribute("voxelBuffer"));
47 _voxelBufferAttribute->setLODThresholdMultiplier(52 _voxelBufferAttribute->setLODThresholdMultiplier(
48 AttributeRegistry::getInstance()->getVoxelColorAttribute()->getLODThresholdMultiplier());53 AttributeRegistry::getInstance()->getVoxelColorAttribute()->getLODThresholdMultiplier());
54
55 loadLightProgram("shaders/directional_light.frag", _directionalLight, _directionalLightLocations);
56 loadLightProgram("shaders/directional_light_shadow_map.frag", _directionalLightShadowMap,
57 _directionalLightShadowMapLocations);
58 loadLightProgram("shaders/directional_light_cascaded_shadow_map.frag", _directionalLightCascadedShadowMap,
59 _directionalLightCascadedShadowMapLocations);
49}60}
50 61
51MetavoxelLOD MetavoxelSystem::getLOD() {62MetavoxelLOD MetavoxelSystem::getLOD() {
@@ -116,6 +127,10 @@ int RenderVisitor::visit(MetavoxelInfo& info) { · 64 unmodified lines
116 return STOP_RECURSION;127 return STOP_RECURSION;
117}128}
118 129
130const GLenum COLOR_DRAW_BUFFERS[] = { GL_COLOR_ATTACHMENT0 };
131const GLenum NORMAL_DRAW_BUFFERS[] = { GL_COLOR_ATTACHMENT1 };
132const GLenum COLOR_NORMAL_DRAW_BUFFERS[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
133
119void MetavoxelSystem::render() {134void MetavoxelSystem::render() {
120 // update the frustum135 // update the frustum
121 ViewFrustum* viewFrustum = Application::getInstance()->getViewFrustum();136 ViewFrustum* viewFrustum = Application::getInstance()->getViewFrustum();
@@ -123,8 +138,128 @@ void MetavoxelSystem::render() { · 1 unmodified line
123 viewFrustum->getFarBottomRight(), viewFrustum->getNearTopLeft(), viewFrustum->getNearTopRight(),138 viewFrustum->getFarBottomRight(), viewFrustum->getNearTopLeft(), viewFrustum->getNearTopRight(),
124 viewFrustum->getNearBottomLeft(), viewFrustum->getNearBottomRight());139 viewFrustum->getNearBottomLeft(), viewFrustum->getNearBottomRight());
125 140
141 _needToLight = false;
142
143 // clear the normal buffer
144 glDrawBuffers(sizeof(NORMAL_DRAW_BUFFERS) / sizeof(NORMAL_DRAW_BUFFERS[0]), NORMAL_DRAW_BUFFERS);
145 glClear(GL_COLOR_BUFFER_BIT);
146
147 glDrawBuffers(sizeof(COLOR_DRAW_BUFFERS) / sizeof(COLOR_DRAW_BUFFERS[0]), COLOR_DRAW_BUFFERS);
148
126 RenderVisitor renderVisitor(getLOD());149 RenderVisitor renderVisitor(getLOD());
127 guideToAugmented(renderVisitor, true);150 guideToAugmented(renderVisitor, true);
151
152 // give external parties a chance to join in
153 emit rendering();
154
155 if (!_needToLight) {
156 return; // skip lighting if not needed
157 }
158
159 // perform deferred lighting, rendering to free fbo
160 glPushMatrix();
161 glLoadIdentity();
162
163 glMatrixMode(GL_PROJECTION);
164 glPushMatrix();
165 glLoadIdentity();
166
167 glDisable(GL_BLEND);
168 glDisable(GL_LIGHTING);
169 glDisable(GL_DEPTH_TEST);
170 glDepthMask(false);
171
172 QOpenGLFramebufferObject* primaryFBO = Application::getInstance()->getTextureCache()->getPrimaryFramebufferObject();
173 primaryFBO->release();
174
175 QOpenGLFramebufferObject* freeFBO = Application::getInstance()->getGlowEffect()->getFreeFramebufferObject();
176 freeFBO->bind();
177 glClear(GL_COLOR_BUFFER_BIT);
178
179 glBindTexture(GL_TEXTURE_2D, primaryFBO->texture());
180
181 glActiveTexture(GL_TEXTURE1);
182 glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getPrimaryNormalTextureID());
183
184 if (Menu::getInstance()->getShadowsEnabled()) {
185 glActiveTexture(GL_TEXTURE2);
186 glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getPrimaryDepthTextureID());
187
188 glActiveTexture(GL_TEXTURE3);
189 glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getShadowDepthTextureID());
190
191 ProgramObject* program = &_directionalLightShadowMap;
192 const LightLocations* locations = &_directionalLightShadowMapLocations;
193 if (Menu::getInstance()->isOptionChecked(MenuOption::CascadedShadows)) {
194 program = &_directionalLightCascadedShadowMap;
195 locations = &_directionalLightCascadedShadowMapLocations;
196 _directionalLightCascadedShadowMap.bind();
197 _directionalLightCascadedShadowMap.setUniform(locations->shadowDistances,
198 Application::getInstance()->getShadowDistances());
199
200 } else {
201 program->bind();
202 }
203 program->setUniformValue(locations->shadowScale,
204 1.0f / Application::getInstance()->getTextureCache()->getShadowFramebufferObject()->width());
205
206 float left, right, bottom, top, nearVal, farVal;
207 glm::vec4 nearClipPlane, farClipPlane;
208 Application::getInstance()->computeOffAxisFrustum(
209 left, right, bottom, top, nearVal, farVal, nearClipPlane, farClipPlane);
210 program->setUniformValue(locations->near, nearVal);
211 program->setUniformValue(locations->depthScale, (farVal - nearVal) / farVal);
212 float nearScale = -1.0f / nearVal;
213 program->setUniformValue(locations->depthTexCoordOffset, left * nearScale, bottom * nearScale);
214 program->setUniformValue(locations->depthTexCoordScale, (right - left) * nearScale, (top - bottom) * nearScale);
215
216 renderFullscreenQuad();
217
218 program->release();
219
220 glBindTexture(GL_TEXTURE_2D, 0);
221
222 glActiveTexture(GL_TEXTURE2);
223 glBindTexture(GL_TEXTURE_2D, 0);
224
225 glActiveTexture(GL_TEXTURE1);
226
227 } else {
228 _directionalLight.bind();
229 renderFullscreenQuad();
230 _directionalLight.release();
231 }
232
233 glBindTexture(GL_TEXTURE_2D, 0);
234 glActiveTexture(GL_TEXTURE0);
235
236 freeFBO->release();
237
238 // now transfer the lit region to the primary fbo
239 glEnable(GL_BLEND);
240
241 primaryFBO->bind();
242
243 glBindTexture(GL_TEXTURE_2D, freeFBO->texture());
244 glEnable(GL_TEXTURE_2D);
245
246 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
247
248 renderFullscreenQuad();
249
250 glBindTexture(GL_TEXTURE_2D, 0);
251 glDisable(GL_TEXTURE_2D);
252
253 glEnable(GL_LIGHTING);
254 glEnable(GL_DEPTH_TEST);
255 glDepthMask(true);
256
257 glDisable(GL_ALPHA_TEST);
258
259 glPopMatrix();
260
261 glMatrixMode(GL_MODELVIEW);
262 glPopMatrix();
128}263}
129 264
130class RayHeightfieldIntersectionVisitor : public RayIntersectionVisitor {265class RayHeightfieldIntersectionVisitor : public RayIntersectionVisitor {
@@ -484,6 +619,24 @@ void MetavoxelSystem::guideToAugmented(MetavoxelVisitor& visitor, bool render) { · 353 unmodified lines
484 }619 }
485}620}
486 621
622void MetavoxelSystem::loadLightProgram(const char* name, ProgramObject& program, LightLocations& locations) {
623 program.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() + name);
624 program.link();
625
626 program.bind();
627 program.setUniformValue("diffuseMap", 0);
628 program.setUniformValue("normalMap", 1);
629 program.setUniformValue("depthMap", 2);
630 program.setUniformValue("shadowMap", 3);
631 locations.shadowDistances = program.uniformLocation("shadowDistances");
632 locations.shadowScale = program.uniformLocation("shadowScale");
633 locations.near = program.uniformLocation("near");
634 locations.depthScale = program.uniformLocation("depthScale");
635 locations.depthTexCoordOffset = program.uniformLocation("depthTexCoordOffset");
636 locations.depthTexCoordScale = program.uniformLocation("depthTexCoordScale");
637 program.release();
638}
639
487MetavoxelSystemClient::MetavoxelSystemClient(const SharedNodePointer& node, MetavoxelUpdater* updater) :640MetavoxelSystemClient::MetavoxelSystemClient(const SharedNodePointer& node, MetavoxelUpdater* updater) :
488 MetavoxelClient(node, updater) {641 MetavoxelClient(node, updater) {
489}642}
@@ -807,7 +960,6 @@ void HeightfieldBuffer::render(bool cursor) { · 317 unmodified lines
807 glDrawRangeElements(GL_TRIANGLES, 0, vertexCount - 1, indexCount, GL_UNSIGNED_INT, 0);960 glDrawRangeElements(GL_TRIANGLES, 0, vertexCount - 1, indexCount, GL_UNSIGNED_INT, 0);
808 961
809 } else if (!_materials.isEmpty()) {962 } else if (!_materials.isEmpty()) {
810 DefaultMetavoxelRendererImplementation::getBaseHeightfieldProgram().bind();
811 DefaultMetavoxelRendererImplementation::getBaseHeightfieldProgram().setUniformValue(963 DefaultMetavoxelRendererImplementation::getBaseHeightfieldProgram().setUniformValue(
812 DefaultMetavoxelRendererImplementation::getBaseHeightScaleLocation(), 1.0f / _heightSize);964 DefaultMetavoxelRendererImplementation::getBaseHeightScaleLocation(), 1.0f / _heightSize);
813 DefaultMetavoxelRendererImplementation::getBaseHeightfieldProgram().setUniformValue(965 DefaultMetavoxelRendererImplementation::getBaseHeightfieldProgram().setUniformValue(
@@ -817,6 +969,8 @@ void HeightfieldBuffer::render(bool cursor) { · 3 unmodified lines
817 969
818 glDrawRangeElements(GL_TRIANGLES, 0, vertexCount - 1, indexCount, GL_UNSIGNED_INT, 0);970 glDrawRangeElements(GL_TRIANGLES, 0, vertexCount - 1, indexCount, GL_UNSIGNED_INT, 0);
819 971
972 glDrawBuffers(sizeof(COLOR_DRAW_BUFFERS) / sizeof(COLOR_DRAW_BUFFERS[0]), COLOR_DRAW_BUFFERS);
973
820 glDepthFunc(GL_LEQUAL);974 glDepthFunc(GL_LEQUAL);
821 glDepthMask(false);975 glDepthMask(false);
822 glEnable(GL_BLEND);976 glEnable(GL_BLEND);
@@ -825,18 +979,18 @@ void HeightfieldBuffer::render(bool cursor) { · 2 unmodified lines
825 glPolygonOffset(-1.0f, -1.0f);979 glPolygonOffset(-1.0f, -1.0f);
826 980
827 DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().bind();981 DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().bind();
982 const DefaultMetavoxelRendererImplementation::SplatLocations& locations =
983 DefaultMetavoxelRendererImplementation::getSplatHeightfieldLocations();
828 DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(984 DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(
829 DefaultMetavoxelRendererImplementation::getSplatHeightScaleLocation(), 1.0f / _heightSize);985 locations.heightScale, 1.0f / _heightSize);
830 DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(986 DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(
831 DefaultMetavoxelRendererImplementation::getSplatTextureScaleLocation(), (float)_heightSize / innerSize);987 locations.textureScale, (float)_heightSize / innerSize);
832 DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(988 DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(
833 DefaultMetavoxelRendererImplementation::getSplatTextureOffsetLocation(),989 locations.splatTextureOffset, _translation.x / _scale, _translation.z / _scale);
834 _translation.x / _scale, _translation.z / _scale);
835 990
836 glBindTexture(GL_TEXTURE_2D, _materialTextureID);991 glBindTexture(GL_TEXTURE_2D, _materialTextureID);
837 992
838 const int TEXTURES_PER_SPLAT = 4;993 for (int i = 0; i < _materials.size(); i += SPLAT_COUNT) {
839 for (int i = 0; i < _materials.size(); i += TEXTURES_PER_SPLAT) {
840 QVector4D scalesS, scalesT;994 QVector4D scalesS, scalesT;
841 995
842 for (int j = 0; j < SPLAT_COUNT; j++) {996 for (int j = 0; j < SPLAT_COUNT; j++) {
@@ -858,23 +1012,20 @@ void HeightfieldBuffer::render(bool cursor) { · 15 unmodified lines
858 }1012 }
859 const float QUARTER_STEP = 0.25f * EIGHT_BIT_MAXIMUM_RECIPROCAL;1013 const float QUARTER_STEP = 0.25f * EIGHT_BIT_MAXIMUM_RECIPROCAL;
860 DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(1014 DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(
861 DefaultMetavoxelRendererImplementation::getSplatTextureScalesSLocation(), scalesS);1015 locations.splatTextureScalesS, scalesS);
862 DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(1016 DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(
863 DefaultMetavoxelRendererImplementation::getSplatTextureScalesTLocation(), scalesT);1017 locations.splatTextureScalesT, scalesT);
864 DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(1018 DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(
865 DefaultMetavoxelRendererImplementation::getSplatTextureValueMinimaLocation(),1019 locations.textureValueMinima,
866 (i + 1) * EIGHT_BIT_MAXIMUM_RECIPROCAL - QUARTER_STEP, (i + 2) * EIGHT_BIT_MAXIMUM_RECIPROCAL - QUARTER_STEP,1020 (i + 1) * EIGHT_BIT_MAXIMUM_RECIPROCAL - QUARTER_STEP, (i + 2) * EIGHT_BIT_MAXIMUM_RECIPROCAL - QUARTER_STEP,
867 (i + 3) * EIGHT_BIT_MAXIMUM_RECIPROCAL - QUARTER_STEP, (i + 4) * EIGHT_BIT_MAXIMUM_RECIPROCAL - QUARTER_STEP);1021 (i + 3) * EIGHT_BIT_MAXIMUM_RECIPROCAL - QUARTER_STEP, (i + 4) * EIGHT_BIT_MAXIMUM_RECIPROCAL - QUARTER_STEP);
868 DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(1022 DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(
869 DefaultMetavoxelRendererImplementation::getSplatTextureValueMaximaLocation(),1023 locations.textureValueMaxima,
870 (i + 1) * EIGHT_BIT_MAXIMUM_RECIPROCAL + QUARTER_STEP, (i + 2) * EIGHT_BIT_MAXIMUM_RECIPROCAL + QUARTER_STEP,1024 (i + 1) * EIGHT_BIT_MAXIMUM_RECIPROCAL + QUARTER_STEP, (i + 2) * EIGHT_BIT_MAXIMUM_RECIPROCAL + QUARTER_STEP,
871 (i + 3) * EIGHT_BIT_MAXIMUM_RECIPROCAL + QUARTER_STEP, (i + 4) * EIGHT_BIT_MAXIMUM_RECIPROCAL + QUARTER_STEP);1025 (i + 3) * EIGHT_BIT_MAXIMUM_RECIPROCAL + QUARTER_STEP, (i + 4) * EIGHT_BIT_MAXIMUM_RECIPROCAL + QUARTER_STEP);
872 glDrawRangeElements(GL_TRIANGLES, 0, vertexCount - 1, indexCount, GL_UNSIGNED_INT, 0);1026 glDrawRangeElements(GL_TRIANGLES, 0, vertexCount - 1, indexCount, GL_UNSIGNED_INT, 0);
873 }1027 }
874 1028
875 glEnable(GL_ALPHA_TEST);
876 glBlendFunc(GL_DST_COLOR, GL_ZERO);
877
878 for (int i = 0; i < SPLAT_COUNT; i++) {1029 for (int i = 0; i < SPLAT_COUNT; i++) {
879 glActiveTexture(GL_TEXTURE0 + SPLAT_TEXTURE_UNITS[i]);1030 glActiveTexture(GL_TEXTURE0 + SPLAT_TEXTURE_UNITS[i]);
880 glBindTexture(GL_TEXTURE_2D, 0);1031 glBindTexture(GL_TEXTURE_2D, 0);
@@ -882,53 +1033,24 @@ void HeightfieldBuffer::render(bool cursor) { · 1 unmodified line
882 1033
883 glActiveTexture(GL_TEXTURE1);1034 glActiveTexture(GL_TEXTURE1);
884 glBindTexture(GL_TEXTURE_2D, 0);1035 glBindTexture(GL_TEXTURE_2D, 0);
885 1036
886 if (Menu::getInstance()->isOptionChecked(MenuOption::SimpleShadows)) {1037 glActiveTexture(GL_TEXTURE0);
887 DefaultMetavoxelRendererImplementation::getShadowLightHeightfieldProgram().bind();
888 DefaultMetavoxelRendererImplementation::getShadowLightHeightfieldProgram().setUniformValue(
889 DefaultMetavoxelRendererImplementation::getShadowLightHeightScaleLocation(), 1.0f / _heightSize);
890 glDrawRangeElements(GL_TRIANGLES, 0, vertexCount - 1, indexCount, GL_UNSIGNED_INT, 0);
891 DefaultMetavoxelRendererImplementation::getShadowMapHeightfieldProgram().bind();
892
893 } else if (Menu::getInstance()->isOptionChecked(MenuOption::CascadedShadows)) {
894 DefaultMetavoxelRendererImplementation::getCascadedShadowLightHeightfieldProgram().bind();
895 DefaultMetavoxelRendererImplementation::getCascadedShadowLightHeightfieldProgram().setUniformValue(
896 DefaultMetavoxelRendererImplementation::getCascadedShadowLightHeightScaleLocation(), 1.0f / _heightSize);
897 glDrawRangeElements(GL_TRIANGLES, 0, vertexCount - 1, indexCount, GL_UNSIGNED_INT, 0);
898 DefaultMetavoxelRendererImplementation::getCascadedShadowMapHeightfieldProgram().bind();
899
900 } else {
901 DefaultMetavoxelRendererImplementation::getLightHeightfieldProgram().bind();
902 DefaultMetavoxelRendererImplementation::getLightHeightfieldProgram().setUniformValue(
903 DefaultMetavoxelRendererImplementation::getLightHeightScaleLocation(), 1.0f / _heightSize);
904 glDrawRangeElements(GL_TRIANGLES, 0, vertexCount - 1, indexCount, GL_UNSIGNED_INT, 0);
905 DefaultMetavoxelRendererImplementation::getHeightfieldProgram().bind();
906 }
907 1038
908 glDisable(GL_POLYGON_OFFSET_FILL);1039 glDisable(GL_POLYGON_OFFSET_FILL);
1040 glEnable(GL_ALPHA_TEST);
909 glDisable(GL_BLEND);1041 glDisable(GL_BLEND);
910 glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE);
911 glDepthFunc(GL_LESS);
912 glDepthMask(true);1042 glDepthMask(true);
1043 glDepthFunc(GL_LESS);
913 1044
914 glActiveTexture(GL_TEXTURE0);1045 glDrawBuffers(sizeof(COLOR_NORMAL_DRAW_BUFFERS) / sizeof(COLOR_NORMAL_DRAW_BUFFERS[0]), COLOR_NORMAL_DRAW_BUFFERS);
1046
1047 DefaultMetavoxelRendererImplementation::getBaseHeightfieldProgram().bind();
915 1048
916 } else {1049 } else {
917 int heightScaleLocation = DefaultMetavoxelRendererImplementation::getHeightScaleLocation();1050 DefaultMetavoxelRendererImplementation::getBaseHeightfieldProgram().setUniformValue(
918 int colorScaleLocation = DefaultMetavoxelRendererImplementation::getColorScaleLocation();1051 DefaultMetavoxelRendererImplementation::getBaseHeightScaleLocation(), 1.0f / _heightSize);
919 ProgramObject* program = &DefaultMetavoxelRendererImplementation::getHeightfieldProgram();1052 DefaultMetavoxelRendererImplementation::getBaseHeightfieldProgram().setUniformValue(
920 if (Menu::getInstance()->isOptionChecked(MenuOption::SimpleShadows)) {1053 DefaultMetavoxelRendererImplementation::getBaseColorScaleLocation(), (float)_heightSize / innerSize);
921 heightScaleLocation = DefaultMetavoxelRendererImplementation::getShadowMapHeightScaleLocation();
922 colorScaleLocation = DefaultMetavoxelRendererImplementation::getShadowMapColorScaleLocation();
923 program = &DefaultMetavoxelRendererImplementation::getShadowMapHeightfieldProgram();
924
925 } else if (Menu::getInstance()->isOptionChecked(MenuOption::CascadedShadows)) {
926 heightScaleLocation = DefaultMetavoxelRendererImplementation::getCascadedShadowMapHeightScaleLocation();
927 colorScaleLocation = DefaultMetavoxelRendererImplementation::getCascadedShadowMapColorScaleLocation();
928 program = &DefaultMetavoxelRendererImplementation::getCascadedShadowMapHeightfieldProgram();
929 }
930 program->setUniformValue(heightScaleLocation, 1.0f / _heightSize);
931 program->setUniformValue(colorScaleLocation, (float)_heightSize / innerSize);
932 glActiveTexture(GL_TEXTURE1);1054 glActiveTexture(GL_TEXTURE1);
933 glBindTexture(GL_TEXTURE_2D, _colorTextureID);1055 glBindTexture(GL_TEXTURE_2D, _colorTextureID);
934 1056
@@ -944,6 +1066,8 @@ void HeightfieldBuffer::render(bool cursor) { · 9 unmodified lines
944 1066
945 bufferPair.first.release();1067 bufferPair.first.release();
946 bufferPair.second.release();1068 bufferPair.second.release();
1069
1070 Application::getInstance()->getMetavoxels()->noteNeedToLight();
947}1071}
948 1072
949QHash<int, HeightfieldBuffer::BufferPair> HeightfieldBuffer::_bufferPairs;1073QHash<int, HeightfieldBuffer::BufferPair> HeightfieldBuffer::_bufferPairs;
@@ -959,7 +1083,7 @@ void HeightfieldPreview::render(const glm::vec3& translation, float scale) const · 9 unmodified lines
959 glEnableClientState(GL_VERTEX_ARRAY);1083 glEnableClientState(GL_VERTEX_ARRAY);
960 glEnableClientState(GL_TEXTURE_COORD_ARRAY);1084 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
961 1085
962 DefaultMetavoxelRendererImplementation::getHeightfieldProgram().bind();1086 DefaultMetavoxelRendererImplementation::getBaseHeightfieldProgram().bind();
963 1087
964 glPushMatrix();1088 glPushMatrix();
965 glTranslatef(translation.x, translation.y, translation.z);1089 glTranslatef(translation.x, translation.y, translation.z);
@@ -971,7 +1095,7 @@ void HeightfieldPreview::render(const glm::vec3& translation, float scale) const · 5 unmodified lines
971 1095
972 glPopMatrix();1096 glPopMatrix();
973 1097
974 DefaultMetavoxelRendererImplementation::getHeightfieldProgram().release();1098 DefaultMetavoxelRendererImplementation::getBaseHeightfieldProgram().release();
975 1099
976 glDisableClientState(GL_TEXTURE_COORD_ARRAY);1100 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
977 glDisableClientState(GL_VERTEX_ARRAY);1101 glDisableClientState(GL_VERTEX_ARRAY);
@@ -1025,8 +1149,89 @@ void VoxelBuffer::render(bool cursor) { · 47 unmodified lines
1025 1149
1026 glDrawRangeElements(GL_QUADS, 0, _vertexCount - 1, _indexCount, GL_UNSIGNED_INT, 0);1150 glDrawRangeElements(GL_QUADS, 0, _vertexCount - 1, _indexCount, GL_UNSIGNED_INT, 0);
1027 1151
1152 if (!_materials.isEmpty()) {
1153 glDrawBuffers(sizeof(COLOR_DRAW_BUFFERS) / sizeof(COLOR_DRAW_BUFFERS[0]), COLOR_DRAW_BUFFERS);
1154
1155 glDepthFunc(GL_LEQUAL);
1156 glDepthMask(false);
1157 glEnable(GL_BLEND);
1158 glDisable(GL_ALPHA_TEST);
1159 glEnable(GL_POLYGON_OFFSET_FILL);
1160 glPolygonOffset(-1.0f, -1.0f);
1161
1162 DefaultMetavoxelRendererImplementation::getSplatVoxelProgram().bind();
1163 const DefaultMetavoxelRendererImplementation::SplatLocations& locations =
1164 DefaultMetavoxelRendererImplementation::getSplatVoxelLocations();
1165
1166 DefaultMetavoxelRendererImplementation::getSplatVoxelProgram().setAttributeBuffer(locations.materials,
1167 GL_UNSIGNED_BYTE, (qint64)&point->materials, SPLAT_COUNT, sizeof(VoxelPoint));
1168 DefaultMetavoxelRendererImplementation::getSplatVoxelProgram().enableAttributeArray(locations.materials);
1169
1170 DefaultMetavoxelRendererImplementation::getSplatVoxelProgram().setAttributeBuffer(locations.materialWeights,
1171 GL_UNSIGNED_BYTE, (qint64)&point->materialWeights, SPLAT_COUNT, sizeof(VoxelPoint));
1172 DefaultMetavoxelRendererImplementation::getSplatVoxelProgram().enableAttributeArray(locations.materialWeights);
1173
1174 for (int i = 0; i < _materials.size(); i += SPLAT_COUNT) {
1175 QVector4D scalesS, scalesT;
1176
1177 for (int j = 0; j < SPLAT_COUNT; j++) {
1178 glActiveTexture(GL_TEXTURE0 + SPLAT_TEXTURE_UNITS[j]);
1179 int index = i + j;
1180 if (index < _networkTextures.size()) {
1181 const NetworkTexturePointer& texture = _networkTextures.at(index);
1182 if (texture) {
1183 MaterialObject* material = static_cast<MaterialObject*>(_materials.at(index).data());
1184 scalesS[j] = 1.0f / material->getScaleS();
1185 scalesT[j] = 1.0f / material->getScaleT();
1186 glBindTexture(GL_TEXTURE_2D, texture->getID());
1187 } else {
1188 glBindTexture(GL_TEXTURE_2D, 0);
1189 }
1190 } else {
1191 glBindTexture(GL_TEXTURE_2D, 0);
1192 }
1193 }
1194 const float QUARTER_STEP = 0.25f * EIGHT_BIT_MAXIMUM_RECIPROCAL;
1195 DefaultMetavoxelRendererImplementation::getSplatVoxelProgram().setUniformValue(
1196 locations.splatTextureScalesS, scalesS);
1197 DefaultMetavoxelRendererImplementation::getSplatVoxelProgram().setUniformValue(
1198 locations.splatTextureScalesT, scalesT);
1199 DefaultMetavoxelRendererImplementation::getSplatVoxelProgram().setUniformValue(
1200 locations.textureValueMinima,
1201 (i + 1) * EIGHT_BIT_MAXIMUM_RECIPROCAL - QUARTER_STEP, (i + 2) * EIGHT_BIT_MAXIMUM_RECIPROCAL - QUARTER_STEP,
1202 (i + 3) * EIGHT_BIT_MAXIMUM_RECIPROCAL - QUARTER_STEP, (i + 4) * EIGHT_BIT_MAXIMUM_RECIPROCAL - QUARTER_STEP);
1203 DefaultMetavoxelRendererImplementation::getSplatVoxelProgram().setUniformValue(
1204 locations.textureValueMaxima,
1205 (i + 1) * EIGHT_BIT_MAXIMUM_RECIPROCAL + QUARTER_STEP, (i + 2) * EIGHT_BIT_MAXIMUM_RECIPROCAL + QUARTER_STEP,
1206 (i + 3) * EIGHT_BIT_MAXIMUM_RECIPROCAL + QUARTER_STEP, (i + 4) * EIGHT_BIT_MAXIMUM_RECIPROCAL + QUARTER_STEP);
1207 glDrawRangeElements(GL_QUADS, 0, _vertexCount - 1, _indexCount, GL_UNSIGNED_INT, 0);
1208 }
1209
1210 for (int i = 0; i < SPLAT_COUNT; i++) {
1211 glActiveTexture(GL_TEXTURE0 + SPLAT_TEXTURE_UNITS[i]);
1212 glBindTexture(GL_TEXTURE_2D, 0);
1213 }
1214
1215 glActiveTexture(GL_TEXTURE0);
1216
1217 glDisable(GL_POLYGON_OFFSET_FILL);
1218 glEnable(GL_ALPHA_TEST);
1219 glDisable(GL_BLEND);
1220 glDepthMask(true);
1221 glDepthFunc(GL_LESS);
1222
1223 glDrawBuffers(sizeof(COLOR_NORMAL_DRAW_BUFFERS) / sizeof(COLOR_NORMAL_DRAW_BUFFERS[0]), COLOR_NORMAL_DRAW_BUFFERS);
1224
1225 DefaultMetavoxelRendererImplementation::getSplatVoxelProgram().disableAttributeArray(locations.materials);
1226 DefaultMetavoxelRendererImplementation::getSplatVoxelProgram().disableAttributeArray(locations.materialWeights);
1227
1228 DefaultMetavoxelRendererImplementation::getBaseVoxelProgram().bind();
1229 }
1230
1028 _vertexBuffer.release();1231 _vertexBuffer.release();
1029 _indexBuffer.release();1232 _indexBuffer.release();
1233
1234 Application::getInstance()->getMetavoxels()->noteNeedToLight();
1030}1235}
1031 1236
1032BufferDataAttribute::BufferDataAttribute(const QString& name) :1237BufferDataAttribute::BufferDataAttribute(const QString& name) :
@@ -1056,48 +1261,6 @@ void DefaultMetavoxelRendererImplementation::init() { · 23 unmodified lines
1056 _pointScaleLocation = _pointProgram.uniformLocation("pointScale");1261 _pointScaleLocation = _pointProgram.uniformLocation("pointScale");
1057 _pointProgram.release();1262 _pointProgram.release();
1058 1263
1059 _heightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +
1060 "shaders/metavoxel_heightfield.vert");
1061 _heightfieldProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() +
1062 "shaders/metavoxel_heightfield.frag");
1063 _heightfieldProgram.link();
1064
1065 _heightfieldProgram.bind();
1066 _heightfieldProgram.setUniformValue("heightMap", 0);
1067 _heightfieldProgram.setUniformValue("diffuseMap", 1);
1068 _heightScaleLocation = _heightfieldProgram.uniformLocation("heightScale");
1069 _colorScaleLocation = _heightfieldProgram.uniformLocation("colorScale");
1070 _heightfieldProgram.release();
1071
1072 _shadowMapHeightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +
1073 "shaders/metavoxel_heightfield.vert");
1074 _shadowMapHeightfieldProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() +
1075 "shaders/metavoxel_heightfield_shadow_map.frag");
1076 _shadowMapHeightfieldProgram.link();
1077
1078 _shadowMapHeightfieldProgram.bind();
1079 _shadowMapHeightfieldProgram.setUniformValue("heightMap", 0);
1080 _shadowMapHeightfieldProgram.setUniformValue("diffuseMap", 1);
1081 _shadowMapHeightfieldProgram.setUniformValue("shadowMap", 2);
1082 _shadowMapHeightScaleLocation = _shadowMapHeightfieldProgram.uniformLocation("heightScale");
1083 _shadowMapColorScaleLocation = _shadowMapHeightfieldProgram.uniformLocation("colorScale");
1084 _shadowMapHeightfieldProgram.release();
1085
1086 _cascadedShadowMapHeightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +
1087 "shaders/metavoxel_heightfield.vert");
1088 _cascadedShadowMapHeightfieldProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() +
1089 "shaders/metavoxel_heightfield_cascaded_shadow_map.frag");
1090 _cascadedShadowMapHeightfieldProgram.link();
1091
1092 _cascadedShadowMapHeightfieldProgram.bind();
1093 _cascadedShadowMapHeightfieldProgram.setUniformValue("heightMap", 0);
1094 _cascadedShadowMapHeightfieldProgram.setUniformValue("diffuseMap", 1);
1095 _cascadedShadowMapHeightfieldProgram.setUniformValue("shadowMap", 2);
1096 _cascadedShadowMapHeightScaleLocation = _cascadedShadowMapHeightfieldProgram.uniformLocation("heightScale");
1097 _cascadedShadowMapColorScaleLocation = _cascadedShadowMapHeightfieldProgram.uniformLocation("colorScale");
1098 _shadowDistancesLocation = _cascadedShadowMapHeightfieldProgram.uniformLocation("shadowDistances");
1099 _cascadedShadowMapHeightfieldProgram.release();
1100
1101 _baseHeightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +1264 _baseHeightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +
1102 "shaders/metavoxel_heightfield_base.vert");1265 "shaders/metavoxel_heightfield_base.vert");
1103 _baseHeightfieldProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() +1266 _baseHeightfieldProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() +
@@ -1111,60 +1274,7 @@ void DefaultMetavoxelRendererImplementation::init() { · 7 unmodified lines
1111 _baseColorScaleLocation = _baseHeightfieldProgram.uniformLocation("colorScale");1274 _baseColorScaleLocation = _baseHeightfieldProgram.uniformLocation("colorScale");
1112 _baseHeightfieldProgram.release();1275 _baseHeightfieldProgram.release();
1113 1276
1114 _splatHeightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +1277 loadSplatProgram("heightfield", _splatHeightfieldProgram, _splatHeightfieldLocations);
1115 "shaders/metavoxel_heightfield_splat.vert");
1116 _splatHeightfieldProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() +
1117 "shaders/metavoxel_heightfield_splat.frag");
1118 _splatHeightfieldProgram.link();
1119
1120 _splatHeightfieldProgram.bind();
1121 _splatHeightfieldProgram.setUniformValue("heightMap", 0);
1122 _splatHeightfieldProgram.setUniformValue("textureMap", 1);
1123 _splatHeightfieldProgram.setUniformValueArray("diffuseMaps", SPLAT_TEXTURE_UNITS, SPLAT_COUNT);
1124 _splatHeightScaleLocation = _splatHeightfieldProgram.uniformLocation("heightScale");
1125 _splatTextureScaleLocation = _splatHeightfieldProgram.uniformLocation("textureScale");
1126 _splatTextureOffsetLocation = _splatHeightfieldProgram.uniformLocation("splatTextureOffset");
1127 _splatTextureScalesSLocation = _splatHeightfieldProgram.uniformLocation("splatTextureScalesS");
1128 _splatTextureScalesTLocation = _splatHeightfieldProgram.uniformLocation("splatTextureScalesT");
1129 _splatTextureValueMinimaLocation = _splatHeightfieldProgram.uniformLocation("textureValueMinima");
1130 _splatTextureValueMaximaLocation = _splatHeightfieldProgram.uniformLocation("textureValueMaxima");
1131 _splatHeightfieldProgram.release();
1132
1133 _lightHeightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +
1134 "shaders/metavoxel_heightfield_light.vert");
1135 _lightHeightfieldProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() +
1136 "shaders/metavoxel_heightfield_light.frag");
1137 _lightHeightfieldProgram.link();
1138
1139 _lightHeightfieldProgram.bind();
1140 _lightHeightfieldProgram.setUniformValue("heightMap", 0);
1141 _lightHeightScaleLocation = _lightHeightfieldProgram.uniformLocation("heightScale");
1142 _lightHeightfieldProgram.release();
1143
1144 _shadowLightHeightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +
1145 "shaders/metavoxel_heightfield_light.vert");
1146 _shadowLightHeightfieldProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() +
1147 "shaders/metavoxel_heightfield_light_shadow_map.frag");
1148 _shadowLightHeightfieldProgram.link();
1149
1150 _shadowLightHeightfieldProgram.bind();
1151 _shadowLightHeightfieldProgram.setUniformValue("heightMap", 0);
1152 _shadowLightHeightfieldProgram.setUniformValue("shadowMap", 2);
1153 _shadowLightHeightScaleLocation = _shadowLightHeightfieldProgram.uniformLocation("heightScale");
1154 _shadowLightHeightfieldProgram.release();
1155
1156 _cascadedShadowLightHeightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +
1157 "shaders/metavoxel_heightfield_light.vert");
1158 _cascadedShadowLightHeightfieldProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() +
1159 "shaders/metavoxel_heightfield_light_cascaded_shadow_map.frag");
1160 _cascadedShadowLightHeightfieldProgram.link();
1161
1162 _cascadedShadowLightHeightfieldProgram.bind();
1163 _cascadedShadowLightHeightfieldProgram.setUniformValue("heightMap", 0);
1164 _cascadedShadowLightHeightfieldProgram.setUniformValue("shadowMap", 2);
1165 _cascadedShadowLightHeightScaleLocation = _cascadedShadowLightHeightfieldProgram.uniformLocation("heightScale");
1166 _shadowLightDistancesLocation = _cascadedShadowLightHeightfieldProgram.uniformLocation("shadowDistances");
1167 _cascadedShadowLightHeightfieldProgram.release();
1168 1278
1169 _heightfieldCursorProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +1279 _heightfieldCursorProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +
1170 "shaders/metavoxel_heightfield_cursor.vert");1280 "shaders/metavoxel_heightfield_cursor.vert");
@@ -1175,6 +1285,14 @@ void DefaultMetavoxelRendererImplementation::init() { · 4 unmodified lines
1175 _heightfieldCursorProgram.bind();1285 _heightfieldCursorProgram.bind();
1176 _heightfieldCursorProgram.setUniformValue("heightMap", 0);1286 _heightfieldCursorProgram.setUniformValue("heightMap", 0);
1177 _heightfieldCursorProgram.release();1287 _heightfieldCursorProgram.release();
1288
1289 _baseVoxelProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +
1290 "shaders/metavoxel_voxel_base.vert");
1291 _baseVoxelProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() +
1292 "shaders/metavoxel_voxel_base.frag");
1293 _baseVoxelProgram.link();
1294
1295 loadSplatProgram("voxel", _splatVoxelProgram, _splatVoxelLocations);
1178 }1296 }
1179}1297}
1180 1298
@@ -1844,7 +1962,7 @@ int VoxelAugmentVisitor::visit(MetavoxelInfo& info) { · 663 unmodified lines
1844 glm::vec3 center;1962 glm::vec3 center;
1845 glm::vec3 normal;1963 glm::vec3 normal;
1846 const int MAX_MATERIALS_PER_VERTEX = 4;1964 const int MAX_MATERIALS_PER_VERTEX = 4;
1847 quint8 materials[4];1965 quint8 materials[] = { 0, 0, 0, 0 };
1848 glm::vec4 materialWeights;1966 glm::vec4 materialWeights;
1849 float totalWeight = 0.0f;1967 float totalWeight = 0.0f;
1850 int red = 0, green = 0, blue = 0;1968 int red = 0, green = 0, blue = 0;
@@ -1865,7 +1983,7 @@ int VoxelAugmentVisitor::visit(MetavoxelInfo& info) { · 14 unmodified lines
1865 totalWeight += 1.0f;1983 totalWeight += 1.0f;
1866 break;1984 break;
1867 1985
1868 } else if (materials[j] == 0.0f) {1986 } else if (materials[j] == 0) {
1869 materials[j] = crossing.material;1987 materials[j] = crossing.material;
1870 materialWeights[j] = 1.0f;1988 materialWeights[j] = 1.0f;
1871 totalWeight += 1.0f;1989 totalWeight += 1.0f;
@@ -2149,38 +2267,22 @@ void DefaultMetavoxelRendererImplementation::render(MetavoxelData& data, Metavox · 277 unmodified lines
2149 2267
2150 _pointProgram.release();2268 _pointProgram.release();
2151 2269
2270 glDrawBuffers(sizeof(COLOR_NORMAL_DRAW_BUFFERS) / sizeof(COLOR_NORMAL_DRAW_BUFFERS[0]), COLOR_NORMAL_DRAW_BUFFERS);
2271
2152 glEnable(GL_CULL_FACE);2272 glEnable(GL_CULL_FACE);
2153 glEnable(GL_ALPHA_TEST);2273 glEnable(GL_ALPHA_TEST);
2154 glAlphaFunc(GL_EQUAL, 0.0f);2274 glAlphaFunc(GL_EQUAL, 0.0f);
2155 2275
2156 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);2276 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
2157 2277
2158 ProgramObject* program = &_heightfieldProgram;2278 _baseHeightfieldProgram.bind();
2159 if (Menu::getInstance()->getShadowsEnabled()) {
2160 if (Menu::getInstance()->isOptionChecked(MenuOption::CascadedShadows)) {
2161 _cascadedShadowLightHeightfieldProgram.bind();
2162 _cascadedShadowLightHeightfieldProgram.setUniform(_shadowLightDistancesLocation,
2163 Application::getInstance()->getShadowDistances());
2164 program = &_cascadedShadowMapHeightfieldProgram;
2165 program->bind();
2166 program->setUniform(_shadowDistancesLocation, Application::getInstance()->getShadowDistances());
2167
2168 } else {
2169 program = &_shadowMapHeightfieldProgram;
2170 }
2171 glActiveTexture(GL_TEXTURE2);
2172 glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getShadowDepthTextureID());
2173 glActiveTexture(GL_TEXTURE0);
2174 }
2175
2176 program->bind();
2177 2279
2178 glEnableClientState(GL_TEXTURE_COORD_ARRAY);2280 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
2179 2281
2180 BufferRenderVisitor heightfieldRenderVisitor(Application::getInstance()->getMetavoxels()->getHeightfieldBufferAttribute());2282 BufferRenderVisitor heightfieldRenderVisitor(Application::getInstance()->getMetavoxels()->getHeightfieldBufferAttribute());
2181 data.guide(heightfieldRenderVisitor);2283 data.guide(heightfieldRenderVisitor);
2182 2284
2183 program->release();2285 _baseHeightfieldProgram.release();
2184 2286
2185 glActiveTexture(GL_TEXTURE2);2287 glActiveTexture(GL_TEXTURE2);
2186 glBindTexture(GL_TEXTURE_2D, 0);2288 glBindTexture(GL_TEXTURE_2D, 0);
@@ -2189,57 +2291,63 @@ void DefaultMetavoxelRendererImplementation::render(MetavoxelData& data, Metavox · 2 unmodified lines
2189 glDisableClientState(GL_TEXTURE_COORD_ARRAY);2291 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
2190 glDisableClientState(GL_VERTEX_ARRAY);2292 glDisableClientState(GL_VERTEX_ARRAY);
2191 2293
2192 glDisable(GL_ALPHA_TEST);
2193 glDisable(GL_CULL_FACE);
2194 glEnable(GL_BLEND);
2195
2196 glEnableClientState(GL_VERTEX_ARRAY);2294 glEnableClientState(GL_VERTEX_ARRAY);
2197 glEnableClientState(GL_COLOR_ARRAY);2295 glEnableClientState(GL_COLOR_ARRAY);
2198 glEnableClientState(GL_NORMAL_ARRAY);2296 glEnableClientState(GL_NORMAL_ARRAY);
2199 2297
2200 glEnable(GL_CULL_FACE);2298 _baseVoxelProgram.bind();
2201 2299
2202 BufferRenderVisitor voxelRenderVisitor(Application::getInstance()->getMetavoxels()->getVoxelBufferAttribute());2300 BufferRenderVisitor voxelRenderVisitor(Application::getInstance()->getMetavoxels()->getVoxelBufferAttribute());
2203 data.guide(voxelRenderVisitor);2301 data.guide(voxelRenderVisitor);
2204 2302
2303 _baseVoxelProgram.release();
2304
2305 glDisable(GL_ALPHA_TEST);
2205 glDisable(GL_CULL_FACE);2306 glDisable(GL_CULL_FACE);
2307 glEnable(GL_BLEND);
2206 2308
2207 glDisableClientState(GL_VERTEX_ARRAY);2309 glDisableClientState(GL_VERTEX_ARRAY);
2208 glDisableClientState(GL_COLOR_ARRAY);2310 glDisableClientState(GL_COLOR_ARRAY);
2209 glDisableClientState(GL_NORMAL_ARRAY);2311 glDisableClientState(GL_NORMAL_ARRAY);
2312
2313 glDrawBuffers(sizeof(COLOR_DRAW_BUFFERS) / sizeof(COLOR_DRAW_BUFFERS[0]), COLOR_DRAW_BUFFERS);
2314}
2315
2316void DefaultMetavoxelRendererImplementation::loadSplatProgram(const char* type,
2317 ProgramObject& program, SplatLocations& locations) {
2318 program.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +
2319 "shaders/metavoxel_" + type + "_splat.vert");
2320 program.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() +
2321 "shaders/metavoxel_" + type + "_splat.frag");
2322 program.link();
2323
2324 program.bind();
2325 program.setUniformValue("heightMap", 0);
2326 program.setUniformValue("textureMap", 1);
2327 program.setUniformValueArray("diffuseMaps", SPLAT_TEXTURE_UNITS, SPLAT_COUNT);
2328 locations.heightScale = program.uniformLocation("heightScale");
2329 locations.textureScale = program.uniformLocation("textureScale");
2330 locations.splatTextureOffset = program.uniformLocation("splatTextureOffset");
2331 locations.splatTextureScalesS = program.uniformLocation("splatTextureScalesS");
2332 locations.splatTextureScalesT = program.uniformLocation("splatTextureScalesT");
2333 locations.textureValueMinima = program.uniformLocation("textureValueMinima");
2334 locations.textureValueMaxima = program.uniformLocation("textureValueMaxima");
2335 locations.materials = program.attributeLocation("materials");
2336 locations.materialWeights = program.attributeLocation("materialWeights");
2337 program.release();
2210}2338}
2211 2339
2212ProgramObject DefaultMetavoxelRendererImplementation::_pointProgram;2340ProgramObject DefaultMetavoxelRendererImplementation::_pointProgram;
2213int DefaultMetavoxelRendererImplementation::_pointScaleLocation;2341int DefaultMetavoxelRendererImplementation::_pointScaleLocation;
2214ProgramObject DefaultMetavoxelRendererImplementation::_heightfieldProgram;
2215int DefaultMetavoxelRendererImplementation::_heightScaleLocation;
2216int DefaultMetavoxelRendererImplementation::_colorScaleLocation;
2217ProgramObject DefaultMetavoxelRendererImplementation::_shadowMapHeightfieldProgram;
2218int DefaultMetavoxelRendererImplementation::_shadowMapHeightScaleLocation;
2219int DefaultMetavoxelRendererImplementation::_shadowMapColorScaleLocation;
2220ProgramObject DefaultMetavoxelRendererImplementation::_cascadedShadowMapHeightfieldProgram;
2221int DefaultMetavoxelRendererImplementation::_cascadedShadowMapHeightScaleLocation;
2222int DefaultMetavoxelRendererImplementation::_cascadedShadowMapColorScaleLocation;
2223int DefaultMetavoxelRendererImplementation::_shadowDistancesLocation;
2224ProgramObject DefaultMetavoxelRendererImplementation::_baseHeightfieldProgram;2342ProgramObject DefaultMetavoxelRendererImplementation::_baseHeightfieldProgram;
2225int DefaultMetavoxelRendererImplementation::_baseHeightScaleLocation;2343int DefaultMetavoxelRendererImplementation::_baseHeightScaleLocation;
2226int DefaultMetavoxelRendererImplementation::_baseColorScaleLocation;2344int DefaultMetavoxelRendererImplementation::_baseColorScaleLocation;
2227ProgramObject DefaultMetavoxelRendererImplementation::_splatHeightfieldProgram;2345ProgramObject DefaultMetavoxelRendererImplementation::_splatHeightfieldProgram;
2228int DefaultMetavoxelRendererImplementation::_splatHeightScaleLocation;2346DefaultMetavoxelRendererImplementation::SplatLocations DefaultMetavoxelRendererImplementation::_splatHeightfieldLocations;
2229int DefaultMetavoxelRendererImplementation::_splatTextureScaleLocation;
2230int DefaultMetavoxelRendererImplementation::_splatTextureOffsetLocation;
2231int DefaultMetavoxelRendererImplementation::_splatTextureScalesSLocation;
2232int DefaultMetavoxelRendererImplementation::_splatTextureScalesTLocation;
2233int DefaultMetavoxelRendererImplementation::_splatTextureValueMinimaLocation;
2234int DefaultMetavoxelRendererImplementation::_splatTextureValueMaximaLocation;
2235ProgramObject DefaultMetavoxelRendererImplementation::_lightHeightfieldProgram;
2236int DefaultMetavoxelRendererImplementation::_lightHeightScaleLocation;
2237ProgramObject DefaultMetavoxelRendererImplementation::_shadowLightHeightfieldProgram;
2238int DefaultMetavoxelRendererImplementation::_shadowLightHeightScaleLocation;
2239ProgramObject DefaultMetavoxelRendererImplementation::_cascadedShadowLightHeightfieldProgram;
2240int DefaultMetavoxelRendererImplementation::_cascadedShadowLightHeightScaleLocation;
2241int DefaultMetavoxelRendererImplementation::_shadowLightDistancesLocation;
2242ProgramObject DefaultMetavoxelRendererImplementation::_heightfieldCursorProgram;2347ProgramObject DefaultMetavoxelRendererImplementation::_heightfieldCursorProgram;
2348ProgramObject DefaultMetavoxelRendererImplementation::_baseVoxelProgram;
2349ProgramObject DefaultMetavoxelRendererImplementation::_splatVoxelProgram;
2350DefaultMetavoxelRendererImplementation::SplatLocations DefaultMetavoxelRendererImplementation::_splatVoxelLocations;
2243 2351
2244static void enableClipPlane(GLenum plane, float x, float y, float z, float w) {2352static void enableClipPlane(GLenum plane, float x, float y, float z, float w) {
2245 GLdouble coefficients[] = { x, y, z, w };2353 GLdouble coefficients[] = { x, y, z, w };