[2197] | 1 | #include "dxstdafx.h"
|
---|
| 2 | #include "World.hpp"
|
---|
| 3 |
|
---|
| 4 | World::World()
|
---|
| 5 | {
|
---|
| 6 | virtualWorldObjects = 0x0;
|
---|
| 7 | virtualWorldVertices = 0x0;
|
---|
| 8 | virtualWorldLights = 0x0;
|
---|
| 9 | nVirtualWorldObjects = 0;
|
---|
| 10 | nVirtualWorldVertices = 0;
|
---|
| 11 | nVirtualWorldLights = 0;
|
---|
| 12 | }
|
---|
| 13 |
|
---|
| 14 | void World::createScene(Intersectable* obj)
|
---|
| 15 | {
|
---|
| 16 | obliterate();
|
---|
| 17 | nVirtualWorldLights = 0;
|
---|
| 18 | virtualWorldLights = new Light*[1];
|
---|
| 19 | nVirtualWorldObjects = 1;
|
---|
| 20 | virtualWorldObjects = new Intersectable*[nVirtualWorldObjects];
|
---|
| 21 | nVirtualWorldVertices = 4;
|
---|
| 22 | virtualWorldVertices = new Vector[nVirtualWorldVertices];
|
---|
| 23 |
|
---|
| 24 | virtualWorldObjects[0] = obj;
|
---|
| 25 | kdtree = new KDTree(virtualWorldObjects, nVirtualWorldObjects);
|
---|
| 26 | }
|
---|
| 27 |
|
---|
| 28 | void World::createScene()
|
---|
| 29 | {
|
---|
| 30 | obliterate();
|
---|
| 31 | eyePosition = Vector(10.0f, 0.0f, 0.0f);
|
---|
| 32 | lookPosition = Vector(0.0f, 0.0f, 0.0f);
|
---|
| 33 |
|
---|
| 34 | nVirtualWorldLights = 1;
|
---|
| 35 | virtualWorldLights = new Light*[1];
|
---|
| 36 | nVirtualWorldObjects = 9;
|
---|
| 37 | virtualWorldObjects = new Intersectable*[nVirtualWorldObjects];
|
---|
| 38 |
|
---|
| 39 | nVirtualWorldVertices = 4;
|
---|
| 40 | virtualWorldVertices = new Vector[nVirtualWorldVertices];
|
---|
| 41 | virtualWorldVertices[0] = Vector(2.0f, 1.9f, 2.0f);
|
---|
| 42 | virtualWorldVertices[1] = Vector(2.0f, 1.9f, -2.0f);
|
---|
| 43 | virtualWorldVertices[2] = Vector(-2.0f, 1.9f, -2.0f);
|
---|
| 44 | virtualWorldVertices[3] = Vector(-2.0f, 1.9f, 2.0f);
|
---|
| 45 |
|
---|
| 46 | virtualWorldLights[0] = new SquareLight(virtualWorldVertices, 4, Vector(500.0f, 500.0f, 500.0f));
|
---|
| 47 | virtualWorldSummedLightLuminance = virtualWorldLights[0]->getLuminance();
|
---|
| 48 |
|
---|
| 49 | int iObject = 0;
|
---|
| 50 |
|
---|
| 51 | virtualWorldObjects[iObject++] = new PlaneXAligned(-2.0f, true, &Material::DIFFUSEBLUE);
|
---|
| 52 | virtualWorldObjects[iObject++] = new PlaneXAligned(11.0f, false, &Material::DIFFUSEGREEN);
|
---|
| 53 | virtualWorldObjects[iObject++] = new PlaneYAligned(-2.0f, true, &Material::DIFFUSEGREEN);
|
---|
| 54 | virtualWorldObjects[iObject++] = new PlaneYAligned(2.0f, false, &Material::DIFFUSEYELLOW);
|
---|
| 55 | virtualWorldObjects[iObject++] = new PlaneZAligned(-2.0f, true, &Material::DIFFUSERED);
|
---|
| 56 | virtualWorldObjects[iObject++] = new PlaneZAligned(2.0f, false, &Material::DIFFUSEORANGE);
|
---|
| 57 |
|
---|
| 58 | virtualWorldObjects[iObject++] = new Triangle(
|
---|
| 59 | virtualWorldVertices + 1,
|
---|
| 60 | virtualWorldVertices,
|
---|
| 61 | virtualWorldVertices + 2, new Material(Vector::RGBWHITE, Vector::RGBBLACK, 0.0f,
|
---|
| 62 | Vector(100000.0f, 100000.0f, 10000.0f), Vector::RGBBLACK, 0.0f));
|
---|
| 63 | virtualWorldObjects[iObject++] = new Triangle(
|
---|
| 64 | virtualWorldVertices,
|
---|
| 65 | virtualWorldVertices + 3,
|
---|
| 66 | virtualWorldVertices + 2, new Material(Vector::RGBWHITE, Vector::RGBBLACK, 0.0f,
|
---|
| 67 | Vector(100000.0f, 100000.0f, 10000.0f), Vector::RGBBLACK, 0.0f));
|
---|
| 68 |
|
---|
| 69 | virtualWorldObjects[iObject++] = new Sphere(Vector(0.0f, 0.0f, 0.0f), 1.0f, &Material::SHINYBLACK);
|
---|
| 70 |
|
---|
| 71 | nVirtualWorldObjects = iObject;
|
---|
| 72 | kdtree = new KDTree(virtualWorldObjects, nVirtualWorldObjects);
|
---|
| 73 | }
|
---|
| 74 |
|
---|
| 75 | void World::createScene(std::istream& isc)
|
---|
| 76 | {
|
---|
| 77 | obliterate();
|
---|
| 78 |
|
---|
| 79 | nVirtualWorldMaterials = nVirtualWorldObjects = 0;
|
---|
| 80 |
|
---|
| 81 | objectArraySize = materialArraySize = lightArraySize = 8;
|
---|
| 82 | virtualWorldMaterials = new Material*[8];
|
---|
| 83 | virtualWorldObjects = new Intersectable*[8];
|
---|
| 84 |
|
---|
| 85 | eyePosition = Vector(10.0f, 0.0f, 0.0f);
|
---|
| 86 | lookPosition = Vector(0.0f, 0.0f, 0.0f);
|
---|
| 87 | upwards = Vector(0.0f, 1.0f, 0.0f);
|
---|
| 88 | char keyword[200];
|
---|
| 89 | do{
|
---|
| 90 | isc >> keyword;
|
---|
| 91 | if(strcmp(keyword,"eyePosition") == 0) isc >> eyePosition;
|
---|
| 92 | else if(strcmp(keyword,"lookPosition") == 0) isc >> lookPosition;
|
---|
| 93 | else if(strcmp(keyword,"upwards") == 0) isc >> upwards;
|
---|
| 94 | else if(strcmp(keyword,"Material") == 0)
|
---|
| 95 | {
|
---|
| 96 | if(nVirtualWorldMaterials == materialArraySize)
|
---|
| 97 | {
|
---|
| 98 | materialArraySize += 4;
|
---|
| 99 | Material** largerArray = new Material*[materialArraySize];
|
---|
| 100 | for(int d=0;d<nVirtualWorldMaterials;d++)
|
---|
| 101 | largerArray[d] = virtualWorldMaterials[d];
|
---|
| 102 | delete virtualWorldMaterials;
|
---|
| 103 | virtualWorldMaterials = largerArray;
|
---|
| 104 | }
|
---|
| 105 | virtualWorldMaterials[nVirtualWorldMaterials] = new Material(isc);
|
---|
| 106 | nVirtualWorldMaterials++;
|
---|
| 107 | }
|
---|
| 108 | /* else if(strcmp(keyword,"HDRIMaterial") == 0)
|
---|
| 109 | {
|
---|
| 110 | if(nVirtualWorldMaterials == materialArraySize)
|
---|
| 111 | {
|
---|
| 112 | materialArraySize += 4;
|
---|
| 113 | Material** largerArray = new Material*[materialArraySize];
|
---|
| 114 | for(int d=0;d<nVirtualWorldMaterials;d++)
|
---|
| 115 | largerArray[d] = virtualWorldMaterials[d];
|
---|
| 116 | delete virtualWorldMaterials;
|
---|
| 117 | virtualWorldMaterials = largerArray;
|
---|
| 118 | }
|
---|
| 119 | virtualWorldMaterials[nVirtualWorldMaterials] = new HDRIMaterial(isc);
|
---|
| 120 | nVirtualWorldMaterials++;
|
---|
| 121 | }*/
|
---|
| 122 | else if(strcmp(keyword,"Sphere") == 0)
|
---|
| 123 | {
|
---|
| 124 | if(nVirtualWorldObjects == objectArraySize)
|
---|
| 125 | {
|
---|
| 126 | objectArraySize += 8;
|
---|
| 127 | Intersectable** largerArray = new Intersectable*[objectArraySize];
|
---|
| 128 | for(int d=0;d<nVirtualWorldObjects;d++)
|
---|
| 129 | largerArray[d] = virtualWorldObjects[d];
|
---|
| 130 | delete virtualWorldObjects;
|
---|
| 131 | virtualWorldObjects = largerArray;
|
---|
| 132 | }
|
---|
| 133 | virtualWorldObjects[nVirtualWorldObjects] = new Sphere(isc, virtualWorldMaterials, nVirtualWorldMaterials);
|
---|
| 134 | nVirtualWorldObjects++;
|
---|
| 135 | }
|
---|
| 136 | else if(strcmp(keyword,"Cylinder") == 0)
|
---|
| 137 | {
|
---|
| 138 | if(nVirtualWorldObjects == objectArraySize)
|
---|
| 139 | {
|
---|
| 140 | objectArraySize += 8;
|
---|
| 141 | Intersectable** largerArray = new Intersectable*[objectArraySize];
|
---|
| 142 | for(int d=0;d<nVirtualWorldObjects;d++)
|
---|
| 143 | largerArray[d] = virtualWorldObjects[d];
|
---|
| 144 | delete virtualWorldObjects;
|
---|
| 145 | virtualWorldObjects = largerArray;
|
---|
| 146 | }
|
---|
| 147 | virtualWorldObjects[nVirtualWorldObjects] = new Cylinder(isc, virtualWorldMaterials, nVirtualWorldMaterials);
|
---|
| 148 | nVirtualWorldObjects++;
|
---|
| 149 | }
|
---|
| 150 | else if(strcmp(keyword,"PlaneXAligned") == 0)
|
---|
| 151 | {
|
---|
| 152 | if(nVirtualWorldObjects == objectArraySize)
|
---|
| 153 | {
|
---|
| 154 | objectArraySize += 8;
|
---|
| 155 | Intersectable** largerArray = new Intersectable*[objectArraySize];
|
---|
| 156 | for(int d=0;d<nVirtualWorldObjects;d++)
|
---|
| 157 | largerArray[d] = virtualWorldObjects[d];
|
---|
| 158 | delete virtualWorldObjects;
|
---|
| 159 | virtualWorldObjects = largerArray;
|
---|
| 160 | }
|
---|
| 161 | virtualWorldObjects[nVirtualWorldObjects] = new PlaneXAligned(isc, virtualWorldMaterials, nVirtualWorldMaterials);
|
---|
| 162 | nVirtualWorldObjects++;
|
---|
| 163 | }
|
---|
| 164 | else if(strcmp(keyword,"PlaneYAligned") == 0)
|
---|
| 165 | {
|
---|
| 166 | if(nVirtualWorldObjects == objectArraySize)
|
---|
| 167 | {
|
---|
| 168 | objectArraySize += 8;
|
---|
| 169 | Intersectable** largerArray = new Intersectable*[objectArraySize];
|
---|
| 170 | for(int d=0;d<nVirtualWorldObjects;d++)
|
---|
| 171 | largerArray[d] = virtualWorldObjects[d];
|
---|
| 172 | delete virtualWorldObjects;
|
---|
| 173 | virtualWorldObjects = largerArray;
|
---|
| 174 | }
|
---|
| 175 | virtualWorldObjects[nVirtualWorldObjects] = new PlaneYAligned(isc, virtualWorldMaterials, nVirtualWorldMaterials);
|
---|
| 176 | nVirtualWorldObjects++;
|
---|
| 177 | }
|
---|
| 178 | else if(strcmp(keyword,"PlaneZAligned") == 0)
|
---|
| 179 | {
|
---|
| 180 | if(nVirtualWorldObjects == objectArraySize)
|
---|
| 181 | {
|
---|
| 182 | objectArraySize += 8;
|
---|
| 183 | Intersectable** largerArray = new Intersectable*[objectArraySize];
|
---|
| 184 | for(int d=0;d<nVirtualWorldObjects;d++)
|
---|
| 185 | largerArray[d] = virtualWorldObjects[d];
|
---|
| 186 | delete virtualWorldObjects;
|
---|
| 187 | virtualWorldObjects = largerArray;
|
---|
| 188 | }
|
---|
| 189 | virtualWorldObjects[nVirtualWorldObjects] = new PlaneZAligned(isc, virtualWorldMaterials, nVirtualWorldMaterials);
|
---|
| 190 | nVirtualWorldObjects++;
|
---|
| 191 | }
|
---|
| 192 | else if(strcmp(keyword,"TriangleMesh") == 0)
|
---|
| 193 | {
|
---|
| 194 | if(nVirtualWorldObjects == objectArraySize)
|
---|
| 195 | {
|
---|
| 196 | objectArraySize += 8;
|
---|
| 197 | Intersectable** largerArray = new Intersectable*[objectArraySize];
|
---|
| 198 | for(int d=0;d<nVirtualWorldObjects;d++)
|
---|
| 199 | largerArray[d] = virtualWorldObjects[d];
|
---|
| 200 | delete virtualWorldObjects;
|
---|
| 201 | virtualWorldObjects = largerArray;
|
---|
| 202 | }
|
---|
| 203 | virtualWorldObjects[nVirtualWorldObjects] = new TriangleMesh(isc, virtualWorldMaterials, nVirtualWorldMaterials);
|
---|
| 204 | nVirtualWorldObjects++;
|
---|
| 205 | }
|
---|
| 206 | else if(strcmp(keyword,"Transformed") == 0)
|
---|
| 207 | {
|
---|
| 208 | if(nVirtualWorldObjects == objectArraySize)
|
---|
| 209 | {
|
---|
| 210 | objectArraySize += 8;
|
---|
| 211 | Intersectable** largerArray = new Intersectable*[objectArraySize];
|
---|
| 212 | for(int d=0;d<nVirtualWorldObjects;d++)
|
---|
| 213 | largerArray[d] = virtualWorldObjects[d];
|
---|
| 214 | delete virtualWorldObjects;
|
---|
| 215 | virtualWorldObjects = largerArray;
|
---|
| 216 | }
|
---|
| 217 | virtualWorldObjects[nVirtualWorldObjects] = new Transformed(isc, virtualWorldMaterials, nVirtualWorldMaterials);
|
---|
| 218 | nVirtualWorldObjects++;
|
---|
| 219 | }
|
---|
| 220 | else if(strcmp(keyword,"EnvironmentCube") == 0)
|
---|
| 221 | createEnvironmentMap(isc);
|
---|
| 222 | else if(strcmp(keyword,"SkyscraperArray") == 0)
|
---|
| 223 | {
|
---|
| 224 | Material* skymat1; Material* skymat2; Material* skymat3; Material* skymat4;
|
---|
| 225 | char ky[200];
|
---|
| 226 | isc >> ky;
|
---|
| 227 | for(int i=0; i < nVirtualWorldMaterials; i++)
|
---|
| 228 | {
|
---|
| 229 | skymat1 = virtualWorldMaterials[i];
|
---|
| 230 | if(strcmp(ky, skymat1->getName()) == 0) break;
|
---|
| 231 | }
|
---|
| 232 | isc >> ky;
|
---|
| 233 | for(int i=0; i < nVirtualWorldMaterials; i++)
|
---|
| 234 | {
|
---|
| 235 | skymat2 = virtualWorldMaterials[i];
|
---|
| 236 | if(strcmp(ky, skymat2->getName()) == 0) break;
|
---|
| 237 | }
|
---|
| 238 | isc >> ky;
|
---|
| 239 | for(int i=0; i < nVirtualWorldMaterials; i++)
|
---|
| 240 | {
|
---|
| 241 | skymat3 = virtualWorldMaterials[i];
|
---|
| 242 | if(strcmp(ky, skymat3->getName()) == 0) break;
|
---|
| 243 | }
|
---|
| 244 | isc >> ky;
|
---|
| 245 | for(int i=0; i < nVirtualWorldMaterials; i++)
|
---|
| 246 | {
|
---|
| 247 | skymat4 = virtualWorldMaterials[i];
|
---|
| 248 | if(strcmp(ky, skymat4->getName()) == 0) break;
|
---|
| 249 | }
|
---|
| 250 | int rows, cols;
|
---|
| 251 | float edge, street, minHeight, maxHeight;
|
---|
| 252 | isc >> rows >> cols;
|
---|
| 253 | {
|
---|
| 254 | objectArraySize += rows * cols * 6;
|
---|
| 255 | Intersectable** largerArray = new Intersectable*[objectArraySize];
|
---|
| 256 | for(int d=0;d<nVirtualWorldObjects;d++)
|
---|
| 257 | largerArray[d] = virtualWorldObjects[d];
|
---|
| 258 | delete virtualWorldObjects;
|
---|
| 259 | virtualWorldObjects = largerArray;
|
---|
| 260 | }
|
---|
| 261 | isc >> edge >> street >> minHeight >> maxHeight;
|
---|
| 262 | for(int r=0; r < rows; r++)
|
---|
| 263 | for(int c=0; c < cols; c++)
|
---|
| 264 | {
|
---|
| 265 | Material* skymat;
|
---|
| 266 | float marand = (float)rand() / (float)RAND_MAX;
|
---|
| 267 | if(marand < 0.25f)
|
---|
| 268 | skymat = skymat1;
|
---|
| 269 | else if(marand < 0.5f)
|
---|
| 270 | skymat = skymat2;
|
---|
| 271 | else if(marand < 0.75f)
|
---|
| 272 | skymat = skymat3;
|
---|
| 273 | else
|
---|
| 274 | skymat = skymat4;
|
---|
| 275 | float xMin = r * (edge + street);
|
---|
| 276 | float xMax = xMin + edge;
|
---|
| 277 | float yMin = c * (edge + street);
|
---|
| 278 | float yMax = yMin + edge;
|
---|
| 279 | float height = minHeight + (maxHeight - minHeight) * (float)rand() / (float)RAND_MAX;
|
---|
| 280 | PlaneXAligned* p = new PlaneXAligned(xMin, false, skymat);
|
---|
| 281 | p->yMin = yMin; p->yMax = yMax;
|
---|
| 282 | p->zMin = 0.0f; p->zMax = height;
|
---|
| 283 | p->bbox.minPoint.x = p->bbox.maxPoint.x = xMin;
|
---|
| 284 | p->bbox.maxPoint.y = yMax;
|
---|
| 285 | p->bbox.maxPoint.z = height;
|
---|
| 286 | p->bbox.minPoint.y = yMin;
|
---|
| 287 | p->bbox.minPoint.z = 0.0f;
|
---|
| 288 | virtualWorldObjects[nVirtualWorldObjects++] = p;
|
---|
| 289 | p = new PlaneXAligned(xMax, true, skymat);
|
---|
| 290 | p->yMin = yMin; p->yMax = yMax;
|
---|
| 291 | p->zMin = 0.0f; p->zMax = height;
|
---|
| 292 | p->bbox.minPoint.x = p->bbox.maxPoint.x = xMax;
|
---|
| 293 | p->bbox.maxPoint.y = yMax;
|
---|
| 294 | p->bbox.maxPoint.z = height;
|
---|
| 295 | p->bbox.minPoint.y = yMin;
|
---|
| 296 | p->bbox.minPoint.z = 0.0f;
|
---|
| 297 | virtualWorldObjects[nVirtualWorldObjects++] = p;
|
---|
| 298 | PlaneYAligned* py = new PlaneYAligned(yMin, false, skymat);
|
---|
| 299 | py->xMin = xMin; py->xMax = xMax;
|
---|
| 300 | py->zMin = 0.0f; py->zMax = height;
|
---|
| 301 | py->bbox.minPoint.y = py->bbox.maxPoint.y = yMin;
|
---|
| 302 | py->bbox.maxPoint.x = xMax;
|
---|
| 303 | py->bbox.maxPoint.z = height;
|
---|
| 304 | py->bbox.minPoint.x = xMin;
|
---|
| 305 | py->bbox.minPoint.z = 0.0f;
|
---|
| 306 | virtualWorldObjects[nVirtualWorldObjects++] = py;
|
---|
| 307 | py = new PlaneYAligned(yMax, true, skymat);
|
---|
| 308 | py->xMin = xMin; py->xMax = xMax;
|
---|
| 309 | py->zMin = 0.0f; py->zMax = height;
|
---|
| 310 | py->bbox.minPoint.y = py->bbox.maxPoint.y = yMax;
|
---|
| 311 | py->bbox.maxPoint.x = xMax;
|
---|
| 312 | py->bbox.maxPoint.z = height;
|
---|
| 313 | py->bbox.minPoint.x = xMin;
|
---|
| 314 | py->bbox.minPoint.z = 0.0f;
|
---|
| 315 | virtualWorldObjects[nVirtualWorldObjects++] = py;
|
---|
| 316 | PlaneZAligned* pz = new PlaneZAligned(0.0f, false, skymat);
|
---|
| 317 | pz->xMin = xMin; pz->xMax = xMax;
|
---|
| 318 | pz->yMin = yMin; pz->yMax = yMax;
|
---|
| 319 | pz->bbox.minPoint.z = pz->bbox.maxPoint.z = 0.0;
|
---|
| 320 | pz->bbox.maxPoint.x = xMax;
|
---|
| 321 | pz->bbox.maxPoint.y = yMax;
|
---|
| 322 | pz->bbox.minPoint.x = xMin;
|
---|
| 323 | pz->bbox.minPoint.y = yMin;
|
---|
| 324 | virtualWorldObjects[nVirtualWorldObjects++] = pz;
|
---|
| 325 | pz = new PlaneZAligned(height, true, skymat);
|
---|
| 326 | pz->xMin = xMin; pz->xMax = xMax;
|
---|
| 327 | pz->yMin = yMin; pz->yMax = yMax;
|
---|
| 328 | pz->bbox.minPoint.z = pz->bbox.maxPoint.z = height;
|
---|
| 329 | pz->bbox.maxPoint.x = xMax;
|
---|
| 330 | pz->bbox.maxPoint.y = yMax;
|
---|
| 331 | pz->bbox.minPoint.x = xMin;
|
---|
| 332 | pz->bbox.minPoint.y = yMin;
|
---|
| 333 | virtualWorldObjects[nVirtualWorldObjects++] = pz;
|
---|
| 334 |
|
---|
| 335 | }
|
---|
| 336 | }
|
---|
| 337 | }while(strcmp(keyword,"end") != 0);
|
---|
| 338 |
|
---|
| 339 | nVirtualWorldLights = 0;
|
---|
| 340 | for(int iLightCounter=0;iLightCounter < nVirtualWorldObjects;iLightCounter++)
|
---|
| 341 | if(virtualWorldObjects[iLightCounter]->getMaterial()->isEmissive())
|
---|
| 342 | nVirtualWorldLights++;
|
---|
| 343 |
|
---|
| 344 | virtualWorldLights = new Light*[nVirtualWorldLights];
|
---|
| 345 |
|
---|
| 346 | int iLightPlacer = 0;
|
---|
| 347 | virtualWorldSummedLightLuminance = 0.0f;
|
---|
| 348 |
|
---|
| 349 | for(int iLightMaker=0;iLightMaker < nVirtualWorldObjects;iLightMaker++)
|
---|
| 350 | if(virtualWorldObjects[iLightMaker]->getMaterial()->isEmissive())
|
---|
| 351 | {
|
---|
| 352 | virtualWorldLights[iLightPlacer] = virtualWorldObjects[iLightMaker]->makeLight();
|
---|
| 353 | virtualWorldSummedLightLuminance += virtualWorldLights[iLightPlacer]->getLuminance();
|
---|
| 354 | iLightPlacer++;
|
---|
| 355 | }
|
---|
| 356 |
|
---|
| 357 | kdtree = new KDTree(virtualWorldObjects, nVirtualWorldObjects);
|
---|
| 358 | }
|
---|
| 359 |
|
---|
| 360 | void World::obliterate()
|
---|
| 361 | {
|
---|
| 362 | if(virtualWorldObjects)
|
---|
| 363 | delete virtualWorldObjects;
|
---|
| 364 | if(virtualWorldVertices)
|
---|
| 365 | delete virtualWorldVertices;
|
---|
| 366 | if(virtualWorldLights)
|
---|
| 367 | delete virtualWorldLights;
|
---|
| 368 | }
|
---|
| 369 |
|
---|
| 370 | /*
|
---|
| 371 | nVirtualWorldLights = 4;
|
---|
| 372 | virtualWorldLights = new Light[4];
|
---|
| 373 | nVirtualWorldVertices = 81;
|
---|
| 374 | virtualWorldVertices = new Vector[nVirtualWorldVertices];
|
---|
| 375 | float b = 1.0f / sqrtf(2.0f);
|
---|
| 376 | virtualWorldLights[0] = Light(Vector(10.0f, 0.0f, 14.0f), Vector(110000.0f, 110000.0f, 110000.0f), Vector(b, 0.0f, -b));
|
---|
| 377 | virtualWorldLights[1] = Light(Vector(-10.0f, 0.0f, 14.0f), Vector(110000.0f, 110000.0f, 110000.0f), Vector(-b, 0.0f, -b));
|
---|
| 378 | virtualWorldLights[2] = Light(Vector(0.0f, 10.0f, 14.0f), Vector(110000.0f, 110000.0f, 110000.0f), Vector(0.0f, b, -b));
|
---|
| 379 | virtualWorldLights[3] = Light(Vector(0.0f, -10.0f, 14.0f), Vector(110000.0f, 110000.0f, 110000.0f), Vector(0.0f, -b, -b));
|
---|
| 380 |
|
---|
| 381 | virtualWorldSummedLightLuminance = virtualWorldLights[0].getLuminance()
|
---|
| 382 | +
|
---|
| 383 | virtualWorldLights[1].getLuminance()
|
---|
| 384 | +
|
---|
| 385 | virtualWorldLights[2].getLuminance()
|
---|
| 386 | +
|
---|
| 387 | virtualWorldLights[3].getLuminance()
|
---|
| 388 | ;
|
---|
| 389 |
|
---|
| 390 | Material* tmat = new Material(Vector(0.6f, 0.6f, 0.1f), Vector(0.3f, 0.3f, 0.3f), 3.0f);
|
---|
| 391 | // Material* glass = new Material(Vector(0.1f, 0.5f, 0.1f), Vector(0.15f, 0.15f, 0.15f), 3.0f);
|
---|
| 392 | // glass->makeRefractiveAndIdeal(0.95f, Vector(0.7f, 0.6f, 0.5f), Vector(0.25f, 0.2f, 0.15f));
|
---|
| 393 | // Material* woodmat = new WoodMaterial();
|
---|
| 394 |
|
---|
| 395 | nVirtualWorldObjects = 7;
|
---|
| 396 | virtualWorldObjects = new Intersectable*[19];
|
---|
| 397 | TriangleMesh* pot = new TriangleMesh(isc, tmat);
|
---|
| 398 | // TriangleMesh* not = new TriangleMesh(isc, &Material::YELLOWPLASTIC);
|
---|
| 399 | Transformed* trs;
|
---|
| 400 | trs = new Transformed(pot);
|
---|
| 401 | virtualWorldObjects[6] = trs;
|
---|
| 402 | //dragon:
|
---|
| 403 | // trs->scale(0.08f);
|
---|
| 404 | // trs->rotateY(3.14f);
|
---|
| 405 | // trs->rotateX(1.55f);
|
---|
| 406 | // trs->rotateY(0.3f);
|
---|
| 407 | // trs->translate(Vector(0.0f, -16.5f, 0.0f));
|
---|
| 408 |
|
---|
| 409 | // trs = new Transformed(not);
|
---|
| 410 | // virtualWorldObjects[6] = trs;
|
---|
| 411 | trs->scale(2.9f);
|
---|
| 412 | // trs->rotateZ(1.55f);
|
---|
| 413 | // trs->translate(Vector(0.0f, -7.0f, 10.0f));
|
---|
| 414 |
|
---|
| 415 | // trs->translate(Vector(y%3 * 10.0f - 10.0f, (y/3) * 10.0f - 10.0f, 0.0f));
|
---|
| 416 |
|
---|
| 417 |
|
---|
| 418 | virtualWorldObjects[0] = new PlaneZAligned(-15.0f, true, &Material::DIFFUSEORANGE);
|
---|
| 419 | virtualWorldObjects[1] = new PlaneZAligned(50.0f, false, &Material::DIFFUSEWHITE);
|
---|
| 420 | virtualWorldObjects[2] = new PlaneXAligned(-15.0f, true, &Material::DIFFUSELIGHTBLUE);
|
---|
| 421 | virtualWorldObjects[3] = new PlaneXAligned(15.0f, false, &Material::DIFFUSEGREEN);
|
---|
| 422 | virtualWorldObjects[4] = new PlaneYAligned(-15.0f, true, &Material::DIFFUSEYELLOW);
|
---|
| 423 | virtualWorldObjects[5] = new PlaneYAligned(15.0f, false, &Material::DIFFUSEORANGE);
|
---|
| 424 | // virtualWorldObjects[6] = new Cylinder(Vector(-11.0f, 0.0f, -28.0f), 15.0f, 35.0f, -25.0f, &Material::DIFFUSEWHITE);
|
---|
| 425 | // virtualWorldObjects[7] = new Sphere(Vector(3.3f, 2.8f, 5.0f), 2.0f, glass);
|
---|
| 426 |
|
---|
| 427 | // virtualWorldObjects[8] = new Cylinder(Vector(-15.0f, 0.0f, 10.0f), 2.5f, 15.0f, -15.0f, &Material::DIFFUSEWHITE);
|
---|
| 428 | // virtualWorldObjects[9] = new Cylinder(Vector(-15.0f, 0.0f, 0.0f), 2.5f, 15.0f, -15.0f, &Material::DIFFUSEWHITE);
|
---|
| 429 | // virtualWorldObjects[10] = new Cylinder(Vector(-15.0f, 0.0f, -10.0f), 2.5f, 15.0f, -15.0f, &Material::DIFFUSEWHITE);
|
---|
| 430 | // virtualWorldObjects[11] = new Cylinder(Vector(-10.0f, 0.0f, -15.0f), 2.5f, 15.0f, -15.0f, &Material::DIFFUSEWHITE);
|
---|
| 431 | // virtualWorldObjects[12] = new Cylinder(Vector(0.0f, 0.0f, -15.0f), 2.5f, 15.0f, -15.0f, &Material::DIFFUSEWHITE);
|
---|
| 432 | // virtualWorldObjects[13] = new Cylinder(Vector(15.0f, 0.0f, 10.0f), 2.5f, 15.0f, -15.0f, &Material::DIFFUSEWHITE);
|
---|
| 433 | // virtualWorldObjects[14] = new Cylinder(Vector(15.0f, 0.0f, 0.0f), 2.5f, 15.0f, -15.0f, &Material::DIFFUSEWHITE);
|
---|
| 434 | // virtualWorldObjects[15] = new Cylinder(Vector(15.0f, 0.0f, -10.0f), 2.5f, 15.0f, -15.0f, &Material::DIFFUSEWHITE);
|
---|
| 435 | // virtualWorldObjects[16] = new Cylinder(Vector(10.0f, 0.0f, -15.0f), 2.5f, 15.0f, -15.0f, &Material::DIFFUSEWHITE);
|
---|
| 436 | // virtualWorldObjects[17] = new Sphere(Vector(10.0f, -12.99f, -3.0f), 2.0f, glass);
|
---|
| 437 | // virtualWorldObjects[18] = new Sphere(Vector(-10.0f, -12.99f, 5.0f), 2.0f, glass);
|
---|
| 438 |
|
---|
| 439 | // virtualWorldObjects[0] = new Sphere(Vector(0.0f, 1.0f, 0.0f), 2.0f, &Material::DIFFUSEWHITE);
|
---|
| 440 |
|
---|
| 441 | */
|
---|
| 442 |
|
---|
| 443 | void World::createEnvironmentMap(std::istream& isc)
|
---|
| 444 | {
|
---|
| 445 | int division = 1;
|
---|
| 446 | const Material* material = &Material::DIFFUSEORANGE;
|
---|
| 447 | Vector centre(0.0f, 0.0f, 0.0f);
|
---|
| 448 | float radius = 10000.0f;
|
---|
| 449 | char key[200];
|
---|
| 450 | do
|
---|
| 451 | {
|
---|
| 452 | isc >> key;
|
---|
| 453 | if(strcmp(key,"radius") == 0) isc >> radius;
|
---|
| 454 | else if(strcmp(key,"centre")==0) isc >> centre;
|
---|
| 455 | else if(strcmp(key,"division")==0) isc >> division;
|
---|
| 456 | else if(strcmp(key,"material") == 0)
|
---|
| 457 | {
|
---|
| 458 | isc >> key;
|
---|
| 459 | for(int i=0; i < nVirtualWorldMaterials; i++)
|
---|
| 460 | {
|
---|
| 461 | material = virtualWorldMaterials[i];
|
---|
| 462 | if(strcmp(key, material->getName()) == 0) break;
|
---|
| 463 | }
|
---|
| 464 | }
|
---|
| 465 | }
|
---|
| 466 | while(strcmp(key,"end")!=0);
|
---|
| 467 |
|
---|
| 468 | {
|
---|
| 469 | objectArraySize += division * division * 6;
|
---|
| 470 | Intersectable** largerArray = new Intersectable*[objectArraySize];
|
---|
| 471 | for(int d=0;d<nVirtualWorldObjects;d++)
|
---|
| 472 | largerArray[d] = virtualWorldObjects[d];
|
---|
| 473 | delete virtualWorldObjects;
|
---|
| 474 | virtualWorldObjects = largerArray;
|
---|
| 475 | }
|
---|
| 476 |
|
---|
| 477 | int q,w;
|
---|
| 478 | for(q=0; q<division; q++)
|
---|
| 479 | {
|
---|
| 480 | for(w=0; w<division; w++)
|
---|
| 481 | {
|
---|
| 482 | PlaneXAligned* p = new PlaneXAligned(-radius, true, material);
|
---|
| 483 | p->yMin = (2.0 * radius / division) * q - radius;
|
---|
| 484 | p->yMax = p->yMin + 2.0 * radius / division;
|
---|
| 485 | p->zMin = (2.0 * radius / division) * w - radius;
|
---|
| 486 | p->zMax = p->zMin + 2.0 * radius / division;
|
---|
| 487 | p->bbox.minPoint.x = p->bbox.maxPoint.x = -radius;
|
---|
| 488 | p->bbox.minPoint.y = p->yMin;
|
---|
| 489 | p->bbox.maxPoint.y = p->yMax;
|
---|
| 490 | p->bbox.minPoint.z = p->zMin;
|
---|
| 491 | p->bbox.maxPoint.z = p->zMax;
|
---|
| 492 | virtualWorldObjects[nVirtualWorldObjects] = p;
|
---|
| 493 | nVirtualWorldObjects++;
|
---|
| 494 | }
|
---|
| 495 | }
|
---|
| 496 | for(q=0; q<division; q++)
|
---|
| 497 | {
|
---|
| 498 | for(w=0; w<division; w++)
|
---|
| 499 | {
|
---|
| 500 | PlaneXAligned* p = new PlaneXAligned(radius, false, material);
|
---|
| 501 | p->yMin = (2.0 * radius / division) * q - radius;
|
---|
| 502 | p->yMax = p->yMin + 2.0 * radius / division;
|
---|
| 503 | p->zMin = (2.0 * radius / division) * w - radius;
|
---|
| 504 | p->zMax = p->zMin + 2.0 * radius / division;
|
---|
| 505 | p->bbox.minPoint.x = p->bbox.maxPoint.x = radius;
|
---|
| 506 | p->bbox.minPoint.y = p->yMin;
|
---|
| 507 | p->bbox.maxPoint.y = p->yMax;
|
---|
| 508 | p->bbox.minPoint.z = p->zMin;
|
---|
| 509 | p->bbox.maxPoint.z = p->zMax;
|
---|
| 510 | virtualWorldObjects[nVirtualWorldObjects] = p;
|
---|
| 511 | nVirtualWorldObjects++;
|
---|
| 512 | }
|
---|
| 513 | }
|
---|
| 514 | for(q=0; q<division; q++)
|
---|
| 515 | {
|
---|
| 516 | for(w=0; w<division; w++)
|
---|
| 517 | {
|
---|
| 518 | PlaneYAligned* p = new PlaneYAligned(-radius, true, material);
|
---|
| 519 | p->xMin = (2.0 * radius / division) * q - radius;
|
---|
| 520 | p->xMax = p->xMin + 2.0 * radius / division;
|
---|
| 521 | p->zMin = (2.0 * radius / division) * w - radius;
|
---|
| 522 | p->zMax = p->zMin + 2.0 * radius / division;
|
---|
| 523 | p->bbox.minPoint.y = p->bbox.maxPoint.y = -radius;
|
---|
| 524 | p->bbox.minPoint.x = p->xMin;
|
---|
| 525 | p->bbox.maxPoint.x = p->xMax;
|
---|
| 526 | p->bbox.minPoint.z = p->zMin;
|
---|
| 527 | p->bbox.maxPoint.z = p->zMax;
|
---|
| 528 | virtualWorldObjects[nVirtualWorldObjects] = p;
|
---|
| 529 | nVirtualWorldObjects++;
|
---|
| 530 | }
|
---|
| 531 | }
|
---|
| 532 | for(q=0; q<division; q++)
|
---|
| 533 | {
|
---|
| 534 | for(w=0; w<division; w++)
|
---|
| 535 | {
|
---|
| 536 | PlaneYAligned* p = new PlaneYAligned(radius, false, material);
|
---|
| 537 | p->xMin = (2.0 * radius / division) * q - radius;
|
---|
| 538 | p->xMax = p->xMin + 2.0 * radius / division;
|
---|
| 539 | p->zMin = (2.0 * radius / division) * w - radius;
|
---|
| 540 | p->zMax = p->zMin + 2.0 * radius / division;
|
---|
| 541 | p->bbox.minPoint.y = p->bbox.maxPoint.y = radius;
|
---|
| 542 | p->bbox.minPoint.x = p->xMin;
|
---|
| 543 | p->bbox.maxPoint.x = p->xMax;
|
---|
| 544 | p->bbox.minPoint.z = p->zMin;
|
---|
| 545 | p->bbox.maxPoint.z = p->zMax;
|
---|
| 546 | virtualWorldObjects[nVirtualWorldObjects] = p;
|
---|
| 547 | nVirtualWorldObjects++;
|
---|
| 548 | }
|
---|
| 549 | }
|
---|
| 550 | for(q=0; q<division; q++)
|
---|
| 551 | {
|
---|
| 552 | for(w=0; w<division; w++)
|
---|
| 553 | {
|
---|
| 554 | PlaneZAligned* p = new PlaneZAligned(-radius, true, material);
|
---|
| 555 | p->yMin = (2.0 * radius / division) * q - radius;
|
---|
| 556 | p->yMax = p->yMin + 2.0 * radius / division;
|
---|
| 557 | p->xMin = (2.0 * radius / division) * w - radius;
|
---|
| 558 | p->xMax = p->xMin + 2.0 * radius / division;
|
---|
| 559 | p->bbox.minPoint.z = p->bbox.maxPoint.z = -radius;
|
---|
| 560 | p->bbox.minPoint.y = p->yMin;
|
---|
| 561 | p->bbox.maxPoint.y = p->yMax;
|
---|
| 562 | p->bbox.minPoint.x = p->xMin;
|
---|
| 563 | p->bbox.maxPoint.x = p->xMax;
|
---|
| 564 | virtualWorldObjects[nVirtualWorldObjects] = p;
|
---|
| 565 | nVirtualWorldObjects++;
|
---|
| 566 | }
|
---|
| 567 | }
|
---|
| 568 | for(q=0; q<division; q++)
|
---|
| 569 | {
|
---|
| 570 | for(w=0; w<division; w++)
|
---|
| 571 | {
|
---|
| 572 | PlaneZAligned* p = new PlaneZAligned(radius, false, material);
|
---|
| 573 | p->yMin = (2.0 * radius / division) * q - radius;
|
---|
| 574 | p->yMax = p->yMin + 2.0 * radius / division;
|
---|
| 575 | p->xMin = (2.0 * radius / division) * w - radius;
|
---|
| 576 | p->xMax = p->xMin + 2.0 * radius / division;
|
---|
| 577 | p->bbox.minPoint.z = p->bbox.maxPoint.z = radius;
|
---|
| 578 | p->bbox.minPoint.y = p->yMin;
|
---|
| 579 | p->bbox.maxPoint.y = p->yMax;
|
---|
| 580 | p->bbox.minPoint.x = p->xMin;
|
---|
| 581 | p->bbox.maxPoint.x = p->xMax;
|
---|
| 582 | virtualWorldObjects[nVirtualWorldObjects] = p;
|
---|
| 583 | nVirtualWorldObjects++;
|
---|
| 584 | }
|
---|
| 585 | }
|
---|
| 586 | } |
---|