History

1) Added createSphere() to VoxelSystem to create a sphere 2) Added pointToVoxel() to SharedUtils, this will give you a voxel code given x,y,z,s,r,g,b 3) Added '.' keyboard interface to create a random sphere in the local voxel system

ZappoMan committed 13 years ago

Commit ef8694d1 parent 8ecc0d55 files · +297 −1Browse files

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

Unified · Split

interface/src/VoxelSystem.cpp+83−0
@@ -98,6 +98,88 @@ void VoxelSystem::loadVoxelsFile(char* fileName) { · 97 unmodified lines
98 voxelsToRender = (voxelsRendered > 0);98 voxelsToRender = (voxelsRendered > 0);
99}99}
100 100
101//////////////////////////////////////////////////////////////////////////////////////////
102// Method: VoxelSystem::createSphere()
103// Description: Creates a sphere of voxels in the local system at a given location/radius
104// To Do: Move this function someplace better? I put it here because we need a
105// mechanism to tell the system to redraw it's arrays after voxels are done
106// being added. This is a concept mostly only understood by VoxelSystem.
107// Complaints: Brad :)
108void VoxelSystem::createSphere(float r,float xc, float yc, float zc, float s, bool solid)
109{
110 // Psuedocode for creating a sphere:
111 //
112 // for (theta from 0 to 2pi):
113 // for (phi from 0 to pi):
114 // x = xc+r*cos(theta)*sin(phi)
115 // y = yc+r*sin(theta)*sin(phi)
116 // z = zc+r*cos(phi)
117
118 int t=0; // total points
119
120 // We want to make sure that as we "sweep" through our angles
121 // we use a delta angle that's small enough to not skip any voxels
122 // we can calculate theta from our desired arc length
123 //
124 // lenArc = ndeg/360deg * 2pi*R
125 // lenArc = theta/2pi * 2pi*R
126 // lenArc = theta*R
127 // theta = lenArc/R
128 // theta = g/r
129 float angleDelta = (s/r);
130
131 // assume solid for now
132 float ri = 0.0;
133 if (!solid)
134 {
135 ri=r; // just the outer surface
136 }
137 // If you also iterate form the interior of the sphere to the radius, makeing
138 // larger and larger sphere's you'd end up with a solid sphere. And lots of voxels!
139 for (; ri <= r; ri+=s)
140 {
141 for (float theta=0.0; theta <= 2*M_PI; theta += angleDelta)
142 {
143 for (float phi=0.0; phi <= M_PI; phi += angleDelta)
144 {
145 t++; // total voxels
146 float x = xc+r*cos(theta)*sin(phi);
147 float y = yc+r*sin(theta)*sin(phi);
148 float z = zc+r*cos(phi);
149 /*
150 std::cout << " r=" << r;
151 std::cout << " theta=" << theta;
152 std::cout << " phi=" << phi;
153 std::cout << " x=" << x;
154 std::cout << " y=" << y;
155 std::cout << " z=" << z;
156 std::cout << " t=" << t;
157 std::cout << std::endl;
158 */
159
160 // random color data
161 unsigned char red = randomColorValue(65);
162 unsigned char green = randomColorValue(65);
163 unsigned char blue = randomColorValue(65);
164
165 unsigned char* voxelData = pointToVoxel(x,y,z,s,red,green,blue);
166 tree->readCodeColorBufferToTree(voxelData);
167 delete voxelData;
168
169 }
170 }
171 }
172
173 // reset the verticesEndPointer so we're writing to the beginning of the array
174 verticesEndPointer = verticesArray;
175 // call recursive function to populate in memory arrays
176 // it will return the number of voxels added
177 voxelsRendered = treeToArrays(tree->rootNode);
178 // set the boolean if there are any voxels to be rendered so we re-fill the VBOs
179 voxelsToRender = (voxelsRendered > 0);
180}
181
182
101void VoxelSystem::parseData(void *data, int size) {183void VoxelSystem::parseData(void *data, int size) {
102 // output the bits received from the voxel server184 // output the bits received from the voxel server
103 unsigned char *voxelData = (unsigned char *) data + 1;185 unsigned char *voxelData = (unsigned char *) data + 1;
@@ -243,3 +325,4 @@ void VoxelSystem::simulate(float deltaTime) { · 139 unmodified lines
243 325
244}326}
245 327
328