PolyTerrain.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. * PolyTerrain.cpp
  3. * Poly
  4. *
  5. * Created by Ivan Safrin on 2/20/09.
  6. * Copyright 2009 __MyCompanyName__. All rights reserved.
  7. *
  8. */
  9. #include "PolyTerrain.h"
  10. using namespace Polycode;
  11. Terrain::Terrain(int type, string heightmapFile, bool smooth, float tileAmt, float xDensity, float zDensity, float sx, float sz, float height) : SceneMesh(Mesh::TRI_MESH) {
  12. switch(type) {
  13. case BASIC:
  14. createBasic(heightmapFile, smooth, tileAmt,xDensity,zDensity,sx,sz,height);
  15. break;
  16. }
  17. }
  18. void Terrain::createBasic(string heightmapFile, bool smooth, float tileAmt, float xDensity, float zDensity, float sx, float sz, float height) {
  19. float xStep = sx/xDensity;
  20. float zStep = sz/zDensity;
  21. float uStep = 1.0f / xDensity * tileAmt;
  22. float vStep = 1.0f / zDensity * tileAmt;
  23. float xOffset = -sx/2.0f;
  24. float zOffset = -sz/2.0f;
  25. Image *heightImage = new Image(heightmapFile);
  26. terrainDataScale.x = sx / (float)heightImage->getWidth();
  27. terrainDataScale.z = sz / (float)heightImage->getHeight();
  28. Polygon *poly;
  29. float hpos;
  30. float imageStepX = floor( (float)heightImage->getWidth()/xDensity);
  31. float imageStepY = floor((float)heightImage->getHeight()/zDensity);
  32. for(float i=0; i < xDensity; i+=1) {
  33. for(float j=0; j < zDensity; j+=1) {
  34. poly = new Polygon();
  35. hpos = height * heightImage->getPixel((imageStepX*i)+imageStepX, imageStepY*j).getBrightness();
  36. poly->addVertex((xStep*i)+xStep+xOffset, hpos, (zStep * j)+zOffset, (uStep*i) + uStep, vStep*j)->setNormal(0,1,0);
  37. hpos = height * heightImage->getPixel((imageStepX*i), (imageStepY*j)).getBrightness();
  38. poly->addVertex((xStep*i)+xOffset, hpos, (zStep * j)+zOffset, uStep*i, vStep*j)->setNormal(0,1,0);
  39. hpos = height * heightImage->getPixel(imageStepX*i, (imageStepY*j)+imageStepY).getBrightness();
  40. poly->addVertex((xStep*i)+xOffset, hpos, ((zStep*j)+zStep)+zOffset, uStep*i, (vStep*j)+vStep)->setNormal(0,1,0);
  41. mesh->addPolygon(poly);
  42. if(!smooth) {
  43. poly->calculateNormal();
  44. poly->useVertexNormals = true;
  45. }
  46. poly = new Polygon();
  47. hpos = height * heightImage->getPixel(imageStepX*i, (imageStepY*j)+imageStepY).getBrightness();
  48. poly->addVertex((xStep*i)+xOffset, hpos, (zStep*j)+zStep+zOffset, uStep*i, (vStep*j)+vStep)->setNormal(0,1,0);
  49. hpos = height * heightImage->getPixel((imageStepX*i)+imageStepX, (imageStepY*j)+imageStepY).getBrightness();
  50. poly->addVertex((xStep*i)+xStep+xOffset, hpos, (zStep*j)+zStep+zOffset, (uStep*i) + uStep, (vStep*j)+vStep)->setNormal(0,1,0);
  51. hpos = height * heightImage->getPixel((imageStepX*i)+imageStepX, (imageStepY*j)).getBrightness();
  52. poly->addVertex((xStep*i)+xStep+xOffset, hpos, (zStep * j)+zOffset, (uStep*i) + uStep, vStep*j)->setNormal(0,1,0);
  53. mesh->addPolygon(poly);
  54. if(!smooth) {
  55. poly->calculateNormal();
  56. poly->useVertexNormals = true;
  57. }
  58. }
  59. }
  60. }
  61. Terrain::~Terrain() {
  62. }