Răsfoiți Sursa

Merge pull request #3 from CrystalPointA4/johan_linuxrefactor

Johan linuxrefactor
Janco Kock 9 ani în urmă
părinte
comite
47c228205a
61 a modificat fișierele cu 3361 adăugiri și 721 ștergeri
  1. 6 0
      .idea/.gitignore
  2. 15 0
      CMakeLists.txt
  3. 0 12
      Controller.cpp
  4. 0 10
      Controller.h
  5. 106 0
      CrystalJohan.cpp
  6. 35 0
      CrystalJohan.h
  7. 28 0
      CrystalJohan.sln
  8. 30 37
      CrystalJohan.vcxproj
  9. 90 0
      CrystalJohan.vcxproj.filters
  10. 0 28
      CrystalPoint.sln
  11. 0 129
      CrystalPoint.vcxproj.filters
  12. 0 2
      Enemy.h
  13. 48 0
      Entity.cpp
  14. 23 0
      Entity.h
  15. 0 20
      Header.h
  16. 0 12
      Keyboard.cpp
  17. 0 10
      Keyboard.h
  18. 20 0
      LevelObject.cpp
  19. 13 0
      LevelObject.h
  20. 0 12
      LoadingState.cpp
  21. 0 10
      LoadingState.h
  22. 50 152
      Main.cpp
  23. 0 0
      Main.h
  24. 0 12
      MenuState.cpp
  25. 0 10
      MenuState.h
  26. 96 6
      Model.cpp
  27. 20 5
      Model.h
  28. 0 32
      ModelLoader.cpp
  29. 0 10
      ModelLoader.h
  30. 0 12
      Mouse.cpp
  31. 0 10
      Mouse.h
  32. 16 29
      Player.cpp
  33. 19 22
      Player.h
  34. 0 2
      README.md
  35. 40 0
      ReadMe.txt
  36. 13 0
      Singleton.h
  37. 0 12
      State.cpp
  38. 0 10
      State.h
  39. 0 12
      StateHandler.cpp
  40. 0 10
      StateHandler.h
  41. 17 2
      Vector.cpp
  42. 5 3
      Vector.h
  43. 0 28
      Weapon.cpp
  44. 0 16
      Weapon.h
  45. 82 0
      World.cpp
  46. 22 0
      World.h
  47. 0 12
      WorldModel.cpp
  48. 0 10
      WorldModel.h
  49. 0 12
      WorldState.cpp
  50. 0 10
      WorldState.h
  51. 730 0
      json.cpp
  52. 124 0
      json.h
  53. BIN
      models/HANDVAT.png
  54. 134 0
      models/TextureZwaard.mtl
  55. 436 0
      models/TextureZwaard.obj
  56. BIN
      models/ZWAARD.png
  57. 192 0
      models/boom/Boom.mtl
  58. 243 0
      models/boom/Boom.obj
  59. 16 0
      models/portal_blue.mtl
  60. 676 0
      models/portal_blue.obj
  61. 16 0
      worlds/world1.json

+ 6 - 0
.idea/.gitignore

@@ -0,0 +1,6 @@
+/workspace.xml
+/vcs.xml
+/modules.xml
+/misc.xml
+/encodings.xml
+/CrystalPoint.iml

+ 15 - 0
CMakeLists.txt

@@ -0,0 +1,15 @@
+cmake_minimum_required(VERSION 3.5)
+project(CrystalPoint)
+
+file(GLOB SOURCE_FILES
+        "*.h"
+        "*.cpp"
+        )
+
+add_executable(CrystalPoint ${SOURCE_FILES})
+
+find_package(OpenGL REQUIRED)
+find_package(GLUT REQUIRED)
+include_directories( ${OPENGL_INCLUDE_DIRS}  ${GLUT_INCLUDE_DIRS} )
+target_link_libraries(CrystalPoint ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} )
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall ")

+ 0 - 12
Controller.cpp

@@ -1,12 +0,0 @@
-#include "Controller.h"
-
-
-
-Controller::Controller()
-{
-}
-
-
-Controller::~Controller()
-{
-}

+ 0 - 10
Controller.h

@@ -1,10 +0,0 @@
-#pragma once
-#include "Header.h"
-
-class Controller
-{
-public:
-	Controller();
-	~Controller();
-};
-

+ 106 - 0
CrystalJohan.cpp

@@ -0,0 +1,106 @@
+
+#include "CrystalJohan.h"
+#include <GL/freeglut.h>
+#include <cmath>
+#include <cstring>
+#include "World.h"
+
+void CrystalJohan::init()
+{
+	world = new World();
+	lastFrameTime = 0;
+
+	glClearColor(0.7, 0.7, 1.0, 1.0);
+	glEnable(GL_DEPTH_TEST);
+	glEnable(GL_LIGHTING);
+	glEnable(GL_LIGHT0);
+
+	mousePosition = Vec2f(width / 2, height / 2);
+}
+
+
+void CrystalJohan::draw()
+{
+	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+	//Draw world
+	glEnable(GL_LIGHTING);
+	glEnable(GL_DEPTH_TEST);
+
+	glMatrixMode(GL_PROJECTION);
+	glLoadIdentity();
+	gluPerspective(70, width / (float)height, 0.1f, 100);
+	glMatrixMode(GL_MODELVIEW);
+	glLoadIdentity();
+
+	world->draw();
+	
+	//Draw Cursor
+	glMatrixMode(GL_PROJECTION);
+	glLoadIdentity();
+	glOrtho(0,width, height,0,-10,10);
+	glMatrixMode(GL_MODELVIEW);
+	glLoadIdentity();
+
+	glDisable(GL_LIGHTING);
+	glDisable(GL_DEPTH_TEST);
+	glColor4f(1, cos(glutGet(GLUT_ELAPSED_TIME) / 1000.0f), sin(glutGet(GLUT_ELAPSED_TIME) / 1000.0f), 1);
+	glBegin(GL_TRIANGLES);
+	glVertex2f(mousePosition.x, mousePosition.y);
+	glVertex2f(mousePosition.x+15, mousePosition.y+15);
+	glVertex2f(mousePosition.x+5, mousePosition.y+20);
+
+	glEnd();
+
+
+
+	glutSwapBuffers();
+
+
+}
+
+
+void CrystalJohan::update()
+{
+	float frameTime = glutGet(GLUT_ELAPSED_TIME) / 1000.0f;
+	float deltaTime = frameTime - lastFrameTime;
+	lastFrameTime = frameTime;
+
+	//	if(keyboardState.special[GLUT_KEY_LEFT] && !prevKeyboardState.special[GLUT_KEY_LEFT])
+	if (keyboardState.keys[27])
+		exit(0);
+
+
+	world->player.rotation.y += mouseOffset.x / 10.0f;
+	world->player.rotation.x += mouseOffset.y / 10.0f;
+	if (world->player.rotation.x > 90)
+		world->player.rotation.x = 90;
+	if (world->player.rotation.x < -90)
+		world->player.rotation.x = -90;
+
+
+	Vec3f oldPosition = world->player.position;
+	if (keyboardState.keys['a']) world->player.setPosition(0, deltaTime, false);
+	if (keyboardState.keys['d']) world->player.setPosition(180, deltaTime, false);
+	if (keyboardState.keys['w']) world->player.setPosition(90, deltaTime, false);
+	if (keyboardState.keys['s']) world->player.setPosition(270, deltaTime, false);
+	if (keyboardState.keys['q']) world->player.setPosition(1, deltaTime, true);
+	if (keyboardState.keys['e']) world->player.setPosition(-1, deltaTime, true);
+	if (!world->isPlayerPositionValid())
+		world->player.position = oldPosition;
+
+
+	mousePosition = mousePosition + mouseOffset;
+
+	mouseOffset = Vec2f(0, 0);
+	prevKeyboardState = keyboardState;
+	glutPostRedisplay();
+}
+
+
+
+KeyboardState::KeyboardState()
+{
+	memset(keys, 0, sizeof(keys));
+	memset(special, 0, sizeof(special));
+}

+ 35 - 0
CrystalJohan.h

@@ -0,0 +1,35 @@
+#pragma once
+
+class World;
+#include "Vector.h"
+
+class KeyboardState
+{
+public:
+	bool keys[256];
+	bool special[256];
+	bool control, shift, alt;
+
+	KeyboardState();
+};
+
+class CrystalJohan
+{
+public:
+	void init();
+	void draw();
+	void update();
+
+	World* world;
+
+	int width, height;
+	KeyboardState keyboardState;
+	KeyboardState prevKeyboardState;
+
+	Vec2f mouseOffset;
+
+	Vec2f mousePosition;
+
+	float lastFrameTime;
+
+};

+ 28 - 0
CrystalJohan.sln

@@ -0,0 +1,28 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.24720.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CrystalJohan", "CrystalJohan.vcxproj", "{98776A7C-CD7A-4C62-946A-2263C27E9690}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{98776A7C-CD7A-4C62-946A-2263C27E9690}.Debug|x64.ActiveCfg = Debug|x64
+		{98776A7C-CD7A-4C62-946A-2263C27E9690}.Debug|x64.Build.0 = Debug|x64
+		{98776A7C-CD7A-4C62-946A-2263C27E9690}.Debug|x86.ActiveCfg = Debug|Win32
+		{98776A7C-CD7A-4C62-946A-2263C27E9690}.Debug|x86.Build.0 = Debug|Win32
+		{98776A7C-CD7A-4C62-946A-2263C27E9690}.Release|x64.ActiveCfg = Release|x64
+		{98776A7C-CD7A-4C62-946A-2263C27E9690}.Release|x64.Build.0 = Release|x64
+		{98776A7C-CD7A-4C62-946A-2263C27E9690}.Release|x86.ActiveCfg = Release|Win32
+		{98776A7C-CD7A-4C62-946A-2263C27E9690}.Release|x86.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

+ 30 - 37
CrystalPoint.vcxproj → CrystalJohan.vcxproj

@@ -19,9 +19,9 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{4986BEC0-4362-46E4-A18D-65587FA97967}</ProjectGuid>
+    <ProjectGuid>{98776A7C-CD7A-4C62-946A-2263C27E9690}</ProjectGuid>
     <Keyword>Win32Proj</Keyword>
-    <RootNamespace>CrystalPoint</RootNamespace>
+    <RootNamespace>CrystalJohan</RootNamespace>
     <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
@@ -83,11 +83,11 @@
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
       <Optimization>Disabled</Optimization>
       <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile />
       <AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
@@ -98,11 +98,11 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <ClCompile>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
       <Optimization>Disabled</Optimization>
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile />
       <AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
@@ -114,12 +114,12 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <ClCompile>
       <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile />
       <AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
@@ -133,12 +133,12 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <ClCompile>
       <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile />
       <AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
@@ -150,40 +150,33 @@
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
-    <ClInclude Include="Controller.h" />
-    <ClInclude Include="Enemy.h" />
-    <ClInclude Include="Header.h" />
-    <ClInclude Include="Keyboard.h" />
-    <ClInclude Include="LoadingState.h" />
-    <ClInclude Include="MenuState.h" />
-    <ClInclude Include="Model.h" />
-    <ClInclude Include="ModelLoader.h" />
-    <ClInclude Include="Mouse.h" />
-    <ClInclude Include="Player.h" />
-    <ClInclude Include="State.h" />
-    <ClInclude Include="StateHandler.h" />
-    <ClInclude Include="Vector.h" />
-    <ClInclude Include="Weapon.h" />
-    <ClInclude Include="WorldModel.h" />
-    <ClInclude Include="WorldState.h" />
+    <Text Include="ReadMe.txt" />
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="Controller.cpp" />
+    <ClCompile Include="CrystalJohan.cpp" />
     <ClCompile Include="Enemy.cpp" />
-    <ClCompile Include="Keyboard.cpp" />
-    <ClCompile Include="LoadingState.cpp" />
+    <ClCompile Include="Entity.cpp" />
+    <ClCompile Include="json.cpp" />
+    <ClCompile Include="LevelObject.cpp" />
     <ClCompile Include="Main.cpp" />
-    <ClCompile Include="MenuState.cpp" />
     <ClCompile Include="Model.cpp" />
-    <ClCompile Include="ModelLoader.cpp" />
-    <ClCompile Include="Mouse.cpp" />
     <ClCompile Include="Player.cpp" />
-    <ClCompile Include="State.cpp" />
-    <ClCompile Include="StateHandler.cpp" />
     <ClCompile Include="Vector.cpp" />
-    <ClCompile Include="Weapon.cpp" />
-    <ClCompile Include="WorldModel.cpp" />
-    <ClCompile Include="WorldState.cpp" />
+    <ClCompile Include="World.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="CrystalJohan.h" />
+    <ClInclude Include="Enemy.h" />
+    <ClInclude Include="Entity.h" />
+    <ClInclude Include="json.h" />
+    <ClInclude Include="LevelObject.h" />
+    <ClInclude Include="Main.h" />
+    <ClInclude Include="Model.h" />
+    <ClInclude Include="Player.h" />
+    <ClInclude Include="Singleton.h" />
+    <ClInclude Include="stb_image.h" />
+    <ClInclude Include="vector.h" />
+    <ClInclude Include="World.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">

+ 90 - 0
CrystalJohan.vcxproj.filters

@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <Text Include="ReadMe.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="CrystalJohan.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Main.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="World.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Entity.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Enemy.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="LevelObject.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Model.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Vector.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Player.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="json.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="CrystalJohan.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="World.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Entity.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Enemy.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="LevelObject.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="vector.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Model.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="stb_image.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Player.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Singleton.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Main.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="json.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+</Project>

+ 0 - 28
CrystalPoint.sln

@@ -1,28 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.24720.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CrystalPoint", "CrystalPoint.vcxproj", "{4986BEC0-4362-46E4-A18D-65587FA97967}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|x64 = Debug|x64
-		Debug|x86 = Debug|x86
-		Release|x64 = Release|x64
-		Release|x86 = Release|x86
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{4986BEC0-4362-46E4-A18D-65587FA97967}.Debug|x64.ActiveCfg = Debug|x64
-		{4986BEC0-4362-46E4-A18D-65587FA97967}.Debug|x64.Build.0 = Debug|x64
-		{4986BEC0-4362-46E4-A18D-65587FA97967}.Debug|x86.ActiveCfg = Debug|Win32
-		{4986BEC0-4362-46E4-A18D-65587FA97967}.Debug|x86.Build.0 = Debug|Win32
-		{4986BEC0-4362-46E4-A18D-65587FA97967}.Release|x64.ActiveCfg = Release|x64
-		{4986BEC0-4362-46E4-A18D-65587FA97967}.Release|x64.Build.0 = Release|x64
-		{4986BEC0-4362-46E4-A18D-65587FA97967}.Release|x86.ActiveCfg = Release|Win32
-		{4986BEC0-4362-46E4-A18D-65587FA97967}.Release|x86.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal

+ 0 - 129
CrystalPoint.vcxproj.filters

@@ -1,129 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
-    </Filter>
-    <Filter Include="Source Files\State">
-      <UniqueIdentifier>{6c99658e-2c17-469b-a3d1-2c4d3d61d440}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Source Files\Control">
-      <UniqueIdentifier>{e444364a-17f6-4464-a98c-6bd34d3e6263}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Source Files\Model">
-      <UniqueIdentifier>{842778c9-ff0f-4a6d-9c86-0a178ad40fcc}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Source Files\Model\Enemy">
-      <UniqueIdentifier>{1be14b84-6fa7-4cfb-94b9-666f3ee14198}</UniqueIdentifier>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="Model.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="ModelLoader.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Header.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="StateHandler.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="State.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="MenuState.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="LoadingState.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Keyboard.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Mouse.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Controller.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="WorldModel.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="WorldState.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Enemy.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Player.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Weapon.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Vector.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="Main.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="StateHandler.cpp">
-      <Filter>Source Files\State</Filter>
-    </ClCompile>
-    <ClCompile Include="State.cpp">
-      <Filter>Source Files\State</Filter>
-    </ClCompile>
-    <ClCompile Include="MenuState.cpp">
-      <Filter>Source Files\State</Filter>
-    </ClCompile>
-    <ClCompile Include="Keyboard.cpp">
-      <Filter>Source Files\Control</Filter>
-    </ClCompile>
-    <ClCompile Include="Mouse.cpp">
-      <Filter>Source Files\Control</Filter>
-    </ClCompile>
-    <ClCompile Include="Controller.cpp">
-      <Filter>Source Files\Control</Filter>
-    </ClCompile>
-    <ClCompile Include="LoadingState.cpp">
-      <Filter>Source Files\State</Filter>
-    </ClCompile>
-    <ClCompile Include="Model.cpp">
-      <Filter>Source Files\Model</Filter>
-    </ClCompile>
-    <ClCompile Include="ModelLoader.cpp">
-      <Filter>Source Files\Model</Filter>
-    </ClCompile>
-    <ClCompile Include="WorldModel.cpp">
-      <Filter>Source Files\Model</Filter>
-    </ClCompile>
-    <ClCompile Include="WorldState.cpp">
-      <Filter>Source Files\State</Filter>
-    </ClCompile>
-    <ClCompile Include="Enemy.cpp">
-      <Filter>Source Files\Model\Enemy</Filter>
-    </ClCompile>
-    <ClCompile Include="Player.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="Weapon.cpp">
-      <Filter>Source Files\Model</Filter>
-    </ClCompile>
-    <ClCompile Include="Vector.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-</Project>

+ 0 - 2
Enemy.h

@@ -1,6 +1,4 @@
 #pragma once
-#include "Header.h"
-
 class Enemy
 {
 public:

+ 48 - 0
Entity.cpp

@@ -0,0 +1,48 @@
+#include "Entity.h"
+#include "cmath"
+#include <GL/freeglut.h>
+#include "Model.h"
+
+
+Entity::Entity()
+{
+	model = NULL;
+	scale = 1;
+	canCollide = true;
+}
+
+
+Entity::~Entity()
+{
+}
+
+
+void Entity::draw()
+{
+	if (model)
+	{
+		glPushMatrix();
+
+		glTranslatef(position.x, position.y, position.z);
+		glRotatef(rotation.x, 1, 0, 0);
+		glRotatef(rotation.y, 0, 1, 0);
+		glRotatef(rotation.z, 0, 0, 1);
+		glScalef(scale, scale, scale);
+
+		model->draw();
+		glPopMatrix();
+	}
+
+}
+
+bool Entity::inObject(const Vec3f & point)
+{
+	if (!model)
+		return false;
+	Vec3f center = position + model->center;
+	float distance = sqrt((point.x - center.x) * (point.x - center.x) + (point.z - center.z)*(point.z - center.z));
+	if (distance < model->radius*scale)
+		return true;
+	return false;
+}
+

+ 23 - 0
Entity.h

@@ -0,0 +1,23 @@
+#pragma once
+
+#include "Vector.h"
+class Model;
+
+class Entity
+{
+public:
+	Entity();
+	~Entity();
+
+	Model* model;
+
+	virtual void draw();
+	virtual void update(float elapsedTime) {};
+	Vec3f position;
+	Vec3f rotation;
+	float scale;
+
+	bool canCollide;
+	bool inObject(const Vec3f &position);
+};
+

+ 0 - 20
Header.h

@@ -1,20 +0,0 @@
-#pragma once
-
-#include <GL/freeglut.h>
-
-#define _USE_MATH_DEFINES
-#include <cmath>
-#include <math.h>
-
-#include <string>
-#include <vector>
-#include <list>
-#include <fstream>
-#include <iostream>
-#include <algorithm>
-#include <vector>
-
-#include <windows.h>
-#include <gl/GL.h>
-
-using namespace std;

+ 0 - 12
Keyboard.cpp

@@ -1,12 +0,0 @@
-#include "Keyboard.h"
-
-
-
-Keyboard::Keyboard()
-{
-}
-
-
-Keyboard::~Keyboard()
-{
-}

+ 0 - 10
Keyboard.h

@@ -1,10 +0,0 @@
-#pragma once
-#include "Header.h"
-
-class Keyboard
-{
-public:
-	Keyboard();
-	~Keyboard();
-};
-

+ 20 - 0
LevelObject.cpp

@@ -0,0 +1,20 @@
+#include "LevelObject.h"
+
+#include "Model.h"
+
+
+LevelObject::LevelObject(const std::string &fileName, const Vec3f &position, const Vec3f &rotation, const float &scale, const bool &hasCollision)
+{
+	model = Model::load(fileName);
+	this->position = position;
+	this->rotation = rotation;
+	this->scale = scale;
+	this->canCollide = hasCollision;
+}
+
+
+LevelObject::~LevelObject()
+{
+	if (model)
+		Model::unload(model);
+}

+ 13 - 0
LevelObject.h

@@ -0,0 +1,13 @@
+#pragma once
+
+#include "Entity.h"
+#include <string>
+
+
+class LevelObject : public Entity
+{
+public:
+	LevelObject(const std::string &fileName, const Vec3f &position, const Vec3f &rotation, const float &scale, const bool &hasCollision);
+	~LevelObject();
+};
+

+ 0 - 12
LoadingState.cpp

@@ -1,12 +0,0 @@
-#include "LoadingState.h"
-
-
-
-LoadingState::LoadingState()
-{
-}
-
-
-LoadingState::~LoadingState()
-{
-}

+ 0 - 10
LoadingState.h

@@ -1,10 +0,0 @@
-#pragma once
-#include "Header.h"
-
-class LoadingState
-{
-public:
-	LoadingState();
-	~LoadingState();
-};
-

+ 50 - 152
Main.cpp

@@ -1,143 +1,52 @@
-#include "Header.h"
-#include "Model.h"
-#include "Player.h"
+#include <GL/freeglut.h>
 
-//Prototypes
-void bindFuncOpenGL(void);
-void configureOpenGL(void);
-void loadModels(void);
-
-static int Width;
-static int Height;
-
-float lastFrameTime = 0;
-bool keys[255];
-
-//vector<Model*> models;
-//int currentModel = 0;
+#include "CrystalJohan.h"
+#include <stdio.h>
+#include "Vector.h"
 
-Player *player;
-
-void display()
-{
-	glClearColor(0.6f, 0.6f, 1, 1);
-	glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
-
-	glMatrixMode(GL_PROJECTION);
-	glLoadIdentity();
-	gluPerspective(60.0f, (float)Width / Height, 0.5, 300);
-
-	glMatrixMode(GL_MODELVIEW);
-	glLoadIdentity();
-	/*glRotatef(player.eyes.rotX, 1, 0, 0);
-	glRotatef(player.eyes.rotY, 0, 1, 0);
-	glTranslatef(player.eyes.posX, player.eyes.posY, player.eyes.posZ);
-
-	glPushMatrix();
-	glScalef(0.5f, 0.5f, 0.5f);
-	glRotatef(180, 1, 0, 0);
-	glRotatef(45, 0, 0, 1);
-	glRotatef(90, 0, 1, 0);
-	models[currentModel]->draw();
-	glPopMatrix();*/
-
-	//Draw here	
-	player->Draw_Player();
-	
-	glutSolidCube(10.0);
-
-	glDisable(GL_TEXTURE_2D);
-	glutSwapBuffers();
-}
-
-void move(float angle, float fac, bool heigth)
-{
-	if (heigth)
-		player->eyes.posY += angle*fac;
-	else
-	{
-		player->eyes.posX += (float)cos((player->eyes.rotY + angle) / 180 * M_PI) * fac;
-		player->eyes.posZ += (float)sin((player->eyes.rotY + angle) / 180 * M_PI) * fac;
-	}
-}
-
-void idle()
-{
-	float frameTime = glutGet(GLUT_ELAPSED_TIME) / 1000.0f;
-	float deltaTime = frameTime - lastFrameTime;
-	lastFrameTime = frameTime;
-
-	float speed = 10;
-
-	if (keys['a']) move(0, deltaTime*speed, false);
-	if (keys['d']) move(180, deltaTime*speed, false);
-	if (keys['w']) move(90, deltaTime*speed, false);
-	if (keys['s']) move(270, deltaTime*speed, false);
-	if (keys['q']) move(1, deltaTime*speed, true);
-	if (keys['e']) move(-1, deltaTime*speed, true);	
-
-	glutPostRedisplay();
-}
+void configureOpenGL(void);
 
-void mousemotion(int x, int y)
-{
-	int dx = x - Width / 2;
-	int dy = y - Height / 2;
-	if ((dx != 0 || dy != 0) && abs(dx) < 400 && abs(dy) < 400)
-	{
-		player->eyes.rotY += dx / 10.0f;
-		player->eyes.rotX += dy / 10.0f;
-		glutWarpPointer(Width / 2, Height / 2);
-	}
-}
+CrystalJohan* app;
 
-void keyboard(unsigned char key, int, int)
-{
-	if (key == 27)
-		exit(0);	
-	//std::cout << key << std::endl;
-	keys[key] = true;
-}
-
-void keyboardup(unsigned char key, int, int)
-{
-	keys[key] = false;
-}
+bool justMoved = false;
 
 int main(int argc, char* argv[])
 {
-	//Init GLUT
+	app = new CrystalJohan();
 	glutInit(&argc, argv);
 
-	//Configre OpenGL and FreeGLut
 	configureOpenGL();
 
-	//Bind functions
-	bindFuncOpenGL();
-
-	//Init models
-	loadModels();
-
-	//Start the main loop
-	glutMainLoop();
-	return 0;
-}
+	app->init();
 
-void bindFuncOpenGL()
-{
-	glutDisplayFunc(display);
-	glutIdleFunc(idle);
-	glutReshapeFunc([](int w, int h) { Width = w; Height= h; glViewport(0, 0, w, h); });
+	glutDisplayFunc([]() { app->draw(); } );
+	glutIdleFunc([]() { app->update(); } );
+	glutReshapeFunc([](int w, int h) { app->width = w; app->height = h; glViewport(0, 0, w, h); });
 
 	//Keyboard
-	glutKeyboardFunc(keyboard);
-	glutKeyboardUpFunc(keyboardup);
-	//glutMouseFunc(mousefunc);
-
-	//Mouse
-	//glutMouseFunc(mouse);
-	glutPassiveMotionFunc(mousemotion);
+	glutKeyboardFunc([](unsigned char c, int, int) { app->keyboardState.keys[c] = true; });
+	glutKeyboardUpFunc([](unsigned char c, int, int) { app->keyboardState.keys[c] = false; });
 	
+	//Mouse
+	glutPassiveMotionFunc([](int x, int y)
+	{
+		if (justMoved)
+		{
+			justMoved = false;
+			return;
+		}
+		int dx = x - app->width / 2;
+		int dy = y - app->height / 2;
+		if ((dx != 0 || dy != 0) && abs(dx) < 400 && abs(dy) < 400)
+		{
+			app->mouseOffset = app->mouseOffset + Vec2f(dx,dy);
+			glutWarpPointer(app->width / 2, app->height / 2);
+			justMoved = true;
+		}
+	});
+
+	glutMainLoop();
+	return 0;
 }
 
 void configureOpenGL()
@@ -147,7 +56,6 @@ void configureOpenGL()
 	glutInitWindowSize(800, 600);
 	glutCreateWindow("Crystal Point");
 	glutFullScreen();
-	//glutPositionWindow((glutGet(GLUT_SCREEN_WIDTH) / 2) - (glutGet(GLUT_WINDOW_WIDTH) / 2), (glutGet(GLUT_SCREEN_HEIGHT) / 2) - (glutGet(GLUT_WINDOW_HEIGHT) / 2));
 
 	//Depth testing
 	glEnable(GL_DEPTH_TEST);
@@ -155,36 +63,26 @@ void configureOpenGL()
 	//Alpha blending
 	glEnable(GL_BLEND);
 	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-	
+
 	//Alpha testing
 	glEnable(GL_ALPHA_TEST);
 	glAlphaFunc(GL_GREATER, 0.01f);
 
 	//Lighting
-	GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
-	GLfloat mat_shininess[] = { 20.0 };
-	GLfloat light_position[] = { 30.0, 30.0, 30.0, 1.0 };
-	GLfloat light_diffuse[] = { 2.0, 2.0, 2.0, 1.0 };
-	GLfloat light_ambient[] = { 2.0, 2.0, 2.0, 1.0 };
-	glClearColor(0.0, 0.0, 0.0, 0.0);
-	glShadeModel(GL_SMOOTH);
-
-	glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
-	glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
-	glLightfv(GL_LIGHT0, GL_POSITION, light_position);
-	glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
-	glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
-
-	glEnable(GL_LIGHTING);
-	glEnable(GL_LIGHT0);
-
-	//Cursor
-	glutWarpPointer(Width / 2, Height / 2);
-	glutSetCursor(GLUT_CURSOR_CROSSHAIR);
-}
+	GLfloat mat_specular[] = { 0.2, 0.2, 0.2, 0 };
+	//GLfloat mat_shininess[] = { 5.0 };
+	GLfloat light_position[] = { 0.0, 2.0, 1.0, 0 };
+	GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 0 };
+	GLfloat light_ambient[] = { 0.3, 0.3, 0.3, 0 };
+	glClearColor(0.7, 0.7, 1.0, 1.0);
 
-void loadModels() 
-{
-	player = new Player();
-	//models.push_back(new Model("models/weapons/ZwaardMetTextures/TextureZwaard.obj"));
+	//glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+	//glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
+	//glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
+	//glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
+
+	//glEnable(GL_LIGHTING);
+	//glEnable(GL_LIGHT0);
+
+	glutSetCursor(GLUT_CURSOR_CROSSHAIR);
 }

+ 0 - 0
Main.h


+ 0 - 12
MenuState.cpp

@@ -1,12 +0,0 @@
-#include "MenuState.h"
-
-
-
-MenuState::MenuState()
-{
-}
-
-
-MenuState::~MenuState()
-{
-}

+ 0 - 10
MenuState.h

@@ -1,10 +0,0 @@
-#pragma once
-#include "Header.h"
-
-class MenuState
-{
-public:
-	MenuState();
-	~MenuState();
-};
-

+ 96 - 6
Model.cpp

@@ -3,7 +3,18 @@
 #define STB_IMAGE_IMPLEMENTATION
 #include "stb_image.h"
 
-Model::Model(string fileName)
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <algorithm>
+#include <cmath>
+
+//Prototypes
+std::vector<std::string> split(std::string str, std::string sep);
+std::string replace(std::string str, std::string toReplace, std::string replacement);
+std::string toLower(std::string data);
+
+Model::Model(std::string fileName)
 {
 	std::string dirName = fileName;
 	if (dirName.rfind("/") != std::string::npos)
@@ -117,9 +128,6 @@ Model::~Model(void)
 {
 }
 
-
-
-
 void Model::draw()
 {
 	for (auto &g : groups)
@@ -164,6 +172,24 @@ void Model::draw()
 		}
 		glEnd();
 	}
+
+	minVertex = vertices[0];
+	maxVertex = vertices[0];
+	for (auto v : vertices)
+	{
+		for (int i = 0; i < 3; i++)
+		{
+			minVertex[i] = fmin(minVertex[i], v[i]);
+			maxVertex[i] = fmax(maxVertex[i], v[i]);
+		}
+	}
+	center = (minVertex + maxVertex) / 2.0f;
+	radius = 0;
+	for (auto v : vertices)
+		radius = fmax(radius, (center.x - v.x) * (center.x - v.x) + (center.z - v.z) * (center.z - v.z));
+	radius = sqrt(radius);
+
+
 }
 
 void Model::loadMaterialFile(std::string fileName, std::string dirName)
@@ -240,7 +266,6 @@ void Model::loadMaterialFile(std::string fileName, std::string dirName)
 
 Model::MaterialInfo::MaterialInfo()
 {
-	Texture *texture;
 	hasTexture = false;
 }
 
@@ -270,4 +295,69 @@ Model::Texture::Texture(const std::string & fileName)
 void Model::Texture::bind()
 {
 	glBindTexture(GL_TEXTURE_2D, index);
-}
+}
+
+std::string replace(std::string str, std::string toReplace, std::string replacement)
+{
+	size_t index = 0;
+	while (true)
+	{
+		index = str.find(toReplace, index);
+		if (index == std::string::npos)
+			break;
+		str.replace(index, toReplace.length(), replacement);
+		++index;
+	}
+	return str;
+}
+
+std::vector<std::string> split(std::string str, std::string sep)
+{
+	std::vector<std::string> ret;
+	size_t index;
+	while (true)
+	{
+		index = str.find(sep);
+		if (index == std::string::npos)
+			break;
+		ret.push_back(str.substr(0, index));
+		str = str.substr(index + 1);
+	}
+	ret.push_back(str);
+	return ret;
+}
+
+inline std::string toLower(std::string data)
+{
+	std::transform(data.begin(), data.end(), data.begin(), ::tolower);
+	return data;
+}
+
+
+
+std::map<std::string, std::pair<Model*, int>> Model::cache;
+
+Model* Model::load(const std::string &fileName)
+{
+	if (cache.find(fileName) == cache.end())
+		cache[fileName] = std::pair<Model*, int>(new Model(fileName), 0);
+	cache[fileName].second++;
+	return cache[fileName].first;
+}
+
+void Model::unload(Model* model)
+{
+	for (auto m : cache)
+	{
+		if (m.second.first == model)
+		{
+			m.second.second--;
+			if (m.second.second == 0)
+			{
+				delete m.second.first;
+				cache.erase(cache.find(m.first));
+			}
+
+		}
+	}
+}

+ 20 - 5
Model.h

@@ -1,6 +1,9 @@
 #pragma once
-#include "Header.h"
-#include "ModelLoader.h"
+
+#include <GL/freeglut.h>
+#include <list>
+#include <vector>
+#include <map>
 #include "Vector.h"
 
 class Model
@@ -17,7 +20,7 @@ private:
 	class Face
 	{
 	public:
-		list<Vertex> vertices;
+		std::list<Vertex> vertices;
 	};
 
 	class Texture
@@ -50,7 +53,7 @@ private:
 	public:
 		std::string name;
 		int materialIndex;
-		list<Face> faces;
+		std::list<Face> faces;
 	};
 
 	std::vector<Vec3f>	vertices;
@@ -60,9 +63,21 @@ private:
 	std::vector<MaterialInfo*> materials;
 
 	void loadMaterialFile(std::string fileName, std::string dirName);
-public:
+
 	Model(std::string filename);
 	~Model(void);
 
+public:
+
+	static std::map<std::string, std::pair<Model*, int> > cache;
+	static Model* load(const std::string &fileName);
+	static void unload(Model* model);
+
 	void draw();
+
+	Vec3f minVertex;
+	Vec3f maxVertex;
+
+	Vec3f center;
+	float radius;
 };

+ 0 - 32
ModelLoader.cpp

@@ -1,32 +0,0 @@
-#include "Header.h"
-#include "ModelLoader.h"
-
-string replace(string str, string toReplace, string replacement)
-{
-	size_t index = 0;
-	while (true)
-	{
-		index = str.find(toReplace, index);
-		if (index == std::string::npos)
-			break;
-		str.replace(index, toReplace.length(), replacement);
-		++index;
-	}
-	return str;
-}
-
-vector<string> split(string str, string sep)
-{
-	std::vector<std::string> ret;
-	size_t index;
-	while (true)
-	{
-		index = str.find(sep);
-		if (index == std::string::npos)
-			break;
-		ret.push_back(str.substr(0, index));
-		str = str.substr(index + 1);
-	}
-	ret.push_back(str);
-	return ret;
-}

+ 0 - 10
ModelLoader.h

@@ -1,10 +0,0 @@
-#pragma once
-#include "Header.h"
-
-string replace(string str, string toReplace, string replacement);
-vector<string> split(string str, string sep);
-inline string toLower(string data)
-{
-	std::transform(data.begin(), data.end(), data.begin(), ::tolower);
-	return data;
-}

+ 0 - 12
Mouse.cpp

@@ -1,12 +0,0 @@
-#include "Mouse.h"
-
-
-
-Mouse::Mouse()
-{
-}
-
-
-Mouse::~Mouse()
-{
-}

+ 0 - 10
Mouse.h

@@ -1,10 +0,0 @@
-#pragma once
-#include "Header.h"
-
-class Mouse
-{
-public:
-	Mouse();
-	~Mouse();
-};
-

+ 16 - 29
Player.cpp

@@ -1,41 +1,28 @@
+#define _USE_MATH_DEFINES
+#include <cmath>
 #include "Player.h"
-
-
+#include <GL/freeglut.h>
 
 Player::Player()
 {
-	right = new Weapon("models/weapons/ZwaardMetTextures/TextureZwaard.obj");
-	left = new Weapon("models/weapons/ZwaardMetTextures/TextureZwaard.obj");
+	speed = 10;
 }
 
-
-Player::~Player()
+void Player::setCamera()
 {
-	delete right;
-	delete left;
+	glRotatef(rotation.x, 1, 0, 0);
+	glRotatef(rotation.y, 0, 1, 0);
+	glTranslatef(-position.x, -position.y, -position.z);
+
 }
 
-void Player::Draw_Player(void)
+void Player::setPosition(float angle, float fac, bool height)
 {
-	if (right != nullptr)
-	{	
-		glPushMatrix();
-		glTranslatef(2.5f,0,-4.5f);
-		right->draw_weapon();		
-		glPopMatrix();
-	}
-		
-	if (left != nullptr)
+	if (height)
+		position.y += angle*fac;
+	else
 	{
-		glPushMatrix();
-		glTranslatef(-0.5f,0,-4.5f);
-		left->draw_weapon();
-		glPopMatrix();
-
+		position.x -= (float)cos((rotation.y + angle) / 180 * M_PI) * fac*speed;
+		position.z -= (float)sin((rotation.y + angle) / 180 * M_PI) * fac*speed;
 	}
-
-	glRotatef(eyes.rotX, 1, 0, 0);
-	glRotatef(eyes.rotY, 0, 1, 0);
-	glTranslatef(eyes.posX, eyes.posY, eyes.posZ);
-}
-
+}

+ 19 - 22
Player.h

@@ -1,28 +1,25 @@
 #pragma once
-#include "Header.h"
-#include "Weapon.h"
 
-class Player
+#include "Singleton.h"
+
+#include "Vector.h"
+
+class Model;
+
+class Player : public Singleton<Player>
 {
 public:
 	Player();
-	~Player();
-
-	struct Eyes
-	{
-		float posX = 0;
-		float posY = 0;
-		float posZ = 0;
-		float rotX = 0;
-		float rotY = 0;
-	} eyes;	
-
-	void Draw_Player(void);
-private:
-	int level;
-	int xp;
-	Weapon* right = nullptr;
-	Weapon* left = nullptr;
-	vector<Weapon> weapons;
-};
 
+	void setCamera();
+	void setPosition(float angle, float fac, bool height);
+
+	Vec3f position;
+	Vec2f rotation;
+
+	Model* leftWeapon;
+	Model* rightWeapon;
+
+
+	float speed;
+};

+ 0 - 2
README.md

@@ -1,2 +0,0 @@
-# CrystalPoint
-Crystal Point: The Elemental Labyrinth

+ 40 - 0
ReadMe.txt

@@ -0,0 +1,40 @@
+========================================================================
+    CONSOLE APPLICATION : CrystalJohan Project Overview
+========================================================================
+
+AppWizard has created this CrystalJohan application for you.
+
+This file contains a summary of what you will find in each of the files that
+make up your CrystalJohan application.
+
+
+CrystalJohan.vcxproj
+    This is the main project file for VC++ projects generated using an Application Wizard.
+    It contains information about the version of Visual C++ that generated the file, and
+    information about the platforms, configurations, and project features selected with the
+    Application Wizard.
+
+CrystalJohan.vcxproj.filters
+    This is the filters file for VC++ projects generated using an Application Wizard. 
+    It contains information about the association between the files in your project 
+    and the filters. This association is used in the IDE to show grouping of files with
+    similar extensions under a specific node (for e.g. ".cpp" files are associated with the
+    "Source Files" filter).
+
+CrystalJohan.cpp
+    This is the main application source file.
+
+/////////////////////////////////////////////////////////////////////////////
+Other standard files:
+
+StdAfx.h, StdAfx.cpp
+    These files are used to build a precompiled header (PCH) file
+    named CrystalJohan.pch and a precompiled types file named StdAfx.obj.
+
+/////////////////////////////////////////////////////////////////////////////
+Other notes:
+
+AppWizard uses "TODO:" comments to indicate parts of the source code you
+should add to or customize.
+
+/////////////////////////////////////////////////////////////////////////////

+ 13 - 0
Singleton.h

@@ -0,0 +1,13 @@
+#pragma once
+
+
+template <class T>
+class Singleton
+{
+public:
+	static T& getInstance()
+	{
+		static T* t = new T();
+		return *t;
+	}
+};

+ 0 - 12
State.cpp

@@ -1,12 +0,0 @@
-#include "State.h"
-
-
-
-State::State()
-{
-}
-
-
-State::~State()
-{
-}

+ 0 - 10
State.h

@@ -1,10 +0,0 @@
-#pragma once
-#include "Header.h"
-
-class State
-{
-public:
-	State();
-	~State();
-};
-

+ 0 - 12
StateHandler.cpp

@@ -1,12 +0,0 @@
-#include "StateHandler.h"
-
-
-
-StateHandler::StateHandler()
-{
-}
-
-
-StateHandler::~StateHandler()
-{
-}

+ 0 - 10
StateHandler.h

@@ -1,10 +0,0 @@
-#pragma once
-#include "Header.h"
-
-class StateHandler
-{
-public:
-	StateHandler();
-	~StateHandler();
-};
-

+ 17 - 2
Vector.cpp

@@ -12,7 +12,7 @@ Vec3f::Vec3f()
 	this->y = 0;
 	this->z = 0;
 }
-Vec3f::Vec3f(Vec3f &other)
+Vec3f::Vec3f(const Vec3f &other)
 {
 	this->x = other.x;
 	this->y = other.y;
@@ -24,6 +24,16 @@ float& Vec3f::operator [](int index)
 	return v[index];
 }
 
+Vec3f Vec3f::operator+(const Vec3f & other)
+{
+	return Vec3f(x + other.x, y + other.y, z + other.z);
+}
+
+Vec3f Vec3f::operator/(float value)
+{
+	return Vec3f(x / value, y / value, z / value);
+}
+
 
 
 Vec2f::Vec2f(float x, float y)
@@ -36,7 +46,7 @@ Vec2f::Vec2f()
 	this->x = 0;
 	this->y = 0;
 }
-Vec2f::Vec2f(Vec2f &other)
+Vec2f::Vec2f(const Vec2f &other)
 {
 	this->x = other.x;
 	this->y = other.y;
@@ -46,3 +56,8 @@ float& Vec2f::operator [](int index)
 {
 	return v[index];
 }
+
+Vec2f Vec2f::operator+(const Vec2f & other)
+{
+	return Vec2f(x + other.x, y+other.y);
+}

+ 5 - 3
Vector.h

@@ -1,5 +1,4 @@
 #pragma once
-#include "Header.h"
 
 class Vec3f
 {
@@ -13,9 +12,11 @@ public:
 		float v[3];
 	};
 	Vec3f();
-	Vec3f(Vec3f &other);
+	Vec3f(const Vec3f &other);
 	Vec3f(float x, float y, float z);
 	float& operator [](int);
+	Vec3f operator + (const Vec3f &other);
+	Vec3f operator / (float value);
 };
 
 class Vec2f
@@ -31,7 +32,8 @@ public:
 	};
 	Vec2f();
 	Vec2f(float x, float y);
-	Vec2f(Vec2f &other);
+	Vec2f(const Vec2f &other);
 	float& operator [](int);
+	Vec2f operator + (const Vec2f &other);
 };
 

+ 0 - 28
Weapon.cpp

@@ -1,28 +0,0 @@
-#include "Weapon.h"
-
-Weapon::Weapon(const string &filename)
-{
-	weaponModel = new Model(filename);
-}
-
-Weapon::Weapon()
-{
-
-}
-
-Weapon::~Weapon()
-{
-}
-
-void Weapon::draw_weapon(void)
-{
-	
-	if (weaponModel != nullptr)
-	{				
-		glScalef(scale,scale,scale);
-		glRotatef(135, 1, 0, 0);
-		weaponModel->draw();		
-	}		
-}
-
-

+ 0 - 16
Weapon.h

@@ -1,16 +0,0 @@
-#pragma once
-#include "Header.h"
-#include "Model.h"
-
-class Weapon
-{
-public:	
-	Weapon(const string &filename);
-	Weapon();
-	~Weapon();
-	void draw_weapon(void);
-private:
-	Model *weaponModel = nullptr;
-	float scale = 0.5f;	
-};
-

+ 82 - 0
World.cpp

@@ -0,0 +1,82 @@
+#include "World.h"
+#include <GL/freeglut.h>
+#include "Entity.h"
+#include "LevelObject.h"
+#include "json.h"
+#include <fstream>
+#include <iostream>
+
+World::World() : player(Player::getInstance())
+{
+	std::ifstream file("worlds/world1.json");
+	if(!file.is_open())
+		std::cout<<"Uhoh, can't open file\n";
+	json::Value v = json::readJson(file);
+	std::cout<<v;
+	file.close();
+	player.position.x = v["player"]["startposition"][0];
+	player.position.y = v["player"]["startposition"][1];
+	player.position.z = v["player"]["startposition"][2];
+
+	for (auto object : v["objects"])
+	{
+		bool hasCollision = true;
+		if (!object["collide"].isNull())
+			hasCollision = object["collide"].asBool();
+
+		Vec3f rotation(0, 0, 0);
+		if(!object["rot"].isNull())
+			rotation = Vec3f(object["rot"][0], object["rot"][1], object["rot"][2]);
+
+		float scale = 1;
+		if (!object["scale"].isNull())
+			scale = object["scale"].asFloat();
+		
+		Vec3f position(object["pos"][0], object["pos"][1], object["pos"][2]);
+		entities.push_back(new LevelObject(object["file"], position, rotation, scale, hasCollision));
+	}
+}
+
+
+World::~World()
+{
+}
+
+void World::draw()
+{
+	player.setCamera();
+
+	float lightPosition[4] = { 0, 2, 1, 0 };
+	glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
+	float lightAmbient[4] = { 0.5, 0.5, 0.5, 1 };
+	glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
+
+	glColor3f(0.5f, 0.9f, 0.5f);
+	glNormal3f(0, 1, 0);
+	glBegin(GL_QUADS);
+	glVertex3f(-50, 0, -50);
+	glVertex3f(-50, 0, 50);
+	glVertex3f(50, 0, 50);
+	glVertex3f(50, 0, -50);
+	glEnd();
+
+	for (auto e : entities)
+		e->draw();
+
+}
+
+void World::update(float elapsedTime)
+{
+	for (auto e : entities)
+		e->update(elapsedTime);
+}
+
+bool World::isPlayerPositionValid()
+{
+	for (auto e : entities)
+	{
+		if (e->canCollide && e->inObject(player.position))
+			return false;
+	}
+	return true;
+}

+ 22 - 0
World.h

@@ -0,0 +1,22 @@
+#pragma once
+
+#include <vector>
+#include "Player.h"
+
+class Entity;
+
+class World
+{
+public:
+	World();
+	~World();
+
+
+	Player& player;
+	std::vector<Entity*> entities;
+
+	void draw();
+	void update(float elapsedTime);
+	bool isPlayerPositionValid();
+};
+

+ 0 - 12
WorldModel.cpp

@@ -1,12 +0,0 @@
-#include "WorldModel.h"
-
-
-
-WorldModel::WorldModel()
-{
-}
-
-
-WorldModel::~WorldModel()
-{
-}

+ 0 - 10
WorldModel.h

@@ -1,10 +0,0 @@
-#pragma once
-#include "Header.h"
-
-class WorldModel
-{
-public:
-	WorldModel();
-	~WorldModel();
-};
-

+ 0 - 12
WorldState.cpp

@@ -1,12 +0,0 @@
-#include "WorldState.h"
-
-
-
-WorldState::WorldState()
-{
-}
-
-
-WorldState::~WorldState()
-{
-}

+ 0 - 10
WorldState.h

@@ -1,10 +0,0 @@
-#pragma once
-#include "Header.h"
-
-class WorldState
-{
-public:
-	WorldState();
-	~WorldState();
-};
-

+ 730 - 0
json.cpp

@@ -0,0 +1,730 @@
+#include "json.h"
+#include <iomanip>
+#include <sstream>
+#include <iostream>
+#include <cmath>
+#include <cfloat>
+#include <set>
+#include <cstdlib>
+#include <math.h>
+#include <stdlib.h>
+
+namespace json
+{
+
+Value Value::null;
+//constructors
+Value::Value()
+{
+    type = Type::nullValue;
+    value.objectValue = NULL;
+}
+
+Value::Value(Type type)
+{
+    this->type = type;
+    if (type == Type::stringValue)
+        value.stringValue = new std::string();
+    if (type == Type::arrayValue)
+        value.arrayValue = new std::vector<Value>();
+    if (type == Type::objectValue)
+        value.objectValue = new std::map<std::string, Value>();
+}
+
+Value::Value(int value)
+{
+    type = Type::intValue;
+    this->value.intValue = value;
+}
+
+Value::Value(float value)
+{
+    type = Type::floatValue;
+    this->value.floatValue = value;
+}
+
+Value::Value(bool value)
+{
+    type = Type::boolValue;
+    this->value.boolValue = value;
+}
+
+Value::Value(const std::string &value)
+{
+    type = Type::stringValue;
+    this->value.stringValue = new std::string();
+    this->value.stringValue->assign(value);
+}
+Value::Value(const char* value)
+{
+    type = Type::stringValue;
+    this->value.stringValue = new std::string();
+    this->value.stringValue->assign(value);
+}
+
+Value::Value(const Value& other) : Value(other.type)
+{
+    if (type == Type::objectValue)
+        *this->value.objectValue = *other.value.objectValue;
+    else if (type == Type::arrayValue)
+        *this->value.arrayValue = *other.value.arrayValue;
+    else if (type == Type::stringValue)
+        this->value.stringValue->assign(*other.value.stringValue);
+    else
+        this->value = other.value;
+}
+
+void Value::operator=(const Value& other)
+{
+    if (type != other.type)
+    {
+        if (type == Type::stringValue)
+            delete value.stringValue;
+        if (type == Type::arrayValue)
+            delete value.arrayValue;
+        if (type == Type::objectValue)
+            delete value.objectValue;
+        this->type = other.type;
+        if (type == Type::stringValue)
+            value.stringValue = new std::string();
+        if (type == Type::arrayValue)
+            value.arrayValue = new std::vector<Value>();
+        if (type == Type::objectValue)
+            value.objectValue = new std::map<std::string, Value>();
+    }
+
+    if (type == Type::objectValue)
+        *this->value.objectValue = *other.value.objectValue;
+    else if (type == Type::arrayValue)
+        *this->value.arrayValue = *other.value.arrayValue;
+    else if (type == Type::stringValue)
+        this->value.stringValue->assign(*other.value.stringValue);
+    else
+        this->value = other.value;
+}
+
+Value::~Value()
+{
+    if (type == Type::stringValue)
+        delete value.stringValue;
+    else if (type == Type::arrayValue)
+        delete value.arrayValue;
+    else if (type == Type::objectValue)
+        delete value.objectValue;
+}
+
+size_t Value::size() const
+{
+    assert(type == Type::arrayValue || type == Type::objectValue);
+    if (type == Type::arrayValue)
+        return value.arrayValue->size();
+    else if (type == Type::objectValue)
+        return value.objectValue->size();
+    throw "Unsupported";
+}
+
+void Value::push_back(const Value& value)
+{
+    assert(type == Type::arrayValue || type == Type::nullValue);
+    if (type == Type::nullValue)
+    {
+        type = Type::arrayValue;
+        this->value.arrayValue = new std::vector<Value>();
+    }
+    this->value.arrayValue->push_back(value);
+}
+
+
+Value& Value::operator[](const std::string &key)
+{
+    assert(type == Type::objectValue);
+    return (*value.objectValue)[key];
+}
+Value& Value::operator[](const std::string &key) const
+{
+    assert(type == Type::objectValue);
+    return (*value.objectValue)[key];
+}
+
+Value& Value::operator[](const char* key)
+{
+    assert(type == Type::objectValue || type == Type::nullValue);
+    if (type == Type::nullValue)
+    {
+        type = Type::objectValue;
+        value.objectValue = new std::map<std::string, Value>();
+    }
+    return (*value.objectValue)[std::string(key)];
+}
+
+Value& Value::operator[](const char* key) const
+{
+    assert(type == Type::objectValue);
+    return (*value.objectValue)[std::string(key)];
+}
+
+Value& Value::operator[](size_t index)
+{
+    assert(type == Type::arrayValue);
+    return (*value.arrayValue)[index];
+}
+Value& Value::operator[](size_t index) const
+{
+    assert(type == Type::arrayValue);
+    return (*value.arrayValue)[index];
+}
+Value& Value::operator[](int index)
+{
+    assert(type == Type::arrayValue);
+    return (*value.arrayValue)[index];
+}
+Value& Value::operator[](int index) const
+{
+    assert(type == Type::arrayValue);
+    return (*value.arrayValue)[index];
+}
+
+void Value::erase(size_t index)
+{
+    throw "Cannot cast";
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Value::Iterator Value::end() const
+{
+    if (type == Type::objectValue)
+        return Iterator(value.objectValue->end());
+    else if (type == Type::arrayValue)
+        return Iterator(value.arrayValue->end());
+    throw "oops";
+}
+
+Value::Iterator Value::begin() const
+{
+    if (type == Type::objectValue)
+        return Iterator(value.objectValue->begin());
+    else if (type == Type::arrayValue)
+        return Iterator(value.arrayValue->begin());
+    throw "oops";
+}
+
+///iterator stuff
+
+Value Value::Iterator::operator*()
+{
+    if (type == Type::objectValue)
+        return this->objectIterator->second;
+    else  if (type == Type::arrayValue)
+        return *arrayIterator;
+    throw "Oops";
+}
+
+bool Value::Iterator::operator!=(const Iterator &other)
+{
+    if (type == Type::objectValue)
+        return this->objectIterator != other.objectIterator;
+    else  if (type == Type::arrayValue)
+        return this->arrayIterator != other.arrayIterator;
+    throw "Oops";
+}
+
+void Value::Iterator::operator++()
+{
+    if (type == Type::objectValue)
+        this->objectIterator++;
+    else  if (type == Type::arrayValue)
+        this->arrayIterator++;
+}
+void Value::Iterator::operator++(int)
+{
+    if (type == Type::objectValue)
+        this->objectIterator++;
+    else  if (type == Type::arrayValue)
+        this->arrayIterator++;
+}
+
+Value::Iterator::Iterator(const std::vector<Value>::iterator& arrayIterator)
+{
+    type = Type::arrayValue;
+    this->arrayIterator = arrayIterator;
+}
+
+Value::Iterator::Iterator(const std::map<std::string, Value>::iterator& objectIterator)
+{
+    type = Type::objectValue;
+    this->objectIterator = objectIterator;
+}
+
+std::string Value::Iterator::key()
+{
+    assert(type == Type::objectValue);
+    return this->objectIterator->first;
+}
+Value& Value::Iterator::value()
+{
+    assert(type == Type::objectValue);
+    return this->objectIterator->second;
+}
+
+
+
+
+
+
+
+static void ltrim(std::istream& stream);
+static void eatComment(std::istream& stream);
+static Value eatString(std::istream& stream);
+static Value eatObject(std::istream& stream);
+static Value eatArray(std::istream& stream);
+static Value eatNumeric(std::istream& stream, char firstChar);
+static Value eatBool(std::istream& stream);
+static Value eatNull(std::istream& stream);
+static Value eatValue(std::istream& stream);
+
+//reading
+static void ltrim(std::istream& stream)
+{
+    char c = stream.peek();
+    while (c == ' ' || c == '\t' || c == '\n' || c == '\r')
+    {
+        stream.get();
+        c = stream.peek();
+    }
+};
+
+
+static Value eatString(std::istream& stream)
+{
+    std::string value = "";
+    bool escaped = false;
+    while (!stream.eof())
+    {
+        char c = stream.get();
+        if (c == '\\' && !escaped)
+            escaped = !escaped;
+        else if (c == '\"' && !escaped)
+            return Value(value);
+        else
+        {
+            value += c;
+            escaped = false;
+        }
+    }
+    return Value(value);
+};
+
+
+
+
+static Value eatObject(std::istream& stream)
+{
+    Value obj(Type::objectValue);
+    while (!stream.eof())
+    {
+        ltrim(stream);
+        char token = stream.get();
+        if (token == '}')
+            break; //empty object
+        if (token == '/')
+        {
+            eatComment(stream);
+            token = stream.get();
+        }
+
+        assert(token == '"');
+        Value key = eatString(stream);
+        ltrim(stream);
+        token = stream.get();
+        assert(token == ':');
+        ltrim(stream);
+        Value val = eatValue(stream);
+        obj[key.asString()] = val;
+        ltrim(stream);
+
+        token = stream.get();
+        if (token == '}')
+            break;
+        assert(token == ',');
+    }
+    return obj;
+};
+static Value eatArray(std::istream& stream)
+{
+    Value obj(Type::arrayValue);
+    while (!stream.eof())
+    {
+        ltrim(stream);
+        if (stream.peek() == ']')
+        {
+            stream.get();
+            break;
+        }
+        obj.push_back(eatValue(stream));
+        ltrim(stream);
+        char token = stream.get();
+        if (token == '/')
+        {
+            eatComment(stream);
+            token = stream.get();
+        }
+        if (token == ']')
+            break;
+        assert(token == ',');
+    }
+    return obj;
+};
+static Value eatNumeric(std::istream& stream, char firstChar)
+{
+    std::string numeric(1, firstChar);
+    while (!stream.eof())
+    {
+        char token = stream.peek();
+        if ((token >= '0' && token <= '9') || token == '.' || token == '-')
+            numeric += stream.get();
+        else
+            break;
+    }
+    if (numeric.find('.') == std::string::npos)
+        return Value(atoi(numeric.c_str()));
+    else
+        return Value((float)atof(numeric.c_str()));
+};
+
+static Value eatBool(std::istream& stream)
+{
+    char token = stream.get();
+    if (token == 'a') //fAlse
+    {
+        stream.get(); //l
+        stream.get(); //s
+        stream.get(); //e
+        return false;
+    }
+    else if (token == 'r') //tRue
+    {
+        stream.get(); // u
+        stream.get(); // e
+        return true;
+    }
+    return Value(Type::nullValue);
+};
+static Value eatNull(std::istream& stream)
+{
+    return Value(Type::nullValue);
+};
+
+//precondition: / is already eaten
+static void eatComment(std::istream& stream)
+{
+    char token = stream.get();
+    assert(token == '/' || token == '*');
+    if (token == '*')
+    {
+        char last = token;
+        while ((last != '*' || token != '/') && !stream.eof())
+        {
+            last = token;
+            token = stream.get();
+        }
+    }
+    else if (token == '/')
+        while (token != '\n' && !stream.eof())
+            token = stream.get();
+    ltrim(stream);
+}
+
+
+static Value eatValue(std::istream& stream)
+{
+    ltrim(stream);
+    char token = stream.get();
+    if (token == '{')
+        return eatObject(stream);
+    if (token == '[')
+        return eatArray(stream);
+    if ((token >= '0' && token <= '9') || token == '.' || token == '-')
+        return eatNumeric(stream, token);
+    if (token == '"')
+        return eatString(stream);
+    if (token == 't' || token == 'f')
+        return eatBool(stream);
+    if (token == 'n')
+        return eatNull(stream);
+    if (token == '/')
+    {
+        eatComment(stream);
+        return eatValue(stream);
+    }
+    throw "Unable to parse json";
+};
+
+
+Value readJson(const std::string &data)
+{
+    std::stringstream stream;
+    stream << data;
+    printf("%s", "test");
+
+    return eatValue(stream);
+}
+
+Value readJson(std::istream &stream)
+{
+    return eatValue(stream);
+}
+
+
+
+std::ostream& indent(std::ostream& stream, int level)
+{
+    for (int i = 0; i < level; i++)
+        stream << '\t';
+    return stream;
+}
+
+std::ostream& Value::prettyPrint(std::ostream& stream, json::Value& printConfig, int level) const
+{
+    stream << std::fixed << std::setprecision(6);
+    switch (type)
+    {
+        case Type::intValue:
+            stream << value.intValue;
+            break;
+        case Type::floatValue:
+            assert(!isnan(value.floatValue));
+            //assert(isnormal(value.floatValue));
+            if (value.floatValue >= 0)
+                stream << " ";
+            stream << value.floatValue;
+            break;
+        case Type::boolValue:
+            stream << (value.boolValue ? "true" : "false");
+            break;
+        case Type::stringValue:
+            stream << "\"" << *value.stringValue << "\""; //TODO: escape \'s
+            break;
+        case Type::arrayValue:
+        {
+            stream << "[";
+            int wrap = 99999;
+            if (value.arrayValue->size() > 10)
+                wrap = 1;
+            if (value.arrayValue->at(0).isArray() || value.arrayValue->at(0).isObject())
+                wrap = 1;
+            else
+                wrap = 3;
+
+            std::string seperator = " ";
+
+            if (!printConfig.isNull() && printConfig.isMember("wrap"))
+                wrap = printConfig["wrap"];
+            if (!printConfig.isNull() && printConfig.isMember("seperator"))
+                seperator = printConfig["seperator"].asString();
+
+
+            int index = 0;
+
+            if ((long)size() > wrap)
+            {
+                stream << "\n";
+                indent(stream, level + 1);
+            }
+            for (auto v : *this)
+            {
+                if (index > 0)
+                {
+                    stream << "," << seperator;
+                    if (index % wrap == 0)
+                    {
+                        stream << "\n";
+                        indent(stream, level + 1);
+                    }
+                }
+
+                json::Value childPrintConfig = json::Value::null;
+                if (!printConfig.isNull())
+                {
+                    if (printConfig.isMember("elements"))
+                        childPrintConfig = printConfig["elements"];
+                    else if (printConfig.isMember("recursive") && printConfig["recursive"].asBool() == true)
+                        childPrintConfig = printConfig;
+                }
+
+                v.prettyPrint(stream, childPrintConfig, level + 1);
+                index++;
+            }
+            if ((long)size() > wrap)
+            {
+                stream << "\n";
+                indent(stream, level);
+            }
+            stream << "]";
+            break;
+        }
+        case Type::objectValue:
+        {
+            stream << "{\n";
+            int wrap = 99999;
+            if (value.arrayValue->size() > 10)
+                wrap = 1;
+            if (value.arrayValue->at(0).isArray() || value.arrayValue->at(0).isObject())
+                wrap = 1;
+            else
+                wrap = 3;
+
+            std::string seperator = " ";
+
+            if (!printConfig.isNull() && printConfig.isMember("wrap"))
+                wrap = printConfig["wrap"];
+            if (!printConfig.isNull() && printConfig.isMember("seperator"))
+                seperator = printConfig["seperator"].asString();
+
+
+            int index = 0;
+            indent(stream, level + 1);
+
+
+
+            //for (auto v : *value.objectValue)
+            auto printEl = [&](const std::pair<const std::string&, const Value&> v)
+            {
+                if (index > 0)
+                {
+                    stream << "," << seperator;
+                    if (index % wrap == 0)
+                    {
+                        stream << "\n";
+                        indent(stream, level + 1);
+                    }
+                }
+                stream << "\"" << v.first << "\" : ";
+                if (
+                        (v.second.isArray() || v.second.isObject()) &&
+                        (printConfig.isNull() ||
+                         (
+                                 printConfig.isMember(v.first) &&
+                                 printConfig[v.first].isObject() &&
+                                 printConfig[v.first].isMember("wrap") &&
+                                 printConfig[v.first]["wrap"].asInt() < (int)v.second.size())
+                        )
+                        )
+                {
+                    stream << "\n";
+                    indent(stream, level + 1);
+                }
+
+                json::Value childPrintConfig = json::Value::null;
+                if (!printConfig.isNull())
+                {
+                    if (printConfig.isMember(v.first))
+                        childPrintConfig = printConfig[v.first];
+                    else if (printConfig.isMember("recursive") && printConfig["recursive"].asBool() == true)
+                        childPrintConfig = printConfig;
+                }
+
+                v.second.prettyPrint(stream, childPrintConfig, level + 1);;
+                index++;
+            };
+
+
+
+            std::set<std::string> printed;
+            if (!printConfig.isNull())
+            {
+                if (printConfig.isMember("sort"))
+                {
+                    for (std::string el : printConfig["sort"])
+                    {
+                        if (isMember(el))
+                        {
+                            printEl(std::pair<const std::string&, const Value&>(el, (*value.objectValue)[el]));
+                            printed.insert(el);
+                        }
+                    }
+                }
+            }
+
+            for (auto v : *value.objectValue)
+                if (printed.find(v.first) == printed.end())
+                    printEl(v);
+
+            stream << "\n";
+            indent(stream, level);
+            stream << "}";
+            break;
+        }
+        case Type::nullValue:
+            stream << "null";
+            break;
+    }
+    return stream;
+}
+
+
+std::ostream & operator<<(std::ostream &stream, const Value& value)
+{
+    stream << std::fixed<< std::setprecision(6);
+    switch (value.type)
+    {
+        case Type::intValue:
+            stream << value.value.intValue;
+            break;
+        case Type::floatValue:
+            assert(!isnan(value.value.floatValue));
+            //assert(isnormal(value.value.floatValue));
+            stream << value.value.floatValue;
+            break;
+        case Type::boolValue:
+            stream << (value.value.boolValue ? "true" : "false");
+            break;
+        case Type::stringValue:
+            stream << "\"" << *value.value.stringValue << "\""; //TODO: escape \'s
+            break;
+        case Type::arrayValue:
+        {
+            stream << "[";
+            bool first = true;
+            for (auto v : value)
+            {
+                if (!first)
+                    stream << ", ";
+                stream << v;
+                first = false;
+            }
+            stream << "]";
+            break;
+        }
+        case Type::objectValue:
+        {
+            stream << "{";
+            bool first = true;
+            for (auto v : *value.value.objectValue)
+            {
+                if (!first)
+                    stream << ", ";
+                stream << "\"" << v.first << "\" : " << v.second << std::endl;
+                first = false;
+            }
+            stream << "}";
+            break;
+        }
+        case Type::nullValue:
+            stream << "null";
+            break;
+    }
+    return stream;
+}
+}

+ 124 - 0
json.h

@@ -0,0 +1,124 @@
+#pragma once
+
+#include <string>
+#include <map>
+#include <vector>
+#include <assert.h>
+
+namespace json
+{
+	enum class Type
+	{
+		intValue,
+		floatValue,
+		boolValue,
+		stringValue,
+		arrayValue,
+		objectValue,
+		nullValue
+	};
+
+	class Value
+	{
+	public:
+		Type type;
+		union ValueHolder
+		{
+			int								intValue;
+			float							floatValue;
+			bool							boolValue;
+			std::string*					stringValue;
+			std::vector<Value>*				arrayValue;
+			std::map<std::string, Value>*	objectValue;
+		} value;
+
+		static Value null;
+
+		Value();
+		Value(Type type);
+		Value(int value);
+		Value(float value);
+		Value(bool value);
+		Value(const std::string &value);
+		Value(const char* value);
+		Value(const Value& other);
+		virtual ~Value();
+
+		void operator = (const Value& other);
+
+
+
+
+		inline operator int() const						{ return asInt(); }
+		inline operator float()	const					{ return asFloat(); }
+		inline operator bool() const					{ return asBool(); }
+		inline operator const std::string&() const		{ return asString(); }
+
+
+		inline int asInt() const					{ assert(type == Type::intValue); return value.intValue; }
+		inline float asFloat() const				{ assert(type == Type::floatValue || type == Type::intValue); return type == Type::floatValue ? value.floatValue : value.intValue; }
+		inline bool asBool() const					{ assert(type == Type::boolValue); return value.boolValue; }
+		inline const std::string& asString() const	{ assert(type == Type::stringValue); return *value.stringValue; }
+		inline bool isNull() const					{ return type == Type::nullValue; }
+		inline bool isString() const				{ return type == Type::stringValue; }
+		inline bool isInt() const					{ return type == Type::intValue; }
+		inline bool isBool() const					{ return type == Type::boolValue; }
+		inline bool isFloat() const					{ return type == Type::floatValue; }
+		inline bool isObject() const				{ return type == Type::objectValue; }
+		inline bool isArray() const					{ return type == Type::arrayValue;  }
+		inline bool isMember(const std::string &name) const				{ assert(type == Type::objectValue); return value.objectValue->find(name) != value.objectValue->end(); }
+		//array/object
+		virtual size_t size() const;
+		//array
+		virtual void push_back(const Value& value);
+		virtual void erase(size_t index);
+		virtual Value& operator [] (size_t index);
+		virtual Value& operator [] (int index);
+		virtual Value& operator [] (size_t index) const;
+		virtual Value& operator [] (int index) const;
+
+		virtual Value& operator [] (const std::string &key);
+		virtual Value& operator [] (const char* key);
+		virtual Value& operator [] (const std::string &key) const;
+		virtual Value& operator [] (const char* key) const;
+
+		virtual bool operator == (const std::string &other) { return asString() == other; }
+		virtual bool operator == (const int other) { return asInt() == other; }
+		virtual bool operator == (const float other) { return asFloat() == other; }
+
+
+		std::ostream& prettyPrint(std::ostream& stream, json::Value& printConfig = null, int level = 0) const;
+
+		class Iterator;
+		Iterator begin() const;
+		Iterator end() const;
+	};
+
+	class Value::Iterator
+	{
+	private:
+		Type type;
+		std::map<std::string, Value>::iterator objectIterator;
+		std::vector<Value>::iterator arrayIterator;
+	public:
+		Iterator(const std::map<std::string, Value>::iterator& objectIterator);
+		Iterator(const std::vector<Value>::iterator& arrayIterator);
+
+		void operator ++();
+		void operator ++(int);
+		bool operator != (const Iterator &other);
+		Value operator*();
+
+		std::string key();
+		Value& value();
+
+	};
+
+
+
+	Value readJson(const std::string &data);
+	Value readJson(std::istream &stream);
+	std::ostream &operator << (std::ostream &stream, const Value& value);	//serializes json data
+
+
+}

BIN
models/HANDVAT.png


+ 134 - 0
models/TextureZwaard.mtl

@@ -0,0 +1,134 @@
+newmtl initialShadingGroup
+illum 4
+Kd 0.22 0.22 0.22
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl lambert2SG
+illum 4
+Kd 0.50 0.32 0.25
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl lambert3SG
+illum 4
+Kd 0.45 0.45 0.45
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl lambert4SG
+illum 4
+Kd 0.12 0.12 0.12
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl lambert5SG
+illum 4
+Kd 0.10 0.05 0.02
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert3SG
+illum 4
+Kd 0.45 0.45 0.45
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert4SG
+illum 4
+Kd 0.12 0.12 0.12
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert4SG1
+illum 4
+Kd 0.12 0.12 0.12
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert4SG2
+illum 4
+Kd 0.00 0.00 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+map_Kd ZWAARD.png
+Ni 1.00
+newmtl pasted__lambert5SG
+illum 4
+Kd 0.10 0.05 0.02
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert5SG1
+illum 4
+Kd 0.10 0.05 0.02
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert5SG2
+illum 4
+Kd 0.00 0.00 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+map_Kd HANDVAT.png
+Ni 1.00
+newmtl pasted__pasted__lambert4SG
+illum 4
+Kd 0.12 0.12 0.12
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__pasted__lambert4SG1
+illum 4
+Kd 0.12 0.12 0.12
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__pasted__lambert4SG2
+illum 4
+Kd 0.12 0.12 0.12
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__pasted__lambert4SG3
+illum 4
+Kd 0.12 0.12 0.12
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__pasted__lambert5SG
+illum 4
+Kd 0.10 0.05 0.02
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__pasted__lambert5SG1
+illum 4
+Kd 0.10 0.05 0.02
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__pasted__lambert5SG2
+illum 4
+Kd 0.10 0.05 0.02
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__pasted__lambert5SG3
+illum 4
+Kd 0.10 0.05 0.02
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__pasted__pasted__lambert4SG
+illum 4
+Kd 0.12 0.12 0.12
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__pasted__pasted__lambert5SG
+illum 4
+Kd 0.10 0.05 0.02
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00

+ 436 - 0
models/TextureZwaard.obj

@@ -0,0 +1,436 @@
+# This file uses centimeters as units for non-parametric coordinates.
+
+mtllib TextureZwaard.mtl
+g default
+v -2.214711 4.435681 -1.922955
+v -2.214711 4.829163 -1.922955
+v -2.214711 4.829163 -2.316437
+v -2.214711 4.435681 -2.316437
+v -1.821229 4.435681 -2.316437
+v -1.821229 4.829163 -2.316437
+v -1.821229 4.829163 -1.922955
+v -1.821229 4.435681 -1.922955
+v -1.908670 5.978167 -2.010395
+v -2.127271 5.978167 -2.010395
+v -1.908670 5.978167 -2.228996
+v -2.127271 5.978167 -2.228996
+v -2.127271 4.523121 -3.000496
+v -1.908670 4.523121 -3.000496
+v -2.127271 4.741723 -2.990724
+v -1.908670 4.741723 -2.990724
+v -1.908670 4.523121 -1.238895
+v -2.127271 4.523121 -1.238895
+v -1.908670 4.741723 -1.248667
+v -2.127271 4.741723 -1.248667
+v -2.017970 5.567809 -1.922955
+v -1.870414 5.567809 -1.972140
+v -2.017970 6.121793 -1.972140
+v -2.165526 5.567809 -1.972140
+v -2.017970 4.829163 -1.922955
+v -1.821229 5.567809 -2.119696
+v -1.870414 5.567809 -2.267251
+v -1.870414 6.121793 -2.119696
+v -1.821229 4.829163 -2.119696
+v -2.017970 6.306454 -2.119696
+v -2.017970 6.121793 -2.267251
+v -2.165526 6.121793 -2.119696
+v -2.214711 5.567809 -2.119696
+v -2.165526 5.567809 -2.267251
+v -2.214711 4.829163 -2.119696
+v -2.017970 5.567809 -2.316437
+v -2.017970 4.829163 -2.316437
+v -2.017970 4.435681 -2.756189
+v -2.017970 4.484866 -3.086004
+v -1.870414 4.484866 -2.756189
+v -2.017970 4.435681 -2.316437
+v -2.165526 4.484866 -2.756189
+v -2.214711 4.632422 -2.756189
+v -2.165526 4.632422 -3.086004
+v -2.214711 4.632422 -2.316437
+v -2.165526 4.779978 -2.734202
+v -2.017970 4.632422 -3.195942
+v -2.017970 4.779978 -3.064016
+v -1.870414 4.632422 -3.086004
+v -1.821229 4.632422 -2.756189
+v -1.870414 4.779978 -2.734202
+v -1.821229 4.632422 -2.316437
+v -2.017970 4.829163 -2.668239
+v -2.116341 4.829163 -2.316437
+v -1.919600 4.829163 -2.316437
+v -2.017970 4.435681 -1.483202
+v -1.870414 4.484866 -1.483202
+v -2.017970 4.484866 -1.153388
+v -2.165526 4.484866 -1.483202
+v -2.017970 4.435681 -1.922955
+v -1.821229 4.632422 -1.483202
+v -1.870414 4.779978 -1.505190
+v -1.870414 4.632422 -1.153388
+v -1.821229 4.632422 -1.922955
+v -2.017970 4.632422 -1.043449
+v -2.017970 4.779978 -1.175375
+v -2.165526 4.632422 -1.153388
+v -2.214711 4.632422 -1.483202
+v -2.165526 4.779978 -1.505190
+v -2.214711 4.632422 -1.922955
+v -2.017970 4.829163 -1.571153
+v -1.919600 4.829163 -1.922955
+v -2.116341 4.829163 -1.922955
+v -2.145140 1.194092 -2.004379
+v -1.894884 1.194092 -2.004379
+v -2.145140 4.476328 -2.004379
+v -1.894884 4.476328 -2.004379
+v -2.145140 4.476328 -2.254635
+v -1.894884 4.476328 -2.254635
+v -2.145140 1.194092 -2.254635
+v -1.894884 1.194092 -2.254635
+v -2.020800 1.194092 -1.837458
+v -2.020800 1.194092 -2.421667
+v -2.020800 4.476328 -2.421667
+v -2.020800 4.476328 -1.837458
+v -2.020800 0.395449 -2.130295
+v -2.020012 0.395449 -2.129507
+v -2.020800 0.395449 -2.128719
+vt 0.375000 0.175791
+vt 0.375000 0.183595
+vt 0.375000 0.191400
+vt 0.250000 0.191400
+vt 0.125000 0.191400
+vt 0.125000 0.183595
+vt 0.125000 0.175791
+vt 0.875000 0.175791
+vt 0.875000 0.183595
+vt 0.875000 0.191400
+vt 0.750000 0.191400
+vt 0.625000 0.191400
+vt 0.625000 0.183595
+vt 0.625000 0.175791
+vt 0.500000 0.191400
+vt 0.562500 0.191400
+vt 0.625000 0.220700
+vt 0.500000 0.220700
+vt 0.875000 0.220700
+vt 0.750000 0.220700
+vt 0.375000 0.375000
+vt 0.375000 0.250000
+vt 0.500000 0.273925
+vt 0.500000 0.375000
+vt 0.375000 0.220700
+vt 0.250000 0.220700
+vt 0.375000 0.529300
+vt 0.375000 0.500000
+vt 0.500000 0.476075
+vt 0.500000 0.529300
+vt -1.#IND00 -1.#IND00
+vt 0.375000 0.000000
+vt 0.500000 0.000000
+vt 0.500000 0.051075
+vt -1.#IND00 -1.#IND00
+vt 0.125000 0.000000
+vt 0.250000 0.000000
+vt -1.#IND00 -1.#IND00
+vt 0.375000 0.875000
+vt 0.375000 0.750000
+vt 0.500000 0.765928
+vt 0.500000 0.875000
+vt -1.#IND00 -1.#IND00
+vt 0.625000 0.000000
+vt 0.750000 0.000000
+vt -1.#IND00 -1.#IND00
+vt 0.562500 0.647850
+vt 0.625000 0.647850
+vt 0.625000 0.698925
+vt 0.500000 0.688710
+vt 0.500000 0.147850
+vt 0.625000 0.147850
+vt -1.#IND00 -1.#IND00
+vt 0.500000 0.198925
+vt -1.#IND00 -1.#IND00
+vt -1.#IND00 -1.#IND00
+vt -1.#IND00 -1.#IND00
+vt -1.#IND00 -1.#IND00
+vt 0.375000 0.375000
+vt 0.375000 0.250000
+vt 0.500000 0.268481
+vt 0.500000 0.375000
+vt -1.#IND00 -1.#IND00
+vt 0.375000 0.147850
+vt -1.#IND00 -1.#IND00
+vt -1.#IND00 -1.#IND00
+vt 0.375000 0.551075
+vt 0.375000 0.500000
+vt 0.500000 0.484072
+vt 0.500000 0.561290
+vt 0.375000 0.102150
+vt 0.625000 0.138970
+vt 0.500000 0.161821
+vt 0.625000 0.250000
+vt 0.437500 0.191400
+vt 0.875000 0.250000
+vt 0.750000 0.250000
+vt 0.625000 0.375000
+vt 0.625000 0.500000
+vt 0.250000 0.250000
+vt 0.125000 0.250000
+vt 0.125000 0.220700
+vt 0.625000 0.529300
+vt 0.625000 0.558600
+vt 0.562500 0.558600
+vt 0.500000 0.558600
+vt 0.437500 0.558600
+vt 0.375000 0.558600
+vt 0.625000 0.102150
+vt 0.500000 0.102150
+vt -1.#IND00 -1.#IND00
+vt -1.#IND00 -1.#IND00
+vt 0.625000 0.750000
+vt 0.625000 0.875000
+vt 0.625000 1.000000
+vt 0.500000 1.000000
+vt 0.375000 1.000000
+vt 0.875000 0.000000
+vt -1.#IND00 -1.#IND00
+vt -1.#IND00 -1.#IND00
+vt -1.#IND00 -1.#IND00
+vt 0.375000 0.698925
+vt 0.375000 0.647850
+vt 0.437500 0.647850
+vt 0.500000 0.647850
+vt 0.625000 0.250000
+vt 0.875000 0.250000
+vt 0.750000 0.250000
+vt 0.625000 0.375000
+vt 0.625000 0.500000
+vt 0.250000 0.250000
+vt 0.125000 0.250000
+vt -1.#IND00 -1.#IND00
+vt -1.#IND00 -1.#IND00
+vt 0.625000 0.551075
+vt 0.625000 0.602150
+vt 0.562500 0.602150
+vt 0.500000 0.602150
+vt 0.437500 0.602150
+vt 0.375000 0.602150
+vt 0.499213 0.250000
+vt 0.499213 0.000000
+vt 0.625000 0.000000
+vt 0.625000 0.250000
+vt 0.499213 0.500000
+vt 0.625000 0.500000
+vt 0.499213 0.750000
+vt 0.625000 0.750000
+vt 0.500000 0.875471
+vt 0.499213 0.875361
+vt 0.499213 0.874686
+vt 0.875000 0.000000
+vt 0.875000 0.250000
+vt 0.125000 0.000000
+vt 0.375000 0.000000
+vt 0.375000 0.250000
+vt 0.125000 0.250000
+vt 0.375000 0.750000
+vt 0.375000 1.000000
+vt 0.375000 0.500000
+vt 0.625000 1.000000
+vt 0.499213 1.000000
+vn -0.706849 -0.706849 0.027027
+vn -0.999778 -0.000000 0.021082
+vn -0.916167 0.161747 0.366710
+vn -0.999853 0.017156 0.000000
+vn -0.916167 0.161747 -0.366710
+vn -0.999778 0.000000 -0.021082
+vn -0.706848 -0.706849 -0.027027
+vn 0.706849 -0.706848 -0.027027
+vn 0.999778 -0.000000 -0.021082
+vn 0.916167 0.161747 -0.366710
+vn 0.999853 0.017156 0.000000
+vn 0.916167 0.161747 0.366710
+vn 0.999778 0.000000 0.021082
+vn 0.706849 -0.706848 0.027027
+vn 0.000000 0.296282 0.955101
+vn 0.165279 0.343682 0.924427
+vn 0.705454 0.068331 0.705454
+vn -0.000000 0.059769 0.998212
+vn 0.705454 0.068331 -0.705454
+vn 0.998212 0.059770 0.000000
+vn -0.926131 0.377203 0.000000
+vn -0.699145 0.149633 0.699147
+vn -0.000000 0.377204 0.926130
+vn -0.000000 1.000000 -0.000000
+vn -0.705454 0.068331 0.705454
+vn -0.998212 0.059770 0.000000
+vn -0.705454 0.068331 -0.705454
+vn -0.699146 0.149633 -0.699146
+vn 0.000000 0.377204 -0.926130
+vn -0.000000 0.059769 -0.998212
+vn -0.702552 -0.702552 -0.113318
+vn -0.680278 -0.680278 -0.272843
+vn -0.000000 -0.871334 -0.490690
+vn 0.000000 -0.995011 -0.099770
+vn -0.764530 0.632514 -0.124178
+vn -0.647141 0.717488 -0.257720
+vn -0.867188 0.029145 -0.497127
+vn -0.994694 0.006104 -0.102697
+vn -0.000000 0.901897 -0.431952
+vn 0.000000 0.041614 -0.999134
+vn 0.702553 -0.702552 -0.113318
+vn 0.680279 -0.680278 -0.272842
+vn 0.867188 0.029145 -0.497127
+vn 0.994694 0.006104 -0.102697
+vn 0.165279 0.343682 -0.924427
+vn 0.764531 0.632513 -0.124177
+vn -0.000000 0.994023 -0.109172
+vn 0.000000 -0.999780 0.020984
+vn 0.702552 -0.702552 0.113318
+vn 0.000000 -0.995011 0.099770
+vn 0.764531 0.632513 0.124177
+vn 0.994694 0.006104 0.102697
+vn -0.867188 0.029145 0.497128
+vn -0.680278 -0.680278 0.272843
+vn -0.000000 -0.871334 0.490690
+vn -0.000000 0.041614 0.999134
+vn -0.702552 -0.702552 0.113318
+vn -0.994694 0.006104 0.102697
+vn -0.764530 0.632514 0.124178
+vn -0.647140 0.717488 0.257721
+vn -0.000000 0.901897 0.431952
+vn 0.000000 0.994023 0.109172
+vn 0.000000 -0.999780 -0.020984
+vn 0.699145 0.149633 0.699147
+vn -0.165279 0.343682 0.924427
+vn 0.699146 0.149633 -0.699145
+vn 0.926130 0.377204 -0.000000
+vn -0.000000 0.296282 -0.955101
+vn -0.165279 0.343682 -0.924427
+vn 0.647141 0.717488 -0.257720
+vn 0.680279 -0.680278 0.272842
+vn 0.647141 0.717488 0.257720
+vn 0.867188 0.029145 0.497128
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.798332 0.000000 0.602218
+vn 0.798332 0.000000 0.602218
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn -0.000000 0.000000 -1.000000
+vn -0.000000 0.000000 -1.000000
+vn 0.798524 0.000000 -0.601963
+vn 0.798524 0.000000 -0.601963
+vn 0.967785 -0.251777 0.000042
+vn -0.485721 -0.462486 0.741742
+vn -0.485344 -0.462668 -0.741875
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -0.935019 -0.191988 -0.298128
+vn -0.934995 -0.191995 0.298198
+vn -0.802147 0.000000 -0.597126
+vn -0.802147 0.000000 -0.597126
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn -0.801957 0.000000 0.597382
+vn -0.801957 0.000000 0.597382
+vn 0.003575 -0.342600 -0.939475
+vn 0.932888 -0.193820 -0.303570
+vn 0.932863 -0.193827 0.303641
+vn 0.003576 -0.342485 0.939516
+s 1
+g polySurface10
+usemtl pasted__lambert5SG2
+f 1/1/1 70/2/2 2/3/3 35/4/4 3/5/5 45/6/6 4/7/7
+f 5/8/8 52/9/9 6/10/10 29/11/11 7/12/12 64/13/13 8/14/14
+f 25/15/15 72/16/16 7/12/12 22/17/17 21/18/18
+f 29/11/11 6/10/10 27/19/19 26/20/20
+f 32/21/21 10/22/22 23/23/23 30/24/24
+f 35/4/4 2/3/3 24/25/25 33/26/26
+f 34/27/27 12/28/28 31/29/29 36/30/30
+f 42/31/31 13/32/32 39/33/33 38/34/34
+f 46/35/35 15/36/36 44/37/37 43/38/38
+f 44/39/37 15/40/36 48/41/39 47/42/40
+f 40/43/41 14/44/42 49/45/43 50/46/44
+f 55/47/45 6/48/10 51/49/46 53/50/47
+f 60/51/48 8/52/14 57/53/49 56/54/50
+f 64/55/13 7/56/12 62/57/51 61/58/52
+f 67/59/53 18/60/54 58/61/55 65/62/56
+f 70/63/2 1/64/1 59/65/57 68/66/58
+f 69/67/59 20/68/60 66/69/61 71/70/62
+f 1/1/1 4/71/7 41/72/63 5/8/8 8/52/14 60/73/48
+f 22/17/17 9/74/64 23/23/23 21/18/18
+f 23/23/23 10/22/22 24/25/25 21/18/18
+f 24/25/25 2/3/3 73/75/65 25/15/15 21/18/18
+f 27/19/19 11/76/66 28/77/67 26/20/20
+f 28/77/67 9/74/64 22/17/17 26/20/20
+f 22/17/17 7/12/12 29/11/11 26/20/20
+f 23/23/23 9/74/64 28/78/67 30/24/24
+f 28/78/67 11/79/66 31/29/29 30/24/24
+f 31/29/29 12/28/28 32/21/21 30/24/24
+f 24/25/25 10/22/22 32/80/21 33/26/26
+f 32/80/21 12/81/28 34/82/27 33/26/26
+f 34/82/27 3/5/5 35/4/4 33/26/26
+f 31/29/29 11/79/66 27/83/19 36/30/30
+f 27/83/19 6/84/10 55/85/45 37/86/68 36/30/30
+f 37/86/68 54/87/69 3/88/5 34/27/27 36/30/30
+f 39/33/33 14/44/42 40/43/41 38/34/34
+f 40/43/41 5/89/8 41/90/63 38/34/34
+f 41/90/63 4/71/7 42/31/31 38/34/34
+f 44/37/37 13/32/32 42/31/31 43/38/38
+f 42/31/31 4/71/7 45/91/6 43/38/38
+f 45/91/6 3/92/5 46/35/35 43/38/38
+f 48/41/39 16/93/70 49/94/43 47/42/40
+f 49/94/43 14/95/42 39/96/33 47/42/40
+f 39/96/33 13/97/32 44/39/37 47/42/40
+f 49/45/43 16/98/70 51/99/46 50/46/44
+f 51/99/46 6/100/10 52/101/9 50/46/44
+f 52/101/9 5/89/8 40/43/41 50/46/44
+f 51/49/46 16/93/70 48/41/39 53/50/47
+f 48/41/39 15/40/36 46/102/35 53/50/47
+f 46/102/35 3/103/5 54/104/69 53/50/47
+f 54/104/69 37/105/68 55/47/45 53/50/47
+f 57/53/49 17/106/71 58/61/55 56/54/50
+f 58/61/55 18/60/54 59/65/57 56/54/50
+f 59/65/57 1/64/1 60/51/48 56/54/50
+f 62/57/51 19/107/72 63/108/73 61/58/52
+f 63/108/73 17/106/71 57/53/49 61/58/52
+f 57/53/49 8/52/14 64/55/13 61/58/52
+f 58/61/55 17/106/71 63/109/73 65/62/56
+f 63/109/73 19/110/72 66/69/61 65/62/56
+f 66/69/61 20/68/60 67/59/53 65/62/56
+f 59/65/57 18/60/54 67/111/53 68/66/58
+f 67/111/53 20/112/60 69/113/59 68/66/58
+f 69/113/59 2/114/3 70/63/2 68/66/58
+f 66/69/61 19/110/72 62/115/51 71/70/62
+f 62/115/51 7/116/12 72/117/16 71/70/62
+f 72/117/16 25/118/15 73/119/65 71/70/62
+f 73/119/65 2/120/3 69/67/59 71/70/62
+s 10
+usemtl pasted__lambert4SG2
+f 85/121/74 82/122/75 75/123/76 77/124/77
+s 11
+f 84/125/78 85/121/79 77/124/80 79/126/81
+s 12
+f 83/127/82 84/125/83 79/126/84 81/128/85
+s 13
+f 87/129/86 88/130/87 86/131/88
+s off
+f 75/123/89 81/132/90 79/133/91 77/124/92
+f 80/134/93 74/135/94 76/136/95 78/137/96
+s 13
+f 80/138/97 86/131/88 88/130/87 74/139/98
+s 12
+f 78/140/99 84/125/83 83/127/82 80/138/100
+s 11
+f 76/136/101 85/121/79 84/125/78 78/140/102
+s 10
+f 74/135/103 82/122/75 85/121/74 76/136/104
+s 13
+f 80/138/97 83/127/105 86/131/88
+f 81/128/106 87/129/86 86/131/88 83/127/105
+f 75/141/107 87/129/86 81/128/106
+f 82/142/108 88/130/87 87/129/86 75/141/107
+f 74/139/98 88/130/87 82/142/108

BIN
models/ZWAARD.png


+ 192 - 0
models/boom/Boom.mtl

@@ -0,0 +1,192 @@
+newmtl initialShadingGroup
+illum 4
+Kd 0.21 0.09 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl lambert2SG
+illum 4
+Kd 0.00 1.00 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl lambert3SG
+illum 4
+Kd 0.50 0.21 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl lambert4SG
+illum 4
+Kd 0.50 0.21 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl lambert5SG
+illum 4
+Kd 0.00 0.16 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl lambert6SG
+illum 4
+Kd 0.00 0.16 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl lambert8SG
+illum 4
+Kd 0.00 0.16 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl lambert9SG
+illum 4
+Kd 1.00 1.00 1.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl lambert10SG
+illum 4
+Kd 0.12 0.28 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl lambert11SG
+illum 4
+Kd 0.50 0.21 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert2SG
+illum 4
+Kd 0.00 1.00 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert2SG1
+illum 4
+Kd 0.00 1.00 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert2SG2
+illum 4
+Kd 0.00 1.00 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert2SG3
+illum 4
+Kd 0.00 1.00 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert2SG4
+illum 4
+Kd 0.00 1.00 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert3SG
+illum 4
+Kd 0.50 0.21 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert3SG1
+illum 4
+Kd 0.50 0.21 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert3SG2
+illum 4
+Kd 0.50 0.21 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert3SG3
+illum 4
+Kd 0.50 0.21 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert3SG4
+illum 4
+Kd 0.50 0.21 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert4SG
+illum 4
+Kd 0.50 0.21 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert4SG1
+illum 4
+Kd 0.50 0.21 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert4SG2
+illum 4
+Kd 0.50 0.21 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert5SG
+illum 4
+Kd 0.00 0.16 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert5SG1
+illum 4
+Kd 0.00 0.16 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert5SG2
+illum 4
+Kd 0.00 0.16 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert6SG
+illum 4
+Kd 0.00 0.16 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert6SG1
+illum 4
+Kd 0.00 0.16 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert6SG2
+illum 4
+Kd 0.00 0.16 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert8SG
+illum 4
+Kd 0.00 0.16 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert8SG1
+illum 4
+Kd 0.00 0.16 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00
+newmtl pasted__lambert8SG2
+illum 4
+Kd 0.00 0.16 0.00
+Ka 0.00 0.00 0.00
+Tf 1.00 1.00 1.00
+Ni 1.00

+ 243 - 0
models/boom/Boom.obj

@@ -0,0 +1,243 @@
+# This file uses centimeters as units for non-parametric coordinates.
+
+mtllib Boom.mtl
+g default
+v 8.891173 1.289464 2.183208
+v 6.060002 1.289464 2.982580
+v 5.945371 1.289464 5.922204
+v 8.705695 1.289464 6.939618
+v 10.526301 1.289464 4.628792
+v 8.025709 4.070336 4.531281
+v 8.546361 2.777066 2.928877
+v 6.662623 2.777066 3.540941
+v 6.662623 2.777066 5.521620
+v 8.546361 2.777066 6.133684
+v 9.710575 2.777066 4.531281
+v 8.025709 4.889092 4.531281
+v 8.358277 3.919804 3.507741
+v 7.155033 3.919804 3.898698
+v 7.155033 3.919804 5.163863
+v 8.358277 3.919804 5.554821
+v 9.101922 3.919804 4.531281
+v 8.025709 5.919804 4.531281
+v 8.135743 -0.024354 4.192630
+v 7.737635 -0.024354 4.321983
+v 7.737635 -0.024354 4.740578
+v 8.135743 -0.024354 4.869931
+v 8.381787 -0.024354 4.531281
+v 8.135743 2.286371 4.192630
+v 7.737635 2.286371 4.321983
+v 7.737635 2.286371 4.740578
+v 8.135743 2.286371 4.869931
+v 8.381787 2.286371 4.531281
+v 8.025709 -0.024354 4.531281
+v 8.025709 2.286371 4.531281
+vt 0.577254 0.012236
+vt 0.297746 0.103054
+vt 0.297746 0.396946
+vt 0.577254 0.487764
+vt 0.750000 0.250000
+vt 0.250000 0.500000
+vt 0.350000 0.500000
+vt 0.450000 0.500000
+vt 0.550000 0.500000
+vt 0.650000 0.500000
+vt 0.750000 0.500000
+vt 0.500000 1.000000
+vt 0.577254 0.012236
+vt 0.750000 0.250000
+vt 0.577254 0.487764
+vt 0.297746 0.396946
+vt 0.297746 0.103054
+vt 0.250000 0.500000
+vt 0.350000 0.500000
+vt 0.500000 1.000000
+vt 0.450000 0.500000
+vt 0.550000 0.500000
+vt 0.650000 0.500000
+vt 0.750000 0.500000
+vt 0.577254 0.012236
+vt 0.750000 0.250000
+vt 0.577254 0.487764
+vt 0.297746 0.396946
+vt 0.297746 0.103054
+vt 0.250000 0.500000
+vt 0.350000 0.500000
+vt 0.500000 1.000000
+vt 0.450000 0.500000
+vt 0.550000 0.500000
+vt 0.650000 0.500000
+vt 0.750000 0.500000
+vt 0.375000 0.312500
+vt 0.425000 0.312500
+vt 0.425000 0.688440
+vt 0.375000 0.688440
+vt 0.475000 0.312500
+vt 0.475000 0.688440
+vt 0.525000 0.312500
+vt 0.525000 0.688440
+vt 0.575000 0.312500
+vt 0.575000 0.688440
+vt 0.625000 0.312500
+vt 0.625000 0.688440
+vt 0.373591 0.064409
+vt 0.548284 0.007647
+vt 0.500000 0.150000
+vt 0.373591 0.248091
+vt 0.548284 0.304853
+vt 0.656250 0.156250
+vt 0.548284 0.992353
+vt 0.373591 0.935591
+vt 0.500000 0.837500
+vt 0.373591 0.751909
+vt 0.548284 0.695147
+vt 0.656250 0.843750
+vn 0.000000 -1.000000 -0.000000
+vn 0.000000 -1.000000 -0.000000
+vn 0.000000 -1.000000 -0.000000
+vn 0.000000 -1.000000 -0.000000
+vn 0.000000 -1.000000 -0.000000
+vn -0.219674 0.588572 -0.778027
+vn -0.219674 0.588572 -0.778027
+vn -0.219674 0.588572 -0.778027
+vn -0.807831 0.588572 -0.031502
+vn -0.807831 0.588572 -0.031502
+vn -0.807831 0.588572 -0.031502
+vn -0.279593 0.588572 0.758558
+vn -0.279593 0.588572 0.758558
+vn -0.279593 0.588572 0.758558
+vn 0.635033 0.588572 0.500316
+vn 0.635033 0.588572 0.500316
+vn 0.635033 0.588572 0.500316
+vn 0.672065 0.588572 -0.449346
+vn 0.672065 0.588572 -0.449346
+vn 0.672065 0.588572 -0.449345
+vn 0.000000 -1.000000 -0.000000
+vn 0.000000 -1.000000 -0.000000
+vn 0.000000 -1.000000 -0.000000
+vn 0.000000 -1.000000 -0.000000
+vn 0.000000 -1.000000 -0.000000
+vn -0.259639 0.542264 -0.799085
+vn -0.259639 0.542264 -0.799085
+vn -0.259639 0.542264 -0.799085
+vn -0.840208 0.542264 0.000000
+vn -0.840208 0.542264 0.000000
+vn -0.840208 0.542264 0.000000
+vn -0.259639 0.542264 0.799085
+vn -0.259639 0.542264 0.799085
+vn -0.259639 0.542264 0.799085
+vn 0.679743 0.542264 0.493862
+vn 0.679743 0.542264 0.493862
+vn 0.679743 0.542264 0.493862
+vn 0.679743 0.542264 -0.493862
+vn 0.679743 0.542264 -0.493862
+vn 0.679743 0.542264 -0.493862
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn -0.283333 0.399154 -0.872008
+vn -0.283333 0.399154 -0.872008
+vn -0.283333 0.399154 -0.872008
+vn -0.916884 0.399154 -0.000000
+vn -0.916884 0.399154 -0.000000
+vn -0.916884 0.399154 -0.000000
+vn -0.283333 0.399154 0.872008
+vn -0.283333 0.399154 0.872008
+vn -0.283333 0.399154 0.872008
+vn 0.741775 0.399154 0.538931
+vn 0.741775 0.399154 0.538931
+vn 0.741775 0.399154 0.538931
+vn 0.741775 0.399154 -0.538931
+vn 0.741775 0.399154 -0.538931
+vn 0.741775 0.399154 -0.538931
+vn -0.309017 0.000000 -0.951057
+vn -0.309017 0.000000 -0.951057
+vn -0.309017 0.000000 -0.951057
+vn -0.309017 0.000000 -0.951057
+vn -1.000000 0.000000 -0.000000
+vn -1.000000 0.000000 -0.000000
+vn -1.000000 0.000000 -0.000000
+vn -1.000000 0.000000 -0.000000
+vn -0.309017 0.000000 0.951057
+vn -0.309017 0.000000 0.951057
+vn -0.309017 0.000000 0.951057
+vn -0.309017 0.000000 0.951057
+vn 0.809017 0.000000 0.587785
+vn 0.809017 0.000000 0.587785
+vn 0.809017 0.000000 0.587785
+vn 0.809017 0.000000 0.587785
+vn 0.809017 0.000000 -0.587785
+vn 0.809017 0.000000 -0.587785
+vn 0.809017 0.000000 -0.587785
+vn 0.809017 0.000000 -0.587785
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 -0.000000
+vn 0.000000 -1.000000 -0.000000
+vn 0.000000 -1.000000 -0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 -0.000001
+vn 0.000000 1.000000 -0.000001
+vn 0.000000 1.000000 -0.000001
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+s off
+g PineConeTree
+usemtl lambert5SG
+f 1/1/1 5/5/2 4/4/3 3/3/4 2/2/5
+f 1/6/6 2/7/7 6/12/8
+f 2/7/9 3/8/10 6/12/11
+f 3/8/12 4/9/13 6/12/14
+f 4/9/15 5/10/16 6/12/17
+f 5/10/18 1/11/19 6/12/20
+usemtl lambert6SG
+f 7/13/21 11/14/22 10/15/23 9/16/24 8/17/25
+f 7/18/26 8/19/27 12/20/28
+f 8/19/29 9/21/30 12/20/31
+f 9/21/32 10/22/33 12/20/34
+f 10/22/35 11/23/36 12/20/37
+f 11/23/38 7/24/39 12/20/40
+usemtl lambert8SG
+f 13/25/41 17/26/42 16/27/43 15/28/44 14/29/45
+f 13/30/46 14/31/47 18/32/48
+f 14/31/49 15/33/50 18/32/51
+f 15/33/52 16/34/53 18/32/54
+f 16/34/55 17/35/56 18/32/57
+f 17/35/58 13/36/59 18/32/60
+usemtl lambert4SG
+f 19/37/61 20/38/62 25/39/63 24/40/64
+f 20/38/65 21/41/66 26/42/67 25/39/68
+f 21/41/69 22/43/70 27/44/71 26/42/72
+f 22/43/73 23/45/74 28/46/75 27/44/76
+f 23/45/77 19/47/78 24/48/79 28/46/80
+f 20/49/81 19/50/82 29/51/83
+f 21/52/84 20/49/85 29/51/86
+f 22/53/87 21/52/88 29/51/89
+f 23/54/90 22/53/91 29/51/92
+f 19/50/93 23/54/94 29/51/95
+f 24/55/96 25/56/97 30/57/98
+f 25/56/99 26/58/100 30/57/101
+f 26/58/102 27/59/103 30/57/104
+f 27/59/105 28/60/106 30/57/107
+f 28/60/108 24/55/109 30/57/110

+ 16 - 0
models/portal_blue.mtl

@@ -0,0 +1,16 @@
+# WaveFront *.mtl file (generated by CINEMA 4D)
+
+newmtl Mat
+Kd 0.00000000000000 0.76666665077209 1.00000000000000
+d 0
+Tf 1.00000000000000 1.00000000000000 1.00000000000000
+illum 7
+
+newmtl Mat.2
+Kd 0.43200001120567 0.62826669216156 0.80000001192093
+illum 7
+
+newmtl Mat.1
+Kd 0.00000000000000 0.00000000000000 0.80000001192093
+illum 7
+

+ 676 - 0
models/portal_blue.obj

@@ -0,0 +1,676 @@
+# WaveFront *.obj file (generated by CINEMA 4D)
+
+mtllib ./portal_blue.mtl
+
+v 0.00000000000000 -171.96217544392707 0.00000000000000
+v 0.00000000000000 171.96217544392707 0.00000000000000
+v 85.98108772196353 -171.96217544392707 0.00000000000000
+v 85.98108772196353 7.33235190308497 0.00000000000000
+v 85.98108772196353 171.96217544392707 0.00000000000000
+v 65.86533446273555 -171.96217544392707 55.26757785504959
+v 65.86533446273555 7.33235190308497 55.26757785504959
+v 65.86533446273555 171.96217544392707 55.26757785504959
+v 14.93045919673945 -171.96217544392707 84.67484180101245
+v 14.93045919673945 7.33235190308497 84.67484180101245
+v 14.93045919673945 171.96217544392707 84.67484180101245
+v -42.99054386098175 -171.96217544392707 74.46180621223871
+v -42.99054386098175 7.33235190308497 74.46180621223871
+v -42.99054386098175 171.96217544392707 74.46180621223871
+v -80.79579365947500 -171.96217544392707 29.40726394596288
+v -80.79579365947500 7.33235190308497 29.40726394596288
+v -80.79579365947500 171.96217544392707 29.40726394596288
+v -80.79579365947501 -171.96217544392707 -29.40726394596286
+v -80.79579365947501 7.33235190308497 -29.40726394596286
+v -80.79579365947501 171.96217544392707 -29.40726394596286
+v -42.99054386098180 -171.96217544392707 -74.46180621223869
+v -42.99054386098180 7.33235190308497 -74.46180621223869
+v -42.99054386098180 171.96217544392707 -74.46180621223869
+v 14.93045919673942 -171.96217544392707 -84.67484180101246
+v 14.93045919673942 7.33235190308497 -84.67484180101246
+v 14.93045919673942 171.96217544392707 -84.67484180101246
+v 65.86533446273553 -171.96217544392707 -55.26757785504962
+v 65.86533446273553 7.33235190308497 -55.26757785504962
+v 65.86533446273553 171.96217544392707 -55.26757785504962
+# 29 vertices
+
+vn -0.76604445295859 0.00000000000000 0.64278759796015
+vn 0.93969261684974 0.00000000000000 0.34202015414020
+vn 0.50000002562450 0.00000000000000 -0.86602538899013
+vn -1.00000000000000 0.00000000000000 0.00000000000000
+vn 0.50000002562450 0.00000000000000 0.86602538899013
+vn -0.17364817233999 0.00000000000000 -0.98480775395149
+vn -0.76604445295859 0.00000000000000 -0.64278759796015
+vn -0.17364817233999 0.00000000000000 0.98480775395149
+vn 0.93969261684974 0.00000000000000 -0.34202015414020
+# 9 normals
+
+vt 0.33333334326744 -1.00000000000000 0.00000000000000
+vt 0.33333334326744 -0.00000000000000 0.00000000000000
+vt 0.44444444775581 -0.00000000000000 0.00000000000000
+vt 0.44444444775581 -1.00000000000000 0.00000000000000
+vt 0.00000000000000 -1.00000000000000 0.00000000000000
+vt 0.00000000000000 -0.00000000000000 0.00000000000000
+vt 0.11111111193895 -0.00000000000000 0.00000000000000
+vt 0.11111111193895 -1.00000000000000 0.00000000000000
+vt 0.77777779102325 -1.00000000000000 0.00000000000000
+vt 0.77777779102325 -0.00000000000000 0.00000000000000
+vt 0.88888889551163 -0.00000000000000 0.00000000000000
+vt 0.88888889551163 -1.00000000000000 0.00000000000000
+vt 0.55555558204651 -0.00000000000000 0.00000000000000
+vt 0.55555558204651 -1.00000000000000 0.00000000000000
+vt 0.22222222387791 -0.00000000000000 0.00000000000000
+vt 0.22222222387791 -1.00000000000000 0.00000000000000
+vt 0.66666668653488 -1.00000000000000 0.00000000000000
+vt 0.66666668653488 -0.00000000000000 0.00000000000000
+vt 1.00000000000000 -0.00000000000000 0.00000000000000
+vt 1.00000000000000 -1.00000000000000 0.00000000000000
+# 20 texture coordinates
+
+o Cylinder
+usemtl Mat
+f 13/1/1 14/2/1 17/3/1 16/4/1
+f 4/5/2 5/6/2 8/7/2 7/8/2
+f 25/9/3 26/10/3 29/11/3 28/12/3
+f 16/4/4 17/3/4 20/13/4 19/14/4
+f 7/8/5 8/7/5 11/15/5 10/16/5
+f 22/17/6 23/18/6 26/10/6 25/9/6
+f 19/14/7 20/13/7 23/18/7 22/17/7
+f 10/16/8 11/15/8 14/2/8 13/1/8
+f 28/12/9 29/11/9 5/19/9 4/20/9
+
+v -93.96926207859083 10.00000000000000 34.20201433256689
+v 0.01217485718138 11.00001403290715 -0.01021591817053
+v 76.60444431189778 0.00000000000000 -64.27876096865396
+v 76.60444431189778 2.50000000000000 -64.27876096865396
+v 76.60444431189778 5.00000000000000 -64.27876096865396
+v -50.00000000000004 0.00000000000000 -86.60254037844383
+v -50.00000000000004 2.50000000000000 -86.60254037844383
+v -50.00000000000004 5.00000000000000 -86.60254037844383
+v -82.30250693287560 12.34005811377603 29.95566272905449
+v -50.00000000000004 7.50000000000000 -86.60254037844383
+v -50.00000000000004 10.00000000000000 -86.60254037844383
+v -43.79224924850548 12.34005811377603 -75.85040067613139
+v 100.00000000000000 0.00000000000000 0.00000000000000
+v 100.00000000000000 2.50000000000000 0.00000000000000
+v 100.00000000000000 5.00000000000000 0.00000000000000
+v 100.00000000000000 7.50000000000000 0.00000000000000
+v 100.00000000000000 10.00000000000000 0.00000000000000
+v 87.58449849701088 12.34005811377603 0.00000000000000
+v 75.13523150260404 14.36993599551963 0.00000000000000
+v 62.65699844618840 16.08885108866691 0.00000000000000
+v 49.25862759706679 8.53560575575546 0.00000000000000
+v 36.96020780186315 9.61341698032146 -0.00000000000000
+v 24.64786635501281 10.38345526352774 0.00000000000000
+v 12.28883806870444 10.84628486838432 -0.01362332794681
+v 76.60444431189778 7.50000000000000 -64.27876096865396
+v 76.60444431189778 10.00000000000000 -64.27876096865396
+v -93.96926207859085 0.00000000000000 -34.20201433256687
+v -37.56761575130206 14.36993599551963 -65.06901920047991
+v -31.32849922309423 16.08885108866691 -54.26255237928124
+v -24.62931379853342 8.53560575575546 -42.65922285461705
+v -70.60402260403794 14.36993599551963 25.69776264732795
+v -18.48010390093159 9.61341698032146 -32.00847888556528
+v -12.32393317750641 10.38345526352774 -21.34567841252484
+v -6.15621718243825 10.84628486838432 -10.63563428651794
+v -93.96926207859085 2.50000000000000 -34.20201433256687
+v 76.60444431189781 0.00000000000000 64.27876096865393
+v 76.60444431189781 2.50000000000000 64.27876096865393
+v 76.60444431189781 5.00000000000000 64.27876096865393
+v 76.60444431189781 7.50000000000000 64.27876096865393
+v 76.60444431189781 10.00000000000000 64.27876096865393
+v 67.09361837699767 12.34005811377603 56.29823043448791
+v 57.55692657502781 14.36993599551963 48.29599586080362
+v 47.99804548221707 16.08885108866691 40.27514226135865
+v 37.73429794640015 8.53560575575546 31.66283548955796
+v 28.31316180313996 9.61341698032146 23.75756362647740
+v 18.88136105599678 10.38345526352774 15.84334309821196
+v 9.40503920851309 10.84628486838432 7.90954892267792
+v -93.96926207859085 5.00000000000000 -34.20201433256687
+v -93.96926207859085 7.50000000000000 -34.20201433256687
+v -93.96926207859085 10.00000000000000 -34.20201433256687
+v -82.30250693287562 12.34005811377603 -29.95566272905447
+v -70.60402260403794 14.36993599551963 -25.69776264732793
+v -58.87831908047738 16.08885108866691 -21.42995558892156
+v -58.87831908047737 16.08885108866691 21.42995558892157
+v -46.28796886300476 8.53560575575546 16.84744287077453
+v 17.36481776669300 0.00000000000000 -98.48077530122082
+v 17.36481776669300 2.50000000000000 -98.48077530122082
+v 17.36481776669300 5.00000000000000 -98.48077530122082
+v 17.36481776669304 0.00000000000000 98.48077530122080
+v 17.36481776669304 2.50000000000000 98.48077530122080
+v 17.36481776669304 5.00000000000000 98.48077530122080
+v 17.36481776669304 7.50000000000000 98.48077530122080
+v 17.36481776669304 10.00000000000000 98.48077530122080
+v 15.20888855587795 12.34005811377603 86.25389316354240
+v 13.04709602901014 14.36993599551963 73.99375850813155
+v 10.88027359826031 16.08885108866691 61.70509785028021
+v 8.55367091660462 8.53560575575546 48.51027836033248
+v 6.41807273098460 9.61341698032146 36.39869919621713
+v 4.28005707592602 10.38345526352774 24.27340988162536
+v 2.12051797729068 10.84628486838432 12.10450867164343
+v -46.28796886300477 8.53560575575546 -16.84744287077452
+v -34.73123453412457 9.61341698032146 -12.64113556973973
+v -23.16141813192280 10.38345526352774 -8.43006678341341
+v -11.54307099861758 10.84628486838432 -4.21583189830639
+v 17.36481776669300 7.50000000000000 -98.48077530122082
+v 17.36481776669300 10.00000000000000 -98.48077530122082
+v -34.73123453412456 9.61341698032146 12.64113556973974
+v 15.20888855587791 12.34005811377603 -86.25389316354242
+v 13.04709602901010 14.36993599551963 -73.99375850813156
+v 10.88027359826028 16.08885108866691 -61.70509785028022
+v 8.55367091660459 8.53560575575546 -48.51027836033249
+v -49.99999999999998 0.00000000000000 86.60254037844388
+v -49.99999999999998 2.50000000000000 86.60254037844388
+v -49.99999999999998 5.00000000000000 86.60254037844388
+v -49.99999999999998 7.50000000000000 86.60254037844388
+v -49.99999999999998 10.00000000000000 86.60254037844388
+v -43.79224924850542 12.34005811377603 75.85040067613141
+v -37.56761575130201 14.36993599551963 65.06901920047994
+v -31.32849922309419 16.08885108866691 54.26255237928126
+v -24.62931379853339 8.53560575575546 42.65922285461706
+v -18.48010390093157 9.61341698032146 32.00847888556530
+v -12.32393317750640 10.38345526352774 21.34567841252484
+v -6.15621718243824 10.84628486838432 10.63563428651794
+v 67.09361837699765 12.34005811377603 -56.29823043448795
+v 57.55692657502779 14.36993599551963 -48.29599586080364
+v 47.99804548221705 16.08885108866691 -40.27514226135867
+v -23.16141813192279 10.38345526352774 8.43006678341341
+v 6.41807273098458 9.61341698032146 -36.39869919621714
+v 4.28005707592601 10.38345526352774 -24.27340988162536
+v 2.14735069525837 10.84628486838432 -12.09977733949999
+v -11.54307099861758 10.84628486838432 4.21583189830639
+v 37.73429794640014 8.53560575575546 -31.66283548955798
+v 28.31316180313996 9.61341698032146 -23.75756362647741
+v 18.88136105599677 10.38345526352774 -15.84334309821196
+v 9.40503920851308 10.84628486838432 -7.90954892267792
+v -93.96926207859083 0.00000000000000 34.20201433256689
+v -93.96926207859083 2.50000000000000 34.20201433256689
+v -93.96926207859083 5.00000000000000 34.20201433256689
+v -93.96926207859083 7.50000000000000 34.20201433256689
+v -80.93917847801794 3.44213696955998 29.45945175195817
+v -43.06683732938375 3.44213696955998 -74.59395037579651
+v 86.13367465876743 3.44213696955998 0.00000000000000
+v 73.68440766436059 5.47201485130358 0.00000000000000
+v -36.84220383218033 5.47201485130358 -63.81256890014504
+v -69.24069414918027 5.47201485130358 25.20155167023162
+v 65.98222283776673 3.44213696955998 55.36565884742716
+v 56.44553103579686 5.47201485130358 47.36342427374285
+v -80.93917847801795 3.44213696955998 -29.45945175195815
+v -69.24069414918027 5.47201485130358 -25.20155167023161
+v 14.95695564025123 3.44213696955998 84.82511059938531
+v 12.79516311338342 5.47201485130358 72.56497594397446
+v 14.95695564025119 3.44213696955998 -84.82511059938533
+v 12.79516311338339 5.47201485130358 -72.56497594397447
+v -43.06683732938370 3.44213696955998 74.59395037579654
+v -36.84220383218028 5.47201485130358 63.81256890014507
+v 65.98222283776671 3.44213696955998 -55.36565884742719
+v 56.44553103579685 5.47201485130358 -47.36342427374289
+v 61.64946696987336 7.13792180161393 0.00000000000000
+v -30.82473348493671 7.13792180161393 -53.39000452567997
+v 47.22623159351846 7.13792180161393 39.62751351201415
+v -57.93154918697460 7.13792180161393 -21.08535952898716
+v -57.93154918697459 7.13792180161393 21.08535952898718
+v 10.70531759345613 7.13792180161393 60.71287304100132
+v 10.70531759345610 7.13792180161393 -60.71287304100133
+v -30.82473348493667 7.13792180161393 53.39000452567999
+v 47.22623159351845 7.13792180161393 -39.62751351201417
+v 3.62814454378410 0.07000000000000 114.53939352316701
+v 3.62814454378410 3.28500000000000 114.53939352316701
+v 3.62814454378410 5.00000000000000 114.53939352316701
+v 3.62814454378410 6.71500000000000 114.53939352316701
+v 3.62814454378410 6.93000000000000 114.53939352316701
+v -42.58412044416730 0.07000000000000 106.39092436614204
+v -42.58412044416730 3.28500000000000 106.39092436614204
+v -42.58412044416730 5.00000000000000 106.39092436614204
+v -42.58412044416730 6.71500000000000 106.39092436614204
+v -42.58412044416730 6.93000000000000 106.39092436614204
+v -70.53739817655406 0.00000000000000 -90.44119596785730
+v -70.53739817655406 3.25000000000000 -90.44119596785730
+v -70.53739817655406 5.00000000000000 -90.44119596785730
+v -70.53739817655406 6.75000000000000 -90.44119596785730
+v -70.53739817655406 7.00000000000000 -90.44119596785730
+v -101.31588163156762 0.00000000000000 -53.76082773574343
+v -101.31588163156762 3.25000000000000 -53.76082773574343
+v -101.31588163156762 5.00000000000000 -53.76082773574343
+v -101.31588163156762 6.75000000000000 -53.76082773574343
+v -101.31588163156762 7.00000000000000 -53.76082773574343
+v 97.21618336341665 0.00000000000000 -60.86171343188304
+v 97.21618336341665 3.25000000000000 -60.86171343188304
+v 97.21618336341665 5.00000000000000 -60.86171343188304
+v 113.59307234508819 0.00000000000000 -15.86658075382527
+v 113.59307234508819 3.25000000000000 -15.86658075382527
+v 113.59307234508819 5.00000000000000 -15.86658075382527
+v 113.59307234508819 6.75000000000000 -15.86658075382527
+v 113.59307234508819 7.00000000000000 -15.86658075382527
+v 97.21618336341665 6.75000000000000 -60.86171343188304
+v 97.21618336341665 7.00000000000000 -60.86171343188304
+# 166 vertices
+
+vn -0.19665808619539 0.98047212970791 0.00000000000000
+vn -0.17096171580051 0.98527767240030 0.00000000000000
+vn -0.14504370205155 0.98942524957431 0.00000000000000
+vn -0.11918337919454 0.99287225871396 0.00000000000000
+vn 0.93969262382216 0.00000000000000 0.34202013498363
+vn 0.18479816258070 0.98047212849648 0.06726101655775
+vn 0.16065150684356 0.98527766408730 0.05847236953959
+vn 0.13629644509239 0.98942525800021 0.04960784097704
+vn 0.11199575940161 0.99287225631785 0.04076312684726
+vn 0.08725951913662 0.99567920870674 0.03175987514404
+vn 0.06240394405703 0.99779249304688 0.02271318087430
+vn 0.03740401526039 0.99920748596035 0.01361395031560
+vn 0.01252223852369 0.99991120640625 0.00455772372410
+vn 0.00000000000000 0.00000000000000 0.00000000000000
+vn -0.09285966373172 0.99567920679887 0.00000000000000
+vn -0.06640890306397 0.99779249225169 0.00000000000000
+vn -0.03980452152388 0.99920748599390 0.00000000000000
+vn -0.01330268900060 0.99991151531791 0.00000000000000
+vn -0.03414931804942 0.98047212208198 -0.19367044662728
+vn -0.02968721123287 0.98527766099421 -0.16836448626413
+vn -0.02518657098508 0.98942525288617 -0.14284013999273
+vn -0.02069597978439 0.99287225679984 -0.11737273149223
+vn -0.01612491261274 0.99567920643049 -0.09144892057968
+vn -0.01153178339161 0.99779249308424 -0.06539999018760
+vn -0.00691198270819 0.99920748594613 -0.03919980260488
+vn -0.00231401612509 0.99991120639602 -0.01312343906989
+vn 0.49999995856928 0.00000000000000 0.86602542770448
+vn 0.09832902812412 0.98047212898587 0.17031091130661
+vn 0.08548088694937 0.98527766371861 0.14805722996041
+vn 0.07252181751881 0.98942525863608 0.12561147860243
+vn 0.05959168951892 0.99287225740849 0.10321584669447
+vn 0.04642982540080 0.99567920764963 0.08041882097783
+vn 0.03320445329494 0.99779249288809 0.05751178503193
+vn 0.01989513607874 0.99920652902614 0.03450356375710
+vn 0.00664128799372 0.99991144280459 0.01153255575468
+vn 0.18479816258070 0.98047212849648 -0.06726101655775
+vn 0.16065149236198 0.98527766666057 -0.05847236596702
+vn 0.13629645313039 0.98942525674626 -0.04960784390263
+vn 0.11199575940161 0.99287225631785 -0.04076312684726
+vn 0.08725951915726 0.99567920894235 -0.03175986770098
+vn 0.06240394034624 0.99779249327884 -0.02271318087958
+vn 0.03740395492580 0.99920716843738 -0.01363740075164
+vn 0.01251970487735 0.99991117055467 -0.00457252553575
+vn 0.49999995856928 0.00000000000000 -0.86602542770448
+vn -0.17364815788816 0.00000000000000 0.98480775649974
+vn -0.17364814343632 0.00000000000000 0.98480775904799
+vn -0.03414931442702 0.98047212503627 0.19367043230968
+vn -0.02968721309388 0.98527766093973 0.16836448625482
+vn -0.02518657109230 0.98942525709813 0.14284011079847
+vn -0.02069597794064 0.99287225770638 0.11737272414882
+vn -0.01612491261274 0.99567920643049 0.09144892057968
+vn -0.01153178525401 0.99779249306281 0.06539999018620
+vn -0.00693790511801 0.99920652903996 0.03921960984633
+vn -0.00232356852067 0.99991158690294 0.01309272342093
+vn 0.09832904263167 0.98047212506099 -0.17031092552601
+vn 0.08548088694937 0.98527766371861 -0.14805722996041
+vn 0.07252181751881 0.98942525863608 -0.12561147860243
+vn 0.05959168951892 0.99287225740849 -0.10321584669447
+vn 0.04642982540080 0.99567920764963 -0.08041882097783
+vn 0.03320444958798 0.99779249343906 -0.05751177761311
+vn 0.01991821206097 0.99920621453817 -0.03449935733593
+vn 0.00666159899357 0.99991124226914 -0.01153822701473
+vn -0.76604442833138 0.00000000000000 0.64278762730971
+vn -0.15064887256782 0.98047211845827 0.12640942259180
+vn -0.13096431712387 0.98527766152995 0.10989211677986
+vn -0.11110991348716 0.98942525166848 0.09323228242209
+vn -0.09129977602114 0.99287225761365 0.07660960096268
+vn -0.07113462739735 0.99567920714147 0.05968903794818
+vn -0.05087216252574 0.99779249299289 0.04268681303383
+vn -0.03051647074462 0.99920621459625 0.02560636103619
+vn -0.01017896945524 0.99991171461749 0.00854116804275
+vn -0.15064887285159 0.98047212030514 -0.12640940792875
+vn -0.13096431744556 0.98527766395006 -0.10989209469805
+vn -0.11110989884714 0.98942525399393 -0.09323227519063
+vn -0.09129976858055 0.99287225772232 -0.07660960842164
+vn -0.07113462000028 0.99567920789057 -0.05968903426779
+vn -0.05087216252574 0.99779249299289 -0.04268681303383
+vn -0.03051647078805 0.99920621463405 -0.02560635950969
+vn -0.01019053593323 0.99991151385348 -0.00855087367662
+vn 0.93969264297872 0.00000000000000 -0.34202008235141
+vn 0.93969265255700 0.00000000000000 -0.34202005603530
+vn 0.00000000000000 -1.00000000000000 0.00000000000000
+vn 0.98846473802528 0.15145118580127 0.00000000000000
+vn -0.98846473665810 -0.15145119472433 0.00000000000000
+vn -0.92885302594117 0.15145119877413 -0.33807482986731
+vn 0.92885298744057 -0.15145135122680 0.33807486735087
+vn 0.17164509815197 0.15145141782323 0.97344770189247
+vn -0.17164517289927 -0.15145094119918 -0.97344776286674
+vn -0.49423234715525 0.15145125697307 -0.85603557390256
+vn 0.49423238039546 -0.15145145174166 0.85603552025251
+vn -0.92885303412084 0.15145119038919 0.33807481115015
+vn 0.92885298835789 -0.15145132675655 -0.33807487579276
+vn 0.17164509776460 0.15145143238260 -0.97344769969559
+vn -0.17164518619931 -0.15145098448992 0.97344775378632
+vn -0.49423234938602 0.15145122785434 0.85603557776636
+vn 0.49423238374161 -0.15145140806357 -0.85603552604822
+vn 0.75720786045583 0.15145155586903 -0.63537286870684
+vn -0.75720792689815 -0.15145119960879 0.63537287444434
+vn 0.75720787412678 0.15145143939411 0.63537288017813
+vn -0.75720795782858 -0.15145089585037 -0.63537290998845
+vn 0.99445250530214 0.10518657090281 0.00000000000000
+vn -0.93447968959132 0.10518661618010 -0.34012275066201
+vn 0.17268482835063 0.10518680949942 0.97934451811650
+vn -0.49722621438918 0.10518658401438 -0.86122115293785
+vn -0.93447968592956 0.10518665302082 0.34012274932923
+vn 0.17268481470582 0.10518676556122 -0.97934452524165
+vn -0.49722625026737 0.10518681626770 0.86122110385691
+vn 0.76179478336745 0.10518668286006 -0.63922176885885
+vn 0.76179481716844 0.10518662792257 0.63922173761660
+vn -0.00066787260224 -0.99999260363101 0.00378769447847
+vn -0.93640329589009 0.00000000000000 0.35092572924507
+vn -0.93640328609681 0.00000000000000 0.35092575537727
+vn -0.02888317292269 0.98606987879052 0.16380462894547
+vn 0.75990752558337 0.00000000000000 0.65003119352978
+vn 0.18372862996709 0.00000000000000 -0.98297700406999
+vn -0.12458981649409 0.98668540184593 -0.10454327051564
+vn -0.93613918929888 0.00000000000000 0.35162966066421
+vn 0.75941870623911 0.00000000000000 0.65060220458750
+vn 0.15283203796476 0.98668540199390 -0.05562630370322
+vn 0.16354942482305 0.00000000000000 -0.98653514161435
+vn 0.16354948283336 0.00000000000000 -0.98653513199731
+vn 0.16354939581789 0.00000000000000 -0.98653514642288
+# 122 normals
+
+vt 0.44444444775581 -0.50000000000000 0.00000000000000
+vt 0.44444444775581 -0.37500000000000 0.00000000000000
+vt 0.55555558204651 -0.37500000000000 0.00000000000000
+vt 0.55555558204651 -0.50000000000000 0.00000000000000
+vt 0.44444444775581 -0.25000000000000 0.00000000000000
+vt 0.55555558204651 -0.25000000000000 0.00000000000000
+vt 0.44444444775581 -0.12500000000000 0.00000000000000
+vt 0.55555558204651 -0.12500000000000 0.00000000000000
+vt 0.44444444775581 -0.87448954582214 0.00000000000000
+vt 0.55555558204651 -0.87448954582214 0.00000000000000
+vt 0.44444444775581 -0.74918210506439 0.00000000000000
+vt 0.55555558204651 -0.74918210506439 0.00000000000000
+vt 0.44444444775581 -0.62404942512512 0.00000000000000
+vt 0.55555558204651 -0.62404942512512 0.00000000000000
+vt 0.44444444775581 -0.49906313419342 0.00000000000000
+vt 0.55555558204651 -0.49906313419342 0.00000000000000
+vt 0.66666668653488 -0.50000000000000 0.00000000000000
+vt 0.66666668653488 -0.37500000000000 0.00000000000000
+vt 0.77777779102325 -0.37500000000000 0.00000000000000
+vt 0.77777779102325 -0.50000000000000 0.00000000000000
+vt 0.66666668653488 -0.25000000000000 0.00000000000000
+vt 0.77777779102325 -0.25000000000000 0.00000000000000
+vt 0.66666668653488 -0.12500000000000 0.00000000000000
+vt 0.77777779102325 -0.12500000000000 0.00000000000000
+vt 0.00000000000000 -0.50000000000000 0.00000000000000
+vt 0.00000000000000 -0.37500000000000 0.00000000000000
+vt 0.11111111193895 -0.37500000000000 0.00000000000000
+vt 0.11111111193895 -0.50000000000000 0.00000000000000
+vt 0.00000000000000 -0.25000000000000 0.00000000000000
+vt 0.11111111193895 -0.25000000000000 0.00000000000000
+vt 0.00000000000000 -0.12500000000000 0.00000000000000
+vt 0.11111111193895 -0.12500000000000 0.00000000000000
+vt 0.00000000000000 -0.87448954582214 0.00000000000000
+vt 0.11111111193895 -0.87448954582214 0.00000000000000
+vt 0.00000000000000 -0.74918210506439 0.00000000000000
+vt 0.11111111193895 -0.74918210506439 0.00000000000000
+vt 0.00000000000000 -0.62404942512512 0.00000000000000
+vt 0.11111111193895 -0.62404942512512 0.00000000000000
+vt 0.00000000000000 -0.49906313419342 0.00000000000000
+vt 0.11111111193895 -0.49906313419342 0.00000000000000
+vt 0.00000000000000 -0.37419420480728 0.00000000000000
+vt 0.11111111193895 -0.37419420480728 0.00000000000000
+vt 0.00000000000000 -0.24941366910934 0.00000000000000
+vt 0.11111111193895 -0.24941366910934 0.00000000000000
+vt 0.00000000000000 -0.12469206750393 0.00000000000000
+vt 0.11111111193895 -0.12469206750393 0.00000000000000
+vt 0.05555555596948 -0.00000000000000 0.00000000000000
+vt 0.44444444775581 -0.37419420480728 0.00000000000000
+vt 0.55555558204651 -0.37419420480728 0.00000000000000
+vt 0.44444444775581 -0.24941366910934 0.00000000000000
+vt 0.55555558204651 -0.24941366910934 0.00000000000000
+vt 0.44444444775581 -0.12469206750393 0.00000000000000
+vt 0.55555558204651 -0.12469206750393 0.00000000000000
+vt 0.50000000000000 -0.00000000000000 0.00000000000000
+vt 0.66666668653488 -0.87448954582214 0.00000000000000
+vt 0.77777779102325 -0.87448954582214 0.00000000000000
+vt 0.66666668653488 -0.74918210506439 0.00000000000000
+vt 0.77777779102325 -0.74918210506439 0.00000000000000
+vt 0.66666668653488 -0.62404942512512 0.00000000000000
+vt 0.77777779102325 -0.62404942512512 0.00000000000000
+vt 0.66666668653488 -0.49906313419342 0.00000000000000
+vt 0.77777779102325 -0.49906313419342 0.00000000000000
+vt 0.66666668653488 -0.37419420480728 0.00000000000000
+vt 0.77777779102325 -0.37419420480728 0.00000000000000
+vt 0.66666668653488 -0.24941366910934 0.00000000000000
+vt 0.77777779102325 -0.24941366910934 0.00000000000000
+vt 0.66666668653488 -0.12469206750393 0.00000000000000
+vt 0.77777779102325 -0.12469206750393 0.00000000000000
+vt 0.72222220897675 -0.00000000000000 0.00000000000000
+vt 0.22222222387791 -0.37500000000000 0.00000000000000
+vt 0.22222222387791 -0.50000000000000 0.00000000000000
+vt 0.22222222387791 -0.25000000000000 0.00000000000000
+vt 0.22222222387791 -0.12500000000000 0.00000000000000
+vt 0.22222222387791 -0.87448954582214 0.00000000000000
+vt 0.22222222387791 -0.74918210506439 0.00000000000000
+vt 0.22222222387791 -0.62404942512512 0.00000000000000
+vt 0.22222222387791 -0.49906313419342 0.00000000000000
+vt 0.22222222387791 -0.37419420480728 0.00000000000000
+vt 0.22222222387791 -0.24941366910934 0.00000000000000
+vt 0.22222222387791 -0.12469206750393 0.00000000000000
+vt 0.16666667163372 -0.00000000000000 0.00000000000000
+vt 0.88888889551163 -0.87448954582214 0.00000000000000
+vt 1.00000000000000 -0.87448954582214 0.00000000000000
+vt 0.88888889551163 -0.74918210506439 0.00000000000000
+vt 1.00000000000000 -0.74918210506439 0.00000000000000
+vt 0.88888889551163 -0.62404942512512 0.00000000000000
+vt 1.00000000000000 -0.62404942512512 0.00000000000000
+vt 0.88888889551163 -0.49906313419342 0.00000000000000
+vt 1.00000000000000 -0.49906313419342 0.00000000000000
+vt 0.88888889551163 -0.37419420480728 0.00000000000000
+vt 1.00000000000000 -0.37419420480728 0.00000000000000
+vt 0.88888889551163 -0.24941366910934 0.00000000000000
+vt 1.00000000000000 -0.24941366910934 0.00000000000000
+vt 0.88888889551163 -0.12469206750393 0.00000000000000
+vt 1.00000000000000 -0.12469206750393 0.00000000000000
+vt 0.94444441795349 -0.00000000000000 0.00000000000000
+vt 0.88888889551163 -0.37500000000000 0.00000000000000
+vt 0.88888889551163 -0.50000000000000 0.00000000000000
+vt 0.88888889551163 -0.25000000000000 0.00000000000000
+vt 0.88888889551163 -0.12500000000000 0.00000000000000
+vt 0.33333334326744 -0.37500000000000 0.00000000000000
+vt 0.33333334326744 -0.25000000000000 0.00000000000000
+vt 0.33333334326744 -0.12500000000000 0.00000000000000
+vt 0.33333334326744 -0.50000000000000 0.00000000000000
+vt 0.33333334326744 -0.87448954582214 0.00000000000000
+vt 0.33333334326744 -0.74918210506439 0.00000000000000
+vt 0.33333334326744 -0.62404942512512 0.00000000000000
+vt 0.33333334326744 -0.49906313419342 0.00000000000000
+vt 0.33333334326744 -0.37419420480728 0.00000000000000
+vt 0.33333334326744 -0.24941366910934 0.00000000000000
+vt 0.33333334326744 -0.12469206750393 0.00000000000000
+vt 0.27777779102325 -0.00000000000000 0.00000000000000
+vt 0.83333331346512 -0.00000000000000 0.00000000000000
+vt 0.38888889551163 -0.00000000000000 0.00000000000000
+vt 0.61111110448837 -0.00000000000000 0.00000000000000
+vt 1.00000000000000 -0.37500000000000 0.00000000000000
+vt 1.00000000000000 -0.50000000000000 0.00000000000000
+vt 1.00000000000000 -0.25000000000000 0.00000000000000
+vt 1.00000000000000 -0.12500000000000 0.00000000000000
+vt 0.93969261646271 -0.22668159008026 0.00000000000000
+vt 0.06030737981200 -0.22668159008026 0.00000000000000
+vt 0.17364817857742 -0.87938523292542 0.00000000000000
+vt 1.00000000000000 -0.57397794723511 0.00000000000000
+vt 0.67364817857742 -0.00000000000000 0.00000000000000
+vt 0.32635182142258 -0.00000000000000 0.00000000000000
+vt 0.00000000000000 -0.57397794723511 0.00000000000000
+vt 0.50000000000000 -1.00000000000000 0.00000000000000
+vt 0.82635182142258 -0.87938523292542 0.00000000000000
+# 128 texture coordinates
+
+o Oil:Tank
+usemtl Mat.2
+f 135/21/4 136/22/4 64/23/4 56/24/4
+f 136/22/4 137/25/4 77/26/4 64/23/4
+f 137/25/4 138/27/4 78/28/4 77/26/4
+f 138/27/4 30/3/4 79/13/4 78/28/4
+f 30/4/10 38/29/10 80/30/10 79/14/10
+f 60/31/12 83/33/12 82/34/12 81/32/12
+f 35/37/6 36/38/6 86/39/6 85/40/6
+f 36/38/6 37/41/6 87/42/6 86/39/6
+f 37/41/6 39/43/6 104/44/6 87/42/6
+f 39/43/6 40/18/6 105/10/6 104/44/6
+f 42/45/14 43/46/14 66/47/14 65/48/14
+f 43/46/14 44/49/14 67/50/14 66/47/14
+f 44/49/14 45/51/14 68/52/14 67/50/14
+f 45/51/14 46/6/14 69/7/14 68/52/14
+f 46/5/15 47/53/15 70/54/15 69/8/15
+f 48/55/17 49/57/17 72/58/17 71/56/17
+f 40/17/28 41/75/28 107/76/28 105/9/28
+f 57/77/30 58/79/30 109/80/30 108/78/30
+f 65/48/36 66/47/36 89/90/36 88/91/36
+f 66/47/36 67/50/36 90/92/36 89/90/36
+f 67/50/36 68/52/36 91/93/36 90/92/36
+f 68/52/36 69/7/36 92/15/36 91/93/36
+f 69/8/37 70/54/37 93/94/37 92/16/37
+f 71/56/39 72/58/39 95/96/39 94/95/39
+f 55/12/45 123/102/45 47/103/45 46/20/45
+f 124/104/47 125/106/47 49/107/47 48/105/47
+f 85/40/53 86/39/53 33/117/53 32/118/53
+f 86/39/53 87/42/53 34/119/53 33/117/53
+f 87/42/53 104/44/53 54/120/53 34/119/53
+f 104/44/53 105/10/53 55/11/53 54/120/53
+f 166/121/54 167/90/54 168/92/54 169/122/54 170/122/55 175/92/55 174/93/55 173/123/55 172/123/55 171/93/55
+f 1 1 1
+f 1 1 1
+f 1 1 1
+f 92/16/56 93/94/56 116/125/56 115/1/56
+f 94/95/58 95/96/58 118/127/58 117/126/58
+f 181/24/7 182/23/7 183/38/7 184/37/7 185/38/7 180/23/7 179/26/7 178/41/7 177/26/7 176/28/7
+f 1 1 1
+f 1 1 1
+f 1 1 1
+f 105/9/64 107/76/64 123/102/64 55/12/64
+f 108/78/66 109/80/66 125/106/66 124/104/66
+f 111/124/72 112/121/72 136/22/72 135/21/72
+f 112/121/72 113/122/72 137/25/72 136/22/72
+f 113/122/72 114/123/72 138/27/72 137/25/72
+f 114/123/72 115/2/72 30/3/72 138/27/72
+f 115/1/73 116/125/73 38/29/73 30/4/73
+f 117/126/75 118/127/75 83/33/75 60/31/75
+f 79/14/81 80/30/81 41/75/81 40/17/81
+f 81/32/83 82/34/83 58/79/83 57/77/83
+f 186/118/89 187/117/89 188/136/89 194/137/89 195/136/90 193/117/90 192/119/90 191/138/90 190/119/90 189/120/90
+f 1 1 1
+f 1 1 1
+f 1 1 1
+f 35/140/91 85/141/91 32/142/91 42/143/91 65/141/91 88/140/91 111/144/91 135/145/91 56/141/91
+f 1 1 1
+f 1 1 1
+f 1 1 1
+f 38/6/92 139/19/92 147/20/92 80/5/92
+f 81/32/93 148/32/93 144/31/93 60/31/93
+f 47/6/94 141/19/94 145/20/94 70/5/94
+f 71/56/95 146/56/95 142/55/95 48/55/95
+f 41/6/96 140/19/96 151/20/96 107/5/96
+f 108/78/97 152/78/97 143/77/97 57/77/97
+f 70/6/98 145/19/98 149/20/98 93/5/98
+f 94/95/99 150/95/99 146/56/99 71/56/99
+f 123/6/100 155/19/100 141/20/100 47/5/100
+f 48/105/101 142/105/101 156/104/101 124/104/101
+f 93/6/102 149/19/102 153/20/102 116/5/102
+f 117/126/103 154/126/103 150/95/103 94/95/103
+f 107/6/104 151/19/104 155/20/104 123/5/104
+f 124/104/105 156/104/105 152/78/105 108/78/105
+f 116/6/106 153/19/106 139/20/106 38/5/106
+f 60/31/107 144/31/107 154/126/107 117/126/107
+f 80/6/108 147/19/108 140/20/108 41/5/108
+f 57/77/109 143/77/109 148/32/109 81/32/109
+f 83/6/110 161/19/110 160/20/110 82/5/110
+f 49/6/111 157/19/111 159/20/111 72/5/111
+f 58/6/112 158/19/112 163/20/112 109/5/112
+f 72/6/113 159/19/113 162/20/113 95/5/113
+f 125/6/114 165/19/114 157/20/114 49/5/114
+f 95/6/115 162/19/115 164/20/115 118/5/115
+f 109/6/116 163/19/116 165/20/116 125/5/116
+f 118/6/117 164/19/117 161/20/117 83/5/117
+f 82/6/118 160/19/118 158/20/118 58/5/118
+f 88/6/119 166/19/119 171/20/119 111/5/119
+f 111/5/120 171/6/121 172/19/121 173/20/120 174/20/120 175/20/120 115/5/120 114/5/120 113/5/120 112/20/120
+f 1 1 1
+f 1 1 1
+f 1 1 1
+f 115/6/122 175/19/122 170/20/122 92/5/122
+f 92/5/123 170/6/123 169/19/123 168/20/123 167/5/123 166/20/123 88/20/123 89/5/123 90/20/123 91/20/123
+f 1 1 1
+f 1 1 1
+f 1 1 1
+f 56/6/91 181/19/91 176/20/91 35/5/91
+f 35/5/124 176/6/124 177/19/124 178/20/124 179/20/124 180/20/124 40/5/124 39/5/124 37/5/124 36/20/124
+f 1 1 1
+f 1 1 1
+f 1 1 1
+f 40/6/125 180/19/125 185/20/125 79/5/125
+f 79/28/126 185/6/126 184/19/126 183/28/126 182/28/126 181/28/126 56/26/126 64/26/126 77/26/126 78/20/126
+f 1 1 1
+f 1 1 1
+f 1 1 1
+f 32/6/91 186/19/91 189/20/91 42/5/91
+f 42/6/127 189/19/127 190/20/127 191/5/127 192/20/127 193/20/127 46/5/127 45/5/127 44/5/127 43/20/127
+f 1 1 1
+f 1 1 1
+f 1 1 1
+f 46/6/128 193/19/128 195/20/128 55/5/128
+f 55/6/129 195/19/129 194/20/129 188/5/129 187/5/130 186/20/130 32/20/130 33/5/130 34/20/130 54/20/130
+f 1 1 1
+f 1 1 1
+f 1 1 1
+
+usemtl Mat.1
+f 139/29/11 144/31/11 148/32/11 147/30/11
+f 161/33/13 84/35/13 100/36/13 160/34/13
+f 141/53/16 142/55/16 146/56/16 145/54/16
+f 157/57/18 50/59/18 73/60/18 159/58/18
+f 50/59/19 51/61/19 74/62/19 73/60/19
+f 51/61/20 52/63/20 75/64/20 74/62/20
+f 52/63/21 53/65/21 76/66/21 75/64/21
+f 53/65/22 31/67/22 76/66/22
+f 84/35/24 106/68/24 101/69/24 100/36/24
+f 106/68/25 126/70/25 102/71/25 101/69/25
+f 126/70/26 130/72/26 103/73/26 102/71/26
+f 130/72/27 31/74/27 103/73/27
+f 140/75/29 143/77/29 152/78/29 151/76/29
+f 158/79/31 59/81/31 110/82/31 163/80/31
+f 59/81/32 61/83/32 127/84/32 110/82/32
+f 61/83/33 62/85/33 128/86/33 127/84/33
+f 62/85/34 63/87/34 129/88/34 128/86/34
+f 63/87/35 31/89/35 129/88/35
+f 145/54/38 146/56/38 150/95/38 149/94/38
+f 159/58/40 73/60/40 96/97/40 162/96/40
+f 73/60/41 74/62/41 97/98/41 96/97/41
+f 74/62/42 75/64/42 98/99/42 97/98/42
+f 75/64/43 76/66/43 99/100/43 98/99/43
+f 76/66/44 31/101/44 99/100/44
+f 155/102/46 156/104/46 142/105/46 141/103/46
+f 165/106/48 131/108/48 50/109/48 157/107/48
+f 131/108/49 132/110/49 51/111/49 50/109/49
+f 132/110/50 133/112/50 52/113/50 51/111/50
+f 133/112/51 134/114/51 53/115/51 52/113/51
+f 134/114/52 31/116/52 53/115/52
+f 149/94/57 150/95/57 154/126/57 153/125/57
+f 162/96/59 96/97/59 119/128/59 164/127/59
+f 96/97/60 97/98/60 120/129/60 119/128/60
+f 97/98/61 98/99/61 121/130/61 120/129/61
+f 98/99/62 99/100/62 122/131/62 121/130/62
+f 99/100/63 31/132/63 122/131/63
+f 151/76/65 152/78/65 156/104/65 155/102/65
+f 163/80/67 110/82/67 131/108/67 165/106/67
+f 110/82/68 127/84/68 132/110/68 131/108/68
+f 127/84/69 128/86/69 133/112/69 132/110/69
+f 128/86/70 129/88/70 134/114/70 133/112/70
+f 129/88/71 31/133/71 134/114/71
+f 153/125/74 154/126/74 144/31/74 139/29/74
+f 164/127/76 119/128/76 84/35/76 161/33/76
+f 119/128/77 120/129/77 106/68/77 84/35/77
+f 120/129/78 121/130/78 126/70/78 106/68/78
+f 121/130/79 122/131/79 130/72/79 126/70/79
+f 122/131/80 31/134/80 130/72/80
+f 147/30/82 148/32/82 143/77/82 140/75/82
+f 160/34/84 100/36/84 59/81/84 158/79/84
+f 100/36/85 101/69/85 61/83/85 59/81/85
+f 101/69/86 102/71/86 62/85/86 61/83/86
+f 102/71/87 103/73/87 63/87/87 62/85/87
+f 103/73/88 31/135/88 63/87/88
+

+ 16 - 0
worlds/world1.json

@@ -0,0 +1,16 @@
+{
+  "player": {
+    "startposition": [ 0, 1.7, 0 ]
+  },
+  "objects": [
+    {
+      "file": "models/boom/Boom.obj",
+      "pos": [ 0, 0, -4 ],
+      "rot": [ 0, 20, 0 ]
+    },
+    {
+      "file": "models/boom/Boom.obj",
+      "pos": [ 4, 0, -4 ]
+    }
+  ]
+}