Browse Source

changes for factory craft

Kolja Strohm 1 year ago
parent
commit
cd65ccd446
3 changed files with 561 additions and 481 deletions
  1. BIN
      3DCreator/Framework.dll
  2. 561 481
      3DCreator/Start.cpp
  3. BIN
      3DCreator/m3/blocks.m3

BIN
3DCreator/Framework.dll


+ 561 - 481
3DCreator/Start.cpp

@@ -1,24 +1,23 @@
-#include <main.h>
-#include <Fenster.h>
+#include <Bild.h>
 #include <Bildschirm.h>
-#include <RenderThread.h>
-#include <Welt3D.h>
 #include <Cube.h>
-#include <Kam3D.h>
-#include <Bild.h>
-#include <Rahmen.h>
-#include <Textur.h>
-#include <Model3D.h>
-#include <Model3DList.h>
-#include <DXBuffer.h>
 #include <DateiSystem.h>
-#include <M3Datei.h>
+#include <DXBuffer.h>
+#include <Fenster.h>
 #include <GraphicsApi.h>
-#include <Mat4.h>
+#include <Kam3D.h>
 #include <M3Datei.h>
+#include <main.h>
+#include <Mat4.h>
+#include <Model3D.h>
+#include <Model3DList.h>
 #include <ObjFile.h>
-#include <Vec3.h>
+#include <Rahmen.h>
+#include <RenderThread.h>
 #include <TextFeld.h>
+#include <Textur.h>
+#include <Vec3.h>
+#include <Welt3D.h>
 
 #define ambient  0.4f
 #define diffus   0.3f
@@ -26,496 +25,577 @@
 
 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> lft,
+    Vec3<float> rft,
+    Vec3<float> lfb,
+    Vec3<float> rfb,
+    Vec3<float> lbt,
+    Vec3<float> rbt,
+    Vec3<float> lbb,
+    Vec3<float> rbb,
+    Model3DData* zModel)
 {
-	// 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);
+    // front
+    vertecies[startIndex].pos = lft;
+    vertecies[startIndex].tPos = Vec2<float>(0.f, 0.f);
+    vertecies[startIndex + 1].pos = rft;
+    vertecies[startIndex + 1].tPos = Vec2<float>(1.f, 0.f);
+    vertecies[startIndex + 2].pos = lfb;
+    vertecies[startIndex + 2].tPos = Vec2<float>(0.f, 1.f);
+    vertecies[startIndex + 3].pos = rfb;
+    vertecies[startIndex + 3].tPos = Vec2<float>(1.f, 1.f);
+    // back
+    vertecies[startIndex + 4].pos = rbt;
+    vertecies[startIndex + 4].tPos = Vec2<float>(0.0f, 0.0f);
+    vertecies[startIndex + 5].pos = lbt;
+    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 = lbt;
+    vertecies[startIndex + 8].tPos = Vec2<float>(1.f, 0.f);
+    vertecies[startIndex + 9].pos = lft;
+    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 = lfb;
+    vertecies[startIndex + 11].tPos = Vec2<float>(0.f, 1.f);
+    // right
+    vertecies[startIndex + 12].pos = rft;
+    vertecies[startIndex + 12].tPos = Vec2<float>(0.0f, 0.0f);
+    vertecies[startIndex + 13].pos = rbt;
+    vertecies[startIndex + 13].tPos = Vec2<float>(1.0f, 0.0f);
+    vertecies[startIndex + 14].pos = rfb;
+    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 = lbt;
+    vertecies[startIndex + 16].tPos = Vec2<float>(0.f, 0.f);
+    vertecies[startIndex + 17].pos = rbt;
+    vertecies[startIndex + 17].tPos = Vec2<float>(1.f, 0.f);
+    vertecies[startIndex + 18].pos = lft;
+    vertecies[startIndex + 18].tPos = Vec2<float>(0.f, 1.f);
+    vertecies[startIndex + 19].pos = rft;
+    vertecies[startIndex + 19].tPos = Vec2<float>(1.f, 1.f);
+    // botom
+    vertecies[startIndex + 20].pos = lfb;
+    vertecies[startIndex + 20].tPos = Vec2<float>(0.0f, 0.0f);
+    vertecies[startIndex + 21].pos = rfb;
+    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 + 1;
+    p->indexList[2] = startIndex + 2;
+    p->indexList[3] = startIndex + 1;
+    p->indexList[4] = startIndex + 3;
+    p->indexList[5] = startIndex + 2;
+    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 + 1 + 8;
+    p->indexList[2] = startIndex + 2 + 8;
+    p->indexList[3] = startIndex + 1 + 8;
+    p->indexList[4] = startIndex + 3 + 8;
+    p->indexList[5] = startIndex + 2 + 8;
+    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 + 1 + 4;
+    p->indexList[2] = startIndex + 2 + 4;
+    p->indexList[3] = startIndex + 1 + 4;
+    p->indexList[4] = startIndex + 3 + 4;
+    p->indexList[5] = startIndex + 2 + 4;
+    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 + 1 + 12;
+    p->indexList[2] = startIndex + 2 + 12;
+    p->indexList[3] = startIndex + 1 + 12;
+    p->indexList[4] = startIndex + 3 + 12;
+    p->indexList[5] = startIndex + 2 + 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 + 1 + 16;
+    p->indexList[2] = startIndex + 2 + 16;
+    p->indexList[3] = startIndex + 1 + 16;
+    p->indexList[4] = startIndex + 3 + 16;
+    p->indexList[5] = startIndex + 2 + 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 + 1 + 20;
+    p->indexList[2] = startIndex + 2 + 20;
+    p->indexList[3] = startIndex + 1 + 20;
+    p->indexList[4] = startIndex + 3 + 20;
+    p->indexList[5] = startIndex + 2 + 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.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);
+    float left, right, top, bottom;
+    // Calculate the screen coordinates of the left side of the bitmap.
+    left = pos.x + size.x;
+    // Calculate the screen coordinates of the right side of the bitmap.
+    right = pos.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 Block : public Model3D
 {
 public:
-	// 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;
-	}
+    // 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, 0xFF5050FF);
+        textur->setPolygonTextur(
+            1, zApi->createOrGetTextur("blockC", b)); // left
+        b = new Bild();
+        b->neuBild(10, 10, 0xFFA02020);
+        textur->setPolygonTextur(
+            2, zApi->createOrGetTextur("blockB", b)); // back
+        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 ObjModel : public Model3D
 {
 private:
-	Text modelName;
+    Text modelName;
 
 public:
-	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);
-	}
+    ObjModel(GraphicsApi* zApi, Text path, Text textur, Text modelName)
+        : Model3D()
+    {
+        M3Datei d("m3/blocks.m3");
+        Model3DData* data = 0;
+        d.leseDaten();
+        Text* p = path.getTeilText(
+            0, path.positionVon(".obj/", path.anzahlVon(".obj/") - 1) + 4);
+        if (d.hatModel(modelName))
+        {
+            data = d.ladeModel(modelName, zApi, *p);
+        }
+        else
+        {
+            ObjFile file(p->getText());
+            data = zApi->createModel(path);
+            file.loadModel(path.getText() + p->getLength() + 1, data);
+        }
+        p->release();
+        data->setAmbientFactor(ambient);
+        data->setDiffusFactor(diffus);
+        data->setSpecularFactor(specular);
+        setModelDaten(data);
+        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)
 {
-	// Stoppe Nachrichten Loop
-	StopNachrichtenSchleife(((WFenster*)f)->getFensterHandle());
+    // Stoppe Nachrichten Loop
+    StopNachrichtenSchleife(((WFenster*)f)->getFensterHandle());
 }
 
 int __stdcall Framework::Start(Startparam p)
 {
-	// 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;
+    // 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/torch.png",
+        "torch");
+    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