Guest User

Untitled

a guest
Jul 19th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.55 KB | None | 0 0
  1. void TerrainChunk::SetUp(Terrain* terrain, const IntVector2& chunkIndex, Material* mat)
  2. {
  3. //set references
  4. m_terrain = terrain;
  5. m_chunkIndex = chunkIndex;
  6.  
  7. //Mesh creation
  8. MeshBuilder mb = MeshBuilder();
  9.  
  10. mb.Begin(eDrawPrimitive::TRIANGLES, true);
  11. mb.SetColor(Rgba::white);
  12. int index = 0;
  13.  
  14. AABB2 dataPoint = terrain->GetChunkDataExtents(m_chunkIndex);
  15.  
  16. for (int y = (int) dataPoint.mins.y; y < dataPoint.maxs.y; y++)
  17. {
  18. for (int x = (int) dataPoint.mins.x; x < dataPoint.maxs.x; x++)
  19. {
  20. IntVector2 bl_idx = IntVector2(x, y);
  21. Vector3 bl = terrain->GetPosAtDiscreteCoordinate(bl_idx);
  22. mb.SetUV(Vector2((float) x / terrain->m_dimensions.x, (float) y / terrain->m_dimensions.y));
  23. mb.SetNormal(terrain->GetNormalAtDiscreteCoordinate(bl_idx));
  24. mb.SetTangent(Vector4(terrain->GetTangentAtDiscreteCoordinate(bl_idx), 1));
  25. index = mb.PushVertex(bl);
  26.  
  27. IntVector2 br_idx = IntVector2(MinInt(x + 1, terrain->m_dimensions.x - 1), y);
  28. Vector3 br = terrain->GetPosAtDiscreteCoordinate(br_idx);
  29. mb.SetUV(Vector2((float) (x + 1) / terrain->m_dimensions.x, (float) y / terrain->m_dimensions.y));
  30. mb.SetNormal(terrain->GetNormalAtDiscreteCoordinate(br_idx));
  31. mb.SetTangent(Vector4(terrain->GetTangentAtDiscreteCoordinate(br_idx), 1));
  32. mb.PushVertex(br);
  33.  
  34. IntVector2 tl_idx = IntVector2(x, MinInt(y + 1, terrain->m_dimensions.y - 1));
  35. Vector3 tl = terrain->GetPosAtDiscreteCoordinate(tl_idx);
  36. mb.SetUV(Vector2((float) x / terrain->m_dimensions.x, (float) (y + 1) / terrain->m_dimensions.y));
  37. mb.SetNormal(terrain->GetNormalAtDiscreteCoordinate(tl_idx));
  38. mb.SetTangent(Vector4(terrain->GetTangentAtDiscreteCoordinate(tl_idx), 1));
  39. mb.PushVertex(tl);
  40.  
  41. IntVector2 tr_idx = IntVector2(MinInt(x + 1, terrain->m_dimensions.x - 1), MinInt(y + 1, terrain->m_dimensions.y - 1));
  42. Vector3 tr = terrain->GetPosAtDiscreteCoordinate(tr_idx);
  43. mb.SetUV(Vector2((float) (x + 1) / terrain->m_dimensions.x, (float) (y + 1) / terrain->m_dimensions.y));
  44. mb.SetNormal(terrain->GetNormalAtDiscreteCoordinate(tr_idx));
  45. mb.SetTangent(Vector4(terrain->GetTangentAtDiscreteCoordinate(tr_idx), 1));
  46. mb.PushVertex(tr);
  47.  
  48. mb.AddQuad(index + 0, index + 1, index + 2, index + 3);
  49. }
  50. }
  51. mb.End();
  52.  
  53. Mesh* mesh = new Mesh();
  54. mesh->FromBuilderForType<VertexLit>(mb);
  55.  
  56. //create renderable
  57. Vector2 center = m_terrain->GetChunkExtents(chunkIndex).GetCenter();
  58. m_transform.GetLocalPosition() = Vector3(center.x, m_terrain->GetHeight(center), center.y);
  59. m_renderable = new Renderable(mesh, &m_transform, mat);
  60. RenderScene::GetCurrentScene()->AddRenderable(m_renderable);
  61. }
Add Comment
Please, Sign In to add comment