From 2e708bcc1da76bb1ad0b9ca71307629787300e2e Mon Sep 17 00:00:00 2001
From: Dominic Masters <dominic@domsplace.com>
Date: Wed, 29 Mar 2023 20:31:08 -0700
Subject: [PATCH] Prefab Tool More-Or-Less done

---
 src/dawn/display/RenderPipeline.hpp           |  2 +-
 src/dawn/prefabs/SimpleSpinningCubePrefab.hpp |  8 +--
 .../scene/components/display/CMakeLists.txt   |  6 +-
 .../display/SimpleRenderTargetQuad.hpp        |  2 +-
 .../scene/components/display/TiledSprite.hpp  |  4 +-
 .../components/display/mesh/CMakeLists.txt    | 12 ++++
 .../components/display/mesh/CubeMeshHost.cpp  | 25 ++++++++
 .../components/display/mesh/CubeMeshHost.hpp  | 20 +++++++
 .../display/{ => mesh}/MeshHost.cpp           |  0
 .../display/{ => mesh}/MeshHost.hpp           |  0
 .../display/{ => mesh}/MeshRenderer.cpp       | 52 ++++++++--------
 .../display/{ => mesh}/MeshRenderer.hpp       | 60 +++++++++----------
 .../scene/components/example/ExampleSpin.cpp  |  2 +-
 .../display/shader/SimpleTexturedShader.cpp   |  2 +-
 src/dawnrose/scenes/HelloWorldScene.hpp       |  4 --
 15 files changed, 124 insertions(+), 75 deletions(-)
 create mode 100644 src/dawn/scene/components/display/mesh/CMakeLists.txt
 create mode 100644 src/dawn/scene/components/display/mesh/CubeMeshHost.cpp
 create mode 100644 src/dawn/scene/components/display/mesh/CubeMeshHost.hpp
 rename src/dawn/scene/components/display/{ => mesh}/MeshHost.cpp (100%)
 rename src/dawn/scene/components/display/{ => mesh}/MeshHost.hpp (100%)
 rename src/dawn/scene/components/display/{ => mesh}/MeshRenderer.cpp (96%)
 rename src/dawn/scene/components/display/{ => mesh}/MeshRenderer.hpp (95%)

diff --git a/src/dawn/display/RenderPipeline.hpp b/src/dawn/display/RenderPipeline.hpp
index bdfb3f04..da1bcd64 100644
--- a/src/dawn/display/RenderPipeline.hpp
+++ b/src/dawn/display/RenderPipeline.hpp
@@ -6,7 +6,7 @@
 #pragma once
 #include "dawnlibs.hpp"
 #include "scene/components/display/Material.hpp"
-#include "scene/components/display/MeshRenderer.hpp"
+#include "scene/components/display/mesh/MeshRenderer.hpp"
 #include "scene/components/display/Camera.hpp"
 #include "scene/components/scene/SubSceneController.hpp"
 #include "scene/components/ui/UIComponent.hpp"
diff --git a/src/dawn/prefabs/SimpleSpinningCubePrefab.hpp b/src/dawn/prefabs/SimpleSpinningCubePrefab.hpp
index 5a570f87..888a2fdc 100644
--- a/src/dawn/prefabs/SimpleSpinningCubePrefab.hpp
+++ b/src/dawn/prefabs/SimpleSpinningCubePrefab.hpp
@@ -7,7 +7,7 @@
 #include "prefab/SceneItemPrefab.hpp"
 #include "display/mesh/CubeMesh.hpp"
 #include "scene/components/display/MeshRenderer.hpp"
-#include "scene/components/display/MeshHost.hpp"
+#include "scene/components/display/CubeMeshHost.hpp"
 #include "scene/components/display/material/SimpleTexturedMaterial.hpp"
 #include "scene/components/example/ExampleSpin.hpp"
 #include "scene/components/physics/3d/CubeCollider.hpp"
@@ -17,7 +17,6 @@ namespace Dawn {
     public SceneItemPrefab<SimpleSpinningCubePrefab>
   {
       public:
-        MeshHost *meshHost;
         SimpleTexturedMaterial *material;
 
         static std::vector<Asset*> prefabAssets(AssetManager *man) {
@@ -31,13 +30,10 @@ namespace Dawn {
 
         void prefabInit(AssetManager *man) override {
           auto meshRenderer = this->addComponent<MeshRenderer>();
-          meshHost = this->addComponent<MeshHost>();
+          auto meshHost = this->addComponent<CubeMeshHost>();
           material = this->addComponent<SimpleTexturedMaterial>();
           auto spinning = this->addComponent<ExampleSpin>();
           auto collider = this->addComponent<CubeCollider>();
-
-          meshHost->mesh.createBuffers(CUBE_VERTICE_COUNT, CUBE_INDICE_COUNT);
-          CubeMesh::buffer(&meshHost->mesh, glm::vec3(-0.5f, -0.5f, -0.5f), glm::vec3(1, 1, 1), 0, 0);
         }
   };
 }
\ No newline at end of file
diff --git a/src/dawn/scene/components/display/CMakeLists.txt b/src/dawn/scene/components/display/CMakeLists.txt
index 661db97b..8ab850d7 100644
--- a/src/dawn/scene/components/display/CMakeLists.txt
+++ b/src/dawn/scene/components/display/CMakeLists.txt
@@ -9,9 +9,9 @@ target_sources(${DAWN_TARGET_NAME}
     AnimationController.cpp
     Camera.cpp
     Material.cpp
-    MeshHost.cpp
-    MeshRenderer.cpp
     PixelPerfectCamera.cpp
     TiledSprite.cpp
     SimpleRenderTargetQuad.cpp
-)
\ No newline at end of file
+)
+
+add_subdirectory(mesh)
\ No newline at end of file
diff --git a/src/dawn/scene/components/display/SimpleRenderTargetQuad.hpp b/src/dawn/scene/components/display/SimpleRenderTargetQuad.hpp
index 854b0614..a7b1809c 100644
--- a/src/dawn/scene/components/display/SimpleRenderTargetQuad.hpp
+++ b/src/dawn/scene/components/display/SimpleRenderTargetQuad.hpp
@@ -4,7 +4,7 @@
 // https://opensource.org/licenses/MIT
 
 #pragma once
-#include "scene/components/display/MeshHost.hpp"
+#include "scene/components/display/mesh/MeshHost.hpp"
 #include "display/RenderTarget.hpp"
 #include "display/mesh/QuadMesh.hpp"
 
diff --git a/src/dawn/scene/components/display/TiledSprite.hpp b/src/dawn/scene/components/display/TiledSprite.hpp
index 1022c9c4..a3efbac7 100644
--- a/src/dawn/scene/components/display/TiledSprite.hpp
+++ b/src/dawn/scene/components/display/TiledSprite.hpp
@@ -5,8 +5,8 @@
 
 #pragma once
 #include "scene/SceneItemComponent.hpp"
-#include "scene/components/display/MeshRenderer.hpp"
-#include "scene/components/display/MeshHost.hpp"
+#include "scene/components/display/mesh/MeshRenderer.hpp"
+#include "scene/components/display/mesh/MeshHost.hpp"
 #include "display/mesh/QuadMesh.hpp"
 #include "display/Tileset.hpp"
 
diff --git a/src/dawn/scene/components/display/mesh/CMakeLists.txt b/src/dawn/scene/components/display/mesh/CMakeLists.txt
new file mode 100644
index 00000000..fe2b8ef1
--- /dev/null
+++ b/src/dawn/scene/components/display/mesh/CMakeLists.txt
@@ -0,0 +1,12 @@
+# Copyright (c) 2023 Dominic Masters
+# 
+# This software is released under the MIT License.
+# https://opensource.org/licenses/MIT
+
+# Sources
+target_sources(${DAWN_TARGET_NAME}
+  PRIVATE
+    MeshRenderer.cpp
+    CubeMeshHost.cpp
+    MeshHost.cpp
+)
\ No newline at end of file
diff --git a/src/dawn/scene/components/display/mesh/CubeMeshHost.cpp b/src/dawn/scene/components/display/mesh/CubeMeshHost.cpp
new file mode 100644
index 00000000..d55a91b9
--- /dev/null
+++ b/src/dawn/scene/components/display/mesh/CubeMeshHost.cpp
@@ -0,0 +1,25 @@
+// Copyright (c) 2023 Dominic Masters
+// 
+// This software is released under the MIT License.
+// https://opensource.org/licenses/MIT
+
+#include "CubeMeshHost.hpp"
+
+using namespace Dawn;
+
+CubeMeshHost::CubeMeshHost(SceneItem *item) :
+  MeshHost(item),
+  size(glm::vec3(1,1,1))
+{
+}
+
+void CubeMeshHost::onStart() {
+  this->mesh.createBuffers(
+    CUBE_VERTICE_COUNT,
+    CUBE_INDICE_COUNT
+  );
+  
+  useEffect([&]{
+    CubeMesh::buffer(&this->mesh, glm::vec3(this->size) * -0.5f, this->size, 0, 0);
+  }, this->size)();
+}
\ No newline at end of file
diff --git a/src/dawn/scene/components/display/mesh/CubeMeshHost.hpp b/src/dawn/scene/components/display/mesh/CubeMeshHost.hpp
new file mode 100644
index 00000000..b15266df
--- /dev/null
+++ b/src/dawn/scene/components/display/mesh/CubeMeshHost.hpp
@@ -0,0 +1,20 @@
+// Copyright (c) 2023 Dominic Masters
+// 
+// This software is released under the MIT License.
+// https://opensource.org/licenses/MIT
+
+#pragma once
+#include "MeshHost.hpp"
+#include "display/mesh/CubeMesh.hpp"
+
+namespace Dawn {
+  class CubeMeshHost : public MeshHost {
+    public:
+      // @optional
+      StateProperty<glm::vec3> size;
+
+      CubeMeshHost(SceneItem *item);
+
+      void onStart() override;
+  };
+}
\ No newline at end of file
diff --git a/src/dawn/scene/components/display/MeshHost.cpp b/src/dawn/scene/components/display/mesh/MeshHost.cpp
similarity index 100%
rename from src/dawn/scene/components/display/MeshHost.cpp
rename to src/dawn/scene/components/display/mesh/MeshHost.cpp
diff --git a/src/dawn/scene/components/display/MeshHost.hpp b/src/dawn/scene/components/display/mesh/MeshHost.hpp
similarity index 100%
rename from src/dawn/scene/components/display/MeshHost.hpp
rename to src/dawn/scene/components/display/mesh/MeshHost.hpp
diff --git a/src/dawn/scene/components/display/MeshRenderer.cpp b/src/dawn/scene/components/display/mesh/MeshRenderer.cpp
similarity index 96%
rename from src/dawn/scene/components/display/MeshRenderer.cpp
rename to src/dawn/scene/components/display/mesh/MeshRenderer.cpp
index dca8d22c..235dd065 100644
--- a/src/dawn/scene/components/display/MeshRenderer.cpp
+++ b/src/dawn/scene/components/display/mesh/MeshRenderer.cpp
@@ -1,27 +1,27 @@
-// Copyright (c) 2022 Dominic Masters
-// 
-// This software is released under the MIT License.
-// https://opensource.org/licenses/MIT
-
-#include "MeshRenderer.hpp"
-#include "MeshHost.hpp"
-#include "scene/SceneItem.hpp"
-
-using namespace Dawn;
-
-MeshRenderer::MeshRenderer(SceneItem *item) : SceneItemComponent(item) {
-}
-
-std::vector<SceneItemComponent*> MeshRenderer::getDependencies() {
-  return std::vector<SceneItemComponent*>{
-    this->meshHost = this->item->getComponent<MeshHost>()
-  };
-}
-
-void MeshRenderer::onStart() {
-  SceneItemComponent::onStart();
-
-  if(this->mesh == nullptr && this->meshHost != nullptr) {
-    this->mesh = &this->meshHost->mesh;
-  }
+// Copyright (c) 2022 Dominic Masters
+// 
+// This software is released under the MIT License.
+// https://opensource.org/licenses/MIT
+
+#include "MeshRenderer.hpp"
+#include "MeshHost.hpp"
+#include "scene/SceneItem.hpp"
+
+using namespace Dawn;
+
+MeshRenderer::MeshRenderer(SceneItem *item) : SceneItemComponent(item) {
+}
+
+std::vector<SceneItemComponent*> MeshRenderer::getDependencies() {
+  return std::vector<SceneItemComponent*>{
+    this->meshHost = this->item->getComponent<MeshHost>()
+  };
+}
+
+void MeshRenderer::onStart() {
+  SceneItemComponent::onStart();
+
+  if(this->mesh == nullptr && this->meshHost != nullptr) {
+    this->mesh = &this->meshHost->mesh;
+  }
 }
\ No newline at end of file
diff --git a/src/dawn/scene/components/display/MeshRenderer.hpp b/src/dawn/scene/components/display/mesh/MeshRenderer.hpp
similarity index 95%
rename from src/dawn/scene/components/display/MeshRenderer.hpp
rename to src/dawn/scene/components/display/mesh/MeshRenderer.hpp
index 83f8432e..73437c41 100644
--- a/src/dawn/scene/components/display/MeshRenderer.hpp
+++ b/src/dawn/scene/components/display/mesh/MeshRenderer.hpp
@@ -1,31 +1,31 @@
-// Copyright (c) 2022 Dominic Masters
-// 
-// This software is released under the MIT License.
-// https://opensource.org/licenses/MIT
-
-#pragma once
-#include "scene/SceneItemComponent.hpp"
-#include "display/mesh/Mesh.hpp"
-
-namespace Dawn {
-  class MeshHost;
-
-  class MeshRenderer : public SceneItemComponent {
-    protected:
-      MeshHost *meshHost = nullptr;
-
-    public:
-      // @optional
-      Mesh * mesh = nullptr;
-
-      /**
-       * Constructs a MeshRenderer scene item component.
-       * 
-       * @param item Scene Item this mesh renderer belongs to.
-       */
-      MeshRenderer(SceneItem *item);
-
-      std::vector<SceneItemComponent*> getDependencies() override;
-      void onStart() override;
-  };
+// Copyright (c) 2022 Dominic Masters
+// 
+// This software is released under the MIT License.
+// https://opensource.org/licenses/MIT
+
+#pragma once
+#include "scene/SceneItemComponent.hpp"
+#include "display/mesh/Mesh.hpp"
+
+namespace Dawn {
+  class MeshHost;
+
+  class MeshRenderer : public SceneItemComponent {
+    protected:
+      MeshHost *meshHost = nullptr;
+
+    public:
+      // @optional
+      Mesh * mesh = nullptr;
+
+      /**
+       * Constructs a MeshRenderer scene item component.
+       * 
+       * @param item Scene Item this mesh renderer belongs to.
+       */
+      MeshRenderer(SceneItem *item);
+
+      std::vector<SceneItemComponent*> getDependencies() override;
+      void onStart() override;
+  };
 }
\ No newline at end of file
diff --git a/src/dawn/scene/components/example/ExampleSpin.cpp b/src/dawn/scene/components/example/ExampleSpin.cpp
index 3c0ad2f3..f5ef392f 100644
--- a/src/dawn/scene/components/example/ExampleSpin.cpp
+++ b/src/dawn/scene/components/example/ExampleSpin.cpp
@@ -5,7 +5,7 @@
 
 #include "ExampleSpin.hpp"
 #include "game/DawnGame.hpp"
-#include "scene/components/display/MeshRenderer.hpp"
+#include "scene/components/display/mesh/MeshRenderer.hpp"
 #include "display/mesh/CubeMesh.hpp"
 #include "scene/components/display/material/SimpleTexturedMaterial.hpp"
 
diff --git a/src/dawnopengl/display/shader/SimpleTexturedShader.cpp b/src/dawnopengl/display/shader/SimpleTexturedShader.cpp
index b3941761..78acefcb 100644
--- a/src/dawnopengl/display/shader/SimpleTexturedShader.cpp
+++ b/src/dawnopengl/display/shader/SimpleTexturedShader.cpp
@@ -4,7 +4,7 @@
 // https://opensource.org/licenses/MIT
 
 #include "SimpleTexturedShader.hpp"
-#include "scene/components/display/MeshRenderer.hpp"
+#include "scene/components/display/mesh/MeshRenderer.hpp"
 #include "scene/components/display/Camera.hpp"
 
 using namespace Dawn;
diff --git a/src/dawnrose/scenes/HelloWorldScene.hpp b/src/dawnrose/scenes/HelloWorldScene.hpp
index c4a4383c..4a0a656c 100644
--- a/src/dawnrose/scenes/HelloWorldScene.hpp
+++ b/src/dawnrose/scenes/HelloWorldScene.hpp
@@ -7,7 +7,6 @@
 #include "scene/Scene.hpp"
 #include "scene/components/GameCamera.hpp"
 #include "prefabs/Player.hpp"
-#include "prefabs/SpinningCube.hpp"
 #include "prefabs/ui/debug/FPSLabel.hpp"
 #include "display/mesh/CapsuleMesh.hpp"
 #include "display/mesh/CubeMesh.hpp"
@@ -21,9 +20,6 @@ namespace Dawn {
       void stage() override {
 
         auto player = Player::create(this);
-        CapsuleMesh::create(&player->meshHost->mesh, 0.5f, 1.5f);
-        player->meshHost->mesh.createBuffers(CUBE_VERTICE_COUNT, CUBE_INDICE_COUNT);
-        CubeMesh::buffer(&player->meshHost->mesh, glm::vec3(-0.5f, -0.5f, -0.5f), glm::vec3(1, 1, 1), 0, 0);
 
         canvas = UICanvas::create(this);