BsSceneGrid.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #include "BsSceneGrid.h"
  2. #include "BsMath.h"
  3. #include "BsShapeMeshes3D.h"
  4. #include "BsVertexDataDesc.h"
  5. #include "BsMaterial.h"
  6. #include "BsMesh.h"
  7. #include "BsBuiltinEditorResources.h"
  8. #include "BsCCamera.h"
  9. #include "BsRect3.h"
  10. #include "BsCoreThread.h"
  11. #include "BsEditorSettings.h"
  12. #include "BsRendererManager.h"
  13. #include "BsRenderer.h"
  14. namespace BansheeEngine
  15. {
  16. const Color SceneGridCore::GRID_LINE_COLOR = Color(0.5f, 0.5f, 0.5f);
  17. const float SceneGridCore::LINE_WIDTH = 0.025f;
  18. const float SceneGridCore::LINE_BORDER_WIDTH = 0.00075f;
  19. const float SceneGridCore::FADE_OUT_START = 5.0f;
  20. const float SceneGridCore::FADE_OUT_END = 40.0f;
  21. SceneGrid::SceneGrid(const CameraPtr& camera)
  22. :mCoreDirty(true), mCore(nullptr)
  23. {
  24. mVertexDesc = bs_shared_ptr_new<VertexDataDesc>();
  25. mVertexDesc->addVertElem(VET_FLOAT3, VES_POSITION);
  26. mVertexDesc->addVertElem(VET_FLOAT3, VES_NORMAL);
  27. mCore.store(bs_new<SceneGridCore>(), std::memory_order_release);
  28. HMaterial gridMaterial = BuiltinEditorResources::instance().createSceneGridMaterial();
  29. SPtr<MaterialCore> materialCore = gridMaterial->getCore();
  30. gCoreAccessor().queueCommand(std::bind(&SceneGrid::initializeCore, this, camera->getCore(), materialCore));
  31. updateGridMesh();
  32. }
  33. SceneGrid::~SceneGrid()
  34. {
  35. gCoreAccessor().queueCommand(std::bind(&SceneGrid::destroyCore, this, mCore.load(std::memory_order_relaxed)));
  36. }
  37. void SceneGrid::initializeCore(const SPtr<CameraCore>& camera, const SPtr<MaterialCore>& material)
  38. {
  39. THROW_IF_NOT_CORE_THREAD;
  40. mCore.load()->initialize(camera, material);
  41. }
  42. void SceneGrid::destroyCore(SceneGridCore* core)
  43. {
  44. THROW_IF_NOT_CORE_THREAD;
  45. bs_delete(core);
  46. }
  47. void SceneGrid::setOrigin(const Vector3& origin)
  48. {
  49. if (mOrigin != origin)
  50. {
  51. mOrigin = origin;
  52. updateGridMesh();
  53. }
  54. }
  55. void SceneGrid::setSize(UINT32 size)
  56. {
  57. if (mSize != size)
  58. {
  59. mSize = size;
  60. updateGridMesh();
  61. }
  62. }
  63. void SceneGrid::setSpacing(float spacing)
  64. {
  65. if (mSpacing != spacing)
  66. {
  67. mSpacing = spacing;
  68. mCoreDirty = true;
  69. }
  70. }
  71. void SceneGrid::setSettings(const EditorSettingsPtr& settings)
  72. {
  73. mSettings = settings;
  74. updateFromEditorSettings();
  75. }
  76. void SceneGrid::update()
  77. {
  78. if (mSettings != nullptr && mSettingsHash != mSettings->getHash())
  79. updateFromEditorSettings();
  80. if (mCoreDirty)
  81. {
  82. SceneGridCore* core = mCore.load(std::memory_order_relaxed);
  83. gCoreAccessor().queueCommand(std::bind(&SceneGridCore::updateData, core, mGridMesh->getCore(), mSpacing));
  84. mCoreDirty = false;
  85. }
  86. }
  87. void SceneGrid::updateFromEditorSettings()
  88. {
  89. setSize(mSettings->getGridSize());
  90. setSpacing(mSettings->getGridSpacing());
  91. mSettingsHash = mSettings->getHash();
  92. }
  93. void SceneGrid::updateGridMesh()
  94. {
  95. std::array<Vector3, 2> axes;
  96. axes[0] = Vector3::UNIT_X;
  97. axes[1] = Vector3::UNIT_Z;
  98. std::array<float, 2> extents;
  99. extents[0] = mSize * 0.5f;
  100. extents[1] = mSize * 0.5f;
  101. Rect3 quad(mOrigin, axes, extents);
  102. MeshDataPtr meshData = bs_shared_ptr_new<MeshData>(8, 12, mVertexDesc);
  103. ShapeMeshes3D::solidQuad(quad, meshData, 0, 0);
  104. mGridMesh = Mesh::create(meshData);
  105. mCoreDirty = true;
  106. }
  107. SceneGridCore::~SceneGridCore()
  108. {
  109. CoreRendererPtr activeRenderer = RendererManager::instance().getActive();
  110. activeRenderer->_unregisterRenderCallback(mCamera.get(), -10);
  111. }
  112. void SceneGridCore::initialize(const SPtr<CameraCore>& camera, const SPtr<MaterialCore>& material)
  113. {
  114. mCamera = camera;
  115. mGridMaterial = material;
  116. mViewProjParam = mGridMaterial->getParamMat4("matViewProj");
  117. mWorldCameraPosParam = mGridMaterial->getParamVec4("worldCameraPos");
  118. mGridColorParam = mGridMaterial->getParamColor("gridColor");
  119. mGridSpacingParam = mGridMaterial->getParamFloat("gridSpacing");
  120. mGridBorderWidthParam = mGridMaterial->getParamFloat("gridBorderWidth");
  121. mGridFadeOutStartParam = mGridMaterial->getParamFloat("gridFadeOutStart");
  122. mGridFadeOutEndParam = mGridMaterial->getParamFloat("gridFadeOutEnd");
  123. CoreRendererPtr activeRenderer = RendererManager::instance().getActive();
  124. activeRenderer->_registerRenderCallback(camera.get(), -10, std::bind(&SceneGridCore::render, this));
  125. }
  126. void SceneGridCore::updateData(const SPtr<MeshCore>& mesh, float spacing)
  127. {
  128. mGridMesh = mesh;
  129. mSpacing = spacing;
  130. }
  131. void SceneGridCore::render()
  132. {
  133. THROW_IF_NOT_CORE_THREAD;
  134. Matrix4 projMatrix = mCamera->getProjectionMatrixRS();
  135. Matrix4 viewMatrix = mCamera->getViewMatrix();
  136. Matrix4 viewProjMatrix = projMatrix * viewMatrix;
  137. mViewProjParam.set(viewProjMatrix);
  138. mWorldCameraPosParam.set(Vector4(mCamera->getPosition(), 1.0f));
  139. mGridColorParam.set(GRID_LINE_COLOR);
  140. mGridSpacingParam.set(mSpacing);
  141. mGridBorderWidthParam.set(LINE_BORDER_WIDTH);
  142. mGridFadeOutStartParam.set(FADE_OUT_START);
  143. mGridFadeOutEndParam.set(FADE_OUT_END);
  144. CoreRenderer::setPass(mGridMaterial, 0);
  145. CoreRenderer::draw(mGridMesh, mGridMesh->getProperties().getSubMesh(0));
  146. }
  147. }