PolyGenericScene.cpp 16 KB

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