BsSceneGrid.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "BsSceneGrid.h"
  2. #include "BsMath.h"
  3. #include "BsDrawHelper3D.h"
  4. #include "BsVertexDataDesc.h"
  5. #include "BsMesh.h"
  6. namespace BansheeEngine
  7. {
  8. const float SceneGrid::LINE_WIDTH = 0.025f;
  9. const float SceneGrid::LINE_BORDER_WIDTH = 0.005f;
  10. const float SceneGrid::MAJOR_AXIS_WIDTH = 0.075f;
  11. const float SceneGrid::MAJOR_AXIS_BORDER_WIDTH = 0.015f;
  12. const float SceneGrid::AXIS_MARKER_WIDTH = 0.1f;
  13. const float SceneGrid::AXIS_MARKER_BORDER_WIDTH = 0.02f;
  14. const Color SceneGrid::AXIS_X_MARKER_COLOR = Color::Red;
  15. const Color SceneGrid::AXIS_Z_MARKER_COLOR = Color::Blue;
  16. SceneGrid::SceneGrid()
  17. {
  18. mVertexDesc = bs_shared_ptr<VertexDataDesc>();
  19. mVertexDesc->addVertElem(VET_FLOAT3, VES_POSITION);
  20. mVertexDesc->addVertElem(VET_COLOR, VES_COLOR);
  21. }
  22. void SceneGrid::setOrigin(const Vector3& origin)
  23. {
  24. mOrigin = origin;
  25. updateGridMesh();
  26. }
  27. void SceneGrid::setSize(float size)
  28. {
  29. mSize = size;
  30. updateGridMesh();
  31. }
  32. void SceneGrid::setSpacing(float spacing)
  33. {
  34. mSpacing = spacing;
  35. updateGridMesh();
  36. }
  37. void SceneGrid::setMajorAxisSpacing(UINT32 spacing)
  38. {
  39. mMajorAxisSpacing = spacing;
  40. updateGridMesh();
  41. }
  42. void SceneGrid::setAxisMarkerSpacing(UINT32 spacing)
  43. {
  44. mAxisMarkerSpacing = spacing;
  45. updateGridMesh();
  46. }
  47. void SceneGrid::updateGridMesh()
  48. {
  49. UINT32 numLines = (UINT32)Math::roundToInt(mSize / mSpacing);
  50. if (numLines % 2 != 0)
  51. numLines++;
  52. INT32 originX = Math::roundToInt(mOrigin.x / mSpacing);
  53. INT32 originZ = Math::roundToInt(mOrigin.y / mSpacing);
  54. INT32 startX = originX - numLines / 2;
  55. INT32 startZ = originZ - numLines / 2;
  56. float minX = startX * mSpacing;
  57. float minZ = startZ * mSpacing;
  58. float maxX = (startX + numLines) * mSpacing;
  59. float maxZ = (startZ + numLines) * mSpacing;
  60. UINT32 totalNumVertices = DrawHelper3D::NUM_VERTICES_AA_LINE * numLines * 2;
  61. UINT32 totalNumIndices = DrawHelper3D::NUM_INDICES_AA_LINE * numLines * 2;
  62. MeshDataPtr meshData = bs_shared_ptr<MeshData, PoolAlloc>(totalNumVertices, totalNumIndices, mVertexDesc);
  63. UINT32 vertexOffset = 0;
  64. UINT32 indexOffset = 0;
  65. for (UINT32 i = 0; i < numLines; i++)
  66. {
  67. INT32 x = startX + i;
  68. float linePosX = x * mSpacing;
  69. Vector3 lineStartX(linePosX, 0, minZ);
  70. Vector3 lineEndX(linePosX, 0, maxZ);
  71. if (x % mAxisMarkerSpacing == 0)
  72. {
  73. DrawHelper3D::instance().line_AA(lineStartX, lineEndX, Vector3::UNIT_Y, AXIS_MARKER_WIDTH,
  74. AXIS_MARKER_BORDER_WIDTH, AXIS_X_MARKER_COLOR, meshData, vertexOffset, indexOffset);
  75. }
  76. else if (x % mMajorAxisSpacing == 0)
  77. {
  78. DrawHelper3D::instance().line_AA(lineStartX, lineEndX, Vector3::UNIT_Y, MAJOR_AXIS_WIDTH,
  79. MAJOR_AXIS_BORDER_WIDTH, Color::White, meshData, vertexOffset, indexOffset);
  80. }
  81. else
  82. {
  83. DrawHelper3D::instance().line_AA(lineStartX, lineEndX, Vector3::UNIT_Y, LINE_WIDTH,
  84. LINE_BORDER_WIDTH, Color::White, meshData, vertexOffset, indexOffset);
  85. }
  86. vertexOffset += DrawHelper3D::NUM_VERTICES_AA_LINE;
  87. indexOffset += DrawHelper3D::NUM_INDICES_AA_LINE;
  88. INT32 z = startZ + i;
  89. float linePosZ = z * mSpacing;
  90. Vector3 lineStartZ(minX, 0, linePosZ);
  91. Vector3 lineEndZ(maxX, 0, linePosZ);
  92. if (z % mAxisMarkerSpacing == 0)
  93. {
  94. DrawHelper3D::instance().line_AA(lineStartZ, lineEndZ, Vector3::UNIT_Y, AXIS_MARKER_WIDTH,
  95. AXIS_MARKER_BORDER_WIDTH, AXIS_Z_MARKER_COLOR, meshData, vertexOffset, indexOffset);
  96. }
  97. else if (z % mMajorAxisSpacing == 0)
  98. {
  99. DrawHelper3D::instance().line_AA(lineStartZ, lineEndZ, Vector3::UNIT_Y, MAJOR_AXIS_WIDTH,
  100. MAJOR_AXIS_BORDER_WIDTH, Color::White, meshData, vertexOffset, indexOffset);
  101. }
  102. else
  103. {
  104. DrawHelper3D::instance().line_AA(lineStartZ, lineEndZ, Vector3::UNIT_Y, LINE_WIDTH,
  105. LINE_BORDER_WIDTH, Color::White, meshData, vertexOffset, indexOffset);
  106. }
  107. vertexOffset += DrawHelper3D::NUM_VERTICES_AA_LINE;
  108. indexOffset += DrawHelper3D::NUM_INDICES_AA_LINE;
  109. }
  110. mGridMesh = Mesh::create(meshData);
  111. }
  112. }