Showing the changes to interface/src/VoxelSystem.cpp (1 of 5 files). Show all
Unified · Split
| @@ -51,6 +51,10 @@ VoxelSystem::~VoxelSystem() { · 50 unmodified lines | ||
| 51 | 51 | pthread_mutex_destroy(&bufferWriteLock); |
| 52 | 52 | } |
| 53 | 53 | |
| 54 | +void VoxelSystem::setViewerHead(Head *newViewerHead) { | |
| 55 | + viewerHead = newViewerHead; | |
| 56 | +} | |
| 57 | + | |
| 54 | 58 | ////////////////////////////////////////////////////////////////////////////////////////// |
| 55 | 59 | // Method: VoxelSystem::loadVoxelsFile() |
| 56 | 60 | // Description: Loads HiFidelity encoded Voxels from a binary file. The current file |
| @@ -94,7 +98,8 @@ void VoxelSystem::setupNewVoxelsForDrawing() { · 37 unmodified lines | ||
| 94 | 98 | writeVerticesEndPointer = writeVerticesArray; |
| 95 | 99 | // call recursive function to populate in memory arrays |
| 96 | 100 | // it will return the number of voxels added |
| 97 | − voxelsRendered = treeToArrays(tree->rootNode); | |
| 101 | + float treeRoot[3] = {0,0,0}; | |
| 102 | + voxelsRendered = treeToArrays(tree->rootNode, treeRoot); | |
| 98 | 103 | |
| 99 | 104 | // copy the newly written data to the arrays designated for reading |
| 100 | 105 | copyWrittenDataToReadArrays(); |
| @@ -114,16 +119,42 @@ void VoxelSystem::copyWrittenDataToReadArrays() { · 13 unmodified lines | ||
| 114 | 119 | pthread_mutex_unlock(&bufferWriteLock); |
| 115 | 120 | } |
| 116 | 121 | |
| 117 | −int VoxelSystem::treeToArrays(VoxelNode *currentNode) { | |
| 122 | +int VoxelSystem::treeToArrays(VoxelNode *currentNode, float nodePosition[3]) { | |
| 118 | 123 | int voxelsAdded = 0; |
| 119 | 124 | |
| 120 | − for (int i = 0; i < 8; i++) { | |
| 121 | − // check if there is a child here | |
| 122 | − if (currentNode->children[i] != NULL) { | |
| 123 | − voxelsAdded += treeToArrays(currentNode->children[i]); | |
| 125 | + float halfUnitForVoxel = powf(0.5, *currentNode->octalCode) * (0.5 * TREE_SCALE); | |
| 126 | + glm::vec3 viewerPosition = viewerHead->getPos(); | |
| 127 | + | |
| 128 | + float distanceToVoxelCenter = sqrtf(powf(viewerPosition[0] - nodePosition[0] - halfUnitForVoxel, 2) + | |
| 129 | + powf(viewerPosition[1] - nodePosition[1] - halfUnitForVoxel, 2) + | |
| 130 | + powf(viewerPosition[2] - nodePosition[2] - halfUnitForVoxel, 2)); | |
| 131 | + | |
| 132 | + if (distanceToVoxelCenter < boundaryDistanceForRenderLevel(*currentNode->octalCode + 1)) { | |
| 133 | + for (int i = 0; i < 8; i++) { | |
| 134 | + // check if there is a child here | |
| 135 | + if (currentNode->children[i] != NULL) { | |
| 136 | + | |
| 137 | + // calculate the child's position based on the parent position | |
| 138 | + float childNodePosition[3]; | |
| 139 | + | |
| 140 | + for (int j = 0; j < 3; j++) { | |
| 141 | + childNodePosition[j] = nodePosition[j]; | |
| 142 | + | |
| 143 | + if (oneAtBit(branchIndexWithDescendant(currentNode->octalCode, | |
| 144 | + currentNode->children[i]->octalCode), | |
| 145 | + (7 - j))) { | |
| 146 | + childNodePosition[j] -= (powf(0.5, *currentNode->children[i]->octalCode) * TREE_SCALE); | |
| 147 | + } | |
| 148 | + } | |
| 149 | + | |
| 150 | + | |
| 151 | + voxelsAdded += treeToArrays(currentNode->children[i], childNodePosition); | |
| 152 | + } | |
| 124 | 153 | } |
| 125 | 154 | } |
| 126 | 155 | |
| 156 | + | |
| 157 | + | |
| 127 | 158 | // if we didn't get any voxels added then we're a leaf |
| 128 | 159 | // add our vertex and color information to the interleaved array |
| 129 | 160 | if (voxelsAdded == 0 && currentNode->color[3] == 1) { |