History

fix to LOD bug caused by flip-flopped X and Z, add color randomization to inserted voxels on server, added head position display to display_stats()

ZappoMan committed 13 years ago

Commit 57829781 parent b017f9a4 files · +66 −14Browse files

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

Unified · Split

interface/src/VoxelSystem.cpp+27−6
@@ -133,12 +133,35 @@ int VoxelSystem::treeToArrays(VoxelNode *currentNode, float nodePosition[3]) { · 132 unmodified lines
133133
134134 float halfUnitForVoxel = powf(0.5, *currentNode->octalCode) * (0.5 * TREE_SCALE);
135135 glm::vec3 viewerPosition = viewerHead->getPos();
136+
137+ // XXXBHG - Note: It appears as if the X and Z coordinates of Head or Agent are flip-flopped relative to the
138+ // coords of the voxel space. This flip flop causes LOD behavior to be extremely odd. This is my temporary hack
139+ // to fix this behavior. To disable this swap, set swapXandZ to false.
140+ bool swapXandZ=true;
141+ float viewerX = swapXandZ ? viewerPosition[2] : viewerPosition[0];
142+ float viewerZ = swapXandZ ? viewerPosition[0] : viewerPosition[2];
143+
144+ // debugging code.
145+ //printf("treeToArrays() halfUnitForVoxel=%f\n",halfUnitForVoxel);
146+ //printf("treeToArrays() viewerPosition {x,y,z or [0],[1],[2]} ={%f,%f,%f}\n",
147+ // viewerPosition[0],viewerPosition[1],viewerPosition[2]);
148+ //printf("treeToArrays() nodePosition {x,y,z or [0],[1],[2]} = {%f,%f,%f}\n",
149+ // nodePosition[0],nodePosition[1],nodePosition[2]);
150+ //float* vertices = firstVertexForCode(currentNode->octalCode);
151+ //printf("treeToArrays() firstVerticesForCode(currentNode->octalCode)={x,y,z or [0],[1],[2]} = {%f,%f,%f}\n",
152+ // vertices[0],vertices[1],vertices[2]);
153+ //delete []vertices;
136154
137− float distanceToVoxelCenter = sqrtf(powf(viewerPosition[0] - nodePosition[0] - halfUnitForVoxel, 2) +
155+ float distanceToVoxelCenter = sqrtf(powf(viewerX - nodePosition[0] - halfUnitForVoxel, 2) +
138156 powf(viewerPosition[1] - nodePosition[1] - halfUnitForVoxel, 2) +
139− powf(viewerPosition[2] - nodePosition[2] - halfUnitForVoxel, 2));
140−
141− if (distanceToVoxelCenter < boundaryDistanceForRenderLevel(*currentNode->octalCode + 1)) {
157+ powf(viewerZ - nodePosition[2] - halfUnitForVoxel, 2));
158+
159+ int boundaryPosition = boundaryDistanceForRenderLevel(*currentNode->octalCode + 1);
160+ //printf("treeToArrays() distanceToVoxelCenter=%f boundaryPosition=%d\n",distanceToVoxelCenter,boundaryPosition);
161+
162+ bool alwaysDraw = false; // XXXBHG - temporary debug code. Flip this to true to disable LOD blurring
163+
164+ if (alwaysDraw || distanceToVoxelCenter < boundaryPosition) {
142165 for (int i = 0; i < 8; i++) {
143166 // check if there is a child here
144167 if (currentNode->children[i] != NULL) {
@@ -155,8 +178,6 @@ int VoxelSystem::treeToArrays(VoxelNode *currentNode, float nodePosition[3]) { · 10 unmodified lines
155178 childNodePosition[j] -= (powf(0.5, *currentNode->children[i]->octalCode) * TREE_SCALE);
156179 }
157180 }
158−
159−
160181 voxelsAdded += treeToArrays(currentNode->children[i], childNodePosition);
161182 }
162183 }