History

fix byte normals, fix crashes in switching between voxel shader and normal mode

ZappoMan committed 13 years ago

Commit eb6af1a1 parent 2487a553 files · +65 −15Browse files

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

Unified · Split

interface/src/VoxelSystem.cpp+60−15
@@ -37,7 +37,7 @@ float identityVertices[] = { 0,0,0, 1,0,0, 1,1,0, 0,1,0, 0,0,1, 1,0,1, 1,1,1, 0, · 36 unmodified lines
37 0,0,0, 1,0,0, 1,1,0, 0,1,0, 0,0,1, 1,0,1, 1,1,1, 0,1,1,37 0,0,0, 1,0,0, 1,1,0, 0,1,0, 0,0,1, 1,0,1, 1,1,1, 0,1,1,
38 0,0,0, 1,0,0, 1,1,0, 0,1,0, 0,0,1, 1,0,1, 1,1,1, 0,1,1 };38 0,0,0, 1,0,0, 1,1,0, 0,1,0, 0,0,1, 1,0,1, 1,1,1, 0,1,1 };
39 39
40GLbyte identityNormals[] = { 0,0,-1, 0,0,-1, 0,0,-1, 0,0,-1,40GLfloat identityNormals[] = { 0,0,-1, 0,0,-1, 0,0,-1, 0,0,-1,
41 0,0,+1, 0,0,+1, 0,0,+1, 0,0,+1,41 0,0,+1, 0,0,+1, 0,0,+1, 0,0,+1,
42 0,-1,0, 0,-1,0, 0,+1,0, 0,+1,0,42 0,-1,0, 0,-1,0, 0,+1,0, 0,+1,0,
43 0,-1,0, 0,-1,0, 0,+1,0, 0,+1,0,43 0,-1,0, 0,-1,0, 0,+1,0, 0,+1,0,
@@ -152,6 +152,10 @@ void VoxelSystem::setUseByteNormals(bool useByteNormals) { · 108 unmodified lines
152 init();152 init();
153 }153 }
154 pthread_mutex_unlock(&_bufferWriteLock);154 pthread_mutex_unlock(&_bufferWriteLock);
155
156 if (wasInitialized) {
157 forceRedrawEntireTree();
158 }
155}159}
156 160
157 161
@@ -166,12 +170,17 @@ void VoxelSystem::setMaxVoxels(int maxVoxels) { · 8 unmodified lines
166 init();170 init();
167 }171 }
168 pthread_mutex_unlock(&_bufferWriteLock);172 pthread_mutex_unlock(&_bufferWriteLock);
173
174 if (wasInitialized) {
175 forceRedrawEntireTree();
176 }
169}177}
170 178
171void VoxelSystem::setUseVoxelShader(bool useVoxelShader) {179void VoxelSystem::setUseVoxelShader(bool useVoxelShader) {
172 pthread_mutex_lock(&_bufferWriteLock);180 pthread_mutex_lock(&_bufferWriteLock);
173 bool wasInitialized = _initialized;181 bool wasInitialized = _initialized;
174 if (wasInitialized) {182 if (wasInitialized) {
183 clearAllNodesBufferIndex();
175 cleanupVoxelMemory();184 cleanupVoxelMemory();
176 }185 }
177 _useVoxelShader = useVoxelShader;186 _useVoxelShader = useVoxelShader;
@@ -179,6 +188,10 @@ void VoxelSystem::setUseVoxelShader(bool useVoxelShader) { · 1 unmodified line
179 init();188 init();
180 }189 }
181 pthread_mutex_unlock(&_bufferWriteLock);190 pthread_mutex_unlock(&_bufferWriteLock);
191
192 if (wasInitialized) {
193 forceRedrawEntireTree();
194 }
182}195}
183 196
184void VoxelSystem::cleanupVoxelMemory() {197void VoxelSystem::cleanupVoxelMemory() {
@@ -266,7 +279,7 @@ void VoxelSystem::initVoxelMemory() { · 81 unmodified lines
266 // populate the normalsArray279 // populate the normalsArray
267 for (int n = 0; n < _maxVoxels; n++) {280 for (int n = 0; n < _maxVoxels; n++) {
268 for (int i = 0; i < VERTEX_POINTS_PER_VOXEL; i++) {281 for (int i = 0; i < VERTEX_POINTS_PER_VOXEL; i++) {
269 *(normalsArrayEndPointer++) = identityNormals[i];282 *(normalsArrayEndPointer++) = (identityNormals[i] * CHAR_MAX);
270 }283 }
271 }284 }
272 285
@@ -750,20 +763,24 @@ void VoxelSystem::updateNodeInArrays(glBufferIndex nodeIndex, const glm::vec3& s · 477 unmodified lines
750 float voxelScale, const nodeColor& color) {763 float voxelScale, const nodeColor& color) {
751 764
752 if (_useVoxelShader) {765 if (_useVoxelShader) {
753 VoxelShaderVBOData* writeVerticesAt = &_writeVoxelShaderData[nodeIndex];766 if (_writeVoxelShaderData) {
754 writeVerticesAt->x = startVertex.x * TREE_SCALE;767 VoxelShaderVBOData* writeVerticesAt = &_writeVoxelShaderData[nodeIndex];
755 writeVerticesAt->y = startVertex.y * TREE_SCALE;768 writeVerticesAt->x = startVertex.x * TREE_SCALE;
756 writeVerticesAt->z = startVertex.z * TREE_SCALE;769 writeVerticesAt->y = startVertex.y * TREE_SCALE;
757 writeVerticesAt->s = voxelScale * TREE_SCALE;770 writeVerticesAt->z = startVertex.z * TREE_SCALE;
758 writeVerticesAt->r = color[RED_INDEX];771 writeVerticesAt->s = voxelScale * TREE_SCALE;
759 writeVerticesAt->g = color[GREEN_INDEX];772 writeVerticesAt->r = color[RED_INDEX];
760 writeVerticesAt->b = color[BLUE_INDEX];773 writeVerticesAt->g = color[GREEN_INDEX];
774 writeVerticesAt->b = color[BLUE_INDEX];
775 }
761 } else {776 } else {
762 for (int j = 0; j < VERTEX_POINTS_PER_VOXEL; j++ ) {777 if (_writeVerticesArray && _writeColorsArray) {
763 GLfloat* writeVerticesAt = _writeVerticesArray + (nodeIndex * VERTEX_POINTS_PER_VOXEL);778 for (int j = 0; j < VERTEX_POINTS_PER_VOXEL; j++ ) {
764 GLubyte* writeColorsAt = _writeColorsArray + (nodeIndex * VERTEX_POINTS_PER_VOXEL);779 GLfloat* writeVerticesAt = _writeVerticesArray + (nodeIndex * VERTEX_POINTS_PER_VOXEL);
765 *(writeVerticesAt+j) = startVertex[j % 3] + (identityVertices[j] * voxelScale);780 GLubyte* writeColorsAt = _writeColorsArray + (nodeIndex * VERTEX_POINTS_PER_VOXEL);
766 *(writeColorsAt +j) = color[j % 3];781 *(writeVerticesAt+j) = startVertex[j % 3] + (identityVertices[j] * voxelScale);
782 *(writeColorsAt +j) = color[j % 3];
783 }
767 }784 }
768 }785 }
769}786}
@@ -995,6 +1012,34 @@ void VoxelSystem::killLocalVoxels() { · 225 unmodified lines
995}1012}
996 1013
997 1014
1015bool VoxelSystem::clearAllNodesBufferIndexOperation(VoxelNode* node, void* extraData) {
1016 _nodeCount++;
1017 node->setBufferIndex(GLBUFFER_INDEX_UNKNOWN);
1018 return true;
1019}
1020
1021void VoxelSystem::clearAllNodesBufferIndex() {
1022 _nodeCount = 0;
1023 _tree->recurseTreeWithOperation(clearAllNodesBufferIndexOperation);
1024 qDebug("clearing buffer index of %d nodes\n", _nodeCount);
1025 _tree->setDirtyBit();
1026 setupNewVoxelsForDrawing();
1027}
1028
1029bool VoxelSystem::forceRedrawEntireTreeOperation(VoxelNode* node, void* extraData) {
1030 _nodeCount++;
1031 node->setDirtyBit();
1032 return true;
1033}
1034
1035void VoxelSystem::forceRedrawEntireTree() {
1036 _nodeCount = 0;
1037 _tree->recurseTreeWithOperation(forceRedrawEntireTreeOperation);
1038 qDebug("forcing redraw of %d nodes\n", _nodeCount);
1039 _tree->setDirtyBit();
1040 setupNewVoxelsForDrawing();
1041}
1042
998bool VoxelSystem::randomColorOperation(VoxelNode* node, void* extraData) {1043bool VoxelSystem::randomColorOperation(VoxelNode* node, void* extraData) {
999 _nodeCount++;1044 _nodeCount++;
1000 if (node->isColored()) {1045 if (node->isColored()) {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t