Преглед изворни кода

adjust to factory craft coordinate system

Kolja Strohm пре 2 година
родитељ
комит
c1f296b57f

+ 5 - 5
3DCreator/3DCreator.vcxproj

@@ -22,32 +22,32 @@
     <ProjectGuid>{9AC35DE2-43DC-4143-B0C6-23FFCA9DE62B}</ProjectGuid>
     <Keyword>Win32Proj</Keyword>
     <RootNamespace>My3DCreator</RootNamespace>
-    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
+    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v142</PlatformToolset>
+    <PlatformToolset>v143</PlatformToolset>
     <CharacterSet>MultiByte</CharacterSet>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v142</PlatformToolset>
+    <PlatformToolset>v143</PlatformToolset>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <CharacterSet>MultiByte</CharacterSet>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v142</PlatformToolset>
+    <PlatformToolset>v143</PlatformToolset>
     <CharacterSet>MultiByte</CharacterSet>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v142</PlatformToolset>
+    <PlatformToolset>v143</PlatformToolset>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <CharacterSet>MultiByte</CharacterSet>
   </PropertyGroup>

BIN
3DCreator/Framework.dll


+ 474 - 1196
3DCreator/Start.cpp

@@ -16,6 +16,9 @@
 #include <GraphicsApi.h>
 #include <Mat4.h>
 #include <M3Datei.h>
+#include <ObjFile.h>
+#include <Vec3.h>
+#include <TextFeld.h>
 
 #define ambient  0.4f
 #define diffus   0.3f
@@ -24,1220 +27,495 @@
 using namespace Framework;
 
 
-void makeQuader( Vertex3D *vertecies, int startIndex, Vec3< float > ltf, Vec3< float > rtf, Vec3< float > lbf, Vec3< float > rbf, Vec3< float > ltb, Vec3< float > rtb, Vec3< float > lbb, Vec3< float > rbb, Model3DData *zModel )
+void makeQuader(Vertex3D* vertecies, int startIndex, Vec3< float > ltf, Vec3< float > rtf, Vec3< float > lbf, Vec3< float > rbf, Vec3< float > ltb, Vec3< float > rtb, Vec3< float > lbb, Vec3< float > rbb, Model3DData* zModel)
 {
-    vertecies[ startIndex ].pos = ltf;
-    vertecies[ startIndex ].tPos = Vec2< float >( 0.f, 0.f );
-    vertecies[ startIndex + 1 ].pos = rtf;
-    vertecies[ startIndex + 1 ].tPos = Vec2< float >( 1.f, 0.f );
-    vertecies[ startIndex + 2 ].pos = lbf;
-    vertecies[ startIndex + 2 ].tPos = Vec2< float >( 0.f, 1.f );
-    vertecies[ startIndex + 3 ].pos = rbf;
-    vertecies[ startIndex + 3 ].tPos = Vec2< float >( 1.f, 1.f );
-    vertecies[ startIndex + 4 ].pos = ltb;
-    vertecies[ startIndex + 4 ].tPos = Vec2< float >( 0.0f, 0.0f );
-    vertecies[ startIndex + 5 ].pos = rtb;
-    vertecies[ startIndex + 5 ].tPos = Vec2< float >( 1.0f, 0.0f );
-    vertecies[ startIndex + 6 ].pos = lbb;
-    vertecies[ startIndex + 6 ].tPos = Vec2< float >( 0.0f, 1.0f );
-    vertecies[ startIndex + 7 ].pos = rbb;
-    vertecies[ startIndex + 7 ].tPos = Vec2< float >( 1.0f, 1.0f );
-
-    vertecies[ startIndex + 8 ].pos = ltf;
-    vertecies[ startIndex + 8 ].tPos = Vec2< float >( 1.f, 0.f );
-    vertecies[ startIndex + 9 ].pos = rtf;
-    vertecies[ startIndex + 9 ].tPos = Vec2< float >( 0.f, 0.f );
-    vertecies[ startIndex + 10 ].pos = lbf;
-    vertecies[ startIndex + 10 ].tPos = Vec2< float >( 1.f, 1.f );
-    vertecies[ startIndex + 11 ].pos = rbf;
-    vertecies[ startIndex + 11 ].tPos = Vec2< float >( 0.f, 1.f );
-    vertecies[ startIndex + 12 ].pos = ltb;
-    vertecies[ startIndex + 12 ].tPos = Vec2< float >( 0.0f, 0.0f );
-    vertecies[ startIndex + 13 ].pos = rtb;
-    vertecies[ startIndex + 13 ].tPos = Vec2< float >( 1.0f, 0.0f );
-    vertecies[ startIndex + 14 ].pos = lbb;
-    vertecies[ startIndex + 14 ].tPos = Vec2< float >( 0.0f, 1.0f );
-    vertecies[ startIndex + 15 ].pos = rbb;
-    vertecies[ startIndex + 15 ].tPos = Vec2< float >( 1.0f, 1.0f );
-
-    vertecies[ startIndex + 16 ].pos = ltf;
-    vertecies[ startIndex + 16 ].tPos = Vec2< float >( 0.f, 1.f );
-    vertecies[ startIndex + 17 ].pos = rtf;
-    vertecies[ startIndex + 17 ].tPos = Vec2< float >( 1.f, 1.f );
-    vertecies[ startIndex + 18 ].pos = lbf;
-    vertecies[ startIndex + 18 ].tPos = Vec2< float >( 0.f, 0.f );
-    vertecies[ startIndex + 19 ].pos = rbf;
-    vertecies[ startIndex + 19 ].tPos = Vec2< float >( 1.f, 0.f );
-    vertecies[ startIndex + 20 ].pos = ltb;
-    vertecies[ startIndex + 20 ].tPos = Vec2< float >( 0.0f, 0.0f );
-    vertecies[ startIndex + 21 ].pos = rtb;
-    vertecies[ startIndex + 21 ].tPos = Vec2< float >( 1.0f, 0.0f );
-    vertecies[ startIndex + 22 ].pos = lbb;
-    vertecies[ startIndex + 22 ].tPos = Vec2< float >( 0.0f, 1.0f );
-    vertecies[ startIndex + 23 ].pos = rbb;
-    vertecies[ startIndex + 23 ].tPos = Vec2< float >( 1.0f, 1.0f );
-
-    // front side
-    Polygon3D *p = new Polygon3D();
-    p->indexAnz = 6;
-    p->indexList = new int[ p->indexAnz ];
-    p->indexList[ 0 ] = startIndex + 0;
-    p->indexList[ 1 ] = startIndex + 2;
-    p->indexList[ 2 ] = startIndex + 3;
-    p->indexList[ 3 ] = startIndex + 0;
-    p->indexList[ 4 ] = startIndex + 3;
-    p->indexList[ 5 ] = startIndex + 1;
-    zModel->addPolygon( p );
-    // back side
-    p = new Polygon3D();
-    p->indexAnz = 6;
-    p->indexList = new int[ p->indexAnz ];
-    p->indexList[ 0 ] = startIndex + 4;
-    p->indexList[ 1 ] = startIndex + 7;
-    p->indexList[ 2 ] = startIndex + 6;
-    p->indexList[ 3 ] = startIndex + 4;
-    p->indexList[ 4 ] = startIndex + 5;
-    p->indexList[ 5 ] = startIndex + 7;
-    zModel->addPolygon( p );
-    // right side
-    p = new Polygon3D();
-    p->indexAnz = 6;
-    p->indexList = new int[ p->indexAnz ];
-    p->indexList[ 0 ] = startIndex + 1 + 8;
-    p->indexList[ 1 ] = startIndex + 3 + 8;
-    p->indexList[ 2 ] = startIndex + 7 + 8;
-    p->indexList[ 3 ] = startIndex + 1 + 8;
-    p->indexList[ 4 ] = startIndex + 7 + 8;
-    p->indexList[ 5 ] = startIndex + 5 + 8;
-    zModel->addPolygon( p );
-    // left side
-    p = new Polygon3D();
-    p->indexAnz = 6;
-    p->indexList = new int[ p->indexAnz ];
-    p->indexList[ 0 ] = startIndex + 0 + 8;
-    p->indexList[ 1 ] = startIndex + 6 + 8;
-    p->indexList[ 2 ] = startIndex + 2 + 8;
-    p->indexList[ 3 ] = startIndex + 0 + 8;
-    p->indexList[ 4 ] = startIndex + 4 + 8;
-    p->indexList[ 5 ] = startIndex + 6 + 8;
-    zModel->addPolygon( p );
-    // top side
-    p = new Polygon3D();
-    p->indexAnz = 6;
-    p->indexList = new int[ p->indexAnz ];
-    p->indexList[ 0 ] = startIndex + 4 + 16;
-    p->indexList[ 1 ] = startIndex + 0 + 16;
-    p->indexList[ 2 ] = startIndex + 1 + 16;
-    p->indexList[ 3 ] = startIndex + 4 + 16;
-    p->indexList[ 4 ] = startIndex + 1 + 16;
-    p->indexList[ 5 ] = startIndex + 5 + 16;
-    zModel->addPolygon( p );
-    // down side
-    p = new Polygon3D();
-    p->indexAnz = 6;
-    p->indexList = new int[ p->indexAnz ];
-    p->indexList[ 0 ] = startIndex + 6 + 16;
-    p->indexList[ 1 ] = startIndex + 3 + 16;
-    p->indexList[ 2 ] = startIndex + 2 + 16;
-    p->indexList[ 3 ] = startIndex + 6 + 16;
-    p->indexList[ 4 ] = startIndex + 7 + 16;
-    p->indexList[ 5 ] = startIndex + 3 + 16;
-    zModel->addPolygon( p );
+	// front
+	vertecies[startIndex].pos = ltf;
+	vertecies[startIndex].tPos = Vec2< float >(0.f, 0.f);
+	vertecies[startIndex + 1].pos = rtf;
+	vertecies[startIndex + 1].tPos = Vec2< float >(1.f, 0.f);
+	vertecies[startIndex + 2].pos = lbf;
+	vertecies[startIndex + 2].tPos = Vec2< float >(0.f, 1.f);
+	vertecies[startIndex + 3].pos = rbf;
+	vertecies[startIndex + 3].tPos = Vec2< float >(1.f, 1.f);
+	// back
+	vertecies[startIndex + 4].pos = rtb;
+	vertecies[startIndex + 4].tPos = Vec2< float >(0.0f, 0.0f);
+	vertecies[startIndex + 5].pos = ltb;
+	vertecies[startIndex + 5].tPos = Vec2< float >(1.0f, 0.0f);
+	vertecies[startIndex + 6].pos = rbb;
+	vertecies[startIndex + 6].tPos = Vec2< float >(0.0f, 1.0f);
+	vertecies[startIndex + 7].pos = lbb;
+	vertecies[startIndex + 7].tPos = Vec2< float >(1.0f, 1.0f);
+	// left
+	vertecies[startIndex + 8].pos = ltb;
+	vertecies[startIndex + 8].tPos = Vec2< float >(1.f, 0.f);
+	vertecies[startIndex + 9].pos = ltf;
+	vertecies[startIndex + 9].tPos = Vec2< float >(0.f, 0.f);
+	vertecies[startIndex + 10].pos = lbb;
+	vertecies[startIndex + 10].tPos = Vec2< float >(1.f, 1.f);
+	vertecies[startIndex + 11].pos = lbf;
+	vertecies[startIndex + 11].tPos = Vec2< float >(0.f, 1.f);
+	// right
+	vertecies[startIndex + 12].pos = rtf;
+	vertecies[startIndex + 12].tPos = Vec2< float >(0.0f, 0.0f);
+	vertecies[startIndex + 13].pos = rtb;
+	vertecies[startIndex + 13].tPos = Vec2< float >(1.0f, 0.0f);
+	vertecies[startIndex + 14].pos = rbf;
+	vertecies[startIndex + 14].tPos = Vec2< float >(0.0f, 1.0f);
+	vertecies[startIndex + 15].pos = rbb;
+	vertecies[startIndex + 15].tPos = Vec2< float >(1.0f, 1.0f);
+	// top
+	vertecies[startIndex + 16].pos = ltb;
+	vertecies[startIndex + 16].tPos = Vec2< float >(0.f, 0.f);
+	vertecies[startIndex + 17].pos = rtb;
+	vertecies[startIndex + 17].tPos = Vec2< float >(1.f, 0.f);
+	vertecies[startIndex + 18].pos = ltf;
+	vertecies[startIndex + 18].tPos = Vec2< float >(0.f, 1.f);
+	vertecies[startIndex + 19].pos = rtf;
+	vertecies[startIndex + 19].tPos = Vec2< float >(1.f, 1.f);
+	// botom
+	vertecies[startIndex + 20].pos = lbf;
+	vertecies[startIndex + 20].tPos = Vec2< float >(0.0f, 0.0f);
+	vertecies[startIndex + 21].pos = rbf;
+	vertecies[startIndex + 21].tPos = Vec2< float >(1.0f, 0.0f);
+	vertecies[startIndex + 22].pos = lbb;
+	vertecies[startIndex + 22].tPos = Vec2< float >(0.0f, 1.0f);
+	vertecies[startIndex + 23].pos = rbb;
+	vertecies[startIndex + 23].tPos = Vec2< float >(1.0f, 1.0f);
+
+	// front side
+	Polygon3D* p = new Polygon3D();
+	p->indexAnz = 6;
+	p->indexList = new int[p->indexAnz];
+	p->indexList[0] = startIndex + 0;
+	p->indexList[1] = startIndex + 2;
+	p->indexList[2] = startIndex + 1;
+	p->indexList[3] = startIndex + 1;
+	p->indexList[4] = startIndex + 2;
+	p->indexList[5] = startIndex + 3;
+	zModel->addPolygon(p);
+	// back side
+	p = new Polygon3D();
+	p->indexAnz = 6;
+	p->indexList = new int[p->indexAnz];
+	p->indexList[0] = startIndex + 0 + 4;
+	p->indexList[1] = startIndex + 2 + 4;
+	p->indexList[2] = startIndex + 1 + 4;
+	p->indexList[3] = startIndex + 1 + 4;
+	p->indexList[4] = startIndex + 2 + 4;
+	p->indexList[5] = startIndex + 3 + 4;
+	zModel->addPolygon(p);
+	// left side
+	p = new Polygon3D();
+	p->indexAnz = 6;
+	p->indexList = new int[p->indexAnz];
+	p->indexList[0] = startIndex + 0 + 8;
+	p->indexList[1] = startIndex + 2 + 8;
+	p->indexList[2] = startIndex + 1 + 8;
+	p->indexList[3] = startIndex + 1 + 8;
+	p->indexList[4] = startIndex + 2 + 8;
+	p->indexList[5] = startIndex + 3 + 8;
+	zModel->addPolygon(p);
+	// right side
+	p = new Polygon3D();
+	p->indexAnz = 6;
+	p->indexList = new int[p->indexAnz];
+	p->indexList[0] = startIndex + 0 + 12;
+	p->indexList[1] = startIndex + 2 + 12;
+	p->indexList[2] = startIndex + 1 + 12;
+	p->indexList[3] = startIndex + 1 + 12;
+	p->indexList[4] = startIndex + 2 + 12;
+	p->indexList[5] = startIndex + 3 + 12;
+	zModel->addPolygon(p);
+	// top side
+	p = new Polygon3D();
+	p->indexAnz = 6;
+	p->indexList = new int[p->indexAnz];
+	p->indexList[0] = startIndex + 0 + 16;
+	p->indexList[1] = startIndex + 2 + 16;
+	p->indexList[2] = startIndex + 1 + 16;
+	p->indexList[3] = startIndex + 1 + 16;
+	p->indexList[4] = startIndex + 2 + 16;
+	p->indexList[5] = startIndex + 3 + 16;
+	zModel->addPolygon(p);
+	// bottom side
+	p = new Polygon3D();
+	p->indexAnz = 6;
+	p->indexList = new int[p->indexAnz];
+	p->indexList[0] = startIndex + 0 + 20;
+	p->indexList[1] = startIndex + 2 + 20;
+	p->indexList[2] = startIndex + 1 + 20;
+	p->indexList[3] = startIndex + 1 + 20;
+	p->indexList[4] = startIndex + 2 + 20;
+	p->indexList[5] = startIndex + 3 + 20;
+	zModel->addPolygon(p);
 }
 
-void makeQuader( Vertex3D *vertecies, int startIndex, Vec3< float > pos, Vec3< float > size, Model3DData *zModel )
+void makeQuader(Vertex3D* vertecies, int startIndex, Vec3< float > pos, Vec3< float > size, Model3DData* zModel)
 {
-    float left, right, top, bottom;
-    // Calculate the screen coordinates of the left side of the bitmap.
-    left = pos.x;
-    // Calculate the screen coordinates of the right side of the bitmap.
-    right = pos.x + size.x;
-    // Calculate the screen coordinates of the top of the bitmap.
-    top = pos.y + size.y;
-    // Calculate the screen coordinates of the bottom of the bitmap.
-    bottom = pos.y;
-    float front = pos.z + size.z;
-    float back = pos.z;
-
-    makeQuader( vertecies, startIndex, Vec3< float >( left, top, front ), Vec3< float >( right, top, front ), Vec3< float >( left, bottom, front ), Vec3< float >( right, bottom, front ),
-                Vec3< float >( left, top, back ), Vec3< float >( right, top, back ), Vec3< float >( left, bottom, back ), Vec3< float >( right, bottom, back ), zModel );
+	float left, right, top, bottom;
+	// Calculate the screen coordinates of the left side of the bitmap.
+	left = pos.x;
+	// Calculate the screen coordinates of the right side of the bitmap.
+	right = pos.x + size.x;
+	// Calculate the screen coordinates of the top of the bitmap.
+	top = pos.z + size.z;
+	// Calculate the screen coordinates of the bottom of the bitmap.
+	bottom = pos.z;
+	float front = pos.y;
+	float back = pos.y + size.y;
+
+	makeQuader(vertecies, startIndex, Vec3< float >(left, front, top), Vec3< float >(right, front, top), Vec3< float >(left, front, bottom), Vec3< float >(right, front, bottom),
+		Vec3< float >(left, back, top), Vec3< float >(right, back, top), Vec3< float >(left, back, bottom), Vec3< float >(right, back, bottom), zModel);
 }
 
-class Treppe : public Model3D
-{
-public:
-    // Konstruktor
-    //  size: Die Größe des Würfels
-    Treppe()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-
-        Vertex3D *vertecies = new Vertex3D[ 11 * 24 ];
-        for( int i = 0; i < 11 * 24; i++ )
-            vertecies[ i ].knochenId = 0;
-        for( int i = 0; i < 11; i++ )
-        {
-            float fullRad = (float)PI;
-            float curr = ( fullRad / 10 ) * i;
-            Mat4< float > rotation = Mat4< float >::rotationZ( curr );
-            Mat4< float > rotation2 = Mat4< float >::rotationZ( fullRad / 10 );
-            Vec3< float > test( 50, 0, -50 - i * 10 );
-            Vec3< float > diff = rotation2 * test;
-            Vec3< float > rbf( 50, -diff.y / 2, -50 + i * 10 + 20 );
-            Vec3< float > rtf( 50, diff.y / 2, -50 + i * 10 + 20 );
-            Vec3< float > rbb( 50, -diff.y / 2, -50 + i * 10 + 10 );
-            Vec3< float > rtb( 50, diff.y / 2, -50 + i * 10 + 10 );
-            Vec3< float > ltf( 0, 5, -50 + i * 10 + 20 );
-            Vec3< float > lbf( 0, -5, -50 + i * 10 + 20 );
-            Vec3< float > ltb( 0, 5, -50 + i * 10 + 10 );
-            Vec3< float > lbb( 0, -5, -50 + i * 10 + 10 );
-            rtf = rotation * rtf;
-            rtb = rotation * rtb;
-            rbf = rotation * rbf;
-            rbb = rotation * rbb;
-            ltf = rotation * ltf;
-            ltb = rotation * ltb;
-            lbf = rotation * lbf;
-            lbb = rotation * lbb;
-            makeQuader( vertecies, i * 24, ltf, rtf, lbf, rbf, ltb, rtb, lbb, rbb, model );
-        }
-        model->setVertecies( vertecies, 24 * 11 );
-
-        model->calculateNormals();
-
-        textur = new Model3DTextur();
-    }
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-};
-
-class Mauer : public Model3D
-{
-public:
-    // Konstruktor
-    //  size: Die Größe des Würfels
-    Mauer()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-
-        Vertex3D *vertecies = new Vertex3D[ 24 ];
-        for( int i = 0; i < 24; i++ )
-            vertecies[ i ].knochenId = 0;
-        makeQuader( vertecies, 0, Vec3< float >( -50, -5, -50 ), Vec3< float >( 100, 10, 100 ), model );
-        model->setVertecies( vertecies, 24 );
-
-        model->calculateNormals();
-
-        textur = new Model3DTextur();
-    }
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-};
-
-class MauerEcke : public Model3D
-{
-public:
-    // Konstruktor
-    //  size: Die Größe des Würfels
-    MauerEcke()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-        float stdSize = 100;
-        float left, right, top, bottom;
-        // Calculate the screen coordinates of the left side of the bitmap.
-        left = (float)( ( stdSize / 2.0 ) * -1 );
-        // Calculate the screen coordinates of the right side of the bitmap.
-        right = left + (float)stdSize;
-        // Calculate the screen coordinates of the top of the bitmap.
-        top = (float)( stdSize / 2.0 );
-        // Calculate the screen coordinates of the bottom of the bitmap.
-        bottom = top - (float)stdSize;
-        float front = -stdSize / 2;
-        float back = front + stdSize;
-
-        Vertex3D *vertecies = new Vertex3D[ 48 ];
-        for( int i = 0; i < 48; i++ )
-            vertecies[ i ].knochenId = 0;
-        makeQuader( vertecies, 0, Vec3< float >( 0, -5, -50 ), Vec3< float >( 50, 10, 100 ), model );
-        makeQuader( vertecies, 24, Vec3< float >( -5, 0, -50 ), Vec3< float >( 10, 50, 100 ), model );
-        model->setVertecies( vertecies, 48 );
-
-        model->calculateNormals();
-
-        textur = new Model3DTextur();
-    }
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-};
-
-class MauerKreuz : public Model3D
-{
-public:
-    // Konstruktor
-    //  size: Die Größe des Würfels
-    MauerKreuz()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-
-        Vertex3D *vertecies = new Vertex3D[ 48 ];
-        for( int i = 0; i < 48; i++ )
-            vertecies[ i ].knochenId = 0;
-        makeQuader( vertecies, 0, Vec3< float >( -50, -5, -50 ), Vec3< float >( 100, 10, 100 ), model );
-        makeQuader( vertecies, 24, Vec3< float >( -5, -50, -50 ), Vec3< float >( 10, 100, 100 ), model );
-        model->setVertecies( vertecies, 48 );
-
-        model->calculateNormals();
-
-        textur = new Model3DTextur();
-    }
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-};
-
-class Boden : public Model3D
-{
-public:
-    // Konstruktor
-    //  size: Die Größe des Würfels
-    Boden()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-
-        Vertex3D *vertecies = new Vertex3D[ 24 ];
-        for( int i = 0; i < 24; i++ )
-            vertecies[ i ].knochenId = 0;
-        makeQuader( vertecies, 0, Vec3< float >( -50, -50, -10 ), Vec3< float >( 100, 100, 10 ), model );
-        model->setVertecies( vertecies, 24 );
-
-        model->calculateNormals();
-
-        textur = new Model3DTextur();
-    }
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-};
-
-class HalberBoden : public Model3D
-{
-public:
-    // Konstruktor
-    //  size: Die Größe des Würfels
-    HalberBoden()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-
-        Vertex3D *vertecies = new Vertex3D[ 24 ];
-        for( int i = 0; i < 24; i++ )
-            vertecies[ i ].knochenId = 0;
-        makeQuader( vertecies, 0, Vec3< float >( -50, 0, -50 ), Vec3< float >( 100, 50, 10 ), model );
-        model->setVertecies( vertecies, 24 );
-
-        model->calculateNormals();
-
-        textur = new Model3DTextur();
-    }
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-};
-
-class TürZu : public Model3D
-{
-public:
-    // Konstruktor
-    //  size: Die Größe des Würfels
-    TürZu()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-
-        Vertex3D *vertecies = new Vertex3D[ 216 ];
-        for( int i = 0; i < 216; i++ )
-            vertecies[ i ].knochenId = 0;
-        makeQuader( vertecies, 0, Vec3< float >( -50, -5, -50 ), Vec3< float >( 15, 10, 100 ), model ); // linke wand
-        makeQuader( vertecies, 24, Vec3< float >( -35, -7, -50 ), Vec3< float >( 15, 15, 90 ), model ); // linker rahmen
-        makeQuader( vertecies, 48, Vec3< float >( 20, -7, -50 ), Vec3< float >( 15, 15, 90 ), model ); // rechter rahmen
-        makeQuader( vertecies, 72, Vec3< float >( -20, -7, 25 ), Vec3< float >( 40, 15, 15 ), model ); // oberer rahmen
-        makeQuader( vertecies, 96, Vec3< float >( -20, -2, -50 ), Vec3< float >( 40, 5, 75 ), model ); // tür
-        makeQuader( vertecies, 120, Vec3< float >( 12, -10, -2 ), Vec3< float >( 4, 20, 4 ), model ); // tür knauf
-        makeQuader( vertecies, 144, Vec3< float >( 35, -5, -50 ), Vec3< float >( 15, 10, 100 ), model ); // rechte wand
-        makeQuader( vertecies, 168, Vec3< float >( -50, -5, 40 ), Vec3< float >( 100, 10, 10 ), model ); // obere wand
-        makeQuader( vertecies, 192, Vec3< float >( -50, -7, -50 ), Vec3< float >( 100, 15, 2 ), model ); // untere wand
-        model->setVertecies( vertecies, 216 );
-
-        model->calculateNormals();
-
-        textur = new Model3DTextur();
-    }
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-};
-
-class FensterZu : public Model3D
-{
-public:
-    // Konstruktor
-    //  size: Die Größe des Würfels
-    FensterZu()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-
-        Vertex3D *vertecies = new Vertex3D[ 216 ];
-        for( int i = 0; i < 216; i++ )
-            vertecies[ i ].knochenId = 0;
-        makeQuader( vertecies, 0, Vec3< float >( -20, -2, -20 ), Vec3< float >( 40, 4, 40 ), model ); // fenster
-        makeQuader( vertecies, 24, Vec3< float >( -50, -5, -50 ), Vec3< float >( 15, 10, 100 ), model ); // linke wand
-        makeQuader( vertecies, 48, Vec3< float >( -35, -7, -35 ), Vec3< float >( 15, 15, 70 ), model ); // linker rahmen
-        makeQuader( vertecies, 72, Vec3< float >( 20, -7, -35 ), Vec3< float >( 15, 15, 70 ), model ); // rechter rahmen
-        makeQuader( vertecies, 96, Vec3< float >( -20, -7, 20 ), Vec3< float >( 40, 15, 15 ), model ); // oberer rahmen
-        makeQuader( vertecies, 120, Vec3< float >( -20, -7, -35 ), Vec3< float >( 40, 15, 15 ), model ); // unterer rahmen
-        makeQuader( vertecies, 144, Vec3< float >( 35, -5, -50 ), Vec3< float >( 15, 10, 100 ), model ); // rechte wand
-        makeQuader( vertecies, 168, Vec3< float >( -50, -5, 35 ), Vec3< float >( 100, 10, 15 ), model ); // obere wand
-        makeQuader( vertecies, 192, Vec3< float >( -50, -7, -50 ), Vec3< float >( 100, 15, 15 ), model ); // untere wand
-        model->setVertecies( vertecies, 216 );
-
-        model->calculateNormals();
-
-        textur = new Model3DTextur();
-    }
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-};
-
-class FensterOffen : public Model3D
-{
-public:
-    // Konstruktor
-    //  size: Die Größe des Würfels
-    FensterOffen()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-
-        Vertex3D *vertecies = new Vertex3D[ 216 ];
-        for( int i = 0; i < 216; i++ )
-            vertecies[ i ].knochenId = 0;
-        makeQuader( vertecies, 0, Vec3< float >( -20, -2, -20 ), Vec3< float >( 4, 40, 40 ), model ); // fenster
-        makeQuader( vertecies, 24, Vec3< float >( -50, -5, -50 ), Vec3< float >( 15, 10, 100 ), model ); // linke wand
-        makeQuader( vertecies, 48, Vec3< float >( -35, -7, -35 ), Vec3< float >( 15, 15, 70 ), model ); // linker rahmen
-        makeQuader( vertecies, 72, Vec3< float >( 20, -7, -35 ), Vec3< float >( 15, 15, 70 ), model ); // rechter rahmen
-        makeQuader( vertecies, 96, Vec3< float >( -20, -7, 20 ), Vec3< float >( 40, 15, 15 ), model ); // oberer rahmen
-        makeQuader( vertecies, 120, Vec3< float >( -20, -7, -35 ), Vec3< float >( 40, 15, 15 ), model ); // unterer rahmen
-        makeQuader( vertecies, 144, Vec3< float >( 35, -5, -50 ), Vec3< float >( 15, 10, 100 ), model ); // rechte wand
-        makeQuader( vertecies, 168, Vec3< float >( -50, -5, 35 ), Vec3< float >( 100, 10, 15 ), model ); // obere wand
-        makeQuader( vertecies, 192, Vec3< float >( -50, -7, -50 ), Vec3< float >( 100, 15, 15 ), model ); // untere wand
-        model->setVertecies( vertecies, 216 );
-
-        model->calculateNormals();
-
-        textur = new Model3DTextur();
-    }
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-};
-
-class TürOffen : public Model3D
-{
-public:
-    // Konstruktor
-    //  size: Die Größe des Würfels
-    TürOffen()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-
-        Vertex3D *vertecies = new Vertex3D[ 216 ];
-        for( int i = 0; i < 216; i++ )
-            vertecies[ i ].knochenId = 0;
-        makeQuader( vertecies, 0, Vec3< float >( -50, -5, -50 ), Vec3< float >( 15, 10, 100 ), model ); // linke wand
-        makeQuader( vertecies, 24, Vec3< float >( -35, -7, -50 ), Vec3< float >( 15, 15, 90 ), model ); // linker rahmen
-        makeQuader( vertecies, 48, Vec3< float >( 20, -7, -50 ), Vec3< float >( 15, 15, 90 ), model ); // rechter rahmen
-        makeQuader( vertecies, 72, Vec3< float >( -20, -7, 25 ), Vec3< float >( 40, 15, 15 ), model ); // oberer rahmen
-        makeQuader( vertecies, 96, Vec3< float >( -20, -2, -50 ), Vec3< float >( 5, 40, 75 ), model ); // tür
-        makeQuader( vertecies, 120, Vec3< float >( -28, 30, -2 ), Vec3< float >( 20, 4, 4 ), model ); // tür knauf
-        makeQuader( vertecies, 144, Vec3< float >( 35, -5, -50 ), Vec3< float >( 15, 10, 100 ), model ); // rechte wand
-        makeQuader( vertecies, 168, Vec3< float >( -50, -5, 40 ), Vec3< float >( 100, 10, 10 ), model ); // obere wand
-        makeQuader( vertecies, 192, Vec3< float >( -50, -7, -50 ), Vec3< float >( 100, 15, 2 ), model ); // untere wand
-        model->setVertecies( vertecies, 216 );
-
-        model->calculateNormals();
-
-        textur = new Model3DTextur();
-    }
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-};
-
-class Hero : public Model3D
+class Block : public Model3D
 {
 public:
-    // Konstruktor
-    //  size: Die Größe des Würfels
-    Hero()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-
-        Vertex3D *vertecies = new Vertex3D[ 240 ];
-        for( int i = 0; i < 240; i++ )
-            vertecies[ i ].knochenId = 0;
-        makeQuader( vertecies, 0, Vec3< float >( -7, -7, 20 ), Vec3< float >( 15, 15, 15 ), model ); // kopf
-        makeQuader( vertecies, 24, Vec3< float >( -10, -4, -5 ), Vec3< float >( 20, 8, 25 ), model ); // oberkörper
-        makeQuader( vertecies, 48, Vec3< float >( -20, -5, 10 ), Vec3< float >( 10, 10, 10 ), model ); // linke schulter
-        makeQuader( vertecies, 72, Vec3< float >( 10, -5, 10 ), Vec3< float >( 10, 10, 10 ), model ); // rechte schulter
-        makeQuader( vertecies, 96, Vec3< float >( -18, -3, -10 ), Vec3< float >( 5, 5, 30 ), model ); // linker arm
-        makeQuader( vertecies, 120, Vec3< float >( 13, -3, -10 ), Vec3< float >( 5, 5, 30 ), model ); // rechter arm
-        makeQuader( vertecies, 144, Vec3< float >( -10, -4, -30 ), Vec3< float >( 8, 8, 25 ), model ); // linkes bein
-        makeQuader( vertecies, 168, Vec3< float >( 2, -4, -30 ), Vec3< float >( 8, 8, 25 ), model ); // rechtes bein
-        makeQuader( vertecies, 192, Vec3< float >( -9, -10, -35 ), Vec3< float >( 6, 15, 5 ), model ); // linker fuß
-        makeQuader( vertecies, 216, Vec3< float >( 3, -10, -35 ), Vec3< float >( 6, 15, 5 ), model ); // rechter fuß
-        model->setVertecies( vertecies, 240 );
-
-        model->calculateNormals();
-
-        textur = new Model3DTextur();
-    }
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-};
-
-class Unbekannt : public Model3D
-{
-public:
-    Unbekannt()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-
-        Vertex3D *vertecies = new Vertex3D[ 216 ];
-        for( int i = 0; i < 216; i++ )
-            vertecies[ i ].knochenId = 0;
-        makeQuader( vertecies, 0, Vec3< float >( -5, -5, -25 ), Vec3< float >( 10, 10, 10 ), model );
-        makeQuader( vertecies, 24, Vec3< float >( -5, -5, -10 ), Vec3< float >( 10, 10, 10 ), model );
-        makeQuader( vertecies, 48, Vec3< float >( 0, -5, 0 ), Vec3< float >( 10, 10, 10 ), model );
-        makeQuader( vertecies, 72, Vec3< float >( 5, -5, 10 ), Vec3< float >( 10, 10, 10 ), model );
-        makeQuader( vertecies, 96, Vec3< float >( 10, -5, 20 ), Vec3< float >( 10, 10, 10 ), model );
-        makeQuader( vertecies, 120, Vec3< float >( 5, -5, 30 ), Vec3< float >( 10, 10, 10 ), model );
-        makeQuader( vertecies, 144, Vec3< float >( -5, -5, 35 ), Vec3< float >( 10, 10, 10 ), model );
-        makeQuader( vertecies, 168, Vec3< float >( -15, -5, 30 ), Vec3< float >( 10, 10, 10 ), model );
-        makeQuader( vertecies, 192, Vec3< float >( -20, -5, 20 ), Vec3< float >( 10, 10, 10 ), model );
-        model->setVertecies( vertecies, 216 );
-
-        model->calculateNormals();
-
-        textur = new Model3DTextur();
-    }
-
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-
-    bool tick( double time ) override
-    {
-        this->setDrehungZ( getZDrehung() + time );
-        return Model3D::tick( time );
-    }
-};
-
-class Schrank : public Model3D
-{
-public:
-    Schrank()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-
-        Vertex3D *vertecies = new Vertex3D[ 216 ];
-        for( int i = 0; i < 216; i++ )
-            vertecies[ i ].knochenId = 0;
-        makeQuader( vertecies, 0, Vec3< float >( -25, -15, -30 ), Vec3< float >( 50, 30, 70 ), model ); // haupt schrank
-        makeQuader( vertecies, 24, Vec3< float >( -27, -17, 40 ), Vec3< float >( 54, 34, 2 ), model ); // dach
-        makeQuader( vertecies, 48, Vec3< float >( -27, -17, -32 ), Vec3< float >( 54, 34, 2 ), model ); // boden
-        makeQuader( vertecies, 72, Vec3< float >( -27, -17, -37 ), Vec3< float >( 10, 10, 77 ), model ); // fus
-        makeQuader( vertecies, 96, Vec3< float >( 17, -17, -37 ), Vec3< float >( 10, 10, 77 ), model ); // fus
-        makeQuader( vertecies, 120, Vec3< float >( -27, 7, -37 ), Vec3< float >( 10, 10, 77 ), model ); // fus
-        makeQuader( vertecies, 144, Vec3< float >( 17, 7, -37 ), Vec3< float >( 10, 10, 77 ), model ); // fus
-        makeQuader( vertecies, 168, Vec3< float >( -4, -17, -1 ), Vec3< float >( 2, 2, 2 ), model ); // griff
-        makeQuader( vertecies, 192, Vec3< float >( 2, -17, -1 ), Vec3< float >( 2, 2, 2 ), model ); // griff
-        model->setVertecies( vertecies, 216 );
-
-        model->calculateNormals();
-
-        textur = new Model3DTextur();
-    }
-
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-
-    bool tick( double time ) override
-    {
-        this->setDrehungZ( getZDrehung() + time );
-        return Model3D::tick( time );
-    }
-};
-
-class Stapel : public Model3D
-{
-public:
-    Stapel()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-
-        Vertex3D *vertecies = new Vertex3D[ 240 ];
-        for( int i = 0; i < 240; i++ )
-            vertecies[ i ].knochenId = 0;
-        makeQuader( vertecies, 0, Vec3< float >( -25, -25, -25 ), Vec3< float >( 50, 50, 5 ), model );
-        makeQuader( vertecies, 24, Vec3< float >( -20, -25, -20 ), Vec3< float >( 50, 50, 5 ), model );
-        makeQuader( vertecies, 48, Vec3< float >( -25, -20, -15 ), Vec3< float >( 50, 50, 5 ), model );
-        makeQuader( vertecies, 72, Vec3< float >( -30, -20, -10 ), Vec3< float >( 50, 50, 5 ), model );
-        makeQuader( vertecies, 96, Vec3< float >( -25, -25, -5 ), Vec3< float >( 50, 50, 5 ), model );
-        makeQuader( vertecies, 120, Vec3< float >( -20, -30, 0 ), Vec3< float >( 50, 50, 5 ), model );
-        makeQuader( vertecies, 144, Vec3< float >( -25, -30, 5 ), Vec3< float >( 50, 50, 5 ), model );
-        makeQuader( vertecies, 168, Vec3< float >( -30, -25, 10 ), Vec3< float >( 50, 50, 5 ), model );
-        makeQuader( vertecies, 192, Vec3< float >( -25, -25, 15 ), Vec3< float >( 50, 50, 5 ), model );
-        makeQuader( vertecies, 216, Vec3< float >( -20, -20, 20 ), Vec3< float >( 50, 50, 5 ), model );
-        model->setVertecies( vertecies, 240 );
-
-        model->calculateNormals();
-
-        textur = new Model3DTextur();
-    }
-
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-
-    bool tick( double time ) override
-    {
-        this->setDrehungZ( getZDrehung() + time );
-        return Model3D::tick( time );
-    }
-};
-
-class Wanne : public Model3D
-{
-public:
-    Wanne()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-
-        Vertex3D *vertecies = new Vertex3D[ 120 ];
-        for( int i = 0; i < 120; i++ )
-            vertecies[ i ].knochenId = 0;
-        makeQuader( vertecies, 0, Vec3< float >( -30, -15, -17 ), Vec3< float >( 60, 30, 2 ), model ); // boden
-        makeQuader( vertecies, 24, Vec3< float >( -30, -15, -15 ), Vec3< float >( 5, 30, 30 ), model ); // wand links
-        makeQuader( vertecies, 48, Vec3< float >( 25, -15, -15 ), Vec3< float >( 5, 30, 30 ), model ); // wand rechts
-        makeQuader( vertecies, 72, Vec3< float >( -25, -15, -15 ), Vec3< float >( 50, 5, 30 ), model ); // wand forne
-        makeQuader( vertecies, 96, Vec3< float >( -25, 10, -15 ), Vec3< float >( 50, 5, 30 ), model ); // wand hinten
-        model->setVertecies( vertecies, 120 );
-
-        model->calculateNormals();
-
-        textur = new Model3DTextur();
-    }
-
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-
-    bool tick( double time ) override
-    {
-        this->setDrehungZ( getZDrehung() + time );
-        return Model3D::tick( time );
-    }
+	// Konstruktor
+	//  size: Die Größe des Würfels
+	Block(GraphicsApi* zApi)
+	{
+		model = zApi->createModel("block");
+		model->setAmbientFactor(ambient);
+		model->setDiffusFactor(diffus);
+		model->setSpecularFactor(specular);
+
+		Vertex3D* vertecies = new Vertex3D[24];
+		for (int i = 0; i < 24; i++)
+			vertecies[i].knochenId = 0;
+		makeQuader(vertecies, 0, Vec3< float >(-0.5, -0.5, -0.5), Vec3< float >(1, 1, 1), model);
+		model->setVertecies(vertecies, 24);
+
+		model->calculateNormals();
+
+		textur = new Model3DTextur();
+		Bild* b = new Bild();
+		b->neuBild(10, 10, 0xFFFF5050);
+		textur->setPolygonTextur(0, zApi->createOrGetTextur("blockA", b)); // front
+		b = new Bild();
+		b->neuBild(10, 10, 0xFFA02020);
+		textur->setPolygonTextur(1, zApi->createOrGetTextur("blockB", b)); // back
+		b = new Bild();
+		b->neuBild(10, 10, 0xFF5050FF);
+		textur->setPolygonTextur(2, zApi->createOrGetTextur("blockC", b)); // left
+		b = new Bild();
+		b->neuBild(10, 10, 0xFF2020A0);
+		textur->setPolygonTextur(3, zApi->createOrGetTextur("blockD", b)); // right
+		b = new Bild();
+		b->neuBild(10, 10, 0xFF50FF50);
+		textur->setPolygonTextur(4, zApi->createOrGetTextur("blockE", b)); // top
+		b = new Bild();
+		b->neuBild(10, 10, 0xFF20A020);
+		textur->setPolygonTextur(5, zApi->createOrGetTextur("blockF", b)); // botom
+		rend = 1;
+	}
 };
 
-class Truhe : public Model3D
+class ObjModel : public Model3D
 {
-public:
-    Truhe()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-
-        Vertex3D *vertecies = new Vertex3D[ 144 ];
-        for( int i = 0; i < 144; i++ )
-            vertecies[ i ].knochenId = 0;
-        makeQuader( vertecies, 0, Vec3< float >( -30, -15, -17 ), Vec3< float >( 60, 30, 2 ), model ); // boden
-        makeQuader( vertecies, 24, Vec3< float >( -30, -15, -15 ), Vec3< float >( 5, 30, 30 ), model ); // wand links
-        makeQuader( vertecies, 48, Vec3< float >( 25, -15, -15 ), Vec3< float >( 5, 30, 30 ), model ); // wand rechts
-        makeQuader( vertecies, 72, Vec3< float >( -25, -15, -15 ), Vec3< float >( 50, 5, 30 ), model ); // wand forne
-        makeQuader( vertecies, 96, Vec3< float >( -25, 10, -15 ), Vec3< float >( 50, 5, 30 ), model ); // wand hinten
-        makeQuader( vertecies, 120, Vec3< float >( -32, -17, 15 ), Vec3< float >( 64, 34, 2 ), model ); // deckel
-        model->setVertecies( vertecies, 144 );
-
-        model->calculateNormals();
+private:
+	Text modelName;
 
-        textur = new Model3DTextur();
-    }
-
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-
-    bool tick( double time ) override
-    {
-        this->setDrehungZ( getZDrehung() + time );
-        return Model3D::tick( time );
-    }
-};
-
-class Fass : public Model3D
-{
 public:
-    Fass()
-    {
-        model = new Model3DData();
-        model->setAmbientFactor( ambient );
-        model->setDiffusFactor( diffus );
-        model->setSpecularFactor( specular );
-
-        Vertex3D *vertecies = new Vertex3D[ 52 ];
-        for( int i = 0; i < 52; i++ )
-            vertecies[ i ].knochenId = 0;
-        Vec3<float> p = Vec3<float>( 20, 0, -30 );
-        Mat4<float> rm = Mat4<float>::rotationZ( (float)( 2 * PI / 8 ) );
-        for( int i = 0; i < 8; i++ )
-        {
-            vertecies[ i ].pos = p;
-            vertecies[ i ].tPos.x = ( p.x + 20.f ) / 40.f;
-            vertecies[ i ].tPos.y = ( p.y + 20.f ) / 40.f;
-            p = rm * p;
-        }
-        p = Vec3<float>( 20, 0, -30 );
-        for( int i = 0; i < 9; i++ )
-        {
-            vertecies[ 8 + i ].pos = p;
-            vertecies[ 8 + i ].tPos.x = 1.f - i * ( 1.f / 8.f );
-            vertecies[ 8 + i ].tPos.y = 1.f;
-            p = rm * p;
-        }
-        p = Vec3<float>( 25, 0, -10 );
-        for( int i = 0; i < 9; i++ )
-        {
-            vertecies[ 17 + i ].pos = p;
-            vertecies[ 17 + i ].tPos.x = 1.f - i * ( 1.f / 8.f );
-            vertecies[ 17 + i ].tPos.y = 0.7777777f;
-            p = rm * p;
-        }
-        p = Vec3<float>( 25, 0, 10 );
-        for( int i = 0; i < 9; i++ )
-        {
-            vertecies[ 26 + i ].pos = p;
-            vertecies[ 26 + i ].tPos.x = 1.f - i * ( 1.f / 8.f );
-            vertecies[ 26 + i ].tPos.y = 0.3333333f;
-            p = rm * p;
-        }
-        p = Vec3<float>( 20, 0, 30 );
-        for( int i = 0; i < 9; i++ )
-        {
-            vertecies[ 35 + i ].pos = p;
-            vertecies[ 35 + i ].tPos.x = 1.f - i * ( 1.f / 8.f );
-            vertecies[ 35 + i ].tPos.y = 0.f;
-            p = rm * p;
-        }
-        p = Vec3<float>( 20, 0, 30 );
-        for( int i = 0; i < 8; i++ )
-        {
-            vertecies[ 44 + i ].pos = p;
-            vertecies[ 44 + i ].tPos.x = ( p.x + 20.f ) / 40.f;
-            vertecies[ 44 + i ].tPos.y = ( p.y + 20.f ) / 40.f;
-            p = rm * p;
-        }
-        // top side
-        Polygon3D *pol = new Polygon3D();
-        pol->indexAnz = 18;
-        pol->indexList = new int[ pol->indexAnz ];
-        pol->indexList[ 0 ] = 44 + 0;
-        pol->indexList[ 1 ] = 44 + 1;
-        pol->indexList[ 2 ] = 44 + 2;
-        pol->indexList[ 3 ] = 44 + 0;
-        pol->indexList[ 4 ] = 44 + 2;
-        pol->indexList[ 5 ] = 44 + 3;
-        pol->indexList[ 6 ] = 44 + 0;
-        pol->indexList[ 7 ] = 44 + 3;
-        pol->indexList[ 8 ] = 44 + 4;
-        pol->indexList[ 9 ] = 44 + 0;
-        pol->indexList[ 10 ] = 44 + 4;
-        pol->indexList[ 11 ] = 44 + 5;
-        pol->indexList[ 12 ] = 44 + 0;
-        pol->indexList[ 13 ] = 44 + 5;
-        pol->indexList[ 14 ] = 44 + 6;
-        pol->indexList[ 15 ] = 44 + 0;
-        pol->indexList[ 16 ] = 44 + 6;
-        pol->indexList[ 17 ] = 44 + 7;
-        model->addPolygon( pol );
-        // bottom side
-        pol = new Polygon3D();
-        pol->indexAnz = 18;
-        pol->indexList = new int[ pol->indexAnz ];
-        pol->indexList[ 0 ] = 0;
-        pol->indexList[ 1 ] = 2;
-        pol->indexList[ 2 ] = 1;
-        pol->indexList[ 3 ] = 0;
-        pol->indexList[ 4 ] = 3;
-        pol->indexList[ 5 ] = 2;
-        pol->indexList[ 6 ] = 0;
-        pol->indexList[ 7 ] = 4;
-        pol->indexList[ 8 ] = 3;
-        pol->indexList[ 9 ] = 0;
-        pol->indexList[ 10 ] = 5;
-        pol->indexList[ 11 ] = 4;
-        pol->indexList[ 12 ] = 0;
-        pol->indexList[ 13 ] = 6;
-        pol->indexList[ 14 ] = 5;
-        pol->indexList[ 15 ] = 0;
-        pol->indexList[ 16 ] = 7;
-        pol->indexList[ 17 ] = 6;
-        model->addPolygon( pol );
-        // out side
-        pol = new Polygon3D();
-        pol->indexAnz = 18 * 8;
-        pol->indexList = new int[ pol->indexAnz ];
-        for( int i = 0; i < 8; i++ )
-        {
-            pol->indexList[ i * 18 + 0 ] = i + 8;
-            pol->indexList[ i * 18 + 1 ] = i + 9;
-            pol->indexList[ i * 18 + 2 ] = i + 17;
-
-            pol->indexList[ i * 18 + 3 ] = i + 17;
-            pol->indexList[ i * 18 + 4 ] = i + 9;
-            pol->indexList[ i * 18 + 5 ] = i + 18;
-
-            pol->indexList[ i * 18 + 6 ] = i + 26;
-            pol->indexList[ i * 18 + 7 ] = i + 17;
-            pol->indexList[ i * 18 + 8 ] = i + 18;
-
-            pol->indexList[ i * 18 + 9 ] = i + 26;
-            pol->indexList[ i * 18 + 10 ] = i + 18;
-            pol->indexList[ i * 18 + 11 ] = i + 27;
-
-            pol->indexList[ i * 18 + 12 ] = i + 35;
-            pol->indexList[ i * 18 + 13 ] = i + 26;
-            pol->indexList[ i * 18 + 14 ] = i + 27;
-
-            pol->indexList[ i * 18 + 15 ] = i + 35;
-            pol->indexList[ i * 18 + 16 ] = i + 27;
-            pol->indexList[ i * 18 + 17 ] = i + 36;
-        }
-        model->addPolygon( pol );
-        model->setVertecies( vertecies, 52 );
-
-        model->calculateNormals();
-
-        textur = new Model3DTextur();
-    }
-
-    // Setzt die Textur des Würfels, so dass sie an allen Seiten gleich ist
-    //  textur: Die Textur als Bild
-    void setTextur( Textur *textur )
-    {
-        int anz = model->getPolygonAnzahl();
-        for( int i = 0; i < anz; i++ )
-            this->textur->setPolygonTextur( i, textur->getThis() );
-        textur->release();
-        rend = 1;
-    }
-
-    bool tick( double time ) override
-    {
-        this->setDrehungZ( getZDrehung() + time );
-        return Model3D::tick( time );
-    }
+	ObjModel(GraphicsApi* zApi, Text path, Text textur, Text modelName)
+		: Model3D()
+	{
+		Text* p = path.getTeilText(0, path.positionVon(".obj/", path.anzahlVon(".obj/") - 1) + 4);
+		ObjFile file(p->getText());
+		Model3DData* data = zApi->createModel(path);
+		data->setAmbientFactor(ambient);
+		data->setDiffusFactor(diffus);
+		data->setSpecularFactor(specular);
+		file.loadModel(path.getText() + p->getLength() + 1, data);
+		Vertex3D* vb = new Vertex3D[data->getVertexAnzahl()];
+		for (int i = 0; i < data->getVertexAnzahl(); i++)
+		{
+			vb[i] = data->zVertexBuffer()[i];
+			vb[i].tPos.y = 1 - vb[i].tPos.y;
+		}
+		data->setVertecies(vb, data->getVertexAnzahl());
+		setModelDaten(data);
+		p->release();
+		p = textur.getTeilText(0, textur.positionVon(".ltdb/", textur.anzahlVon(".ltdb/") - 1) + 5);
+		LTDBDatei dat;
+		dat.setDatei(p);
+		dat.leseDaten(0);
+		Bild* t = dat.laden(0, textur.getTeilText(textur.positionVon(".ltdb/", textur.anzahlVon(".ltdb/") - 1) + 6));
+		Model3DTextur* tex = new Model3DTextur();
+		tex->setPolygonTextur(0, zApi->createOrGetTextur(textur, t));
+		this->textur = tex;
+		adjustCenter();
+		rend = 1;
+		this->modelName = modelName;
+	}
+
+	void adjustCenter()
+	{
+		Vec3<float> maxPos = { -INFINITY, -INFINITY, -INFINITY };
+		Vec3<float> minPos = { INFINITY, INFINITY, INFINITY };
+		for (int i = 0; i < model->getVertexAnzahl(); i++)
+		{
+			if (model->zVertexBuffer()[i].pos.x < minPos.x)
+				minPos.x = model->zVertexBuffer()[i].pos.x;
+			if (model->zVertexBuffer()[i].pos.y < minPos.y)
+				minPos.y = model->zVertexBuffer()[i].pos.y;
+			if (model->zVertexBuffer()[i].pos.z < minPos.z)
+				minPos.z = model->zVertexBuffer()[i].pos.z;
+			if (model->zVertexBuffer()[i].pos.x > maxPos.x)
+				maxPos.x = model->zVertexBuffer()[i].pos.x;
+			if (model->zVertexBuffer()[i].pos.y > maxPos.y)
+				maxPos.y = model->zVertexBuffer()[i].pos.y;
+			if (model->zVertexBuffer()[i].pos.z > maxPos.z)
+				maxPos.z = model->zVertexBuffer()[i].pos.z;
+		}
+		Vec3<float> center = minPos + (maxPos - minPos) / 2;
+		if (center != Vec3<float>(0.f, 0.f, 0.f))
+		{
+			for (int i = 0; i < model->getVertexAnzahl(); i++)
+			{
+				// !! update of vertex data is not supported by the framework and does not update some stored information on the model like bounding box and radius
+				((Vertex3D*)model->zVertexBuffer())[i].pos -= center;
+			}
+			model->zDXVertexBuffer()->setChanged();
+			model->updateGPUMemory();
+		}
+	}
+
+	bool tick(double time) override
+	{
+		if (getTastenStand(VK_OEM_MINUS))
+		{
+			setSize(size - (size - (size * 0.995)) * (time * 3));
+		}
+		if (getTastenStand(VK_OEM_PLUS))
+		{
+			setSize(size + (size * 1.005 - size) * (time * 3));
+		}
+		if (getTastenStand(VK_NUMPAD1))
+		{
+			setDrehungX(getDrehung().x + time * 0.1);
+		}
+		if (getTastenStand(VK_NUMPAD4))
+		{
+			setDrehungX(getDrehung().x - time * 0.1);
+		}
+		if (getTastenStand(VK_NUMPAD2))
+		{
+			setDrehungY(getDrehung().y + time * 0.1);
+		}
+		if (getTastenStand(VK_NUMPAD5))
+		{
+			setDrehungY(getDrehung().y - time * 0.1);
+		}
+		if (getTastenStand(VK_NUMPAD3))
+		{
+			setDrehungZ(getDrehung().z + time * 0.1);
+		}
+		if (getTastenStand(VK_NUMPAD6))
+		{
+			setDrehungZ(getDrehung().z - time * 0.1);
+		}
+		if (getTastenStand(T_Enter))
+		{
+			if (size != 1.f || getDrehung() != Vec3<float>(0.f, 0.f, 0.f))
+			{
+				// aply scale and rotation on model verticies
+				Mat4<float> matrix = Mat4<float>::identity() * Mat4<float>::rotationZ(angle.z) * Mat4<float>::rotationX(angle.x) * Mat4<float>::rotationY(angle.y) * Mat4<float>::scaling(size);
+				for (int i = 0; i < model->getVertexAnzahl(); i++)
+				{
+					// !! update of vertex data is not supported by the framework and does not update some stored information on the model like bounding box and radius
+					((Vertex3D*)model->zVertexBuffer())[i].pos = matrix * model->zVertexBuffer()[i].pos;
+					((Vertex3D*)model->zVertexBuffer())[i].normal = (matrix * model->zVertexBuffer()[i].normal).normalize();
+				}
+				model->zDXVertexBuffer()->setChanged();
+				model->updateGPUMemory();
+				size = 1.f;
+				setDrehung(0.f, 0.f, 0.f);
+				adjustCenter();
+			}
+		}
+		if (getTastenStand(T_Ende))
+		{
+			// save model
+			M3Datei dat("m3/blocks.m3");
+			dat.leseDaten();
+			dat.removeModel(modelName);
+			if (dat.saveModel(model, modelName))
+			{
+				std::cout << "erfolgreich gespeichert\n";
+			}
+			else
+			{
+				std::cout << "fehler beim speichern\n";
+			}
+		}
+		return Model3D::tick(time);
+	}
 };
 
 // Aktion beim schließen des Fensters
-void schließen( void *p, void *f )
+void schließen(void* p, void* f)
 {
-    // Stoppe Nachrichten Loop
-    StopNachrichtenSchleife( ( (WFenster *)f )->getFensterHandle() );
+	// Stoppe Nachrichten Loop
+	StopNachrichtenSchleife(((WFenster*)f)->getFensterHandle());
 }
 
-int __stdcall Framework::Start( Startparam p )
+int __stdcall Framework::Start(Startparam p)
 {
-    /*Vec3< float > v1( 0, rand(), rand() );
-    Vec3< float > v2 = v1 * rand();
-    for( float angle = 1; angle <= 360; angle++ )
-    {
-        v2.rotateX( ( 1.f / 180.f ) * (float)PI );
-        std::cout << "Angle: " << angle << " acos(x): " << v1.angle( v2 ) << " x: " << ( ( v1 * v2 ) / ( v1.getLength() * v2.getLength() ) ) << " y: " << ( ( v1 * v2 ) / ( v1.getLengthSq() * v2.getLengthSq() ) ) << " z: " << ( v1 * v2 ) << "\n";
-    }
-    v1 = Vec3< float >( 0, rand(), rand() );
-    v2 = Vec3< float >( v1 * rand() );
-    std::cout << "\n\n";
-    for( float angle = 1; angle <= 360; angle++ )
-    {
-        v2.rotateX( -( 1.f / 180.f ) * (float)PI );
-        std::cout << "Angle: " << -angle << " acos(x): " << v1.angle( v2 ) << " x: " << ( ( v1 * v2 ) / ( v1.getLength() * v2.getLength() ) ) << " y: " << ( ( v1 * v2 ) / ( v1.getLengthSq() * v2.getLengthSq() ) ) << " z: " << ( v1 * v2 ) << "\n";
-    }
-    return 0;*/
-    // Fenster erstellen
-    WNDCLASS wc = F_Normal( p.hinst );
-    wc.lpszClassName = "3D Creator";
-
-    WFenster *f = new WFenster();
-    f->erstellen( WS_OVERLAPPEDWINDOW, wc );
-    f->setVSchließAktion( schließen );
-    f->setAnzeigeModus( SW_SHOWNORMAL );
-    f->setSize( 1300, 820 );
-    f->setPosition( Punkt( 100, 100 ) );
-
-    // 3D Umgebung erstellen
-    Bildschirm3D *b = new Bildschirm3D( f->getThis(), DIRECTX11 );
-    f->setBildschirm( b->getThis() );
-    b->setFillFarbe( 0 );
-    b->setTestRend( 0 );
-
-    Welt3D *welt = new Welt3D();
-
-    LTDBDatei *assets = new LTDBDatei();
-    assets->setDatei( new Text( "textures.ltdb" ) );
-    assets->leseDaten( 0 );
-    Bild *b1 = assets->laden( 0, new Text( "holz.png" ) );
-    Textur *t = b->zGraphicsApi()->createOrGetTextur( "ground", b1 );
-    assets->release();
-    Treppe *test2 = new Treppe();
-    test2->setTextur( t->getThis() );
-    test2->setPosition( 150, 0, 0 );
-    welt->addZeichnung( test2 );
-    Mauer *test3 = new Mauer();
-    test3->setTextur( t->getThis() );
-    test3->setPosition( 150, 150, 0 );
-    welt->addZeichnung( test3 );
-    MauerEcke *test4 = new MauerEcke();
-    test4->setTextur( t->getThis() );
-    test4->setPosition( -150, 0, 0 );
-    welt->addZeichnung( test4 );
-    MauerKreuz *test5 = new MauerKreuz();
-    test5->setTextur( t->getThis() );
-    test5->setPosition( 0, 150, 0 );
-    welt->addZeichnung( test5 );
-    Boden *test6 = new Boden();
-    test6->setTextur( t->getThis() );
-    test6->setPosition( -150, 150, 0 );
-    welt->addZeichnung( test6 );
-    Unbekannt *test7 = new Unbekannt();
-    test7->setTextur( t->getThis() );
-    test7->setPosition( -250, 150, 0 );
-    welt->addZeichnung( test7 );
-    HalberBoden *test8 = new HalberBoden();
-    test8->setTextur( t->getThis() );
-    test8->setPosition( -150, 250, 0 );
-    welt->addZeichnung( test8 );
-    Hero *test9 = new Hero();
-    test9->setTextur( t->getThis() );
-    test9->setPosition( -250, 250, 0 );
-    welt->addZeichnung( test9 );
-    TürZu *test10 = new TürZu();
-    test10->setTextur( t->getThis() );
-    test10->setPosition( -350, 250, 0 );
-    welt->addZeichnung( test10 );
-    TürOffen *test11 = new TürOffen();
-    test11->setTextur( t->getThis() );
-    test11->setPosition( -250, 350, 0 );
-    welt->addZeichnung( test11 );
-    FensterZu *test12 = new FensterZu();
-    test12->setTextur( t->getThis() );
-    test12->setPosition( -350, 350, 0 );
-    welt->addZeichnung( test12 );
-    FensterOffen *test13 = new FensterOffen();
-    test13->setTextur( t->getThis() );
-    test13->setPosition( -350, 450, 0 );
-    welt->addZeichnung( test13 );
-    Fass *test14 = new Fass();
-    test14->setTextur( t->getThis() );
-    test14->setPosition( -350, 150, 0 );
-    welt->addZeichnung( test14 );
-    Schrank *test15 = new Schrank();
-    test15->setTextur( t->getThis() );
-    test15->setPosition( -350, 50, 0 );
-    welt->addZeichnung( test15 );
-    Stapel *test16 = new Stapel();
-    test16->setTextur( t->getThis() );
-    test16->setPosition( -350, -50, 0 );
-    welt->addZeichnung( test16 );
-    Wanne *test17 = new Wanne();
-    test17->setTextur( t->getThis() );
-    test17->setPosition( -350, -150, 0 );
-    welt->addZeichnung( test17 );
-    Truhe *test18 = new Truhe();
-    test18->setTextur( t->getThis() );
-    test18->setPosition( -250, -150, 0 );
-    welt->addZeichnung( test18 );
-
-
-    M3Datei m3;
-    m3.setPfad( "models.m3" );
-    m3.leseDaten();
-    m3.saveModel( test2->zModelData(), "TREPPE" );
-    m3.saveModel( test3->zModelData(), "MAUER" );
-    m3.saveModel( test4->zModelData(), "mauer_ecke" );
-    m3.saveModel( test5->zModelData(), "mauer_kreuz" );
-    m3.saveModel( test6->zModelData(), "BODEN" );
-    m3.saveModel( test8->zModelData(), "boden_halb" );
-    m3.saveModel( test9->zModelData(), "HERO" );
-    m3.saveModel( test9->zModelData(), "NPC" );
-    m3.saveModel( test10->zModelData(), "TÜR (ZU)" );
-    m3.saveModel( test11->zModelData(), "TÜR (OFFEN)" );
-    m3.saveModel( test12->zModelData(), "FENSTER (ZU)" );
-    m3.saveModel( test13->zModelData(), "FENSTER (OFFEN)" );
-    m3.saveModel( test14->zModelData(), "FASS" );
-    m3.saveModel( test15->zModelData(), "SCHRANK" );
-    m3.saveModel( test16->zModelData(), "STAPEL" );
-    m3.saveModel( test17->zModelData(), "WANNE" );
-    m3.saveModel( test18->zModelData(), "TRUHE" );
-    m3.saveModel( test7->zModelData(), "unbekannt" );
-
-
-    t->release();
-
-    Kam3D *kamA = new Kam3D();
-    kamA->setBildschirmPosition( 10, 10 );
-    kamA->setBildschirmSize( 385, 385 );
-    kamA->setPosition( Vec3<float>( -1000, 0, 0 ) );
-    kamA->setAusrichtung( Vec3<float>( 0, 0, 0 ) );
-    kamA->setWelt( welt->getThis() );
-    b->addKamera( kamA );
-
-    Kam3D *kamB = new Kam3D();
-    kamB->setBildschirmPosition( 10, 405 );
-    kamB->setBildschirmSize( 385, 385 );
-    kamB->setPosition( Vec3<float>( 0, -1000, 0 ) );
-    kamB->setAusrichtung( Vec3<float>( 0, 0, 0 ) );
-    kamB->setWelt( welt->getThis() );
-    b->addKamera( kamB );
-
-    Kam3D *kamC = new Kam3D();
-    kamC->setBildschirmPosition( 405, 10 );
-    kamC->setBildschirmSize( 385, 385 );
-    kamC->setPosition( Vec3<float>( 0, 0, -1000 ) );
-    kamC->setAusrichtung( Vec3<float>( 0, 0, 0 ) );
-    kamC->setWelt( welt->getThis() );
-    b->addKamera( kamC );
-
-    Kam3D *kamD = new Kam3D();
-    kamD->setStyle( Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick );
-    kamD->setBildschirmPosition( 405, 405 );
-    kamD->setBildschirmSize( 385, 385 );
-    kamD->setPosition( Vec3<float>( 0, 0, 1000 ) );
-    kamD->setAusrichtung( Vec3<float>( 0, 0, 0 ) );
-    kamD->setWelt( welt->getThis() );
-    b->addKamera( kamD );
-
-    LRahmen *kamAR = new LRahmen();
-    kamAR->setPosition( 10, 10 );
-    kamAR->setFarbe( 0xFFFFFFFF );
-    kamAR->setRamenBreite( 1 );
-    kamAR->setSize( 385, 385 );
-    b->addMember( kamAR );
-    LRahmen *kamBR = new LRahmen();
-    kamBR->setPosition( 404, 10 );
-    kamBR->setFarbe( 0xFFFFFFFF );
-    kamBR->setRamenBreite( 1 );
-    kamBR->setSize( 385, 385 );
-    b->addMember( kamBR );
-    LRahmen *kamCR = new LRahmen();
-    kamCR->setPosition( 10, 405 );
-    kamCR->setFarbe( 0xFFFFFFFF );
-    kamCR->setRamenBreite( 1 );
-    kamCR->setSize( 385, 385 );
-    b->addMember( kamCR );
-    LRahmen *kamDR = new LRahmen();
-    kamDR->setPosition( 405, 405 );
-    kamDR->setFarbe( 0xFFFFFFFF );
-    kamDR->setRamenBreite( 1 );
-    kamDR->setSize( 385, 385 );
-    b->addMember( kamDR );
-
-    // Render Loop starten
-    RenderTh *r = new RenderTh();
-    r->setMaxFps( 10000 );
-    r->setBildschirm( b->getThis() );
-    r->setTickFunktion( [ b, kamD ]( void *, void *, double t )
-    {
-        //test->setDrehung( test->getDrehung() + Vec3<double>( t, t, t ) );
-        if( Framework::getTastenStand( T_Enter ) )
-        {
-            kamD->setAusrichtung( Vec3<float>( 0, 0, 0 ) );
-        }
-    } );
-    r->beginn();
-
-    // Nachrichten Loop starten und warten
-    StartNachrichtenSchleife();
-
-    // Speicher Freigeben
-    r->beenden();
-    r->release();
-    b->release();
-    f->setBildschirm( 0 );
-    f->zerstören();
-    f->release();
-    welt->release();
-
-    return 0;
+	// Fenster erstellen
+	WNDCLASS wc = F_Normal(p.hinst);
+	wc.lpszClassName = "3D Creator";
+
+	WFenster* f = new WFenster();
+	f->erstellen(WS_OVERLAPPEDWINDOW, wc);
+	f->setVSchließAktion(schließen);
+	f->setAnzeigeModus(SW_SHOWNORMAL);
+	f->setSize(1300, 820);
+	f->setPosition(Punkt(100, 100));
+
+	// 3D Umgebung erstellen
+	Bildschirm3D* b = new Bildschirm3D(dynamic_cast<WFenster*>(f->getThis()), DIRECTX11);
+	f->setBildschirm(dynamic_cast<Bildschirm*>(b->getThis()));
+	b->setFillFarbe(0);
+	b->setTestRend(0);
+
+	Welt3D* welt = new Welt3D();
+
+	ObjModel* mdl = new ObjModel(b->zGraphicsApi(), "obj/sebling.obj/Cube", "tex/blocks.ltdb/sebling.png", "sebling");
+	mdl->setPosition(0, 0, 0);
+	welt->addZeichnung(mdl);
+	Block* blk = new Block(b->zGraphicsApi());
+	blk->setPosition(0, 0, -1);
+	welt->addZeichnung(blk);
+
+	welt->addDiffuseLight({ Vec3<float>(-0.5f, -0.5f, -0.5f), Vec3<float>(1.f, 1.f, 1.f) });
+
+	Kam3D* kamA = new Kam3D(); // look at front
+	kamA->setBildschirmPosition(10, 10);
+	kamA->setBildschirmSize(385, 385);
+	kamA->setPosition(Vec3<float>(0, -10, 0));
+	kamA->setRotation({ -(float)PI / 2.f, -(float)PI, 0 });
+	kamA->setWelt(dynamic_cast<Welt3D*>(welt->getThis()));
+	b->addKamera(kamA);
+
+	Kam3D* kamB = new Kam3D(); // look at left
+	kamB->setMovementSpeed(1);
+	kamB->setBildschirmPosition(10, 405);
+	kamB->setBildschirmSize(385, 385);
+	kamB->setPosition(Vec3<float>(10, 0, 0));
+	kamB->setRotation({ -PI / 2, (float)PI, (float)PI / 2.f });
+	kamB->setWelt(dynamic_cast<Welt3D*>(welt->getThis()));
+	b->addKamera(kamB);
+
+	Kam3D* kamC = new Kam3D();
+	kamC->setBildschirmPosition(405, 10);
+	kamC->setBildschirmSize(385, 385);
+	kamC->setPosition(Vec3<float>(0, 0, 10));
+	kamC->setRotation({ -(float)PI, 0, 0});
+	kamC->setWelt(dynamic_cast<Welt3D*>(welt->getThis()));
+	b->addKamera(kamC);
+
+	Kam3D* kamD = new Kam3D();
+	kamD->setStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+	kamD->setBildschirmPosition(405, 405);
+	kamD->setBildschirmSize(385, 385);
+	kamD->setPosition(Vec3<float>(0, -10, 0));
+	kamD->setRotation({ -(float)PI / 2.f, -(float)PI, 0 });
+	kamD->setWelt(dynamic_cast<Welt3D*>(welt->getThis()));
+	b->addKamera(kamD);
+
+	LTDSDatei dat;
+	dat.setPfad(new Text("normal.ltds"));
+	dat.leseDaten();
+	Schrift *schrift = dat.ladeSchrift();
+	TextFeld *kamPos = new TextFeld();
+	kamPos->setSchriftZ(schrift);
+	kamPos->setPosition(810, 10);
+	kamPos->setSize(200, 200);
+	kamPos->setText("Kamera Position");
+	kamPos->setStyle(TextFeld::Style::Text);
+	b->addMember(kamPos);
+
+	LRahmen* kamAR = new LRahmen();
+	kamAR->setPosition(10, 10);
+	kamAR->setFarbe(0xFFFFFFFF);
+	kamAR->setRamenBreite(1);
+	kamAR->setSize(385, 385);
+	b->addMember(kamAR);
+	LRahmen* kamBR = new LRahmen();
+	kamBR->setPosition(404, 10);
+	kamBR->setFarbe(0xFFFFFFFF);
+	kamBR->setRamenBreite(1);
+	kamBR->setSize(385, 385);
+	b->addMember(kamBR);
+	LRahmen* kamCR = new LRahmen();
+	kamCR->setPosition(10, 405);
+	kamCR->setFarbe(0xFFFFFFFF);
+	kamCR->setRamenBreite(1);
+	kamCR->setSize(385, 385);
+	b->addMember(kamCR);
+	LRahmen* kamDR = new LRahmen();
+	kamDR->setPosition(405, 405);
+	kamDR->setFarbe(0xFFFFFFFF);
+	kamDR->setRamenBreite(1);
+	kamDR->setSize(385, 385);
+	b->addMember(kamDR);
+
+	// Render Loop starten
+	RenderTh* r = new RenderTh();
+	r->setMaxFps(10000);
+	r->setBildschirm(dynamic_cast<Bildschirm*>(b->getThis()));
+	r->setTickFunktion([b, kamD, kamA, kamB, kamC, kamPos](void*, void*, double t)
+		{
+			if (Framework::getTastenStand('1'))
+			{
+				kamA->setStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+				kamB->removeStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+				kamC->removeStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+				kamD->removeStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+			}
+			if (Framework::getTastenStand('2'))
+			{
+				kamA->removeStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+				kamB->setStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+				kamC->removeStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+				kamD->removeStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+			}
+			if (Framework::getTastenStand('3'))
+			{
+				kamA->removeStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+				kamB->removeStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+				kamC->setStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+				kamD->removeStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+			}
+			if (Framework::getTastenStand('4'))
+			{
+				kamA->removeStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+				kamB->removeStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+				kamC->removeStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+				kamD->setStyle(Kam3D::Style::Movable | Kam3D::Style::Rotatable | Kam3D::Style::Tick);
+			}
+			Text txt = Text("A: ") + kamA->getWorldPosition().x + ", " + kamA->getWorldPosition().y + ", " + kamA->getWorldPosition().z + "\n";
+			txt += Text("B: ") + kamB->getWorldPosition().x + ", " + kamB->getWorldPosition().y + ", " + kamB->getWorldPosition().z + "\n";
+			txt += Text("C: ") + kamC->getWorldPosition().x + ", " + kamC->getWorldPosition().y + ", " + kamC->getWorldPosition().z + "\n";
+			txt += Text("D: ") + kamD->getWorldPosition().x + ", " + kamD->getWorldPosition().y + ", " + kamD->getWorldPosition().z + "\n";
+			kamPos->setText(txt);
+		});
+	r->beginn();
+
+	// Nachrichten Loop starten und warten
+	StartNachrichtenSchleife();
+
+	// Speicher Freigeben
+	r->beenden();
+	r->release();
+	b->release();
+	f->setBildschirm(0);
+	f->zerstören();
+	f->release();
+	welt->release();
+
+	return 0;
 }

BIN
3DCreator/m3/blocks.m3


BIN
3DCreator/m3/items.m3


BIN
3DCreator/models.m3


BIN
3DCreator/normal.ltds


BIN
3DCreator/tex/blocks.ltdb


BIN
3DCreator/tex/items.ltdb