PolyGenericScene.cpp 16 KB

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