PolyScene.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. /*
  2. * PolyScene.cpp
  3. * Poly
  4. *
  5. * Created by Ivan Safrin on 3/18/08.
  6. * Copyright 2008 __MyCompanyName__. All rights reserved.
  7. *
  8. */
  9. #include "PolyScene.h"
  10. using namespace Polycode;
  11. Scene::Scene() : EventDispatcher() {
  12. defaultCamera = new Camera(this);
  13. CoreServices::getInstance()->getSceneManager()->addScene(this);
  14. fogEnabled = false;
  15. lightingEnabled = false;
  16. enabled = true;
  17. isSceneVirtual = false;
  18. hasLightmaps = false;
  19. clearColor.setColor(0.13f,0.13f,0.13f,1.0f);
  20. virtualScene = false;
  21. useClearColor = false;
  22. }
  23. Scene::Scene(bool virtualScene) {
  24. this->virtualScene = virtualScene;
  25. }
  26. void Scene::setVirtual(bool val) {
  27. isSceneVirtual = val;
  28. }
  29. bool Scene::isVirtual() {
  30. return isSceneVirtual;
  31. }
  32. void Scene::setEnabled(bool enabled) {
  33. this->enabled = enabled;
  34. }
  35. bool Scene::isEnabled() {
  36. return enabled;
  37. }
  38. void Scene::Update() {
  39. }
  40. Scene::~Scene() {
  41. Logger::log("Cleaning scene...\n");
  42. for(int i=0; i < entities.size(); i++) {
  43. // delete entities[i];
  44. }
  45. entities.clear();
  46. CoreServices::getInstance()->getSceneManager()->removeScene(this);
  47. // delete defaultCamera;
  48. }
  49. void Scene::enableLighting(bool enable) {
  50. lightingEnabled = enable;
  51. CoreServices::getInstance()->getRenderer()->enableLighting(enable);
  52. }
  53. void Scene::enableFog(bool enable) {
  54. fogEnabled = enable;
  55. if(enable)
  56. CoreServices::getInstance()->getRenderer()->setFogProperties(fogMode, fogColor, fogDensity, fogStartDepth, fogEndDepth);
  57. CoreServices::getInstance()->getRenderer()->enableFog(enable);
  58. }
  59. void Scene::setFogProperties(int fogMode, Color color, Number density, Number startDepth, Number endDepth) {
  60. this->fogMode = fogMode;
  61. fogColor = color;
  62. fogDensity = density;
  63. fogStartDepth = startDepth;
  64. fogEndDepth = endDepth;
  65. if(fogEnabled)
  66. CoreServices::getInstance()->getRenderer()->setFogProperties(fogMode, fogColor, fogDensity, fogStartDepth, fogEndDepth);
  67. }
  68. SceneEntity *Scene::getEntityAtCursor(Number x, Number y) {
  69. for(int i =0; i< entities.size(); i++) {
  70. if(entities[i]->testMouseCollision(x,y)) {
  71. return entities[i];
  72. }
  73. }
  74. return NULL;
  75. }
  76. void Scene::addEntity(SceneEntity *entity) {
  77. entity->setRenderer(CoreServices::getInstance()->getRenderer());
  78. entities.push_back(entity);
  79. }
  80. void Scene::removeEntity(SceneEntity *entity) {
  81. for(int i=0; i < entities.size(); i++) {
  82. if(entities[i] == entity) {
  83. entities.erase(entities.begin()+i);
  84. return;
  85. }
  86. }
  87. }
  88. Camera *Scene::getDefaultCamera() {
  89. return defaultCamera;
  90. }
  91. void Scene::Render() {
  92. if(!defaultCamera)
  93. return;
  94. // prepare lights...
  95. for(int i=0; i<entities.size();i++) {
  96. entities[i]->doUpdates();
  97. entities[i]->updateEntityMatrix();
  98. }
  99. //make these the closest
  100. Matrix4 textureMatrix;
  101. Matrix4 *matrixPtr;
  102. defaultCamera->rebuildTransformMatrix();
  103. if(virtualScene)
  104. return;
  105. if(useClearColor)
  106. CoreServices::getInstance()->getRenderer()->setClearColor(clearColor.r,clearColor.g,clearColor.b);
  107. CoreServices::getInstance()->getRenderer()->setAmbientColor(ambientColor.r,ambientColor.g,ambientColor.b);
  108. CoreServices::getInstance()->getRenderer()->clearLights();
  109. for(int i=0; i < lights.size(); i++) {
  110. SceneLight *light = lights[i];
  111. Vector3 direction;
  112. Vector3 position;
  113. matrixPtr = NULL;
  114. direction.x = 0;
  115. direction.y = 1;
  116. direction.z = 0;
  117. direction = light->getConcatenatedMatrix().rotateVector(direction);
  118. direction.Normalize();
  119. if(light->areShadowsEnabled()) {
  120. if(light->getType() == SceneLight::SPOT_LIGHT) {
  121. textureMatrix.identity();
  122. Matrix4 matTexAdj(0.5f, 0.0f, 0.0f, 0.0f,
  123. 0.0f, 0.5f, 0.0f, 0.0f,
  124. 0.0f, 0.0f, 0.5f, 0.0f,
  125. 0.5f, 0.5f, 0.5f, 1.0f );
  126. textureMatrix = defaultCamera->getConcatenatedMatrix() * light->getLightViewMatrix() * matTexAdj;
  127. matrixPtr = &textureMatrix;
  128. light->renderDepthMap(this);
  129. CoreServices::getInstance()->getRenderer()->addShadowMap(light->getZBufferTexture());
  130. }
  131. }
  132. position = light->getPosition();
  133. if(light->getParentEntity() != NULL) {
  134. position = light->getParentEntity()->getConcatenatedMatrix() * position;
  135. }
  136. CoreServices::getInstance()->getRenderer()->addLight(position, direction, light->getLightType(), light->lightColor, light->getDistance(), light->getIntensity(), matrixPtr);
  137. }
  138. defaultCamera->doCameraTransform();
  139. defaultCamera->buildFrustrumPlanes();
  140. if(defaultCamera->getOrthoMode()) {
  141. CoreServices::getInstance()->getRenderer()->_setOrthoMode();
  142. }
  143. for(int i=0; i<entities.size();i++) {
  144. if(entities[i]->getBBoxRadius() > 0) {
  145. if(defaultCamera->isSphereInFrustrum((entities[i]->getPosition()), entities[i]->getBBoxRadius()))
  146. entities[i]->transformAndRender();
  147. } else {
  148. entities[i]->transformAndRender();
  149. }
  150. }
  151. if(defaultCamera->getOrthoMode()) {
  152. CoreServices::getInstance()->getRenderer()->setPerspectiveMode();
  153. }
  154. }
  155. void Scene::RenderDepthOnly(Camera *targetCamera) {
  156. for(int i=0; i<entities.size();i++) {
  157. entities[i]->doUpdates();
  158. entities[i]->updateEntityMatrix();
  159. }
  160. targetCamera->doCameraTransform();
  161. if(virtualScene)
  162. return;
  163. targetCamera->buildFrustrumPlanes();
  164. CoreServices::getInstance()->getRenderer()->setTexture(NULL);
  165. CoreServices::getInstance()->getRenderer()->enableShaders(false);
  166. for(int i=0; i<entities.size();i++) {
  167. if(entities[i]->getBBoxRadius() > 0) {
  168. if(targetCamera->isSphereInFrustrum((entities[i]->getPosition()), entities[i]->getBBoxRadius()))
  169. entities[i]->transformAndRender();
  170. } else {
  171. entities[i]->transformAndRender();
  172. }
  173. }
  174. CoreServices::getInstance()->getRenderer()->enableShaders(true);
  175. }
  176. void Scene::addLight(SceneLight *light) {
  177. lights.push_back(light);
  178. addEntity(light);
  179. }
  180. SceneLight *Scene::getNearestLight(Vector3 pos) {
  181. if(lights.size() > 0)
  182. return lights[0];
  183. else
  184. return NULL;
  185. }
  186. String Scene::readString(OSFILE *inFile) {
  187. char buffer[1024];
  188. unsigned int namelen;
  189. OSBasics::read(&namelen, sizeof(unsigned int), 1, inFile);
  190. memset(buffer, 0, 1024);
  191. OSBasics::read(buffer, 1, namelen, inFile);
  192. return string(buffer);
  193. }
  194. void Scene::loadScene(String fileName) {
  195. OSFILE *inFile = OSBasics::open(fileName.c_str(), "rb");
  196. if(!inFile) {
  197. Logger::log("Error opening scene file\n");
  198. return;
  199. }
  200. Number r,g,b,a;
  201. OSBasics::read(&r, sizeof(Number), 1, inFile);
  202. OSBasics::read(&g, sizeof(Number), 1, inFile);
  203. OSBasics::read(&b, sizeof(Number), 1, inFile);
  204. clearColor.setColor(r,g,b,1.0f);
  205. OSBasics::read(&r, sizeof(Number), 1, inFile);
  206. OSBasics::read(&g, sizeof(Number), 1, inFile);
  207. OSBasics::read(&b, sizeof(Number), 1, inFile);
  208. ambientColor.setColor(r,g,b,1.0f);
  209. unsigned int numObjects, objectType,namelen;
  210. char buffer[1024];
  211. char flag;
  212. Number t[3],rq[4];
  213. SceneEntity *newEntity;
  214. unsigned int lightmapIndex = 0;
  215. OSBasics::read(&flag, 1, 1, inFile);
  216. hasLightmaps = false;
  217. if(flag == 1)
  218. hasLightmaps = true;
  219. OSBasics::read(&numObjects, sizeof(unsigned int), 1, inFile);
  220. Logger::log("Loading scene (%d objects)\n", numObjects);
  221. for(int i=0; i < numObjects; i++) {
  222. OSBasics::read(t, sizeof(Number), 3, inFile);
  223. OSBasics::read(rq, sizeof(Number), 4, inFile);
  224. newEntity = NULL;
  225. OSBasics::read(&objectType, sizeof(unsigned int), 1, inFile);
  226. SceneMesh *newSceneMesh;
  227. Mesh *newMesh;
  228. Material *newMaterial;
  229. switch(objectType) {
  230. case ENTITY_MESH:
  231. if(hasLightmaps) {
  232. OSBasics::read(&lightmapIndex, sizeof(unsigned int), 1, inFile);
  233. } else {
  234. lightmapIndex = 0;
  235. }
  236. OSBasics::read(&namelen, sizeof(unsigned int), 1, inFile);
  237. memset(buffer, 0, 1024);
  238. OSBasics::read(buffer, 1, namelen, inFile);
  239. Logger::log("adding mesh (texture: %s)\n", buffer);
  240. OSBasics::read(&r, sizeof(Number), 1, inFile);
  241. OSBasics::read(&g, sizeof(Number), 1, inFile);
  242. OSBasics::read(&b, sizeof(Number), 1, inFile);
  243. OSBasics::read(&a, sizeof(Number), 1, inFile);
  244. newMaterial = (Material*) CoreServices::getInstance()->getResourceManager()->getResource(Resource::RESOURCE_MATERIAL, buffer);
  245. newMesh = new Mesh(Mesh::TRI_MESH);
  246. newMesh->loadFromFile(inFile);
  247. newSceneMesh = new SceneMesh(newMesh);
  248. newSceneMesh->setColor(r,g,b,a);
  249. newSceneMesh->lightmapIndex = lightmapIndex;
  250. addEntity(newSceneMesh);
  251. newEntity = (SceneEntity*)newSceneMesh;
  252. staticGeometry.push_back(newSceneMesh);
  253. if(newMaterial != NULL)
  254. newSceneMesh->setMaterial(newMaterial);
  255. break;
  256. case ENTITY_ENTITY: {
  257. Logger::log("loading entity\n");
  258. String entityType = readString(inFile);
  259. SceneEntity *newCustomEntity = new SceneEntity();
  260. newCustomEntity->custEntityType = entityType;
  261. newEntity = newCustomEntity;
  262. customEntities.push_back(newCustomEntity);
  263. } break;
  264. case ENTITY_COLLMESH: {
  265. unsigned int collType,numVertices,numFaces;
  266. Number co[3];
  267. OSBasics::read(&collType, sizeof(unsigned int), 1, inFile);
  268. OSBasics::read(&numVertices, sizeof(unsigned int), 1, inFile);
  269. Mesh *mesh = new Mesh(Mesh::TRI_MESH);
  270. for(int i=0; i < numVertices; i++) {
  271. OSBasics::read(co, sizeof(Number), 3, inFile);
  272. Vertex *newVert = new Vertex(co[0], co[1], co[2]);
  273. mesh->addVertex(newVert);
  274. }
  275. OSBasics::read(&numFaces, sizeof(unsigned int), 1, inFile);
  276. unsigned int fo[3];
  277. for(int i=0; i < numFaces; i++) {
  278. OSBasics::read(fo, sizeof(unsigned int), 3, inFile);
  279. Polygon *newPoly = new Polygon();
  280. newPoly->addVertex(mesh->getVertex(fo[0]));
  281. newPoly->addVertex(mesh->getVertex(fo[1]));
  282. newPoly->addVertex(mesh->getVertex(fo[2]));
  283. mesh->addPolygon(newPoly);
  284. }
  285. SceneMesh *newMesh = new SceneMesh(mesh);
  286. newEntity = newMesh;
  287. loadCollisionChild(newEntity);
  288. collisionGeometry.push_back(newMesh);
  289. newMesh->visible = false;
  290. // ScenePrimitive *test = new ScenePrimitive(ScenePrimitive::TYPE_BOX, newMesh->bBox.x,newMesh->bBox.y,newMesh->bBox.z);
  291. // newMesh->addEntity(test);
  292. }
  293. break;
  294. case ENTITY_CAMERA:
  295. newEntity = (SceneEntity*)this->getDefaultCamera();
  296. break;
  297. case ENTITY_LIGHT:
  298. Number col[3],e,d;
  299. unsigned int lType;
  300. OSBasics::read(&lType, sizeof(unsigned int), 1, inFile);
  301. OSBasics::read(&e, sizeof(Number), 1, inFile);
  302. OSBasics::read(&d, sizeof(Number), 1, inFile);
  303. OSBasics::read(col, sizeof(Number), 3, inFile);
  304. SceneLight *newLight = new SceneLight(lType, e, d, this);
  305. newLight->lightColor.setColor(col[0],col[1],col[2],1.0f);
  306. addLight(newLight);
  307. newEntity = (SceneEntity*)newLight;
  308. break;
  309. }
  310. if(newEntity != NULL) {
  311. unsigned int numProps;
  312. OSBasics::read(&numProps, sizeof(unsigned int), 1, inFile);
  313. for(int i=0; i < numProps; i++) {
  314. String propName,propValue;
  315. propName = readString(inFile);
  316. propValue = readString(inFile);
  317. EntityProp prop;
  318. prop.propName = propName;
  319. prop.propValue = propValue;
  320. newEntity->entityProps.push_back(prop);
  321. }
  322. if(objectType == ENTITY_MESH) {
  323. if(newEntity->getEntityProp("vertexnormals") == "false")
  324. ((SceneMesh*)newEntity)->getMesh()->useVertexNormals(false);
  325. if(newEntity->getEntityProp("collision") != "") {
  326. if(newEntity->getEntityProp("collision") == "mesh") {
  327. loadCollisionChild(newEntity, false, 3);
  328. }
  329. }
  330. }
  331. newEntity->setPosition(t[0], t[1], t[2]);
  332. newEntity->setRotationQuat(rq[0], rq[1], rq[2], rq[3]);
  333. newEntity->rebuildTransformMatrix();
  334. }
  335. }
  336. if(!hasLightmaps) {
  337. OSBasics::close(inFile);
  338. return;
  339. }
  340. /*
  341. unsigned int lmsize,numLightmaps,imageWidth, imageHeight;
  342. OSBasics::read(&numLightmaps, sizeof(unsigned int), 1, inFile);
  343. packer = new LightmapPacker(this);
  344. char *imageData;
  345. for(int i=0 ; i < numLightmaps; i++) {
  346. OSBasics::read(&imageWidth, sizeof(unsigned int), 1, inFile);
  347. OSBasics::read(&imageHeight, sizeof(unsigned int), 1, inFile);
  348. OSBasics::read(&lmsize, sizeof(unsigned int), 1, inFile);
  349. imageData = (char*)malloc(lmsize);
  350. OSBasics::read(imageData, 1, lmsize, inFile);
  351. Image *newImage = new Image(imageData, imageWidth, imageHeight);
  352. packer->images.push_back(newImage);
  353. free(imageData);
  354. }
  355. packer->bindTextures();
  356. */
  357. OSBasics::close(inFile);
  358. }
  359. vector<SceneEntity*> Scene::getCustomEntitiesByType(String type) {
  360. vector<SceneEntity*> retVector;
  361. for(int i=0; i < customEntities.size(); i++) {
  362. if(customEntities[i]->custEntityType == type) {
  363. retVector.push_back(customEntities[i]);
  364. }
  365. }
  366. return retVector;
  367. }
  368. SceneEntity *Scene::getCustomEntityByType(String type) {
  369. for(int i=0; i < customEntities.size(); i++) {
  370. if(customEntities[i]->custEntityType == type) {
  371. return customEntities[i];
  372. }
  373. }
  374. return NULL;
  375. }
  376. void Scene::writeEntityMatrix(SceneEntity *entity, OSFILE *outFile) {
  377. Number t[3],rq[4];
  378. Vector3 pos = entity->getPosition();
  379. t[0] = pos.x;
  380. t[1] = pos.y;
  381. t[2] = pos.z;
  382. rq[0] = entity->getRotationQuat().w;
  383. rq[1] = entity->getRotationQuat().x;
  384. rq[2] = entity->getRotationQuat().y;
  385. rq[3] = entity->getRotationQuat().z;
  386. OSBasics::write(t, sizeof(Number), 3, outFile);
  387. OSBasics::write(rq, sizeof(Number), 4, outFile);
  388. }
  389. void Scene::saveScene(String fileName) {
  390. OSFILE *outFile = OSBasics::open(fileName.c_str(), "wb");
  391. if(!outFile) {
  392. Logger::log("Error opening scene file for writing\n");
  393. return;
  394. }
  395. // geometry
  396. unsigned int totalObjects = staticGeometry.size() + lights.size() + collisionGeometry.size() + customEntities.size();
  397. unsigned int objType;
  398. char flag = 0;
  399. if(hasLightmaps)
  400. flag = 1;
  401. OSBasics::write(&flag, 1, 1, outFile);
  402. OSBasics::write(&totalObjects, sizeof(unsigned int), 1, outFile);
  403. unsigned int stLen;
  404. for(int i=0; i <staticGeometry.size(); i++) {
  405. SceneMesh *mesh = staticGeometry[i];
  406. writeEntityMatrix(mesh, outFile);
  407. objType = Scene::ENTITY_MESH;
  408. OSBasics::write(&objType, sizeof(unsigned int), 1, outFile);
  409. if(hasLightmaps) {
  410. unsigned int lightmapIndex = mesh->lightmapIndex;
  411. OSBasics::write(&lightmapIndex, sizeof(unsigned int), 1, outFile);
  412. }
  413. stLen = mesh->getMaterial()->getName().length();
  414. OSBasics::write(&stLen, sizeof(unsigned int), 1, outFile);
  415. OSBasics::write(mesh->getMaterial()->getName().c_str(), 1, stLen, outFile);
  416. mesh->getMesh()->saveToFile(outFile);
  417. }
  418. for(int i=0; i < collisionGeometry.size(); i++) {
  419. SceneMesh *mesh = collisionGeometry[i];
  420. writeEntityMatrix(mesh, outFile);
  421. objType = Scene::ENTITY_COLLMESH;
  422. OSBasics::write(&objType, sizeof(unsigned int), 1, outFile);
  423. unsigned int collType = 1;
  424. OSBasics::write(&collType, sizeof(unsigned int), 1, outFile);
  425. unsigned int numVertices = mesh->getMesh()->getNumVertices();
  426. OSBasics::write(&numVertices, sizeof(unsigned int), 1, outFile);
  427. Number pos[3];
  428. for(int j=0; j < numVertices; j++) {
  429. Vertex *vert = mesh->getMesh()->getVertex(j);
  430. pos[0] = vert->x;
  431. pos[1] = vert->y;
  432. pos[2] = vert->z;
  433. OSBasics::write(pos, sizeof(Number),3, outFile);
  434. }
  435. unsigned int numFaces = mesh->getMesh()->getPolygonCount();
  436. OSBasics::write(&numFaces, sizeof(unsigned int), 1, outFile);
  437. unsigned int ind[3];
  438. for(int j=0; j < numFaces; j++) {
  439. Polygon *poly = mesh->getMesh()->getPolygon(j);
  440. ind[0] = mesh->getMesh()->getVertexIndex(poly->getVertex(0));
  441. ind[1] = mesh->getMesh()->getVertexIndex(poly->getVertex(1));
  442. ind[2] = mesh->getMesh()->getVertexIndex(poly->getVertex(2));
  443. OSBasics::write(ind, sizeof(unsigned int),3, outFile);
  444. }
  445. }
  446. Number col[3],e,d;
  447. for(int i=0; i < lights.size(); i++) {
  448. writeEntityMatrix(lights[i], outFile);
  449. objType = Scene::ENTITY_LIGHT;
  450. OSBasics::write(&objType, sizeof(unsigned int), 1, outFile);
  451. col[0] = lights[i]->lightColor.r;
  452. col[1] = lights[i]->lightColor.g;
  453. col[2] = lights[i]->lightColor.b;
  454. e = lights[i]->getIntensity();
  455. d = lights[i]->getDistance();
  456. OSBasics::write(&e, sizeof(Number), 1, outFile);
  457. OSBasics::write(&d, sizeof(Number), 1, outFile);
  458. OSBasics::write(col, sizeof(Number), 3, outFile);
  459. }
  460. for(int i=0; i < customEntities.size(); i++) {
  461. SceneEntity *custEnt = customEntities[i];
  462. writeEntityMatrix(custEnt, outFile);
  463. objType = Scene::ENTITY_ENTITY;
  464. OSBasics::write(&objType, sizeof(unsigned int), 1, outFile);
  465. writeString(custEnt->custEntityType, outFile);
  466. unsigned int numProps = custEnt->entityProps.size();
  467. OSBasics::write(&numProps, sizeof(unsigned int), 1, outFile);
  468. for(int j=0; j < numProps; j++) {
  469. writeString(custEnt->entityProps[j].propName, outFile);
  470. writeString(custEnt->entityProps[j].propValue, outFile);
  471. }
  472. }
  473. if(!hasLightmaps) {
  474. OSBasics::close(outFile);
  475. return;
  476. }
  477. /*
  478. unsigned int lmsize;
  479. lmsize = packer->images.size();
  480. OSBasics::write(&lmsize, sizeof(unsigned int), 1, outFile);
  481. for(int i=0; i < packer->images.size(); i++) {
  482. lmsize = packer->images[i]->getWidth();
  483. OSBasics::write(&lmsize, sizeof(unsigned int), 1, outFile);
  484. lmsize = packer->images[i]->getHeight();
  485. OSBasics::write(&lmsize, sizeof(unsigned int), 1, outFile);
  486. lmsize = packer->images[i]->getWidth() * packer->images[i]->getHeight() * 4;
  487. OSBasics::write(&lmsize, sizeof(unsigned int), 1, outFile);
  488. OSBasics::write(packer->images[i]->getPixels(), 1, lmsize, outFile);
  489. }
  490. */
  491. OSBasics::close(outFile);
  492. }
  493. void Scene::writeString(String str, OSFILE *outFile) {
  494. unsigned int stLen = str.length();
  495. OSBasics::write(&stLen, sizeof(unsigned int), 1, outFile);
  496. OSBasics::write(str.c_str(), 1, stLen, outFile);
  497. }
  498. int Scene::getNumStaticGeometry() {
  499. return staticGeometry.size();
  500. }
  501. SceneMesh *Scene::getStaticGeometry(int index) {
  502. return staticGeometry[index];
  503. }
  504. int Scene::getNumLights() {
  505. return lights.size();
  506. }
  507. SceneLight *Scene::getLight(int index) {
  508. return lights[index];
  509. }
  510. void Scene::generateLightmaps(Number lightMapRes, Number lightMapQuality, int numRadPasses) {
  511. /*
  512. packer = new LightmapPacker(this);
  513. packer->generateTextures(lightMapRes, lightMapQuality);
  514. RadTool *radTool = new RadTool(this, packer);
  515. radTool->fiatLux(numRadPasses);
  516. packer->bindTextures();
  517. packer->saveLightmaps("/Users/ivansafrin/Desktop/lightmaps");
  518. hasLightmaps = true;
  519. */
  520. }
  521. /*
  522. void Scene::addGrid(String gridTexture) {
  523. ScenePrimitive *gridMesh = new ScenePrimitive(ScenePrimitive::TYPE_PLANE, 20,20,0);
  524. gridMesh->loadTexture(gridTexture);
  525. gridMesh->setPitch(-90.0f);
  526. addEntity(gridMesh);
  527. }
  528. */