Browse Source

allow model collections to decide if they are rendered or ticked

Kolja Strohm 1 year ago
parent
commit
b3c59f21f2
8 changed files with 49 additions and 3 deletions
  1. 1 1
      DX11GraphicsApi.cpp
  2. 1 1
      DX12GraphicsApi.cpp
  3. 1 0
      Framework.vcxproj
  4. 3 0
      Framework.vcxproj.filters
  5. 17 0
      Model3DCollection.cpp
  6. 3 0
      Model3DCollection.h
  7. 19 1
      Welt3D.cpp
  8. 4 0
      Welt3D.h

+ 1 - 1
DX11GraphicsApi.cpp

@@ -766,7 +766,7 @@ void DirectX11::renderKamera(Kam3D* zKamera)
     int maxDist = 0;
     int minDist = 0x7FFFFFFF;
     Array<Model3D*> alphaModels;
-    w->forAll([this, &minDist, &maxDist, &alphaModels](Model3D* obj) {
+    w->render([this, &minDist, &maxDist, &alphaModels](Model3D* obj) {
         float dist;
         if (isInFrustrum(obj->getPos(), obj->getRadius(), &dist))
         {

+ 1 - 1
DX12GraphicsApi.cpp

@@ -1137,7 +1137,7 @@ void DirectX12::renderKamera(Kam3D* zKamera)
     if (pixelShader)
         pixelShader->füllConstBuffer((char*)&kamPos, 2, sizeof(float) * 3);
     Welt3D* w = zKamera->zWelt();
-    w->forAll([this](Model3D* obj) {
+    w->render([this](Model3D* obj) {
         if (isInFrustrum(obj->getPos(), obj->getRadius())) renderObject(obj);
     });
 }

+ 1 - 0
Framework.vcxproj

@@ -341,6 +341,7 @@ copy "x64\Release\Framework.dll" "..\..\Spiele Platform\SMP\Fertig\x64\framework
     <ClCompile Include="MausEreignis.cpp" />
     <ClCompile Include="Model2D.cpp" />
     <ClCompile Include="Model3D.cpp" />
+    <ClCompile Include="Model3DCollection.cpp" />
     <ClCompile Include="Model3DCollection.h" />
     <ClCompile Include="Model3DList.cpp" />
     <ClCompile Include="ObjFile.cpp" />

+ 3 - 0
Framework.vcxproj.filters

@@ -582,6 +582,9 @@
     <ClCompile Include="Zeit.cpp">
       <Filter>Framework</Filter>
     </ClCompile>
+    <ClCompile Include="Model3DCollection.cpp">
+      <Filter>Framework\Grafik\3D</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <FxCompile Include="DX12VertexShader.hlsl">

+ 17 - 0
Model3DCollection.cpp

@@ -0,0 +1,17 @@
+#include "Model3DCollection.h"
+
+using namespace Framework;
+
+Model3DCollection::Model3DCollection()
+    : ReferenceCounter()
+{}
+
+void Model3DCollection::tick(std::function<void(Model3D*)> f)
+{
+    forAll(f);
+}
+
+void Model3DCollection::render(std::function<void(Model3D*)> f)
+{
+    forAll(f);
+}

+ 3 - 0
Model3DCollection.h

@@ -10,6 +10,9 @@ namespace Framework
     class Model3DCollection : public virtual ReferenceCounter
     {
     public:
+        DLLEXPORT Model3DCollection();
         virtual void forAll(std::function<void(Model3D*)> f) = 0;
+        DLLEXPORT virtual void tick(std::function<void(Model3D*)> f);
+        DLLEXPORT virtual void render(std::function<void(Model3D*)> f);
     };
 } // namespace Framework

+ 19 - 1
Welt3D.cpp

@@ -169,7 +169,7 @@ void Welt3D::doMausEreignis(MausEreignis3D& me)
 bool Welt3D::tick(double tickval)
 {
     cs.lock();
-    forAll([this, &tickval](Model3D* m) { rend |= m->tick(tickval); });
+    tick([this, &tickval](Model3D* m) { rend |= m->tick(tickval); });
     cs.unlock();
     bool tmp = rend;
     rend = 0;
@@ -207,6 +207,24 @@ void Framework::Welt3D::forAll(std::function<void(Model3D*)> f)
         c->forAll(f);
 }
 
+//! führt eine tick funktion auf jedem Model aus
+void Welt3D::tick(std::function<void(Model3D*)> f)
+{
+    for (auto m : *members)
+        f(m);
+    for (auto c : modelCollections)
+        c->tick(f);
+}
+
+//! führt eine render funktion auf jedem Model aus
+void Welt3D::render(std::function<void(Model3D*)> f)
+{
+    for (auto m : *members)
+        f(m);
+    for (auto c : modelCollections)
+        c->render(f);
+}
+
 int Framework::Welt3D::getPointLightCount() const
 {
     return pointLightCount;

+ 4 - 0
Welt3D.h

@@ -68,6 +68,10 @@ namespace Framework
         DLLEXPORT virtual int traceRay(Vec3<float>& point, Vec3<float>& dir);
         //! führt eine funktion auf jedem Model aus
         DLLEXPORT virtual void forAll(std::function<void(Model3D*)> f) override;
+        //! führt eine tick funktion auf jedem Model aus
+        DLLEXPORT virtual void tick(std::function<void(Model3D*)> f) override;
+        //! führt eine render funktion auf jedem Model aus
+        DLLEXPORT virtual void render(std::function<void(Model3D*)> f) override;
         //! Gibt die Anzahl an Punkt Lichtquellen zurück
         DLLEXPORT int getPointLightCount() const;
         //! Gibt die Anzahl an Richtungs Lichtquellen zurück