Bladeren bron

Shader für 3d Animationen angepasst und
Skelettstruktur für 3d Modelle hinzugefügt

Kolja Strohm 10 jaren geleden
bovenliggende
commit
446d36ab9e
18 gewijzigde bestanden met toevoegingen van 612 en 196 verwijderingen
  1. 1 0
      .gitignore
  2. 25 76
      Bildschirm.cpp
  3. 2 2
      Bildschirm.h
  4. 2 35
      Cube.cpp
  5. 0 8
      Cube.h
  6. 4 14
      DefaultShader.h
  7. 2 0
      Framework.vcxproj
  8. 9 3
      Framework.vcxproj.filters
  9. 277 7
      Model3D.cpp
  10. 90 25
      Model3D.h
  11. 11 11
      Render3D.cpp
  12. 6 4
      Render3D.h
  13. 5 2
      Shader.cpp
  14. 2 1
      Shader.h
  15. 114 0
      TexturModel.cpp
  16. 31 0
      TexturModel.h
  17. 16 0
      Zeichnung3D.cpp
  18. 15 8
      Zeichnung3D.h

+ 1 - 0
.gitignore

@@ -77,6 +77,7 @@ ipch/
 *.opensdf
 *.sdf
 *.cachefile
+*.opendb
 
 # Visual Studio profiler
 *.psess

+ 25 - 76
Bildschirm.cpp

@@ -21,6 +21,8 @@
 #include "DXBuffer.h"
 #include "Model3D.h"
 #include "Textur.h"
+#include "TexturModel.h"
+#include "TexturList.h"
 #include <d3d11.h>
 #include <d3d9.h>
 
@@ -507,8 +509,6 @@ Bildschirm3D::Bildschirm3D( WFenster *fenster )
     d3d11Context( 0 ),
     d3d11SpawChain( 0 ),
     frameworkTextur( 0 ),
-    vertexBuffer( 0 ),
-    indexBuffer( 0 ),
     vertexShader( 0 ),
     pixelShader( 0 ),
     sampleState( 0 ),
@@ -521,7 +521,8 @@ Bildschirm3D::Bildschirm3D( WFenster *fenster )
     kameras( new RCArray< Kam3D >() ),
     rend3D( 0 ),
     vp( 0 ),
-    renderObj( new Render3D() )
+    renderObj( new Render3D() ),
+    texturModel( new TexturModel() )
 {}
 
 // Destruktor 
@@ -529,6 +530,7 @@ Bildschirm3D::~Bildschirm3D()
 {
     kameras->release();
     renderObj->release();
+    texturModel->release();
     cleanUpDirectX();
 }
 
@@ -555,16 +557,6 @@ void Bildschirm3D::cleanUpDirectX()
         frameworkTextur->release();
         frameworkTextur = NULL;
     }
-    if( vertexBuffer )
-    {
-        vertexBuffer->release();
-        vertexBuffer = NULL;
-    }
-    if( indexBuffer )
-    {
-        indexBuffer->release();
-        indexBuffer = NULL;
-    }
     if( pixelShader )
     {
         pixelShader->release();
@@ -770,7 +762,7 @@ void Bildschirm3D::update() // aktualisiert directX
     D3D11_DEPTH_STENCIL_DESC depthDisabledStencilDesc;
     // Clear the second depth stencil state before setting the parameters.
     ZeroMemory( &depthDisabledStencilDesc, sizeof( depthDisabledStencilDesc ) );
-    
+
     // Now create a second depth stencil state which turns off the Z buffer for 2D rendering.  The only difference is 
     // that DepthEnable is set to false, all other parameters are the same as the other depth stencil state.
     depthDisabledStencilDesc.DepthEnable = false;
@@ -787,7 +779,7 @@ void Bildschirm3D::update() // aktualisiert directX
     depthDisabledStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
     depthDisabledStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
     depthDisabledStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
-    
+
     // Create the state using the device.
     result = d3d11Device->CreateDepthStencilState( &depthDisabledStencilDesc, &depthDisabledStencilState );
 
@@ -804,7 +796,7 @@ void Bildschirm3D::update() // aktualisiert directX
     pixelShader->setShaderCode( &shader );
     pixelShader->compile( d3d11Device, "TexturePixelShader", "5_0" );
 
-    D3D11_INPUT_ELEMENT_DESC polygonLayout[ 2 ];
+    D3D11_INPUT_ELEMENT_DESC polygonLayout[ 3 ];
     // Create the vertex input layout description.
     // This setup needs to match the VertexType stucture in the ModelClass and in the shader.
     polygonLayout[ 0 ].SemanticName = "POSITION";
@@ -823,8 +815,16 @@ void Bildschirm3D::update() // aktualisiert directX
     polygonLayout[ 1 ].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
     polygonLayout[ 1 ].InstanceDataStepRate = 0;
 
-    vertexShader->erstelleInputLayout( d3d11Device, polygonLayout, 2 );
-    vertexShader->erstelleConstBuffer( d3d11Device, sizeof( Mat4< float > ) * 3, 0 );
+    polygonLayout[ 2 ].SemanticName = "KNOCHEN_ID";
+    polygonLayout[ 2 ].SemanticIndex = 0;
+    polygonLayout[ 2 ].Format = DXGI_FORMAT_R32_UINT;
+    polygonLayout[ 2 ].InputSlot = 0;
+    polygonLayout[ 2 ].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
+    polygonLayout[ 2 ].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
+    polygonLayout[ 2 ].InstanceDataStepRate = 0;
+
+    vertexShader->erstelleInputLayout( d3d11Device, polygonLayout, 3 );
+    vertexShader->erstelleConstBuffer( d3d11Device, sizeof( Mat4< float > ) * 128, 0 );
 
     // Create a texture sampler state description.
     D3D11_SAMPLER_DESC samplerDesc;
@@ -848,60 +848,12 @@ void Bildschirm3D::update() // aktualisiert directX
     //---------------------------------------------------------------
     // Framework Backbuffer Texture
 
-
-    unsigned long indices[ 6 ];
-    Vertex3D vertices[ 6 ];
-
-    // Load the index array with data.
-    for( int i = 0; i < 6; i++ )
-    {
-        indices[ i ] = i;
-    }
-    vertexBuffer = new DXVertexBuffer( sizeof( Vertex3D ) );
-    vertexBuffer->setLänge( sizeof( vertices ) );
-    vertexBuffer->setData( vertices );
-
-    indexBuffer = new DXIndexBuffer( sizeof( int ) );
-    indexBuffer->setLänge( sizeof( int ) * 6 );
-    indexBuffer->setData( indices );
-
     frameworkTextur = new Textur();
     frameworkTextur->setBildZ( renderB->getThis() );
+    texturRegister->addTextur( frameworkTextur->getThis(), "f_Render_Bild" );
 
-    float left, right, top, bottom;
-    // Calculate the screen coordinates of the left side of the bitmap.
-    left = (float)( ( backBufferGröße.x / 2.0 ) * -1 );
-
-    // Calculate the screen coordinates of the right side of the bitmap.
-    right = left + (float)backBufferGröße.x;
-
-    // Calculate the screen coordinates of the top of the bitmap.
-    top = (float)( backBufferGröße.y / 2.0 );
-
-    // Calculate the screen coordinates of the bottom of the bitmap.
-    bottom = top - (float)backBufferGröße.y;
-
-    // Load the vertex array with data.
-    // First triangle.
-    vertices[ 0 ].pos = Vec3< float >( left, top, 0.0f );  // Top left.
-    vertices[ 0 ].tPos = Vec2< float >( 0.0f, 0.0f );
-
-    vertices[ 1 ].pos = Vec3< float >( right, bottom, 0.0f );  // Bottom right.
-    vertices[ 1 ].tPos = Vec2< float >( 1.0f, 1.0f );
-
-    vertices[ 2 ].pos = Vec3< float >( left, bottom, 0.0f );  // Bottom left.
-    vertices[ 2 ].tPos = Vec2< float >( 0.0f, 1.0f );
-
-    // Second triangle.
-    vertices[ 3 ].pos = Vec3< float >( left, top, 0.0f );  // Top left.
-    vertices[ 3 ].tPos = Vec2< float >( 0.0f, 0.0f );
-
-    vertices[ 4 ].pos = Vec3< float >( right, top, 0.0f );  // Top right.
-    vertices[ 4 ].tPos = Vec2< float >( 1.0f, 0.0f );
-
-    vertices[ 5 ].pos = Vec3< float >( right, bottom, 0.0f );  // Bottom right.
-    vertices[ 5 ].tPos = Vec2< float >( 1.0f, 1.0f );
-
+    texturModel->setGröße( backBufferGröße );
+    texturModel->setTextur( frameworkTextur->getId() );
 
     D3D11_BLEND_DESC blendState;
     ZeroMemory( &blendState, sizeof( D3D11_BLEND_DESC ) );
@@ -932,9 +884,6 @@ void Bildschirm3D::update() // aktualisiert directX
     d3d11Context->PSSetSamplers( 0, 1, &sampleState );
     renderObj->benutzeShader( PIXEL, pixelShader->getThis() );
 
-    vertexBuffer->copieren( renderObj );
-    indexBuffer->copieren( renderObj );
-
     rend = 1;
     unlock();
 }
@@ -945,6 +894,7 @@ void Bildschirm3D::tick( double tickval )
     __super::tick( tickval );
     for( auto i = kameras->getArray(); i.set; i++ )
         rend3D |= i.var->tick( tickval );
+    rend3D |= texturModel->tick( tickval );
     unlock();
 }
 
@@ -1033,11 +983,10 @@ void Bildschirm3D::render() // Zeichnet das Bild
 
         d3d11Context->RSSetViewports( 1, vp );
 
-        Mat4< float > welt = welt.identity();
         float screenAspect = (float)backBufferGröße.x / (float)backBufferGröße.y;
-        renderObj->setKameraMatrix( welt.translation( Vec3< float >( 0.f, 0.f, backBufferGröße.y * 1.2075f ) ), welt.projektion( DirectX::XM_PI / 4.0f, screenAspect, 0.1f, 10000.f ), Vec3< float >( 0.f, 0.f, backBufferGröße.y * 1.2075f ) );
-        renderObj->beginnModel( welt, vertexBuffer, -1 );
-        renderObj->draw( indexBuffer, frameworkTextur );
+        Mat4< float > view = view.translation( Vec3< float >( 0.f, 0.f, backBufferGröße.y * 1.2075f ) );
+        renderObj->setKameraMatrix( view, view.projektion( DirectX::XM_PI / 4.0f, screenAspect, 0.1f, 10000.f ), Vec3< float >( 0.f, 0.f, backBufferGröße.y * 1.2075f ) );
+        texturModel->render( renderObj );
 
         result = d3d11SpawChain->Present( 0, 0 );
         renderZeit->messungEnde();

+ 2 - 2
Bildschirm.h

@@ -46,6 +46,7 @@ namespace Framework
     class DXVertexBuffer; // DXBuffer.h
     class DXIndexBuffer; // DXBuffer.h
     class Textur; // Textur.h
+    class TexturModel; // TexturModel.h
 
     struct Monitor
     {
@@ -146,8 +147,6 @@ namespace Framework
         ID3D11Device *d3d11Device;
         ID3D11DeviceContext *d3d11Context;
         IDXGISwapChain *d3d11SpawChain;
-        DXVertexBuffer *vertexBuffer;
-        DXIndexBuffer *indexBuffer;
         Textur *frameworkTextur;
         ID3D11SamplerState* sampleState;
         ID3D11RenderTargetView *rtview;
@@ -161,6 +160,7 @@ namespace Framework
         VertexShader *vertexShader;
         Render3D *renderObj;
         D3D11_VIEWPORT *vp;
+        TexturModel *texturModel;
         bool rend3D;
 
         void cleanUpDirectX();

+ 2 - 35
Cube.cpp

@@ -14,9 +14,6 @@ using namespace Framework;
 Cube::Cube( float size )
     : Model3D()
 {
-    for( int i = 0; i < 6; i++ )
-        texturUpdate[ i ] = 0;
-
     if( m3dRegister->hatModel( Standart3DTypes::würfel ) )
         model = m3dRegister->getModel( Standart3DTypes::würfel );
     else
@@ -37,6 +34,8 @@ Cube::Cube( float size )
         float back = front + stdSize;
 
         Vertex3D *vertecies = new Vertex3D[ 24 ];
+        for( int i = 0; i < 24; i++ )
+            vertecies[ i ].knochenId = 0;
         vertecies[ 0 ].pos = Vec3<float >( left, top, front );
         vertecies[ 0 ].tPos = Vec2< float >( 0.f, 0.f );
         vertecies[ 1 ].pos = Vec3<float >( right, top, front );
@@ -173,11 +172,6 @@ Cube::Cube( float size )
     textur = new Model3DTextur();
 }
 
-// Destruktor
-Cube::~Cube()
-{
-}
-
 // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
 //  textur: Die Textur als Bild
 void Cube::setTextur( Bild *textur )
@@ -190,8 +184,6 @@ void Cube::setTextur( Bild *textur )
     this->textur->setPolygonTextur( UNTEN, t->getThis() );
     this->textur->setPolygonTextur( VORNE, t->getThis() );
     this->textur->setPolygonTextur( HINTEN, t );
-    for( int i = 0; i < 6; i++ )
-        texturUpdate[ i ] = 1;
     rend = 1;
 }
 
@@ -208,8 +200,6 @@ void Cube::setTextur( int id )
     this->textur->setPolygonTextur( UNTEN, t->getThis() );
     this->textur->setPolygonTextur( VORNE, t->getThis() );
     this->textur->setPolygonTextur( HINTEN, t );
-    for( int i = 0; i < 6; i++ )
-        texturUpdate[ i ] = 1;
     rend = 1;
 }
 
@@ -221,7 +211,6 @@ void Cube::setTextur( Bild *textur, CubeSeite s )
     Textur *t = new Textur();
     t->setBildZ( textur );
     this->textur->setPolygonTextur( s, t );
-    texturUpdate[ s ] = 1;
     rend = 1;
 }
 
@@ -234,31 +223,9 @@ void Cube::setTextur( int id, CubeSeite s )
     if( !t )
         return;
     this->textur->setPolygonTextur( s, t );
-    texturUpdate[ s ] = 1;
     rend = 1;
 }
 
-// Zeichnet den Würfel
-//  zRObj: Ein Zeiger auf das Objekt, das zum Zeichnen verwendet werden soll (ohne erhöhten Reference Counter)
-void Cube::render( Render3D *zRObj )
-{
-    Array< Textur* > tmp;
-    for( int i = 0; i < 6; i++ )
-    {
-        if( texturUpdate[ i ] )
-        {
-            Textur *t = textur->zPolygonTextur( i );
-            if( tmp.getWertIndex( t ) < 0 )
-            {
-                //t->updateTextur( zRObj );
-                tmp.add( t );
-            }
-            texturUpdate[ i ] = 0;
-        }
-    }
-    __super::render( zRObj );
-}
-
 // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
 //  return: 0.
 Model3D *Cube::release()

+ 0 - 8
Cube.h

@@ -19,15 +19,10 @@ namespace Framework
     // Ein Model eines Würfels
     class Cube : public Model3D
     {
-    private:
-        bool texturUpdate[ 6 ];
-
     public:
         // Konstruktor
         //  size: Die Größe des Würfels
         __declspec( dllexport ) Cube( float size );
-        // Destruktor
-        __declspec( dllexport ) ~Cube();
         // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
         //  textur: Die Textur als Bild
         __declspec( dllexport ) void setTextur( Bild *textur );
@@ -42,9 +37,6 @@ namespace Framework
         //  id: Die id der Textur. Sie muss im Textur Register des Frameworks registriert sein
         //  s: Die Seite, die gesetzt werden soll
         __declspec( dllexport ) void setTextur( int id, CubeSeite s );
-        // Zeichnet den Würfel
-        //  zRObj: Ein Zeiger auf das Objekt, das zum Zeichnen verwendet werden soll (ohne erhöhten Reference Counter)
-        __declspec( dllexport ) void render( Render3D *zRObj ) override;
         // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
         //  return: 0.
         __declspec( dllexport ) Model3D *release() override;

+ 4 - 14
DefaultShader.h

@@ -8,21 +8,14 @@ namespace Framework
     void getVertexShader( Text &ret )
     {
         ret = "////////////////////////////////////////////////////////////////////////////////         \n\
-        // Filename: texture.vs                                                                         \n\
-        ////////////////////////////////////////////////////////////////////////////////                \n\
-                                                                                                        \n\
-                                                                                                        \n\
         /////////////                                                                                   \n\
         // GLOBALS //                                                                                   \n\
         /////////////                                                                                   \n\
-        cbuffer MatrixBuffer                                                                            \n\
+        cbuffer MatrixBuffer : register( b0 )                                                           \n\
         {                                                                                               \n\
-            matrix worldMatrix;                                                                         \n\
-            matrix viewMatrix;                                                                          \n\
-            matrix projectionMatrix;                                                                    \n\
+            matrix knochenMatrix[ 128 ];                                                                \n\
         };                                                                                              \n\
                                                                                                         \n\
-                                                                                                        \n\
         //////////////                                                                                  \n\
         // TYPEDEFS //                                                                                  \n\
         //////////////                                                                                  \n\
@@ -30,6 +23,7 @@ namespace Framework
         {                                                                                               \n\
             float4 position : POSITION;                                                                 \n\
             float2 tex : TEXCOORD0;                                                                     \n\
+            uint knochen : KNOCHEN_ID0;                                                                 \n\
         };                                                                                              \n\
                                                                                                         \n\
         struct PixelInputType                                                                           \n\
@@ -38,7 +32,6 @@ namespace Framework
             float2 tex : TEXCOORD0;                                                                     \n\
         };                                                                                              \n\
                                                                                                         \n\
-                                                                                                        \n\
         ////////////////////////////////////////////////////////////////////////////////                \n\
         // Vertex Shader                                                                                \n\
         ////////////////////////////////////////////////////////////////////////////////                \n\
@@ -54,10 +47,7 @@ namespace Framework
             output.tex = input.tex;                                                                     \n\
                                                                                                         \n\
             // Calculate the position of the vertex against the world, view, and projection matrices.   \n\
-            output.position = input.position;                                                           \n\
-            output.position = mul( input.position, worldMatrix );                                       \n\
-            output.position = mul( output.position, viewMatrix );                                       \n\
-            output.position = mul( output.position, projectionMatrix );                                 \n\
+            output.position = mul( input.position, knochenMatrix[ input.knochen ] );                    \n\
                                                                                                         \n\
             return output;                                                                              \n\
         }";

+ 2 - 0
Framework.vcxproj

@@ -251,6 +251,7 @@ copy "x64\Release\Framework.dll" "..\..\Spiele Platform\SMP\Fertig\x64\framework
     <ClInclude Include="Shader.h" />
     <ClInclude Include="Textur.h" />
     <ClInclude Include="TexturList.h" />
+    <ClInclude Include="TexturModel.h" />
     <ClInclude Include="Vec4.h" />
     <ClInclude Include="Welt3D.h" />
     <ClInclude Include="Zeichnung.h" />
@@ -307,6 +308,7 @@ copy "x64\Release\Framework.dll" "..\..\Spiele Platform\SMP\Fertig\x64\framework
     <ClCompile Include="Shader.cpp" />
     <ClCompile Include="Textur.cpp" />
     <ClCompile Include="TexturList.cpp" />
+    <ClCompile Include="TexturModel.cpp" />
     <ClCompile Include="Welt3D.cpp" />
     <ClCompile Include="Zeichnung3D.cpp" />
     <ClCompile Include="Zeichnung.cpp" />

+ 9 - 3
Framework.vcxproj.filters

@@ -225,9 +225,6 @@
     <ClInclude Include="Mat4.h">
       <Filter>Headerdateien\Framework\Grafik\4D</Filter>
     </ClInclude>
-    <ClInclude Include="Shader.h">
-      <Filter>Headerdateien\Framework\Grafik\DX</Filter>
-    </ClInclude>
     <ClInclude Include="Kam3D.h">
       <Filter>Headerdateien\Framework\Grafik\3D</Filter>
     </ClInclude>
@@ -261,6 +258,12 @@
     <ClInclude Include="Animation3D.h">
       <Filter>Headerdateien\Framework\Grafik\3D</Filter>
     </ClInclude>
+    <ClInclude Include="Shader.h">
+      <Filter>Headerdateien\Framework\Objekte</Filter>
+    </ClInclude>
+    <ClInclude Include="TexturModel.h">
+      <Filter>Headerdateien\Framework\Objekte3D</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Maus.cpp">
@@ -413,6 +416,9 @@
     <ClCompile Include="TexturList.cpp">
       <Filter>Quelldateien\Framework\Grafik\3D</Filter>
     </ClCompile>
+    <ClCompile Include="TexturModel.cpp">
+      <Filter>Quelldateien\Framework\Objekte3D</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <None Include="TestShader.hlsl">

+ 277 - 7
Model3D.cpp

@@ -7,6 +7,191 @@
 
 using namespace Framework;
 
+// Inhalt der Knochen Klasse
+
+// Konstruktor
+Knochen::Knochen( int id )
+{
+    pos = Vec3< float >( 0, 0, 0 );
+    winkel = Vec3< float >( 0, 0, 0 );
+    geschwister = 0;
+    kinder = 0;
+    this->id = id;
+}
+
+// Destruktor
+Knochen::~Knochen()
+{
+    delete geschwister;
+    delete kinder;
+}
+
+// private
+
+// Fügt dem Knochen ein Geschwister Knochen hinzu
+//  k: Der Knochen, der hinzugefügt werden soll
+void Knochen::addGeschwisterKnochen( Knochen *k )
+{
+    if( !geschwister )
+        geschwister = k;
+    else
+        geschwister->addGeschwisterKnochen( k );
+}
+
+// public
+
+// Setzt die Position des Knochens relativ zum Model Ursprung
+//  pos: Die Position
+void Knochen::setPosition( Vec3< float > &pos )
+{
+    this->pos = pos;
+}
+
+// Setzt die Drehung des Knochens relativ zum Model Ursprung
+//  winkel: Ein Vektor der die Drehung um die verschiedenen Achsen als Komponenten hat
+void Knochen::setDrehung( Vec3< float > &winkel )
+{
+    this->winkel = winkel;
+}
+
+// Fügt einem bestimmten Knochen ein Kind Knochen hinzu
+//  id: Die id des Knochens, wo der Knochen als Kind hinzugefügt werden soll
+//  k: Der Knochen, der hinzugefügt werden soll
+void Knochen::addKind( int id, Knochen *k )
+{
+    if( this->id == id )
+    {
+        if( !kinder )
+            kinder = k;
+        else
+            kinder->addGeschwisterKnochen( k );
+    }
+    else
+    {
+        if( kinder )
+            kinder->addKind( id, k );
+        else
+        {
+            Text err = "Es wurde kein Knochen mit der Id: ";
+            err += id;
+            err += " im Skelett gefunden, um ein Kind Knochen hinzuzufügen. Datei:" __FILE__ ", Zeile: ";
+            err += __LINE__;
+            err += "!";
+            delete k;
+            throw std::out_of_range( err );
+        }
+    }
+}
+
+// Berechnet die Matrizen des Knochen und die von all seinen Geschwister Knochen und Kind Knochen
+//  elternMat: Die fertig berechnete Matrix des Elternknochens
+//  matBuffer: Ein Array, in dem alle berechneten Matrizen gespeichert werden sollen
+//  kamMatrix: Die vereiniegung der view und projektions Matrizen
+void Knochen::kalkulateMatrix( Mat4< float > &elternMat, Mat4< float > *matBuffer, Mat4< float > &kamMat )
+{
+    if( geschwister )
+        geschwister->kalkulateMatrix( elternMat, matBuffer, kamMat );
+    matBuffer[ id ] = matBuffer[ id ].translation( pos ) * matBuffer[ id ].rotationZ( winkel.z ) * matBuffer[ id ].rotationX( winkel.x ) * matBuffer[ id ].rotationY( winkel.y );
+    matBuffer[ id ] = elternMat * matBuffer[ id ];
+    if( kinder )
+        kinder->kalkulateMatrix( matBuffer[ id ], matBuffer, kamMat );
+    matBuffer[ id ] = kamMat * matBuffer[ id ];
+}
+
+// Kopiert den Knochen mit allen Geschwister Knochen und Kind Knochen
+Knochen *Knochen::kopiereKnochen() const
+{
+    Knochen *ret = new Knochen( id );
+    ret->pos = pos;
+    ret->winkel = winkel;
+    if( geschwister )
+        ret->geschwister = geschwister->kopiereKnochen();
+    if( kinder )
+        ret->kinder = kinder->kopiereKnochen();
+    return ret;
+}
+
+// Gibt die Id des Knochens zurück
+int Knochen::getId() const
+{
+    return id;
+}
+
+// Inhalt der Skelett Klasse
+
+// Konstruktor
+Skelett::Skelett()
+{
+    k = 0;
+    nextId = 0;
+    ref = 1;
+}
+
+// Destruktor
+Skelett::~Skelett()
+{
+    if( k )
+        delete k;
+}
+
+// Gibt die Id des nächsten Knochens zurück und berechnet die neue Id für den Knochen danach
+// Es können maximal 128 Knochen für ein Skelett existieren. Wenn diese Zahl überschritten wird, so wird -1 zurückgegeben
+int Skelett::getNextKnochenId()
+{
+    return nextId++;
+}
+
+// Fügt dem Skellet einen Knochen hinzu
+//  k: Der Knochen
+//  elternId: Die Id des Eltern Knochens. Wenn der Knochen kein Elternknochen besitzt, kannder Parameter weggelassen werden.
+void Skelett::addKnochen( Knochen *k, int elternId )
+{
+    if( !this->k )
+        this->k = k;
+    else
+        this->k->addKind( elternId, k );
+    if( k->getId() >= nextId )
+        nextId = k->getId() + 1;
+}
+
+// Berechnet die Matrizen der Knochen
+//  modelMatrix: Die Matrix, die das Skelett in den Raum der Welt transformiert
+//  matBuffer: Ein Array von Matrizen, der durch die Knochen Matrizen gefüllt wird
+//  return: gibt die Anzahl der verwendeten Matrizen zurück
+//  kamMatrix: Die vereiniegung der view und projektions Matrizen
+int Skelett::kalkulateMatrix( Mat4< float > &modelMatrix, Mat4< float > *matBuffer, Mat4< float > &kamMatrix )
+{
+    k->kalkulateMatrix( modelMatrix, matBuffer, kamMatrix );
+    return nextId;
+}
+
+// Kopiert das Skelett
+Skelett *Skelett::kopiereSkelett() const
+{
+    Skelett *ret = new Skelett();
+    ret->nextId = nextId;
+    if( k )
+        ret->addKnochen( k->kopiereKnochen() );
+    return ret;
+}
+
+// Erhöht den Reference Counting Zähler.
+Skelett *Skelett::getThis()
+{
+    ref++;
+    return this;
+}
+
+// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
+//  return: 0.
+Skelett *Skelett::release()
+{
+    ref--;
+    if( !ref )
+        delete this;
+    return 0;
+}
+
 // Inhalt des Polygon3D Struct
 
 // Konstruktor
@@ -30,6 +215,7 @@ Polygon3D::~Polygon3D()
 Model3DData::Model3DData()
 {
     id = -1;
+    skelett = 0;
     vertexList = 0;
     polygons = new Array< Polygon3D* >();
     vertexBuffer = new DXVertexBuffer( sizeof( Vertex3D ) );
@@ -53,14 +239,27 @@ void Model3DData::clearModel()
     for( auto i = polygons->getArray(); i.set; i++ )
         delete i.var;
     polygons->leeren();
+    if( skelett )
+        skelett->release();
+    skelett = 0;
+    radius = 0;
+}
+
+// Setzt den Zeiger auf ein standartmäßig verwendete Skelett
+//  s: Das Skelett, das verwendet werden soll
+void Model3DData::setSkelettZ( Skelett *s )
+{
+    if( skelett )
+        skelett->release();
+    skelett = s;
 }
 
 // Setzt einen Zeiger auf eine Liste mit allen Vertecies des Models
 //  vertexList: Ein Array mit Vertecies
-        //  anz: Die Anzahl der Vertecies im Array
+//  anz: Die Anzahl der Vertecies im Array
 void Model3DData::setVertecies( Vertex3D *vertexList, int anz )
 {
-    clearModel();
+    delete[] this->vertexList;
     this->vertexList = vertexList;
     vertexBuffer->setData( vertexList );
     vertexBuffer->setLänge( sizeof( Vertex3D ) * anz );
@@ -113,7 +312,7 @@ void Model3DData::copyModel2D( Model2DData *model, float z )
                 for( auto *k = &j.var->zListe()->getArray(); k && k->set; k = k->next )
                 {
                     vertexList[ index ].pos = Vec3< float >( k->var->punkt->x, k->var->punkt->y, z );
-                    vertexList[ index ].tPos = (Vec2< float >)*k->var->textur;
+                    vertexList[ index ].tPos = ( Vec2< float > )*k->var->textur;
                     if( k->next && k->next->set && k->next->next && k->next->next->set )
                     {
                         p->indexList[ p->indexAnz ] = index;
@@ -141,14 +340,31 @@ void Model3DData::removePolygon( int index )
     polygons->lösche( index );
 }
 
+// Aktualisiert die Vertecies
+//  zRObj: Das Objekt, mit dem die Grafikkarte verwaltet wird
+void Model3DData::aktualisiereVertecies( Render3D *zRObj )
+{
+    vertexBuffer->copieren( zRObj );
+}
+
+// Berechnet die Matrizen der Knochen
+//  modelMatrix: Die Matrix, die das Skelett in den Raum der Welt transformiert
+//  matBuffer: Ein Array von Matrizen, der durch die Knochen Matrizen gefüllt wird
+//  return: gibt die Anzahl der verwendeten Matrizen zurück
+//  kamMatrix: Die vereiniegung der view und projektions Matrizen
+int Model3DData::kalkulateMatrix( Mat4< float > &modelMatrix, Mat4< float > *matBuffer, Mat4< float > &kamMatrix ) const
+{
+    if( !skelett )
+        return 0;
+    return skelett->kalkulateMatrix( modelMatrix, matBuffer, kamMatrix );
+}
+
 // Zeichnet alle Polygons
 //  world: Die Welt Matrix, die das Model in die Welt transformiert
 //  zTxt: Eine Liste mit Texturen der einzelnen Polygone
 //  zRObj: Das Objekt, mit dem gezeichnet werden soll
 void Model3DData::render( Mat4< float > &welt, const Model3DTextur *zTxt, Render3D *zRObj )
 {
-    vertexBuffer->copieren( zRObj );
-    zRObj->beginnModel( welt, vertexBuffer, id );
     int ind = 0;
     for( auto *i = &polygons->getArray(); i && i->set; i = i->next )
     {
@@ -162,14 +378,14 @@ void Model3DData::render( Mat4< float > &welt, const Model3DTextur *zTxt, Render
 }
 
 // Gibt die Anzahl an Polygonen zurück
-int Model3DData::getPolygonAnzahl()
+int Model3DData::getPolygonAnzahl() const
 {
     return polygons->getEintragAnzahl();
 }
 
 // Gibt ein bestimmtes Polygon zurück
 //  index: Der Index des Polygons
-Polygon3D *Model3DData::getPolygon( int index )
+Polygon3D *Model3DData::getPolygon( int index ) const
 {
     if( !polygons->hat( index ) )
         return 0;
@@ -182,6 +398,18 @@ float Model3DData::getRadius() const
     return radius;
 }
 
+// Gibt die Id der Daten zurück, wenn sie in einer Model3DList registriert wurden. (siehe Framework::zM3DRegister())
+int Model3DData::getId() const
+{
+    return id;
+}
+
+// Gibt einen Buffer mit allen Vertecies des Models zurück
+const DXVertexBuffer *Model3DData::zVertexBuffer() const
+{
+    return vertexBuffer;
+}
+
 // Erhöht den Reference Counting Zähler.
 //  return: this.
 Model3DData *Model3DData::getThis()
@@ -257,6 +485,7 @@ Model3D::Model3D()
 {
     model = 0;
     textur = 0;
+    skelett = 0;
     ref = 1;
 }
 
@@ -267,6 +496,17 @@ Model3D::~Model3D()
         model->release();
     if( textur )
         textur->release();
+    if( skelett )
+        skelett->release();
+}
+
+// Setzt den Zeiger auf das zum Annimieren verwendete Skelett
+//  s: Das Skelett, das verwendet werden soll
+void Model3D::setSkelettZ( Skelett *s )
+{
+    if( skelett )
+        skelett->release();
+    skelett = s;
 }
 
 // Setzt die Daten des Models
@@ -287,6 +527,22 @@ void Model3D::setModelTextur( Model3DTextur *txt )
     textur = txt;
 }
 
+// Errechnet die Matrizen aller Knochen des Skeletts des Models
+//  viewProj: Die miteinander multiplizierten Kameramatrizen
+//  matBuffer: Ein Array mit Matrizen, der gefüllt werden soll
+//  return: Die Anzahl der Matrizen, die das Model benötigt
+int Model3D::errechneMatrizen( Mat4< float > &viewProj, Mat4< float > *matBuffer )
+{
+    int ret = 0;
+    if( skelett )
+        ret = skelett->kalkulateMatrix( welt, matBuffer, viewProj );
+    else if( model )
+        ret = model->kalkulateMatrix( welt, matBuffer, viewProj );
+    if( !ret )
+        return __super::errechneMatrizen( viewProj, matBuffer );
+    return ret;
+}
+
 // Verarbeitet die vergangene Zeit
 //  tickval: Die zeit in sekunden, die seit dem letzten Aufruf der Funktion vergangen ist
 //  return: true, wenn sich das Objekt verändert hat, false sonnst.
@@ -302,9 +558,23 @@ void Model3D::render( Render3D *zRObj )
 {
     if( !model )
         return;
+    model->aktualisiereVertecies( zRObj );
+    zRObj->beginnModel( this );
     model->render( welt, textur, zRObj );
 }
 
+// Gibt die Id der Daten zurück, wenn sie in einer Model3DList registriert wurden. (siehe Framework::zM3DRegister())
+int Model3D::getDatenId() const
+{
+    return model ? model->getId() : -1;
+}
+
+// Gibt einen Buffer mit allen Vertecies des Models zurück
+const DXVertexBuffer *Model3D::zVertexBuffer() const
+{
+    return model ? model->zVertexBuffer() : 0;
+}
+
 // Erhöht den Reference Counting Zähler.
 //  return: this.
 Model3D *Model3D::getThis()

+ 90 - 25
Model3D.h

@@ -18,49 +18,85 @@ namespace Framework
     class Model3DTextur; // Model3D.h
     class Model3DList; // Model3DList.h
 
-    struct Vertex3D
-    {
-        Vec3< float > pos;
-        Vec2< float > tPos;
-    };
-
     class Knochen
     {
     private:
         Vec3< float > pos;
         Vec3< float > winkel;
-        int *indexList;
-        int indexAnz;
-        DXIndexBuffer *indexBuffer;
+        Knochen *geschwister;
+        Knochen *kinder;
+        int id;
+
+        // Fügt dem Knochen ein Geschwister Knochen hinzu
+        //  k: Der Knochen, der hinzugefügt werden soll
+        void addGeschwisterKnochen( Knochen *k );
 
     public:
         // Konstruktor
-        Knochen();
+        __declspec( dllexport ) Knochen( int id );
         // Destruktor
-        ~Knochen();
-        // Setzt die Anzahl der mit dem Knochen verbundenen Vertecies
-        //  anz: Die Anzahl der Vertecies
-        void setVertexAnzahl( int anz );
-        // Setzt deinen bestimmten Vertex des Knochens
-        //  i: Der Index des Vertex im Knochen
-        //  vId: Der Index des Vertex im Model
-        inline void setVertex( int i, int vId );
+        __declspec( dllexport ) ~Knochen();
         // Setzt die Position des Knochens relativ zum Model Ursprung
         //  pos: Die Position
-        void setPosition( Vec3< float > &pos );
+        __declspec( dllexport ) void setPosition( Vec3< float > &pos );
         // Setzt die Drehung des Knochens relativ zum Model Ursprung
         //  winkel: Ein Vektor der die Drehung um die verschiedenen Achsen als Komponenten hat
-        void setDrehung( Vec3< float > &winkel );
-        //
-        void render( Render3D *zRObj, Mat4< float > &mat, )
+        __declspec( dllexport ) void setDrehung( Vec3< float > &winkel );
+        // Fügt einem bestimmten Knochen ein Kind Knochen hinzu
+        //  id: Die id des Knochens, wo der Knochen als Kind hinzugefügt werden soll
+        //  k: Der Knochen, der hinzugefügt werden soll
+        __declspec( dllexport ) void addKind( int id, Knochen *k );
+        // Berechnet die Matrizen des Knochen und die von all seinen Geschwister Knochen und Kind Knochen
+        //  elternMat: Die fertig berechnete Matrix des Elternknochens
+        //  matBuffer: Ein Array, in dem alle berechneten Matrizen gespeichert werden sollen
+        //  kamMatrix: Die vereiniegung der view und projektions Matrizen
+        __declspec( dllexport ) void kalkulateMatrix( Mat4< float > &elternMat, Mat4< float > *matBuffer, Mat4< float > &kamMat );
+        // Kopiert den Knochen mit allen Geschwister Knochen und Kind Knochen
+        __declspec( dllexport ) Knochen *kopiereKnochen() const;
+        // Gibt die Id des Knochens zurück
+        __declspec( dllexport ) int getId() const;
     };
 
     class Skelett
     {
     private:
+        Knochen *k;
+        int nextId;
+        int ref;
 
     public:
+        // Konstruktor
+        __declspec( dllexport ) Skelett();
+        // Destruktor
+        __declspec( dllexport ) ~Skelett();
+        // Gibt die Id des nächsten Knochens zurück und berechnet die neue Id für den Knochen danach
+        // Es können maximal 128 Knochen für ein Skelett existieren. Wenn diese Zahl überschritten wird, so wird -1 zurückgegeben
+        __declspec( dllexport ) int getNextKnochenId();
+        // Fügt dem Skellet einen Knochen hinzu
+        //  k: Der Knochen
+        //  elternId: Die Id des Eltern Knochens. Wenn der Knochen kein Elternknochen besitzt, kannder Parameter weggelassen werden.
+        __declspec( dllexport ) void addKnochen( Knochen *k, int elternId = -1 );
+        // Berechnet die Matrizen der Knochen
+        //  modelMatrix: Die Matrix, die das Skelett in den Raum der Welt transformiert
+        //  matBuffer: Ein Array von Matrizen, der durch die Knochen Matrizen gefüllt wird
+        //  return: gibt die Anzahl der verwendeten Matrizen zurück
+        //  kamMatrix: Die vereiniegung der view und projektions Matrizen
+        __declspec( dllexport ) int kalkulateMatrix( Mat4< float > &modelMatrix, Mat4< float > *matBuffer, Mat4< float > &kamMatrix );
+        // Kopiert das Skelett
+        __declspec( dllexport ) Skelett *kopiereSkelett() const;
+        // Erhöht den Reference Counting Zähler.
+        //  return: this.
+        __declspec( dllexport ) Skelett *getThis();
+        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
+        //  return: 0.
+        __declspec( dllexport ) Skelett *release();
+    };
 
+    struct Vertex3D
+    {
+        Vec3< float > pos;
+        Vec2< float > tPos;
+        int knochenId;
     };
 
     struct Polygon3D
@@ -80,6 +116,7 @@ namespace Framework
     class Model3DData
     {
     private:
+        Skelett *skelett;
         Vertex3D *vertexList;
         DXVertexBuffer *vertexBuffer;
         Array< Polygon3D* > *polygons;
@@ -94,6 +131,9 @@ namespace Framework
         __declspec( dllexport ) ~Model3DData();
         // Löscht alle Model daten
         __declspec( dllexport ) void clearModel();
+        // Setzt den Zeiger auf ein standartmäßig verwendete Skelett
+        //  s: Das Skelett, das verwendet werden soll
+        __declspec( dllexport ) void setSkelettZ( Skelett *s );
         // Setzt einen Zeiger auf eine Liste mit allen Vertecies des Models
         //  vertexList: Ein Array mit Vertecies
         //  anz: Die Anzahl der Vertecies im Array
@@ -108,18 +148,30 @@ namespace Framework
         // Entfernt ein Polygon
         //  index: Der Index des Polygons
         __declspec( dllexport ) void removePolygon( int index );
+        // Aktualisiert die Vertecies
+        __declspec( dllexport ) void aktualisiereVertecies( Render3D *zRObj );
+        // Berechnet die Matrizen der Knochen des Standart Skeletts
+        //  modelMatrix: Die Matrix, die das Skelett in den Raum der Welt transformiert
+        //  matBuffer: Ein Array von Matrizen, der durch die Knochen Matrizen gefüllt wird
+        //  return: gibt die Anzahl der verwendeten Matrizen zurück. 0, falls kein Standart Skelett gesetzt wurde
+        //  kamMatrix: Die vereiniegung der view und projektions Matrizen
+        int kalkulateMatrix( Mat4< float > &modelMatrix, Mat4< float > *matBuffer, Mat4< float > &kamMatrix ) const;
         // Zeichnet alle Polygons
         //  world: Die Welt Matrix, die das Model in die Welt transformiert
         //  zTxt: Eine Liste mit Texturen der einzelnen Polygone
         //  zRObj: Das Objekt, mit dem gezeichnet werden soll
         __declspec( dllexport ) void render( Mat4< float > &welt, const Model3DTextur *zTxt, Render3D *zRObj );
         // Gibt die Anzahl an Polygonen zurück
-        __declspec( dllexport ) int getPolygonAnzahl();
+        __declspec( dllexport ) int getPolygonAnzahl() const;
         // Gibt ein bestimmtes Polygon zurück
         //  index: Der Index des Polygons
-        __declspec( dllexport ) Polygon3D *getPolygon( int index );
+        __declspec( dllexport ) Polygon3D *getPolygon( int index ) const;
         // Gibt den radius einer Kugel zurück, die das gesammte Model umschließt
         __declspec( dllexport ) float getRadius() const;
+        // Gibt die Id der Daten zurück, wenn sie in einer Model3DList registriert wurden. (siehe Framework::zM3DRegister())
+        __declspec( dllexport ) int getId() const;
+        // Gibt einen Buffer mit allen Vertecies des Models zurück
+        __declspec( dllexport ) const DXVertexBuffer *zVertexBuffer() const;
         // Erhöht den Reference Counting Zähler.
         //  return: this.
         __declspec( dllexport ) Model3DData *getThis();
@@ -161,6 +213,7 @@ namespace Framework
     {
     protected:
         Model3DData *model;
+        Skelett *skelett;
         Model3DTextur *textur;
         int ref;
 
@@ -169,19 +222,31 @@ namespace Framework
         __declspec( dllexport ) Model3D();
         // Destruktor
         __declspec( dllexport ) ~Model3D();
+        // Setzt den Zeiger auf das zum Annimieren verwendete Skelett
+        //  s: Das Skelett, das verwendet werden soll
+        __declspec( dllexport ) void setSkelettZ( Skelett *s );
         // Setzt die Daten des Models
         //  data: Die Daten
         __declspec( dllexport ) void setModelDaten( Model3DData *data );
         // Setzt die zum Zeichnen zu benutzenden Texturen
         //  txt: Ein Liste mit Texturen zu den verschiedenen Polygonen zugeordnet
         __declspec( dllexport ) void setModelTextur( Model3DTextur *txt );
+        // Errechnet die Matrizen aller Knochen des Skeletts des Models
+        //  viewProj: Die miteinander multiplizierten Kameramatrizen
+        //  matBuffer: Ein Array mit Matrizen, der gefüllt werden soll
+        //  return: Die Anzahl der Matrizen, die das Model benötigt
+        __declspec( dllexport ) int errechneMatrizen( Mat4< float > &viewProj, Mat4< float > *matBuffer ) override;
         // Verarbeitet die vergangene Zeit
         //  tickval: Die zeit in sekunden, die seit dem letzten Aufruf der Funktion vergangen ist
         //  return: true, wenn sich das Objekt verändert hat, false sonnst.
-        __declspec( dllexport ) virtual bool tick( double tickval );
+        __declspec( dllexport ) virtual bool tick( double tickval ) override;
         // Zeichnet das Model
         //  zRObj: Ein Zeiger auf das Objekt, das zum Zeichnen verwendet werden soll (ohne erhöhten Reference Counter)
         __declspec( dllexport ) void render( Render3D *zRObj ) override;
+        // Gibt die Id der Daten zurück, wenn sie in einer Model3DList registriert wurden. (siehe Framework::zM3DRegister())
+        __declspec( dllexport ) int getDatenId() const;
+        // Gibt einen Buffer mit allen Vertecies des Models zurück
+        __declspec( dllexport ) const DXVertexBuffer *zVertexBuffer() const;
         // Erhöht den Reference Counting Zähler.
         //  return: this.
         __declspec( dllexport ) Model3D *getThis();

+ 11 - 11
Render3D.cpp

@@ -145,8 +145,8 @@ void Render3D::releaseShader( int listIndex, int anz )
 //  kamPos: Die Position der Kamera in der Welt
 void Render3D::setKameraMatrix( Mat4< float > &view, Mat4< float > &proj, Vec3< float > &kamPos )
 {
-    matrixBuffer[ 1 ] = view;
-    matrixBuffer[ 2 ] = proj;
+    this->view = view;
+    this->proj = proj;
     this->kamPos = kamPos;
 
     Mat4< float > tmp = proj * view;
@@ -186,19 +186,19 @@ void Render3D::setKameraMatrix( Mat4< float > &view, Mat4< float > &proj, Vec3<
 }
 
 // Beginnt das Zeichnen eines bestimmten objektes
-//  world: Die Matrix, die das Model aus dem Model space in den world space übersetzt
-//  zVertexBuffer: Ein VertexBuffer mit allen Punkten des Models ohne erhöhten Reference Counter
-void Render3D::beginnModel( Mat4< float > &world, DXVertexBuffer *zVertexBuffer, int modelId )
+//  zMdl: Das 3D Modelohne erhöhten Reference Counter
+void Render3D::beginnModel( Model3D *zMdl )
 {
-    matrixBuffer[ 0 ] = world;
+    Mat4< float > trans = proj * view;
+    int anz = zMdl->errechneMatrizen( trans, matrixBuffer );
     if( shader->z( VERTEX ) && shaderId->hat( VERTEX ) )
-        shader->z( VERTEX )->z( shaderId->get( VERTEX ) )->füllConstBuffer( context, (char*)matrixBuffer, 0 );
-    if( lastObjektId == -1 || lastObjektId != modelId )
+        shader->z( VERTEX )->z( shaderId->get( VERTEX ) )->füllConstBuffer( context, (char*)matrixBuffer, 0, sizeof( Mat4< float > ) * anz );
+    if( lastObjektId == -1 || lastObjektId != zMdl->getDatenId() )
     {
-        lastObjektId = modelId;
+        lastObjektId = zMdl->getDatenId();
         unsigned int offset = 0;
-        ID3D11Buffer *b = zVertexBuffer->zBuffer();
-        unsigned int es = (unsigned)zVertexBuffer->getElementLänge();
+        ID3D11Buffer *b = zMdl->zVertexBuffer()->zBuffer();
+        unsigned int es = (unsigned)zMdl->zVertexBuffer()->getElementLänge();
         context->IASetVertexBuffers( 0, 1, &b, &es, &offset );
     }
 }

+ 6 - 4
Render3D.h

@@ -16,11 +16,14 @@ namespace Framework
     class DXVertexBuffer; // DXBuffer.h
     class DXIndexBuffer; // DXBuffer.h
     class Textur; // Textur.h
+    class Model3D; // Model3D.h
 
     class Render3D
     {
     private:
-        Mat4< float > matrixBuffer[ 3 ];
+        Mat4< float > matrixBuffer[ 128 ];
+        Mat4< float > view;
+        Mat4< float > proj;
         Vec4< float > frustrum[ 6 ];
         Vec3< float > kamPos;
         ID3D11Device *device;
@@ -59,9 +62,8 @@ namespace Framework
         //  kamPos: Die Position der Kamera in der Welt
         __declspec( dllexport ) void setKameraMatrix( Mat4< float > &view, Mat4< float > &proj, Vec3< float > &kamPos );
         // Beginnt das Zeichnen eines bestimmten objektes
-        //  world: Die Matrix, die das Model aus dem Model space in den world space übersetzt
-        //  zVertexBuffer: Ein VertexBuffer mit allen Punkten des Models ohne erhöhten Reference Counter
-        __declspec( dllexport ) void beginnModel( Mat4< float > &world, DXVertexBuffer *zVertexBuffer, int modelId );
+        //  zMdl: Das 3D Modelohne erhöhten Reference Counter
+        __declspec( dllexport ) void beginnModel( Model3D *zMdl );
         // Zeichnet eine bestimmte struktur
         //  zIndexBuffer: Ein IndexBuffer, der auf verschiedene Vertices aus dem Vertex Buffer des Models zeigt. Ohne erhöhten Reference Counter
         //  textur: Ein Zeiger auf die Textur, die verwendet werden soll ohne erhöhten Reference Counter

+ 5 - 2
Shader.cpp

@@ -151,17 +151,20 @@ bool Shader::l
 //  zD3d11Context: Das Context Objekt, das zum kopieren verwendt werden soll
 //  data: Einen zeiger auf en byte Array der größe des Buffers
 //  index: Der Index des Buffers
-bool Shader::füllConstBuffer( ID3D11DeviceContext *zD3d11Context, char *data, int index )
+//  län: Die Länge der Daten in Bytes (-1 für die maximale größe des Buffers)
+bool Shader::füllConstBuffer( ID3D11DeviceContext *zD3d11Context, char *data, int index, int län )
 {
     if( index < 0 || index >= 14 )
         return 0;
     if( !constBuffers[ index ] )
         return 0;
+    if( län < 0 )
+        län = buffLän[ index ];
     D3D11_MAPPED_SUBRESOURCE mappedResource;
     HRESULT res = zD3d11Context->Map( constBuffers[ index ], 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource );
     if( res != S_OK )
         return 0;
-    memcpy( mappedResource.pData, data, buffLän[ index ] );
+    memcpy( mappedResource.pData, data, län );
     zD3d11Context->Unmap( constBuffers[ index ], 0 );
     return 1;
 }

+ 2 - 1
Shader.h

@@ -65,7 +65,8 @@ namespace Framework
         //  zD3d11Context: Das Context Objekt, das zum kopieren verwendt werden soll
         //  data: Einen zeiger auf en byte Array der größe des Buffers
         //  index: Der Index des Buffers
-        bool füllConstBuffer( ID3D11DeviceContext *zD3d11Context, char *data, int index );
+        //  län: Die Länge der Daten in Bytes (-1 für die maximale größe des Buffers)
+        bool füllConstBuffer( ID3D11DeviceContext *zD3d11Context, char *data, int index, int län = -1 );
         // Gibt die Länge eines constanten Buffers zurück
         //  index: Der Index des Buffers
         int getConstBufferLänge( int index ) const;

+ 114 - 0
TexturModel.cpp

@@ -0,0 +1,114 @@
+#include "TexturModel.h"
+#include "DXBuffer.h"
+#include "Textur.h"
+#include "Globals.h"
+#include "TexturList.h"
+
+using namespace Framework;
+
+// Inhalt der TexturModel Klasse
+
+// Konstruktor
+TexturModel::TexturModel()
+    : Model3D()
+{
+    Vertex3D *vertecies = new Vertex3D[ 4 ];
+    for( int i = 0; i < 4; i++ )
+        vertecies[ i ].knochenId = 0;
+    vertecies[ 0 ].pos = Vec3<float >( -50, 50, 0.f );
+    vertecies[ 0 ].tPos = Vec2< float >( 0.f, 0.f );
+    vertecies[ 1 ].pos = Vec3<float >( 50, 50, 0.f );
+    vertecies[ 1 ].tPos = Vec2< float >( 1.f, 0.f );
+    vertecies[ 2 ].pos = Vec3<float >( -50, -50, 0.f );
+    vertecies[ 2 ].tPos = Vec2< float >( 0.f, 1.f );
+    vertecies[ 3 ].pos = Vec3<float >( 50, -50, 0.f );
+    vertecies[ 3 ].tPos = Vec2< float >( 1.f, 1.f );
+
+    model = new Model3DData();
+    model->setVertecies( vertecies, 4 );
+    Polygon3D *p = new Polygon3D();
+    p->indexAnz = 6;
+    p->indexList = new int[ p->indexAnz ];
+    p->indexBuffer->setLänge( p->indexAnz * 4 );
+    p->indexBuffer->setData( p->indexList );
+    p->indexList[ 0 ] = 0;
+    p->indexList[ 1 ] = 3;
+    p->indexList[ 2 ] = 2;
+    p->indexList[ 3 ] = 0;
+    p->indexList[ 4 ] = 1;
+    p->indexList[ 5 ] = 3;
+    model->addPolygon( p );
+
+    textur = new Model3DTextur();
+}
+
+// Setzt die Textur die angezeigt werden soll
+//  textur: Die Textur als Bild
+void TexturModel::setTextur( Bild *textur )
+{
+    Textur *t = new Textur();
+    t->setBildZ( textur );
+    this->textur->setPolygonTextur( 0, t );
+    rend = 1;
+}
+
+// Setzt die Textur die angezeigt werden soll 
+//  id: Die id der Textur. Sie muss im Textur Register des Frameworks registriert sein
+void TexturModel::setTextur( int id )
+{
+    Textur *t = texturRegister->getTextur( id );
+    if( !t )
+        return;
+    this->textur->setPolygonTextur( 0, t );
+    rend = 1;
+}
+
+// Setzt die Größe, in der Die Textur angezeigt wird
+//  gr: Ein Vektor, der für x und y die breite und höhe beinhaltet
+void TexturModel::setGröße( Vec2< float > gr )
+{
+    gr /= 2;
+    Vertex3D *vertecies = new Vertex3D[ 4 ];
+    for( int i = 0; i < 4; i++ )
+        vertecies[ i ].knochenId = 0;
+    vertecies[ 0 ].pos = Vec3<float >( -gr.x, gr.y, 0.f );
+    vertecies[ 0 ].tPos = Vec2< float >( 0.f, 0.f );
+    vertecies[ 1 ].pos = Vec3<float >( gr.x, gr.y, 0.f );
+    vertecies[ 1 ].tPos = Vec2< float >( 1.f, 0.f );
+    vertecies[ 2 ].pos = Vec3<float >( -gr.x, -gr.y, 0.f );
+    vertecies[ 2 ].tPos = Vec2< float >( 0.f, 1.f );
+    vertecies[ 3 ].pos = Vec3<float >( gr.x, -gr.y, 0.f );
+    vertecies[ 3 ].tPos = Vec2< float >( 1.f, 1.f );
+    model->setVertecies( vertecies, 4 );
+}
+
+// Setzt die Größe, in der die Textur angezeigt wird
+//  b: Die Breite, in der die Textur angezeigt wird
+//  h: Die Höhe, in der die Textur angezeigt wird
+void TexturModel::setGröße( float b, float h )
+{
+    b /= 2;
+    h /= 2;
+    Vertex3D *vertecies = new Vertex3D[ 4 ];
+    for( int i = 0; i < 4; i++ )
+        vertecies[ i ].knochenId = 0;
+    vertecies[ 0 ].pos = Vec3<float >( -b, h, 0.f );
+    vertecies[ 0 ].tPos = Vec2< float >( 0.f, 0.f );
+    vertecies[ 1 ].pos = Vec3<float >( b, h, 0.f );
+    vertecies[ 1 ].tPos = Vec2< float >( 1.f, 0.f );
+    vertecies[ 2 ].pos = Vec3<float >( -b, -h, 0.f );
+    vertecies[ 2 ].tPos = Vec2< float >( 0.f, 1.f );
+    vertecies[ 3 ].pos = Vec3<float >( b, -h, 0.f );
+    vertecies[ 3 ].tPos = Vec2< float >( 1.f, 1.f );
+    model->setVertecies( vertecies, 4 );
+}
+
+// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
+//  return: 0.
+Model3D *TexturModel::release()
+{
+    ref--;
+    if( !ref )
+        delete this;
+    return 0;
+}

+ 31 - 0
TexturModel.h

@@ -0,0 +1,31 @@
+#pragma once
+
+#include "Model3D.h"
+
+namespace Framework
+{
+    class Bild; // Bild.h
+
+    class TexturModel : public Model3D
+    {
+    public:
+        // Konstruktor
+        __declspec( dllexport ) TexturModel();
+        // Setzt die Textur die angezeigt werden soll
+        //  textur: Die Textur als Bild
+        __declspec( dllexport ) void setTextur( Bild *textur );
+        // Setzt die Textur die angezeigt werden soll 
+        //  id: Die id der Textur. Sie muss im Textur Register des Frameworks registriert sein
+        __declspec( dllexport ) void setTextur( int id );
+        // Setzt die Größe, in der Die Textur angezeigt wird
+        //  gr: Ein Vektor, der für x und y die breite und höhe beinhaltet
+        __declspec( dllexport ) void setGröße( Vec2< float > gr );
+        // Setzt die Größe, in der die Textur angezeigt wird
+        //  b: Die Breite, in der die Textur angezeigt wird
+        //  h: Die Höhe, in der die Textur angezeigt wird
+        __declspec( dllexport ) void setGröße( float b, float h );
+        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
+        //  return: 0.
+        __declspec( dllexport ) Model3D *release() override;
+    };
+}

+ 16 - 0
Zeichnung3D.cpp

@@ -110,6 +110,16 @@ void Zeichnung3D::setAlpha( bool a )
     rend = 1;
 }
 
+// Errechnet die Matrizen aller Knochen des Skeletts der Zeichnung
+//  viewProj: Die miteinander multiplizierten Kameramatrizen
+//  matBuffer: Ein Array mit Matrizen, der gefüllt werden soll
+//  return: Die Anzahl der Matrizen, die die Zeichnung benötigt
+int Zeichnung3D::errechneMatrizen( Mat4< float > &viewProj, Mat4< float > *matBuffer )
+{
+    matBuffer[ 0 ] = viewProj * welt;
+    return 1;
+}
+
 // Verarbeitet ein Mausereignis
 //  me: Das Mausereignis, das verarbeitet werden soll
 void Zeichnung3D::doMausEreignis( MausEreignis &me )
@@ -197,4 +207,10 @@ float Zeichnung3D::getYDrehung() const
 float Zeichnung3D::getZDrehung() const
 {
     return angle.z;
+}
+
+// Gibt die Matrix zurück, die die Zeichnung in den Welt Raum übersetzt
+const Mat4< float > &Zeichnung3D::getMatrix() const
+{
+    return welt;
 }

+ 15 - 8
Zeichnung3D.h

@@ -59,6 +59,11 @@ namespace Framework
         // Legt fest, ob das Objekt teilweise oder ganz transparente stellen enthält
         //  a: true, wenn teilweise oder ganz transparente stellen vorhanden sind
         __declspec( dllexport ) void setAlpha( bool a );
+        // Errechnet die Matrizen aller Knochen des Skeletts der Zeichnung
+        //  viewProj: Die miteinander multiplizierten Kameramatrizen
+        //  matBuffer: Ein Array mit Matrizen, der gefüllt werden soll
+        //  return: Die Anzahl der Matrizen, die die Zeichnung benötigt
+        __declspec( dllexport ) virtual int errechneMatrizen( Mat4< float > &viewProj, Mat4< float > *matBuffer );
         // Verarbeitet ein Mausereignis
         //  me: Das Mausereignis, das verarbeitet werden soll
         __declspec( dllexport ) virtual void doMausEreignis( MausEreignis &me );
@@ -77,20 +82,22 @@ namespace Framework
         // Gibt den radius einer Kugel zurück, die das gesammte Model umschließt
         __declspec( dllexport ) float getRadius() const;
         // Gibt einen Punkt zurück, der die Position der Zeichnung in der Welt darstellt
-        const Vec3< float > &getPos() const;
+        __declspec( dllexport ) const Vec3< float > &getPos() const;
         // Gibt die X Position der Zeichnung in der Welt zurück
-        float getX() const;
+        __declspec( dllexport ) float getX() const;
         // Gibt die Y Position der Zeichnung in der Welt zurück
-        float getY() const;
+        __declspec( dllexport ) float getY() const;
         // Gibt die Z Position der Zeichnung in der Welt zurück
-        float getZ() const;
+        __declspec( dllexport ) float getZ() const;
         // Gibt einen Vektor zurück, der die drehung der Zeichnung in der Welt darstellt. x ist die Drehung um die X Achse im Bogenmaß usw
-        const Vec3< float > &getDrehung() const;
+        __declspec( dllexport ) const Vec3< float > &getDrehung() const;
         // Gibt die Drehung um die X Achse im Bogenmaß zurück
-        float getXDrehung() const;
+        __declspec( dllexport ) float getXDrehung() const;
         // Gibt die Drehung um die Y Achse im Bogenmaß zurück
-        float getYDrehung() const;
+        __declspec( dllexport ) float getYDrehung() const;
         // Gibt die Drehung um die Z Achse im Bogenmaß zurück
-        float getZDrehung() const;
+        __declspec( dllexport ) float getZDrehung() const;
+        // Gibt die Matrix zurück, die die Zeichnung in den Welt Raum übersetzt
+        __declspec( dllexport ) const Mat4< float > &getMatrix() const;
     };
 }