diff --git a/neo/Doom3.sln b/neo/IceTech.sln
similarity index 88%
rename from neo/Doom3.sln
rename to neo/IceTech.sln
index 9dff0276..a7b33837 100644
--- a/neo/Doom3.sln
+++ b/neo/IceTech.sln
@@ -6,24 +6,26 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "libs", "libs", "{347D107C-D
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "exes", "exes", "{003B01AB-152D-45C8-BF45-E5A035042D7F}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dlls", "dlls", "{1E2B3940-65F8-4D8F-9EEE-85E94EBBC6DF}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "doom3", "doom3", "{1E2B3940-65F8-4D8F-9EEE-85E94EBBC6DF}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Game", "game.vcxproj", "{49BEC5C6-B964-417A-851E-808886B57430}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Game", "doom3\game.vcxproj", "{49BEC5C6-B964-417A-851E-808886B57430}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "idLib", "idlib.vcxproj", "{49BEC5C6-B964-417A-851E-808886B57400}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "idLib", "engine\idlib.vcxproj", "{49BEC5C6-B964-417A-851E-808886B57400}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CurlLib", "curllib.vcxproj", "{F46F5D4E-C1D4-4ADE-9FAA-5F0CE3AA07F1}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CurlLib", "engine\curllib.vcxproj", "{F46F5D4E-C1D4-4ADE-9FAA-5F0CE3AA07F1}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DoomDLL", "doomdll.vcxproj", "{49BEC5C6-B964-417A-851E-808886B57420}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DoomDLL", "engine\doomdll.vcxproj", "{49BEC5C6-B964-417A-851E-808886B57420}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MayaImport", "MayaImport.vcxproj", "{49BEC5C6-B964-417A-851E-808886B574F1}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MayaImport", "engine\MayaImport.vcxproj", "{49BEC5C6-B964-417A-851E-808886B574F1}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opengl", "opengl\opengl.vcxproj", "{58320C19-5139-47C5-AAFE-4CAD2C8ED14D}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opengl", "engine\opengl\opengl.vcxproj", "{58320C19-5139-47C5-AAFE-4CAD2C8ED14D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "preydlls", "preydlls", "{F65E2305-0208-4A25-BEB0-038C92484211}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PreyGame", "prey\PreyGame.vcxproj", "{6CD8E46D-E28E-493F-BB06-537A637A68C2}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "engine", "engine", "{02A5F4CA-646E-404A-805D-2A538D5DF7C4}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
@@ -100,6 +102,8 @@ Global
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
+ {347D107C-D787-4408-A60D-86FA45997F9B} = {02A5F4CA-646E-404A-805D-2A538D5DF7C4}
+ {003B01AB-152D-45C8-BF45-E5A035042D7F} = {02A5F4CA-646E-404A-805D-2A538D5DF7C4}
{49BEC5C6-B964-417A-851E-808886B57430} = {1E2B3940-65F8-4D8F-9EEE-85E94EBBC6DF}
{49BEC5C6-B964-417A-851E-808886B57400} = {347D107C-D787-4408-A60D-86FA45997F9B}
{F46F5D4E-C1D4-4ADE-9FAA-5F0CE3AA07F1} = {347D107C-D787-4408-A60D-86FA45997F9B}
diff --git a/neo/game.vcxproj b/neo/doom3/game.vcxproj
similarity index 90%
rename from neo/game.vcxproj
rename to neo/doom3/game.vcxproj
index c6e0dbe8..8b6101d0 100644
--- a/neo/game.vcxproj
+++ b/neo/doom3/game.vcxproj
@@ -93,58 +93,58 @@
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
@@ -180,7 +180,7 @@
- ../gamex64.dll
+ ../../base/gamex64.dll
Use
@@ -195,7 +195,7 @@
- ../gamex64.dll
+ ../../base/gamex64.dll
Use
@@ -210,7 +210,7 @@
- ../gamex64.dll
+ ../../base/gamex64.dll
Use
@@ -225,7 +225,7 @@
- ../gamex64.dll
+ ../../base/gamex64.dll
Use
@@ -240,7 +240,7 @@
- ../gamex64.dll
+ ../../base/gamex64.dll
Use
@@ -255,7 +255,7 @@
- ../gamex64.dll
+ ../../base/gamex64.dll
Use
@@ -270,7 +270,7 @@
- ../gamex64.dll
+ ../../base/gamex64.dll
Use
@@ -285,7 +285,7 @@
- ../gamex64.dll
+ ../../base/gamex64.dll
true
@@ -364,7 +364,7 @@
-
+
Create
Create
Create
@@ -438,15 +438,14 @@
-
+
-
+
{49bec5c6-b964-417a-851e-808886b57400}
- false
diff --git a/neo/game.vcxproj.filters b/neo/doom3/game.vcxproj.filters
similarity index 98%
rename from neo/game.vcxproj.filters
rename to neo/doom3/game.vcxproj.filters
index b0fe19b9..a34ca740 100644
--- a/neo/game.vcxproj.filters
+++ b/neo/doom3/game.vcxproj.filters
@@ -164,7 +164,7 @@
-
+
@@ -295,7 +295,7 @@
-
+
diff --git a/neo/game.vcxproj.user b/neo/doom3/game.vcxproj.user
similarity index 100%
rename from neo/game.vcxproj.user
rename to neo/doom3/game.vcxproj.user
diff --git a/neo/game/AF.cpp b/neo/doom3/game/AF.cpp
similarity index 100%
rename from neo/game/AF.cpp
rename to neo/doom3/game/AF.cpp
diff --git a/neo/game/AF.h b/neo/doom3/game/AF.h
similarity index 100%
rename from neo/game/AF.h
rename to neo/doom3/game/AF.h
diff --git a/neo/game/AFEntity.cpp b/neo/doom3/game/AFEntity.cpp
similarity index 100%
rename from neo/game/AFEntity.cpp
rename to neo/doom3/game/AFEntity.cpp
diff --git a/neo/game/AFEntity.h b/neo/doom3/game/AFEntity.h
similarity index 100%
rename from neo/game/AFEntity.h
rename to neo/doom3/game/AFEntity.h
diff --git a/neo/game/Actor.cpp b/neo/doom3/game/Actor.cpp
similarity index 100%
rename from neo/game/Actor.cpp
rename to neo/doom3/game/Actor.cpp
diff --git a/neo/game/Actor.h b/neo/doom3/game/Actor.h
similarity index 100%
rename from neo/game/Actor.h
rename to neo/doom3/game/Actor.h
diff --git a/neo/game/BrittleFracture.cpp b/neo/doom3/game/BrittleFracture.cpp
similarity index 100%
rename from neo/game/BrittleFracture.cpp
rename to neo/doom3/game/BrittleFracture.cpp
diff --git a/neo/game/BrittleFracture.h b/neo/doom3/game/BrittleFracture.h
similarity index 100%
rename from neo/game/BrittleFracture.h
rename to neo/doom3/game/BrittleFracture.h
diff --git a/neo/game/Camera.cpp b/neo/doom3/game/Camera.cpp
similarity index 100%
rename from neo/game/Camera.cpp
rename to neo/doom3/game/Camera.cpp
diff --git a/neo/game/Camera.h b/neo/doom3/game/Camera.h
similarity index 100%
rename from neo/game/Camera.h
rename to neo/doom3/game/Camera.h
diff --git a/neo/game/EndLevel.cpp b/neo/doom3/game/EndLevel.cpp
similarity index 100%
rename from neo/game/EndLevel.cpp
rename to neo/doom3/game/EndLevel.cpp
diff --git a/neo/game/EndLevel.h b/neo/doom3/game/EndLevel.h
similarity index 100%
rename from neo/game/EndLevel.h
rename to neo/doom3/game/EndLevel.h
diff --git a/neo/game/Entity.cpp b/neo/doom3/game/Entity.cpp
similarity index 100%
rename from neo/game/Entity.cpp
rename to neo/doom3/game/Entity.cpp
diff --git a/neo/game/Entity.h b/neo/doom3/game/Entity.h
similarity index 100%
rename from neo/game/Entity.h
rename to neo/doom3/game/Entity.h
diff --git a/neo/game/Fx.cpp b/neo/doom3/game/Fx.cpp
similarity index 100%
rename from neo/game/Fx.cpp
rename to neo/doom3/game/Fx.cpp
diff --git a/neo/game/Fx.h b/neo/doom3/game/Fx.h
similarity index 100%
rename from neo/game/Fx.h
rename to neo/doom3/game/Fx.h
diff --git a/neo/game/Game.def b/neo/doom3/game/Game.def
similarity index 100%
rename from neo/game/Game.def
rename to neo/doom3/game/Game.def
diff --git a/neo/game/Game.h b/neo/doom3/game/Game.h
similarity index 100%
rename from neo/game/Game.h
rename to neo/doom3/game/Game.h
diff --git a/neo/game/GameEdit.cpp b/neo/doom3/game/GameEdit.cpp
similarity index 100%
rename from neo/game/GameEdit.cpp
rename to neo/doom3/game/GameEdit.cpp
diff --git a/neo/game/GameEdit.h b/neo/doom3/game/GameEdit.h
similarity index 100%
rename from neo/game/GameEdit.h
rename to neo/doom3/game/GameEdit.h
diff --git a/neo/game/Game_local.cpp b/neo/doom3/game/Game_local.cpp
similarity index 100%
rename from neo/game/Game_local.cpp
rename to neo/doom3/game/Game_local.cpp
diff --git a/neo/game/Game_local.h b/neo/doom3/game/Game_local.h
similarity index 100%
rename from neo/game/Game_local.h
rename to neo/doom3/game/Game_local.h
diff --git a/neo/game/Game_network.cpp b/neo/doom3/game/Game_network.cpp
similarity index 100%
rename from neo/game/Game_network.cpp
rename to neo/doom3/game/Game_network.cpp
diff --git a/neo/game/IK.cpp b/neo/doom3/game/IK.cpp
similarity index 100%
rename from neo/game/IK.cpp
rename to neo/doom3/game/IK.cpp
diff --git a/neo/game/IK.h b/neo/doom3/game/IK.h
similarity index 100%
rename from neo/game/IK.h
rename to neo/doom3/game/IK.h
diff --git a/neo/game/Item.cpp b/neo/doom3/game/Item.cpp
similarity index 100%
rename from neo/game/Item.cpp
rename to neo/doom3/game/Item.cpp
diff --git a/neo/game/Item.h b/neo/doom3/game/Item.h
similarity index 100%
rename from neo/game/Item.h
rename to neo/doom3/game/Item.h
diff --git a/neo/game/Light.cpp b/neo/doom3/game/Light.cpp
similarity index 100%
rename from neo/game/Light.cpp
rename to neo/doom3/game/Light.cpp
diff --git a/neo/game/Light.h b/neo/doom3/game/Light.h
similarity index 100%
rename from neo/game/Light.h
rename to neo/doom3/game/Light.h
diff --git a/neo/game/Misc.cpp b/neo/doom3/game/Misc.cpp
similarity index 100%
rename from neo/game/Misc.cpp
rename to neo/doom3/game/Misc.cpp
diff --git a/neo/game/Misc.h b/neo/doom3/game/Misc.h
similarity index 100%
rename from neo/game/Misc.h
rename to neo/doom3/game/Misc.h
diff --git a/neo/game/Moveable.cpp b/neo/doom3/game/Moveable.cpp
similarity index 100%
rename from neo/game/Moveable.cpp
rename to neo/doom3/game/Moveable.cpp
diff --git a/neo/game/Moveable.h b/neo/doom3/game/Moveable.h
similarity index 100%
rename from neo/game/Moveable.h
rename to neo/doom3/game/Moveable.h
diff --git a/neo/game/Mover.cpp b/neo/doom3/game/Mover.cpp
similarity index 100%
rename from neo/game/Mover.cpp
rename to neo/doom3/game/Mover.cpp
diff --git a/neo/game/Mover.h b/neo/doom3/game/Mover.h
similarity index 100%
rename from neo/game/Mover.h
rename to neo/doom3/game/Mover.h
diff --git a/neo/game/MultiplayerGame.cpp b/neo/doom3/game/MultiplayerGame.cpp
similarity index 100%
rename from neo/game/MultiplayerGame.cpp
rename to neo/doom3/game/MultiplayerGame.cpp
diff --git a/neo/game/MultiplayerGame.h b/neo/doom3/game/MultiplayerGame.h
similarity index 100%
rename from neo/game/MultiplayerGame.h
rename to neo/doom3/game/MultiplayerGame.h
diff --git a/neo/game/Player.cpp b/neo/doom3/game/Player.cpp
similarity index 100%
rename from neo/game/Player.cpp
rename to neo/doom3/game/Player.cpp
diff --git a/neo/game/Player.h b/neo/doom3/game/Player.h
similarity index 100%
rename from neo/game/Player.h
rename to neo/doom3/game/Player.h
diff --git a/neo/game/PlayerIcon.cpp b/neo/doom3/game/PlayerIcon.cpp
similarity index 100%
rename from neo/game/PlayerIcon.cpp
rename to neo/doom3/game/PlayerIcon.cpp
diff --git a/neo/game/PlayerIcon.h b/neo/doom3/game/PlayerIcon.h
similarity index 100%
rename from neo/game/PlayerIcon.h
rename to neo/doom3/game/PlayerIcon.h
diff --git a/neo/game/PlayerView.cpp b/neo/doom3/game/PlayerView.cpp
similarity index 100%
rename from neo/game/PlayerView.cpp
rename to neo/doom3/game/PlayerView.cpp
diff --git a/neo/game/PlayerView.h b/neo/doom3/game/PlayerView.h
similarity index 100%
rename from neo/game/PlayerView.h
rename to neo/doom3/game/PlayerView.h
diff --git a/neo/game/Projectile.cpp b/neo/doom3/game/Projectile.cpp
similarity index 100%
rename from neo/game/Projectile.cpp
rename to neo/doom3/game/Projectile.cpp
diff --git a/neo/game/Projectile.h b/neo/doom3/game/Projectile.h
similarity index 100%
rename from neo/game/Projectile.h
rename to neo/doom3/game/Projectile.h
diff --git a/neo/game/Pvs.cpp b/neo/doom3/game/Pvs.cpp
similarity index 100%
rename from neo/game/Pvs.cpp
rename to neo/doom3/game/Pvs.cpp
diff --git a/neo/game/Pvs.h b/neo/doom3/game/Pvs.h
similarity index 100%
rename from neo/game/Pvs.h
rename to neo/doom3/game/Pvs.h
diff --git a/neo/game/SecurityCamera.cpp b/neo/doom3/game/SecurityCamera.cpp
similarity index 100%
rename from neo/game/SecurityCamera.cpp
rename to neo/doom3/game/SecurityCamera.cpp
diff --git a/neo/game/SecurityCamera.h b/neo/doom3/game/SecurityCamera.h
similarity index 100%
rename from neo/game/SecurityCamera.h
rename to neo/doom3/game/SecurityCamera.h
diff --git a/neo/game/SmokeParticles.cpp b/neo/doom3/game/SmokeParticles.cpp
similarity index 100%
rename from neo/game/SmokeParticles.cpp
rename to neo/doom3/game/SmokeParticles.cpp
diff --git a/neo/game/SmokeParticles.h b/neo/doom3/game/SmokeParticles.h
similarity index 100%
rename from neo/game/SmokeParticles.h
rename to neo/doom3/game/SmokeParticles.h
diff --git a/neo/game/Sound.cpp b/neo/doom3/game/Sound.cpp
similarity index 100%
rename from neo/game/Sound.cpp
rename to neo/doom3/game/Sound.cpp
diff --git a/neo/game/Sound.h b/neo/doom3/game/Sound.h
similarity index 100%
rename from neo/game/Sound.h
rename to neo/doom3/game/Sound.h
diff --git a/neo/game/Target.cpp b/neo/doom3/game/Target.cpp
similarity index 100%
rename from neo/game/Target.cpp
rename to neo/doom3/game/Target.cpp
diff --git a/neo/game/Target.h b/neo/doom3/game/Target.h
similarity index 100%
rename from neo/game/Target.h
rename to neo/doom3/game/Target.h
diff --git a/neo/game/Trigger.cpp b/neo/doom3/game/Trigger.cpp
similarity index 100%
rename from neo/game/Trigger.cpp
rename to neo/doom3/game/Trigger.cpp
diff --git a/neo/game/Trigger.h b/neo/doom3/game/Trigger.h
similarity index 100%
rename from neo/game/Trigger.h
rename to neo/doom3/game/Trigger.h
diff --git a/neo/game/Weapon.cpp b/neo/doom3/game/Weapon.cpp
similarity index 100%
rename from neo/game/Weapon.cpp
rename to neo/doom3/game/Weapon.cpp
diff --git a/neo/game/Weapon.h b/neo/doom3/game/Weapon.h
similarity index 100%
rename from neo/game/Weapon.h
rename to neo/doom3/game/Weapon.h
diff --git a/neo/game/WorldSpawn.cpp b/neo/doom3/game/WorldSpawn.cpp
similarity index 100%
rename from neo/game/WorldSpawn.cpp
rename to neo/doom3/game/WorldSpawn.cpp
diff --git a/neo/game/WorldSpawn.h b/neo/doom3/game/WorldSpawn.h
similarity index 100%
rename from neo/game/WorldSpawn.h
rename to neo/doom3/game/WorldSpawn.h
diff --git a/neo/game/ai/AAS.cpp b/neo/doom3/game/ai/AAS.cpp
similarity index 100%
rename from neo/game/ai/AAS.cpp
rename to neo/doom3/game/ai/AAS.cpp
diff --git a/neo/game/ai/AAS.h b/neo/doom3/game/ai/AAS.h
similarity index 100%
rename from neo/game/ai/AAS.h
rename to neo/doom3/game/ai/AAS.h
diff --git a/neo/game/ai/AAS_debug.cpp b/neo/doom3/game/ai/AAS_debug.cpp
similarity index 100%
rename from neo/game/ai/AAS_debug.cpp
rename to neo/doom3/game/ai/AAS_debug.cpp
diff --git a/neo/game/ai/AAS_local.h b/neo/doom3/game/ai/AAS_local.h
similarity index 100%
rename from neo/game/ai/AAS_local.h
rename to neo/doom3/game/ai/AAS_local.h
diff --git a/neo/game/ai/AAS_pathing.cpp b/neo/doom3/game/ai/AAS_pathing.cpp
similarity index 100%
rename from neo/game/ai/AAS_pathing.cpp
rename to neo/doom3/game/ai/AAS_pathing.cpp
diff --git a/neo/game/ai/AAS_routing.cpp b/neo/doom3/game/ai/AAS_routing.cpp
similarity index 100%
rename from neo/game/ai/AAS_routing.cpp
rename to neo/doom3/game/ai/AAS_routing.cpp
diff --git a/neo/game/ai/AI.cpp b/neo/doom3/game/ai/AI.cpp
similarity index 100%
rename from neo/game/ai/AI.cpp
rename to neo/doom3/game/ai/AI.cpp
diff --git a/neo/game/ai/AI.h b/neo/doom3/game/ai/AI.h
similarity index 100%
rename from neo/game/ai/AI.h
rename to neo/doom3/game/ai/AI.h
diff --git a/neo/game/ai/AI_Vagary.cpp b/neo/doom3/game/ai/AI_Vagary.cpp
similarity index 100%
rename from neo/game/ai/AI_Vagary.cpp
rename to neo/doom3/game/ai/AI_Vagary.cpp
diff --git a/neo/game/ai/AI_events.cpp b/neo/doom3/game/ai/AI_events.cpp
similarity index 100%
rename from neo/game/ai/AI_events.cpp
rename to neo/doom3/game/ai/AI_events.cpp
diff --git a/neo/game/ai/AI_pathing.cpp b/neo/doom3/game/ai/AI_pathing.cpp
similarity index 100%
rename from neo/game/ai/AI_pathing.cpp
rename to neo/doom3/game/ai/AI_pathing.cpp
diff --git a/neo/game/anim/Anim.cpp b/neo/doom3/game/anim/Anim.cpp
similarity index 100%
rename from neo/game/anim/Anim.cpp
rename to neo/doom3/game/anim/Anim.cpp
diff --git a/neo/game/anim/Anim.h b/neo/doom3/game/anim/Anim.h
similarity index 100%
rename from neo/game/anim/Anim.h
rename to neo/doom3/game/anim/Anim.h
diff --git a/neo/game/anim/Anim_Blend.cpp b/neo/doom3/game/anim/Anim_Blend.cpp
similarity index 100%
rename from neo/game/anim/Anim_Blend.cpp
rename to neo/doom3/game/anim/Anim_Blend.cpp
diff --git a/neo/game/anim/Anim_Import.cpp b/neo/doom3/game/anim/Anim_Import.cpp
similarity index 99%
rename from neo/game/anim/Anim_Import.cpp
rename to neo/doom3/game/anim/Anim_Import.cpp
index b1214471..e98ef24b 100644
--- a/neo/game/anim/Anim_Import.cpp
+++ b/neo/doom3/game/anim/Anim_Import.cpp
@@ -30,7 +30,7 @@ If you have questions concerning this license or the applicable additional terms
#pragma hdrstop
#include "../Game_local.h"
-#include "../../MayaImport/maya_main.h"
+#include "../../../engine/MayaImport/maya_main.h"
/***********************************************************************
diff --git a/neo/game/anim/Anim_Testmodel.cpp b/neo/doom3/game/anim/Anim_Testmodel.cpp
similarity index 100%
rename from neo/game/anim/Anim_Testmodel.cpp
rename to neo/doom3/game/anim/Anim_Testmodel.cpp
diff --git a/neo/game/anim/Anim_Testmodel.h b/neo/doom3/game/anim/Anim_Testmodel.h
similarity index 100%
rename from neo/game/anim/Anim_Testmodel.h
rename to neo/doom3/game/anim/Anim_Testmodel.h
diff --git a/neo/game/gamesys/Callbacks.cpp b/neo/doom3/game/gamesys/Callbacks.cpp
similarity index 100%
rename from neo/game/gamesys/Callbacks.cpp
rename to neo/doom3/game/gamesys/Callbacks.cpp
diff --git a/neo/game/gamesys/Class.cpp b/neo/doom3/game/gamesys/Class.cpp
similarity index 100%
rename from neo/game/gamesys/Class.cpp
rename to neo/doom3/game/gamesys/Class.cpp
diff --git a/neo/game/gamesys/Class.h b/neo/doom3/game/gamesys/Class.h
similarity index 100%
rename from neo/game/gamesys/Class.h
rename to neo/doom3/game/gamesys/Class.h
diff --git a/neo/game/gamesys/DebugGraph.cpp b/neo/doom3/game/gamesys/DebugGraph.cpp
similarity index 100%
rename from neo/game/gamesys/DebugGraph.cpp
rename to neo/doom3/game/gamesys/DebugGraph.cpp
diff --git a/neo/game/gamesys/DebugGraph.h b/neo/doom3/game/gamesys/DebugGraph.h
similarity index 100%
rename from neo/game/gamesys/DebugGraph.h
rename to neo/doom3/game/gamesys/DebugGraph.h
diff --git a/neo/game/gamesys/Event.cpp b/neo/doom3/game/gamesys/Event.cpp
similarity index 100%
rename from neo/game/gamesys/Event.cpp
rename to neo/doom3/game/gamesys/Event.cpp
diff --git a/neo/game/gamesys/Event.h b/neo/doom3/game/gamesys/Event.h
similarity index 100%
rename from neo/game/gamesys/Event.h
rename to neo/doom3/game/gamesys/Event.h
diff --git a/neo/game/gamesys/NoGameTypeInfo.h b/neo/doom3/game/gamesys/NoGameTypeInfo.h
similarity index 100%
rename from neo/game/gamesys/NoGameTypeInfo.h
rename to neo/doom3/game/gamesys/NoGameTypeInfo.h
diff --git a/neo/game/gamesys/SaveGame.cpp b/neo/doom3/game/gamesys/SaveGame.cpp
similarity index 100%
rename from neo/game/gamesys/SaveGame.cpp
rename to neo/doom3/game/gamesys/SaveGame.cpp
diff --git a/neo/game/gamesys/SaveGame.h b/neo/doom3/game/gamesys/SaveGame.h
similarity index 100%
rename from neo/game/gamesys/SaveGame.h
rename to neo/doom3/game/gamesys/SaveGame.h
diff --git a/neo/game/gamesys/SysCmds.cpp b/neo/doom3/game/gamesys/SysCmds.cpp
similarity index 100%
rename from neo/game/gamesys/SysCmds.cpp
rename to neo/doom3/game/gamesys/SysCmds.cpp
diff --git a/neo/game/gamesys/SysCmds.h b/neo/doom3/game/gamesys/SysCmds.h
similarity index 100%
rename from neo/game/gamesys/SysCmds.h
rename to neo/doom3/game/gamesys/SysCmds.h
diff --git a/neo/game/gamesys/SysCvar.cpp b/neo/doom3/game/gamesys/SysCvar.cpp
similarity index 100%
rename from neo/game/gamesys/SysCvar.cpp
rename to neo/doom3/game/gamesys/SysCvar.cpp
diff --git a/neo/game/gamesys/SysCvar.h b/neo/doom3/game/gamesys/SysCvar.h
similarity index 100%
rename from neo/game/gamesys/SysCvar.h
rename to neo/doom3/game/gamesys/SysCvar.h
diff --git a/neo/game/gamesys/TypeInfo.h b/neo/doom3/game/gamesys/TypeInfo.h
similarity index 100%
rename from neo/game/gamesys/TypeInfo.h
rename to neo/doom3/game/gamesys/TypeInfo.h
diff --git a/neo/game/physics/Clip.cpp b/neo/doom3/game/physics/Clip.cpp
similarity index 100%
rename from neo/game/physics/Clip.cpp
rename to neo/doom3/game/physics/Clip.cpp
diff --git a/neo/game/physics/Clip.h b/neo/doom3/game/physics/Clip.h
similarity index 100%
rename from neo/game/physics/Clip.h
rename to neo/doom3/game/physics/Clip.h
diff --git a/neo/game/physics/Force.cpp b/neo/doom3/game/physics/Force.cpp
similarity index 100%
rename from neo/game/physics/Force.cpp
rename to neo/doom3/game/physics/Force.cpp
diff --git a/neo/game/physics/Force.h b/neo/doom3/game/physics/Force.h
similarity index 100%
rename from neo/game/physics/Force.h
rename to neo/doom3/game/physics/Force.h
diff --git a/neo/game/physics/Force_Constant.cpp b/neo/doom3/game/physics/Force_Constant.cpp
similarity index 100%
rename from neo/game/physics/Force_Constant.cpp
rename to neo/doom3/game/physics/Force_Constant.cpp
diff --git a/neo/game/physics/Force_Constant.h b/neo/doom3/game/physics/Force_Constant.h
similarity index 100%
rename from neo/game/physics/Force_Constant.h
rename to neo/doom3/game/physics/Force_Constant.h
diff --git a/neo/game/physics/Force_Drag.cpp b/neo/doom3/game/physics/Force_Drag.cpp
similarity index 100%
rename from neo/game/physics/Force_Drag.cpp
rename to neo/doom3/game/physics/Force_Drag.cpp
diff --git a/neo/game/physics/Force_Drag.h b/neo/doom3/game/physics/Force_Drag.h
similarity index 100%
rename from neo/game/physics/Force_Drag.h
rename to neo/doom3/game/physics/Force_Drag.h
diff --git a/neo/game/physics/Force_Field.cpp b/neo/doom3/game/physics/Force_Field.cpp
similarity index 100%
rename from neo/game/physics/Force_Field.cpp
rename to neo/doom3/game/physics/Force_Field.cpp
diff --git a/neo/game/physics/Force_Field.h b/neo/doom3/game/physics/Force_Field.h
similarity index 100%
rename from neo/game/physics/Force_Field.h
rename to neo/doom3/game/physics/Force_Field.h
diff --git a/neo/game/physics/Force_Spring.cpp b/neo/doom3/game/physics/Force_Spring.cpp
similarity index 100%
rename from neo/game/physics/Force_Spring.cpp
rename to neo/doom3/game/physics/Force_Spring.cpp
diff --git a/neo/game/physics/Force_Spring.h b/neo/doom3/game/physics/Force_Spring.h
similarity index 100%
rename from neo/game/physics/Force_Spring.h
rename to neo/doom3/game/physics/Force_Spring.h
diff --git a/neo/game/physics/Physics.cpp b/neo/doom3/game/physics/Physics.cpp
similarity index 100%
rename from neo/game/physics/Physics.cpp
rename to neo/doom3/game/physics/Physics.cpp
diff --git a/neo/game/physics/Physics.h b/neo/doom3/game/physics/Physics.h
similarity index 100%
rename from neo/game/physics/Physics.h
rename to neo/doom3/game/physics/Physics.h
diff --git a/neo/game/physics/Physics_AF.cpp b/neo/doom3/game/physics/Physics_AF.cpp
similarity index 100%
rename from neo/game/physics/Physics_AF.cpp
rename to neo/doom3/game/physics/Physics_AF.cpp
diff --git a/neo/game/physics/Physics_AF.h b/neo/doom3/game/physics/Physics_AF.h
similarity index 100%
rename from neo/game/physics/Physics_AF.h
rename to neo/doom3/game/physics/Physics_AF.h
diff --git a/neo/game/physics/Physics_Actor.cpp b/neo/doom3/game/physics/Physics_Actor.cpp
similarity index 100%
rename from neo/game/physics/Physics_Actor.cpp
rename to neo/doom3/game/physics/Physics_Actor.cpp
diff --git a/neo/game/physics/Physics_Actor.h b/neo/doom3/game/physics/Physics_Actor.h
similarity index 100%
rename from neo/game/physics/Physics_Actor.h
rename to neo/doom3/game/physics/Physics_Actor.h
diff --git a/neo/game/physics/Physics_Base.cpp b/neo/doom3/game/physics/Physics_Base.cpp
similarity index 100%
rename from neo/game/physics/Physics_Base.cpp
rename to neo/doom3/game/physics/Physics_Base.cpp
diff --git a/neo/game/physics/Physics_Base.h b/neo/doom3/game/physics/Physics_Base.h
similarity index 100%
rename from neo/game/physics/Physics_Base.h
rename to neo/doom3/game/physics/Physics_Base.h
diff --git a/neo/game/physics/Physics_Monster.cpp b/neo/doom3/game/physics/Physics_Monster.cpp
similarity index 100%
rename from neo/game/physics/Physics_Monster.cpp
rename to neo/doom3/game/physics/Physics_Monster.cpp
diff --git a/neo/game/physics/Physics_Monster.h b/neo/doom3/game/physics/Physics_Monster.h
similarity index 100%
rename from neo/game/physics/Physics_Monster.h
rename to neo/doom3/game/physics/Physics_Monster.h
diff --git a/neo/game/physics/Physics_Parametric.cpp b/neo/doom3/game/physics/Physics_Parametric.cpp
similarity index 100%
rename from neo/game/physics/Physics_Parametric.cpp
rename to neo/doom3/game/physics/Physics_Parametric.cpp
diff --git a/neo/game/physics/Physics_Parametric.h b/neo/doom3/game/physics/Physics_Parametric.h
similarity index 100%
rename from neo/game/physics/Physics_Parametric.h
rename to neo/doom3/game/physics/Physics_Parametric.h
diff --git a/neo/game/physics/Physics_Player.cpp b/neo/doom3/game/physics/Physics_Player.cpp
similarity index 100%
rename from neo/game/physics/Physics_Player.cpp
rename to neo/doom3/game/physics/Physics_Player.cpp
diff --git a/neo/game/physics/Physics_Player.h b/neo/doom3/game/physics/Physics_Player.h
similarity index 100%
rename from neo/game/physics/Physics_Player.h
rename to neo/doom3/game/physics/Physics_Player.h
diff --git a/neo/game/physics/Physics_RigidBody.cpp b/neo/doom3/game/physics/Physics_RigidBody.cpp
similarity index 100%
rename from neo/game/physics/Physics_RigidBody.cpp
rename to neo/doom3/game/physics/Physics_RigidBody.cpp
diff --git a/neo/game/physics/Physics_RigidBody.h b/neo/doom3/game/physics/Physics_RigidBody.h
similarity index 100%
rename from neo/game/physics/Physics_RigidBody.h
rename to neo/doom3/game/physics/Physics_RigidBody.h
diff --git a/neo/game/physics/Physics_Static.cpp b/neo/doom3/game/physics/Physics_Static.cpp
similarity index 100%
rename from neo/game/physics/Physics_Static.cpp
rename to neo/doom3/game/physics/Physics_Static.cpp
diff --git a/neo/game/physics/Physics_Static.h b/neo/doom3/game/physics/Physics_Static.h
similarity index 100%
rename from neo/game/physics/Physics_Static.h
rename to neo/doom3/game/physics/Physics_Static.h
diff --git a/neo/game/physics/Physics_StaticMulti.cpp b/neo/doom3/game/physics/Physics_StaticMulti.cpp
similarity index 100%
rename from neo/game/physics/Physics_StaticMulti.cpp
rename to neo/doom3/game/physics/Physics_StaticMulti.cpp
diff --git a/neo/game/physics/Physics_StaticMulti.h b/neo/doom3/game/physics/Physics_StaticMulti.h
similarity index 100%
rename from neo/game/physics/Physics_StaticMulti.h
rename to neo/doom3/game/physics/Physics_StaticMulti.h
diff --git a/neo/game/physics/Push.cpp b/neo/doom3/game/physics/Push.cpp
similarity index 100%
rename from neo/game/physics/Push.cpp
rename to neo/doom3/game/physics/Push.cpp
diff --git a/neo/game/physics/Push.h b/neo/doom3/game/physics/Push.h
similarity index 100%
rename from neo/game/physics/Push.h
rename to neo/doom3/game/physics/Push.h
diff --git a/neo/game/script/Script_Compiler.cpp b/neo/doom3/game/script/Script_Compiler.cpp
similarity index 100%
rename from neo/game/script/Script_Compiler.cpp
rename to neo/doom3/game/script/Script_Compiler.cpp
diff --git a/neo/game/script/Script_Compiler.h b/neo/doom3/game/script/Script_Compiler.h
similarity index 100%
rename from neo/game/script/Script_Compiler.h
rename to neo/doom3/game/script/Script_Compiler.h
diff --git a/neo/game/script/Script_Interpreter.cpp b/neo/doom3/game/script/Script_Interpreter.cpp
similarity index 100%
rename from neo/game/script/Script_Interpreter.cpp
rename to neo/doom3/game/script/Script_Interpreter.cpp
diff --git a/neo/game/script/Script_Interpreter.h b/neo/doom3/game/script/Script_Interpreter.h
similarity index 100%
rename from neo/game/script/Script_Interpreter.h
rename to neo/doom3/game/script/Script_Interpreter.h
diff --git a/neo/game/script/Script_Program.cpp b/neo/doom3/game/script/Script_Program.cpp
similarity index 100%
rename from neo/game/script/Script_Program.cpp
rename to neo/doom3/game/script/Script_Program.cpp
diff --git a/neo/game/script/Script_Program.h b/neo/doom3/game/script/Script_Program.h
similarity index 100%
rename from neo/game/script/Script_Program.h
rename to neo/doom3/game/script/Script_Program.h
diff --git a/neo/game/script/Script_Thread.cpp b/neo/doom3/game/script/Script_Thread.cpp
similarity index 100%
rename from neo/game/script/Script_Thread.cpp
rename to neo/doom3/game/script/Script_Thread.cpp
diff --git a/neo/game/script/Script_Thread.h b/neo/doom3/game/script/Script_Thread.h
similarity index 100%
rename from neo/game/script/Script_Thread.h
rename to neo/doom3/game/script/Script_Thread.h
diff --git a/neo/MayaImport.vcxproj b/neo/engine/MayaImport.vcxproj
similarity index 100%
rename from neo/MayaImport.vcxproj
rename to neo/engine/MayaImport.vcxproj
diff --git a/neo/MayaImport.vcxproj.filters b/neo/engine/MayaImport.vcxproj.filters
similarity index 100%
rename from neo/MayaImport.vcxproj.filters
rename to neo/engine/MayaImport.vcxproj.filters
diff --git a/neo/MayaImport.vcxproj.user b/neo/engine/MayaImport.vcxproj.user
similarity index 100%
rename from neo/MayaImport.vcxproj.user
rename to neo/engine/MayaImport.vcxproj.user
diff --git a/neo/MayaImport/exporter.h b/neo/engine/MayaImport/exporter.h
similarity index 100%
rename from neo/MayaImport/exporter.h
rename to neo/engine/MayaImport/exporter.h
diff --git a/neo/MayaImport/maya_main.cpp b/neo/engine/MayaImport/maya_main.cpp
similarity index 100%
rename from neo/MayaImport/maya_main.cpp
rename to neo/engine/MayaImport/maya_main.cpp
diff --git a/neo/MayaImport/maya_main.h b/neo/engine/MayaImport/maya_main.h
similarity index 100%
rename from neo/MayaImport/maya_main.h
rename to neo/engine/MayaImport/maya_main.h
diff --git a/neo/MayaImport/mayaimport.def b/neo/engine/MayaImport/mayaimport.def
similarity index 100%
rename from neo/MayaImport/mayaimport.def
rename to neo/engine/MayaImport/mayaimport.def
diff --git a/neo/_Common.props b/neo/engine/_Common.props
similarity index 100%
rename from neo/_Common.props
rename to neo/engine/_Common.props
diff --git a/neo/_Curl.props b/neo/engine/_Curl.props
similarity index 100%
rename from neo/_Curl.props
rename to neo/engine/_Curl.props
diff --git a/neo/_Debug.props b/neo/engine/_Debug.props
similarity index 100%
rename from neo/_Debug.props
rename to neo/engine/_Debug.props
diff --git a/neo/_Dedicated.props b/neo/engine/_Dedicated.props
similarity index 100%
rename from neo/_Dedicated.props
rename to neo/engine/_Dedicated.props
diff --git a/neo/_DoomDLL.props b/neo/engine/_DoomDLL.props
similarity index 100%
rename from neo/_DoomDLL.props
rename to neo/engine/_DoomDLL.props
diff --git a/neo/_Game.props b/neo/engine/_Game.props
similarity index 100%
rename from neo/_Game.props
rename to neo/engine/_Game.props
diff --git a/neo/_MayaImport.props b/neo/engine/_MayaImport.props
similarity index 100%
rename from neo/_MayaImport.props
rename to neo/engine/_MayaImport.props
diff --git a/neo/_Release.props b/neo/engine/_Release.props
similarity index 100%
rename from neo/_Release.props
rename to neo/engine/_Release.props
diff --git a/neo/_TypeInfo.props b/neo/engine/_TypeInfo.props
similarity index 100%
rename from neo/_TypeInfo.props
rename to neo/engine/_TypeInfo.props
diff --git a/neo/_WithInlines.props b/neo/engine/_WithInlines.props
similarity index 100%
rename from neo/_WithInlines.props
rename to neo/engine/_WithInlines.props
diff --git a/neo/_WithMemoryLog.props b/neo/engine/_WithMemoryLog.props
similarity index 100%
rename from neo/_WithMemoryLog.props
rename to neo/engine/_WithMemoryLog.props
diff --git a/neo/_idlib.props b/neo/engine/_idlib.props
similarity index 100%
rename from neo/_idlib.props
rename to neo/engine/_idlib.props
diff --git a/neo/cm/CollisionModel.h b/neo/engine/cm/CollisionModel.h
similarity index 100%
rename from neo/cm/CollisionModel.h
rename to neo/engine/cm/CollisionModel.h
diff --git a/neo/cm/CollisionModel_contacts.cpp b/neo/engine/cm/CollisionModel_contacts.cpp
similarity index 100%
rename from neo/cm/CollisionModel_contacts.cpp
rename to neo/engine/cm/CollisionModel_contacts.cpp
diff --git a/neo/cm/CollisionModel_contents.cpp b/neo/engine/cm/CollisionModel_contents.cpp
similarity index 100%
rename from neo/cm/CollisionModel_contents.cpp
rename to neo/engine/cm/CollisionModel_contents.cpp
diff --git a/neo/cm/CollisionModel_debug.cpp b/neo/engine/cm/CollisionModel_debug.cpp
similarity index 100%
rename from neo/cm/CollisionModel_debug.cpp
rename to neo/engine/cm/CollisionModel_debug.cpp
diff --git a/neo/cm/CollisionModel_files.cpp b/neo/engine/cm/CollisionModel_files.cpp
similarity index 100%
rename from neo/cm/CollisionModel_files.cpp
rename to neo/engine/cm/CollisionModel_files.cpp
diff --git a/neo/cm/CollisionModel_load.cpp b/neo/engine/cm/CollisionModel_load.cpp
similarity index 100%
rename from neo/cm/CollisionModel_load.cpp
rename to neo/engine/cm/CollisionModel_load.cpp
diff --git a/neo/cm/CollisionModel_local.h b/neo/engine/cm/CollisionModel_local.h
similarity index 100%
rename from neo/cm/CollisionModel_local.h
rename to neo/engine/cm/CollisionModel_local.h
diff --git a/neo/cm/CollisionModel_rotate.cpp b/neo/engine/cm/CollisionModel_rotate.cpp
similarity index 100%
rename from neo/cm/CollisionModel_rotate.cpp
rename to neo/engine/cm/CollisionModel_rotate.cpp
diff --git a/neo/cm/CollisionModel_trace.cpp b/neo/engine/cm/CollisionModel_trace.cpp
similarity index 100%
rename from neo/cm/CollisionModel_trace.cpp
rename to neo/engine/cm/CollisionModel_trace.cpp
diff --git a/neo/cm/CollisionModel_translate.cpp b/neo/engine/cm/CollisionModel_translate.cpp
similarity index 100%
rename from neo/cm/CollisionModel_translate.cpp
rename to neo/engine/cm/CollisionModel_translate.cpp
diff --git a/neo/cm/PreyCM/CollisionModel.h b/neo/engine/cm/PreyCM/CollisionModel.h
similarity index 100%
rename from neo/cm/PreyCM/CollisionModel.h
rename to neo/engine/cm/PreyCM/CollisionModel.h
diff --git a/neo/cm/PreyCM/CollisionModel_contacts.cpp b/neo/engine/cm/PreyCM/CollisionModel_contacts.cpp
similarity index 100%
rename from neo/cm/PreyCM/CollisionModel_contacts.cpp
rename to neo/engine/cm/PreyCM/CollisionModel_contacts.cpp
diff --git a/neo/cm/PreyCM/CollisionModel_contents.cpp b/neo/engine/cm/PreyCM/CollisionModel_contents.cpp
similarity index 100%
rename from neo/cm/PreyCM/CollisionModel_contents.cpp
rename to neo/engine/cm/PreyCM/CollisionModel_contents.cpp
diff --git a/neo/cm/PreyCM/CollisionModel_debug.cpp b/neo/engine/cm/PreyCM/CollisionModel_debug.cpp
similarity index 100%
rename from neo/cm/PreyCM/CollisionModel_debug.cpp
rename to neo/engine/cm/PreyCM/CollisionModel_debug.cpp
diff --git a/neo/cm/PreyCM/CollisionModel_files.cpp b/neo/engine/cm/PreyCM/CollisionModel_files.cpp
similarity index 100%
rename from neo/cm/PreyCM/CollisionModel_files.cpp
rename to neo/engine/cm/PreyCM/CollisionModel_files.cpp
diff --git a/neo/cm/PreyCM/CollisionModel_load.cpp b/neo/engine/cm/PreyCM/CollisionModel_load.cpp
similarity index 100%
rename from neo/cm/PreyCM/CollisionModel_load.cpp
rename to neo/engine/cm/PreyCM/CollisionModel_load.cpp
diff --git a/neo/cm/PreyCM/CollisionModel_local.h b/neo/engine/cm/PreyCM/CollisionModel_local.h
similarity index 100%
rename from neo/cm/PreyCM/CollisionModel_local.h
rename to neo/engine/cm/PreyCM/CollisionModel_local.h
diff --git a/neo/cm/PreyCM/CollisionModel_rotate.cpp b/neo/engine/cm/PreyCM/CollisionModel_rotate.cpp
similarity index 100%
rename from neo/cm/PreyCM/CollisionModel_rotate.cpp
rename to neo/engine/cm/PreyCM/CollisionModel_rotate.cpp
diff --git a/neo/cm/PreyCM/CollisionModel_trace.cpp b/neo/engine/cm/PreyCM/CollisionModel_trace.cpp
similarity index 100%
rename from neo/cm/PreyCM/CollisionModel_trace.cpp
rename to neo/engine/cm/PreyCM/CollisionModel_trace.cpp
diff --git a/neo/cm/PreyCM/CollisionModel_translate.cpp b/neo/engine/cm/PreyCM/CollisionModel_translate.cpp
similarity index 100%
rename from neo/cm/PreyCM/CollisionModel_translate.cpp
rename to neo/engine/cm/PreyCM/CollisionModel_translate.cpp
diff --git a/neo/curl/CHANGES b/neo/engine/curl/CHANGES
similarity index 100%
rename from neo/curl/CHANGES
rename to neo/engine/curl/CHANGES
diff --git a/neo/curl/COPYING b/neo/engine/curl/COPYING
similarity index 100%
rename from neo/curl/COPYING
rename to neo/engine/curl/COPYING
diff --git a/neo/curl/Makefile.am b/neo/engine/curl/Makefile.am
similarity index 100%
rename from neo/curl/Makefile.am
rename to neo/engine/curl/Makefile.am
diff --git a/neo/curl/Makefile.in b/neo/engine/curl/Makefile.in
similarity index 100%
rename from neo/curl/Makefile.in
rename to neo/engine/curl/Makefile.in
diff --git a/neo/curl/README b/neo/engine/curl/README
similarity index 100%
rename from neo/curl/README
rename to neo/engine/curl/README
diff --git a/neo/curl/RELEASE-NOTES b/neo/engine/curl/RELEASE-NOTES
similarity index 100%
rename from neo/curl/RELEASE-NOTES
rename to neo/engine/curl/RELEASE-NOTES
diff --git a/neo/curl/acinclude.m4 b/neo/engine/curl/acinclude.m4
similarity index 100%
rename from neo/curl/acinclude.m4
rename to neo/engine/curl/acinclude.m4
diff --git a/neo/curl/aclocal.m4 b/neo/engine/curl/aclocal.m4
similarity index 100%
rename from neo/curl/aclocal.m4
rename to neo/engine/curl/aclocal.m4
diff --git a/neo/curl/config.guess b/neo/engine/curl/config.guess
similarity index 100%
rename from neo/curl/config.guess
rename to neo/engine/curl/config.guess
diff --git a/neo/curl/config.sub b/neo/engine/curl/config.sub
similarity index 100%
rename from neo/curl/config.sub
rename to neo/engine/curl/config.sub
diff --git a/neo/curl/configure b/neo/engine/curl/configure
similarity index 100%
rename from neo/curl/configure
rename to neo/engine/curl/configure
diff --git a/neo/curl/configure.ac b/neo/engine/curl/configure.ac
similarity index 100%
rename from neo/curl/configure.ac
rename to neo/engine/curl/configure.ac
diff --git a/neo/curl/curl-config.in b/neo/engine/curl/curl-config.in
similarity index 100%
rename from neo/curl/curl-config.in
rename to neo/engine/curl/curl-config.in
diff --git a/neo/curl/curl-style.el b/neo/engine/curl/curl-style.el
similarity index 100%
rename from neo/curl/curl-style.el
rename to neo/engine/curl/curl-style.el
diff --git a/neo/curl/depcomp b/neo/engine/curl/depcomp
similarity index 100%
rename from neo/curl/depcomp
rename to neo/engine/curl/depcomp
diff --git a/neo/curl/docs/BINDINGS b/neo/engine/curl/docs/BINDINGS
similarity index 100%
rename from neo/curl/docs/BINDINGS
rename to neo/engine/curl/docs/BINDINGS
diff --git a/neo/curl/docs/BUGS b/neo/engine/curl/docs/BUGS
similarity index 100%
rename from neo/curl/docs/BUGS
rename to neo/engine/curl/docs/BUGS
diff --git a/neo/curl/docs/CONTRIBUTE b/neo/engine/curl/docs/CONTRIBUTE
similarity index 100%
rename from neo/curl/docs/CONTRIBUTE
rename to neo/engine/curl/docs/CONTRIBUTE
diff --git a/neo/curl/docs/FAQ b/neo/engine/curl/docs/FAQ
similarity index 100%
rename from neo/curl/docs/FAQ
rename to neo/engine/curl/docs/FAQ
diff --git a/neo/curl/docs/FEATURES b/neo/engine/curl/docs/FEATURES
similarity index 100%
rename from neo/curl/docs/FEATURES
rename to neo/engine/curl/docs/FEATURES
diff --git a/neo/curl/docs/HISTORY b/neo/engine/curl/docs/HISTORY
similarity index 100%
rename from neo/curl/docs/HISTORY
rename to neo/engine/curl/docs/HISTORY
diff --git a/neo/curl/docs/INSTALL b/neo/engine/curl/docs/INSTALL
similarity index 100%
rename from neo/curl/docs/INSTALL
rename to neo/engine/curl/docs/INSTALL
diff --git a/neo/curl/docs/INTERNALS b/neo/engine/curl/docs/INTERNALS
similarity index 100%
rename from neo/curl/docs/INTERNALS
rename to neo/engine/curl/docs/INTERNALS
diff --git a/neo/curl/docs/KNOWN_BUGS b/neo/engine/curl/docs/KNOWN_BUGS
similarity index 100%
rename from neo/curl/docs/KNOWN_BUGS
rename to neo/engine/curl/docs/KNOWN_BUGS
diff --git a/neo/curl/docs/MANUAL b/neo/engine/curl/docs/MANUAL
similarity index 100%
rename from neo/curl/docs/MANUAL
rename to neo/engine/curl/docs/MANUAL
diff --git a/neo/curl/docs/Makefile.am b/neo/engine/curl/docs/Makefile.am
similarity index 100%
rename from neo/curl/docs/Makefile.am
rename to neo/engine/curl/docs/Makefile.am
diff --git a/neo/curl/docs/Makefile.in b/neo/engine/curl/docs/Makefile.in
similarity index 100%
rename from neo/curl/docs/Makefile.in
rename to neo/engine/curl/docs/Makefile.in
diff --git a/neo/curl/docs/README.win32 b/neo/engine/curl/docs/README.win32
similarity index 100%
rename from neo/curl/docs/README.win32
rename to neo/engine/curl/docs/README.win32
diff --git a/neo/curl/docs/RESOURCES b/neo/engine/curl/docs/RESOURCES
similarity index 100%
rename from neo/curl/docs/RESOURCES
rename to neo/engine/curl/docs/RESOURCES
diff --git a/neo/curl/docs/SSLCERTS b/neo/engine/curl/docs/SSLCERTS
similarity index 100%
rename from neo/curl/docs/SSLCERTS
rename to neo/engine/curl/docs/SSLCERTS
diff --git a/neo/curl/docs/THANKS b/neo/engine/curl/docs/THANKS
similarity index 100%
rename from neo/curl/docs/THANKS
rename to neo/engine/curl/docs/THANKS
diff --git a/neo/curl/docs/TODO b/neo/engine/curl/docs/TODO
similarity index 100%
rename from neo/curl/docs/TODO
rename to neo/engine/curl/docs/TODO
diff --git a/neo/curl/docs/TheArtOfHttpScripting b/neo/engine/curl/docs/TheArtOfHttpScripting
similarity index 100%
rename from neo/curl/docs/TheArtOfHttpScripting
rename to neo/engine/curl/docs/TheArtOfHttpScripting
diff --git a/neo/curl/docs/VERSIONS b/neo/engine/curl/docs/VERSIONS
similarity index 100%
rename from neo/curl/docs/VERSIONS
rename to neo/engine/curl/docs/VERSIONS
diff --git a/neo/curl/docs/curl-config.1 b/neo/engine/curl/docs/curl-config.1
similarity index 100%
rename from neo/curl/docs/curl-config.1
rename to neo/engine/curl/docs/curl-config.1
diff --git a/neo/curl/docs/curl-config.html b/neo/engine/curl/docs/curl-config.html
similarity index 100%
rename from neo/curl/docs/curl-config.html
rename to neo/engine/curl/docs/curl-config.html
diff --git a/neo/curl/docs/curl-config.pdf b/neo/engine/curl/docs/curl-config.pdf
similarity index 100%
rename from neo/curl/docs/curl-config.pdf
rename to neo/engine/curl/docs/curl-config.pdf
diff --git a/neo/curl/docs/curl.1 b/neo/engine/curl/docs/curl.1
similarity index 100%
rename from neo/curl/docs/curl.1
rename to neo/engine/curl/docs/curl.1
diff --git a/neo/curl/docs/curl.html b/neo/engine/curl/docs/curl.html
similarity index 100%
rename from neo/curl/docs/curl.html
rename to neo/engine/curl/docs/curl.html
diff --git a/neo/curl/docs/curl.pdf b/neo/engine/curl/docs/curl.pdf
similarity index 100%
rename from neo/curl/docs/curl.pdf
rename to neo/engine/curl/docs/curl.pdf
diff --git a/neo/curl/docs/examples/Makefile.am b/neo/engine/curl/docs/examples/Makefile.am
similarity index 100%
rename from neo/curl/docs/examples/Makefile.am
rename to neo/engine/curl/docs/examples/Makefile.am
diff --git a/neo/curl/docs/examples/Makefile.example b/neo/engine/curl/docs/examples/Makefile.example
similarity index 100%
rename from neo/curl/docs/examples/Makefile.example
rename to neo/engine/curl/docs/examples/Makefile.example
diff --git a/neo/curl/docs/examples/Makefile.in b/neo/engine/curl/docs/examples/Makefile.in
similarity index 100%
rename from neo/curl/docs/examples/Makefile.in
rename to neo/engine/curl/docs/examples/Makefile.in
diff --git a/neo/curl/docs/examples/README b/neo/engine/curl/docs/examples/README
similarity index 100%
rename from neo/curl/docs/examples/README
rename to neo/engine/curl/docs/examples/README
diff --git a/neo/curl/docs/examples/curlgtk.c b/neo/engine/curl/docs/examples/curlgtk.c
similarity index 100%
rename from neo/curl/docs/examples/curlgtk.c
rename to neo/engine/curl/docs/examples/curlgtk.c
diff --git a/neo/curl/docs/examples/curlx.c b/neo/engine/curl/docs/examples/curlx.c
similarity index 100%
rename from neo/curl/docs/examples/curlx.c
rename to neo/engine/curl/docs/examples/curlx.c
diff --git a/neo/curl/docs/examples/fopen.c b/neo/engine/curl/docs/examples/fopen.c
similarity index 100%
rename from neo/curl/docs/examples/fopen.c
rename to neo/engine/curl/docs/examples/fopen.c
diff --git a/neo/curl/docs/examples/ftpget.c b/neo/engine/curl/docs/examples/ftpget.c
similarity index 100%
rename from neo/curl/docs/examples/ftpget.c
rename to neo/engine/curl/docs/examples/ftpget.c
diff --git a/neo/curl/docs/examples/ftpgetresp.c b/neo/engine/curl/docs/examples/ftpgetresp.c
similarity index 100%
rename from neo/curl/docs/examples/ftpgetresp.c
rename to neo/engine/curl/docs/examples/ftpgetresp.c
diff --git a/neo/curl/docs/examples/ftpupload.c b/neo/engine/curl/docs/examples/ftpupload.c
similarity index 100%
rename from neo/curl/docs/examples/ftpupload.c
rename to neo/engine/curl/docs/examples/ftpupload.c
diff --git a/neo/curl/docs/examples/getinmemory.c b/neo/engine/curl/docs/examples/getinmemory.c
similarity index 100%
rename from neo/curl/docs/examples/getinmemory.c
rename to neo/engine/curl/docs/examples/getinmemory.c
diff --git a/neo/curl/docs/examples/http-post.c b/neo/engine/curl/docs/examples/http-post.c
similarity index 100%
rename from neo/curl/docs/examples/http-post.c
rename to neo/engine/curl/docs/examples/http-post.c
diff --git a/neo/curl/docs/examples/httpput.c b/neo/engine/curl/docs/examples/httpput.c
similarity index 100%
rename from neo/curl/docs/examples/httpput.c
rename to neo/engine/curl/docs/examples/httpput.c
diff --git a/neo/curl/docs/examples/makefile.dj b/neo/engine/curl/docs/examples/makefile.dj
similarity index 100%
rename from neo/curl/docs/examples/makefile.dj
rename to neo/engine/curl/docs/examples/makefile.dj
diff --git a/neo/curl/docs/examples/multi-app.c b/neo/engine/curl/docs/examples/multi-app.c
similarity index 100%
rename from neo/curl/docs/examples/multi-app.c
rename to neo/engine/curl/docs/examples/multi-app.c
diff --git a/neo/curl/docs/examples/multi-double.c b/neo/engine/curl/docs/examples/multi-double.c
similarity index 100%
rename from neo/curl/docs/examples/multi-double.c
rename to neo/engine/curl/docs/examples/multi-double.c
diff --git a/neo/curl/docs/examples/multi-post.c b/neo/engine/curl/docs/examples/multi-post.c
similarity index 100%
rename from neo/curl/docs/examples/multi-post.c
rename to neo/engine/curl/docs/examples/multi-post.c
diff --git a/neo/curl/docs/examples/multi-single.c b/neo/engine/curl/docs/examples/multi-single.c
similarity index 100%
rename from neo/curl/docs/examples/multi-single.c
rename to neo/engine/curl/docs/examples/multi-single.c
diff --git a/neo/curl/docs/examples/multithread.c b/neo/engine/curl/docs/examples/multithread.c
similarity index 100%
rename from neo/curl/docs/examples/multithread.c
rename to neo/engine/curl/docs/examples/multithread.c
diff --git a/neo/curl/docs/examples/persistant.c b/neo/engine/curl/docs/examples/persistant.c
similarity index 100%
rename from neo/curl/docs/examples/persistant.c
rename to neo/engine/curl/docs/examples/persistant.c
diff --git a/neo/curl/docs/examples/post-callback.c b/neo/engine/curl/docs/examples/post-callback.c
similarity index 100%
rename from neo/curl/docs/examples/post-callback.c
rename to neo/engine/curl/docs/examples/post-callback.c
diff --git a/neo/curl/docs/examples/postit2.c b/neo/engine/curl/docs/examples/postit2.c
similarity index 100%
rename from neo/curl/docs/examples/postit2.c
rename to neo/engine/curl/docs/examples/postit2.c
diff --git a/neo/curl/docs/examples/sepheaders.c b/neo/engine/curl/docs/examples/sepheaders.c
similarity index 100%
rename from neo/curl/docs/examples/sepheaders.c
rename to neo/engine/curl/docs/examples/sepheaders.c
diff --git a/neo/curl/docs/examples/simple.c b/neo/engine/curl/docs/examples/simple.c
similarity index 100%
rename from neo/curl/docs/examples/simple.c
rename to neo/engine/curl/docs/examples/simple.c
diff --git a/neo/curl/docs/examples/simplepost.c b/neo/engine/curl/docs/examples/simplepost.c
similarity index 100%
rename from neo/curl/docs/examples/simplepost.c
rename to neo/engine/curl/docs/examples/simplepost.c
diff --git a/neo/curl/docs/examples/simplessl.c b/neo/engine/curl/docs/examples/simplessl.c
similarity index 100%
rename from neo/curl/docs/examples/simplessl.c
rename to neo/engine/curl/docs/examples/simplessl.c
diff --git a/neo/curl/docs/index.html b/neo/engine/curl/docs/index.html
similarity index 100%
rename from neo/curl/docs/index.html
rename to neo/engine/curl/docs/index.html
diff --git a/neo/curl/docs/libcurl-the-guide b/neo/engine/curl/docs/libcurl-the-guide
similarity index 100%
rename from neo/curl/docs/libcurl-the-guide
rename to neo/engine/curl/docs/libcurl-the-guide
diff --git a/neo/curl/docs/libcurl/Makefile.am b/neo/engine/curl/docs/libcurl/Makefile.am
similarity index 100%
rename from neo/curl/docs/libcurl/Makefile.am
rename to neo/engine/curl/docs/libcurl/Makefile.am
diff --git a/neo/curl/docs/libcurl/Makefile.in b/neo/engine/curl/docs/libcurl/Makefile.in
similarity index 100%
rename from neo/curl/docs/libcurl/Makefile.in
rename to neo/engine/curl/docs/libcurl/Makefile.in
diff --git a/neo/curl/docs/libcurl/curl_easy_cleanup.3 b/neo/engine/curl/docs/libcurl/curl_easy_cleanup.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_cleanup.3
rename to neo/engine/curl/docs/libcurl/curl_easy_cleanup.3
diff --git a/neo/curl/docs/libcurl/curl_easy_cleanup.html b/neo/engine/curl/docs/libcurl/curl_easy_cleanup.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_cleanup.html
rename to neo/engine/curl/docs/libcurl/curl_easy_cleanup.html
diff --git a/neo/curl/docs/libcurl/curl_easy_cleanup.pdf b/neo/engine/curl/docs/libcurl/curl_easy_cleanup.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_cleanup.pdf
rename to neo/engine/curl/docs/libcurl/curl_easy_cleanup.pdf
diff --git a/neo/curl/docs/libcurl/curl_easy_duphandle.3 b/neo/engine/curl/docs/libcurl/curl_easy_duphandle.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_duphandle.3
rename to neo/engine/curl/docs/libcurl/curl_easy_duphandle.3
diff --git a/neo/curl/docs/libcurl/curl_easy_duphandle.html b/neo/engine/curl/docs/libcurl/curl_easy_duphandle.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_duphandle.html
rename to neo/engine/curl/docs/libcurl/curl_easy_duphandle.html
diff --git a/neo/curl/docs/libcurl/curl_easy_duphandle.pdf b/neo/engine/curl/docs/libcurl/curl_easy_duphandle.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_duphandle.pdf
rename to neo/engine/curl/docs/libcurl/curl_easy_duphandle.pdf
diff --git a/neo/curl/docs/libcurl/curl_easy_getinfo.3 b/neo/engine/curl/docs/libcurl/curl_easy_getinfo.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_getinfo.3
rename to neo/engine/curl/docs/libcurl/curl_easy_getinfo.3
diff --git a/neo/curl/docs/libcurl/curl_easy_getinfo.html b/neo/engine/curl/docs/libcurl/curl_easy_getinfo.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_getinfo.html
rename to neo/engine/curl/docs/libcurl/curl_easy_getinfo.html
diff --git a/neo/curl/docs/libcurl/curl_easy_getinfo.pdf b/neo/engine/curl/docs/libcurl/curl_easy_getinfo.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_getinfo.pdf
rename to neo/engine/curl/docs/libcurl/curl_easy_getinfo.pdf
diff --git a/neo/curl/docs/libcurl/curl_easy_init.3 b/neo/engine/curl/docs/libcurl/curl_easy_init.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_init.3
rename to neo/engine/curl/docs/libcurl/curl_easy_init.3
diff --git a/neo/curl/docs/libcurl/curl_easy_init.html b/neo/engine/curl/docs/libcurl/curl_easy_init.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_init.html
rename to neo/engine/curl/docs/libcurl/curl_easy_init.html
diff --git a/neo/curl/docs/libcurl/curl_easy_init.pdf b/neo/engine/curl/docs/libcurl/curl_easy_init.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_init.pdf
rename to neo/engine/curl/docs/libcurl/curl_easy_init.pdf
diff --git a/neo/curl/docs/libcurl/curl_easy_perform.3 b/neo/engine/curl/docs/libcurl/curl_easy_perform.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_perform.3
rename to neo/engine/curl/docs/libcurl/curl_easy_perform.3
diff --git a/neo/curl/docs/libcurl/curl_easy_perform.html b/neo/engine/curl/docs/libcurl/curl_easy_perform.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_perform.html
rename to neo/engine/curl/docs/libcurl/curl_easy_perform.html
diff --git a/neo/curl/docs/libcurl/curl_easy_perform.pdf b/neo/engine/curl/docs/libcurl/curl_easy_perform.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_perform.pdf
rename to neo/engine/curl/docs/libcurl/curl_easy_perform.pdf
diff --git a/neo/curl/docs/libcurl/curl_easy_setopt.3 b/neo/engine/curl/docs/libcurl/curl_easy_setopt.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_setopt.3
rename to neo/engine/curl/docs/libcurl/curl_easy_setopt.3
diff --git a/neo/curl/docs/libcurl/curl_easy_setopt.html b/neo/engine/curl/docs/libcurl/curl_easy_setopt.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_setopt.html
rename to neo/engine/curl/docs/libcurl/curl_easy_setopt.html
diff --git a/neo/curl/docs/libcurl/curl_easy_setopt.pdf b/neo/engine/curl/docs/libcurl/curl_easy_setopt.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_easy_setopt.pdf
rename to neo/engine/curl/docs/libcurl/curl_easy_setopt.pdf
diff --git a/neo/curl/docs/libcurl/curl_escape.3 b/neo/engine/curl/docs/libcurl/curl_escape.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_escape.3
rename to neo/engine/curl/docs/libcurl/curl_escape.3
diff --git a/neo/curl/docs/libcurl/curl_escape.html b/neo/engine/curl/docs/libcurl/curl_escape.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_escape.html
rename to neo/engine/curl/docs/libcurl/curl_escape.html
diff --git a/neo/curl/docs/libcurl/curl_escape.pdf b/neo/engine/curl/docs/libcurl/curl_escape.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_escape.pdf
rename to neo/engine/curl/docs/libcurl/curl_escape.pdf
diff --git a/neo/curl/docs/libcurl/curl_formadd.3 b/neo/engine/curl/docs/libcurl/curl_formadd.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_formadd.3
rename to neo/engine/curl/docs/libcurl/curl_formadd.3
diff --git a/neo/curl/docs/libcurl/curl_formadd.html b/neo/engine/curl/docs/libcurl/curl_formadd.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_formadd.html
rename to neo/engine/curl/docs/libcurl/curl_formadd.html
diff --git a/neo/curl/docs/libcurl/curl_formadd.pdf b/neo/engine/curl/docs/libcurl/curl_formadd.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_formadd.pdf
rename to neo/engine/curl/docs/libcurl/curl_formadd.pdf
diff --git a/neo/curl/docs/libcurl/curl_formfree.3 b/neo/engine/curl/docs/libcurl/curl_formfree.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_formfree.3
rename to neo/engine/curl/docs/libcurl/curl_formfree.3
diff --git a/neo/curl/docs/libcurl/curl_formfree.html b/neo/engine/curl/docs/libcurl/curl_formfree.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_formfree.html
rename to neo/engine/curl/docs/libcurl/curl_formfree.html
diff --git a/neo/curl/docs/libcurl/curl_formfree.pdf b/neo/engine/curl/docs/libcurl/curl_formfree.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_formfree.pdf
rename to neo/engine/curl/docs/libcurl/curl_formfree.pdf
diff --git a/neo/curl/docs/libcurl/curl_formparse.3 b/neo/engine/curl/docs/libcurl/curl_formparse.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_formparse.3
rename to neo/engine/curl/docs/libcurl/curl_formparse.3
diff --git a/neo/curl/docs/libcurl/curl_formparse.html b/neo/engine/curl/docs/libcurl/curl_formparse.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_formparse.html
rename to neo/engine/curl/docs/libcurl/curl_formparse.html
diff --git a/neo/curl/docs/libcurl/curl_formparse.pdf b/neo/engine/curl/docs/libcurl/curl_formparse.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_formparse.pdf
rename to neo/engine/curl/docs/libcurl/curl_formparse.pdf
diff --git a/neo/curl/docs/libcurl/curl_free.3 b/neo/engine/curl/docs/libcurl/curl_free.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_free.3
rename to neo/engine/curl/docs/libcurl/curl_free.3
diff --git a/neo/curl/docs/libcurl/curl_free.html b/neo/engine/curl/docs/libcurl/curl_free.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_free.html
rename to neo/engine/curl/docs/libcurl/curl_free.html
diff --git a/neo/curl/docs/libcurl/curl_free.pdf b/neo/engine/curl/docs/libcurl/curl_free.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_free.pdf
rename to neo/engine/curl/docs/libcurl/curl_free.pdf
diff --git a/neo/curl/docs/libcurl/curl_getdate.3 b/neo/engine/curl/docs/libcurl/curl_getdate.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_getdate.3
rename to neo/engine/curl/docs/libcurl/curl_getdate.3
diff --git a/neo/curl/docs/libcurl/curl_getdate.html b/neo/engine/curl/docs/libcurl/curl_getdate.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_getdate.html
rename to neo/engine/curl/docs/libcurl/curl_getdate.html
diff --git a/neo/curl/docs/libcurl/curl_getdate.pdf b/neo/engine/curl/docs/libcurl/curl_getdate.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_getdate.pdf
rename to neo/engine/curl/docs/libcurl/curl_getdate.pdf
diff --git a/neo/curl/docs/libcurl/curl_getenv.3 b/neo/engine/curl/docs/libcurl/curl_getenv.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_getenv.3
rename to neo/engine/curl/docs/libcurl/curl_getenv.3
diff --git a/neo/curl/docs/libcurl/curl_getenv.html b/neo/engine/curl/docs/libcurl/curl_getenv.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_getenv.html
rename to neo/engine/curl/docs/libcurl/curl_getenv.html
diff --git a/neo/curl/docs/libcurl/curl_getenv.pdf b/neo/engine/curl/docs/libcurl/curl_getenv.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_getenv.pdf
rename to neo/engine/curl/docs/libcurl/curl_getenv.pdf
diff --git a/neo/curl/docs/libcurl/curl_global_cleanup.3 b/neo/engine/curl/docs/libcurl/curl_global_cleanup.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_global_cleanup.3
rename to neo/engine/curl/docs/libcurl/curl_global_cleanup.3
diff --git a/neo/curl/docs/libcurl/curl_global_cleanup.html b/neo/engine/curl/docs/libcurl/curl_global_cleanup.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_global_cleanup.html
rename to neo/engine/curl/docs/libcurl/curl_global_cleanup.html
diff --git a/neo/curl/docs/libcurl/curl_global_cleanup.pdf b/neo/engine/curl/docs/libcurl/curl_global_cleanup.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_global_cleanup.pdf
rename to neo/engine/curl/docs/libcurl/curl_global_cleanup.pdf
diff --git a/neo/curl/docs/libcurl/curl_global_init.3 b/neo/engine/curl/docs/libcurl/curl_global_init.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_global_init.3
rename to neo/engine/curl/docs/libcurl/curl_global_init.3
diff --git a/neo/curl/docs/libcurl/curl_global_init.html b/neo/engine/curl/docs/libcurl/curl_global_init.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_global_init.html
rename to neo/engine/curl/docs/libcurl/curl_global_init.html
diff --git a/neo/curl/docs/libcurl/curl_global_init.pdf b/neo/engine/curl/docs/libcurl/curl_global_init.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_global_init.pdf
rename to neo/engine/curl/docs/libcurl/curl_global_init.pdf
diff --git a/neo/curl/docs/libcurl/curl_mprintf.3 b/neo/engine/curl/docs/libcurl/curl_mprintf.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_mprintf.3
rename to neo/engine/curl/docs/libcurl/curl_mprintf.3
diff --git a/neo/curl/docs/libcurl/curl_mprintf.html b/neo/engine/curl/docs/libcurl/curl_mprintf.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_mprintf.html
rename to neo/engine/curl/docs/libcurl/curl_mprintf.html
diff --git a/neo/curl/docs/libcurl/curl_mprintf.pdf b/neo/engine/curl/docs/libcurl/curl_mprintf.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_mprintf.pdf
rename to neo/engine/curl/docs/libcurl/curl_mprintf.pdf
diff --git a/neo/curl/docs/libcurl/curl_multi_add_handle.3 b/neo/engine/curl/docs/libcurl/curl_multi_add_handle.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_add_handle.3
rename to neo/engine/curl/docs/libcurl/curl_multi_add_handle.3
diff --git a/neo/curl/docs/libcurl/curl_multi_add_handle.html b/neo/engine/curl/docs/libcurl/curl_multi_add_handle.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_add_handle.html
rename to neo/engine/curl/docs/libcurl/curl_multi_add_handle.html
diff --git a/neo/curl/docs/libcurl/curl_multi_add_handle.pdf b/neo/engine/curl/docs/libcurl/curl_multi_add_handle.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_add_handle.pdf
rename to neo/engine/curl/docs/libcurl/curl_multi_add_handle.pdf
diff --git a/neo/curl/docs/libcurl/curl_multi_cleanup.3 b/neo/engine/curl/docs/libcurl/curl_multi_cleanup.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_cleanup.3
rename to neo/engine/curl/docs/libcurl/curl_multi_cleanup.3
diff --git a/neo/curl/docs/libcurl/curl_multi_cleanup.html b/neo/engine/curl/docs/libcurl/curl_multi_cleanup.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_cleanup.html
rename to neo/engine/curl/docs/libcurl/curl_multi_cleanup.html
diff --git a/neo/curl/docs/libcurl/curl_multi_cleanup.pdf b/neo/engine/curl/docs/libcurl/curl_multi_cleanup.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_cleanup.pdf
rename to neo/engine/curl/docs/libcurl/curl_multi_cleanup.pdf
diff --git a/neo/curl/docs/libcurl/curl_multi_fdset.3 b/neo/engine/curl/docs/libcurl/curl_multi_fdset.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_fdset.3
rename to neo/engine/curl/docs/libcurl/curl_multi_fdset.3
diff --git a/neo/curl/docs/libcurl/curl_multi_fdset.html b/neo/engine/curl/docs/libcurl/curl_multi_fdset.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_fdset.html
rename to neo/engine/curl/docs/libcurl/curl_multi_fdset.html
diff --git a/neo/curl/docs/libcurl/curl_multi_fdset.pdf b/neo/engine/curl/docs/libcurl/curl_multi_fdset.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_fdset.pdf
rename to neo/engine/curl/docs/libcurl/curl_multi_fdset.pdf
diff --git a/neo/curl/docs/libcurl/curl_multi_info_read.3 b/neo/engine/curl/docs/libcurl/curl_multi_info_read.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_info_read.3
rename to neo/engine/curl/docs/libcurl/curl_multi_info_read.3
diff --git a/neo/curl/docs/libcurl/curl_multi_info_read.html b/neo/engine/curl/docs/libcurl/curl_multi_info_read.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_info_read.html
rename to neo/engine/curl/docs/libcurl/curl_multi_info_read.html
diff --git a/neo/curl/docs/libcurl/curl_multi_info_read.pdf b/neo/engine/curl/docs/libcurl/curl_multi_info_read.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_info_read.pdf
rename to neo/engine/curl/docs/libcurl/curl_multi_info_read.pdf
diff --git a/neo/curl/docs/libcurl/curl_multi_init.3 b/neo/engine/curl/docs/libcurl/curl_multi_init.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_init.3
rename to neo/engine/curl/docs/libcurl/curl_multi_init.3
diff --git a/neo/curl/docs/libcurl/curl_multi_init.html b/neo/engine/curl/docs/libcurl/curl_multi_init.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_init.html
rename to neo/engine/curl/docs/libcurl/curl_multi_init.html
diff --git a/neo/curl/docs/libcurl/curl_multi_init.pdf b/neo/engine/curl/docs/libcurl/curl_multi_init.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_init.pdf
rename to neo/engine/curl/docs/libcurl/curl_multi_init.pdf
diff --git a/neo/curl/docs/libcurl/curl_multi_perform.3 b/neo/engine/curl/docs/libcurl/curl_multi_perform.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_perform.3
rename to neo/engine/curl/docs/libcurl/curl_multi_perform.3
diff --git a/neo/curl/docs/libcurl/curl_multi_perform.html b/neo/engine/curl/docs/libcurl/curl_multi_perform.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_perform.html
rename to neo/engine/curl/docs/libcurl/curl_multi_perform.html
diff --git a/neo/curl/docs/libcurl/curl_multi_perform.pdf b/neo/engine/curl/docs/libcurl/curl_multi_perform.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_perform.pdf
rename to neo/engine/curl/docs/libcurl/curl_multi_perform.pdf
diff --git a/neo/curl/docs/libcurl/curl_multi_remove_handle.3 b/neo/engine/curl/docs/libcurl/curl_multi_remove_handle.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_remove_handle.3
rename to neo/engine/curl/docs/libcurl/curl_multi_remove_handle.3
diff --git a/neo/curl/docs/libcurl/curl_multi_remove_handle.html b/neo/engine/curl/docs/libcurl/curl_multi_remove_handle.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_remove_handle.html
rename to neo/engine/curl/docs/libcurl/curl_multi_remove_handle.html
diff --git a/neo/curl/docs/libcurl/curl_multi_remove_handle.pdf b/neo/engine/curl/docs/libcurl/curl_multi_remove_handle.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_multi_remove_handle.pdf
rename to neo/engine/curl/docs/libcurl/curl_multi_remove_handle.pdf
diff --git a/neo/curl/docs/libcurl/curl_share_cleanup.3 b/neo/engine/curl/docs/libcurl/curl_share_cleanup.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_share_cleanup.3
rename to neo/engine/curl/docs/libcurl/curl_share_cleanup.3
diff --git a/neo/curl/docs/libcurl/curl_share_cleanup.html b/neo/engine/curl/docs/libcurl/curl_share_cleanup.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_share_cleanup.html
rename to neo/engine/curl/docs/libcurl/curl_share_cleanup.html
diff --git a/neo/curl/docs/libcurl/curl_share_cleanup.pdf b/neo/engine/curl/docs/libcurl/curl_share_cleanup.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_share_cleanup.pdf
rename to neo/engine/curl/docs/libcurl/curl_share_cleanup.pdf
diff --git a/neo/curl/docs/libcurl/curl_share_init.3 b/neo/engine/curl/docs/libcurl/curl_share_init.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_share_init.3
rename to neo/engine/curl/docs/libcurl/curl_share_init.3
diff --git a/neo/curl/docs/libcurl/curl_share_init.html b/neo/engine/curl/docs/libcurl/curl_share_init.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_share_init.html
rename to neo/engine/curl/docs/libcurl/curl_share_init.html
diff --git a/neo/curl/docs/libcurl/curl_share_init.pdf b/neo/engine/curl/docs/libcurl/curl_share_init.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_share_init.pdf
rename to neo/engine/curl/docs/libcurl/curl_share_init.pdf
diff --git a/neo/curl/docs/libcurl/curl_share_setopt.3 b/neo/engine/curl/docs/libcurl/curl_share_setopt.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_share_setopt.3
rename to neo/engine/curl/docs/libcurl/curl_share_setopt.3
diff --git a/neo/curl/docs/libcurl/curl_share_setopt.html b/neo/engine/curl/docs/libcurl/curl_share_setopt.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_share_setopt.html
rename to neo/engine/curl/docs/libcurl/curl_share_setopt.html
diff --git a/neo/curl/docs/libcurl/curl_share_setopt.pdf b/neo/engine/curl/docs/libcurl/curl_share_setopt.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_share_setopt.pdf
rename to neo/engine/curl/docs/libcurl/curl_share_setopt.pdf
diff --git a/neo/curl/docs/libcurl/curl_slist_append.3 b/neo/engine/curl/docs/libcurl/curl_slist_append.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_slist_append.3
rename to neo/engine/curl/docs/libcurl/curl_slist_append.3
diff --git a/neo/curl/docs/libcurl/curl_slist_append.html b/neo/engine/curl/docs/libcurl/curl_slist_append.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_slist_append.html
rename to neo/engine/curl/docs/libcurl/curl_slist_append.html
diff --git a/neo/curl/docs/libcurl/curl_slist_append.pdf b/neo/engine/curl/docs/libcurl/curl_slist_append.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_slist_append.pdf
rename to neo/engine/curl/docs/libcurl/curl_slist_append.pdf
diff --git a/neo/curl/docs/libcurl/curl_slist_free_all.3 b/neo/engine/curl/docs/libcurl/curl_slist_free_all.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_slist_free_all.3
rename to neo/engine/curl/docs/libcurl/curl_slist_free_all.3
diff --git a/neo/curl/docs/libcurl/curl_slist_free_all.html b/neo/engine/curl/docs/libcurl/curl_slist_free_all.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_slist_free_all.html
rename to neo/engine/curl/docs/libcurl/curl_slist_free_all.html
diff --git a/neo/curl/docs/libcurl/curl_slist_free_all.pdf b/neo/engine/curl/docs/libcurl/curl_slist_free_all.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_slist_free_all.pdf
rename to neo/engine/curl/docs/libcurl/curl_slist_free_all.pdf
diff --git a/neo/curl/docs/libcurl/curl_strequal.3 b/neo/engine/curl/docs/libcurl/curl_strequal.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_strequal.3
rename to neo/engine/curl/docs/libcurl/curl_strequal.3
diff --git a/neo/curl/docs/libcurl/curl_strequal.html b/neo/engine/curl/docs/libcurl/curl_strequal.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_strequal.html
rename to neo/engine/curl/docs/libcurl/curl_strequal.html
diff --git a/neo/curl/docs/libcurl/curl_strequal.pdf b/neo/engine/curl/docs/libcurl/curl_strequal.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_strequal.pdf
rename to neo/engine/curl/docs/libcurl/curl_strequal.pdf
diff --git a/neo/curl/docs/libcurl/curl_strnequal.3 b/neo/engine/curl/docs/libcurl/curl_strnequal.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_strnequal.3
rename to neo/engine/curl/docs/libcurl/curl_strnequal.3
diff --git a/neo/curl/docs/libcurl/curl_strnequal.html b/neo/engine/curl/docs/libcurl/curl_strnequal.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_strnequal.html
rename to neo/engine/curl/docs/libcurl/curl_strnequal.html
diff --git a/neo/curl/docs/libcurl/curl_strnequal.pdf b/neo/engine/curl/docs/libcurl/curl_strnequal.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_strnequal.pdf
rename to neo/engine/curl/docs/libcurl/curl_strnequal.pdf
diff --git a/neo/curl/docs/libcurl/curl_unescape.3 b/neo/engine/curl/docs/libcurl/curl_unescape.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_unescape.3
rename to neo/engine/curl/docs/libcurl/curl_unescape.3
diff --git a/neo/curl/docs/libcurl/curl_unescape.html b/neo/engine/curl/docs/libcurl/curl_unescape.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_unescape.html
rename to neo/engine/curl/docs/libcurl/curl_unescape.html
diff --git a/neo/curl/docs/libcurl/curl_unescape.pdf b/neo/engine/curl/docs/libcurl/curl_unescape.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_unescape.pdf
rename to neo/engine/curl/docs/libcurl/curl_unescape.pdf
diff --git a/neo/curl/docs/libcurl/curl_version.3 b/neo/engine/curl/docs/libcurl/curl_version.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_version.3
rename to neo/engine/curl/docs/libcurl/curl_version.3
diff --git a/neo/curl/docs/libcurl/curl_version.html b/neo/engine/curl/docs/libcurl/curl_version.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_version.html
rename to neo/engine/curl/docs/libcurl/curl_version.html
diff --git a/neo/curl/docs/libcurl/curl_version.pdf b/neo/engine/curl/docs/libcurl/curl_version.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_version.pdf
rename to neo/engine/curl/docs/libcurl/curl_version.pdf
diff --git a/neo/curl/docs/libcurl/curl_version_info.3 b/neo/engine/curl/docs/libcurl/curl_version_info.3
similarity index 100%
rename from neo/curl/docs/libcurl/curl_version_info.3
rename to neo/engine/curl/docs/libcurl/curl_version_info.3
diff --git a/neo/curl/docs/libcurl/curl_version_info.html b/neo/engine/curl/docs/libcurl/curl_version_info.html
similarity index 100%
rename from neo/curl/docs/libcurl/curl_version_info.html
rename to neo/engine/curl/docs/libcurl/curl_version_info.html
diff --git a/neo/curl/docs/libcurl/curl_version_info.pdf b/neo/engine/curl/docs/libcurl/curl_version_info.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/curl_version_info.pdf
rename to neo/engine/curl/docs/libcurl/curl_version_info.pdf
diff --git a/neo/curl/docs/libcurl/index.html b/neo/engine/curl/docs/libcurl/index.html
similarity index 100%
rename from neo/curl/docs/libcurl/index.html
rename to neo/engine/curl/docs/libcurl/index.html
diff --git a/neo/curl/docs/libcurl/libcurl-easy.3 b/neo/engine/curl/docs/libcurl/libcurl-easy.3
similarity index 100%
rename from neo/curl/docs/libcurl/libcurl-easy.3
rename to neo/engine/curl/docs/libcurl/libcurl-easy.3
diff --git a/neo/curl/docs/libcurl/libcurl-easy.html b/neo/engine/curl/docs/libcurl/libcurl-easy.html
similarity index 100%
rename from neo/curl/docs/libcurl/libcurl-easy.html
rename to neo/engine/curl/docs/libcurl/libcurl-easy.html
diff --git a/neo/curl/docs/libcurl/libcurl-easy.pdf b/neo/engine/curl/docs/libcurl/libcurl-easy.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/libcurl-easy.pdf
rename to neo/engine/curl/docs/libcurl/libcurl-easy.pdf
diff --git a/neo/curl/docs/libcurl/libcurl-errors.3 b/neo/engine/curl/docs/libcurl/libcurl-errors.3
similarity index 100%
rename from neo/curl/docs/libcurl/libcurl-errors.3
rename to neo/engine/curl/docs/libcurl/libcurl-errors.3
diff --git a/neo/curl/docs/libcurl/libcurl-errors.html b/neo/engine/curl/docs/libcurl/libcurl-errors.html
similarity index 100%
rename from neo/curl/docs/libcurl/libcurl-errors.html
rename to neo/engine/curl/docs/libcurl/libcurl-errors.html
diff --git a/neo/curl/docs/libcurl/libcurl-errors.pdf b/neo/engine/curl/docs/libcurl/libcurl-errors.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/libcurl-errors.pdf
rename to neo/engine/curl/docs/libcurl/libcurl-errors.pdf
diff --git a/neo/curl/docs/libcurl/libcurl-multi.3 b/neo/engine/curl/docs/libcurl/libcurl-multi.3
similarity index 100%
rename from neo/curl/docs/libcurl/libcurl-multi.3
rename to neo/engine/curl/docs/libcurl/libcurl-multi.3
diff --git a/neo/curl/docs/libcurl/libcurl-multi.html b/neo/engine/curl/docs/libcurl/libcurl-multi.html
similarity index 100%
rename from neo/curl/docs/libcurl/libcurl-multi.html
rename to neo/engine/curl/docs/libcurl/libcurl-multi.html
diff --git a/neo/curl/docs/libcurl/libcurl-multi.pdf b/neo/engine/curl/docs/libcurl/libcurl-multi.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/libcurl-multi.pdf
rename to neo/engine/curl/docs/libcurl/libcurl-multi.pdf
diff --git a/neo/curl/docs/libcurl/libcurl-share.3 b/neo/engine/curl/docs/libcurl/libcurl-share.3
similarity index 100%
rename from neo/curl/docs/libcurl/libcurl-share.3
rename to neo/engine/curl/docs/libcurl/libcurl-share.3
diff --git a/neo/curl/docs/libcurl/libcurl-share.html b/neo/engine/curl/docs/libcurl/libcurl-share.html
similarity index 100%
rename from neo/curl/docs/libcurl/libcurl-share.html
rename to neo/engine/curl/docs/libcurl/libcurl-share.html
diff --git a/neo/curl/docs/libcurl/libcurl-share.pdf b/neo/engine/curl/docs/libcurl/libcurl-share.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/libcurl-share.pdf
rename to neo/engine/curl/docs/libcurl/libcurl-share.pdf
diff --git a/neo/curl/docs/libcurl/libcurl.3 b/neo/engine/curl/docs/libcurl/libcurl.3
similarity index 100%
rename from neo/curl/docs/libcurl/libcurl.3
rename to neo/engine/curl/docs/libcurl/libcurl.3
diff --git a/neo/curl/docs/libcurl/libcurl.html b/neo/engine/curl/docs/libcurl/libcurl.html
similarity index 100%
rename from neo/curl/docs/libcurl/libcurl.html
rename to neo/engine/curl/docs/libcurl/libcurl.html
diff --git a/neo/curl/docs/libcurl/libcurl.pdf b/neo/engine/curl/docs/libcurl/libcurl.pdf
similarity index 100%
rename from neo/curl/docs/libcurl/libcurl.pdf
rename to neo/engine/curl/docs/libcurl/libcurl.pdf
diff --git a/neo/curl/include/Makefile.am b/neo/engine/curl/include/Makefile.am
similarity index 100%
rename from neo/curl/include/Makefile.am
rename to neo/engine/curl/include/Makefile.am
diff --git a/neo/curl/include/Makefile.in b/neo/engine/curl/include/Makefile.in
similarity index 100%
rename from neo/curl/include/Makefile.in
rename to neo/engine/curl/include/Makefile.in
diff --git a/neo/curl/include/README b/neo/engine/curl/include/README
similarity index 100%
rename from neo/curl/include/README
rename to neo/engine/curl/include/README
diff --git a/neo/curl/include/curl/Makefile.am b/neo/engine/curl/include/curl/Makefile.am
similarity index 100%
rename from neo/curl/include/curl/Makefile.am
rename to neo/engine/curl/include/curl/Makefile.am
diff --git a/neo/curl/include/curl/Makefile.in b/neo/engine/curl/include/curl/Makefile.in
similarity index 100%
rename from neo/curl/include/curl/Makefile.in
rename to neo/engine/curl/include/curl/Makefile.in
diff --git a/neo/curl/include/curl/curl.h b/neo/engine/curl/include/curl/curl.h
similarity index 100%
rename from neo/curl/include/curl/curl.h
rename to neo/engine/curl/include/curl/curl.h
diff --git a/neo/curl/include/curl/easy.h b/neo/engine/curl/include/curl/easy.h
similarity index 100%
rename from neo/curl/include/curl/easy.h
rename to neo/engine/curl/include/curl/easy.h
diff --git a/neo/curl/include/curl/mprintf.h b/neo/engine/curl/include/curl/mprintf.h
similarity index 100%
rename from neo/curl/include/curl/mprintf.h
rename to neo/engine/curl/include/curl/mprintf.h
diff --git a/neo/curl/include/curl/multi.h b/neo/engine/curl/include/curl/multi.h
similarity index 100%
rename from neo/curl/include/curl/multi.h
rename to neo/engine/curl/include/curl/multi.h
diff --git a/neo/curl/include/curl/stdcheaders.h b/neo/engine/curl/include/curl/stdcheaders.h
similarity index 100%
rename from neo/curl/include/curl/stdcheaders.h
rename to neo/engine/curl/include/curl/stdcheaders.h
diff --git a/neo/curl/include/curl/types.h b/neo/engine/curl/include/curl/types.h
similarity index 100%
rename from neo/curl/include/curl/types.h
rename to neo/engine/curl/include/curl/types.h
diff --git a/neo/curl/install-sh b/neo/engine/curl/install-sh
similarity index 100%
rename from neo/curl/install-sh
rename to neo/engine/curl/install-sh
diff --git a/neo/curl/lib/Makefile.am b/neo/engine/curl/lib/Makefile.am
similarity index 100%
rename from neo/curl/lib/Makefile.am
rename to neo/engine/curl/lib/Makefile.am
diff --git a/neo/curl/lib/Makefile.b32 b/neo/engine/curl/lib/Makefile.b32
similarity index 100%
rename from neo/curl/lib/Makefile.b32
rename to neo/engine/curl/lib/Makefile.b32
diff --git a/neo/curl/lib/Makefile.b32.resp b/neo/engine/curl/lib/Makefile.b32.resp
similarity index 100%
rename from neo/curl/lib/Makefile.b32.resp
rename to neo/engine/curl/lib/Makefile.b32.resp
diff --git a/neo/curl/lib/Makefile.in b/neo/engine/curl/lib/Makefile.in
similarity index 100%
rename from neo/curl/lib/Makefile.in
rename to neo/engine/curl/lib/Makefile.in
diff --git a/neo/curl/lib/Makefile.m32 b/neo/engine/curl/lib/Makefile.m32
similarity index 100%
rename from neo/curl/lib/Makefile.m32
rename to neo/engine/curl/lib/Makefile.m32
diff --git a/neo/curl/lib/Makefile.netware b/neo/engine/curl/lib/Makefile.netware
similarity index 100%
rename from neo/curl/lib/Makefile.netware
rename to neo/engine/curl/lib/Makefile.netware
diff --git a/neo/curl/lib/Makefile.riscos b/neo/engine/curl/lib/Makefile.riscos
similarity index 100%
rename from neo/curl/lib/Makefile.riscos
rename to neo/engine/curl/lib/Makefile.riscos
diff --git a/neo/curl/lib/Makefile.vc6 b/neo/engine/curl/lib/Makefile.vc6
similarity index 100%
rename from neo/curl/lib/Makefile.vc6
rename to neo/engine/curl/lib/Makefile.vc6
diff --git a/neo/curl/lib/README.ares b/neo/engine/curl/lib/README.ares
similarity index 100%
rename from neo/curl/lib/README.ares
rename to neo/engine/curl/lib/README.ares
diff --git a/neo/curl/lib/README.encoding b/neo/engine/curl/lib/README.encoding
similarity index 100%
rename from neo/curl/lib/README.encoding
rename to neo/engine/curl/lib/README.encoding
diff --git a/neo/curl/lib/README.memoryleak b/neo/engine/curl/lib/README.memoryleak
similarity index 100%
rename from neo/curl/lib/README.memoryleak
rename to neo/engine/curl/lib/README.memoryleak
diff --git a/neo/curl/lib/amigaos.c b/neo/engine/curl/lib/amigaos.c
similarity index 100%
rename from neo/curl/lib/amigaos.c
rename to neo/engine/curl/lib/amigaos.c
diff --git a/neo/curl/lib/amigaos.h b/neo/engine/curl/lib/amigaos.h
similarity index 100%
rename from neo/curl/lib/amigaos.h
rename to neo/engine/curl/lib/amigaos.h
diff --git a/neo/curl/lib/arpa_telnet.h b/neo/engine/curl/lib/arpa_telnet.h
similarity index 100%
rename from neo/curl/lib/arpa_telnet.h
rename to neo/engine/curl/lib/arpa_telnet.h
diff --git a/neo/curl/lib/base64.c b/neo/engine/curl/lib/base64.c
similarity index 100%
rename from neo/curl/lib/base64.c
rename to neo/engine/curl/lib/base64.c
diff --git a/neo/curl/lib/base64.h b/neo/engine/curl/lib/base64.h
similarity index 100%
rename from neo/curl/lib/base64.h
rename to neo/engine/curl/lib/base64.h
diff --git a/neo/curl/lib/ca-bundle.crt b/neo/engine/curl/lib/ca-bundle.crt
similarity index 100%
rename from neo/curl/lib/ca-bundle.crt
rename to neo/engine/curl/lib/ca-bundle.crt
diff --git a/neo/curl/lib/ca-bundle.h b/neo/engine/curl/lib/ca-bundle.h
similarity index 100%
rename from neo/curl/lib/ca-bundle.h
rename to neo/engine/curl/lib/ca-bundle.h
diff --git a/neo/curl/lib/config-amigaos.h b/neo/engine/curl/lib/config-amigaos.h
similarity index 100%
rename from neo/curl/lib/config-amigaos.h
rename to neo/engine/curl/lib/config-amigaos.h
diff --git a/neo/curl/lib/config-mac.h b/neo/engine/curl/lib/config-mac.h
similarity index 100%
rename from neo/curl/lib/config-mac.h
rename to neo/engine/curl/lib/config-mac.h
diff --git a/neo/curl/lib/config-netware.h b/neo/engine/curl/lib/config-netware.h
similarity index 100%
rename from neo/curl/lib/config-netware.h
rename to neo/engine/curl/lib/config-netware.h
diff --git a/neo/curl/lib/config-riscos.h b/neo/engine/curl/lib/config-riscos.h
similarity index 100%
rename from neo/curl/lib/config-riscos.h
rename to neo/engine/curl/lib/config-riscos.h
diff --git a/neo/curl/lib/config-vms.h b/neo/engine/curl/lib/config-vms.h
similarity index 100%
rename from neo/curl/lib/config-vms.h
rename to neo/engine/curl/lib/config-vms.h
diff --git a/neo/curl/lib/config-win32.h b/neo/engine/curl/lib/config-win32.h
similarity index 100%
rename from neo/curl/lib/config-win32.h
rename to neo/engine/curl/lib/config-win32.h
diff --git a/neo/curl/lib/config.dj b/neo/engine/curl/lib/config.dj
similarity index 100%
rename from neo/curl/lib/config.dj
rename to neo/engine/curl/lib/config.dj
diff --git a/neo/curl/lib/config.h.in b/neo/engine/curl/lib/config.h.in
similarity index 100%
rename from neo/curl/lib/config.h.in
rename to neo/engine/curl/lib/config.h.in
diff --git a/neo/curl/lib/connect.c b/neo/engine/curl/lib/connect.c
similarity index 100%
rename from neo/curl/lib/connect.c
rename to neo/engine/curl/lib/connect.c
diff --git a/neo/curl/lib/connect.h b/neo/engine/curl/lib/connect.h
similarity index 100%
rename from neo/curl/lib/connect.h
rename to neo/engine/curl/lib/connect.h
diff --git a/neo/curl/lib/content_encoding.c b/neo/engine/curl/lib/content_encoding.c
similarity index 100%
rename from neo/curl/lib/content_encoding.c
rename to neo/engine/curl/lib/content_encoding.c
diff --git a/neo/curl/lib/content_encoding.h b/neo/engine/curl/lib/content_encoding.h
similarity index 100%
rename from neo/curl/lib/content_encoding.h
rename to neo/engine/curl/lib/content_encoding.h
diff --git a/neo/curl/lib/cookie.c b/neo/engine/curl/lib/cookie.c
similarity index 100%
rename from neo/curl/lib/cookie.c
rename to neo/engine/curl/lib/cookie.c
diff --git a/neo/curl/lib/cookie.h b/neo/engine/curl/lib/cookie.h
similarity index 100%
rename from neo/curl/lib/cookie.h
rename to neo/engine/curl/lib/cookie.h
diff --git a/neo/curl/lib/curllib.dsp b/neo/engine/curl/lib/curllib.dsp
similarity index 100%
rename from neo/curl/lib/curllib.dsp
rename to neo/engine/curl/lib/curllib.dsp
diff --git a/neo/curl/lib/curllib.dsw b/neo/engine/curl/lib/curllib.dsw
similarity index 100%
rename from neo/curl/lib/curllib.dsw
rename to neo/engine/curl/lib/curllib.dsw
diff --git a/neo/curl/lib/curllib.vcproj b/neo/engine/curl/lib/curllib.vcproj
similarity index 100%
rename from neo/curl/lib/curllib.vcproj
rename to neo/engine/curl/lib/curllib.vcproj
diff --git a/neo/curl/lib/dict.c b/neo/engine/curl/lib/dict.c
similarity index 100%
rename from neo/curl/lib/dict.c
rename to neo/engine/curl/lib/dict.c
diff --git a/neo/curl/lib/dict.h b/neo/engine/curl/lib/dict.h
similarity index 100%
rename from neo/curl/lib/dict.h
rename to neo/engine/curl/lib/dict.h
diff --git a/neo/curl/lib/easy.c b/neo/engine/curl/lib/easy.c
similarity index 100%
rename from neo/curl/lib/easy.c
rename to neo/engine/curl/lib/easy.c
diff --git a/neo/curl/lib/escape.c b/neo/engine/curl/lib/escape.c
similarity index 100%
rename from neo/curl/lib/escape.c
rename to neo/engine/curl/lib/escape.c
diff --git a/neo/curl/lib/escape.h b/neo/engine/curl/lib/escape.h
similarity index 100%
rename from neo/curl/lib/escape.h
rename to neo/engine/curl/lib/escape.h
diff --git a/neo/curl/lib/file.c b/neo/engine/curl/lib/file.c
similarity index 100%
rename from neo/curl/lib/file.c
rename to neo/engine/curl/lib/file.c
diff --git a/neo/curl/lib/file.h b/neo/engine/curl/lib/file.h
similarity index 100%
rename from neo/curl/lib/file.h
rename to neo/engine/curl/lib/file.h
diff --git a/neo/curl/lib/formdata.c b/neo/engine/curl/lib/formdata.c
similarity index 100%
rename from neo/curl/lib/formdata.c
rename to neo/engine/curl/lib/formdata.c
diff --git a/neo/curl/lib/formdata.h b/neo/engine/curl/lib/formdata.h
similarity index 100%
rename from neo/curl/lib/formdata.h
rename to neo/engine/curl/lib/formdata.h
diff --git a/neo/curl/lib/ftp.c b/neo/engine/curl/lib/ftp.c
similarity index 100%
rename from neo/curl/lib/ftp.c
rename to neo/engine/curl/lib/ftp.c
diff --git a/neo/curl/lib/ftp.h b/neo/engine/curl/lib/ftp.h
similarity index 100%
rename from neo/curl/lib/ftp.h
rename to neo/engine/curl/lib/ftp.h
diff --git a/neo/curl/lib/getdate.c b/neo/engine/curl/lib/getdate.c
similarity index 100%
rename from neo/curl/lib/getdate.c
rename to neo/engine/curl/lib/getdate.c
diff --git a/neo/curl/lib/getdate.h b/neo/engine/curl/lib/getdate.h
similarity index 100%
rename from neo/curl/lib/getdate.h
rename to neo/engine/curl/lib/getdate.h
diff --git a/neo/curl/lib/getdate.y b/neo/engine/curl/lib/getdate.y
similarity index 100%
rename from neo/curl/lib/getdate.y
rename to neo/engine/curl/lib/getdate.y
diff --git a/neo/curl/lib/getenv.c b/neo/engine/curl/lib/getenv.c
similarity index 100%
rename from neo/curl/lib/getenv.c
rename to neo/engine/curl/lib/getenv.c
diff --git a/neo/curl/lib/getinfo.c b/neo/engine/curl/lib/getinfo.c
similarity index 100%
rename from neo/curl/lib/getinfo.c
rename to neo/engine/curl/lib/getinfo.c
diff --git a/neo/curl/lib/getinfo.h b/neo/engine/curl/lib/getinfo.h
similarity index 100%
rename from neo/curl/lib/getinfo.h
rename to neo/engine/curl/lib/getinfo.h
diff --git a/neo/curl/lib/hash.c b/neo/engine/curl/lib/hash.c
similarity index 100%
rename from neo/curl/lib/hash.c
rename to neo/engine/curl/lib/hash.c
diff --git a/neo/curl/lib/hash.h b/neo/engine/curl/lib/hash.h
similarity index 100%
rename from neo/curl/lib/hash.h
rename to neo/engine/curl/lib/hash.h
diff --git a/neo/curl/lib/hostip.c b/neo/engine/curl/lib/hostip.c
similarity index 100%
rename from neo/curl/lib/hostip.c
rename to neo/engine/curl/lib/hostip.c
diff --git a/neo/curl/lib/hostip.h b/neo/engine/curl/lib/hostip.h
similarity index 100%
rename from neo/curl/lib/hostip.h
rename to neo/engine/curl/lib/hostip.h
diff --git a/neo/curl/lib/http.c b/neo/engine/curl/lib/http.c
similarity index 100%
rename from neo/curl/lib/http.c
rename to neo/engine/curl/lib/http.c
diff --git a/neo/curl/lib/http.h b/neo/engine/curl/lib/http.h
similarity index 100%
rename from neo/curl/lib/http.h
rename to neo/engine/curl/lib/http.h
diff --git a/neo/curl/lib/http_chunks.c b/neo/engine/curl/lib/http_chunks.c
similarity index 100%
rename from neo/curl/lib/http_chunks.c
rename to neo/engine/curl/lib/http_chunks.c
diff --git a/neo/curl/lib/http_chunks.h b/neo/engine/curl/lib/http_chunks.h
similarity index 100%
rename from neo/curl/lib/http_chunks.h
rename to neo/engine/curl/lib/http_chunks.h
diff --git a/neo/curl/lib/http_digest.c b/neo/engine/curl/lib/http_digest.c
similarity index 100%
rename from neo/curl/lib/http_digest.c
rename to neo/engine/curl/lib/http_digest.c
diff --git a/neo/curl/lib/http_digest.h b/neo/engine/curl/lib/http_digest.h
similarity index 100%
rename from neo/curl/lib/http_digest.h
rename to neo/engine/curl/lib/http_digest.h
diff --git a/neo/curl/lib/http_negotiate.c b/neo/engine/curl/lib/http_negotiate.c
similarity index 100%
rename from neo/curl/lib/http_negotiate.c
rename to neo/engine/curl/lib/http_negotiate.c
diff --git a/neo/curl/lib/http_negotiate.h b/neo/engine/curl/lib/http_negotiate.h
similarity index 100%
rename from neo/curl/lib/http_negotiate.h
rename to neo/engine/curl/lib/http_negotiate.h
diff --git a/neo/curl/lib/http_ntlm.c b/neo/engine/curl/lib/http_ntlm.c
similarity index 100%
rename from neo/curl/lib/http_ntlm.c
rename to neo/engine/curl/lib/http_ntlm.c
diff --git a/neo/curl/lib/http_ntlm.h b/neo/engine/curl/lib/http_ntlm.h
similarity index 100%
rename from neo/curl/lib/http_ntlm.h
rename to neo/engine/curl/lib/http_ntlm.h
diff --git a/neo/curl/lib/if2ip.c b/neo/engine/curl/lib/if2ip.c
similarity index 100%
rename from neo/curl/lib/if2ip.c
rename to neo/engine/curl/lib/if2ip.c
diff --git a/neo/curl/lib/if2ip.h b/neo/engine/curl/lib/if2ip.h
similarity index 100%
rename from neo/curl/lib/if2ip.h
rename to neo/engine/curl/lib/if2ip.h
diff --git a/neo/curl/lib/inet_ntoa_r.h b/neo/engine/curl/lib/inet_ntoa_r.h
similarity index 100%
rename from neo/curl/lib/inet_ntoa_r.h
rename to neo/engine/curl/lib/inet_ntoa_r.h
diff --git a/neo/curl/lib/inet_pton.c b/neo/engine/curl/lib/inet_pton.c
similarity index 100%
rename from neo/curl/lib/inet_pton.c
rename to neo/engine/curl/lib/inet_pton.c
diff --git a/neo/curl/lib/inet_pton.h b/neo/engine/curl/lib/inet_pton.h
similarity index 100%
rename from neo/curl/lib/inet_pton.h
rename to neo/engine/curl/lib/inet_pton.h
diff --git a/neo/curl/lib/krb4.c b/neo/engine/curl/lib/krb4.c
similarity index 100%
rename from neo/curl/lib/krb4.c
rename to neo/engine/curl/lib/krb4.c
diff --git a/neo/curl/lib/krb4.h b/neo/engine/curl/lib/krb4.h
similarity index 100%
rename from neo/curl/lib/krb4.h
rename to neo/engine/curl/lib/krb4.h
diff --git a/neo/curl/lib/ldap.c b/neo/engine/curl/lib/ldap.c
similarity index 100%
rename from neo/curl/lib/ldap.c
rename to neo/engine/curl/lib/ldap.c
diff --git a/neo/curl/lib/ldap.h b/neo/engine/curl/lib/ldap.h
similarity index 100%
rename from neo/curl/lib/ldap.h
rename to neo/engine/curl/lib/ldap.h
diff --git a/neo/curl/lib/libcurl.def b/neo/engine/curl/lib/libcurl.def
similarity index 100%
rename from neo/curl/lib/libcurl.def
rename to neo/engine/curl/lib/libcurl.def
diff --git a/neo/curl/lib/libcurl.framework.make b/neo/engine/curl/lib/libcurl.framework.make
similarity index 100%
rename from neo/curl/lib/libcurl.framework.make
rename to neo/engine/curl/lib/libcurl.framework.make
diff --git a/neo/curl/lib/libcurl.imp b/neo/engine/curl/lib/libcurl.imp
similarity index 100%
rename from neo/curl/lib/libcurl.imp
rename to neo/engine/curl/lib/libcurl.imp
diff --git a/neo/curl/lib/libcurl.plist b/neo/engine/curl/lib/libcurl.plist
similarity index 100%
rename from neo/curl/lib/libcurl.plist
rename to neo/engine/curl/lib/libcurl.plist
diff --git a/neo/curl/lib/libcurl.rc b/neo/engine/curl/lib/libcurl.rc
similarity index 100%
rename from neo/curl/lib/libcurl.rc
rename to neo/engine/curl/lib/libcurl.rc
diff --git a/neo/curl/lib/llist.c b/neo/engine/curl/lib/llist.c
similarity index 100%
rename from neo/curl/lib/llist.c
rename to neo/engine/curl/lib/llist.c
diff --git a/neo/curl/lib/llist.h b/neo/engine/curl/lib/llist.h
similarity index 100%
rename from neo/curl/lib/llist.h
rename to neo/engine/curl/lib/llist.h
diff --git a/neo/curl/lib/makefile.amiga b/neo/engine/curl/lib/makefile.amiga
similarity index 100%
rename from neo/curl/lib/makefile.amiga
rename to neo/engine/curl/lib/makefile.amiga
diff --git a/neo/curl/lib/makefile.dj b/neo/engine/curl/lib/makefile.dj
similarity index 100%
rename from neo/curl/lib/makefile.dj
rename to neo/engine/curl/lib/makefile.dj
diff --git a/neo/curl/lib/md5.c b/neo/engine/curl/lib/md5.c
similarity index 100%
rename from neo/curl/lib/md5.c
rename to neo/engine/curl/lib/md5.c
diff --git a/neo/curl/lib/md5.h b/neo/engine/curl/lib/md5.h
similarity index 100%
rename from neo/curl/lib/md5.h
rename to neo/engine/curl/lib/md5.h
diff --git a/neo/curl/lib/memdebug.c b/neo/engine/curl/lib/memdebug.c
similarity index 100%
rename from neo/curl/lib/memdebug.c
rename to neo/engine/curl/lib/memdebug.c
diff --git a/neo/curl/lib/memdebug.h b/neo/engine/curl/lib/memdebug.h
similarity index 100%
rename from neo/curl/lib/memdebug.h
rename to neo/engine/curl/lib/memdebug.h
diff --git a/neo/curl/lib/mprintf.c b/neo/engine/curl/lib/mprintf.c
similarity index 100%
rename from neo/curl/lib/mprintf.c
rename to neo/engine/curl/lib/mprintf.c
diff --git a/neo/curl/lib/multi.c b/neo/engine/curl/lib/multi.c
similarity index 100%
rename from neo/curl/lib/multi.c
rename to neo/engine/curl/lib/multi.c
diff --git a/neo/curl/lib/netrc.c b/neo/engine/curl/lib/netrc.c
similarity index 100%
rename from neo/curl/lib/netrc.c
rename to neo/engine/curl/lib/netrc.c
diff --git a/neo/curl/lib/netrc.h b/neo/engine/curl/lib/netrc.h
similarity index 100%
rename from neo/curl/lib/netrc.h
rename to neo/engine/curl/lib/netrc.h
diff --git a/neo/curl/lib/nwlib.c b/neo/engine/curl/lib/nwlib.c
similarity index 100%
rename from neo/curl/lib/nwlib.c
rename to neo/engine/curl/lib/nwlib.c
diff --git a/neo/curl/lib/progress.c b/neo/engine/curl/lib/progress.c
similarity index 100%
rename from neo/curl/lib/progress.c
rename to neo/engine/curl/lib/progress.c
diff --git a/neo/curl/lib/progress.h b/neo/engine/curl/lib/progress.h
similarity index 100%
rename from neo/curl/lib/progress.h
rename to neo/engine/curl/lib/progress.h
diff --git a/neo/curl/lib/security.c b/neo/engine/curl/lib/security.c
similarity index 100%
rename from neo/curl/lib/security.c
rename to neo/engine/curl/lib/security.c
diff --git a/neo/curl/lib/security.h b/neo/engine/curl/lib/security.h
similarity index 100%
rename from neo/curl/lib/security.h
rename to neo/engine/curl/lib/security.h
diff --git a/neo/curl/lib/sendf.c b/neo/engine/curl/lib/sendf.c
similarity index 100%
rename from neo/curl/lib/sendf.c
rename to neo/engine/curl/lib/sendf.c
diff --git a/neo/curl/lib/sendf.h b/neo/engine/curl/lib/sendf.h
similarity index 100%
rename from neo/curl/lib/sendf.h
rename to neo/engine/curl/lib/sendf.h
diff --git a/neo/curl/lib/setup.h b/neo/engine/curl/lib/setup.h
similarity index 100%
rename from neo/curl/lib/setup.h
rename to neo/engine/curl/lib/setup.h
diff --git a/neo/curl/lib/share.c b/neo/engine/curl/lib/share.c
similarity index 100%
rename from neo/curl/lib/share.c
rename to neo/engine/curl/lib/share.c
diff --git a/neo/curl/lib/share.h b/neo/engine/curl/lib/share.h
similarity index 100%
rename from neo/curl/lib/share.h
rename to neo/engine/curl/lib/share.h
diff --git a/neo/curl/lib/speedcheck.c b/neo/engine/curl/lib/speedcheck.c
similarity index 100%
rename from neo/curl/lib/speedcheck.c
rename to neo/engine/curl/lib/speedcheck.c
diff --git a/neo/curl/lib/speedcheck.h b/neo/engine/curl/lib/speedcheck.h
similarity index 100%
rename from neo/curl/lib/speedcheck.h
rename to neo/engine/curl/lib/speedcheck.h
diff --git a/neo/curl/lib/ssluse.c b/neo/engine/curl/lib/ssluse.c
similarity index 100%
rename from neo/curl/lib/ssluse.c
rename to neo/engine/curl/lib/ssluse.c
diff --git a/neo/curl/lib/ssluse.h b/neo/engine/curl/lib/ssluse.h
similarity index 100%
rename from neo/curl/lib/ssluse.h
rename to neo/engine/curl/lib/ssluse.h
diff --git a/neo/curl/lib/strequal.c b/neo/engine/curl/lib/strequal.c
similarity index 100%
rename from neo/curl/lib/strequal.c
rename to neo/engine/curl/lib/strequal.c
diff --git a/neo/curl/lib/strequal.h b/neo/engine/curl/lib/strequal.h
similarity index 100%
rename from neo/curl/lib/strequal.h
rename to neo/engine/curl/lib/strequal.h
diff --git a/neo/curl/lib/strtok.c b/neo/engine/curl/lib/strtok.c
similarity index 100%
rename from neo/curl/lib/strtok.c
rename to neo/engine/curl/lib/strtok.c
diff --git a/neo/curl/lib/strtok.h b/neo/engine/curl/lib/strtok.h
similarity index 100%
rename from neo/curl/lib/strtok.h
rename to neo/engine/curl/lib/strtok.h
diff --git a/neo/curl/lib/strtoofft.c b/neo/engine/curl/lib/strtoofft.c
similarity index 100%
rename from neo/curl/lib/strtoofft.c
rename to neo/engine/curl/lib/strtoofft.c
diff --git a/neo/curl/lib/strtoofft.h b/neo/engine/curl/lib/strtoofft.h
similarity index 100%
rename from neo/curl/lib/strtoofft.h
rename to neo/engine/curl/lib/strtoofft.h
diff --git a/neo/curl/lib/telnet.c b/neo/engine/curl/lib/telnet.c
similarity index 100%
rename from neo/curl/lib/telnet.c
rename to neo/engine/curl/lib/telnet.c
diff --git a/neo/curl/lib/telnet.h b/neo/engine/curl/lib/telnet.h
similarity index 100%
rename from neo/curl/lib/telnet.h
rename to neo/engine/curl/lib/telnet.h
diff --git a/neo/curl/lib/timeval.c b/neo/engine/curl/lib/timeval.c
similarity index 100%
rename from neo/curl/lib/timeval.c
rename to neo/engine/curl/lib/timeval.c
diff --git a/neo/curl/lib/timeval.h b/neo/engine/curl/lib/timeval.h
similarity index 100%
rename from neo/curl/lib/timeval.h
rename to neo/engine/curl/lib/timeval.h
diff --git a/neo/curl/lib/transfer.c b/neo/engine/curl/lib/transfer.c
similarity index 100%
rename from neo/curl/lib/transfer.c
rename to neo/engine/curl/lib/transfer.c
diff --git a/neo/curl/lib/transfer.h b/neo/engine/curl/lib/transfer.h
similarity index 100%
rename from neo/curl/lib/transfer.h
rename to neo/engine/curl/lib/transfer.h
diff --git a/neo/curl/lib/url.c b/neo/engine/curl/lib/url.c
similarity index 100%
rename from neo/curl/lib/url.c
rename to neo/engine/curl/lib/url.c
diff --git a/neo/curl/lib/url.h b/neo/engine/curl/lib/url.h
similarity index 100%
rename from neo/curl/lib/url.h
rename to neo/engine/curl/lib/url.h
diff --git a/neo/curl/lib/urldata.h b/neo/engine/curl/lib/urldata.h
similarity index 100%
rename from neo/curl/lib/urldata.h
rename to neo/engine/curl/lib/urldata.h
diff --git a/neo/curl/lib/version.c b/neo/engine/curl/lib/version.c
similarity index 100%
rename from neo/curl/lib/version.c
rename to neo/engine/curl/lib/version.c
diff --git a/neo/curl/ltmain.sh b/neo/engine/curl/ltmain.sh
similarity index 100%
rename from neo/curl/ltmain.sh
rename to neo/engine/curl/ltmain.sh
diff --git a/neo/curl/maketgz b/neo/engine/curl/maketgz
similarity index 100%
rename from neo/curl/maketgz
rename to neo/engine/curl/maketgz
diff --git a/neo/curl/missing b/neo/engine/curl/missing
similarity index 100%
rename from neo/curl/missing
rename to neo/engine/curl/missing
diff --git a/neo/curl/mkinstalldirs b/neo/engine/curl/mkinstalldirs
similarity index 100%
rename from neo/curl/mkinstalldirs
rename to neo/engine/curl/mkinstalldirs
diff --git a/neo/curl/packages/DOS/Makefile.am b/neo/engine/curl/packages/DOS/Makefile.am
similarity index 100%
rename from neo/curl/packages/DOS/Makefile.am
rename to neo/engine/curl/packages/DOS/Makefile.am
diff --git a/neo/curl/packages/DOS/Makefile.in b/neo/engine/curl/packages/DOS/Makefile.in
similarity index 100%
rename from neo/curl/packages/DOS/Makefile.in
rename to neo/engine/curl/packages/DOS/Makefile.in
diff --git a/neo/curl/packages/DOS/README b/neo/engine/curl/packages/DOS/README
similarity index 100%
rename from neo/curl/packages/DOS/README
rename to neo/engine/curl/packages/DOS/README
diff --git a/neo/curl/packages/DOS/common.dj b/neo/engine/curl/packages/DOS/common.dj
similarity index 100%
rename from neo/curl/packages/DOS/common.dj
rename to neo/engine/curl/packages/DOS/common.dj
diff --git a/neo/curl/packages/EPM/Makefile.am b/neo/engine/curl/packages/EPM/Makefile.am
similarity index 100%
rename from neo/curl/packages/EPM/Makefile.am
rename to neo/engine/curl/packages/EPM/Makefile.am
diff --git a/neo/curl/packages/EPM/Makefile.in b/neo/engine/curl/packages/EPM/Makefile.in
similarity index 100%
rename from neo/curl/packages/EPM/Makefile.in
rename to neo/engine/curl/packages/EPM/Makefile.in
diff --git a/neo/curl/packages/EPM/README b/neo/engine/curl/packages/EPM/README
similarity index 100%
rename from neo/curl/packages/EPM/README
rename to neo/engine/curl/packages/EPM/README
diff --git a/neo/curl/packages/EPM/curl.list.in b/neo/engine/curl/packages/EPM/curl.list.in
similarity index 100%
rename from neo/curl/packages/EPM/curl.list.in
rename to neo/engine/curl/packages/EPM/curl.list.in
diff --git a/neo/curl/packages/Linux/Makefile.am b/neo/engine/curl/packages/Linux/Makefile.am
similarity index 100%
rename from neo/curl/packages/Linux/Makefile.am
rename to neo/engine/curl/packages/Linux/Makefile.am
diff --git a/neo/curl/packages/Linux/Makefile.in b/neo/engine/curl/packages/Linux/Makefile.in
similarity index 100%
rename from neo/curl/packages/Linux/Makefile.in
rename to neo/engine/curl/packages/Linux/Makefile.in
diff --git a/neo/curl/packages/Linux/RPM/Makefile.am b/neo/engine/curl/packages/Linux/RPM/Makefile.am
similarity index 100%
rename from neo/curl/packages/Linux/RPM/Makefile.am
rename to neo/engine/curl/packages/Linux/RPM/Makefile.am
diff --git a/neo/curl/packages/Linux/RPM/Makefile.in b/neo/engine/curl/packages/Linux/RPM/Makefile.in
similarity index 100%
rename from neo/curl/packages/Linux/RPM/Makefile.in
rename to neo/engine/curl/packages/Linux/RPM/Makefile.in
diff --git a/neo/curl/packages/Linux/RPM/README b/neo/engine/curl/packages/Linux/RPM/README
similarity index 100%
rename from neo/curl/packages/Linux/RPM/README
rename to neo/engine/curl/packages/Linux/RPM/README
diff --git a/neo/curl/packages/Linux/RPM/curl-ssl.spec.in b/neo/engine/curl/packages/Linux/RPM/curl-ssl.spec.in
similarity index 100%
rename from neo/curl/packages/Linux/RPM/curl-ssl.spec.in
rename to neo/engine/curl/packages/Linux/RPM/curl-ssl.spec.in
diff --git a/neo/curl/packages/Linux/RPM/curl.spec.in b/neo/engine/curl/packages/Linux/RPM/curl.spec.in
similarity index 100%
rename from neo/curl/packages/Linux/RPM/curl.spec.in
rename to neo/engine/curl/packages/Linux/RPM/curl.spec.in
diff --git a/neo/curl/packages/Linux/RPM/make_curl_rpm b/neo/engine/curl/packages/Linux/RPM/make_curl_rpm
similarity index 100%
rename from neo/curl/packages/Linux/RPM/make_curl_rpm
rename to neo/engine/curl/packages/Linux/RPM/make_curl_rpm
diff --git a/neo/curl/packages/Makefile.am b/neo/engine/curl/packages/Makefile.am
similarity index 100%
rename from neo/curl/packages/Makefile.am
rename to neo/engine/curl/packages/Makefile.am
diff --git a/neo/curl/packages/Makefile.in b/neo/engine/curl/packages/Makefile.in
similarity index 100%
rename from neo/curl/packages/Makefile.in
rename to neo/engine/curl/packages/Makefile.in
diff --git a/neo/curl/packages/NetWare/get_ver.awk b/neo/engine/curl/packages/NetWare/get_ver.awk
similarity index 100%
rename from neo/curl/packages/NetWare/get_ver.awk
rename to neo/engine/curl/packages/NetWare/get_ver.awk
diff --git a/neo/curl/packages/README b/neo/engine/curl/packages/README
similarity index 100%
rename from neo/curl/packages/README
rename to neo/engine/curl/packages/README
diff --git a/neo/curl/packages/Solaris/Makefile.am b/neo/engine/curl/packages/Solaris/Makefile.am
similarity index 100%
rename from neo/curl/packages/Solaris/Makefile.am
rename to neo/engine/curl/packages/Solaris/Makefile.am
diff --git a/neo/curl/packages/Solaris/Makefile.in b/neo/engine/curl/packages/Solaris/Makefile.in
similarity index 100%
rename from neo/curl/packages/Solaris/Makefile.in
rename to neo/engine/curl/packages/Solaris/Makefile.in
diff --git a/neo/curl/packages/Win32/Makefile.am b/neo/engine/curl/packages/Win32/Makefile.am
similarity index 100%
rename from neo/curl/packages/Win32/Makefile.am
rename to neo/engine/curl/packages/Win32/Makefile.am
diff --git a/neo/curl/packages/Win32/Makefile.in b/neo/engine/curl/packages/Win32/Makefile.in
similarity index 100%
rename from neo/curl/packages/Win32/Makefile.in
rename to neo/engine/curl/packages/Win32/Makefile.in
diff --git a/neo/curl/packages/Win32/README b/neo/engine/curl/packages/Win32/README
similarity index 100%
rename from neo/curl/packages/Win32/README
rename to neo/engine/curl/packages/Win32/README
diff --git a/neo/curl/packages/Win32/cygwin/Makefile.am b/neo/engine/curl/packages/Win32/cygwin/Makefile.am
similarity index 100%
rename from neo/curl/packages/Win32/cygwin/Makefile.am
rename to neo/engine/curl/packages/Win32/cygwin/Makefile.am
diff --git a/neo/curl/packages/Win32/cygwin/Makefile.in b/neo/engine/curl/packages/Win32/cygwin/Makefile.in
similarity index 100%
rename from neo/curl/packages/Win32/cygwin/Makefile.in
rename to neo/engine/curl/packages/Win32/cygwin/Makefile.in
diff --git a/neo/curl/packages/Win32/cygwin/README b/neo/engine/curl/packages/Win32/cygwin/README
similarity index 100%
rename from neo/curl/packages/Win32/cygwin/README
rename to neo/engine/curl/packages/Win32/cygwin/README
diff --git a/neo/curl/packages/vms/Makefile.am b/neo/engine/curl/packages/vms/Makefile.am
similarity index 100%
rename from neo/curl/packages/vms/Makefile.am
rename to neo/engine/curl/packages/vms/Makefile.am
diff --git a/neo/curl/packages/vms/Makefile.in b/neo/engine/curl/packages/vms/Makefile.in
similarity index 100%
rename from neo/curl/packages/vms/Makefile.in
rename to neo/engine/curl/packages/vms/Makefile.in
diff --git a/neo/curl/packages/vms/batch_compile.com b/neo/engine/curl/packages/vms/batch_compile.com
similarity index 100%
rename from neo/curl/packages/vms/batch_compile.com
rename to neo/engine/curl/packages/vms/batch_compile.com
diff --git a/neo/curl/packages/vms/build_vms.com b/neo/engine/curl/packages/vms/build_vms.com
similarity index 100%
rename from neo/curl/packages/vms/build_vms.com
rename to neo/engine/curl/packages/vms/build_vms.com
diff --git a/neo/curl/packages/vms/config-vms.h_with_ssl b/neo/engine/curl/packages/vms/config-vms.h_with_ssl
similarity index 100%
rename from neo/curl/packages/vms/config-vms.h_with_ssl
rename to neo/engine/curl/packages/vms/config-vms.h_with_ssl
diff --git a/neo/curl/packages/vms/config-vms.h_without_ssl b/neo/engine/curl/packages/vms/config-vms.h_without_ssl
similarity index 100%
rename from neo/curl/packages/vms/config-vms.h_without_ssl
rename to neo/engine/curl/packages/vms/config-vms.h_without_ssl
diff --git a/neo/curl/packages/vms/defines.com b/neo/engine/curl/packages/vms/defines.com
similarity index 100%
rename from neo/curl/packages/vms/defines.com
rename to neo/engine/curl/packages/vms/defines.com
diff --git a/neo/curl/packages/vms/hpssl_alpha.opt b/neo/engine/curl/packages/vms/hpssl_alpha.opt
similarity index 100%
rename from neo/curl/packages/vms/hpssl_alpha.opt
rename to neo/engine/curl/packages/vms/hpssl_alpha.opt
diff --git a/neo/curl/packages/vms/hpssl_ia64.opt b/neo/engine/curl/packages/vms/hpssl_ia64.opt
similarity index 100%
rename from neo/curl/packages/vms/hpssl_ia64.opt
rename to neo/engine/curl/packages/vms/hpssl_ia64.opt
diff --git a/neo/curl/packages/vms/hpssl_vax.opt b/neo/engine/curl/packages/vms/hpssl_vax.opt
similarity index 100%
rename from neo/curl/packages/vms/hpssl_vax.opt
rename to neo/engine/curl/packages/vms/hpssl_vax.opt
diff --git a/neo/curl/packages/vms/readme b/neo/engine/curl/packages/vms/readme
similarity index 100%
rename from neo/curl/packages/vms/readme
rename to neo/engine/curl/packages/vms/readme
diff --git a/neo/curl/reconf b/neo/engine/curl/reconf
similarity index 100%
rename from neo/curl/reconf
rename to neo/engine/curl/reconf
diff --git a/neo/curl/sample.emacs b/neo/engine/curl/sample.emacs
similarity index 100%
rename from neo/curl/sample.emacs
rename to neo/engine/curl/sample.emacs
diff --git a/neo/curl/src/Makefile.am b/neo/engine/curl/src/Makefile.am
similarity index 100%
rename from neo/curl/src/Makefile.am
rename to neo/engine/curl/src/Makefile.am
diff --git a/neo/curl/src/Makefile.b32 b/neo/engine/curl/src/Makefile.b32
similarity index 100%
rename from neo/curl/src/Makefile.b32
rename to neo/engine/curl/src/Makefile.b32
diff --git a/neo/curl/src/Makefile.in b/neo/engine/curl/src/Makefile.in
similarity index 100%
rename from neo/curl/src/Makefile.in
rename to neo/engine/curl/src/Makefile.in
diff --git a/neo/curl/src/Makefile.m32 b/neo/engine/curl/src/Makefile.m32
similarity index 100%
rename from neo/curl/src/Makefile.m32
rename to neo/engine/curl/src/Makefile.m32
diff --git a/neo/curl/src/Makefile.netware b/neo/engine/curl/src/Makefile.netware
similarity index 100%
rename from neo/curl/src/Makefile.netware
rename to neo/engine/curl/src/Makefile.netware
diff --git a/neo/curl/src/Makefile.riscos b/neo/engine/curl/src/Makefile.riscos
similarity index 100%
rename from neo/curl/src/Makefile.riscos
rename to neo/engine/curl/src/Makefile.riscos
diff --git a/neo/curl/src/Makefile.vc6 b/neo/engine/curl/src/Makefile.vc6
similarity index 100%
rename from neo/curl/src/Makefile.vc6
rename to neo/engine/curl/src/Makefile.vc6
diff --git a/neo/curl/src/config-amigaos.h b/neo/engine/curl/src/config-amigaos.h
similarity index 100%
rename from neo/curl/src/config-amigaos.h
rename to neo/engine/curl/src/config-amigaos.h
diff --git a/neo/curl/src/config-mac.h b/neo/engine/curl/src/config-mac.h
similarity index 100%
rename from neo/curl/src/config-mac.h
rename to neo/engine/curl/src/config-mac.h
diff --git a/neo/curl/src/config-netware.h b/neo/engine/curl/src/config-netware.h
similarity index 100%
rename from neo/curl/src/config-netware.h
rename to neo/engine/curl/src/config-netware.h
diff --git a/neo/curl/src/config-riscos.h b/neo/engine/curl/src/config-riscos.h
similarity index 100%
rename from neo/curl/src/config-riscos.h
rename to neo/engine/curl/src/config-riscos.h
diff --git a/neo/curl/src/config-vms.h b/neo/engine/curl/src/config-vms.h
similarity index 100%
rename from neo/curl/src/config-vms.h
rename to neo/engine/curl/src/config-vms.h
diff --git a/neo/curl/src/config-win32.h b/neo/engine/curl/src/config-win32.h
similarity index 100%
rename from neo/curl/src/config-win32.h
rename to neo/engine/curl/src/config-win32.h
diff --git a/neo/curl/src/config.h.in b/neo/engine/curl/src/config.h.in
similarity index 100%
rename from neo/curl/src/config.h.in
rename to neo/engine/curl/src/config.h.in
diff --git a/neo/curl/src/curl.rc b/neo/engine/curl/src/curl.rc
similarity index 100%
rename from neo/curl/src/curl.rc
rename to neo/engine/curl/src/curl.rc
diff --git a/neo/curl/src/curlmsg.h b/neo/engine/curl/src/curlmsg.h
similarity index 100%
rename from neo/curl/src/curlmsg.h
rename to neo/engine/curl/src/curlmsg.h
diff --git a/neo/curl/src/curlmsg.msg b/neo/engine/curl/src/curlmsg.msg
similarity index 100%
rename from neo/curl/src/curlmsg.msg
rename to neo/engine/curl/src/curlmsg.msg
diff --git a/neo/curl/src/curlmsg.sdl b/neo/engine/curl/src/curlmsg.sdl
similarity index 100%
rename from neo/curl/src/curlmsg.sdl
rename to neo/engine/curl/src/curlmsg.sdl
diff --git a/neo/curl/src/curlmsg_vms.h b/neo/engine/curl/src/curlmsg_vms.h
similarity index 100%
rename from neo/curl/src/curlmsg_vms.h
rename to neo/engine/curl/src/curlmsg_vms.h
diff --git a/neo/curl/src/getpass.c b/neo/engine/curl/src/getpass.c
similarity index 100%
rename from neo/curl/src/getpass.c
rename to neo/engine/curl/src/getpass.c
diff --git a/neo/curl/src/getpass.h b/neo/engine/curl/src/getpass.h
similarity index 100%
rename from neo/curl/src/getpass.h
rename to neo/engine/curl/src/getpass.h
diff --git a/neo/curl/src/homedir.c b/neo/engine/curl/src/homedir.c
similarity index 100%
rename from neo/curl/src/homedir.c
rename to neo/engine/curl/src/homedir.c
diff --git a/neo/curl/src/homedir.h b/neo/engine/curl/src/homedir.h
similarity index 100%
rename from neo/curl/src/homedir.h
rename to neo/engine/curl/src/homedir.h
diff --git a/neo/curl/src/hugehelp.c b/neo/engine/curl/src/hugehelp.c
similarity index 100%
rename from neo/curl/src/hugehelp.c
rename to neo/engine/curl/src/hugehelp.c
diff --git a/neo/curl/src/hugehelp.h b/neo/engine/curl/src/hugehelp.h
similarity index 100%
rename from neo/curl/src/hugehelp.h
rename to neo/engine/curl/src/hugehelp.h
diff --git a/neo/curl/src/macos/MACINSTALL.TXT b/neo/engine/curl/src/macos/MACINSTALL.TXT
similarity index 100%
rename from neo/curl/src/macos/MACINSTALL.TXT
rename to neo/engine/curl/src/macos/MACINSTALL.TXT
diff --git a/neo/curl/src/macos/curl.mcp.xml.sit.hqx b/neo/engine/curl/src/macos/curl.mcp.xml.sit.hqx
similarity index 100%
rename from neo/curl/src/macos/curl.mcp.xml.sit.hqx
rename to neo/engine/curl/src/macos/curl.mcp.xml.sit.hqx
diff --git a/neo/curl/src/macos/src/curl_GUSIConfig.cpp b/neo/engine/curl/src/macos/src/curl_GUSIConfig.cpp
similarity index 100%
rename from neo/curl/src/macos/src/curl_GUSIConfig.cpp
rename to neo/engine/curl/src/macos/src/curl_GUSIConfig.cpp
diff --git a/neo/curl/src/macos/src/macos_main.cpp b/neo/engine/curl/src/macos/src/macos_main.cpp
similarity index 100%
rename from neo/curl/src/macos/src/macos_main.cpp
rename to neo/engine/curl/src/macos/src/macos_main.cpp
diff --git a/neo/curl/src/main.c b/neo/engine/curl/src/main.c
similarity index 100%
rename from neo/curl/src/main.c
rename to neo/engine/curl/src/main.c
diff --git a/neo/curl/src/makefile.amiga b/neo/engine/curl/src/makefile.amiga
similarity index 100%
rename from neo/curl/src/makefile.amiga
rename to neo/engine/curl/src/makefile.amiga
diff --git a/neo/curl/src/makefile.dj b/neo/engine/curl/src/makefile.dj
similarity index 100%
rename from neo/curl/src/makefile.dj
rename to neo/engine/curl/src/makefile.dj
diff --git a/neo/curl/src/mkhelp.pl b/neo/engine/curl/src/mkhelp.pl
similarity index 100%
rename from neo/curl/src/mkhelp.pl
rename to neo/engine/curl/src/mkhelp.pl
diff --git a/neo/curl/src/setup.h b/neo/engine/curl/src/setup.h
similarity index 100%
rename from neo/curl/src/setup.h
rename to neo/engine/curl/src/setup.h
diff --git a/neo/curl/src/urlglob.c b/neo/engine/curl/src/urlglob.c
similarity index 100%
rename from neo/curl/src/urlglob.c
rename to neo/engine/curl/src/urlglob.c
diff --git a/neo/curl/src/urlglob.h b/neo/engine/curl/src/urlglob.h
similarity index 100%
rename from neo/curl/src/urlglob.h
rename to neo/engine/curl/src/urlglob.h
diff --git a/neo/curl/src/version.h b/neo/engine/curl/src/version.h
similarity index 100%
rename from neo/curl/src/version.h
rename to neo/engine/curl/src/version.h
diff --git a/neo/curl/src/writeenv.c b/neo/engine/curl/src/writeenv.c
similarity index 100%
rename from neo/curl/src/writeenv.c
rename to neo/engine/curl/src/writeenv.c
diff --git a/neo/curl/src/writeenv.h b/neo/engine/curl/src/writeenv.h
similarity index 100%
rename from neo/curl/src/writeenv.h
rename to neo/engine/curl/src/writeenv.h
diff --git a/neo/curl/src/writeout.c b/neo/engine/curl/src/writeout.c
similarity index 100%
rename from neo/curl/src/writeout.c
rename to neo/engine/curl/src/writeout.c
diff --git a/neo/curl/src/writeout.h b/neo/engine/curl/src/writeout.h
similarity index 100%
rename from neo/curl/src/writeout.h
rename to neo/engine/curl/src/writeout.h
diff --git a/neo/curl/testcurl.sh b/neo/engine/curl/testcurl.sh
similarity index 100%
rename from neo/curl/testcurl.sh
rename to neo/engine/curl/testcurl.sh
diff --git a/neo/curl/tests/FILEFORMAT b/neo/engine/curl/tests/FILEFORMAT
similarity index 100%
rename from neo/curl/tests/FILEFORMAT
rename to neo/engine/curl/tests/FILEFORMAT
diff --git a/neo/curl/tests/Makefile.am b/neo/engine/curl/tests/Makefile.am
similarity index 100%
rename from neo/curl/tests/Makefile.am
rename to neo/engine/curl/tests/Makefile.am
diff --git a/neo/curl/tests/Makefile.in b/neo/engine/curl/tests/Makefile.in
similarity index 100%
rename from neo/curl/tests/Makefile.in
rename to neo/engine/curl/tests/Makefile.in
diff --git a/neo/curl/tests/README b/neo/engine/curl/tests/README
similarity index 100%
rename from neo/curl/tests/README
rename to neo/engine/curl/tests/README
diff --git a/neo/curl/tests/data/Makefile.am b/neo/engine/curl/tests/data/Makefile.am
similarity index 100%
rename from neo/curl/tests/data/Makefile.am
rename to neo/engine/curl/tests/data/Makefile.am
diff --git a/neo/curl/tests/data/Makefile.in b/neo/engine/curl/tests/data/Makefile.in
similarity index 100%
rename from neo/curl/tests/data/Makefile.in
rename to neo/engine/curl/tests/data/Makefile.in
diff --git a/neo/curl/tests/data/test1 b/neo/engine/curl/tests/data/test1
similarity index 100%
rename from neo/curl/tests/data/test1
rename to neo/engine/curl/tests/data/test1
diff --git a/neo/curl/tests/data/test10 b/neo/engine/curl/tests/data/test10
similarity index 100%
rename from neo/curl/tests/data/test10
rename to neo/engine/curl/tests/data/test10
diff --git a/neo/curl/tests/data/test100 b/neo/engine/curl/tests/data/test100
similarity index 100%
rename from neo/curl/tests/data/test100
rename to neo/engine/curl/tests/data/test100
diff --git a/neo/curl/tests/data/test101 b/neo/engine/curl/tests/data/test101
similarity index 100%
rename from neo/curl/tests/data/test101
rename to neo/engine/curl/tests/data/test101
diff --git a/neo/curl/tests/data/test102 b/neo/engine/curl/tests/data/test102
similarity index 100%
rename from neo/curl/tests/data/test102
rename to neo/engine/curl/tests/data/test102
diff --git a/neo/curl/tests/data/test103 b/neo/engine/curl/tests/data/test103
similarity index 100%
rename from neo/curl/tests/data/test103
rename to neo/engine/curl/tests/data/test103
diff --git a/neo/curl/tests/data/test104 b/neo/engine/curl/tests/data/test104
similarity index 100%
rename from neo/curl/tests/data/test104
rename to neo/engine/curl/tests/data/test104
diff --git a/neo/curl/tests/data/test105 b/neo/engine/curl/tests/data/test105
similarity index 100%
rename from neo/curl/tests/data/test105
rename to neo/engine/curl/tests/data/test105
diff --git a/neo/curl/tests/data/test106 b/neo/engine/curl/tests/data/test106
similarity index 100%
rename from neo/curl/tests/data/test106
rename to neo/engine/curl/tests/data/test106
diff --git a/neo/curl/tests/data/test107 b/neo/engine/curl/tests/data/test107
similarity index 100%
rename from neo/curl/tests/data/test107
rename to neo/engine/curl/tests/data/test107
diff --git a/neo/curl/tests/data/test108 b/neo/engine/curl/tests/data/test108
similarity index 100%
rename from neo/curl/tests/data/test108
rename to neo/engine/curl/tests/data/test108
diff --git a/neo/curl/tests/data/test109 b/neo/engine/curl/tests/data/test109
similarity index 100%
rename from neo/curl/tests/data/test109
rename to neo/engine/curl/tests/data/test109
diff --git a/neo/curl/tests/data/test11 b/neo/engine/curl/tests/data/test11
similarity index 100%
rename from neo/curl/tests/data/test11
rename to neo/engine/curl/tests/data/test11
diff --git a/neo/curl/tests/data/test110 b/neo/engine/curl/tests/data/test110
similarity index 100%
rename from neo/curl/tests/data/test110
rename to neo/engine/curl/tests/data/test110
diff --git a/neo/curl/tests/data/test111 b/neo/engine/curl/tests/data/test111
similarity index 100%
rename from neo/curl/tests/data/test111
rename to neo/engine/curl/tests/data/test111
diff --git a/neo/curl/tests/data/test112 b/neo/engine/curl/tests/data/test112
similarity index 100%
rename from neo/curl/tests/data/test112
rename to neo/engine/curl/tests/data/test112
diff --git a/neo/curl/tests/data/test113 b/neo/engine/curl/tests/data/test113
similarity index 100%
rename from neo/curl/tests/data/test113
rename to neo/engine/curl/tests/data/test113
diff --git a/neo/curl/tests/data/test114 b/neo/engine/curl/tests/data/test114
similarity index 100%
rename from neo/curl/tests/data/test114
rename to neo/engine/curl/tests/data/test114
diff --git a/neo/curl/tests/data/test115 b/neo/engine/curl/tests/data/test115
similarity index 100%
rename from neo/curl/tests/data/test115
rename to neo/engine/curl/tests/data/test115
diff --git a/neo/curl/tests/data/test116 b/neo/engine/curl/tests/data/test116
similarity index 100%
rename from neo/curl/tests/data/test116
rename to neo/engine/curl/tests/data/test116
diff --git a/neo/curl/tests/data/test117 b/neo/engine/curl/tests/data/test117
similarity index 100%
rename from neo/curl/tests/data/test117
rename to neo/engine/curl/tests/data/test117
diff --git a/neo/curl/tests/data/test118 b/neo/engine/curl/tests/data/test118
similarity index 100%
rename from neo/curl/tests/data/test118
rename to neo/engine/curl/tests/data/test118
diff --git a/neo/curl/tests/data/test119 b/neo/engine/curl/tests/data/test119
similarity index 100%
rename from neo/curl/tests/data/test119
rename to neo/engine/curl/tests/data/test119
diff --git a/neo/curl/tests/data/test12 b/neo/engine/curl/tests/data/test12
similarity index 100%
rename from neo/curl/tests/data/test12
rename to neo/engine/curl/tests/data/test12
diff --git a/neo/curl/tests/data/test120 b/neo/engine/curl/tests/data/test120
similarity index 100%
rename from neo/curl/tests/data/test120
rename to neo/engine/curl/tests/data/test120
diff --git a/neo/curl/tests/data/test121 b/neo/engine/curl/tests/data/test121
similarity index 100%
rename from neo/curl/tests/data/test121
rename to neo/engine/curl/tests/data/test121
diff --git a/neo/curl/tests/data/test122 b/neo/engine/curl/tests/data/test122
similarity index 100%
rename from neo/curl/tests/data/test122
rename to neo/engine/curl/tests/data/test122
diff --git a/neo/curl/tests/data/test123 b/neo/engine/curl/tests/data/test123
similarity index 100%
rename from neo/curl/tests/data/test123
rename to neo/engine/curl/tests/data/test123
diff --git a/neo/curl/tests/data/test124 b/neo/engine/curl/tests/data/test124
similarity index 100%
rename from neo/curl/tests/data/test124
rename to neo/engine/curl/tests/data/test124
diff --git a/neo/curl/tests/data/test125 b/neo/engine/curl/tests/data/test125
similarity index 100%
rename from neo/curl/tests/data/test125
rename to neo/engine/curl/tests/data/test125
diff --git a/neo/curl/tests/data/test126 b/neo/engine/curl/tests/data/test126
similarity index 100%
rename from neo/curl/tests/data/test126
rename to neo/engine/curl/tests/data/test126
diff --git a/neo/curl/tests/data/test127 b/neo/engine/curl/tests/data/test127
similarity index 100%
rename from neo/curl/tests/data/test127
rename to neo/engine/curl/tests/data/test127
diff --git a/neo/curl/tests/data/test128 b/neo/engine/curl/tests/data/test128
similarity index 100%
rename from neo/curl/tests/data/test128
rename to neo/engine/curl/tests/data/test128
diff --git a/neo/curl/tests/data/test13 b/neo/engine/curl/tests/data/test13
similarity index 100%
rename from neo/curl/tests/data/test13
rename to neo/engine/curl/tests/data/test13
diff --git a/neo/curl/tests/data/test130 b/neo/engine/curl/tests/data/test130
similarity index 100%
rename from neo/curl/tests/data/test130
rename to neo/engine/curl/tests/data/test130
diff --git a/neo/curl/tests/data/test131 b/neo/engine/curl/tests/data/test131
similarity index 100%
rename from neo/curl/tests/data/test131
rename to neo/engine/curl/tests/data/test131
diff --git a/neo/curl/tests/data/test132 b/neo/engine/curl/tests/data/test132
similarity index 100%
rename from neo/curl/tests/data/test132
rename to neo/engine/curl/tests/data/test132
diff --git a/neo/curl/tests/data/test133 b/neo/engine/curl/tests/data/test133
similarity index 100%
rename from neo/curl/tests/data/test133
rename to neo/engine/curl/tests/data/test133
diff --git a/neo/curl/tests/data/test134 b/neo/engine/curl/tests/data/test134
similarity index 100%
rename from neo/curl/tests/data/test134
rename to neo/engine/curl/tests/data/test134
diff --git a/neo/curl/tests/data/test135 b/neo/engine/curl/tests/data/test135
similarity index 100%
rename from neo/curl/tests/data/test135
rename to neo/engine/curl/tests/data/test135
diff --git a/neo/curl/tests/data/test136 b/neo/engine/curl/tests/data/test136
similarity index 100%
rename from neo/curl/tests/data/test136
rename to neo/engine/curl/tests/data/test136
diff --git a/neo/curl/tests/data/test137 b/neo/engine/curl/tests/data/test137
similarity index 100%
rename from neo/curl/tests/data/test137
rename to neo/engine/curl/tests/data/test137
diff --git a/neo/curl/tests/data/test138 b/neo/engine/curl/tests/data/test138
similarity index 100%
rename from neo/curl/tests/data/test138
rename to neo/engine/curl/tests/data/test138
diff --git a/neo/curl/tests/data/test139 b/neo/engine/curl/tests/data/test139
similarity index 100%
rename from neo/curl/tests/data/test139
rename to neo/engine/curl/tests/data/test139
diff --git a/neo/curl/tests/data/test14 b/neo/engine/curl/tests/data/test14
similarity index 100%
rename from neo/curl/tests/data/test14
rename to neo/engine/curl/tests/data/test14
diff --git a/neo/curl/tests/data/test140 b/neo/engine/curl/tests/data/test140
similarity index 100%
rename from neo/curl/tests/data/test140
rename to neo/engine/curl/tests/data/test140
diff --git a/neo/curl/tests/data/test141 b/neo/engine/curl/tests/data/test141
similarity index 100%
rename from neo/curl/tests/data/test141
rename to neo/engine/curl/tests/data/test141
diff --git a/neo/curl/tests/data/test142 b/neo/engine/curl/tests/data/test142
similarity index 100%
rename from neo/curl/tests/data/test142
rename to neo/engine/curl/tests/data/test142
diff --git a/neo/curl/tests/data/test143 b/neo/engine/curl/tests/data/test143
similarity index 100%
rename from neo/curl/tests/data/test143
rename to neo/engine/curl/tests/data/test143
diff --git a/neo/curl/tests/data/test144 b/neo/engine/curl/tests/data/test144
similarity index 100%
rename from neo/curl/tests/data/test144
rename to neo/engine/curl/tests/data/test144
diff --git a/neo/curl/tests/data/test145 b/neo/engine/curl/tests/data/test145
similarity index 100%
rename from neo/curl/tests/data/test145
rename to neo/engine/curl/tests/data/test145
diff --git a/neo/curl/tests/data/test146 b/neo/engine/curl/tests/data/test146
similarity index 100%
rename from neo/curl/tests/data/test146
rename to neo/engine/curl/tests/data/test146
diff --git a/neo/curl/tests/data/test147 b/neo/engine/curl/tests/data/test147
similarity index 100%
rename from neo/curl/tests/data/test147
rename to neo/engine/curl/tests/data/test147
diff --git a/neo/curl/tests/data/test148 b/neo/engine/curl/tests/data/test148
similarity index 100%
rename from neo/curl/tests/data/test148
rename to neo/engine/curl/tests/data/test148
diff --git a/neo/curl/tests/data/test149 b/neo/engine/curl/tests/data/test149
similarity index 100%
rename from neo/curl/tests/data/test149
rename to neo/engine/curl/tests/data/test149
diff --git a/neo/curl/tests/data/test15 b/neo/engine/curl/tests/data/test15
similarity index 100%
rename from neo/curl/tests/data/test15
rename to neo/engine/curl/tests/data/test15
diff --git a/neo/curl/tests/data/test16 b/neo/engine/curl/tests/data/test16
similarity index 100%
rename from neo/curl/tests/data/test16
rename to neo/engine/curl/tests/data/test16
diff --git a/neo/curl/tests/data/test17 b/neo/engine/curl/tests/data/test17
similarity index 100%
rename from neo/curl/tests/data/test17
rename to neo/engine/curl/tests/data/test17
diff --git a/neo/curl/tests/data/test18 b/neo/engine/curl/tests/data/test18
similarity index 100%
rename from neo/curl/tests/data/test18
rename to neo/engine/curl/tests/data/test18
diff --git a/neo/curl/tests/data/test19 b/neo/engine/curl/tests/data/test19
similarity index 100%
rename from neo/curl/tests/data/test19
rename to neo/engine/curl/tests/data/test19
diff --git a/neo/curl/tests/data/test190 b/neo/engine/curl/tests/data/test190
similarity index 100%
rename from neo/curl/tests/data/test190
rename to neo/engine/curl/tests/data/test190
diff --git a/neo/curl/tests/data/test2 b/neo/engine/curl/tests/data/test2
similarity index 100%
rename from neo/curl/tests/data/test2
rename to neo/engine/curl/tests/data/test2
diff --git a/neo/curl/tests/data/test20 b/neo/engine/curl/tests/data/test20
similarity index 100%
rename from neo/curl/tests/data/test20
rename to neo/engine/curl/tests/data/test20
diff --git a/neo/curl/tests/data/test200 b/neo/engine/curl/tests/data/test200
similarity index 100%
rename from neo/curl/tests/data/test200
rename to neo/engine/curl/tests/data/test200
diff --git a/neo/curl/tests/data/test201 b/neo/engine/curl/tests/data/test201
similarity index 100%
rename from neo/curl/tests/data/test201
rename to neo/engine/curl/tests/data/test201
diff --git a/neo/curl/tests/data/test202 b/neo/engine/curl/tests/data/test202
similarity index 100%
rename from neo/curl/tests/data/test202
rename to neo/engine/curl/tests/data/test202
diff --git a/neo/curl/tests/data/test203 b/neo/engine/curl/tests/data/test203
similarity index 100%
rename from neo/curl/tests/data/test203
rename to neo/engine/curl/tests/data/test203
diff --git a/neo/curl/tests/data/test21 b/neo/engine/curl/tests/data/test21
similarity index 100%
rename from neo/curl/tests/data/test21
rename to neo/engine/curl/tests/data/test21
diff --git a/neo/curl/tests/data/test22 b/neo/engine/curl/tests/data/test22
similarity index 100%
rename from neo/curl/tests/data/test22
rename to neo/engine/curl/tests/data/test22
diff --git a/neo/curl/tests/data/test23 b/neo/engine/curl/tests/data/test23
similarity index 100%
rename from neo/curl/tests/data/test23
rename to neo/engine/curl/tests/data/test23
diff --git a/neo/curl/tests/data/test24 b/neo/engine/curl/tests/data/test24
similarity index 100%
rename from neo/curl/tests/data/test24
rename to neo/engine/curl/tests/data/test24
diff --git a/neo/curl/tests/data/test25 b/neo/engine/curl/tests/data/test25
similarity index 100%
rename from neo/curl/tests/data/test25
rename to neo/engine/curl/tests/data/test25
diff --git a/neo/curl/tests/data/test26 b/neo/engine/curl/tests/data/test26
similarity index 100%
rename from neo/curl/tests/data/test26
rename to neo/engine/curl/tests/data/test26
diff --git a/neo/curl/tests/data/test27 b/neo/engine/curl/tests/data/test27
similarity index 100%
rename from neo/curl/tests/data/test27
rename to neo/engine/curl/tests/data/test27
diff --git a/neo/curl/tests/data/test28 b/neo/engine/curl/tests/data/test28
similarity index 100%
rename from neo/curl/tests/data/test28
rename to neo/engine/curl/tests/data/test28
diff --git a/neo/curl/tests/data/test29 b/neo/engine/curl/tests/data/test29
similarity index 100%
rename from neo/curl/tests/data/test29
rename to neo/engine/curl/tests/data/test29
diff --git a/neo/curl/tests/data/test3 b/neo/engine/curl/tests/data/test3
similarity index 100%
rename from neo/curl/tests/data/test3
rename to neo/engine/curl/tests/data/test3
diff --git a/neo/curl/tests/data/test30 b/neo/engine/curl/tests/data/test30
similarity index 100%
rename from neo/curl/tests/data/test30
rename to neo/engine/curl/tests/data/test30
diff --git a/neo/curl/tests/data/test300 b/neo/engine/curl/tests/data/test300
similarity index 100%
rename from neo/curl/tests/data/test300
rename to neo/engine/curl/tests/data/test300
diff --git a/neo/curl/tests/data/test301 b/neo/engine/curl/tests/data/test301
similarity index 100%
rename from neo/curl/tests/data/test301
rename to neo/engine/curl/tests/data/test301
diff --git a/neo/curl/tests/data/test302 b/neo/engine/curl/tests/data/test302
similarity index 100%
rename from neo/curl/tests/data/test302
rename to neo/engine/curl/tests/data/test302
diff --git a/neo/curl/tests/data/test303 b/neo/engine/curl/tests/data/test303
similarity index 100%
rename from neo/curl/tests/data/test303
rename to neo/engine/curl/tests/data/test303
diff --git a/neo/curl/tests/data/test304 b/neo/engine/curl/tests/data/test304
similarity index 100%
rename from neo/curl/tests/data/test304
rename to neo/engine/curl/tests/data/test304
diff --git a/neo/curl/tests/data/test305 b/neo/engine/curl/tests/data/test305
similarity index 100%
rename from neo/curl/tests/data/test305
rename to neo/engine/curl/tests/data/test305
diff --git a/neo/curl/tests/data/test306 b/neo/engine/curl/tests/data/test306
similarity index 100%
rename from neo/curl/tests/data/test306
rename to neo/engine/curl/tests/data/test306
diff --git a/neo/curl/tests/data/test31 b/neo/engine/curl/tests/data/test31
similarity index 100%
rename from neo/curl/tests/data/test31
rename to neo/engine/curl/tests/data/test31
diff --git a/neo/curl/tests/data/test32 b/neo/engine/curl/tests/data/test32
similarity index 100%
rename from neo/curl/tests/data/test32
rename to neo/engine/curl/tests/data/test32
diff --git a/neo/curl/tests/data/test33 b/neo/engine/curl/tests/data/test33
similarity index 100%
rename from neo/curl/tests/data/test33
rename to neo/engine/curl/tests/data/test33
diff --git a/neo/curl/tests/data/test34 b/neo/engine/curl/tests/data/test34
similarity index 100%
rename from neo/curl/tests/data/test34
rename to neo/engine/curl/tests/data/test34
diff --git a/neo/curl/tests/data/test36 b/neo/engine/curl/tests/data/test36
similarity index 100%
rename from neo/curl/tests/data/test36
rename to neo/engine/curl/tests/data/test36
diff --git a/neo/curl/tests/data/test37 b/neo/engine/curl/tests/data/test37
similarity index 100%
rename from neo/curl/tests/data/test37
rename to neo/engine/curl/tests/data/test37
diff --git a/neo/curl/tests/data/test38 b/neo/engine/curl/tests/data/test38
similarity index 100%
rename from neo/curl/tests/data/test38
rename to neo/engine/curl/tests/data/test38
diff --git a/neo/curl/tests/data/test39 b/neo/engine/curl/tests/data/test39
similarity index 100%
rename from neo/curl/tests/data/test39
rename to neo/engine/curl/tests/data/test39
diff --git a/neo/curl/tests/data/test4 b/neo/engine/curl/tests/data/test4
similarity index 100%
rename from neo/curl/tests/data/test4
rename to neo/engine/curl/tests/data/test4
diff --git a/neo/curl/tests/data/test40 b/neo/engine/curl/tests/data/test40
similarity index 100%
rename from neo/curl/tests/data/test40
rename to neo/engine/curl/tests/data/test40
diff --git a/neo/curl/tests/data/test41 b/neo/engine/curl/tests/data/test41
similarity index 100%
rename from neo/curl/tests/data/test41
rename to neo/engine/curl/tests/data/test41
diff --git a/neo/curl/tests/data/test42 b/neo/engine/curl/tests/data/test42
similarity index 100%
rename from neo/curl/tests/data/test42
rename to neo/engine/curl/tests/data/test42
diff --git a/neo/curl/tests/data/test43 b/neo/engine/curl/tests/data/test43
similarity index 100%
rename from neo/curl/tests/data/test43
rename to neo/engine/curl/tests/data/test43
diff --git a/neo/curl/tests/data/test44 b/neo/engine/curl/tests/data/test44
similarity index 100%
rename from neo/curl/tests/data/test44
rename to neo/engine/curl/tests/data/test44
diff --git a/neo/curl/tests/data/test45 b/neo/engine/curl/tests/data/test45
similarity index 100%
rename from neo/curl/tests/data/test45
rename to neo/engine/curl/tests/data/test45
diff --git a/neo/curl/tests/data/test46 b/neo/engine/curl/tests/data/test46
similarity index 100%
rename from neo/curl/tests/data/test46
rename to neo/engine/curl/tests/data/test46
diff --git a/neo/curl/tests/data/test47 b/neo/engine/curl/tests/data/test47
similarity index 100%
rename from neo/curl/tests/data/test47
rename to neo/engine/curl/tests/data/test47
diff --git a/neo/curl/tests/data/test48 b/neo/engine/curl/tests/data/test48
similarity index 100%
rename from neo/curl/tests/data/test48
rename to neo/engine/curl/tests/data/test48
diff --git a/neo/curl/tests/data/test49 b/neo/engine/curl/tests/data/test49
similarity index 100%
rename from neo/curl/tests/data/test49
rename to neo/engine/curl/tests/data/test49
diff --git a/neo/curl/tests/data/test5 b/neo/engine/curl/tests/data/test5
similarity index 100%
rename from neo/curl/tests/data/test5
rename to neo/engine/curl/tests/data/test5
diff --git a/neo/curl/tests/data/test50 b/neo/engine/curl/tests/data/test50
similarity index 100%
rename from neo/curl/tests/data/test50
rename to neo/engine/curl/tests/data/test50
diff --git a/neo/curl/tests/data/test500 b/neo/engine/curl/tests/data/test500
similarity index 100%
rename from neo/curl/tests/data/test500
rename to neo/engine/curl/tests/data/test500
diff --git a/neo/curl/tests/data/test501 b/neo/engine/curl/tests/data/test501
similarity index 100%
rename from neo/curl/tests/data/test501
rename to neo/engine/curl/tests/data/test501
diff --git a/neo/curl/tests/data/test502 b/neo/engine/curl/tests/data/test502
similarity index 100%
rename from neo/curl/tests/data/test502
rename to neo/engine/curl/tests/data/test502
diff --git a/neo/curl/tests/data/test503 b/neo/engine/curl/tests/data/test503
similarity index 100%
rename from neo/curl/tests/data/test503
rename to neo/engine/curl/tests/data/test503
diff --git a/neo/curl/tests/data/test504 b/neo/engine/curl/tests/data/test504
similarity index 100%
rename from neo/curl/tests/data/test504
rename to neo/engine/curl/tests/data/test504
diff --git a/neo/curl/tests/data/test505 b/neo/engine/curl/tests/data/test505
similarity index 100%
rename from neo/curl/tests/data/test505
rename to neo/engine/curl/tests/data/test505
diff --git a/neo/curl/tests/data/test506 b/neo/engine/curl/tests/data/test506
similarity index 100%
rename from neo/curl/tests/data/test506
rename to neo/engine/curl/tests/data/test506
diff --git a/neo/curl/tests/data/test507 b/neo/engine/curl/tests/data/test507
similarity index 100%
rename from neo/curl/tests/data/test507
rename to neo/engine/curl/tests/data/test507
diff --git a/neo/curl/tests/data/test508 b/neo/engine/curl/tests/data/test508
similarity index 100%
rename from neo/curl/tests/data/test508
rename to neo/engine/curl/tests/data/test508
diff --git a/neo/curl/tests/data/test509 b/neo/engine/curl/tests/data/test509
similarity index 100%
rename from neo/curl/tests/data/test509
rename to neo/engine/curl/tests/data/test509
diff --git a/neo/curl/tests/data/test51 b/neo/engine/curl/tests/data/test51
similarity index 100%
rename from neo/curl/tests/data/test51
rename to neo/engine/curl/tests/data/test51
diff --git a/neo/curl/tests/data/test510 b/neo/engine/curl/tests/data/test510
similarity index 100%
rename from neo/curl/tests/data/test510
rename to neo/engine/curl/tests/data/test510
diff --git a/neo/curl/tests/data/test52 b/neo/engine/curl/tests/data/test52
similarity index 100%
rename from neo/curl/tests/data/test52
rename to neo/engine/curl/tests/data/test52
diff --git a/neo/curl/tests/data/test53 b/neo/engine/curl/tests/data/test53
similarity index 100%
rename from neo/curl/tests/data/test53
rename to neo/engine/curl/tests/data/test53
diff --git a/neo/curl/tests/data/test54 b/neo/engine/curl/tests/data/test54
similarity index 100%
rename from neo/curl/tests/data/test54
rename to neo/engine/curl/tests/data/test54
diff --git a/neo/curl/tests/data/test55 b/neo/engine/curl/tests/data/test55
similarity index 100%
rename from neo/curl/tests/data/test55
rename to neo/engine/curl/tests/data/test55
diff --git a/neo/curl/tests/data/test56 b/neo/engine/curl/tests/data/test56
similarity index 100%
rename from neo/curl/tests/data/test56
rename to neo/engine/curl/tests/data/test56
diff --git a/neo/curl/tests/data/test57 b/neo/engine/curl/tests/data/test57
similarity index 100%
rename from neo/curl/tests/data/test57
rename to neo/engine/curl/tests/data/test57
diff --git a/neo/curl/tests/data/test58 b/neo/engine/curl/tests/data/test58
similarity index 100%
rename from neo/curl/tests/data/test58
rename to neo/engine/curl/tests/data/test58
diff --git a/neo/curl/tests/data/test59 b/neo/engine/curl/tests/data/test59
similarity index 100%
rename from neo/curl/tests/data/test59
rename to neo/engine/curl/tests/data/test59
diff --git a/neo/curl/tests/data/test6 b/neo/engine/curl/tests/data/test6
similarity index 100%
rename from neo/curl/tests/data/test6
rename to neo/engine/curl/tests/data/test6
diff --git a/neo/curl/tests/data/test60 b/neo/engine/curl/tests/data/test60
similarity index 100%
rename from neo/curl/tests/data/test60
rename to neo/engine/curl/tests/data/test60
diff --git a/neo/curl/tests/data/test61 b/neo/engine/curl/tests/data/test61
similarity index 100%
rename from neo/curl/tests/data/test61
rename to neo/engine/curl/tests/data/test61
diff --git a/neo/curl/tests/data/test62 b/neo/engine/curl/tests/data/test62
similarity index 100%
rename from neo/curl/tests/data/test62
rename to neo/engine/curl/tests/data/test62
diff --git a/neo/curl/tests/data/test63 b/neo/engine/curl/tests/data/test63
similarity index 100%
rename from neo/curl/tests/data/test63
rename to neo/engine/curl/tests/data/test63
diff --git a/neo/curl/tests/data/test64 b/neo/engine/curl/tests/data/test64
similarity index 100%
rename from neo/curl/tests/data/test64
rename to neo/engine/curl/tests/data/test64
diff --git a/neo/curl/tests/data/test65 b/neo/engine/curl/tests/data/test65
similarity index 100%
rename from neo/curl/tests/data/test65
rename to neo/engine/curl/tests/data/test65
diff --git a/neo/curl/tests/data/test66 b/neo/engine/curl/tests/data/test66
similarity index 100%
rename from neo/curl/tests/data/test66
rename to neo/engine/curl/tests/data/test66
diff --git a/neo/curl/tests/data/test67 b/neo/engine/curl/tests/data/test67
similarity index 100%
rename from neo/curl/tests/data/test67
rename to neo/engine/curl/tests/data/test67
diff --git a/neo/curl/tests/data/test68 b/neo/engine/curl/tests/data/test68
similarity index 100%
rename from neo/curl/tests/data/test68
rename to neo/engine/curl/tests/data/test68
diff --git a/neo/curl/tests/data/test69 b/neo/engine/curl/tests/data/test69
similarity index 100%
rename from neo/curl/tests/data/test69
rename to neo/engine/curl/tests/data/test69
diff --git a/neo/curl/tests/data/test7 b/neo/engine/curl/tests/data/test7
similarity index 100%
rename from neo/curl/tests/data/test7
rename to neo/engine/curl/tests/data/test7
diff --git a/neo/curl/tests/data/test70 b/neo/engine/curl/tests/data/test70
similarity index 100%
rename from neo/curl/tests/data/test70
rename to neo/engine/curl/tests/data/test70
diff --git a/neo/curl/tests/data/test71 b/neo/engine/curl/tests/data/test71
similarity index 100%
rename from neo/curl/tests/data/test71
rename to neo/engine/curl/tests/data/test71
diff --git a/neo/curl/tests/data/test72 b/neo/engine/curl/tests/data/test72
similarity index 100%
rename from neo/curl/tests/data/test72
rename to neo/engine/curl/tests/data/test72
diff --git a/neo/curl/tests/data/test73 b/neo/engine/curl/tests/data/test73
similarity index 100%
rename from neo/curl/tests/data/test73
rename to neo/engine/curl/tests/data/test73
diff --git a/neo/curl/tests/data/test74 b/neo/engine/curl/tests/data/test74
similarity index 100%
rename from neo/curl/tests/data/test74
rename to neo/engine/curl/tests/data/test74
diff --git a/neo/curl/tests/data/test75 b/neo/engine/curl/tests/data/test75
similarity index 100%
rename from neo/curl/tests/data/test75
rename to neo/engine/curl/tests/data/test75
diff --git a/neo/curl/tests/data/test76 b/neo/engine/curl/tests/data/test76
similarity index 100%
rename from neo/curl/tests/data/test76
rename to neo/engine/curl/tests/data/test76
diff --git a/neo/curl/tests/data/test77 b/neo/engine/curl/tests/data/test77
similarity index 100%
rename from neo/curl/tests/data/test77
rename to neo/engine/curl/tests/data/test77
diff --git a/neo/curl/tests/data/test78 b/neo/engine/curl/tests/data/test78
similarity index 100%
rename from neo/curl/tests/data/test78
rename to neo/engine/curl/tests/data/test78
diff --git a/neo/curl/tests/data/test79 b/neo/engine/curl/tests/data/test79
similarity index 100%
rename from neo/curl/tests/data/test79
rename to neo/engine/curl/tests/data/test79
diff --git a/neo/curl/tests/data/test8 b/neo/engine/curl/tests/data/test8
similarity index 100%
rename from neo/curl/tests/data/test8
rename to neo/engine/curl/tests/data/test8
diff --git a/neo/curl/tests/data/test80 b/neo/engine/curl/tests/data/test80
similarity index 100%
rename from neo/curl/tests/data/test80
rename to neo/engine/curl/tests/data/test80
diff --git a/neo/curl/tests/data/test81 b/neo/engine/curl/tests/data/test81
similarity index 100%
rename from neo/curl/tests/data/test81
rename to neo/engine/curl/tests/data/test81
diff --git a/neo/curl/tests/data/test82 b/neo/engine/curl/tests/data/test82
similarity index 100%
rename from neo/curl/tests/data/test82
rename to neo/engine/curl/tests/data/test82
diff --git a/neo/curl/tests/data/test83 b/neo/engine/curl/tests/data/test83
similarity index 100%
rename from neo/curl/tests/data/test83
rename to neo/engine/curl/tests/data/test83
diff --git a/neo/curl/tests/data/test84 b/neo/engine/curl/tests/data/test84
similarity index 100%
rename from neo/curl/tests/data/test84
rename to neo/engine/curl/tests/data/test84
diff --git a/neo/curl/tests/data/test85 b/neo/engine/curl/tests/data/test85
similarity index 100%
rename from neo/curl/tests/data/test85
rename to neo/engine/curl/tests/data/test85
diff --git a/neo/curl/tests/data/test86 b/neo/engine/curl/tests/data/test86
similarity index 100%
rename from neo/curl/tests/data/test86
rename to neo/engine/curl/tests/data/test86
diff --git a/neo/curl/tests/data/test87 b/neo/engine/curl/tests/data/test87
similarity index 100%
rename from neo/curl/tests/data/test87
rename to neo/engine/curl/tests/data/test87
diff --git a/neo/curl/tests/data/test88 b/neo/engine/curl/tests/data/test88
similarity index 100%
rename from neo/curl/tests/data/test88
rename to neo/engine/curl/tests/data/test88
diff --git a/neo/curl/tests/data/test89 b/neo/engine/curl/tests/data/test89
similarity index 100%
rename from neo/curl/tests/data/test89
rename to neo/engine/curl/tests/data/test89
diff --git a/neo/curl/tests/data/test9 b/neo/engine/curl/tests/data/test9
similarity index 100%
rename from neo/curl/tests/data/test9
rename to neo/engine/curl/tests/data/test9
diff --git a/neo/curl/tests/data/test90 b/neo/engine/curl/tests/data/test90
similarity index 100%
rename from neo/curl/tests/data/test90
rename to neo/engine/curl/tests/data/test90
diff --git a/neo/curl/tests/data/test91 b/neo/engine/curl/tests/data/test91
similarity index 100%
rename from neo/curl/tests/data/test91
rename to neo/engine/curl/tests/data/test91
diff --git a/neo/curl/tests/data/test92 b/neo/engine/curl/tests/data/test92
similarity index 100%
rename from neo/curl/tests/data/test92
rename to neo/engine/curl/tests/data/test92
diff --git a/neo/curl/tests/data/test93 b/neo/engine/curl/tests/data/test93
similarity index 100%
rename from neo/curl/tests/data/test93
rename to neo/engine/curl/tests/data/test93
diff --git a/neo/curl/tests/data/test94 b/neo/engine/curl/tests/data/test94
similarity index 100%
rename from neo/curl/tests/data/test94
rename to neo/engine/curl/tests/data/test94
diff --git a/neo/curl/tests/data/test95 b/neo/engine/curl/tests/data/test95
similarity index 100%
rename from neo/curl/tests/data/test95
rename to neo/engine/curl/tests/data/test95
diff --git a/neo/curl/tests/data/test97 b/neo/engine/curl/tests/data/test97
similarity index 100%
rename from neo/curl/tests/data/test97
rename to neo/engine/curl/tests/data/test97
diff --git a/neo/curl/tests/data/test98 b/neo/engine/curl/tests/data/test98
similarity index 100%
rename from neo/curl/tests/data/test98
rename to neo/engine/curl/tests/data/test98
diff --git a/neo/curl/tests/data/test99 b/neo/engine/curl/tests/data/test99
similarity index 100%
rename from neo/curl/tests/data/test99
rename to neo/engine/curl/tests/data/test99
diff --git a/neo/curl/tests/ftpserver.pl b/neo/engine/curl/tests/ftpserver.pl
similarity index 100%
rename from neo/curl/tests/ftpserver.pl
rename to neo/engine/curl/tests/ftpserver.pl
diff --git a/neo/curl/tests/ftpsserver.pl b/neo/engine/curl/tests/ftpsserver.pl
similarity index 100%
rename from neo/curl/tests/ftpsserver.pl
rename to neo/engine/curl/tests/ftpsserver.pl
diff --git a/neo/curl/tests/getpart.pm b/neo/engine/curl/tests/getpart.pm
similarity index 100%
rename from neo/curl/tests/getpart.pm
rename to neo/engine/curl/tests/getpart.pm
diff --git a/neo/curl/tests/httpserver.pl b/neo/engine/curl/tests/httpserver.pl
similarity index 100%
rename from neo/curl/tests/httpserver.pl
rename to neo/engine/curl/tests/httpserver.pl
diff --git a/neo/curl/tests/httpsserver.pl b/neo/engine/curl/tests/httpsserver.pl
similarity index 100%
rename from neo/curl/tests/httpsserver.pl
rename to neo/engine/curl/tests/httpsserver.pl
diff --git a/neo/curl/tests/libtest/Makefile.am b/neo/engine/curl/tests/libtest/Makefile.am
similarity index 100%
rename from neo/curl/tests/libtest/Makefile.am
rename to neo/engine/curl/tests/libtest/Makefile.am
diff --git a/neo/curl/tests/libtest/Makefile.in b/neo/engine/curl/tests/libtest/Makefile.in
similarity index 100%
rename from neo/curl/tests/libtest/Makefile.in
rename to neo/engine/curl/tests/libtest/Makefile.in
diff --git a/neo/curl/tests/libtest/first.c b/neo/engine/curl/tests/libtest/first.c
similarity index 100%
rename from neo/curl/tests/libtest/first.c
rename to neo/engine/curl/tests/libtest/first.c
diff --git a/neo/curl/tests/libtest/lib500.c b/neo/engine/curl/tests/libtest/lib500.c
similarity index 100%
rename from neo/curl/tests/libtest/lib500.c
rename to neo/engine/curl/tests/libtest/lib500.c
diff --git a/neo/curl/tests/libtest/lib501.c b/neo/engine/curl/tests/libtest/lib501.c
similarity index 100%
rename from neo/curl/tests/libtest/lib501.c
rename to neo/engine/curl/tests/libtest/lib501.c
diff --git a/neo/curl/tests/libtest/lib502.c b/neo/engine/curl/tests/libtest/lib502.c
similarity index 100%
rename from neo/curl/tests/libtest/lib502.c
rename to neo/engine/curl/tests/libtest/lib502.c
diff --git a/neo/curl/tests/libtest/lib503.c b/neo/engine/curl/tests/libtest/lib503.c
similarity index 100%
rename from neo/curl/tests/libtest/lib503.c
rename to neo/engine/curl/tests/libtest/lib503.c
diff --git a/neo/curl/tests/libtest/lib504.c b/neo/engine/curl/tests/libtest/lib504.c
similarity index 100%
rename from neo/curl/tests/libtest/lib504.c
rename to neo/engine/curl/tests/libtest/lib504.c
diff --git a/neo/curl/tests/libtest/lib505.c b/neo/engine/curl/tests/libtest/lib505.c
similarity index 100%
rename from neo/curl/tests/libtest/lib505.c
rename to neo/engine/curl/tests/libtest/lib505.c
diff --git a/neo/curl/tests/libtest/lib506.c b/neo/engine/curl/tests/libtest/lib506.c
similarity index 100%
rename from neo/curl/tests/libtest/lib506.c
rename to neo/engine/curl/tests/libtest/lib506.c
diff --git a/neo/curl/tests/libtest/lib507.c b/neo/engine/curl/tests/libtest/lib507.c
similarity index 100%
rename from neo/curl/tests/libtest/lib507.c
rename to neo/engine/curl/tests/libtest/lib507.c
diff --git a/neo/curl/tests/libtest/lib508.c b/neo/engine/curl/tests/libtest/lib508.c
similarity index 100%
rename from neo/curl/tests/libtest/lib508.c
rename to neo/engine/curl/tests/libtest/lib508.c
diff --git a/neo/curl/tests/libtest/lib509.c b/neo/engine/curl/tests/libtest/lib509.c
similarity index 100%
rename from neo/curl/tests/libtest/lib509.c
rename to neo/engine/curl/tests/libtest/lib509.c
diff --git a/neo/curl/tests/libtest/lib510.c b/neo/engine/curl/tests/libtest/lib510.c
similarity index 100%
rename from neo/curl/tests/libtest/lib510.c
rename to neo/engine/curl/tests/libtest/lib510.c
diff --git a/neo/curl/tests/libtest/test.h b/neo/engine/curl/tests/libtest/test.h
similarity index 100%
rename from neo/curl/tests/libtest/test.h
rename to neo/engine/curl/tests/libtest/test.h
diff --git a/neo/curl/tests/memanalyze.pl b/neo/engine/curl/tests/memanalyze.pl
similarity index 100%
rename from neo/curl/tests/memanalyze.pl
rename to neo/engine/curl/tests/memanalyze.pl
diff --git a/neo/curl/tests/runtests.pl b/neo/engine/curl/tests/runtests.pl
similarity index 100%
rename from neo/curl/tests/runtests.pl
rename to neo/engine/curl/tests/runtests.pl
diff --git a/neo/curl/tests/server/Makefile.am b/neo/engine/curl/tests/server/Makefile.am
similarity index 100%
rename from neo/curl/tests/server/Makefile.am
rename to neo/engine/curl/tests/server/Makefile.am
diff --git a/neo/curl/tests/server/Makefile.in b/neo/engine/curl/tests/server/Makefile.in
similarity index 100%
rename from neo/curl/tests/server/Makefile.in
rename to neo/engine/curl/tests/server/Makefile.in
diff --git a/neo/curl/tests/server/getpart.c b/neo/engine/curl/tests/server/getpart.c
similarity index 100%
rename from neo/curl/tests/server/getpart.c
rename to neo/engine/curl/tests/server/getpart.c
diff --git a/neo/curl/tests/server/getpart.h b/neo/engine/curl/tests/server/getpart.h
similarity index 100%
rename from neo/curl/tests/server/getpart.h
rename to neo/engine/curl/tests/server/getpart.h
diff --git a/neo/curl/tests/server/sws.c b/neo/engine/curl/tests/server/sws.c
similarity index 100%
rename from neo/curl/tests/server/sws.c
rename to neo/engine/curl/tests/server/sws.c
diff --git a/neo/curl/tests/stunnel.pem b/neo/engine/curl/tests/stunnel.pem
similarity index 100%
rename from neo/curl/tests/stunnel.pem
rename to neo/engine/curl/tests/stunnel.pem
diff --git a/neo/curllib.vcxproj b/neo/engine/curllib.vcxproj
similarity index 100%
rename from neo/curllib.vcxproj
rename to neo/engine/curllib.vcxproj
diff --git a/neo/curllib.vcxproj.filters b/neo/engine/curllib.vcxproj.filters
similarity index 100%
rename from neo/curllib.vcxproj.filters
rename to neo/engine/curllib.vcxproj.filters
diff --git a/neo/curllib.vcxproj.user b/neo/engine/curllib.vcxproj.user
similarity index 100%
rename from neo/curllib.vcxproj.user
rename to neo/engine/curllib.vcxproj.user
diff --git a/neo/doomdll.vcxproj b/neo/engine/doomdll.vcxproj
similarity index 99%
rename from neo/doomdll.vcxproj
rename to neo/engine/doomdll.vcxproj
index 94df8d9a..dbe0f519 100644
--- a/neo/doomdll.vcxproj
+++ b/neo/engine/doomdll.vcxproj
@@ -213,7 +213,7 @@
openal\lib;sys\win32\dongle;%(AdditionalLibraryDirectories)
- ../Doom3.exe
+ ../../Doom3.exe
d3d12.lib;nafxcwd.lib;libcmtd.lib;%(AdditionalDependencies)
@@ -226,7 +226,7 @@
openal\lib;sys\win32\dongle;%(AdditionalLibraryDirectories)
- ../Prey.exe
+ ../../Prey.exe
d3d12.lib;nafxcwd.lib;libcmtd.lib;%(AdditionalDependencies)
@@ -351,7 +351,6 @@
-
@@ -2890,13 +2889,20 @@
+
+ {49bec5c6-b964-417a-851e-808886b57430}
+ false
+
+
+ {6cd8e46d-e28e-493f-bb06-537a637a68c2}
+ false
+ true
+ true
+
{f46f5d4e-c1d4-4ade-9faa-5f0ce3aa07f1}
false
-
- {49bec5c6-b964-417a-851e-808886b57430}
-
{49bec5c6-b964-417a-851e-808886b57400}
false
@@ -2904,10 +2910,6 @@
{58320c19-5139-47c5-aafe-4cad2c8ed14d}
-
- {6cd8e46d-e28e-493f-bb06-537a637a68c2}
- false
-
diff --git a/neo/doomdll.vcxproj.filters b/neo/engine/doomdll.vcxproj.filters
similarity index 99%
rename from neo/doomdll.vcxproj.filters
rename to neo/engine/doomdll.vcxproj.filters
index fe32c9ff..653d6be0 100644
--- a/neo/doomdll.vcxproj.filters
+++ b/neo/engine/doomdll.vcxproj.filters
@@ -249,9 +249,6 @@
Renderer
-
- Renderer
-
Sound
diff --git a/neo/doomdll.vcxproj.user b/neo/engine/doomdll.vcxproj.user
similarity index 100%
rename from neo/doomdll.vcxproj.user
rename to neo/engine/doomdll.vcxproj.user
diff --git a/neo/framework/BuildDefines.h b/neo/engine/framework/BuildDefines.h
similarity index 100%
rename from neo/framework/BuildDefines.h
rename to neo/engine/framework/BuildDefines.h
diff --git a/neo/framework/BuildVersion.h b/neo/engine/framework/BuildVersion.h
similarity index 100%
rename from neo/framework/BuildVersion.h
rename to neo/engine/framework/BuildVersion.h
diff --git a/neo/framework/CVarSystem.cpp b/neo/engine/framework/CVarSystem.cpp
similarity index 100%
rename from neo/framework/CVarSystem.cpp
rename to neo/engine/framework/CVarSystem.cpp
diff --git a/neo/framework/CVarSystem.h b/neo/engine/framework/CVarSystem.h
similarity index 100%
rename from neo/framework/CVarSystem.h
rename to neo/engine/framework/CVarSystem.h
diff --git a/neo/framework/CmdSystem.cpp b/neo/engine/framework/CmdSystem.cpp
similarity index 100%
rename from neo/framework/CmdSystem.cpp
rename to neo/engine/framework/CmdSystem.cpp
diff --git a/neo/framework/CmdSystem.h b/neo/engine/framework/CmdSystem.h
similarity index 100%
rename from neo/framework/CmdSystem.h
rename to neo/engine/framework/CmdSystem.h
diff --git a/neo/framework/Common.cpp b/neo/engine/framework/Common.cpp
similarity index 100%
rename from neo/framework/Common.cpp
rename to neo/engine/framework/Common.cpp
diff --git a/neo/framework/Common.h b/neo/engine/framework/Common.h
similarity index 100%
rename from neo/framework/Common.h
rename to neo/engine/framework/Common.h
diff --git a/neo/framework/Compressor.cpp b/neo/engine/framework/Compressor.cpp
similarity index 100%
rename from neo/framework/Compressor.cpp
rename to neo/engine/framework/Compressor.cpp
diff --git a/neo/framework/Compressor.h b/neo/engine/framework/Compressor.h
similarity index 100%
rename from neo/framework/Compressor.h
rename to neo/engine/framework/Compressor.h
diff --git a/neo/framework/Console.cpp b/neo/engine/framework/Console.cpp
similarity index 100%
rename from neo/framework/Console.cpp
rename to neo/engine/framework/Console.cpp
diff --git a/neo/framework/Console.h b/neo/engine/framework/Console.h
similarity index 100%
rename from neo/framework/Console.h
rename to neo/engine/framework/Console.h
diff --git a/neo/framework/DeclAF.cpp b/neo/engine/framework/DeclAF.cpp
similarity index 100%
rename from neo/framework/DeclAF.cpp
rename to neo/engine/framework/DeclAF.cpp
diff --git a/neo/framework/DeclAF.h b/neo/engine/framework/DeclAF.h
similarity index 100%
rename from neo/framework/DeclAF.h
rename to neo/engine/framework/DeclAF.h
diff --git a/neo/framework/DeclEntityDef.cpp b/neo/engine/framework/DeclEntityDef.cpp
similarity index 100%
rename from neo/framework/DeclEntityDef.cpp
rename to neo/engine/framework/DeclEntityDef.cpp
diff --git a/neo/framework/DeclEntityDef.h b/neo/engine/framework/DeclEntityDef.h
similarity index 100%
rename from neo/framework/DeclEntityDef.h
rename to neo/engine/framework/DeclEntityDef.h
diff --git a/neo/framework/DeclFX.cpp b/neo/engine/framework/DeclFX.cpp
similarity index 100%
rename from neo/framework/DeclFX.cpp
rename to neo/engine/framework/DeclFX.cpp
diff --git a/neo/framework/DeclFX.h b/neo/engine/framework/DeclFX.h
similarity index 100%
rename from neo/framework/DeclFX.h
rename to neo/engine/framework/DeclFX.h
diff --git a/neo/framework/DeclManager.cpp b/neo/engine/framework/DeclManager.cpp
similarity index 100%
rename from neo/framework/DeclManager.cpp
rename to neo/engine/framework/DeclManager.cpp
diff --git a/neo/framework/DeclManager.h b/neo/engine/framework/DeclManager.h
similarity index 100%
rename from neo/framework/DeclManager.h
rename to neo/engine/framework/DeclManager.h
diff --git a/neo/framework/DeclPDA.cpp b/neo/engine/framework/DeclPDA.cpp
similarity index 100%
rename from neo/framework/DeclPDA.cpp
rename to neo/engine/framework/DeclPDA.cpp
diff --git a/neo/framework/DeclPDA.h b/neo/engine/framework/DeclPDA.h
similarity index 100%
rename from neo/framework/DeclPDA.h
rename to neo/engine/framework/DeclPDA.h
diff --git a/neo/framework/DeclParticle.cpp b/neo/engine/framework/DeclParticle.cpp
similarity index 100%
rename from neo/framework/DeclParticle.cpp
rename to neo/engine/framework/DeclParticle.cpp
diff --git a/neo/framework/DeclParticle.h b/neo/engine/framework/DeclParticle.h
similarity index 100%
rename from neo/framework/DeclParticle.h
rename to neo/engine/framework/DeclParticle.h
diff --git a/neo/framework/DeclSkin.cpp b/neo/engine/framework/DeclSkin.cpp
similarity index 100%
rename from neo/framework/DeclSkin.cpp
rename to neo/engine/framework/DeclSkin.cpp
diff --git a/neo/framework/DeclSkin.h b/neo/engine/framework/DeclSkin.h
similarity index 100%
rename from neo/framework/DeclSkin.h
rename to neo/engine/framework/DeclSkin.h
diff --git a/neo/framework/DeclTable.cpp b/neo/engine/framework/DeclTable.cpp
similarity index 100%
rename from neo/framework/DeclTable.cpp
rename to neo/engine/framework/DeclTable.cpp
diff --git a/neo/framework/DeclTable.h b/neo/engine/framework/DeclTable.h
similarity index 100%
rename from neo/framework/DeclTable.h
rename to neo/engine/framework/DeclTable.h
diff --git a/neo/framework/DemoChecksum.h b/neo/engine/framework/DemoChecksum.h
similarity index 100%
rename from neo/framework/DemoChecksum.h
rename to neo/engine/framework/DemoChecksum.h
diff --git a/neo/framework/DemoFile.cpp b/neo/engine/framework/DemoFile.cpp
similarity index 100%
rename from neo/framework/DemoFile.cpp
rename to neo/engine/framework/DemoFile.cpp
diff --git a/neo/framework/DemoFile.h b/neo/engine/framework/DemoFile.h
similarity index 100%
rename from neo/framework/DemoFile.h
rename to neo/engine/framework/DemoFile.h
diff --git a/neo/framework/EditField.cpp b/neo/engine/framework/EditField.cpp
similarity index 100%
rename from neo/framework/EditField.cpp
rename to neo/engine/framework/EditField.cpp
diff --git a/neo/framework/EditField.h b/neo/engine/framework/EditField.h
similarity index 100%
rename from neo/framework/EditField.h
rename to neo/engine/framework/EditField.h
diff --git a/neo/framework/EventLoop.cpp b/neo/engine/framework/EventLoop.cpp
similarity index 100%
rename from neo/framework/EventLoop.cpp
rename to neo/engine/framework/EventLoop.cpp
diff --git a/neo/framework/EventLoop.h b/neo/engine/framework/EventLoop.h
similarity index 100%
rename from neo/framework/EventLoop.h
rename to neo/engine/framework/EventLoop.h
diff --git a/neo/framework/File.cpp b/neo/engine/framework/File.cpp
similarity index 100%
rename from neo/framework/File.cpp
rename to neo/engine/framework/File.cpp
diff --git a/neo/framework/File.h b/neo/engine/framework/File.h
similarity index 100%
rename from neo/framework/File.h
rename to neo/engine/framework/File.h
diff --git a/neo/framework/FileSystem.cpp b/neo/engine/framework/FileSystem.cpp
similarity index 100%
rename from neo/framework/FileSystem.cpp
rename to neo/engine/framework/FileSystem.cpp
diff --git a/neo/framework/FileSystem.h b/neo/engine/framework/FileSystem.h
similarity index 100%
rename from neo/framework/FileSystem.h
rename to neo/engine/framework/FileSystem.h
diff --git a/neo/framework/KeyInput.cpp b/neo/engine/framework/KeyInput.cpp
similarity index 100%
rename from neo/framework/KeyInput.cpp
rename to neo/engine/framework/KeyInput.cpp
diff --git a/neo/framework/KeyInput.h b/neo/engine/framework/KeyInput.h
similarity index 100%
rename from neo/framework/KeyInput.h
rename to neo/engine/framework/KeyInput.h
diff --git a/neo/framework/Licensee.h b/neo/engine/framework/Licensee.h
similarity index 100%
rename from neo/framework/Licensee.h
rename to neo/engine/framework/Licensee.h
diff --git a/neo/framework/Session.cpp b/neo/engine/framework/Session.cpp
similarity index 100%
rename from neo/framework/Session.cpp
rename to neo/engine/framework/Session.cpp
diff --git a/neo/framework/Session.h b/neo/engine/framework/Session.h
similarity index 100%
rename from neo/framework/Session.h
rename to neo/engine/framework/Session.h
diff --git a/neo/framework/Session_local.h b/neo/engine/framework/Session_local.h
similarity index 100%
rename from neo/framework/Session_local.h
rename to neo/engine/framework/Session_local.h
diff --git a/neo/framework/Session_menu.cpp b/neo/engine/framework/Session_menu.cpp
similarity index 100%
rename from neo/framework/Session_menu.cpp
rename to neo/engine/framework/Session_menu.cpp
diff --git a/neo/framework/Unzip.cpp b/neo/engine/framework/Unzip.cpp
similarity index 100%
rename from neo/framework/Unzip.cpp
rename to neo/engine/framework/Unzip.cpp
diff --git a/neo/framework/Unzip.h b/neo/engine/framework/Unzip.h
similarity index 100%
rename from neo/framework/Unzip.h
rename to neo/engine/framework/Unzip.h
diff --git a/neo/framework/UsercmdGen.cpp b/neo/engine/framework/UsercmdGen.cpp
similarity index 100%
rename from neo/framework/UsercmdGen.cpp
rename to neo/engine/framework/UsercmdGen.cpp
diff --git a/neo/framework/UsercmdGen.h b/neo/engine/framework/UsercmdGen.h
similarity index 100%
rename from neo/framework/UsercmdGen.h
rename to neo/engine/framework/UsercmdGen.h
diff --git a/neo/framework/async/AsyncClient.cpp b/neo/engine/framework/async/AsyncClient.cpp
similarity index 100%
rename from neo/framework/async/AsyncClient.cpp
rename to neo/engine/framework/async/AsyncClient.cpp
diff --git a/neo/framework/async/AsyncClient.h b/neo/engine/framework/async/AsyncClient.h
similarity index 100%
rename from neo/framework/async/AsyncClient.h
rename to neo/engine/framework/async/AsyncClient.h
diff --git a/neo/framework/async/AsyncNetwork.cpp b/neo/engine/framework/async/AsyncNetwork.cpp
similarity index 100%
rename from neo/framework/async/AsyncNetwork.cpp
rename to neo/engine/framework/async/AsyncNetwork.cpp
diff --git a/neo/framework/async/AsyncNetwork.h b/neo/engine/framework/async/AsyncNetwork.h
similarity index 100%
rename from neo/framework/async/AsyncNetwork.h
rename to neo/engine/framework/async/AsyncNetwork.h
diff --git a/neo/framework/async/AsyncServer.cpp b/neo/engine/framework/async/AsyncServer.cpp
similarity index 100%
rename from neo/framework/async/AsyncServer.cpp
rename to neo/engine/framework/async/AsyncServer.cpp
diff --git a/neo/framework/async/AsyncServer.h b/neo/engine/framework/async/AsyncServer.h
similarity index 100%
rename from neo/framework/async/AsyncServer.h
rename to neo/engine/framework/async/AsyncServer.h
diff --git a/neo/framework/async/MsgChannel.cpp b/neo/engine/framework/async/MsgChannel.cpp
similarity index 100%
rename from neo/framework/async/MsgChannel.cpp
rename to neo/engine/framework/async/MsgChannel.cpp
diff --git a/neo/framework/async/MsgChannel.h b/neo/engine/framework/async/MsgChannel.h
similarity index 100%
rename from neo/framework/async/MsgChannel.h
rename to neo/engine/framework/async/MsgChannel.h
diff --git a/neo/framework/async/NetworkSystem.cpp b/neo/engine/framework/async/NetworkSystem.cpp
similarity index 100%
rename from neo/framework/async/NetworkSystem.cpp
rename to neo/engine/framework/async/NetworkSystem.cpp
diff --git a/neo/framework/async/NetworkSystem.h b/neo/engine/framework/async/NetworkSystem.h
similarity index 100%
rename from neo/framework/async/NetworkSystem.h
rename to neo/engine/framework/async/NetworkSystem.h
diff --git a/neo/framework/async/ServerScan.cpp b/neo/engine/framework/async/ServerScan.cpp
similarity index 100%
rename from neo/framework/async/ServerScan.cpp
rename to neo/engine/framework/async/ServerScan.cpp
diff --git a/neo/framework/async/ServerScan.h b/neo/engine/framework/async/ServerScan.h
similarity index 100%
rename from neo/framework/async/ServerScan.h
rename to neo/engine/framework/async/ServerScan.h
diff --git a/neo/idlib.vcxproj b/neo/engine/idlib.vcxproj
similarity index 100%
rename from neo/idlib.vcxproj
rename to neo/engine/idlib.vcxproj
diff --git a/neo/idlib.vcxproj.filters b/neo/engine/idlib.vcxproj.filters
similarity index 100%
rename from neo/idlib.vcxproj.filters
rename to neo/engine/idlib.vcxproj.filters
diff --git a/neo/idlib.vcxproj.user b/neo/engine/idlib.vcxproj.user
similarity index 100%
rename from neo/idlib.vcxproj.user
rename to neo/engine/idlib.vcxproj.user
diff --git a/neo/idlib/Base64.cpp b/neo/engine/idlib/Base64.cpp
similarity index 100%
rename from neo/idlib/Base64.cpp
rename to neo/engine/idlib/Base64.cpp
diff --git a/neo/idlib/Base64.h b/neo/engine/idlib/Base64.h
similarity index 100%
rename from neo/idlib/Base64.h
rename to neo/engine/idlib/Base64.h
diff --git a/neo/idlib/BitMsg.cpp b/neo/engine/idlib/BitMsg.cpp
similarity index 100%
rename from neo/idlib/BitMsg.cpp
rename to neo/engine/idlib/BitMsg.cpp
diff --git a/neo/idlib/BitMsg.h b/neo/engine/idlib/BitMsg.h
similarity index 100%
rename from neo/idlib/BitMsg.h
rename to neo/engine/idlib/BitMsg.h
diff --git a/neo/idlib/CmdArgs.cpp b/neo/engine/idlib/CmdArgs.cpp
similarity index 100%
rename from neo/idlib/CmdArgs.cpp
rename to neo/engine/idlib/CmdArgs.cpp
diff --git a/neo/idlib/CmdArgs.h b/neo/engine/idlib/CmdArgs.h
similarity index 100%
rename from neo/idlib/CmdArgs.h
rename to neo/engine/idlib/CmdArgs.h
diff --git a/neo/idlib/Dict.cpp b/neo/engine/idlib/Dict.cpp
similarity index 100%
rename from neo/idlib/Dict.cpp
rename to neo/engine/idlib/Dict.cpp
diff --git a/neo/idlib/Dict.h b/neo/engine/idlib/Dict.h
similarity index 100%
rename from neo/idlib/Dict.h
rename to neo/engine/idlib/Dict.h
diff --git a/neo/idlib/Heap.cpp b/neo/engine/idlib/Heap.cpp
similarity index 100%
rename from neo/idlib/Heap.cpp
rename to neo/engine/idlib/Heap.cpp
diff --git a/neo/idlib/Heap.h b/neo/engine/idlib/Heap.h
similarity index 100%
rename from neo/idlib/Heap.h
rename to neo/engine/idlib/Heap.h
diff --git a/neo/idlib/LangDict.cpp b/neo/engine/idlib/LangDict.cpp
similarity index 100%
rename from neo/idlib/LangDict.cpp
rename to neo/engine/idlib/LangDict.cpp
diff --git a/neo/idlib/LangDict.h b/neo/engine/idlib/LangDict.h
similarity index 100%
rename from neo/idlib/LangDict.h
rename to neo/engine/idlib/LangDict.h
diff --git a/neo/idlib/Lexer.cpp b/neo/engine/idlib/Lexer.cpp
similarity index 100%
rename from neo/idlib/Lexer.cpp
rename to neo/engine/idlib/Lexer.cpp
diff --git a/neo/idlib/Lexer.h b/neo/engine/idlib/Lexer.h
similarity index 100%
rename from neo/idlib/Lexer.h
rename to neo/engine/idlib/Lexer.h
diff --git a/neo/idlib/Lib.cpp b/neo/engine/idlib/Lib.cpp
similarity index 100%
rename from neo/idlib/Lib.cpp
rename to neo/engine/idlib/Lib.cpp
diff --git a/neo/idlib/Lib.h b/neo/engine/idlib/Lib.h
similarity index 100%
rename from neo/idlib/Lib.h
rename to neo/engine/idlib/Lib.h
diff --git a/neo/idlib/MapFile.cpp b/neo/engine/idlib/MapFile.cpp
similarity index 100%
rename from neo/idlib/MapFile.cpp
rename to neo/engine/idlib/MapFile.cpp
diff --git a/neo/idlib/MapFile.h b/neo/engine/idlib/MapFile.h
similarity index 100%
rename from neo/idlib/MapFile.h
rename to neo/engine/idlib/MapFile.h
diff --git a/neo/idlib/Parser.cpp b/neo/engine/idlib/Parser.cpp
similarity index 100%
rename from neo/idlib/Parser.cpp
rename to neo/engine/idlib/Parser.cpp
diff --git a/neo/idlib/Parser.h b/neo/engine/idlib/Parser.h
similarity index 100%
rename from neo/idlib/Parser.h
rename to neo/engine/idlib/Parser.h
diff --git a/neo/idlib/Rectangle.h b/neo/engine/idlib/Rectangle.h
similarity index 100%
rename from neo/idlib/Rectangle.h
rename to neo/engine/idlib/Rectangle.h
diff --git a/neo/idlib/Str.cpp b/neo/engine/idlib/Str.cpp
similarity index 100%
rename from neo/idlib/Str.cpp
rename to neo/engine/idlib/Str.cpp
diff --git a/neo/idlib/Str.h b/neo/engine/idlib/Str.h
similarity index 100%
rename from neo/idlib/Str.h
rename to neo/engine/idlib/Str.h
diff --git a/neo/idlib/Timer.cpp b/neo/engine/idlib/Timer.cpp
similarity index 100%
rename from neo/idlib/Timer.cpp
rename to neo/engine/idlib/Timer.cpp
diff --git a/neo/idlib/Timer.h b/neo/engine/idlib/Timer.h
similarity index 100%
rename from neo/idlib/Timer.h
rename to neo/engine/idlib/Timer.h
diff --git a/neo/idlib/Token.cpp b/neo/engine/idlib/Token.cpp
similarity index 100%
rename from neo/idlib/Token.cpp
rename to neo/engine/idlib/Token.cpp
diff --git a/neo/idlib/Token.h b/neo/engine/idlib/Token.h
similarity index 100%
rename from neo/idlib/Token.h
rename to neo/engine/idlib/Token.h
diff --git a/neo/idlib/bv/Bounds.cpp b/neo/engine/idlib/bv/Bounds.cpp
similarity index 100%
rename from neo/idlib/bv/Bounds.cpp
rename to neo/engine/idlib/bv/Bounds.cpp
diff --git a/neo/idlib/bv/Bounds.h b/neo/engine/idlib/bv/Bounds.h
similarity index 100%
rename from neo/idlib/bv/Bounds.h
rename to neo/engine/idlib/bv/Bounds.h
diff --git a/neo/idlib/bv/Box.cpp b/neo/engine/idlib/bv/Box.cpp
similarity index 100%
rename from neo/idlib/bv/Box.cpp
rename to neo/engine/idlib/bv/Box.cpp
diff --git a/neo/idlib/bv/Box.h b/neo/engine/idlib/bv/Box.h
similarity index 100%
rename from neo/idlib/bv/Box.h
rename to neo/engine/idlib/bv/Box.h
diff --git a/neo/idlib/bv/Frustum.cpp b/neo/engine/idlib/bv/Frustum.cpp
similarity index 100%
rename from neo/idlib/bv/Frustum.cpp
rename to neo/engine/idlib/bv/Frustum.cpp
diff --git a/neo/idlib/bv/Frustum.h b/neo/engine/idlib/bv/Frustum.h
similarity index 100%
rename from neo/idlib/bv/Frustum.h
rename to neo/engine/idlib/bv/Frustum.h
diff --git a/neo/idlib/bv/Frustum_gcc.cpp b/neo/engine/idlib/bv/Frustum_gcc.cpp
similarity index 100%
rename from neo/idlib/bv/Frustum_gcc.cpp
rename to neo/engine/idlib/bv/Frustum_gcc.cpp
diff --git a/neo/idlib/bv/Sphere.cpp b/neo/engine/idlib/bv/Sphere.cpp
similarity index 100%
rename from neo/idlib/bv/Sphere.cpp
rename to neo/engine/idlib/bv/Sphere.cpp
diff --git a/neo/idlib/bv/Sphere.h b/neo/engine/idlib/bv/Sphere.h
similarity index 100%
rename from neo/idlib/bv/Sphere.h
rename to neo/engine/idlib/bv/Sphere.h
diff --git a/neo/idlib/containers/BTree.h b/neo/engine/idlib/containers/BTree.h
similarity index 100%
rename from neo/idlib/containers/BTree.h
rename to neo/engine/idlib/containers/BTree.h
diff --git a/neo/idlib/containers/BinSearch.h b/neo/engine/idlib/containers/BinSearch.h
similarity index 100%
rename from neo/idlib/containers/BinSearch.h
rename to neo/engine/idlib/containers/BinSearch.h
diff --git a/neo/idlib/containers/HashIndex.cpp b/neo/engine/idlib/containers/HashIndex.cpp
similarity index 100%
rename from neo/idlib/containers/HashIndex.cpp
rename to neo/engine/idlib/containers/HashIndex.cpp
diff --git a/neo/idlib/containers/HashIndex.h b/neo/engine/idlib/containers/HashIndex.h
similarity index 100%
rename from neo/idlib/containers/HashIndex.h
rename to neo/engine/idlib/containers/HashIndex.h
diff --git a/neo/idlib/containers/HashTable.h b/neo/engine/idlib/containers/HashTable.h
similarity index 100%
rename from neo/idlib/containers/HashTable.h
rename to neo/engine/idlib/containers/HashTable.h
diff --git a/neo/idlib/containers/Hierarchy.h b/neo/engine/idlib/containers/Hierarchy.h
similarity index 100%
rename from neo/idlib/containers/Hierarchy.h
rename to neo/engine/idlib/containers/Hierarchy.h
diff --git a/neo/idlib/containers/LinkList.h b/neo/engine/idlib/containers/LinkList.h
similarity index 100%
rename from neo/idlib/containers/LinkList.h
rename to neo/engine/idlib/containers/LinkList.h
diff --git a/neo/idlib/containers/List.h b/neo/engine/idlib/containers/List.h
similarity index 100%
rename from neo/idlib/containers/List.h
rename to neo/engine/idlib/containers/List.h
diff --git a/neo/idlib/containers/PlaneSet.h b/neo/engine/idlib/containers/PlaneSet.h
similarity index 100%
rename from neo/idlib/containers/PlaneSet.h
rename to neo/engine/idlib/containers/PlaneSet.h
diff --git a/neo/idlib/containers/Queue.h b/neo/engine/idlib/containers/Queue.h
similarity index 100%
rename from neo/idlib/containers/Queue.h
rename to neo/engine/idlib/containers/Queue.h
diff --git a/neo/idlib/containers/Stack.h b/neo/engine/idlib/containers/Stack.h
similarity index 100%
rename from neo/idlib/containers/Stack.h
rename to neo/engine/idlib/containers/Stack.h
diff --git a/neo/idlib/containers/StaticList.h b/neo/engine/idlib/containers/StaticList.h
similarity index 100%
rename from neo/idlib/containers/StaticList.h
rename to neo/engine/idlib/containers/StaticList.h
diff --git a/neo/idlib/containers/StrList.h b/neo/engine/idlib/containers/StrList.h
similarity index 100%
rename from neo/idlib/containers/StrList.h
rename to neo/engine/idlib/containers/StrList.h
diff --git a/neo/idlib/containers/StrPool.h b/neo/engine/idlib/containers/StrPool.h
similarity index 100%
rename from neo/idlib/containers/StrPool.h
rename to neo/engine/idlib/containers/StrPool.h
diff --git a/neo/idlib/containers/VectorSet.h b/neo/engine/idlib/containers/VectorSet.h
similarity index 100%
rename from neo/idlib/containers/VectorSet.h
rename to neo/engine/idlib/containers/VectorSet.h
diff --git a/neo/idlib/geometry/DrawVert.cpp b/neo/engine/idlib/geometry/DrawVert.cpp
similarity index 100%
rename from neo/idlib/geometry/DrawVert.cpp
rename to neo/engine/idlib/geometry/DrawVert.cpp
diff --git a/neo/idlib/geometry/DrawVert.h b/neo/engine/idlib/geometry/DrawVert.h
similarity index 100%
rename from neo/idlib/geometry/DrawVert.h
rename to neo/engine/idlib/geometry/DrawVert.h
diff --git a/neo/idlib/geometry/JointTransform.cpp b/neo/engine/idlib/geometry/JointTransform.cpp
similarity index 100%
rename from neo/idlib/geometry/JointTransform.cpp
rename to neo/engine/idlib/geometry/JointTransform.cpp
diff --git a/neo/idlib/geometry/JointTransform.h b/neo/engine/idlib/geometry/JointTransform.h
similarity index 100%
rename from neo/idlib/geometry/JointTransform.h
rename to neo/engine/idlib/geometry/JointTransform.h
diff --git a/neo/idlib/geometry/Surface.cpp b/neo/engine/idlib/geometry/Surface.cpp
similarity index 100%
rename from neo/idlib/geometry/Surface.cpp
rename to neo/engine/idlib/geometry/Surface.cpp
diff --git a/neo/idlib/geometry/Surface.h b/neo/engine/idlib/geometry/Surface.h
similarity index 100%
rename from neo/idlib/geometry/Surface.h
rename to neo/engine/idlib/geometry/Surface.h
diff --git a/neo/idlib/geometry/Surface_Patch.cpp b/neo/engine/idlib/geometry/Surface_Patch.cpp
similarity index 100%
rename from neo/idlib/geometry/Surface_Patch.cpp
rename to neo/engine/idlib/geometry/Surface_Patch.cpp
diff --git a/neo/idlib/geometry/Surface_Patch.h b/neo/engine/idlib/geometry/Surface_Patch.h
similarity index 100%
rename from neo/idlib/geometry/Surface_Patch.h
rename to neo/engine/idlib/geometry/Surface_Patch.h
diff --git a/neo/idlib/geometry/Surface_Polytope.cpp b/neo/engine/idlib/geometry/Surface_Polytope.cpp
similarity index 100%
rename from neo/idlib/geometry/Surface_Polytope.cpp
rename to neo/engine/idlib/geometry/Surface_Polytope.cpp
diff --git a/neo/idlib/geometry/Surface_Polytope.h b/neo/engine/idlib/geometry/Surface_Polytope.h
similarity index 100%
rename from neo/idlib/geometry/Surface_Polytope.h
rename to neo/engine/idlib/geometry/Surface_Polytope.h
diff --git a/neo/idlib/geometry/Surface_SweptSpline.cpp b/neo/engine/idlib/geometry/Surface_SweptSpline.cpp
similarity index 100%
rename from neo/idlib/geometry/Surface_SweptSpline.cpp
rename to neo/engine/idlib/geometry/Surface_SweptSpline.cpp
diff --git a/neo/idlib/geometry/Surface_SweptSpline.h b/neo/engine/idlib/geometry/Surface_SweptSpline.h
similarity index 100%
rename from neo/idlib/geometry/Surface_SweptSpline.h
rename to neo/engine/idlib/geometry/Surface_SweptSpline.h
diff --git a/neo/idlib/geometry/TraceModel.cpp b/neo/engine/idlib/geometry/TraceModel.cpp
similarity index 100%
rename from neo/idlib/geometry/TraceModel.cpp
rename to neo/engine/idlib/geometry/TraceModel.cpp
diff --git a/neo/idlib/geometry/TraceModel.h b/neo/engine/idlib/geometry/TraceModel.h
similarity index 100%
rename from neo/idlib/geometry/TraceModel.h
rename to neo/engine/idlib/geometry/TraceModel.h
diff --git a/neo/idlib/geometry/Winding.cpp b/neo/engine/idlib/geometry/Winding.cpp
similarity index 100%
rename from neo/idlib/geometry/Winding.cpp
rename to neo/engine/idlib/geometry/Winding.cpp
diff --git a/neo/idlib/geometry/Winding.h b/neo/engine/idlib/geometry/Winding.h
similarity index 100%
rename from neo/idlib/geometry/Winding.h
rename to neo/engine/idlib/geometry/Winding.h
diff --git a/neo/idlib/geometry/Winding2D.cpp b/neo/engine/idlib/geometry/Winding2D.cpp
similarity index 100%
rename from neo/idlib/geometry/Winding2D.cpp
rename to neo/engine/idlib/geometry/Winding2D.cpp
diff --git a/neo/idlib/geometry/Winding2D.h b/neo/engine/idlib/geometry/Winding2D.h
similarity index 100%
rename from neo/idlib/geometry/Winding2D.h
rename to neo/engine/idlib/geometry/Winding2D.h
diff --git a/neo/idlib/hashing/CRC32.cpp b/neo/engine/idlib/hashing/CRC32.cpp
similarity index 100%
rename from neo/idlib/hashing/CRC32.cpp
rename to neo/engine/idlib/hashing/CRC32.cpp
diff --git a/neo/idlib/hashing/CRC32.h b/neo/engine/idlib/hashing/CRC32.h
similarity index 100%
rename from neo/idlib/hashing/CRC32.h
rename to neo/engine/idlib/hashing/CRC32.h
diff --git a/neo/idlib/hashing/MD4.cpp b/neo/engine/idlib/hashing/MD4.cpp
similarity index 100%
rename from neo/idlib/hashing/MD4.cpp
rename to neo/engine/idlib/hashing/MD4.cpp
diff --git a/neo/idlib/hashing/MD4.h b/neo/engine/idlib/hashing/MD4.h
similarity index 100%
rename from neo/idlib/hashing/MD4.h
rename to neo/engine/idlib/hashing/MD4.h
diff --git a/neo/idlib/hashing/MD5.cpp b/neo/engine/idlib/hashing/MD5.cpp
similarity index 100%
rename from neo/idlib/hashing/MD5.cpp
rename to neo/engine/idlib/hashing/MD5.cpp
diff --git a/neo/idlib/hashing/MD5.h b/neo/engine/idlib/hashing/MD5.h
similarity index 100%
rename from neo/idlib/hashing/MD5.h
rename to neo/engine/idlib/hashing/MD5.h
diff --git a/neo/idlib/math/Angles.cpp b/neo/engine/idlib/math/Angles.cpp
similarity index 100%
rename from neo/idlib/math/Angles.cpp
rename to neo/engine/idlib/math/Angles.cpp
diff --git a/neo/idlib/math/Angles.h b/neo/engine/idlib/math/Angles.h
similarity index 100%
rename from neo/idlib/math/Angles.h
rename to neo/engine/idlib/math/Angles.h
diff --git a/neo/idlib/math/Complex.cpp b/neo/engine/idlib/math/Complex.cpp
similarity index 100%
rename from neo/idlib/math/Complex.cpp
rename to neo/engine/idlib/math/Complex.cpp
diff --git a/neo/idlib/math/Complex.h b/neo/engine/idlib/math/Complex.h
similarity index 100%
rename from neo/idlib/math/Complex.h
rename to neo/engine/idlib/math/Complex.h
diff --git a/neo/idlib/math/Curve.h b/neo/engine/idlib/math/Curve.h
similarity index 100%
rename from neo/idlib/math/Curve.h
rename to neo/engine/idlib/math/Curve.h
diff --git a/neo/idlib/math/Extrapolate.h b/neo/engine/idlib/math/Extrapolate.h
similarity index 100%
rename from neo/idlib/math/Extrapolate.h
rename to neo/engine/idlib/math/Extrapolate.h
diff --git a/neo/idlib/math/Interpolate.h b/neo/engine/idlib/math/Interpolate.h
similarity index 100%
rename from neo/idlib/math/Interpolate.h
rename to neo/engine/idlib/math/Interpolate.h
diff --git a/neo/idlib/math/Lcp.cpp b/neo/engine/idlib/math/Lcp.cpp
similarity index 100%
rename from neo/idlib/math/Lcp.cpp
rename to neo/engine/idlib/math/Lcp.cpp
diff --git a/neo/idlib/math/Lcp.h b/neo/engine/idlib/math/Lcp.h
similarity index 100%
rename from neo/idlib/math/Lcp.h
rename to neo/engine/idlib/math/Lcp.h
diff --git a/neo/idlib/math/Math.cpp b/neo/engine/idlib/math/Math.cpp
similarity index 100%
rename from neo/idlib/math/Math.cpp
rename to neo/engine/idlib/math/Math.cpp
diff --git a/neo/idlib/math/Math.h b/neo/engine/idlib/math/Math.h
similarity index 100%
rename from neo/idlib/math/Math.h
rename to neo/engine/idlib/math/Math.h
diff --git a/neo/idlib/math/Matrix.cpp b/neo/engine/idlib/math/Matrix.cpp
similarity index 100%
rename from neo/idlib/math/Matrix.cpp
rename to neo/engine/idlib/math/Matrix.cpp
diff --git a/neo/idlib/math/Matrix.h b/neo/engine/idlib/math/Matrix.h
similarity index 100%
rename from neo/idlib/math/Matrix.h
rename to neo/engine/idlib/math/Matrix.h
diff --git a/neo/idlib/math/Ode.cpp b/neo/engine/idlib/math/Ode.cpp
similarity index 100%
rename from neo/idlib/math/Ode.cpp
rename to neo/engine/idlib/math/Ode.cpp
diff --git a/neo/idlib/math/Ode.h b/neo/engine/idlib/math/Ode.h
similarity index 100%
rename from neo/idlib/math/Ode.h
rename to neo/engine/idlib/math/Ode.h
diff --git a/neo/idlib/math/Plane.cpp b/neo/engine/idlib/math/Plane.cpp
similarity index 100%
rename from neo/idlib/math/Plane.cpp
rename to neo/engine/idlib/math/Plane.cpp
diff --git a/neo/idlib/math/Plane.h b/neo/engine/idlib/math/Plane.h
similarity index 100%
rename from neo/idlib/math/Plane.h
rename to neo/engine/idlib/math/Plane.h
diff --git a/neo/idlib/math/Pluecker.cpp b/neo/engine/idlib/math/Pluecker.cpp
similarity index 100%
rename from neo/idlib/math/Pluecker.cpp
rename to neo/engine/idlib/math/Pluecker.cpp
diff --git a/neo/idlib/math/Pluecker.h b/neo/engine/idlib/math/Pluecker.h
similarity index 100%
rename from neo/idlib/math/Pluecker.h
rename to neo/engine/idlib/math/Pluecker.h
diff --git a/neo/idlib/math/Polynomial.cpp b/neo/engine/idlib/math/Polynomial.cpp
similarity index 100%
rename from neo/idlib/math/Polynomial.cpp
rename to neo/engine/idlib/math/Polynomial.cpp
diff --git a/neo/idlib/math/Polynomial.h b/neo/engine/idlib/math/Polynomial.h
similarity index 100%
rename from neo/idlib/math/Polynomial.h
rename to neo/engine/idlib/math/Polynomial.h
diff --git a/neo/idlib/math/Quat.cpp b/neo/engine/idlib/math/Quat.cpp
similarity index 100%
rename from neo/idlib/math/Quat.cpp
rename to neo/engine/idlib/math/Quat.cpp
diff --git a/neo/idlib/math/Quat.h b/neo/engine/idlib/math/Quat.h
similarity index 100%
rename from neo/idlib/math/Quat.h
rename to neo/engine/idlib/math/Quat.h
diff --git a/neo/idlib/math/Random.h b/neo/engine/idlib/math/Random.h
similarity index 100%
rename from neo/idlib/math/Random.h
rename to neo/engine/idlib/math/Random.h
diff --git a/neo/idlib/math/Rotation.cpp b/neo/engine/idlib/math/Rotation.cpp
similarity index 100%
rename from neo/idlib/math/Rotation.cpp
rename to neo/engine/idlib/math/Rotation.cpp
diff --git a/neo/idlib/math/Rotation.h b/neo/engine/idlib/math/Rotation.h
similarity index 100%
rename from neo/idlib/math/Rotation.h
rename to neo/engine/idlib/math/Rotation.h
diff --git a/neo/idlib/math/Simd.cpp b/neo/engine/idlib/math/Simd.cpp
similarity index 100%
rename from neo/idlib/math/Simd.cpp
rename to neo/engine/idlib/math/Simd.cpp
diff --git a/neo/idlib/math/Simd.h b/neo/engine/idlib/math/Simd.h
similarity index 100%
rename from neo/idlib/math/Simd.h
rename to neo/engine/idlib/math/Simd.h
diff --git a/neo/idlib/math/Simd_Generic.cpp b/neo/engine/idlib/math/Simd_Generic.cpp
similarity index 100%
rename from neo/idlib/math/Simd_Generic.cpp
rename to neo/engine/idlib/math/Simd_Generic.cpp
diff --git a/neo/idlib/math/Simd_Generic.h b/neo/engine/idlib/math/Simd_Generic.h
similarity index 100%
rename from neo/idlib/math/Simd_Generic.h
rename to neo/engine/idlib/math/Simd_Generic.h
diff --git a/neo/idlib/math/Vector.cpp b/neo/engine/idlib/math/Vector.cpp
similarity index 100%
rename from neo/idlib/math/Vector.cpp
rename to neo/engine/idlib/math/Vector.cpp
diff --git a/neo/idlib/math/Vector.h b/neo/engine/idlib/math/Vector.h
similarity index 100%
rename from neo/idlib/math/Vector.h
rename to neo/engine/idlib/math/Vector.h
diff --git a/neo/idlib/precompiled.cpp b/neo/engine/idlib/precompiled.cpp
similarity index 100%
rename from neo/idlib/precompiled.cpp
rename to neo/engine/idlib/precompiled.cpp
diff --git a/neo/idlib/precompiled.h b/neo/engine/idlib/precompiled.h
similarity index 95%
rename from neo/idlib/precompiled.h
rename to neo/engine/idlib/precompiled.h
index 6fafc45b..763f042f 100644
--- a/neo/idlib/precompiled.h
+++ b/neo/engine/idlib/precompiled.h
@@ -164,7 +164,7 @@ const int MAX_EXPRESSION_REGISTERS = 4096;
// collision detection system
#if defined(PREY)
-#include "../prey/cm/CollisionModel.h"
+#include "../../prey/cm/CollisionModel.h"
#else
#include "../cm/CollisionModel.h"
#endif
@@ -175,12 +175,12 @@ const int MAX_EXPRESSION_REGISTERS = 4096;
// game
#if defined(PREY)
-#include "../prey/game/Game.h"
+#include "../../prey/game/Game.h"
#else
#if defined(_D3XP)
-#include "../d3xp/Game.h"
+#include "../../doom3/d3xp/Game.h"
#else
-#include "../game/Game.h"
+#include "../../doom3/game/Game.h"
#endif
#endif
//-----------------------------------------------------
@@ -190,12 +190,12 @@ const int MAX_EXPRESSION_REGISTERS = 4096;
#ifdef GAME_DLL
#if defined(PREY)
-#include "../prey/game/Game_local.h"
+#include "../../prey/game/Game_local.h"
#else
#if defined(_D3XP)
-#include "../d3xp/Game_local.h"
+#include "../../doom3/d3xp/Game_local.h"
#else
-#include "../game/Game_local.h"
+#include "../../doom3/game/Game_local.h"
#endif
#endif
diff --git a/neo/models/Model.cpp b/neo/engine/models/Model.cpp
similarity index 100%
rename from neo/models/Model.cpp
rename to neo/engine/models/Model.cpp
diff --git a/neo/models/Model.h b/neo/engine/models/Model.h
similarity index 100%
rename from neo/models/Model.h
rename to neo/engine/models/Model.h
diff --git a/neo/models/ModelDecal.cpp b/neo/engine/models/ModelDecal.cpp
similarity index 100%
rename from neo/models/ModelDecal.cpp
rename to neo/engine/models/ModelDecal.cpp
diff --git a/neo/models/ModelDecal.h b/neo/engine/models/ModelDecal.h
similarity index 100%
rename from neo/models/ModelDecal.h
rename to neo/engine/models/ModelDecal.h
diff --git a/neo/models/ModelManager.cpp b/neo/engine/models/ModelManager.cpp
similarity index 100%
rename from neo/models/ModelManager.cpp
rename to neo/engine/models/ModelManager.cpp
diff --git a/neo/models/ModelManager.h b/neo/engine/models/ModelManager.h
similarity index 100%
rename from neo/models/ModelManager.h
rename to neo/engine/models/ModelManager.h
diff --git a/neo/models/ModelOverlay.cpp b/neo/engine/models/ModelOverlay.cpp
similarity index 100%
rename from neo/models/ModelOverlay.cpp
rename to neo/engine/models/ModelOverlay.cpp
diff --git a/neo/models/ModelOverlay.h b/neo/engine/models/ModelOverlay.h
similarity index 100%
rename from neo/models/ModelOverlay.h
rename to neo/engine/models/ModelOverlay.h
diff --git a/neo/models/Model_ase.cpp b/neo/engine/models/Model_ase.cpp
similarity index 100%
rename from neo/models/Model_ase.cpp
rename to neo/engine/models/Model_ase.cpp
diff --git a/neo/models/Model_ase.h b/neo/engine/models/Model_ase.h
similarity index 100%
rename from neo/models/Model_ase.h
rename to neo/engine/models/Model_ase.h
diff --git a/neo/models/Model_beam.cpp b/neo/engine/models/Model_beam.cpp
similarity index 100%
rename from neo/models/Model_beam.cpp
rename to neo/engine/models/Model_beam.cpp
diff --git a/neo/models/Model_liquid.cpp b/neo/engine/models/Model_liquid.cpp
similarity index 100%
rename from neo/models/Model_liquid.cpp
rename to neo/engine/models/Model_liquid.cpp
diff --git a/neo/models/Model_local.h b/neo/engine/models/Model_local.h
similarity index 100%
rename from neo/models/Model_local.h
rename to neo/engine/models/Model_local.h
diff --git a/neo/models/Model_lwo.cpp b/neo/engine/models/Model_lwo.cpp
similarity index 100%
rename from neo/models/Model_lwo.cpp
rename to neo/engine/models/Model_lwo.cpp
diff --git a/neo/models/Model_lwo.h b/neo/engine/models/Model_lwo.h
similarity index 100%
rename from neo/models/Model_lwo.h
rename to neo/engine/models/Model_lwo.h
diff --git a/neo/models/Model_ma.cpp b/neo/engine/models/Model_ma.cpp
similarity index 100%
rename from neo/models/Model_ma.cpp
rename to neo/engine/models/Model_ma.cpp
diff --git a/neo/models/Model_ma.h b/neo/engine/models/Model_ma.h
similarity index 100%
rename from neo/models/Model_ma.h
rename to neo/engine/models/Model_ma.h
diff --git a/neo/models/Model_md3.cpp b/neo/engine/models/Model_md3.cpp
similarity index 100%
rename from neo/models/Model_md3.cpp
rename to neo/engine/models/Model_md3.cpp
diff --git a/neo/models/Model_md3.h b/neo/engine/models/Model_md3.h
similarity index 100%
rename from neo/models/Model_md3.h
rename to neo/engine/models/Model_md3.h
diff --git a/neo/models/Model_md5.cpp b/neo/engine/models/Model_md5.cpp
similarity index 100%
rename from neo/models/Model_md5.cpp
rename to neo/engine/models/Model_md5.cpp
diff --git a/neo/models/Model_prt.cpp b/neo/engine/models/Model_prt.cpp
similarity index 100%
rename from neo/models/Model_prt.cpp
rename to neo/engine/models/Model_prt.cpp
diff --git a/neo/models/Model_sprite.cpp b/neo/engine/models/Model_sprite.cpp
similarity index 100%
rename from neo/models/Model_sprite.cpp
rename to neo/engine/models/Model_sprite.cpp
diff --git a/neo/openal/docs/ChangeLog b/neo/engine/openal/docs/ChangeLog
similarity index 100%
rename from neo/openal/docs/ChangeLog
rename to neo/engine/openal/docs/ChangeLog
diff --git a/neo/openal/docs/Makefile b/neo/engine/openal/docs/Makefile
similarity index 100%
rename from neo/openal/docs/Makefile
rename to neo/engine/openal/docs/Makefile
diff --git a/neo/openal/docs/alc-context.sgml b/neo/engine/openal/docs/alc-context.sgml
similarity index 100%
rename from neo/openal/docs/alc-context.sgml
rename to neo/engine/openal/docs/alc-context.sgml
diff --git a/neo/openal/docs/api-reference.html b/neo/engine/openal/docs/api-reference.html
similarity index 100%
rename from neo/openal/docs/api-reference.html
rename to neo/engine/openal/docs/api-reference.html
diff --git a/neo/openal/docs/app-annotations.sgml b/neo/engine/openal/docs/app-annotations.sgml
similarity index 100%
rename from neo/openal/docs/app-annotations.sgml
rename to neo/engine/openal/docs/app-annotations.sgml
diff --git a/neo/openal/docs/app-constants.sgml b/neo/engine/openal/docs/app-constants.sgml
similarity index 100%
rename from neo/openal/docs/app-constants.sgml
rename to neo/engine/openal/docs/app-constants.sgml
diff --git a/neo/openal/docs/app-extensionprocess.sgml b/neo/engine/openal/docs/app-extensionprocess.sgml
similarity index 100%
rename from neo/openal/docs/app-extensionprocess.sgml
rename to neo/engine/openal/docs/app-extensionprocess.sgml
diff --git a/neo/openal/docs/app-extensions.sgml b/neo/engine/openal/docs/app-extensions.sgml
similarity index 100%
rename from neo/openal/docs/app-extensions.sgml
rename to neo/engine/openal/docs/app-extensions.sgml
diff --git a/neo/openal/docs/architecture.html b/neo/engine/openal/docs/architecture.html
similarity index 100%
rename from neo/openal/docs/architecture.html
rename to neo/engine/openal/docs/architecture.html
diff --git a/neo/openal/docs/chp-buffers.sgml b/neo/engine/openal/docs/chp-buffers.sgml
similarity index 100%
rename from neo/openal/docs/chp-buffers.sgml
rename to neo/engine/openal/docs/chp-buffers.sgml
diff --git a/neo/openal/docs/chp-introduction.sgml b/neo/engine/openal/docs/chp-introduction.sgml
similarity index 100%
rename from neo/openal/docs/chp-introduction.sgml
rename to neo/engine/openal/docs/chp-introduction.sgml
diff --git a/neo/openal/docs/chp-multichannel.sgml b/neo/engine/openal/docs/chp-multichannel.sgml
similarity index 100%
rename from neo/openal/docs/chp-multichannel.sgml
rename to neo/engine/openal/docs/chp-multichannel.sgml
diff --git a/neo/openal/docs/chp-operation.sgml b/neo/engine/openal/docs/chp-operation.sgml
similarity index 100%
rename from neo/openal/docs/chp-operation.sgml
rename to neo/engine/openal/docs/chp-operation.sgml
diff --git a/neo/openal/docs/chp-queueing.sgml b/neo/engine/openal/docs/chp-queueing.sgml
similarity index 100%
rename from neo/openal/docs/chp-queueing.sgml
rename to neo/engine/openal/docs/chp-queueing.sgml
diff --git a/neo/openal/docs/chp-rendering.sgml b/neo/engine/openal/docs/chp-rendering.sgml
similarity index 100%
rename from neo/openal/docs/chp-rendering.sgml
rename to neo/engine/openal/docs/chp-rendering.sgml
diff --git a/neo/openal/docs/chp-state.sgml b/neo/engine/openal/docs/chp-state.sgml
similarity index 100%
rename from neo/openal/docs/chp-state.sgml
rename to neo/engine/openal/docs/chp-state.sgml
diff --git a/neo/openal/docs/ent-examples.sgml b/neo/engine/openal/docs/ent-examples.sgml
similarity index 100%
rename from neo/openal/docs/ent-examples.sgml
rename to neo/engine/openal/docs/ent-examples.sgml
diff --git a/neo/openal/docs/ent-extensions.sgml b/neo/engine/openal/docs/ent-extensions.sgml
similarity index 100%
rename from neo/openal/docs/ent-extensions.sgml
rename to neo/engine/openal/docs/ent-extensions.sgml
diff --git a/neo/openal/docs/ent-marks-annotated.sgml b/neo/engine/openal/docs/ent-marks-annotated.sgml
similarity index 100%
rename from neo/openal/docs/ent-marks-annotated.sgml
rename to neo/engine/openal/docs/ent-marks-annotated.sgml
diff --git a/neo/openal/docs/ent-marks-full.sgml b/neo/engine/openal/docs/ent-marks-full.sgml
similarity index 100%
rename from neo/openal/docs/ent-marks-full.sgml
rename to neo/engine/openal/docs/ent-marks-full.sgml
diff --git a/neo/openal/docs/ent-marks-reference.sgml b/neo/engine/openal/docs/ent-marks-reference.sgml
similarity index 100%
rename from neo/openal/docs/ent-marks-reference.sgml
rename to neo/engine/openal/docs/ent-marks-reference.sgml
diff --git a/neo/openal/docs/ent-marks-specification.sgml b/neo/engine/openal/docs/ent-marks-specification.sgml
similarity index 100%
rename from neo/openal/docs/ent-marks-specification.sgml
rename to neo/engine/openal/docs/ent-marks-specification.sgml
diff --git a/neo/openal/docs/ent-names.sgml b/neo/engine/openal/docs/ent-names.sgml
similarity index 100%
rename from neo/openal/docs/ent-names.sgml
rename to neo/engine/openal/docs/ent-names.sgml
diff --git a/neo/openal/docs/index.html b/neo/engine/openal/docs/index.html
similarity index 100%
rename from neo/openal/docs/index.html
rename to neo/engine/openal/docs/index.html
diff --git a/neo/openal/docs/oalspecs.sgml b/neo/engine/openal/docs/oalspecs.sgml
similarity index 100%
rename from neo/openal/docs/oalspecs.sgml
rename to neo/engine/openal/docs/oalspecs.sgml
diff --git a/neo/openal/docs/sec-bookinfo.sgml b/neo/engine/openal/docs/sec-bookinfo.sgml
similarity index 100%
rename from neo/openal/docs/sec-bookinfo.sgml
rename to neo/engine/openal/docs/sec-bookinfo.sgml
diff --git a/neo/openal/docs/specification.html b/neo/engine/openal/docs/specification.html
similarity index 100%
rename from neo/openal/docs/specification.html
rename to neo/engine/openal/docs/specification.html
diff --git a/neo/openal/docs/white-paper.html b/neo/engine/openal/docs/white-paper.html
similarity index 100%
rename from neo/openal/docs/white-paper.html
rename to neo/engine/openal/docs/white-paper.html
diff --git a/neo/openal/idal.cpp b/neo/engine/openal/idal.cpp
similarity index 100%
rename from neo/openal/idal.cpp
rename to neo/engine/openal/idal.cpp
diff --git a/neo/openal/idal.h b/neo/engine/openal/idal.h
similarity index 100%
rename from neo/openal/idal.h
rename to neo/engine/openal/idal.h
diff --git a/neo/openal/idal.py b/neo/engine/openal/idal.py
similarity index 100%
rename from neo/openal/idal.py
rename to neo/engine/openal/idal.py
diff --git a/neo/openal/include/al.h b/neo/engine/openal/include/al.h
similarity index 100%
rename from neo/openal/include/al.h
rename to neo/engine/openal/include/al.h
diff --git a/neo/openal/include/alc.h b/neo/engine/openal/include/alc.h
similarity index 100%
rename from neo/openal/include/alc.h
rename to neo/engine/openal/include/alc.h
diff --git a/neo/openal/include/alctypes.h b/neo/engine/openal/include/alctypes.h
similarity index 100%
rename from neo/openal/include/alctypes.h
rename to neo/engine/openal/include/alctypes.h
diff --git a/neo/openal/include/altypes.h b/neo/engine/openal/include/altypes.h
similarity index 100%
rename from neo/openal/include/altypes.h
rename to neo/engine/openal/include/altypes.h
diff --git a/neo/openal/include/alu.h b/neo/engine/openal/include/alu.h
similarity index 100%
rename from neo/openal/include/alu.h
rename to neo/engine/openal/include/alu.h
diff --git a/neo/openal/include/eax2.h b/neo/engine/openal/include/eax2.h
similarity index 100%
rename from neo/openal/include/eax2.h
rename to neo/engine/openal/include/eax2.h
diff --git a/neo/openal/include/eax3.h b/neo/engine/openal/include/eax3.h
similarity index 100%
rename from neo/openal/include/eax3.h
rename to neo/engine/openal/include/eax3.h
diff --git a/neo/openal/include/eax4.h b/neo/engine/openal/include/eax4.h
similarity index 100%
rename from neo/openal/include/eax4.h
rename to neo/engine/openal/include/eax4.h
diff --git a/neo/openal/include/eax5.h b/neo/engine/openal/include/eax5.h
similarity index 100%
rename from neo/openal/include/eax5.h
rename to neo/engine/openal/include/eax5.h
diff --git a/neo/openal/include/eaxac3.h b/neo/engine/openal/include/eaxac3.h
similarity index 100%
rename from neo/openal/include/eaxac3.h
rename to neo/engine/openal/include/eaxac3.h
diff --git a/neo/openal/include/eaxman.h b/neo/engine/openal/include/eaxman.h
similarity index 100%
rename from neo/openal/include/eaxman.h
rename to neo/engine/openal/include/eaxman.h
diff --git a/neo/openal/include/efxlib.h b/neo/engine/openal/include/efxlib.h
similarity index 100%
rename from neo/openal/include/efxlib.h
rename to neo/engine/openal/include/efxlib.h
diff --git a/neo/openal/lib/eaxguid.lib b/neo/engine/openal/lib/eaxguid.lib
similarity index 100%
rename from neo/openal/lib/eaxguid.lib
rename to neo/engine/openal/lib/eaxguid.lib
diff --git a/neo/openal/lib/openal32.lib b/neo/engine/openal/lib/openal32.lib
similarity index 100%
rename from neo/openal/lib/openal32.lib
rename to neo/engine/openal/lib/openal32.lib
diff --git a/neo/openal/osx/OpenAL.framework/Headers b/neo/engine/openal/osx/OpenAL.framework/Headers
similarity index 100%
rename from neo/openal/osx/OpenAL.framework/Headers
rename to neo/engine/openal/osx/OpenAL.framework/Headers
diff --git a/neo/openal/osx/OpenAL.framework/OpenAL b/neo/engine/openal/osx/OpenAL.framework/OpenAL
similarity index 100%
rename from neo/openal/osx/OpenAL.framework/OpenAL
rename to neo/engine/openal/osx/OpenAL.framework/OpenAL
diff --git a/neo/openal/osx/OpenAL.framework/Resources b/neo/engine/openal/osx/OpenAL.framework/Resources
similarity index 100%
rename from neo/openal/osx/OpenAL.framework/Resources
rename to neo/engine/openal/osx/OpenAL.framework/Resources
diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Headers/al.h b/neo/engine/openal/osx/OpenAL.framework/Versions/A/Headers/al.h
similarity index 100%
rename from neo/openal/osx/OpenAL.framework/Versions/A/Headers/al.h
rename to neo/engine/openal/osx/OpenAL.framework/Versions/A/Headers/al.h
diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Headers/alc.h b/neo/engine/openal/osx/OpenAL.framework/Versions/A/Headers/alc.h
similarity index 100%
rename from neo/openal/osx/OpenAL.framework/Versions/A/Headers/alc.h
rename to neo/engine/openal/osx/OpenAL.framework/Versions/A/Headers/alc.h
diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Headers/alctypes.h b/neo/engine/openal/osx/OpenAL.framework/Versions/A/Headers/alctypes.h
similarity index 100%
rename from neo/openal/osx/OpenAL.framework/Versions/A/Headers/alctypes.h
rename to neo/engine/openal/osx/OpenAL.framework/Versions/A/Headers/alctypes.h
diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Headers/altypes.h b/neo/engine/openal/osx/OpenAL.framework/Versions/A/Headers/altypes.h
similarity index 100%
rename from neo/openal/osx/OpenAL.framework/Versions/A/Headers/altypes.h
rename to neo/engine/openal/osx/OpenAL.framework/Versions/A/Headers/altypes.h
diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Headers/alut.h b/neo/engine/openal/osx/OpenAL.framework/Versions/A/Headers/alut.h
similarity index 100%
rename from neo/openal/osx/OpenAL.framework/Versions/A/Headers/alut.h
rename to neo/engine/openal/osx/OpenAL.framework/Versions/A/Headers/alut.h
diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/OpenAL b/neo/engine/openal/osx/OpenAL.framework/Versions/A/OpenAL
similarity index 100%
rename from neo/openal/osx/OpenAL.framework/Versions/A/OpenAL
rename to neo/engine/openal/osx/OpenAL.framework/Versions/A/OpenAL
diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Resources/English.lproj/InfoPlist.strings b/neo/engine/openal/osx/OpenAL.framework/Versions/A/Resources/English.lproj/InfoPlist.strings
similarity index 100%
rename from neo/openal/osx/OpenAL.framework/Versions/A/Resources/English.lproj/InfoPlist.strings
rename to neo/engine/openal/osx/OpenAL.framework/Versions/A/Resources/English.lproj/InfoPlist.strings
diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Resources/Info.plist b/neo/engine/openal/osx/OpenAL.framework/Versions/A/Resources/Info.plist
similarity index 100%
rename from neo/openal/osx/OpenAL.framework/Versions/A/Resources/Info.plist
rename to neo/engine/openal/osx/OpenAL.framework/Versions/A/Resources/Info.plist
diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Resources/READ_ME b/neo/engine/openal/osx/OpenAL.framework/Versions/A/Resources/READ_ME
similarity index 100%
rename from neo/openal/osx/OpenAL.framework/Versions/A/Resources/READ_ME
rename to neo/engine/openal/osx/OpenAL.framework/Versions/A/Resources/READ_ME
diff --git a/neo/openal/osx/OpenAL.framework/Versions/A/Resources/pbdevelopment.plist b/neo/engine/openal/osx/OpenAL.framework/Versions/A/Resources/pbdevelopment.plist
similarity index 100%
rename from neo/openal/osx/OpenAL.framework/Versions/A/Resources/pbdevelopment.plist
rename to neo/engine/openal/osx/OpenAL.framework/Versions/A/Resources/pbdevelopment.plist
diff --git a/neo/openal/osx/OpenAL.framework/Versions/Current b/neo/engine/openal/osx/OpenAL.framework/Versions/Current
similarity index 100%
rename from neo/openal/osx/OpenAL.framework/Versions/Current
rename to neo/engine/openal/osx/OpenAL.framework/Versions/Current
diff --git a/neo/openal/stubs.cpp b/neo/engine/openal/stubs.cpp
similarity index 100%
rename from neo/openal/stubs.cpp
rename to neo/engine/openal/stubs.cpp
diff --git a/neo/engine/opengl/Debug/gl_d3d12shim.obj b/neo/engine/opengl/Debug/gl_d3d12shim.obj
new file mode 100644
index 00000000..261b2ff8
Binary files /dev/null and b/neo/engine/opengl/Debug/gl_d3d12shim.obj differ
diff --git a/neo/engine/opengl/Debug/gl_d3d12wgl.obj b/neo/engine/opengl/Debug/gl_d3d12wgl.obj
new file mode 100644
index 00000000..e8dfa7fd
Binary files /dev/null and b/neo/engine/opengl/Debug/gl_d3d12wgl.obj differ
diff --git a/neo/engine/opengl/Debug/opengl.lib.recipe b/neo/engine/opengl/Debug/opengl.lib.recipe
new file mode 100644
index 00000000..a53f9611
--- /dev/null
+++ b/neo/engine/opengl/Debug/opengl.lib.recipe
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/neo/engine/opengl/Debug/opengl.log b/neo/engine/opengl/Debug/opengl.log
new file mode 100644
index 00000000..6bc94728
--- /dev/null
+++ b/neo/engine/opengl/Debug/opengl.log
@@ -0,0 +1,315 @@
+C:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Microsoft\VC\v180\Microsoft.CppBuild.targets(1143,5): warning MSB4211: The property "GetTargetPathDependsOn" is being set to a value for the first time, but it was already consumed at "C:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets (2257,5)".
+ gl_d3d12shim.cpp
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(931,26): warning C4273: 'glSelectTextureSGIS': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(659,29):
+ see previous definition of 'glSelectTextureSGIS'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(941,26): warning C4273: 'glMTexCoord2fSGIS': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(660,29):
+ see previous definition of 'glMTexCoord2fSGIS'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(958,26): warning C4273: 'glActiveTextureARB': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(656,29):
+ see previous definition of 'glActiveTextureARB'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(966,26): warning C4273: 'glMultiTexCoord2fARB': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(658,29):
+ see previous definition of 'glMultiTexCoord2fARB'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2664,36): warning C4273: 'glGetString': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(585,39):
+ see previous definition of 'glGetString'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2676,26): warning C4273: 'glClearColor': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(586,29):
+ see previous definition of 'glClearColor'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2684,26): warning C4273: 'glClear': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(587,29):
+ see previous definition of 'glClear'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2691,26): warning C4273: 'glViewport': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(588,29):
+ see previous definition of 'glViewport'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2700,26): warning C4273: 'glEnable': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(592,29):
+ see previous definition of 'glEnable'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2714,26): warning C4273: 'glDisable': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(593,29):
+ see previous definition of 'glDisable'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2728,26): warning C4273: 'glBlendFunc': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(594,29):
+ see previous definition of 'glBlendFunc'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2734,26): warning C4273: 'glAlphaFunc': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(595,29):
+ see previous definition of 'glAlphaFunc'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2740,26): warning C4273: 'glDepthMask': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(596,29):
+ see previous definition of 'glDepthMask'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2745,26): warning C4273: 'glDepthRange': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(597,29):
+ see previous definition of 'glDepthRange'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2752,26): warning C4273: 'glCullFace': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(599,29):
+ see previous definition of 'glCullFace'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2757,26): warning C4273: 'glPolygonMode': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(600,29):
+ see previous definition of 'glPolygonMode'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2761,26): warning C4273: 'glShadeModel': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(601,29):
+ see previous definition of 'glShadeModel'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2766,26): warning C4273: 'glHint': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(602,29):
+ see previous definition of 'glHint'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2772,26): warning C4273: 'glFinish': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(603,29):
+ see previous definition of 'glFinish'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2777,26): warning C4273: 'glMatrixMode': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(607,29):
+ see previous definition of 'glMatrixMode'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2782,26): warning C4273: 'glLoadIdentity': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(608,29):
+ see previous definition of 'glLoadIdentity'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2787,26): warning C4273: 'glPushMatrix': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(609,29):
+ see previous definition of 'glPushMatrix'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2793,26): warning C4273: 'glPopMatrix': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(610,29):
+ see previous definition of 'glPopMatrix'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2800,26): warning C4273: 'glTranslatef': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(611,29):
+ see previous definition of 'glTranslatef'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2806,26): warning C4273: 'glRotatef': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(612,29):
+ see previous definition of 'glRotatef'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2812,26): warning C4273: 'glScalef': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(613,29):
+ see previous definition of 'glScalef'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2818,26): warning C4273: 'glOrtho': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(614,29):
+ see previous definition of 'glOrtho'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2824,26): warning C4273: 'glBegin': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(616,29):
+ see previous definition of 'glBegin'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2832,26): warning C4273: 'glEnd': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(617,29):
+ see previous definition of 'glEnd'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2840,26): warning C4273: 'glVertex2f': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(618,29):
+ see previous definition of 'glVertex2f'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2845,26): warning C4273: 'glVertex3f': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(619,29):
+ see previous definition of 'glVertex3f'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2864,26): warning C4273: 'glVertex3fv': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(620,29):
+ see previous definition of 'glVertex3fv'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2869,26): warning C4273: 'glTexCoord2f': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(621,29):
+ see previous definition of 'glTexCoord2f'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2875,26): warning C4273: 'glColor3f': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(623,29):
+ see previous definition of 'glColor3f'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2883,26): warning C4273: 'glColor4f': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(624,29):
+ see previous definition of 'glColor4f'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2891,26): warning C4273: 'glGenTextures': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(627,29):
+ see previous definition of 'glGenTextures'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2909,26): warning C4273: 'glDeleteTextures': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(628,29):
+ see previous definition of 'glDeleteTextures'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2931,26): warning C4273: 'glBindTexture': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(629,29):
+ see previous definition of 'glBindTexture'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2953,26): warning C4273: 'glLoadMatrixf': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(579,29):
+ see previous definition of 'glLoadMatrixf'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(2962,26): warning C4273: 'glGetIntegerv': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(581,29):
+ see previous definition of 'glGetIntegerv'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3000,26): warning C4273: 'glGetFloatv': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(580,29):
+ see previous definition of 'glGetFloatv'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3032,26): warning C4273: 'glFrustum': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(582,29):
+ see previous definition of 'glFrustum'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3090,26): warning C4273: 'glDepthFunc': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(583,29):
+ see previous definition of 'glDepthFunc'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3095,26): warning C4273: 'glColor4fv': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(584,29):
+ see previous definition of 'glColor4fv'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3106,26): warning C4273: 'glTexParameterf': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(630,29):
+ see previous definition of 'glTexParameterf'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3139,26): warning C4273: 'glTexEnvf': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(632,29):
+ see previous definition of 'glTexEnvf'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3168,26): warning C4273: 'glTexImage2D': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(633,29):
+ see previous definition of 'glTexImage2D'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3192,26): warning C4273: 'glTexSubImage2D': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(635,29):
+ see previous definition of 'glTexSubImage2D'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3218,26): warning C4273: 'glReadPixels': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(637,29):
+ see previous definition of 'glReadPixels'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3225,26): warning C4273: 'glDrawBuffer': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(639,29):
+ see previous definition of 'glDrawBuffer'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3230,26): warning C4273: 'glReadBuffer': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(640,29):
+ see previous definition of 'glReadBuffer'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3273,28): warning C4273: 'glGetError': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(590,31):
+ see previous definition of 'glGetError'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3279,26): warning C4273: 'glScissor': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(589,29):
+ see previous definition of 'glScissor'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3286,26): warning C4273: 'glClearDepth': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(598,29):
+ see previous definition of 'glClearDepth'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3290,26): warning C4273: 'glClipPlane': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(604,29):
+ see previous definition of 'glClipPlane'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3296,26): warning C4273: 'glPolygonOffset': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(605,29):
+ see previous definition of 'glPolygonOffset'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3301,26): warning C4273: 'glTexCoord2fv': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(622,29):
+ see previous definition of 'glTexCoord2fv'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3306,26): warning C4273: 'glColor4ubv': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(625,29):
+ see previous definition of 'glColor4ubv'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3314,26): warning C4273: 'glTexParameterfv': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(631,29):
+ see previous definition of 'glTexParameterfv'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3319,26): warning C4273: 'glStencilMask': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(650,29):
+ see previous definition of 'glStencilMask'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3323,26): warning C4273: 'glClearStencil': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(651,29):
+ see previous definition of 'glClearStencil'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3327,26): warning C4273: 'glStencilFunc': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(652,29):
+ see previous definition of 'glStencilFunc'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3333,26): warning C4273: 'glStencilOp': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(653,29):
+ see previous definition of 'glStencilOp'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3339,26): warning C4273: 'glColorMask': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(654,29):
+ see previous definition of 'glColorMask'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3346,26): warning C4273: 'glClientActiveTextureARB': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(657,29):
+ see previous definition of 'glClientActiveTextureARB'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3353,26): warning C4273: 'glLockArraysEXT': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(661,29):
+ see previous definition of 'glLockArraysEXT'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3358,26): warning C4273: 'glUnlockArraysEXT': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(662,29):
+ see previous definition of 'glUnlockArraysEXT'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3361,26): warning C4273: 'glEnableClientState': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(642,29):
+ see previous definition of 'glEnableClientState'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3370,26): warning C4273: 'glDisableClientState': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(643,29):
+ see previous definition of 'glDisableClientState'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3379,26): warning C4273: 'glVertexPointer': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(644,29):
+ see previous definition of 'glVertexPointer'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3386,26): warning C4273: 'glColorPointer': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(645,29):
+ see previous definition of 'glColorPointer'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3393,26): warning C4273: 'glTexCoordPointer': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(646,29):
+ see previous definition of 'glTexCoordPointer'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3401,26): warning C4273: 'glArrayElement': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(647,29):
+ see previous definition of 'glArrayElement'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3407,26): warning C4273: 'glDrawElements': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(648,29):
+ see previous definition of 'glDrawElements'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3470,26): warning C4273: 'glFogf': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(667,29):
+ see previous definition of 'glFogf'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3492,26): warning C4273: 'glFogi': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(666,29):
+ see previous definition of 'glFogi'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3497,26): warning C4273: 'glFogfv': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(665,29):
+ see previous definition of 'glFogfv'
+
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp(3528,26): warning C4273: 'glFogiv': inconsistent dll linkage
+ D:\projects\Wolf\src\opengl\opengl.h(664,29):
+ see previous definition of 'glFogiv'
+
+ opengl.vcxproj -> D:\projects\Wolf\src\Debug\opengl.lib
diff --git a/neo/engine/opengl/Debug/opengl.tlog/CL.command.1.tlog b/neo/engine/opengl/Debug/opengl.tlog/CL.command.1.tlog
new file mode 100644
index 00000000..ccb36cca
Binary files /dev/null and b/neo/engine/opengl/Debug/opengl.tlog/CL.command.1.tlog differ
diff --git a/neo/engine/opengl/Debug/opengl.tlog/CL.read.1.tlog b/neo/engine/opengl/Debug/opengl.tlog/CL.read.1.tlog
new file mode 100644
index 00000000..70eb1b79
Binary files /dev/null and b/neo/engine/opengl/Debug/opengl.tlog/CL.read.1.tlog differ
diff --git a/neo/engine/opengl/Debug/opengl.tlog/CL.write.1.tlog b/neo/engine/opengl/Debug/opengl.tlog/CL.write.1.tlog
new file mode 100644
index 00000000..91a11254
Binary files /dev/null and b/neo/engine/opengl/Debug/opengl.tlog/CL.write.1.tlog differ
diff --git a/neo/engine/opengl/Debug/opengl.tlog/Cl.items.tlog b/neo/engine/opengl/Debug/opengl.tlog/Cl.items.tlog
new file mode 100644
index 00000000..d82ed3bd
--- /dev/null
+++ b/neo/engine/opengl/Debug/opengl.tlog/Cl.items.tlog
@@ -0,0 +1,2 @@
+D:\projects\Wolf\src\opengl\gl_d3d12shim.cpp;D:\projects\Wolf\src\opengl\Debug\gl_d3d12shim.obj
+D:\projects\Wolf\src\opengl\gl_d3d12wgl.cpp;D:\projects\Wolf\src\opengl\Debug\gl_d3d12wgl.obj
diff --git a/neo/engine/opengl/Debug/opengl.tlog/Lib-link.write.1.tlog b/neo/engine/opengl/Debug/opengl.tlog/Lib-link.write.1.tlog
new file mode 100644
index 00000000..461739f4
Binary files /dev/null and b/neo/engine/opengl/Debug/opengl.tlog/Lib-link.write.1.tlog differ
diff --git a/neo/engine/opengl/Debug/opengl.tlog/Lib.command.1.tlog b/neo/engine/opengl/Debug/opengl.tlog/Lib.command.1.tlog
new file mode 100644
index 00000000..ed3fb5c3
Binary files /dev/null and b/neo/engine/opengl/Debug/opengl.tlog/Lib.command.1.tlog differ
diff --git a/neo/engine/opengl/Debug/opengl.tlog/Lib.read.1.tlog b/neo/engine/opengl/Debug/opengl.tlog/Lib.read.1.tlog
new file mode 100644
index 00000000..6ec507fc
Binary files /dev/null and b/neo/engine/opengl/Debug/opengl.tlog/Lib.read.1.tlog differ
diff --git a/neo/engine/opengl/Debug/opengl.tlog/opengl.lastbuildstate b/neo/engine/opengl/Debug/opengl.tlog/opengl.lastbuildstate
new file mode 100644
index 00000000..c2dcfe3a
--- /dev/null
+++ b/neo/engine/opengl/Debug/opengl.tlog/opengl.lastbuildstate
@@ -0,0 +1,2 @@
+PlatformToolSet=v145:VCToolArchitecture=Native32Bit:VCToolsVersion=14.50.35717:VCServicingVersionCompilers=14.50.35724:TargetPlatformVersion=10.0.26100.0:VcpkgTriplet=x86-windows:
+Debug|Win32|D:\projects\Wolf\src\|
diff --git a/neo/opengl/gl_d3d12arb.cpp b/neo/engine/opengl/gl_d3d12arb.cpp
similarity index 100%
rename from neo/opengl/gl_d3d12arb.cpp
rename to neo/engine/opengl/gl_d3d12arb.cpp
diff --git a/neo/opengl/gl_d3d12arb.h b/neo/engine/opengl/gl_d3d12arb.h
similarity index 100%
rename from neo/opengl/gl_d3d12arb.h
rename to neo/engine/opengl/gl_d3d12arb.h
diff --git a/neo/opengl/gl_d3d12raylight.cpp b/neo/engine/opengl/gl_d3d12raylight.cpp
similarity index 100%
rename from neo/opengl/gl_d3d12raylight.cpp
rename to neo/engine/opengl/gl_d3d12raylight.cpp
diff --git a/neo/opengl/gl_d3d12shim.cpp b/neo/engine/opengl/gl_d3d12shim.cpp
similarity index 100%
rename from neo/opengl/gl_d3d12shim.cpp
rename to neo/engine/opengl/gl_d3d12shim.cpp
diff --git a/neo/opengl/gl_d3d12tess.cpp b/neo/engine/opengl/gl_d3d12tess.cpp
similarity index 100%
rename from neo/opengl/gl_d3d12tess.cpp
rename to neo/engine/opengl/gl_d3d12tess.cpp
diff --git a/neo/opengl/gl_d3d12wgl.cpp b/neo/engine/opengl/gl_d3d12wgl.cpp
similarity index 100%
rename from neo/opengl/gl_d3d12wgl.cpp
rename to neo/engine/opengl/gl_d3d12wgl.cpp
diff --git a/neo/opengl/glu.cpp b/neo/engine/opengl/glu.cpp
similarity index 100%
rename from neo/opengl/glu.cpp
rename to neo/engine/opengl/glu.cpp
diff --git a/neo/opengl/opengl.h b/neo/engine/opengl/opengl.h
similarity index 100%
rename from neo/opengl/opengl.h
rename to neo/engine/opengl/opengl.h
diff --git a/neo/opengl/opengl.vcxproj b/neo/engine/opengl/opengl.vcxproj
similarity index 100%
rename from neo/opengl/opengl.vcxproj
rename to neo/engine/opengl/opengl.vcxproj
diff --git a/neo/opengl/opengl.vcxproj.filters b/neo/engine/opengl/opengl.vcxproj.filters
similarity index 100%
rename from neo/opengl/opengl.vcxproj.filters
rename to neo/engine/opengl/opengl.vcxproj.filters
diff --git a/neo/opengl/opengl.vcxproj.user b/neo/engine/opengl/opengl.vcxproj.user
similarity index 100%
rename from neo/opengl/opengl.vcxproj.user
rename to neo/engine/opengl/opengl.vcxproj.user
diff --git a/neo/opengl/streamline/include/sl.h b/neo/engine/opengl/streamline/include/sl.h
similarity index 100%
rename from neo/opengl/streamline/include/sl.h
rename to neo/engine/opengl/streamline/include/sl.h
diff --git a/neo/opengl/streamline/include/sl_appidentity.h b/neo/engine/opengl/streamline/include/sl_appidentity.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_appidentity.h
rename to neo/engine/opengl/streamline/include/sl_appidentity.h
diff --git a/neo/opengl/streamline/include/sl_consts.h b/neo/engine/opengl/streamline/include/sl_consts.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_consts.h
rename to neo/engine/opengl/streamline/include/sl_consts.h
diff --git a/neo/opengl/streamline/include/sl_core_api.h b/neo/engine/opengl/streamline/include/sl_core_api.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_core_api.h
rename to neo/engine/opengl/streamline/include/sl_core_api.h
diff --git a/neo/opengl/streamline/include/sl_core_types.h b/neo/engine/opengl/streamline/include/sl_core_types.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_core_types.h
rename to neo/engine/opengl/streamline/include/sl_core_types.h
diff --git a/neo/opengl/streamline/include/sl_deepdvc.h b/neo/engine/opengl/streamline/include/sl_deepdvc.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_deepdvc.h
rename to neo/engine/opengl/streamline/include/sl_deepdvc.h
diff --git a/neo/opengl/streamline/include/sl_device_wrappers.h b/neo/engine/opengl/streamline/include/sl_device_wrappers.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_device_wrappers.h
rename to neo/engine/opengl/streamline/include/sl_device_wrappers.h
diff --git a/neo/opengl/streamline/include/sl_directsr.h b/neo/engine/opengl/streamline/include/sl_directsr.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_directsr.h
rename to neo/engine/opengl/streamline/include/sl_directsr.h
diff --git a/neo/opengl/streamline/include/sl_dlss.h b/neo/engine/opengl/streamline/include/sl_dlss.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_dlss.h
rename to neo/engine/opengl/streamline/include/sl_dlss.h
diff --git a/neo/opengl/streamline/include/sl_dlss_d.h b/neo/engine/opengl/streamline/include/sl_dlss_d.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_dlss_d.h
rename to neo/engine/opengl/streamline/include/sl_dlss_d.h
diff --git a/neo/opengl/streamline/include/sl_dlss_g.h b/neo/engine/opengl/streamline/include/sl_dlss_g.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_dlss_g.h
rename to neo/engine/opengl/streamline/include/sl_dlss_g.h
diff --git a/neo/opengl/streamline/include/sl_helpers.h b/neo/engine/opengl/streamline/include/sl_helpers.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_helpers.h
rename to neo/engine/opengl/streamline/include/sl_helpers.h
diff --git a/neo/opengl/streamline/include/sl_helpers_vk.h b/neo/engine/opengl/streamline/include/sl_helpers_vk.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_helpers_vk.h
rename to neo/engine/opengl/streamline/include/sl_helpers_vk.h
diff --git a/neo/opengl/streamline/include/sl_hooks.h b/neo/engine/opengl/streamline/include/sl_hooks.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_hooks.h
rename to neo/engine/opengl/streamline/include/sl_hooks.h
diff --git a/neo/opengl/streamline/include/sl_matrix_helpers.h b/neo/engine/opengl/streamline/include/sl_matrix_helpers.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_matrix_helpers.h
rename to neo/engine/opengl/streamline/include/sl_matrix_helpers.h
diff --git a/neo/opengl/streamline/include/sl_nis.h b/neo/engine/opengl/streamline/include/sl_nis.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_nis.h
rename to neo/engine/opengl/streamline/include/sl_nis.h
diff --git a/neo/opengl/streamline/include/sl_nvperf.h b/neo/engine/opengl/streamline/include/sl_nvperf.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_nvperf.h
rename to neo/engine/opengl/streamline/include/sl_nvperf.h
diff --git a/neo/opengl/streamline/include/sl_pcl.h b/neo/engine/opengl/streamline/include/sl_pcl.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_pcl.h
rename to neo/engine/opengl/streamline/include/sl_pcl.h
diff --git a/neo/opengl/streamline/include/sl_reflex.h b/neo/engine/opengl/streamline/include/sl_reflex.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_reflex.h
rename to neo/engine/opengl/streamline/include/sl_reflex.h
diff --git a/neo/opengl/streamline/include/sl_result.h b/neo/engine/opengl/streamline/include/sl_result.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_result.h
rename to neo/engine/opengl/streamline/include/sl_result.h
diff --git a/neo/opengl/streamline/include/sl_security.h b/neo/engine/opengl/streamline/include/sl_security.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_security.h
rename to neo/engine/opengl/streamline/include/sl_security.h
diff --git a/neo/opengl/streamline/include/sl_struct.h b/neo/engine/opengl/streamline/include/sl_struct.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_struct.h
rename to neo/engine/opengl/streamline/include/sl_struct.h
diff --git a/neo/opengl/streamline/include/sl_template.h b/neo/engine/opengl/streamline/include/sl_template.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_template.h
rename to neo/engine/opengl/streamline/include/sl_template.h
diff --git a/neo/opengl/streamline/include/sl_version.h b/neo/engine/opengl/streamline/include/sl_version.h
similarity index 100%
rename from neo/opengl/streamline/include/sl_version.h
rename to neo/engine/opengl/streamline/include/sl_version.h
diff --git a/neo/opengl/streamline/lib/x64/sl.interposer.lib b/neo/engine/opengl/streamline/lib/x64/sl.interposer.lib
similarity index 100%
rename from neo/opengl/streamline/lib/x64/sl.interposer.lib
rename to neo/engine/opengl/streamline/lib/x64/sl.interposer.lib
diff --git a/neo/opengl/tess/dict-list.h b/neo/engine/opengl/tess/dict-list.h
similarity index 100%
rename from neo/opengl/tess/dict-list.h
rename to neo/engine/opengl/tess/dict-list.h
diff --git a/neo/opengl/tess/dict.c b/neo/engine/opengl/tess/dict.c
similarity index 100%
rename from neo/opengl/tess/dict.c
rename to neo/engine/opengl/tess/dict.c
diff --git a/neo/opengl/tess/dict.h b/neo/engine/opengl/tess/dict.h
similarity index 100%
rename from neo/opengl/tess/dict.h
rename to neo/engine/opengl/tess/dict.h
diff --git a/neo/opengl/tess/geom.c b/neo/engine/opengl/tess/geom.c
similarity index 100%
rename from neo/opengl/tess/geom.c
rename to neo/engine/opengl/tess/geom.c
diff --git a/neo/opengl/tess/geom.h b/neo/engine/opengl/tess/geom.h
similarity index 100%
rename from neo/opengl/tess/geom.h
rename to neo/engine/opengl/tess/geom.h
diff --git a/neo/opengl/tess/glu.h b/neo/engine/opengl/tess/glu.h
similarity index 100%
rename from neo/opengl/tess/glu.h
rename to neo/engine/opengl/tess/glu.h
diff --git a/neo/opengl/tess/gluos.h b/neo/engine/opengl/tess/gluos.h
similarity index 100%
rename from neo/opengl/tess/gluos.h
rename to neo/engine/opengl/tess/gluos.h
diff --git a/neo/opengl/tess/memalloc.c b/neo/engine/opengl/tess/memalloc.c
similarity index 100%
rename from neo/opengl/tess/memalloc.c
rename to neo/engine/opengl/tess/memalloc.c
diff --git a/neo/opengl/tess/memalloc.h b/neo/engine/opengl/tess/memalloc.h
similarity index 100%
rename from neo/opengl/tess/memalloc.h
rename to neo/engine/opengl/tess/memalloc.h
diff --git a/neo/opengl/tess/mesh.c b/neo/engine/opengl/tess/mesh.c
similarity index 100%
rename from neo/opengl/tess/mesh.c
rename to neo/engine/opengl/tess/mesh.c
diff --git a/neo/opengl/tess/mesh.h b/neo/engine/opengl/tess/mesh.h
similarity index 100%
rename from neo/opengl/tess/mesh.h
rename to neo/engine/opengl/tess/mesh.h
diff --git a/neo/opengl/tess/normal.c b/neo/engine/opengl/tess/normal.c
similarity index 100%
rename from neo/opengl/tess/normal.c
rename to neo/engine/opengl/tess/normal.c
diff --git a/neo/opengl/tess/normal.h b/neo/engine/opengl/tess/normal.h
similarity index 100%
rename from neo/opengl/tess/normal.h
rename to neo/engine/opengl/tess/normal.h
diff --git a/neo/opengl/tess/priorityq-heap.c b/neo/engine/opengl/tess/priorityq-heap.c
similarity index 100%
rename from neo/opengl/tess/priorityq-heap.c
rename to neo/engine/opengl/tess/priorityq-heap.c
diff --git a/neo/opengl/tess/priorityq-heap.h b/neo/engine/opengl/tess/priorityq-heap.h
similarity index 100%
rename from neo/opengl/tess/priorityq-heap.h
rename to neo/engine/opengl/tess/priorityq-heap.h
diff --git a/neo/opengl/tess/priorityq-sort.h b/neo/engine/opengl/tess/priorityq-sort.h
similarity index 100%
rename from neo/opengl/tess/priorityq-sort.h
rename to neo/engine/opengl/tess/priorityq-sort.h
diff --git a/neo/opengl/tess/priorityq.c b/neo/engine/opengl/tess/priorityq.c
similarity index 100%
rename from neo/opengl/tess/priorityq.c
rename to neo/engine/opengl/tess/priorityq.c
diff --git a/neo/opengl/tess/priorityq.h b/neo/engine/opengl/tess/priorityq.h
similarity index 100%
rename from neo/opengl/tess/priorityq.h
rename to neo/engine/opengl/tess/priorityq.h
diff --git a/neo/opengl/tess/render.c b/neo/engine/opengl/tess/render.c
similarity index 100%
rename from neo/opengl/tess/render.c
rename to neo/engine/opengl/tess/render.c
diff --git a/neo/opengl/tess/render.h b/neo/engine/opengl/tess/render.h
similarity index 100%
rename from neo/opengl/tess/render.h
rename to neo/engine/opengl/tess/render.h
diff --git a/neo/opengl/tess/sweep.c b/neo/engine/opengl/tess/sweep.c
similarity index 100%
rename from neo/opengl/tess/sweep.c
rename to neo/engine/opengl/tess/sweep.c
diff --git a/neo/opengl/tess/sweep.h b/neo/engine/opengl/tess/sweep.h
similarity index 100%
rename from neo/opengl/tess/sweep.h
rename to neo/engine/opengl/tess/sweep.h
diff --git a/neo/opengl/tess/tess.c b/neo/engine/opengl/tess/tess.c
similarity index 100%
rename from neo/opengl/tess/tess.c
rename to neo/engine/opengl/tess/tess.c
diff --git a/neo/opengl/tess/tess.h b/neo/engine/opengl/tess/tess.h
similarity index 100%
rename from neo/opengl/tess/tess.h
rename to neo/engine/opengl/tess/tess.h
diff --git a/neo/opengl/tess/tessellate.c b/neo/engine/opengl/tess/tessellate.c
similarity index 100%
rename from neo/opengl/tess/tessellate.c
rename to neo/engine/opengl/tess/tessellate.c
diff --git a/neo/opengl/tess/tessellate.h b/neo/engine/opengl/tess/tessellate.h
similarity index 100%
rename from neo/opengl/tess/tessellate.h
rename to neo/engine/opengl/tess/tessellate.h
diff --git a/neo/opengl/tess/tessellate.js b/neo/engine/opengl/tess/tessellate.js
similarity index 100%
rename from neo/opengl/tess/tessellate.js
rename to neo/engine/opengl/tess/tessellate.js
diff --git a/neo/opengl/tess/tessmono.c b/neo/engine/opengl/tess/tessmono.c
similarity index 100%
rename from neo/opengl/tess/tessmono.c
rename to neo/engine/opengl/tess/tessmono.c
diff --git a/neo/opengl/tess/tessmono.h b/neo/engine/opengl/tess/tessmono.h
similarity index 100%
rename from neo/opengl/tess/tessmono.h
rename to neo/engine/opengl/tess/tessmono.h
diff --git a/neo/engine/opengl/x64/Debug/dict.obj b/neo/engine/opengl/x64/Debug/dict.obj
new file mode 100644
index 00000000..813eaeda
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/dict.obj differ
diff --git a/neo/engine/opengl/x64/Debug/geom.obj b/neo/engine/opengl/x64/Debug/geom.obj
new file mode 100644
index 00000000..39b74eee
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/geom.obj differ
diff --git a/neo/engine/opengl/x64/Debug/gl_d3d12arb.obj b/neo/engine/opengl/x64/Debug/gl_d3d12arb.obj
new file mode 100644
index 00000000..a16f59f4
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/gl_d3d12arb.obj differ
diff --git a/neo/engine/opengl/x64/Debug/gl_d3d12raylight.obj b/neo/engine/opengl/x64/Debug/gl_d3d12raylight.obj
new file mode 100644
index 00000000..c45d0441
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/gl_d3d12raylight.obj differ
diff --git a/neo/engine/opengl/x64/Debug/gl_d3d12shim.obj b/neo/engine/opengl/x64/Debug/gl_d3d12shim.obj
new file mode 100644
index 00000000..c9a69f18
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/gl_d3d12shim.obj differ
diff --git a/neo/engine/opengl/x64/Debug/gl_d3d12tess.obj b/neo/engine/opengl/x64/Debug/gl_d3d12tess.obj
new file mode 100644
index 00000000..9d658942
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/gl_d3d12tess.obj differ
diff --git a/neo/engine/opengl/x64/Debug/gl_d3d12wgl.obj b/neo/engine/opengl/x64/Debug/gl_d3d12wgl.obj
new file mode 100644
index 00000000..4de29887
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/gl_d3d12wgl.obj differ
diff --git a/neo/engine/opengl/x64/Debug/memalloc.obj b/neo/engine/opengl/x64/Debug/memalloc.obj
new file mode 100644
index 00000000..f5b1ae26
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/memalloc.obj differ
diff --git a/neo/engine/opengl/x64/Debug/mesh.obj b/neo/engine/opengl/x64/Debug/mesh.obj
new file mode 100644
index 00000000..fe6f33ad
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/mesh.obj differ
diff --git a/neo/engine/opengl/x64/Debug/normal.obj b/neo/engine/opengl/x64/Debug/normal.obj
new file mode 100644
index 00000000..ab846f75
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/normal.obj differ
diff --git a/neo/engine/opengl/x64/Debug/opengl.Build.CppClean.log b/neo/engine/opengl/x64/Debug/opengl.Build.CppClean.log
new file mode 100644
index 00000000..5dd6e357
--- /dev/null
+++ b/neo/engine/opengl/x64/Debug/opengl.Build.CppClean.log
@@ -0,0 +1,27 @@
+d:\projects\doom3\neo\x64\debug\opengl.pdb
+d:\projects\doom3\neo\x64\debug\opengl.idb
+d:\projects\doom3\neo\opengl\x64\debug\gl_d3d12wgl.obj
+d:\projects\doom3\neo\opengl\x64\debug\gl_d3d12tess.obj
+d:\projects\doom3\neo\opengl\x64\debug\gl_d3d12shim.obj
+d:\projects\doom3\neo\opengl\x64\debug\gl_d3d12raylight.obj
+d:\projects\doom3\neo\opengl\x64\debug\gl_d3d12arb.obj
+d:\projects\doom3\neo\opengl\x64\debug\tessmono.obj
+d:\projects\doom3\neo\opengl\x64\debug\tessellate.obj
+d:\projects\doom3\neo\opengl\x64\debug\tess.obj
+d:\projects\doom3\neo\opengl\x64\debug\sweep.obj
+d:\projects\doom3\neo\opengl\x64\debug\render.obj
+d:\projects\doom3\neo\opengl\x64\debug\priorityq.obj
+d:\projects\doom3\neo\opengl\x64\debug\priorityq-heap.obj
+d:\projects\doom3\neo\opengl\x64\debug\normal.obj
+d:\projects\doom3\neo\opengl\x64\debug\mesh.obj
+d:\projects\doom3\neo\opengl\x64\debug\memalloc.obj
+d:\projects\doom3\neo\opengl\x64\debug\geom.obj
+d:\projects\doom3\neo\opengl\x64\debug\dict.obj
+d:\projects\doom3\neo\x64\debug\opengl.lib
+d:\projects\doom3\neo\opengl\x64\debug\opengl.tlog\cl.command.1.tlog
+d:\projects\doom3\neo\opengl\x64\debug\opengl.tlog\cl.items.tlog
+d:\projects\doom3\neo\opengl\x64\debug\opengl.tlog\cl.read.1.tlog
+d:\projects\doom3\neo\opengl\x64\debug\opengl.tlog\cl.write.1.tlog
+d:\projects\doom3\neo\opengl\x64\debug\opengl.tlog\lib-link.read.1.tlog
+d:\projects\doom3\neo\opengl\x64\debug\opengl.tlog\lib-link.write.1.tlog
+d:\projects\doom3\neo\opengl\x64\debug\opengl.tlog\lib.command.1.tlog
diff --git a/neo/engine/opengl/x64/Debug/opengl.lib.recipe b/neo/engine/opengl/x64/Debug/opengl.lib.recipe
new file mode 100644
index 00000000..a53f9611
--- /dev/null
+++ b/neo/engine/opengl/x64/Debug/opengl.lib.recipe
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/neo/engine/opengl/x64/Debug/opengl.log b/neo/engine/opengl/x64/Debug/opengl.log
new file mode 100644
index 00000000..12d5b2e9
--- /dev/null
+++ b/neo/engine/opengl/x64/Debug/opengl.log
@@ -0,0 +1,51 @@
+ gl_d3d12arb.cpp
+ gl_d3d12raylight.cpp
+ gl_d3d12shim.cpp
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12shim.cpp(3367,18): warning C4083: expected '('; found identifier 'off'
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12shim.cpp(3484,18): warning C4083: expected '('; found identifier 'on'
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12shim.cpp(9184,18): warning C4083: expected '('; found identifier 'off'
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12shim.cpp(9346,18): warning C4083: expected '('; found identifier 'on'
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12shim.cpp(11583,13): warning C4273: 'wglShareLists': inconsistent dll linkage
+ C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um\wingdi.h(6338,24):
+ see previous definition of 'wglShareLists'
+
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12shim.cpp(11780,4): warning C4390: ';': empty controlled statement found; is this the intent?
+ gl_d3d12tess.cpp
+D:\projects\Doom3\neo\engine\opengl\tess\tess.h(59,8): warning C4099: 'GLUtesselator': type name first seen using 'class' now seen using 'struct'
+ (compiling source file '../engine/opengl/gl_d3d12tess.cpp')
+ D:\projects\Doom3\neo\engine\opengl\tess\tess.h(59,8):
+ see declaration of 'GLUtesselator'
+
+ gl_d3d12wgl.cpp
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12wgl.cpp(207,36): warning C4273: 'wglUseFontBitmapsA': inconsistent dll linkage
+ C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um\wingdi.h(6339,24):
+ see previous definition of 'wglUseFontBitmapsA'
+
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12wgl.cpp(208,37): warning C4273: 'wglUseFontBitmapsW': inconsistent dll linkage
+ C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um\wingdi.h(6340,24):
+ see previous definition of 'wglUseFontBitmapsW'
+
+ Generating Code...
+ dict.c
+ geom.c
+ memalloc.c
+ mesh.c
+ normal.c
+ priorityq-heap.c
+ priorityq.c
+ render.c
+ sweep.c
+ tess.c
+ tessellate.c
+D:\projects\Doom3\neo\engine\opengl\tess\tessellate.c(210,66): warning C4113: 'GLvoid (__cdecl *)()' differs in parameter lists from '_GLUfuncptr'
+D:\projects\Doom3\neo\engine\opengl\tess\tessellate.c(211,66): warning C4113: 'GLvoid (__cdecl *)()' differs in parameter lists from '_GLUfuncptr'
+D:\projects\Doom3\neo\engine\opengl\tess\tessellate.c(212,66): warning C4113: 'GLvoid (__cdecl *)()' differs in parameter lists from '_GLUfuncptr'
+ tessmono.c
+ Generating Code...
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapNewPriorityQ already defined in priorityq.obj; second definition ignored
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapDeletePriorityQ already defined in priorityq.obj; second definition ignored
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapInit already defined in priorityq.obj; second definition ignored
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapInsert already defined in priorityq.obj; second definition ignored
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapExtractMin already defined in priorityq.obj; second definition ignored
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapDelete already defined in priorityq.obj; second definition ignored
+ opengl.vcxproj -> D:\projects\Doom3\neo\x64\Debug\opengl.lib
diff --git a/neo/engine/opengl/x64/Debug/opengl.tlog/CL.command.1.tlog b/neo/engine/opengl/x64/Debug/opengl.tlog/CL.command.1.tlog
new file mode 100644
index 00000000..92f52c65
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/opengl.tlog/CL.command.1.tlog differ
diff --git a/neo/engine/opengl/x64/Debug/opengl.tlog/CL.read.1.tlog b/neo/engine/opengl/x64/Debug/opengl.tlog/CL.read.1.tlog
new file mode 100644
index 00000000..654c28a1
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/opengl.tlog/CL.read.1.tlog differ
diff --git a/neo/engine/opengl/x64/Debug/opengl.tlog/CL.write.1.tlog b/neo/engine/opengl/x64/Debug/opengl.tlog/CL.write.1.tlog
new file mode 100644
index 00000000..e6568028
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/opengl.tlog/CL.write.1.tlog differ
diff --git a/neo/engine/opengl/x64/Debug/opengl.tlog/Cl.items.tlog b/neo/engine/opengl/x64/Debug/opengl.tlog/Cl.items.tlog
new file mode 100644
index 00000000..21339ea7
--- /dev/null
+++ b/neo/engine/opengl/x64/Debug/opengl.tlog/Cl.items.tlog
@@ -0,0 +1,17 @@
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12arb.cpp;D:\projects\Doom3\neo\engine\opengl\x64\Debug\gl_d3d12arb.obj
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12raylight.cpp;D:\projects\Doom3\neo\engine\opengl\x64\Debug\gl_d3d12raylight.obj
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12shim.cpp;D:\projects\Doom3\neo\engine\opengl\x64\Debug\gl_d3d12shim.obj
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12tess.cpp;D:\projects\Doom3\neo\engine\opengl\x64\Debug\gl_d3d12tess.obj
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12wgl.cpp;D:\projects\Doom3\neo\engine\opengl\x64\Debug\gl_d3d12wgl.obj
+D:\projects\Doom3\neo\engine\opengl\tess\dict.c;D:\projects\Doom3\neo\engine\opengl\x64\Debug\dict.obj
+D:\projects\Doom3\neo\engine\opengl\tess\geom.c;D:\projects\Doom3\neo\engine\opengl\x64\Debug\geom.obj
+D:\projects\Doom3\neo\engine\opengl\tess\memalloc.c;D:\projects\Doom3\neo\engine\opengl\x64\Debug\memalloc.obj
+D:\projects\Doom3\neo\engine\opengl\tess\mesh.c;D:\projects\Doom3\neo\engine\opengl\x64\Debug\mesh.obj
+D:\projects\Doom3\neo\engine\opengl\tess\normal.c;D:\projects\Doom3\neo\engine\opengl\x64\Debug\normal.obj
+D:\projects\Doom3\neo\engine\opengl\tess\priorityq-heap.c;D:\projects\Doom3\neo\engine\opengl\x64\Debug\priorityq-heap.obj
+D:\projects\Doom3\neo\engine\opengl\tess\priorityq.c;D:\projects\Doom3\neo\engine\opengl\x64\Debug\priorityq.obj
+D:\projects\Doom3\neo\engine\opengl\tess\render.c;D:\projects\Doom3\neo\engine\opengl\x64\Debug\render.obj
+D:\projects\Doom3\neo\engine\opengl\tess\sweep.c;D:\projects\Doom3\neo\engine\opengl\x64\Debug\sweep.obj
+D:\projects\Doom3\neo\engine\opengl\tess\tess.c;D:\projects\Doom3\neo\engine\opengl\x64\Debug\tess.obj
+D:\projects\Doom3\neo\engine\opengl\tess\tessellate.c;D:\projects\Doom3\neo\engine\opengl\x64\Debug\tessellate.obj
+D:\projects\Doom3\neo\engine\opengl\tess\tessmono.c;D:\projects\Doom3\neo\engine\opengl\x64\Debug\tessmono.obj
diff --git a/neo/engine/opengl/x64/Debug/opengl.tlog/Lib-link.read.1.tlog b/neo/engine/opengl/x64/Debug/opengl.tlog/Lib-link.read.1.tlog
new file mode 100644
index 00000000..4e4ca547
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/opengl.tlog/Lib-link.read.1.tlog differ
diff --git a/neo/engine/opengl/x64/Debug/opengl.tlog/Lib-link.write.1.tlog b/neo/engine/opengl/x64/Debug/opengl.tlog/Lib-link.write.1.tlog
new file mode 100644
index 00000000..6775a959
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/opengl.tlog/Lib-link.write.1.tlog differ
diff --git a/neo/engine/opengl/x64/Debug/opengl.tlog/Lib.command.1.tlog b/neo/engine/opengl/x64/Debug/opengl.tlog/Lib.command.1.tlog
new file mode 100644
index 00000000..7131d4a0
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/opengl.tlog/Lib.command.1.tlog differ
diff --git a/neo/engine/opengl/x64/Debug/opengl.tlog/opengl.lastbuildstate b/neo/engine/opengl/x64/Debug/opengl.tlog/opengl.lastbuildstate
new file mode 100644
index 00000000..1afa2b04
--- /dev/null
+++ b/neo/engine/opengl/x64/Debug/opengl.tlog/opengl.lastbuildstate
@@ -0,0 +1,2 @@
+PlatformToolSet=v145:VCToolArchitecture=Native64Bit:VCToolsVersion=14.50.35717:VCServicingVersionCompilers=14.50.35728:TargetPlatformVersion=10.0.26100.0:VcpkgTriplet=x64-windows:
+Debug|x64|D:\projects\Doom3\neo\|
diff --git a/neo/engine/opengl/x64/Debug/opengl.vcxproj.FileListAbsolute.txt b/neo/engine/opengl/x64/Debug/opengl.vcxproj.FileListAbsolute.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/neo/engine/opengl/x64/Debug/priorityq-heap.obj b/neo/engine/opengl/x64/Debug/priorityq-heap.obj
new file mode 100644
index 00000000..2ea2fb4d
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/priorityq-heap.obj differ
diff --git a/neo/engine/opengl/x64/Debug/priorityq.obj b/neo/engine/opengl/x64/Debug/priorityq.obj
new file mode 100644
index 00000000..9942d286
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/priorityq.obj differ
diff --git a/neo/engine/opengl/x64/Debug/render.obj b/neo/engine/opengl/x64/Debug/render.obj
new file mode 100644
index 00000000..3a434a3f
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/render.obj differ
diff --git a/neo/engine/opengl/x64/Debug/sweep.obj b/neo/engine/opengl/x64/Debug/sweep.obj
new file mode 100644
index 00000000..86d0a285
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/sweep.obj differ
diff --git a/neo/engine/opengl/x64/Debug/tess.obj b/neo/engine/opengl/x64/Debug/tess.obj
new file mode 100644
index 00000000..ece2c29a
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/tess.obj differ
diff --git a/neo/engine/opengl/x64/Debug/tessellate.obj b/neo/engine/opengl/x64/Debug/tessellate.obj
new file mode 100644
index 00000000..9f2bf45d
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/tessellate.obj differ
diff --git a/neo/engine/opengl/x64/Debug/tessmono.obj b/neo/engine/opengl/x64/Debug/tessmono.obj
new file mode 100644
index 00000000..87a4bb24
Binary files /dev/null and b/neo/engine/opengl/x64/Debug/tessmono.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/dict.obj b/neo/engine/opengl/x64/Prey Debug/dict.obj
new file mode 100644
index 00000000..b7223b32
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/dict.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/geom.obj b/neo/engine/opengl/x64/Prey Debug/geom.obj
new file mode 100644
index 00000000..752efb12
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/geom.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/gl_d3d12arb.obj b/neo/engine/opengl/x64/Prey Debug/gl_d3d12arb.obj
new file mode 100644
index 00000000..44a4f809
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/gl_d3d12arb.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/gl_d3d12raylight.obj b/neo/engine/opengl/x64/Prey Debug/gl_d3d12raylight.obj
new file mode 100644
index 00000000..850a50c1
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/gl_d3d12raylight.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/gl_d3d12shim.obj b/neo/engine/opengl/x64/Prey Debug/gl_d3d12shim.obj
new file mode 100644
index 00000000..b113e95f
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/gl_d3d12shim.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/gl_d3d12tess.obj b/neo/engine/opengl/x64/Prey Debug/gl_d3d12tess.obj
new file mode 100644
index 00000000..354d08a8
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/gl_d3d12tess.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/gl_d3d12wgl.obj b/neo/engine/opengl/x64/Prey Debug/gl_d3d12wgl.obj
new file mode 100644
index 00000000..0ed96fc6
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/gl_d3d12wgl.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/memalloc.obj b/neo/engine/opengl/x64/Prey Debug/memalloc.obj
new file mode 100644
index 00000000..f785ab97
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/memalloc.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/mesh.obj b/neo/engine/opengl/x64/Prey Debug/mesh.obj
new file mode 100644
index 00000000..9165bac0
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/mesh.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/normal.obj b/neo/engine/opengl/x64/Prey Debug/normal.obj
new file mode 100644
index 00000000..f7a08268
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/normal.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/opengl.Build.CppClean.log b/neo/engine/opengl/x64/Prey Debug/opengl.Build.CppClean.log
new file mode 100644
index 00000000..3c1e9488
--- /dev/null
+++ b/neo/engine/opengl/x64/Prey Debug/opengl.Build.CppClean.log
@@ -0,0 +1,27 @@
+d:\projects\doom3\neo\x64\prey debug\opengl.pdb
+d:\projects\doom3\neo\x64\prey debug\opengl.idb
+d:\projects\doom3\neo\opengl\x64\prey debug\tessmono.obj
+d:\projects\doom3\neo\opengl\x64\prey debug\tessellate.obj
+d:\projects\doom3\neo\opengl\x64\prey debug\tess.obj
+d:\projects\doom3\neo\opengl\x64\prey debug\sweep.obj
+d:\projects\doom3\neo\opengl\x64\prey debug\render.obj
+d:\projects\doom3\neo\opengl\x64\prey debug\priorityq.obj
+d:\projects\doom3\neo\opengl\x64\prey debug\priorityq-heap.obj
+d:\projects\doom3\neo\opengl\x64\prey debug\normal.obj
+d:\projects\doom3\neo\opengl\x64\prey debug\mesh.obj
+d:\projects\doom3\neo\opengl\x64\prey debug\memalloc.obj
+d:\projects\doom3\neo\opengl\x64\prey debug\geom.obj
+d:\projects\doom3\neo\opengl\x64\prey debug\dict.obj
+d:\projects\doom3\neo\opengl\x64\prey debug\gl_d3d12wgl.obj
+d:\projects\doom3\neo\opengl\x64\prey debug\gl_d3d12tess.obj
+d:\projects\doom3\neo\opengl\x64\prey debug\gl_d3d12shim.obj
+d:\projects\doom3\neo\opengl\x64\prey debug\gl_d3d12raylight.obj
+d:\projects\doom3\neo\opengl\x64\prey debug\gl_d3d12arb.obj
+d:\projects\doom3\neo\x64\prey debug\opengl.lib
+d:\projects\doom3\neo\opengl\x64\prey debug\opengl.tlog\cl.command.1.tlog
+d:\projects\doom3\neo\opengl\x64\prey debug\opengl.tlog\cl.items.tlog
+d:\projects\doom3\neo\opengl\x64\prey debug\opengl.tlog\cl.read.1.tlog
+d:\projects\doom3\neo\opengl\x64\prey debug\opengl.tlog\cl.write.1.tlog
+d:\projects\doom3\neo\opengl\x64\prey debug\opengl.tlog\lib-link.read.1.tlog
+d:\projects\doom3\neo\opengl\x64\prey debug\opengl.tlog\lib-link.write.1.tlog
+d:\projects\doom3\neo\opengl\x64\prey debug\opengl.tlog\lib.command.1.tlog
diff --git a/neo/engine/opengl/x64/Prey Debug/opengl.lib.recipe b/neo/engine/opengl/x64/Prey Debug/opengl.lib.recipe
new file mode 100644
index 00000000..a53f9611
--- /dev/null
+++ b/neo/engine/opengl/x64/Prey Debug/opengl.lib.recipe
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/neo/engine/opengl/x64/Prey Debug/opengl.log b/neo/engine/opengl/x64/Prey Debug/opengl.log
new file mode 100644
index 00000000..0d091152
--- /dev/null
+++ b/neo/engine/opengl/x64/Prey Debug/opengl.log
@@ -0,0 +1,51 @@
+ gl_d3d12arb.cpp
+ gl_d3d12raylight.cpp
+ gl_d3d12shim.cpp
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12shim.cpp(3367,18): warning C4083: expected '('; found identifier 'off'
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12shim.cpp(3484,18): warning C4083: expected '('; found identifier 'on'
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12shim.cpp(9184,18): warning C4083: expected '('; found identifier 'off'
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12shim.cpp(9346,18): warning C4083: expected '('; found identifier 'on'
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12shim.cpp(11583,13): warning C4273: 'wglShareLists': inconsistent dll linkage
+ C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um\wingdi.h(6338,24):
+ see previous definition of 'wglShareLists'
+
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12shim.cpp(11780,4): warning C4390: ';': empty controlled statement found; is this the intent?
+ gl_d3d12tess.cpp
+D:\projects\Doom3\neo\engine\opengl\tess\tess.h(59,8): warning C4099: 'GLUtesselator': type name first seen using 'class' now seen using 'struct'
+ (compiling source file '../engine/opengl/gl_d3d12tess.cpp')
+ D:\projects\Doom3\neo\engine\opengl\tess\tess.h(59,8):
+ see declaration of 'GLUtesselator'
+
+ gl_d3d12wgl.cpp
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12wgl.cpp(207,36): warning C4273: 'wglUseFontBitmapsA': inconsistent dll linkage
+ C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um\wingdi.h(6339,24):
+ see previous definition of 'wglUseFontBitmapsA'
+
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12wgl.cpp(208,37): warning C4273: 'wglUseFontBitmapsW': inconsistent dll linkage
+ C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um\wingdi.h(6340,24):
+ see previous definition of 'wglUseFontBitmapsW'
+
+ Generating Code...
+ dict.c
+ geom.c
+ memalloc.c
+ mesh.c
+ normal.c
+ priorityq-heap.c
+ priorityq.c
+ render.c
+ sweep.c
+ tess.c
+ tessellate.c
+D:\projects\Doom3\neo\engine\opengl\tess\tessellate.c(210,66): warning C4113: 'GLvoid (__cdecl *)()' differs in parameter lists from '_GLUfuncptr'
+D:\projects\Doom3\neo\engine\opengl\tess\tessellate.c(211,66): warning C4113: 'GLvoid (__cdecl *)()' differs in parameter lists from '_GLUfuncptr'
+D:\projects\Doom3\neo\engine\opengl\tess\tessellate.c(212,66): warning C4113: 'GLvoid (__cdecl *)()' differs in parameter lists from '_GLUfuncptr'
+ tessmono.c
+ Generating Code...
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapNewPriorityQ already defined in priorityq.obj; second definition ignored
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapDeletePriorityQ already defined in priorityq.obj; second definition ignored
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapInit already defined in priorityq.obj; second definition ignored
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapInsert already defined in priorityq.obj; second definition ignored
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapExtractMin already defined in priorityq.obj; second definition ignored
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapDelete already defined in priorityq.obj; second definition ignored
+ opengl.vcxproj -> D:\projects\Doom3\neo\x64\Prey Debug\opengl.lib
diff --git a/neo/engine/opengl/x64/Prey Debug/opengl.tlog/CL.command.1.tlog b/neo/engine/opengl/x64/Prey Debug/opengl.tlog/CL.command.1.tlog
new file mode 100644
index 00000000..329216b7
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/opengl.tlog/CL.command.1.tlog differ
diff --git a/neo/engine/opengl/x64/Prey Debug/opengl.tlog/CL.read.1.tlog b/neo/engine/opengl/x64/Prey Debug/opengl.tlog/CL.read.1.tlog
new file mode 100644
index 00000000..654c28a1
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/opengl.tlog/CL.read.1.tlog differ
diff --git a/neo/engine/opengl/x64/Prey Debug/opengl.tlog/CL.write.1.tlog b/neo/engine/opengl/x64/Prey Debug/opengl.tlog/CL.write.1.tlog
new file mode 100644
index 00000000..87bd6f69
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/opengl.tlog/CL.write.1.tlog differ
diff --git a/neo/engine/opengl/x64/Prey Debug/opengl.tlog/Cl.items.tlog b/neo/engine/opengl/x64/Prey Debug/opengl.tlog/Cl.items.tlog
new file mode 100644
index 00000000..dc6b74c7
--- /dev/null
+++ b/neo/engine/opengl/x64/Prey Debug/opengl.tlog/Cl.items.tlog
@@ -0,0 +1,17 @@
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12arb.cpp;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\gl_d3d12arb.obj
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12raylight.cpp;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\gl_d3d12raylight.obj
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12shim.cpp;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\gl_d3d12shim.obj
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12tess.cpp;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\gl_d3d12tess.obj
+D:\projects\Doom3\neo\engine\opengl\gl_d3d12wgl.cpp;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\gl_d3d12wgl.obj
+D:\projects\Doom3\neo\engine\opengl\tess\dict.c;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\dict.obj
+D:\projects\Doom3\neo\engine\opengl\tess\geom.c;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\geom.obj
+D:\projects\Doom3\neo\engine\opengl\tess\memalloc.c;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\memalloc.obj
+D:\projects\Doom3\neo\engine\opengl\tess\mesh.c;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\mesh.obj
+D:\projects\Doom3\neo\engine\opengl\tess\normal.c;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\normal.obj
+D:\projects\Doom3\neo\engine\opengl\tess\priorityq-heap.c;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\priorityq-heap.obj
+D:\projects\Doom3\neo\engine\opengl\tess\priorityq.c;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\priorityq.obj
+D:\projects\Doom3\neo\engine\opengl\tess\render.c;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\render.obj
+D:\projects\Doom3\neo\engine\opengl\tess\sweep.c;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\sweep.obj
+D:\projects\Doom3\neo\engine\opengl\tess\tess.c;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\tess.obj
+D:\projects\Doom3\neo\engine\opengl\tess\tessellate.c;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\tessellate.obj
+D:\projects\Doom3\neo\engine\opengl\tess\tessmono.c;D:\projects\Doom3\neo\engine\opengl\x64\Prey Debug\tessmono.obj
diff --git a/neo/engine/opengl/x64/Prey Debug/opengl.tlog/Lib-link.read.1.tlog b/neo/engine/opengl/x64/Prey Debug/opengl.tlog/Lib-link.read.1.tlog
new file mode 100644
index 00000000..a5ec8a46
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/opengl.tlog/Lib-link.read.1.tlog differ
diff --git a/neo/engine/opengl/x64/Prey Debug/opengl.tlog/Lib-link.write.1.tlog b/neo/engine/opengl/x64/Prey Debug/opengl.tlog/Lib-link.write.1.tlog
new file mode 100644
index 00000000..e8a67e3e
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/opengl.tlog/Lib-link.write.1.tlog differ
diff --git a/neo/engine/opengl/x64/Prey Debug/opengl.tlog/Lib.command.1.tlog b/neo/engine/opengl/x64/Prey Debug/opengl.tlog/Lib.command.1.tlog
new file mode 100644
index 00000000..cc829bad
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/opengl.tlog/Lib.command.1.tlog differ
diff --git a/neo/engine/opengl/x64/Prey Debug/opengl.tlog/opengl.lastbuildstate b/neo/engine/opengl/x64/Prey Debug/opengl.tlog/opengl.lastbuildstate
new file mode 100644
index 00000000..3db5fc81
--- /dev/null
+++ b/neo/engine/opengl/x64/Prey Debug/opengl.tlog/opengl.lastbuildstate
@@ -0,0 +1,2 @@
+PlatformToolSet=v145:VCToolArchitecture=Native64Bit:VCToolsVersion=14.50.35717:VCServicingVersionCompilers=14.50.35728:TargetPlatformVersion=10.0.26100.0:VcpkgTriplet=x64-windows:
+Prey Debug|x64|D:\projects\Doom3\neo\|
diff --git a/neo/engine/opengl/x64/Prey Debug/opengl.vcxproj.FileListAbsolute.txt b/neo/engine/opengl/x64/Prey Debug/opengl.vcxproj.FileListAbsolute.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/neo/engine/opengl/x64/Prey Debug/priorityq-heap.obj b/neo/engine/opengl/x64/Prey Debug/priorityq-heap.obj
new file mode 100644
index 00000000..89faa064
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/priorityq-heap.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/priorityq.obj b/neo/engine/opengl/x64/Prey Debug/priorityq.obj
new file mode 100644
index 00000000..e167b8aa
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/priorityq.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/render.obj b/neo/engine/opengl/x64/Prey Debug/render.obj
new file mode 100644
index 00000000..3c9bf886
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/render.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/sweep.obj b/neo/engine/opengl/x64/Prey Debug/sweep.obj
new file mode 100644
index 00000000..f461ef07
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/sweep.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/tess.obj b/neo/engine/opengl/x64/Prey Debug/tess.obj
new file mode 100644
index 00000000..1d9d4c60
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/tess.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/tessellate.obj b/neo/engine/opengl/x64/Prey Debug/tessellate.obj
new file mode 100644
index 00000000..97e95754
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/tessellate.obj differ
diff --git a/neo/engine/opengl/x64/Prey Debug/tessmono.obj b/neo/engine/opengl/x64/Prey Debug/tessmono.obj
new file mode 100644
index 00000000..a8670c59
Binary files /dev/null and b/neo/engine/opengl/x64/Prey Debug/tessmono.obj differ
diff --git a/neo/engine/opengl/x64/Release/dict.obj b/neo/engine/opengl/x64/Release/dict.obj
new file mode 100644
index 00000000..e8278bf2
Binary files /dev/null and b/neo/engine/opengl/x64/Release/dict.obj differ
diff --git a/neo/engine/opengl/x64/Release/geom.obj b/neo/engine/opengl/x64/Release/geom.obj
new file mode 100644
index 00000000..c37dfe63
Binary files /dev/null and b/neo/engine/opengl/x64/Release/geom.obj differ
diff --git a/neo/engine/opengl/x64/Release/gl_d3d12arb.obj b/neo/engine/opengl/x64/Release/gl_d3d12arb.obj
new file mode 100644
index 00000000..ac5c78e1
Binary files /dev/null and b/neo/engine/opengl/x64/Release/gl_d3d12arb.obj differ
diff --git a/neo/engine/opengl/x64/Release/gl_d3d12raylight.obj b/neo/engine/opengl/x64/Release/gl_d3d12raylight.obj
new file mode 100644
index 00000000..10a1ec3f
Binary files /dev/null and b/neo/engine/opengl/x64/Release/gl_d3d12raylight.obj differ
diff --git a/neo/engine/opengl/x64/Release/gl_d3d12shim.obj b/neo/engine/opengl/x64/Release/gl_d3d12shim.obj
new file mode 100644
index 00000000..e65dc902
Binary files /dev/null and b/neo/engine/opengl/x64/Release/gl_d3d12shim.obj differ
diff --git a/neo/engine/opengl/x64/Release/gl_d3d12tess.obj b/neo/engine/opengl/x64/Release/gl_d3d12tess.obj
new file mode 100644
index 00000000..f77d1a15
Binary files /dev/null and b/neo/engine/opengl/x64/Release/gl_d3d12tess.obj differ
diff --git a/neo/engine/opengl/x64/Release/gl_d3d12wgl.obj b/neo/engine/opengl/x64/Release/gl_d3d12wgl.obj
new file mode 100644
index 00000000..7c8c796b
Binary files /dev/null and b/neo/engine/opengl/x64/Release/gl_d3d12wgl.obj differ
diff --git a/neo/engine/opengl/x64/Release/memalloc.obj b/neo/engine/opengl/x64/Release/memalloc.obj
new file mode 100644
index 00000000..c13b58be
Binary files /dev/null and b/neo/engine/opengl/x64/Release/memalloc.obj differ
diff --git a/neo/engine/opengl/x64/Release/mesh.obj b/neo/engine/opengl/x64/Release/mesh.obj
new file mode 100644
index 00000000..5871991e
Binary files /dev/null and b/neo/engine/opengl/x64/Release/mesh.obj differ
diff --git a/neo/engine/opengl/x64/Release/normal.obj b/neo/engine/opengl/x64/Release/normal.obj
new file mode 100644
index 00000000..5db58725
Binary files /dev/null and b/neo/engine/opengl/x64/Release/normal.obj differ
diff --git a/neo/engine/opengl/x64/Release/opengl.lib.recipe b/neo/engine/opengl/x64/Release/opengl.lib.recipe
new file mode 100644
index 00000000..a53f9611
--- /dev/null
+++ b/neo/engine/opengl/x64/Release/opengl.lib.recipe
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/neo/engine/opengl/x64/Release/opengl.log b/neo/engine/opengl/x64/Release/opengl.log
new file mode 100644
index 00000000..ec3ea7a4
--- /dev/null
+++ b/neo/engine/opengl/x64/Release/opengl.log
@@ -0,0 +1,45 @@
+ gl_d3d12arb.cpp
+ gl_d3d12raylight.cpp
+ gl_d3d12shim.cpp
+D:\projects\Doom3\neo\opengl\gl_d3d12shim.cpp(9851,13): warning C4273: 'wglShareLists': inconsistent dll linkage
+ C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um\wingdi.h(6338,24):
+ see previous definition of 'wglShareLists'
+
+D:\projects\Doom3\neo\opengl\gl_d3d12shim.cpp(10048,4): warning C4390: ';': empty controlled statement found; is this the intent?
+ gl_d3d12tess.cpp
+D:\projects\Doom3\neo\opengl\tess\tess.h(59,8): warning C4099: 'GLUtesselator': type name first seen using 'class' now seen using 'struct'
+ (compiling source file 'gl_d3d12tess.cpp')
+ D:\projects\Doom3\neo\opengl\tess\tess.h(59,8):
+ see declaration of 'GLUtesselator'
+
+ gl_d3d12wgl.cpp
+D:\projects\Doom3\neo\opengl\gl_d3d12wgl.cpp(181,36): warning C4273: 'wglUseFontBitmapsA': inconsistent dll linkage
+ C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um\wingdi.h(6339,24):
+ see previous definition of 'wglUseFontBitmapsA'
+
+D:\projects\Doom3\neo\opengl\gl_d3d12wgl.cpp(182,37): warning C4273: 'wglUseFontBitmapsW': inconsistent dll linkage
+ C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um\wingdi.h(6340,24):
+ see previous definition of 'wglUseFontBitmapsW'
+
+ dict.c
+ geom.c
+ memalloc.c
+ mesh.c
+ normal.c
+ priorityq-heap.c
+ priorityq.c
+ render.c
+ sweep.c
+ tess.c
+ tessellate.c
+D:\projects\Doom3\neo\opengl\tess\tessellate.c(210,66): warning C4113: 'GLvoid (__cdecl *)()' differs in parameter lists from '_GLUfuncptr'
+D:\projects\Doom3\neo\opengl\tess\tessellate.c(211,66): warning C4113: 'GLvoid (__cdecl *)()' differs in parameter lists from '_GLUfuncptr'
+D:\projects\Doom3\neo\opengl\tess\tessellate.c(212,66): warning C4113: 'GLvoid (__cdecl *)()' differs in parameter lists from '_GLUfuncptr'
+ tessmono.c
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapDelete already defined in priorityq.obj; second definition ignored
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapExtractMin already defined in priorityq.obj; second definition ignored
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapInsert already defined in priorityq.obj; second definition ignored
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapInit already defined in priorityq.obj; second definition ignored
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapDeletePriorityQ already defined in priorityq.obj; second definition ignored
+priorityq-heap.obj : warning LNK4006: __gl_pqHeapNewPriorityQ already defined in priorityq.obj; second definition ignored
+ opengl.vcxproj -> D:\projects\Doom3\neo\x64\Release\opengl.lib
diff --git a/neo/engine/opengl/x64/Release/opengl.tlog/CL.command.1.tlog b/neo/engine/opengl/x64/Release/opengl.tlog/CL.command.1.tlog
new file mode 100644
index 00000000..2fde40de
Binary files /dev/null and b/neo/engine/opengl/x64/Release/opengl.tlog/CL.command.1.tlog differ
diff --git a/neo/engine/opengl/x64/Release/opengl.tlog/CL.read.1.tlog b/neo/engine/opengl/x64/Release/opengl.tlog/CL.read.1.tlog
new file mode 100644
index 00000000..22ae1c85
Binary files /dev/null and b/neo/engine/opengl/x64/Release/opengl.tlog/CL.read.1.tlog differ
diff --git a/neo/engine/opengl/x64/Release/opengl.tlog/CL.write.1.tlog b/neo/engine/opengl/x64/Release/opengl.tlog/CL.write.1.tlog
new file mode 100644
index 00000000..151b1462
Binary files /dev/null and b/neo/engine/opengl/x64/Release/opengl.tlog/CL.write.1.tlog differ
diff --git a/neo/engine/opengl/x64/Release/opengl.tlog/Cl.items.tlog b/neo/engine/opengl/x64/Release/opengl.tlog/Cl.items.tlog
new file mode 100644
index 00000000..9f15598a
--- /dev/null
+++ b/neo/engine/opengl/x64/Release/opengl.tlog/Cl.items.tlog
@@ -0,0 +1,17 @@
+D:\projects\Doom3\neo\opengl\gl_d3d12arb.cpp;D:\projects\Doom3\neo\opengl\x64\Release\gl_d3d12arb.obj
+D:\projects\Doom3\neo\opengl\gl_d3d12raylight.cpp;D:\projects\Doom3\neo\opengl\x64\Release\gl_d3d12raylight.obj
+D:\projects\Doom3\neo\opengl\gl_d3d12shim.cpp;D:\projects\Doom3\neo\opengl\x64\Release\gl_d3d12shim.obj
+D:\projects\Doom3\neo\opengl\gl_d3d12tess.cpp;D:\projects\Doom3\neo\opengl\x64\Release\gl_d3d12tess.obj
+D:\projects\Doom3\neo\opengl\gl_d3d12wgl.cpp;D:\projects\Doom3\neo\opengl\x64\Release\gl_d3d12wgl.obj
+D:\projects\Doom3\neo\opengl\tess\dict.c;D:\projects\Doom3\neo\opengl\x64\Release\dict.obj
+D:\projects\Doom3\neo\opengl\tess\geom.c;D:\projects\Doom3\neo\opengl\x64\Release\geom.obj
+D:\projects\Doom3\neo\opengl\tess\memalloc.c;D:\projects\Doom3\neo\opengl\x64\Release\memalloc.obj
+D:\projects\Doom3\neo\opengl\tess\mesh.c;D:\projects\Doom3\neo\opengl\x64\Release\mesh.obj
+D:\projects\Doom3\neo\opengl\tess\normal.c;D:\projects\Doom3\neo\opengl\x64\Release\normal.obj
+D:\projects\Doom3\neo\opengl\tess\priorityq-heap.c;D:\projects\Doom3\neo\opengl\x64\Release\priorityq-heap.obj
+D:\projects\Doom3\neo\opengl\tess\priorityq.c;D:\projects\Doom3\neo\opengl\x64\Release\priorityq.obj
+D:\projects\Doom3\neo\opengl\tess\render.c;D:\projects\Doom3\neo\opengl\x64\Release\render.obj
+D:\projects\Doom3\neo\opengl\tess\sweep.c;D:\projects\Doom3\neo\opengl\x64\Release\sweep.obj
+D:\projects\Doom3\neo\opengl\tess\tess.c;D:\projects\Doom3\neo\opengl\x64\Release\tess.obj
+D:\projects\Doom3\neo\opengl\tess\tessellate.c;D:\projects\Doom3\neo\opengl\x64\Release\tessellate.obj
+D:\projects\Doom3\neo\opengl\tess\tessmono.c;D:\projects\Doom3\neo\opengl\x64\Release\tessmono.obj
diff --git a/neo/engine/opengl/x64/Release/opengl.tlog/Lib-link.read.1.tlog b/neo/engine/opengl/x64/Release/opengl.tlog/Lib-link.read.1.tlog
new file mode 100644
index 00000000..f959ae40
Binary files /dev/null and b/neo/engine/opengl/x64/Release/opengl.tlog/Lib-link.read.1.tlog differ
diff --git a/neo/engine/opengl/x64/Release/opengl.tlog/Lib-link.write.1.tlog b/neo/engine/opengl/x64/Release/opengl.tlog/Lib-link.write.1.tlog
new file mode 100644
index 00000000..9776f302
Binary files /dev/null and b/neo/engine/opengl/x64/Release/opengl.tlog/Lib-link.write.1.tlog differ
diff --git a/neo/engine/opengl/x64/Release/opengl.tlog/Lib.command.1.tlog b/neo/engine/opengl/x64/Release/opengl.tlog/Lib.command.1.tlog
new file mode 100644
index 00000000..338e609a
Binary files /dev/null and b/neo/engine/opengl/x64/Release/opengl.tlog/Lib.command.1.tlog differ
diff --git a/neo/engine/opengl/x64/Release/opengl.tlog/opengl.lastbuildstate b/neo/engine/opengl/x64/Release/opengl.tlog/opengl.lastbuildstate
new file mode 100644
index 00000000..05f9a0aa
--- /dev/null
+++ b/neo/engine/opengl/x64/Release/opengl.tlog/opengl.lastbuildstate
@@ -0,0 +1,2 @@
+PlatformToolSet=v145:VCToolArchitecture=Native64Bit:VCToolsVersion=14.50.35717:VCServicingVersionCompilers=14.50.35728:TargetPlatformVersion=10.0.26100.0:VcpkgTriplet=x64-windows:
+Release|x64|D:\projects\Doom3\neo\|
diff --git a/neo/engine/opengl/x64/Release/priorityq-heap.obj b/neo/engine/opengl/x64/Release/priorityq-heap.obj
new file mode 100644
index 00000000..a4f642fe
Binary files /dev/null and b/neo/engine/opengl/x64/Release/priorityq-heap.obj differ
diff --git a/neo/engine/opengl/x64/Release/priorityq.obj b/neo/engine/opengl/x64/Release/priorityq.obj
new file mode 100644
index 00000000..917cd863
Binary files /dev/null and b/neo/engine/opengl/x64/Release/priorityq.obj differ
diff --git a/neo/engine/opengl/x64/Release/render.obj b/neo/engine/opengl/x64/Release/render.obj
new file mode 100644
index 00000000..4dbcef88
Binary files /dev/null and b/neo/engine/opengl/x64/Release/render.obj differ
diff --git a/neo/engine/opengl/x64/Release/sweep.obj b/neo/engine/opengl/x64/Release/sweep.obj
new file mode 100644
index 00000000..4a28120b
Binary files /dev/null and b/neo/engine/opengl/x64/Release/sweep.obj differ
diff --git a/neo/engine/opengl/x64/Release/tess.obj b/neo/engine/opengl/x64/Release/tess.obj
new file mode 100644
index 00000000..5e2c6ebe
Binary files /dev/null and b/neo/engine/opengl/x64/Release/tess.obj differ
diff --git a/neo/engine/opengl/x64/Release/tessellate.obj b/neo/engine/opengl/x64/Release/tessellate.obj
new file mode 100644
index 00000000..32432395
Binary files /dev/null and b/neo/engine/opengl/x64/Release/tessellate.obj differ
diff --git a/neo/engine/opengl/x64/Release/tessmono.obj b/neo/engine/opengl/x64/Release/tessmono.obj
new file mode 100644
index 00000000..501af431
Binary files /dev/null and b/neo/engine/opengl/x64/Release/tessmono.obj differ
diff --git a/neo/renderer/Cinematic.cpp b/neo/engine/renderer/Cinematic.cpp
similarity index 100%
rename from neo/renderer/Cinematic.cpp
rename to neo/engine/renderer/Cinematic.cpp
diff --git a/neo/renderer/Cinematic.h b/neo/engine/renderer/Cinematic.h
similarity index 100%
rename from neo/renderer/Cinematic.h
rename to neo/engine/renderer/Cinematic.h
diff --git a/neo/renderer/DeviceContext.cpp b/neo/engine/renderer/DeviceContext.cpp
similarity index 100%
rename from neo/renderer/DeviceContext.cpp
rename to neo/engine/renderer/DeviceContext.cpp
diff --git a/neo/renderer/DeviceContext.h b/neo/engine/renderer/DeviceContext.h
similarity index 100%
rename from neo/renderer/DeviceContext.h
rename to neo/engine/renderer/DeviceContext.h
diff --git a/neo/renderer/GuiModel.cpp b/neo/engine/renderer/GuiModel.cpp
similarity index 100%
rename from neo/renderer/GuiModel.cpp
rename to neo/engine/renderer/GuiModel.cpp
diff --git a/neo/renderer/GuiModel.h b/neo/engine/renderer/GuiModel.h
similarity index 100%
rename from neo/renderer/GuiModel.h
rename to neo/engine/renderer/GuiModel.h
diff --git a/neo/renderer/Image.h b/neo/engine/renderer/Image.h
similarity index 100%
rename from neo/renderer/Image.h
rename to neo/engine/renderer/Image.h
diff --git a/neo/renderer/Image_files.cpp b/neo/engine/renderer/Image_files.cpp
similarity index 100%
rename from neo/renderer/Image_files.cpp
rename to neo/engine/renderer/Image_files.cpp
diff --git a/neo/renderer/Image_init.cpp b/neo/engine/renderer/Image_init.cpp
similarity index 100%
rename from neo/renderer/Image_init.cpp
rename to neo/engine/renderer/Image_init.cpp
diff --git a/neo/renderer/Image_load.cpp b/neo/engine/renderer/Image_load.cpp
similarity index 100%
rename from neo/renderer/Image_load.cpp
rename to neo/engine/renderer/Image_load.cpp
diff --git a/neo/renderer/Image_process.cpp b/neo/engine/renderer/Image_process.cpp
similarity index 100%
rename from neo/renderer/Image_process.cpp
rename to neo/engine/renderer/Image_process.cpp
diff --git a/neo/renderer/Image_program.cpp b/neo/engine/renderer/Image_program.cpp
similarity index 100%
rename from neo/renderer/Image_program.cpp
rename to neo/engine/renderer/Image_program.cpp
diff --git a/neo/renderer/Material.cpp b/neo/engine/renderer/Material.cpp
similarity index 100%
rename from neo/renderer/Material.cpp
rename to neo/engine/renderer/Material.cpp
diff --git a/neo/renderer/Material.h b/neo/engine/renderer/Material.h
similarity index 100%
rename from neo/renderer/Material.h
rename to neo/engine/renderer/Material.h
diff --git a/neo/renderer/RenderEntity.cpp b/neo/engine/renderer/RenderEntity.cpp
similarity index 100%
rename from neo/renderer/RenderEntity.cpp
rename to neo/engine/renderer/RenderEntity.cpp
diff --git a/neo/renderer/RenderSystem.cpp b/neo/engine/renderer/RenderSystem.cpp
similarity index 100%
rename from neo/renderer/RenderSystem.cpp
rename to neo/engine/renderer/RenderSystem.cpp
diff --git a/neo/renderer/RenderSystem.h b/neo/engine/renderer/RenderSystem.h
similarity index 100%
rename from neo/renderer/RenderSystem.h
rename to neo/engine/renderer/RenderSystem.h
diff --git a/neo/renderer/RenderSystem_init.cpp b/neo/engine/renderer/RenderSystem_init.cpp
similarity index 100%
rename from neo/renderer/RenderSystem_init.cpp
rename to neo/engine/renderer/RenderSystem_init.cpp
diff --git a/neo/renderer/RenderWorld.cpp b/neo/engine/renderer/RenderWorld.cpp
similarity index 100%
rename from neo/renderer/RenderWorld.cpp
rename to neo/engine/renderer/RenderWorld.cpp
diff --git a/neo/renderer/RenderWorld.h b/neo/engine/renderer/RenderWorld.h
similarity index 100%
rename from neo/renderer/RenderWorld.h
rename to neo/engine/renderer/RenderWorld.h
diff --git a/neo/renderer/RenderWorld_demo.cpp b/neo/engine/renderer/RenderWorld_demo.cpp
similarity index 100%
rename from neo/renderer/RenderWorld_demo.cpp
rename to neo/engine/renderer/RenderWorld_demo.cpp
diff --git a/neo/renderer/RenderWorld_load.cpp b/neo/engine/renderer/RenderWorld_load.cpp
similarity index 100%
rename from neo/renderer/RenderWorld_load.cpp
rename to neo/engine/renderer/RenderWorld_load.cpp
diff --git a/neo/renderer/RenderWorld_local.h b/neo/engine/renderer/RenderWorld_local.h
similarity index 100%
rename from neo/renderer/RenderWorld_local.h
rename to neo/engine/renderer/RenderWorld_local.h
diff --git a/neo/renderer/RenderWorld_portals.cpp b/neo/engine/renderer/RenderWorld_portals.cpp
similarity index 100%
rename from neo/renderer/RenderWorld_portals.cpp
rename to neo/engine/renderer/RenderWorld_portals.cpp
diff --git a/neo/renderer/VertexCache.cpp b/neo/engine/renderer/VertexCache.cpp
similarity index 100%
rename from neo/renderer/VertexCache.cpp
rename to neo/engine/renderer/VertexCache.cpp
diff --git a/neo/renderer/VertexCache.h b/neo/engine/renderer/VertexCache.h
similarity index 100%
rename from neo/renderer/VertexCache.h
rename to neo/engine/renderer/VertexCache.h
diff --git a/neo/renderer/draw_common.cpp b/neo/engine/renderer/draw_common.cpp
similarity index 100%
rename from neo/renderer/draw_common.cpp
rename to neo/engine/renderer/draw_common.cpp
diff --git a/neo/renderer/draw_dx.cpp b/neo/engine/renderer/draw_dx.cpp
similarity index 100%
rename from neo/renderer/draw_dx.cpp
rename to neo/engine/renderer/draw_dx.cpp
diff --git a/neo/renderer/simplex.h b/neo/engine/renderer/simplex.h
similarity index 100%
rename from neo/renderer/simplex.h
rename to neo/engine/renderer/simplex.h
diff --git a/neo/engine/renderer/stb_image.h b/neo/engine/renderer/stb_image.h
new file mode 100644
index 00000000..d4b5c87d
--- /dev/null
+++ b/neo/engine/renderer/stb_image.h
@@ -0,0 +1,7988 @@
+/* stb_image - v2.30 - public domain image loader - http://nothings.org/stb
+ no warranty implied; use at your own risk
+
+ Do this:
+ #define STB_IMAGE_IMPLEMENTATION
+ before you include this file in *one* C or C++ file to create the implementation.
+
+ // i.e. it should look like this:
+ #include ...
+ #include ...
+ #include ...
+ #define STB_IMAGE_IMPLEMENTATION
+ #include "stb_image.h"
+
+ You can #define STBI_ASSERT(x) before the #include to avoid using assert.h.
+ And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free
+
+
+ QUICK NOTES:
+ Primarily of interest to game developers and other people who can
+ avoid problematic images and only need the trivial interface
+
+ JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib)
+ PNG 1/2/4/8/16-bit-per-channel
+
+ TGA (not sure what subset, if a subset)
+ BMP non-1bpp, non-RLE
+ PSD (composited view only, no extra channels, 8/16 bit-per-channel)
+
+ GIF (*comp always reports as 4-channel)
+ HDR (radiance rgbE format)
+ PIC (Softimage PIC)
+ PNM (PPM and PGM binary only)
+
+ Animated GIF still needs a proper API, but here's one way to do it:
+ http://gist.github.com/urraka/685d9a6340b26b830d49
+
+ - decode from memory or through FILE (define STBI_NO_STDIO to remove code)
+ - decode from arbitrary I/O callbacks
+ - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON)
+
+ Full documentation under "DOCUMENTATION" below.
+
+
+LICENSE
+
+ See end of file for license information.
+
+RECENT REVISION HISTORY:
+
+ 2.30 (2024-05-31) avoid erroneous gcc warning
+ 2.29 (2023-05-xx) optimizations
+ 2.28 (2023-01-29) many error fixes, security errors, just tons of stuff
+ 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes
+ 2.26 (2020-07-13) many minor fixes
+ 2.25 (2020-02-02) fix warnings
+ 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically
+ 2.23 (2019-08-11) fix clang static analysis warning
+ 2.22 (2019-03-04) gif fixes, fix warnings
+ 2.21 (2019-02-25) fix typo in comment
+ 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
+ 2.19 (2018-02-11) fix warning
+ 2.18 (2018-01-30) fix warnings
+ 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings
+ 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes
+ 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC
+ 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs
+ 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes
+ 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes
+ 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64
+ RGB-format JPEG; remove white matting in PSD;
+ allocate large structures on the stack;
+ correct channel count for PNG & BMP
+ 2.10 (2016-01-22) avoid warning introduced in 2.09
+ 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED
+
+ See end of file for full revision history.
+
+
+ ============================ Contributors =========================
+
+ Image formats Extensions, features
+ Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info)
+ Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info)
+ Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG)
+ Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks)
+ Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG)
+ Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip)
+ Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD)
+ github:urraka (animated gif) Junggon Kim (PNM comments)
+ Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA)
+ socks-the-fox (16-bit PNG)
+ Jeremy Sawicki (handle all ImageNet JPGs)
+ Optimizations & bugfixes Mikhail Morozov (1-bit BMP)
+ Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query)
+ Arseny Kapoulkine Simon Breuss (16-bit PNM)
+ John-Mark Allen
+ Carmelo J Fdez-Aguera
+
+ Bug & warning fixes
+ Marc LeBlanc David Woo Guillaume George Martins Mozeiko
+ Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski
+ Phil Jordan Dave Moore Roy Eltham
+ Hayaki Saito Nathan Reed Won Chun
+ Luke Graham Johan Duparc Nick Verigakis the Horde3D community
+ Thomas Ruf Ronny Chevalier github:rlyeh
+ Janez Zemva John Bartholomew Michal Cichon github:romigrou
+ Jonathan Blow Ken Hamada Tero Hanninen github:svdijk
+ Eugene Golushkov Laurent Gomila Cort Stratton github:snagar
+ Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex
+ Cass Everitt Ryamond Barbiero github:grim210
+ Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw
+ Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus
+ Josh Tobin Neil Bickford Matthew Gregan github:poppolopoppo
+ Julian Raschke Gregory Mullen Christian Floisand github:darealshinji
+ Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007
+ Brad Weinberger Matvey Cherevko github:mosra
+ Luca Sas Alexander Veselov Zack Middleton [reserved]
+ Ryan C. Gordon [reserved] [reserved]
+ DO NOT ADD YOUR NAME HERE
+
+ Jacko Dirks
+
+ To add your name to the credits, pick a random blank space in the middle and fill it.
+ 80% of merge conflicts on stb PRs are due to people adding their name at the end
+ of the credits.
+*/
+
+#ifndef STBI_INCLUDE_STB_IMAGE_H
+#define STBI_INCLUDE_STB_IMAGE_H
+
+// DOCUMENTATION
+//
+// Limitations:
+// - no 12-bit-per-channel JPEG
+// - no JPEGs with arithmetic coding
+// - GIF always returns *comp=4
+//
+// Basic usage (see HDR discussion below for HDR usage):
+// int x,y,n;
+// unsigned char *data = stbi_load(filename, &x, &y, &n, 0);
+// // ... process data if not NULL ...
+// // ... x = width, y = height, n = # 8-bit components per pixel ...
+// // ... replace '0' with '1'..'4' to force that many components per pixel
+// // ... but 'n' will always be the number that it would have been if you said 0
+// stbi_image_free(data);
+//
+// Standard parameters:
+// int *x -- outputs image width in pixels
+// int *y -- outputs image height in pixels
+// int *channels_in_file -- outputs # of image components in image file
+// int desired_channels -- if non-zero, # of image components requested in result
+//
+// The return value from an image loader is an 'unsigned char *' which points
+// to the pixel data, or NULL on an allocation failure or if the image is
+// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels,
+// with each pixel consisting of N interleaved 8-bit components; the first
+// pixel pointed to is top-left-most in the image. There is no padding between
+// image scanlines or between pixels, regardless of format. The number of
+// components N is 'desired_channels' if desired_channels is non-zero, or
+// *channels_in_file otherwise. If desired_channels is non-zero,
+// *channels_in_file has the number of components that _would_ have been
+// output otherwise. E.g. if you set desired_channels to 4, you will always
+// get RGBA output, but you can check *channels_in_file to see if it's trivially
+// opaque because e.g. there were only 3 channels in the source image.
+//
+// An output image with N components has the following components interleaved
+// in this order in each pixel:
+//
+// N=#comp components
+// 1 grey
+// 2 grey, alpha
+// 3 red, green, blue
+// 4 red, green, blue, alpha
+//
+// If image loading fails for any reason, the return value will be NULL,
+// and *x, *y, *channels_in_file will be unchanged. The function
+// stbi_failure_reason() can be queried for an extremely brief, end-user
+// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS
+// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly
+// more user-friendly ones.
+//
+// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.
+//
+// To query the width, height and component count of an image without having to
+// decode the full file, you can use the stbi_info family of functions:
+//
+// int x,y,n,ok;
+// ok = stbi_info(filename, &x, &y, &n);
+// // returns ok=1 and sets x, y, n if image is a supported format,
+// // 0 otherwise.
+//
+// Note that stb_image pervasively uses ints in its public API for sizes,
+// including sizes of memory buffers. This is now part of the API and thus
+// hard to change without causing breakage. As a result, the various image
+// loaders all have certain limits on image size; these differ somewhat
+// by format but generally boil down to either just under 2GB or just under
+// 1GB. When the decoded image would be larger than this, stb_image decoding
+// will fail.
+//
+// Additionally, stb_image will reject image files that have any of their
+// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS,
+// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit,
+// the only way to have an image with such dimensions load correctly
+// is for it to have a rather extreme aspect ratio. Either way, the
+// assumption here is that such larger images are likely to be malformed
+// or malicious. If you do need to load an image with individual dimensions
+// larger than that, and it still fits in the overall size limit, you can
+// #define STBI_MAX_DIMENSIONS on your own to be something larger.
+//
+// ===========================================================================
+//
+// UNICODE:
+//
+// If compiling for Windows and you wish to use Unicode filenames, compile
+// with
+// #define STBI_WINDOWS_UTF8
+// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert
+// Windows wchar_t filenames to utf8.
+//
+// ===========================================================================
+//
+// Philosophy
+//
+// stb libraries are designed with the following priorities:
+//
+// 1. easy to use
+// 2. easy to maintain
+// 3. good performance
+//
+// Sometimes I let "good performance" creep up in priority over "easy to maintain",
+// and for best performance I may provide less-easy-to-use APIs that give higher
+// performance, in addition to the easy-to-use ones. Nevertheless, it's important
+// to keep in mind that from the standpoint of you, a client of this library,
+// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all.
+//
+// Some secondary priorities arise directly from the first two, some of which
+// provide more explicit reasons why performance can't be emphasized.
+//
+// - Portable ("ease of use")
+// - Small source code footprint ("easy to maintain")
+// - No dependencies ("ease of use")
+//
+// ===========================================================================
+//
+// I/O callbacks
+//
+// I/O callbacks allow you to read from arbitrary sources, like packaged
+// files or some other source. Data read from callbacks are processed
+// through a small internal buffer (currently 128 bytes) to try to reduce
+// overhead.
+//
+// The three functions you must define are "read" (reads some bytes of data),
+// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end).
+//
+// ===========================================================================
+//
+// SIMD support
+//
+// The JPEG decoder will try to automatically use SIMD kernels on x86 when
+// supported by the compiler. For ARM Neon support, you must explicitly
+// request it.
+//
+// (The old do-it-yourself SIMD API is no longer supported in the current
+// code.)
+//
+// On x86, SSE2 will automatically be used when available based on a run-time
+// test; if not, the generic C versions are used as a fall-back. On ARM targets,
+// the typical path is to have separate builds for NEON and non-NEON devices
+// (at least this is true for iOS and Android). Therefore, the NEON support is
+// toggled by a build flag: define STBI_NEON to get NEON loops.
+//
+// If for some reason you do not want to use any of SIMD code, or if
+// you have issues compiling it, you can disable it entirely by
+// defining STBI_NO_SIMD.
+//
+// ===========================================================================
+//
+// HDR image support (disable by defining STBI_NO_HDR)
+//
+// stb_image supports loading HDR images in general, and currently the Radiance
+// .HDR file format specifically. You can still load any file through the existing
+// interface; if you attempt to load an HDR file, it will be automatically remapped
+// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
+// both of these constants can be reconfigured through this interface:
+//
+// stbi_hdr_to_ldr_gamma(2.2f);
+// stbi_hdr_to_ldr_scale(1.0f);
+//
+// (note, do not use _inverse_ constants; stbi_image will invert them
+// appropriately).
+//
+// Additionally, there is a new, parallel interface for loading files as
+// (linear) floats to preserve the full dynamic range:
+//
+// float *data = stbi_loadf(filename, &x, &y, &n, 0);
+//
+// If you load LDR images through this interface, those images will
+// be promoted to floating point values, run through the inverse of
+// constants corresponding to the above:
+//
+// stbi_ldr_to_hdr_scale(1.0f);
+// stbi_ldr_to_hdr_gamma(2.2f);
+//
+// Finally, given a filename (or an open file or memory block--see header
+// file for details) containing image data, you can query for the "most
+// appropriate" interface to use (that is, whether the image is HDR or
+// not), using:
+//
+// stbi_is_hdr(char *filename);
+//
+// ===========================================================================
+//
+// iPhone PNG support:
+//
+// We optionally support converting iPhone-formatted PNGs (which store
+// premultiplied BGRA) back to RGB, even though they're internally encoded
+// differently. To enable this conversion, call
+// stbi_convert_iphone_png_to_rgb(1).
+//
+// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per
+// pixel to remove any premultiplied alpha *only* if the image file explicitly
+// says there's premultiplied data (currently only happens in iPhone images,
+// and only if iPhone convert-to-rgb processing is on).
+//
+// ===========================================================================
+//
+// ADDITIONAL CONFIGURATION
+//
+// - You can suppress implementation of any of the decoders to reduce
+// your code footprint by #defining one or more of the following
+// symbols before creating the implementation.
+//
+// STBI_NO_JPEG
+// STBI_NO_PNG
+// STBI_NO_BMP
+// STBI_NO_PSD
+// STBI_NO_TGA
+// STBI_NO_GIF
+// STBI_NO_HDR
+// STBI_NO_PIC
+// STBI_NO_PNM (.ppm and .pgm)
+//
+// - You can request *only* certain decoders and suppress all other ones
+// (this will be more forward-compatible, as addition of new decoders
+// doesn't require you to disable them explicitly):
+//
+// STBI_ONLY_JPEG
+// STBI_ONLY_PNG
+// STBI_ONLY_BMP
+// STBI_ONLY_PSD
+// STBI_ONLY_TGA
+// STBI_ONLY_GIF
+// STBI_ONLY_HDR
+// STBI_ONLY_PIC
+// STBI_ONLY_PNM (.ppm and .pgm)
+//
+// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still
+// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB
+//
+// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater
+// than that size (in either width or height) without further processing.
+// This is to let programs in the wild set an upper bound to prevent
+// denial-of-service attacks on untrusted data, as one could generate a
+// valid image of gigantic dimensions and force stb_image to allocate a
+// huge block of memory and spend disproportionate time decoding it. By
+// default this is set to (1 << 24), which is 16777216, but that's still
+// very big.
+
+#ifndef STBI_NO_STDIO
+#include
+#endif // STBI_NO_STDIO
+
+#define STBI_VERSION 1
+
+enum
+{
+ STBI_default = 0, // only used for desired_channels
+
+ STBI_grey = 1,
+ STBI_grey_alpha = 2,
+ STBI_rgb = 3,
+ STBI_rgb_alpha = 4
+};
+
+#include
+typedef unsigned char stbi_uc;
+typedef unsigned short stbi_us;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef STBIDEF
+#ifdef STB_IMAGE_STATIC
+#define STBIDEF static
+#else
+#define STBIDEF extern
+#endif
+#endif
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// PRIMARY API - works on images of any type
+//
+
+//
+// load image by filename, open file, or memory buffer
+//
+
+typedef struct
+{
+ int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read
+ void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative
+ int (*eof) (void *user); // returns nonzero if we are at end of file/data
+} stbi_io_callbacks;
+
+////////////////////////////////////
+//
+// 8-bits-per-channel interface
+//
+
+STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels);
+STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels);
+
+#ifndef STBI_NO_STDIO
+STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
+STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
+// for stbi_load_from_file, file pointer is left pointing immediately after image
+#endif
+
+#ifndef STBI_NO_GIF
+STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp);
+#endif
+
+#ifdef STBI_WINDOWS_UTF8
+STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input);
+#endif
+
+////////////////////////////////////
+//
+// 16-bits-per-channel interface
+//
+
+STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);
+STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels);
+
+#ifndef STBI_NO_STDIO
+STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
+STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
+#endif
+
+////////////////////////////////////
+//
+// float-per-channel interface
+//
+#ifndef STBI_NO_LINEAR
+ STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);
+ STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels);
+
+ #ifndef STBI_NO_STDIO
+ STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
+ STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
+ #endif
+#endif
+
+#ifndef STBI_NO_HDR
+ STBIDEF void stbi_hdr_to_ldr_gamma(float gamma);
+ STBIDEF void stbi_hdr_to_ldr_scale(float scale);
+#endif // STBI_NO_HDR
+
+#ifndef STBI_NO_LINEAR
+ STBIDEF void stbi_ldr_to_hdr_gamma(float gamma);
+ STBIDEF void stbi_ldr_to_hdr_scale(float scale);
+#endif // STBI_NO_LINEAR
+
+// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR
+STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);
+STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);
+#ifndef STBI_NO_STDIO
+STBIDEF int stbi_is_hdr (char const *filename);
+STBIDEF int stbi_is_hdr_from_file(FILE *f);
+#endif // STBI_NO_STDIO
+
+
+// get a VERY brief reason for failure
+// on most compilers (and ALL modern mainstream compilers) this is threadsafe
+STBIDEF const char *stbi_failure_reason (void);
+
+// free the loaded image -- this is just free()
+STBIDEF void stbi_image_free (void *retval_from_stbi_load);
+
+// get image dimensions & components without fully decoding
+STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
+STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp);
+STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len);
+STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user);
+
+#ifndef STBI_NO_STDIO
+STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp);
+STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp);
+STBIDEF int stbi_is_16_bit (char const *filename);
+STBIDEF int stbi_is_16_bit_from_file(FILE *f);
+#endif
+
+
+
+// for image formats that explicitly notate that they have premultiplied alpha,
+// we just return the colors as stored in the file. set this flag to force
+// unpremultiplication. results are undefined if the unpremultiply overflow.
+STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);
+
+// indicate whether we should process iphone images back to canonical format,
+// or just pass them through "as-is"
+STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);
+
+// flip the image vertically, so the first pixel in the output array is the bottom left
+STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip);
+
+// as above, but only applies to images loaded on the thread that calls the function
+// this function is only available if your compiler supports thread-local variables;
+// calling it will fail to link if your compiler doesn't
+STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply);
+STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert);
+STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip);
+
+// ZLIB client - used by PNG, available for other purposes
+
+STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);
+STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header);
+STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);
+STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
+
+STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);
+STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+//
+//
+//// end header file /////////////////////////////////////////////////////
+#endif // STBI_INCLUDE_STB_IMAGE_H
+
+#ifdef STB_IMAGE_IMPLEMENTATION
+
+#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
+ || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
+ || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
+ || defined(STBI_ONLY_ZLIB)
+ #ifndef STBI_ONLY_JPEG
+ #define STBI_NO_JPEG
+ #endif
+ #ifndef STBI_ONLY_PNG
+ #define STBI_NO_PNG
+ #endif
+ #ifndef STBI_ONLY_BMP
+ #define STBI_NO_BMP
+ #endif
+ #ifndef STBI_ONLY_PSD
+ #define STBI_NO_PSD
+ #endif
+ #ifndef STBI_ONLY_TGA
+ #define STBI_NO_TGA
+ #endif
+ #ifndef STBI_ONLY_GIF
+ #define STBI_NO_GIF
+ #endif
+ #ifndef STBI_ONLY_HDR
+ #define STBI_NO_HDR
+ #endif
+ #ifndef STBI_ONLY_PIC
+ #define STBI_NO_PIC
+ #endif
+ #ifndef STBI_ONLY_PNM
+ #define STBI_NO_PNM
+ #endif
+#endif
+
+#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
+#define STBI_NO_ZLIB
+#endif
+
+
+#include
+#include // ptrdiff_t on osx
+#include
+#include
+#include
+
+#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
+#include // ldexp, pow
+#endif
+
+#ifndef STBI_NO_STDIO
+#include
+#endif
+
+#ifndef STBI_ASSERT
+#include
+#define STBI_ASSERT(x) assert(x)
+#endif
+
+#ifdef __cplusplus
+#define STBI_EXTERN extern "C"
+#else
+#define STBI_EXTERN extern
+#endif
+
+
+#ifndef _MSC_VER
+ #ifdef __cplusplus
+ #define stbi_inline inline
+ #else
+ #define stbi_inline
+ #endif
+#else
+ #define stbi_inline __forceinline
+#endif
+
+#ifndef STBI_NO_THREAD_LOCALS
+ #if defined(__cplusplus) && __cplusplus >= 201103L
+ #define STBI_THREAD_LOCAL thread_local
+ #elif defined(__GNUC__) && __GNUC__ < 5
+ #define STBI_THREAD_LOCAL __thread
+ #elif defined(_MSC_VER)
+ #define STBI_THREAD_LOCAL __declspec(thread)
+ #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
+ #define STBI_THREAD_LOCAL _Thread_local
+ #endif
+
+ #ifndef STBI_THREAD_LOCAL
+ #if defined(__GNUC__)
+ #define STBI_THREAD_LOCAL __thread
+ #endif
+ #endif
+#endif
+
+#if defined(_MSC_VER) || defined(__SYMBIAN32__)
+typedef unsigned short stbi__uint16;
+typedef signed short stbi__int16;
+typedef unsigned int stbi__uint32;
+typedef signed int stbi__int32;
+#else
+#include
+typedef uint16_t stbi__uint16;
+typedef int16_t stbi__int16;
+typedef uint32_t stbi__uint32;
+typedef int32_t stbi__int32;
+#endif
+
+// should produce compiler error if size is wrong
+typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];
+
+#ifdef _MSC_VER
+#define STBI_NOTUSED(v) (void)(v)
+#else
+#define STBI_NOTUSED(v) (void)sizeof(v)
+#endif
+
+#ifdef _MSC_VER
+#define STBI_HAS_LROTL
+#endif
+
+#ifdef STBI_HAS_LROTL
+ #define stbi_lrot(x,y) _lrotl(x,y)
+#else
+ #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31)))
+#endif
+
+#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))
+// ok
+#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)
+// ok
+#else
+#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)."
+#endif
+
+#ifndef STBI_MALLOC
+#define STBI_MALLOC(sz) malloc(sz)
+#define STBI_REALLOC(p,newsz) realloc(p,newsz)
+#define STBI_FREE(p) free(p)
+#endif
+
+#ifndef STBI_REALLOC_SIZED
+#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)
+#endif
+
+// x86/x64 detection
+#if defined(__x86_64__) || defined(_M_X64)
+#define STBI__X64_TARGET
+#elif defined(__i386) || defined(_M_IX86)
+#define STBI__X86_TARGET
+#endif
+
+#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
+// gcc doesn't support sse2 intrinsics unless you compile with -msse2,
+// which in turn means it gets to use SSE2 everywhere. This is unfortunate,
+// but previous attempts to provide the SSE2 functions with runtime
+// detection caused numerous issues. The way architecture extensions are
+// exposed in GCC/Clang is, sadly, not really suited for one-file libs.
+// New behavior: if compiled with -msse2, we use SSE2 without any
+// detection; if not, we don't use it at all.
+#define STBI_NO_SIMD
+#endif
+
+#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)
+// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET
+//
+// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the
+// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant.
+// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not
+// simultaneously enabling "-mstackrealign".
+//
+// See https://github.com/nothings/stb/issues/81 for more information.
+//
+// So default to no SSE2 on 32-bit MinGW. If you've read this far and added
+// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2.
+#define STBI_NO_SIMD
+#endif
+
+#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))
+#define STBI_SSE2
+#include
+
+#ifdef _MSC_VER
+
+#if _MSC_VER >= 1400 // not VC6
+#include // __cpuid
+static int stbi__cpuid3(void)
+{
+ int info[4];
+ __cpuid(info,1);
+ return info[3];
+}
+#else
+static int stbi__cpuid3(void)
+{
+ int res;
+ __asm {
+ mov eax,1
+ cpuid
+ mov res,edx
+ }
+ return res;
+}
+#endif
+
+#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
+
+#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
+static int stbi__sse2_available(void)
+{
+ int info3 = stbi__cpuid3();
+ return ((info3 >> 26) & 1) != 0;
+}
+#endif
+
+#else // assume GCC-style if not VC++
+#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
+
+#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
+static int stbi__sse2_available(void)
+{
+ // If we're even attempting to compile this on GCC/Clang, that means
+ // -msse2 is on, which means the compiler is allowed to use SSE2
+ // instructions at will, and so are we.
+ return 1;
+}
+#endif
+
+#endif
+#endif
+
+// ARM NEON
+#if defined(STBI_NO_SIMD) && defined(STBI_NEON)
+#undef STBI_NEON
+#endif
+
+#ifdef STBI_NEON
+#include
+#ifdef _MSC_VER
+#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
+#else
+#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
+#endif
+#endif
+
+#ifndef STBI_SIMD_ALIGN
+#define STBI_SIMD_ALIGN(type, name) type name
+#endif
+
+#ifndef STBI_MAX_DIMENSIONS
+#define STBI_MAX_DIMENSIONS (1 << 24)
+#endif
+
+///////////////////////////////////////////////
+//
+// stbi__context struct and start_xxx functions
+
+// stbi__context structure is our basic context used by all images, so it
+// contains all the IO context, plus some basic image information
+typedef struct
+{
+ stbi__uint32 img_x, img_y;
+ int img_n, img_out_n;
+
+ stbi_io_callbacks io;
+ void *io_user_data;
+
+ int read_from_callbacks;
+ int buflen;
+ stbi_uc buffer_start[128];
+ int callback_already_read;
+
+ stbi_uc *img_buffer, *img_buffer_end;
+ stbi_uc *img_buffer_original, *img_buffer_original_end;
+} stbi__context;
+
+
+static void stbi__refill_buffer(stbi__context *s);
+
+// initialize a memory-decode context
+static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len)
+{
+ s->io.read = NULL;
+ s->read_from_callbacks = 0;
+ s->callback_already_read = 0;
+ s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;
+ s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;
+}
+
+// initialize a callback-based context
+static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user)
+{
+ s->io = *c;
+ s->io_user_data = user;
+ s->buflen = sizeof(s->buffer_start);
+ s->read_from_callbacks = 1;
+ s->callback_already_read = 0;
+ s->img_buffer = s->img_buffer_original = s->buffer_start;
+ stbi__refill_buffer(s);
+ s->img_buffer_original_end = s->img_buffer_end;
+}
+
+#ifndef STBI_NO_STDIO
+
+static int stbi__stdio_read(void *user, char *data, int size)
+{
+ return (int) fread(data,1,size,(FILE*) user);
+}
+
+static void stbi__stdio_skip(void *user, int n)
+{
+ int ch;
+ fseek((FILE*) user, n, SEEK_CUR);
+ ch = fgetc((FILE*) user); /* have to read a byte to reset feof()'s flag */
+ if (ch != EOF) {
+ ungetc(ch, (FILE *) user); /* push byte back onto stream if valid. */
+ }
+}
+
+static int stbi__stdio_eof(void *user)
+{
+ return feof((FILE*) user) || ferror((FILE *) user);
+}
+
+static stbi_io_callbacks stbi__stdio_callbacks =
+{
+ stbi__stdio_read,
+ stbi__stdio_skip,
+ stbi__stdio_eof,
+};
+
+static void stbi__start_file(stbi__context *s, FILE *f)
+{
+ stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f);
+}
+
+//static void stop_file(stbi__context *s) { }
+
+#endif // !STBI_NO_STDIO
+
+static void stbi__rewind(stbi__context *s)
+{
+ // conceptually rewind SHOULD rewind to the beginning of the stream,
+ // but we just rewind to the beginning of the initial buffer, because
+ // we only use it after doing 'test', which only ever looks at at most 92 bytes
+ s->img_buffer = s->img_buffer_original;
+ s->img_buffer_end = s->img_buffer_original_end;
+}
+
+enum
+{
+ STBI_ORDER_RGB,
+ STBI_ORDER_BGR
+};
+
+typedef struct
+{
+ int bits_per_channel;
+ int num_channels;
+ int channel_order;
+} stbi__result_info;
+
+#ifndef STBI_NO_JPEG
+static int stbi__jpeg_test(stbi__context *s);
+static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
+static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);
+#endif
+
+#ifndef STBI_NO_PNG
+static int stbi__png_test(stbi__context *s);
+static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
+static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp);
+static int stbi__png_is16(stbi__context *s);
+#endif
+
+#ifndef STBI_NO_BMP
+static int stbi__bmp_test(stbi__context *s);
+static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
+static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp);
+#endif
+
+#ifndef STBI_NO_TGA
+static int stbi__tga_test(stbi__context *s);
+static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
+static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);
+#endif
+
+#ifndef STBI_NO_PSD
+static int stbi__psd_test(stbi__context *s);
+static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc);
+static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp);
+static int stbi__psd_is16(stbi__context *s);
+#endif
+
+#ifndef STBI_NO_HDR
+static int stbi__hdr_test(stbi__context *s);
+static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
+static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp);
+#endif
+
+#ifndef STBI_NO_PIC
+static int stbi__pic_test(stbi__context *s);
+static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
+static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp);
+#endif
+
+#ifndef STBI_NO_GIF
+static int stbi__gif_test(stbi__context *s);
+static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
+static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp);
+static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);
+#endif
+
+#ifndef STBI_NO_PNM
+static int stbi__pnm_test(stbi__context *s);
+static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
+static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);
+static int stbi__pnm_is16(stbi__context *s);
+#endif
+
+static
+#ifdef STBI_THREAD_LOCAL
+STBI_THREAD_LOCAL
+#endif
+const char *stbi__g_failure_reason;
+
+STBIDEF const char *stbi_failure_reason(void)
+{
+ return stbi__g_failure_reason;
+}
+
+#ifndef STBI_NO_FAILURE_STRINGS
+static int stbi__err(const char *str)
+{
+ stbi__g_failure_reason = str;
+ return 0;
+}
+#endif
+
+static void *stbi__malloc(size_t size)
+{
+ return STBI_MALLOC(size);
+}
+
+// stb_image uses ints pervasively, including for offset calculations.
+// therefore the largest decoded image size we can support with the
+// current code, even on 64-bit targets, is INT_MAX. this is not a
+// significant limitation for the intended use case.
+//
+// we do, however, need to make sure our size calculations don't
+// overflow. hence a few helper functions for size calculations that
+// multiply integers together, making sure that they're non-negative
+// and no overflow occurs.
+
+// return 1 if the sum is valid, 0 on overflow.
+// negative terms are considered invalid.
+static int stbi__addsizes_valid(int a, int b)
+{
+ if (b < 0) return 0;
+ // now 0 <= b <= INT_MAX, hence also
+ // 0 <= INT_MAX - b <= INTMAX.
+ // And "a + b <= INT_MAX" (which might overflow) is the
+ // same as a <= INT_MAX - b (no overflow)
+ return a <= INT_MAX - b;
+}
+
+// returns 1 if the product is valid, 0 on overflow.
+// negative factors are considered invalid.
+static int stbi__mul2sizes_valid(int a, int b)
+{
+ if (a < 0 || b < 0) return 0;
+ if (b == 0) return 1; // mul-by-0 is always safe
+ // portable way to check for no overflows in a*b
+ return a <= INT_MAX/b;
+}
+
+#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
+// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow
+static int stbi__mad2sizes_valid(int a, int b, int add)
+{
+ return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);
+}
+#endif
+
+// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow
+static int stbi__mad3sizes_valid(int a, int b, int c, int add)
+{
+ return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
+ stbi__addsizes_valid(a*b*c, add);
+}
+
+// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow
+#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
+static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add)
+{
+ return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
+ stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);
+}
+#endif
+
+#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
+// mallocs with size overflow checking
+static void *stbi__malloc_mad2(int a, int b, int add)
+{
+ if (!stbi__mad2sizes_valid(a, b, add)) return NULL;
+ return stbi__malloc(a*b + add);
+}
+#endif
+
+static void *stbi__malloc_mad3(int a, int b, int c, int add)
+{
+ if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL;
+ return stbi__malloc(a*b*c + add);
+}
+
+#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
+static void *stbi__malloc_mad4(int a, int b, int c, int d, int add)
+{
+ if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL;
+ return stbi__malloc(a*b*c*d + add);
+}
+#endif
+
+// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow.
+static int stbi__addints_valid(int a, int b)
+{
+ if ((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow
+ if (a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0.
+ return a <= INT_MAX - b;
+}
+
+// returns 1 if the product of two ints fits in a signed short, 0 on overflow.
+static int stbi__mul2shorts_valid(int a, int b)
+{
+ if (b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow
+ if ((a >= 0) == (b >= 0)) return a <= SHRT_MAX/b; // product is positive, so similar to mul2sizes_valid
+ if (b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN
+ return a >= SHRT_MIN / b;
+}
+
+// stbi__err - error
+// stbi__errpf - error returning pointer to float
+// stbi__errpuc - error returning pointer to unsigned char
+
+#ifdef STBI_NO_FAILURE_STRINGS
+ #define stbi__err(x,y) 0
+#elif defined(STBI_FAILURE_USERMSG)
+ #define stbi__err(x,y) stbi__err(y)
+#else
+ #define stbi__err(x,y) stbi__err(x)
+#endif
+
+#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))
+#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))
+
+STBIDEF void stbi_image_free(void *retval_from_stbi_load)
+{
+ STBI_FREE(retval_from_stbi_load);
+}
+
+#ifndef STBI_NO_LINEAR
+static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);
+#endif
+
+#ifndef STBI_NO_HDR
+static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp);
+#endif
+
+static int stbi__vertically_flip_on_load_global = 0;
+
+STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)
+{
+ stbi__vertically_flip_on_load_global = flag_true_if_should_flip;
+}
+
+#ifndef STBI_THREAD_LOCAL
+#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global
+#else
+static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set;
+
+STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip)
+{
+ stbi__vertically_flip_on_load_local = flag_true_if_should_flip;
+ stbi__vertically_flip_on_load_set = 1;
+}
+
+#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \
+ ? stbi__vertically_flip_on_load_local \
+ : stbi__vertically_flip_on_load_global)
+#endif // STBI_THREAD_LOCAL
+
+static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)
+{
+ memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields
+ ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed
+ ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order
+ ri->num_channels = 0;
+
+ // test the formats with a very explicit header first (at least a FOURCC
+ // or distinctive magic number first)
+ #ifndef STBI_NO_PNG
+ if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri);
+ #endif
+ #ifndef STBI_NO_BMP
+ if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri);
+ #endif
+ #ifndef STBI_NO_GIF
+ if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri);
+ #endif
+ #ifndef STBI_NO_PSD
+ if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc);
+ #else
+ STBI_NOTUSED(bpc);
+ #endif
+ #ifndef STBI_NO_PIC
+ if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri);
+ #endif
+
+ // then the formats that can end up attempting to load with just 1 or 2
+ // bytes matching expectations; these are prone to false positives, so
+ // try them later
+ #ifndef STBI_NO_JPEG
+ if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri);
+ #endif
+ #ifndef STBI_NO_PNM
+ if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri);
+ #endif
+
+ #ifndef STBI_NO_HDR
+ if (stbi__hdr_test(s)) {
+ float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri);
+ return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
+ }
+ #endif
+
+ #ifndef STBI_NO_TGA
+ // test tga last because it's a crappy test!
+ if (stbi__tga_test(s))
+ return stbi__tga_load(s,x,y,comp,req_comp, ri);
+ #endif
+
+ return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt");
+}
+
+static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels)
+{
+ int i;
+ int img_len = w * h * channels;
+ stbi_uc *reduced;
+
+ reduced = (stbi_uc *) stbi__malloc(img_len);
+ if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory");
+
+ for (i = 0; i < img_len; ++i)
+ reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling
+
+ STBI_FREE(orig);
+ return reduced;
+}
+
+static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels)
+{
+ int i;
+ int img_len = w * h * channels;
+ stbi__uint16 *enlarged;
+
+ enlarged = (stbi__uint16 *) stbi__malloc(img_len*2);
+ if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory");
+
+ for (i = 0; i < img_len; ++i)
+ enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff
+
+ STBI_FREE(orig);
+ return enlarged;
+}
+
+static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel)
+{
+ int row;
+ size_t bytes_per_row = (size_t)w * bytes_per_pixel;
+ stbi_uc temp[2048];
+ stbi_uc *bytes = (stbi_uc *)image;
+
+ for (row = 0; row < (h>>1); row++) {
+ stbi_uc *row0 = bytes + row*bytes_per_row;
+ stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row;
+ // swap row0 with row1
+ size_t bytes_left = bytes_per_row;
+ while (bytes_left) {
+ size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp);
+ memcpy(temp, row0, bytes_copy);
+ memcpy(row0, row1, bytes_copy);
+ memcpy(row1, temp, bytes_copy);
+ row0 += bytes_copy;
+ row1 += bytes_copy;
+ bytes_left -= bytes_copy;
+ }
+ }
+}
+
+#ifndef STBI_NO_GIF
+static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel)
+{
+ int slice;
+ int slice_size = w * h * bytes_per_pixel;
+
+ stbi_uc *bytes = (stbi_uc *)image;
+ for (slice = 0; slice < z; ++slice) {
+ stbi__vertical_flip(bytes, w, h, bytes_per_pixel);
+ bytes += slice_size;
+ }
+}
+#endif
+
+static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
+{
+ stbi__result_info ri;
+ void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
+
+ if (result == NULL)
+ return NULL;
+
+ // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.
+ STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
+
+ if (ri.bits_per_channel != 8) {
+ result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
+ ri.bits_per_channel = 8;
+ }
+
+ // @TODO: move stbi__convert_format to here
+
+ if (stbi__vertically_flip_on_load) {
+ int channels = req_comp ? req_comp : *comp;
+ stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc));
+ }
+
+ return (unsigned char *) result;
+}
+
+static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
+{
+ stbi__result_info ri;
+ void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
+
+ if (result == NULL)
+ return NULL;
+
+ // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.
+ STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
+
+ if (ri.bits_per_channel != 16) {
+ result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
+ ri.bits_per_channel = 16;
+ }
+
+ // @TODO: move stbi__convert_format16 to here
+ // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision
+
+ if (stbi__vertically_flip_on_load) {
+ int channels = req_comp ? req_comp : *comp;
+ stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16));
+ }
+
+ return (stbi__uint16 *) result;
+}
+
+#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR)
+static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp)
+{
+ if (stbi__vertically_flip_on_load && result != NULL) {
+ int channels = req_comp ? req_comp : *comp;
+ stbi__vertical_flip(result, *x, *y, channels * sizeof(float));
+ }
+}
+#endif
+
+#ifndef STBI_NO_STDIO
+
+#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
+STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide);
+STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default);
+#endif
+
+#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
+STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input)
+{
+ return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL);
+}
+#endif
+
+static FILE *stbi__fopen(char const *filename, char const *mode)
+{
+ FILE *f;
+#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
+ wchar_t wMode[64];
+ wchar_t wFilename[1024];
+ if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename)))
+ return 0;
+
+ if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode)))
+ return 0;
+
+#if defined(_MSC_VER) && _MSC_VER >= 1400
+ if (0 != _wfopen_s(&f, wFilename, wMode))
+ f = 0;
+#else
+ f = _wfopen(wFilename, wMode);
+#endif
+
+#elif defined(_MSC_VER) && _MSC_VER >= 1400
+ if (0 != fopen_s(&f, filename, mode))
+ f=0;
+#else
+ f = fopen(filename, mode);
+#endif
+ return f;
+}
+
+
+STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)
+{
+ FILE *f = stbi__fopen(filename, "rb");
+ unsigned char *result;
+ if (!f) return stbi__errpuc("can't fopen", "Unable to open file");
+ result = stbi_load_from_file(f,x,y,comp,req_comp);
+ fclose(f);
+ return result;
+}
+
+STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
+{
+ unsigned char *result;
+ stbi__context s;
+ stbi__start_file(&s,f);
+ result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
+ if (result) {
+ // need to 'unget' all the characters in the IO buffer
+ fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
+ }
+ return result;
+}
+
+STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp)
+{
+ stbi__uint16 *result;
+ stbi__context s;
+ stbi__start_file(&s,f);
+ result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp);
+ if (result) {
+ // need to 'unget' all the characters in the IO buffer
+ fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
+ }
+ return result;
+}
+
+STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp)
+{
+ FILE *f = stbi__fopen(filename, "rb");
+ stbi__uint16 *result;
+ if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file");
+ result = stbi_load_from_file_16(f,x,y,comp,req_comp);
+ fclose(f);
+ return result;
+}
+
+
+#endif //!STBI_NO_STDIO
+
+STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels)
+{
+ stbi__context s;
+ stbi__start_mem(&s,buffer,len);
+ return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
+}
+
+STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels)
+{
+ stbi__context s;
+ stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user);
+ return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
+}
+
+STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
+{
+ stbi__context s;
+ stbi__start_mem(&s,buffer,len);
+ return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
+}
+
+STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
+{
+ stbi__context s;
+ stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
+ return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
+}
+
+#ifndef STBI_NO_GIF
+STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
+{
+ unsigned char *result;
+ stbi__context s;
+ stbi__start_mem(&s,buffer,len);
+
+ result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);
+ if (stbi__vertically_flip_on_load) {
+ stbi__vertical_flip_slices( result, *x, *y, *z, *comp );
+ }
+
+ return result;
+}
+#endif
+
+#ifndef STBI_NO_LINEAR
+static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
+{
+ unsigned char *data;
+ #ifndef STBI_NO_HDR
+ if (stbi__hdr_test(s)) {
+ stbi__result_info ri;
+ float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri);
+ if (hdr_data)
+ stbi__float_postprocess(hdr_data,x,y,comp,req_comp);
+ return hdr_data;
+ }
+ #endif
+ data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);
+ if (data)
+ return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
+ return stbi__errpf("unknown image type", "Image not of any known type, or corrupt");
+}
+
+STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
+{
+ stbi__context s;
+ stbi__start_mem(&s,buffer,len);
+ return stbi__loadf_main(&s,x,y,comp,req_comp);
+}
+
+STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
+{
+ stbi__context s;
+ stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
+ return stbi__loadf_main(&s,x,y,comp,req_comp);
+}
+
+#ifndef STBI_NO_STDIO
+STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)
+{
+ float *result;
+ FILE *f = stbi__fopen(filename, "rb");
+ if (!f) return stbi__errpf("can't fopen", "Unable to open file");
+ result = stbi_loadf_from_file(f,x,y,comp,req_comp);
+ fclose(f);
+ return result;
+}
+
+STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
+{
+ stbi__context s;
+ stbi__start_file(&s,f);
+ return stbi__loadf_main(&s,x,y,comp,req_comp);
+}
+#endif // !STBI_NO_STDIO
+
+#endif // !STBI_NO_LINEAR
+
+// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is
+// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always
+// reports false!
+
+STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
+{
+ #ifndef STBI_NO_HDR
+ stbi__context s;
+ stbi__start_mem(&s,buffer,len);
+ return stbi__hdr_test(&s);
+ #else
+ STBI_NOTUSED(buffer);
+ STBI_NOTUSED(len);
+ return 0;
+ #endif
+}
+
+#ifndef STBI_NO_STDIO
+STBIDEF int stbi_is_hdr (char const *filename)
+{
+ FILE *f = stbi__fopen(filename, "rb");
+ int result=0;
+ if (f) {
+ result = stbi_is_hdr_from_file(f);
+ fclose(f);
+ }
+ return result;
+}
+
+STBIDEF int stbi_is_hdr_from_file(FILE *f)
+{
+ #ifndef STBI_NO_HDR
+ long pos = ftell(f);
+ int res;
+ stbi__context s;
+ stbi__start_file(&s,f);
+ res = stbi__hdr_test(&s);
+ fseek(f, pos, SEEK_SET);
+ return res;
+ #else
+ STBI_NOTUSED(f);
+ return 0;
+ #endif
+}
+#endif // !STBI_NO_STDIO
+
+STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)
+{
+ #ifndef STBI_NO_HDR
+ stbi__context s;
+ stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
+ return stbi__hdr_test(&s);
+ #else
+ STBI_NOTUSED(clbk);
+ STBI_NOTUSED(user);
+ return 0;
+ #endif
+}
+
+#ifndef STBI_NO_LINEAR
+static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
+
+STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }
+STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }
+#endif
+
+static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
+
+STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }
+STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// Common code used by all image loaders
+//
+
+enum
+{
+ STBI__SCAN_load=0,
+ STBI__SCAN_type,
+ STBI__SCAN_header
+};
+
+static void stbi__refill_buffer(stbi__context *s)
+{
+ int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen);
+ s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original);
+ if (n == 0) {
+ // at end of file, treat same as if from memory, but need to handle case
+ // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file
+ s->read_from_callbacks = 0;
+ s->img_buffer = s->buffer_start;
+ s->img_buffer_end = s->buffer_start+1;
+ *s->img_buffer = 0;
+ } else {
+ s->img_buffer = s->buffer_start;
+ s->img_buffer_end = s->buffer_start + n;
+ }
+}
+
+stbi_inline static stbi_uc stbi__get8(stbi__context *s)
+{
+ if (s->img_buffer < s->img_buffer_end)
+ return *s->img_buffer++;
+ if (s->read_from_callbacks) {
+ stbi__refill_buffer(s);
+ return *s->img_buffer++;
+ }
+ return 0;
+}
+
+#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
+// nothing
+#else
+stbi_inline static int stbi__at_eof(stbi__context *s)
+{
+ if (s->io.read) {
+ if (!(s->io.eof)(s->io_user_data)) return 0;
+ // if feof() is true, check if buffer = end
+ // special case: we've only got the special 0 character at the end
+ if (s->read_from_callbacks == 0) return 1;
+ }
+
+ return s->img_buffer >= s->img_buffer_end;
+}
+#endif
+
+#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC)
+// nothing
+#else
+static void stbi__skip(stbi__context *s, int n)
+{
+ if (n == 0) return; // already there!
+ if (n < 0) {
+ s->img_buffer = s->img_buffer_end;
+ return;
+ }
+ if (s->io.read) {
+ int blen = (int) (s->img_buffer_end - s->img_buffer);
+ if (blen < n) {
+ s->img_buffer = s->img_buffer_end;
+ (s->io.skip)(s->io_user_data, n - blen);
+ return;
+ }
+ }
+ s->img_buffer += n;
+}
+#endif
+
+#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM)
+// nothing
+#else
+static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)
+{
+ if (s->io.read) {
+ int blen = (int) (s->img_buffer_end - s->img_buffer);
+ if (blen < n) {
+ int res, count;
+
+ memcpy(buffer, s->img_buffer, blen);
+
+ count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen);
+ res = (count == (n-blen));
+ s->img_buffer = s->img_buffer_end;
+ return res;
+ }
+ }
+
+ if (s->img_buffer+n <= s->img_buffer_end) {
+ memcpy(buffer, s->img_buffer, n);
+ s->img_buffer += n;
+ return 1;
+ } else
+ return 0;
+}
+#endif
+
+#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
+// nothing
+#else
+static int stbi__get16be(stbi__context *s)
+{
+ int z = stbi__get8(s);
+ return (z << 8) + stbi__get8(s);
+}
+#endif
+
+#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
+// nothing
+#else
+static stbi__uint32 stbi__get32be(stbi__context *s)
+{
+ stbi__uint32 z = stbi__get16be(s);
+ return (z << 16) + stbi__get16be(s);
+}
+#endif
+
+#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
+// nothing
+#else
+static int stbi__get16le(stbi__context *s)
+{
+ int z = stbi__get8(s);
+ return z + (stbi__get8(s) << 8);
+}
+#endif
+
+#ifndef STBI_NO_BMP
+static stbi__uint32 stbi__get32le(stbi__context *s)
+{
+ stbi__uint32 z = stbi__get16le(s);
+ z += (stbi__uint32)stbi__get16le(s) << 16;
+ return z;
+}
+#endif
+
+#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings
+
+#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
+// nothing
+#else
+//////////////////////////////////////////////////////////////////////////////
+//
+// generic converter from built-in img_n to req_comp
+// individual types do this automatically as much as possible (e.g. jpeg
+// does all cases internally since it needs to colorspace convert anyway,
+// and it never has alpha, so very few cases ). png can automatically
+// interleave an alpha=255 channel, but falls back to this for other cases
+//
+// assume data buffer is malloced, so malloc a new one and free that one
+// only failure mode is malloc failing
+
+static stbi_uc stbi__compute_y(int r, int g, int b)
+{
+ return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8);
+}
+#endif
+
+#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
+// nothing
+#else
+static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y)
+{
+ int i,j;
+ unsigned char *good;
+
+ if (req_comp == img_n) return data;
+ STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
+
+ good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);
+ if (good == NULL) {
+ STBI_FREE(data);
+ return stbi__errpuc("outofmem", "Out of memory");
+ }
+
+ for (j=0; j < (int) y; ++j) {
+ unsigned char *src = data + j * x * img_n ;
+ unsigned char *dest = good + j * x * req_comp;
+
+ #define STBI__COMBO(a,b) ((a)*8+(b))
+ #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
+ // convert source image with img_n components to one with req_comp components;
+ // avoid switch per pixel, so use switch per scanline and massive macros
+ switch (STBI__COMBO(img_n, req_comp)) {
+ STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break;
+ STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
+ STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break;
+ STBI__CASE(2,1) { dest[0]=src[0]; } break;
+ STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
+ STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break;
+ STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break;
+ STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break;
+ STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break;
+ STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break;
+ STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break;
+ STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break;
+ default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion");
+ }
+ #undef STBI__CASE
+ }
+
+ STBI_FREE(data);
+ return good;
+}
+#endif
+
+#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
+// nothing
+#else
+static stbi__uint16 stbi__compute_y_16(int r, int g, int b)
+{
+ return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8);
+}
+#endif
+
+#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
+// nothing
+#else
+static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y)
+{
+ int i,j;
+ stbi__uint16 *good;
+
+ if (req_comp == img_n) return data;
+ STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
+
+ good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);
+ if (good == NULL) {
+ STBI_FREE(data);
+ return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory");
+ }
+
+ for (j=0; j < (int) y; ++j) {
+ stbi__uint16 *src = data + j * x * img_n ;
+ stbi__uint16 *dest = good + j * x * req_comp;
+
+ #define STBI__COMBO(a,b) ((a)*8+(b))
+ #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
+ // convert source image with img_n components to one with req_comp components;
+ // avoid switch per pixel, so use switch per scanline and massive macros
+ switch (STBI__COMBO(img_n, req_comp)) {
+ STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break;
+ STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
+ STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break;
+ STBI__CASE(2,1) { dest[0]=src[0]; } break;
+ STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
+ STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break;
+ STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break;
+ STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break;
+ STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break;
+ STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break;
+ STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break;
+ STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break;
+ default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion");
+ }
+ #undef STBI__CASE
+ }
+
+ STBI_FREE(data);
+ return good;
+}
+#endif
+
+#ifndef STBI_NO_LINEAR
+static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
+{
+ int i,k,n;
+ float *output;
+ if (!data) return NULL;
+ output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0);
+ if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); }
+ // compute number of non-alpha components
+ if (comp & 1) n = comp; else n = comp-1;
+ for (i=0; i < x*y; ++i) {
+ for (k=0; k < n; ++k) {
+ output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
+ }
+ }
+ if (n < comp) {
+ for (i=0; i < x*y; ++i) {
+ output[i*comp + n] = data[i*comp + n]/255.0f;
+ }
+ }
+ STBI_FREE(data);
+ return output;
+}
+#endif
+
+#ifndef STBI_NO_HDR
+#define stbi__float2int(x) ((int) (x))
+static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp)
+{
+ int i,k,n;
+ stbi_uc *output;
+ if (!data) return NULL;
+ output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0);
+ if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); }
+ // compute number of non-alpha components
+ if (comp & 1) n = comp; else n = comp-1;
+ for (i=0; i < x*y; ++i) {
+ for (k=0; k < n; ++k) {
+ float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
+ if (z < 0) z = 0;
+ if (z > 255) z = 255;
+ output[i*comp + k] = (stbi_uc) stbi__float2int(z);
+ }
+ if (k < comp) {
+ float z = data[i*comp+k] * 255 + 0.5f;
+ if (z < 0) z = 0;
+ if (z > 255) z = 255;
+ output[i*comp + k] = (stbi_uc) stbi__float2int(z);
+ }
+ }
+ STBI_FREE(data);
+ return output;
+}
+#endif
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// "baseline" JPEG/JFIF decoder
+//
+// simple implementation
+// - doesn't support delayed output of y-dimension
+// - simple interface (only one output format: 8-bit interleaved RGB)
+// - doesn't try to recover corrupt jpegs
+// - doesn't allow partial loading, loading multiple at once
+// - still fast on x86 (copying globals into locals doesn't help x86)
+// - allocates lots of intermediate memory (full size of all components)
+// - non-interleaved case requires this anyway
+// - allows good upsampling (see next)
+// high-quality
+// - upsampled channels are bilinearly interpolated, even across blocks
+// - quality integer IDCT derived from IJG's 'slow'
+// performance
+// - fast huffman; reasonable integer IDCT
+// - some SIMD kernels for common paths on targets with SSE2/NEON
+// - uses a lot of intermediate memory, could cache poorly
+
+#ifndef STBI_NO_JPEG
+
+// huffman decoding acceleration
+#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache
+
+typedef struct
+{
+ stbi_uc fast[1 << FAST_BITS];
+ // weirdly, repacking this into AoS is a 10% speed loss, instead of a win
+ stbi__uint16 code[256];
+ stbi_uc values[256];
+ stbi_uc size[257];
+ unsigned int maxcode[18];
+ int delta[17]; // old 'firstsymbol' - old 'firstcode'
+} stbi__huffman;
+
+typedef struct
+{
+ stbi__context *s;
+ stbi__huffman huff_dc[4];
+ stbi__huffman huff_ac[4];
+ stbi__uint16 dequant[4][64];
+ stbi__int16 fast_ac[4][1 << FAST_BITS];
+
+// sizes for components, interleaved MCUs
+ int img_h_max, img_v_max;
+ int img_mcu_x, img_mcu_y;
+ int img_mcu_w, img_mcu_h;
+
+// definition of jpeg image component
+ struct
+ {
+ int id;
+ int h,v;
+ int tq;
+ int hd,ha;
+ int dc_pred;
+
+ int x,y,w2,h2;
+ stbi_uc *data;
+ void *raw_data, *raw_coeff;
+ stbi_uc *linebuf;
+ short *coeff; // progressive only
+ int coeff_w, coeff_h; // number of 8x8 coefficient blocks
+ } img_comp[4];
+
+ stbi__uint32 code_buffer; // jpeg entropy-coded buffer
+ int code_bits; // number of valid bits
+ unsigned char marker; // marker seen while filling entropy buffer
+ int nomore; // flag if we saw a marker so must stop
+
+ int progressive;
+ int spec_start;
+ int spec_end;
+ int succ_high;
+ int succ_low;
+ int eob_run;
+ int jfif;
+ int app14_color_transform; // Adobe APP14 tag
+ int rgb;
+
+ int scan_n, order[4];
+ int restart_interval, todo;
+
+// kernels
+ void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]);
+ void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step);
+ stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs);
+} stbi__jpeg;
+
+static int stbi__build_huffman(stbi__huffman *h, int *count)
+{
+ int i,j,k=0;
+ unsigned int code;
+ // build size list for each symbol (from JPEG spec)
+ for (i=0; i < 16; ++i) {
+ for (j=0; j < count[i]; ++j) {
+ h->size[k++] = (stbi_uc) (i+1);
+ if(k >= 257) return stbi__err("bad size list","Corrupt JPEG");
+ }
+ }
+ h->size[k] = 0;
+
+ // compute actual symbols (from jpeg spec)
+ code = 0;
+ k = 0;
+ for(j=1; j <= 16; ++j) {
+ // compute delta to add to code to compute symbol id
+ h->delta[j] = k - code;
+ if (h->size[k] == j) {
+ while (h->size[k] == j)
+ h->code[k++] = (stbi__uint16) (code++);
+ if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG");
+ }
+ // compute largest code + 1 for this size, preshifted as needed later
+ h->maxcode[j] = code << (16-j);
+ code <<= 1;
+ }
+ h->maxcode[j] = 0xffffffff;
+
+ // build non-spec acceleration table; 255 is flag for not-accelerated
+ memset(h->fast, 255, 1 << FAST_BITS);
+ for (i=0; i < k; ++i) {
+ int s = h->size[i];
+ if (s <= FAST_BITS) {
+ int c = h->code[i] << (FAST_BITS-s);
+ int m = 1 << (FAST_BITS-s);
+ for (j=0; j < m; ++j) {
+ h->fast[c+j] = (stbi_uc) i;
+ }
+ }
+ }
+ return 1;
+}
+
+// build a table that decodes both magnitude and value of small ACs in
+// one go.
+static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
+{
+ int i;
+ for (i=0; i < (1 << FAST_BITS); ++i) {
+ stbi_uc fast = h->fast[i];
+ fast_ac[i] = 0;
+ if (fast < 255) {
+ int rs = h->values[fast];
+ int run = (rs >> 4) & 15;
+ int magbits = rs & 15;
+ int len = h->size[fast];
+
+ if (magbits && len + magbits <= FAST_BITS) {
+ // magnitude code followed by receive_extend code
+ int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
+ int m = 1 << (magbits - 1);
+ if (k < m) k += (~0U << magbits) + 1;
+ // if the result is small enough, we can fit it in fast_ac table
+ if (k >= -128 && k <= 127)
+ fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits));
+ }
+ }
+ }
+}
+
+static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
+{
+ do {
+ unsigned int b = j->nomore ? 0 : stbi__get8(j->s);
+ if (b == 0xff) {
+ int c = stbi__get8(j->s);
+ while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes
+ if (c != 0) {
+ j->marker = (unsigned char) c;
+ j->nomore = 1;
+ return;
+ }
+ }
+ j->code_buffer |= b << (24 - j->code_bits);
+ j->code_bits += 8;
+ } while (j->code_bits <= 24);
+}
+
+// (1 << n) - 1
+static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
+
+// decode a jpeg huffman value from the bitstream
+stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
+{
+ unsigned int temp;
+ int c,k;
+
+ if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
+
+ // look at the top FAST_BITS and determine what symbol ID it is,
+ // if the code is <= FAST_BITS
+ c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
+ k = h->fast[c];
+ if (k < 255) {
+ int s = h->size[k];
+ if (s > j->code_bits)
+ return -1;
+ j->code_buffer <<= s;
+ j->code_bits -= s;
+ return h->values[k];
+ }
+
+ // naive test is to shift the code_buffer down so k bits are
+ // valid, then test against maxcode. To speed this up, we've
+ // preshifted maxcode left so that it has (16-k) 0s at the
+ // end; in other words, regardless of the number of bits, it
+ // wants to be compared against something shifted to have 16;
+ // that way we don't need to shift inside the loop.
+ temp = j->code_buffer >> 16;
+ for (k=FAST_BITS+1 ; ; ++k)
+ if (temp < h->maxcode[k])
+ break;
+ if (k == 17) {
+ // error! code not found
+ j->code_bits -= 16;
+ return -1;
+ }
+
+ if (k > j->code_bits)
+ return -1;
+
+ // convert the huffman code to the symbol id
+ c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
+ if(c < 0 || c >= 256) // symbol id out of bounds!
+ return -1;
+ STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
+
+ // convert the id to a symbol
+ j->code_bits -= k;
+ j->code_buffer <<= k;
+ return h->values[c];
+}
+
+// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j);
+ if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing
+
+ sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative)
+ k = stbi_lrot(j->code_buffer, n);
+ j->code_buffer = k & ~stbi__bmask[n];
+ k &= stbi__bmask[n];
+ j->code_bits -= n;
+ return k + (stbi__jbias[n] & (sgn - 1));
+}
+
+// get some unsigned bits
+stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n)
+{
+ unsigned int k;
+ if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
+ if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing
+ k = stbi_lrot(j->code_buffer, n);
+ j->code_buffer = k & ~stbi__bmask[n];
+ k &= stbi__bmask[n];
+ j->code_bits -= n;
+ return k;
+}
+
+stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j)
+{
+ unsigned int k;
+ if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
+ if (j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing
+ k = j->code_buffer;
+ j->code_buffer <<= 1;
+ --j->code_bits;
+ return k & 0x80000000;
+}
+
+// given a value that's at position X in the zigzag stream,
+// where does it appear in the 8x8 matrix coded as row-major?
+static const stbi_uc stbi__jpeg_dezigzag[64+15] =
+{
+ 0, 1, 8, 16, 9, 2, 3, 10,
+ 17, 24, 32, 25, 18, 11, 4, 5,
+ 12, 19, 26, 33, 40, 48, 41, 34,
+ 27, 20, 13, 6, 7, 14, 21, 28,
+ 35, 42, 49, 56, 57, 50, 43, 36,
+ 29, 22, 15, 23, 30, 37, 44, 51,
+ 58, 59, 52, 45, 38, 31, 39, 46,
+ 53, 60, 61, 54, 47, 55, 62, 63,
+ // let corrupt input sample past end
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63
+};
+
+// decode one 64-entry block--
+static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant)
+{
+ int diff,dc,k;
+ int t;
+
+ if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
+ t = stbi__jpeg_huff_decode(j, hdc);
+ if (t < 0 || t > 15) return stbi__err("bad huffman code","Corrupt JPEG");
+
+ // 0 all the ac values now so we can do it 32-bits at a time
+ memset(data,0,64*sizeof(data[0]));
+
+ diff = t ? stbi__extend_receive(j, t) : 0;
+ if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta","Corrupt JPEG");
+ dc = j->img_comp[b].dc_pred + diff;
+ j->img_comp[b].dc_pred = dc;
+ if (!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
+ data[0] = (short) (dc * dequant[0]);
+
+ // decode AC components, see JPEG spec
+ k = 1;
+ do {
+ unsigned int zig;
+ int c,r,s;
+ if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
+ c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
+ r = fac[c];
+ if (r) { // fast-AC path
+ k += (r >> 4) & 15; // run
+ s = r & 15; // combined length
+ if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available");
+ j->code_buffer <<= s;
+ j->code_bits -= s;
+ // decode into unzigzag'd location
+ zig = stbi__jpeg_dezigzag[k++];
+ data[zig] = (short) ((r >> 8) * dequant[zig]);
+ } else {
+ int rs = stbi__jpeg_huff_decode(j, hac);
+ if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
+ s = rs & 15;
+ r = rs >> 4;
+ if (s == 0) {
+ if (rs != 0xf0) break; // end block
+ k += 16;
+ } else {
+ k += r;
+ // decode into unzigzag'd location
+ zig = stbi__jpeg_dezigzag[k++];
+ data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
+ }
+ }
+ } while (k < 64);
+ return 1;
+}
+
+static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b)
+{
+ int diff,dc;
+ int t;
+ if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
+
+ if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
+
+ if (j->succ_high == 0) {
+ // first scan for DC coefficient, must be first
+ memset(data,0,64*sizeof(data[0])); // 0 all the ac values now
+ t = stbi__jpeg_huff_decode(j, hdc);
+ if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
+ diff = t ? stbi__extend_receive(j, t) : 0;
+
+ if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta", "Corrupt JPEG");
+ dc = j->img_comp[b].dc_pred + diff;
+ j->img_comp[b].dc_pred = dc;
+ if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
+ data[0] = (short) (dc * (1 << j->succ_low));
+ } else {
+ // refinement scan for DC coefficient
+ if (stbi__jpeg_get_bit(j))
+ data[0] += (short) (1 << j->succ_low);
+ }
+ return 1;
+}
+
+// @OPTIMIZE: store non-zigzagged during the decode passes,
+// and only de-zigzag when dequantizing
+static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac)
+{
+ int k;
+ if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
+
+ if (j->succ_high == 0) {
+ int shift = j->succ_low;
+
+ if (j->eob_run) {
+ --j->eob_run;
+ return 1;
+ }
+
+ k = j->spec_start;
+ do {
+ unsigned int zig;
+ int c,r,s;
+ if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
+ c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
+ r = fac[c];
+ if (r) { // fast-AC path
+ k += (r >> 4) & 15; // run
+ s = r & 15; // combined length
+ if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available");
+ j->code_buffer <<= s;
+ j->code_bits -= s;
+ zig = stbi__jpeg_dezigzag[k++];
+ data[zig] = (short) ((r >> 8) * (1 << shift));
+ } else {
+ int rs = stbi__jpeg_huff_decode(j, hac);
+ if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
+ s = rs & 15;
+ r = rs >> 4;
+ if (s == 0) {
+ if (r < 15) {
+ j->eob_run = (1 << r);
+ if (r)
+ j->eob_run += stbi__jpeg_get_bits(j, r);
+ --j->eob_run;
+ break;
+ }
+ k += 16;
+ } else {
+ k += r;
+ zig = stbi__jpeg_dezigzag[k++];
+ data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift));
+ }
+ }
+ } while (k <= j->spec_end);
+ } else {
+ // refinement scan for these AC coefficients
+
+ short bit = (short) (1 << j->succ_low);
+
+ if (j->eob_run) {
+ --j->eob_run;
+ for (k = j->spec_start; k <= j->spec_end; ++k) {
+ short *p = &data[stbi__jpeg_dezigzag[k]];
+ if (*p != 0)
+ if (stbi__jpeg_get_bit(j))
+ if ((*p & bit)==0) {
+ if (*p > 0)
+ *p += bit;
+ else
+ *p -= bit;
+ }
+ }
+ } else {
+ k = j->spec_start;
+ do {
+ int r,s;
+ int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh
+ if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
+ s = rs & 15;
+ r = rs >> 4;
+ if (s == 0) {
+ if (r < 15) {
+ j->eob_run = (1 << r) - 1;
+ if (r)
+ j->eob_run += stbi__jpeg_get_bits(j, r);
+ r = 64; // force end of block
+ } else {
+ // r=15 s=0 should write 16 0s, so we just do
+ // a run of 15 0s and then write s (which is 0),
+ // so we don't have to do anything special here
+ }
+ } else {
+ if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG");
+ // sign bit
+ if (stbi__jpeg_get_bit(j))
+ s = bit;
+ else
+ s = -bit;
+ }
+
+ // advance by r
+ while (k <= j->spec_end) {
+ short *p = &data[stbi__jpeg_dezigzag[k++]];
+ if (*p != 0) {
+ if (stbi__jpeg_get_bit(j))
+ if ((*p & bit)==0) {
+ if (*p > 0)
+ *p += bit;
+ else
+ *p -= bit;
+ }
+ } else {
+ if (r == 0) {
+ *p = (short) s;
+ break;
+ }
+ --r;
+ }
+ }
+ } while (k <= j->spec_end);
+ }
+ }
+ return 1;
+}
+
+// take a -128..127 value and stbi__clamp it and convert to 0..255
+stbi_inline static stbi_uc stbi__clamp(int x)
+{
+ // trick to use a single test to catch both cases
+ if ((unsigned int) x > 255) {
+ if (x < 0) return 0;
+ if (x > 255) return 255;
+ }
+ return (stbi_uc) x;
+}
+
+#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
+#define stbi__fsh(x) ((x) * 4096)
+
+// derived from jidctint -- DCT_ISLOW
+#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
+ int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
+ p2 = s2; \
+ p3 = s6; \
+ p1 = (p2+p3) * stbi__f2f(0.5411961f); \
+ t2 = p1 + p3*stbi__f2f(-1.847759065f); \
+ t3 = p1 + p2*stbi__f2f( 0.765366865f); \
+ p2 = s0; \
+ p3 = s4; \
+ t0 = stbi__fsh(p2+p3); \
+ t1 = stbi__fsh(p2-p3); \
+ x0 = t0+t3; \
+ x3 = t0-t3; \
+ x1 = t1+t2; \
+ x2 = t1-t2; \
+ t0 = s7; \
+ t1 = s5; \
+ t2 = s3; \
+ t3 = s1; \
+ p3 = t0+t2; \
+ p4 = t1+t3; \
+ p1 = t0+t3; \
+ p2 = t1+t2; \
+ p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
+ t0 = t0*stbi__f2f( 0.298631336f); \
+ t1 = t1*stbi__f2f( 2.053119869f); \
+ t2 = t2*stbi__f2f( 3.072711026f); \
+ t3 = t3*stbi__f2f( 1.501321110f); \
+ p1 = p5 + p1*stbi__f2f(-0.899976223f); \
+ p2 = p5 + p2*stbi__f2f(-2.562915447f); \
+ p3 = p3*stbi__f2f(-1.961570560f); \
+ p4 = p4*stbi__f2f(-0.390180644f); \
+ t3 += p1+p4; \
+ t2 += p2+p3; \
+ t1 += p2+p4; \
+ t0 += p1+p3;
+
+static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64])
+{
+ int i,val[64],*v=val;
+ stbi_uc *o;
+ short *d = data;
+
+ // columns
+ for (i=0; i < 8; ++i,++d, ++v) {
+ // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing
+ if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
+ && d[40]==0 && d[48]==0 && d[56]==0) {
+ // no shortcut 0 seconds
+ // (1|2|3|4|5|6|7)==0 0 seconds
+ // all separate -0.047 seconds
+ // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds
+ int dcterm = d[0]*4;
+ v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
+ } else {
+ STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
+ // constants scaled things up by 1<<12; let's bring them back
+ // down, but keep 2 extra bits of precision
+ x0 += 512; x1 += 512; x2 += 512; x3 += 512;
+ v[ 0] = (x0+t3) >> 10;
+ v[56] = (x0-t3) >> 10;
+ v[ 8] = (x1+t2) >> 10;
+ v[48] = (x1-t2) >> 10;
+ v[16] = (x2+t1) >> 10;
+ v[40] = (x2-t1) >> 10;
+ v[24] = (x3+t0) >> 10;
+ v[32] = (x3-t0) >> 10;
+ }
+ }
+
+ for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
+ // no fast case since the first 1D IDCT spread components out
+ STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
+ // constants scaled things up by 1<<12, plus we had 1<<2 from first
+ // loop, plus horizontal and vertical each scale by sqrt(8) so together
+ // we've got an extra 1<<3, so 1<<17 total we need to remove.
+ // so we want to round that, which means adding 0.5 * 1<<17,
+ // aka 65536. Also, we'll end up with -128 to 127 that we want
+ // to encode as 0..255 by adding 128, so we'll add that before the shift
+ x0 += 65536 + (128<<17);
+ x1 += 65536 + (128<<17);
+ x2 += 65536 + (128<<17);
+ x3 += 65536 + (128<<17);
+ // tried computing the shifts into temps, or'ing the temps to see
+ // if any were out of range, but that was slower
+ o[0] = stbi__clamp((x0+t3) >> 17);
+ o[7] = stbi__clamp((x0-t3) >> 17);
+ o[1] = stbi__clamp((x1+t2) >> 17);
+ o[6] = stbi__clamp((x1-t2) >> 17);
+ o[2] = stbi__clamp((x2+t1) >> 17);
+ o[5] = stbi__clamp((x2-t1) >> 17);
+ o[3] = stbi__clamp((x3+t0) >> 17);
+ o[4] = stbi__clamp((x3-t0) >> 17);
+ }
+}
+
+#ifdef STBI_SSE2
+// sse2 integer IDCT. not the fastest possible implementation but it
+// produces bit-identical results to the generic C version so it's
+// fully "transparent".
+static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])
+{
+ // This is constructed to match our regular (generic) integer IDCT exactly.
+ __m128i row0, row1, row2, row3, row4, row5, row6, row7;
+ __m128i tmp;
+
+ // dot product constant: even elems=x, odd elems=y
+ #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
+
+ // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit)
+ // out(1) = c1[even]*x + c1[odd]*y
+ #define dct_rot(out0,out1, x,y,c0,c1) \
+ __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
+ __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
+ __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
+ __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
+ __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
+ __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
+
+ // out = in << 12 (in 16-bit, out 32-bit)
+ #define dct_widen(out, in) \
+ __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
+ __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
+
+ // wide add
+ #define dct_wadd(out, a, b) \
+ __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
+ __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
+
+ // wide sub
+ #define dct_wsub(out, a, b) \
+ __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
+ __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
+
+ // butterfly a/b, add bias, then shift by "s" and pack
+ #define dct_bfly32o(out0, out1, a,b,bias,s) \
+ { \
+ __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
+ __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
+ dct_wadd(sum, abiased, b); \
+ dct_wsub(dif, abiased, b); \
+ out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
+ out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
+ }
+
+ // 8-bit interleave step (for transposes)
+ #define dct_interleave8(a, b) \
+ tmp = a; \
+ a = _mm_unpacklo_epi8(a, b); \
+ b = _mm_unpackhi_epi8(tmp, b)
+
+ // 16-bit interleave step (for transposes)
+ #define dct_interleave16(a, b) \
+ tmp = a; \
+ a = _mm_unpacklo_epi16(a, b); \
+ b = _mm_unpackhi_epi16(tmp, b)
+
+ #define dct_pass(bias,shift) \
+ { \
+ /* even part */ \
+ dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
+ __m128i sum04 = _mm_add_epi16(row0, row4); \
+ __m128i dif04 = _mm_sub_epi16(row0, row4); \
+ dct_widen(t0e, sum04); \
+ dct_widen(t1e, dif04); \
+ dct_wadd(x0, t0e, t3e); \
+ dct_wsub(x3, t0e, t3e); \
+ dct_wadd(x1, t1e, t2e); \
+ dct_wsub(x2, t1e, t2e); \
+ /* odd part */ \
+ dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
+ dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
+ __m128i sum17 = _mm_add_epi16(row1, row7); \
+ __m128i sum35 = _mm_add_epi16(row3, row5); \
+ dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
+ dct_wadd(x4, y0o, y4o); \
+ dct_wadd(x5, y1o, y5o); \
+ dct_wadd(x6, y2o, y5o); \
+ dct_wadd(x7, y3o, y4o); \
+ dct_bfly32o(row0,row7, x0,x7,bias,shift); \
+ dct_bfly32o(row1,row6, x1,x6,bias,shift); \
+ dct_bfly32o(row2,row5, x2,x5,bias,shift); \
+ dct_bfly32o(row3,row4, x3,x4,bias,shift); \
+ }
+
+ __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
+ __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
+ __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
+ __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
+ __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
+ __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
+ __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
+ __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
+
+ // rounding biases in column/row passes, see stbi__idct_block for explanation.
+ __m128i bias_0 = _mm_set1_epi32(512);
+ __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
+
+ // load
+ row0 = _mm_load_si128((const __m128i *) (data + 0*8));
+ row1 = _mm_load_si128((const __m128i *) (data + 1*8));
+ row2 = _mm_load_si128((const __m128i *) (data + 2*8));
+ row3 = _mm_load_si128((const __m128i *) (data + 3*8));
+ row4 = _mm_load_si128((const __m128i *) (data + 4*8));
+ row5 = _mm_load_si128((const __m128i *) (data + 5*8));
+ row6 = _mm_load_si128((const __m128i *) (data + 6*8));
+ row7 = _mm_load_si128((const __m128i *) (data + 7*8));
+
+ // column pass
+ dct_pass(bias_0, 10);
+
+ {
+ // 16bit 8x8 transpose pass 1
+ dct_interleave16(row0, row4);
+ dct_interleave16(row1, row5);
+ dct_interleave16(row2, row6);
+ dct_interleave16(row3, row7);
+
+ // transpose pass 2
+ dct_interleave16(row0, row2);
+ dct_interleave16(row1, row3);
+ dct_interleave16(row4, row6);
+ dct_interleave16(row5, row7);
+
+ // transpose pass 3
+ dct_interleave16(row0, row1);
+ dct_interleave16(row2, row3);
+ dct_interleave16(row4, row5);
+ dct_interleave16(row6, row7);
+ }
+
+ // row pass
+ dct_pass(bias_1, 17);
+
+ {
+ // pack
+ __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7
+ __m128i p1 = _mm_packus_epi16(row2, row3);
+ __m128i p2 = _mm_packus_epi16(row4, row5);
+ __m128i p3 = _mm_packus_epi16(row6, row7);
+
+ // 8bit 8x8 transpose pass 1
+ dct_interleave8(p0, p2); // a0e0a1e1...
+ dct_interleave8(p1, p3); // c0g0c1g1...
+
+ // transpose pass 2
+ dct_interleave8(p0, p1); // a0c0e0g0...
+ dct_interleave8(p2, p3); // b0d0f0h0...
+
+ // transpose pass 3
+ dct_interleave8(p0, p2); // a0b0c0d0...
+ dct_interleave8(p1, p3); // a4b4c4d4...
+
+ // store
+ _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
+ _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
+ _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
+ _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
+ _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
+ _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
+ _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
+ _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
+ }
+
+#undef dct_const
+#undef dct_rot
+#undef dct_widen
+#undef dct_wadd
+#undef dct_wsub
+#undef dct_bfly32o
+#undef dct_interleave8
+#undef dct_interleave16
+#undef dct_pass
+}
+
+#endif // STBI_SSE2
+
+#ifdef STBI_NEON
+
+// NEON integer IDCT. should produce bit-identical
+// results to the generic C version.
+static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])
+{
+ int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
+
+ int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
+ int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
+ int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
+ int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
+ int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
+ int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
+ int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
+ int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
+ int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
+ int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
+ int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
+ int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
+
+#define dct_long_mul(out, inq, coeff) \
+ int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
+ int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
+
+#define dct_long_mac(out, acc, inq, coeff) \
+ int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
+ int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
+
+#define dct_widen(out, inq) \
+ int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
+ int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
+
+// wide add
+#define dct_wadd(out, a, b) \
+ int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
+ int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
+
+// wide sub
+#define dct_wsub(out, a, b) \
+ int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
+ int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
+
+// butterfly a/b, then shift using "shiftop" by "s" and pack
+#define dct_bfly32o(out0,out1, a,b,shiftop,s) \
+ { \
+ dct_wadd(sum, a, b); \
+ dct_wsub(dif, a, b); \
+ out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
+ out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
+ }
+
+#define dct_pass(shiftop, shift) \
+ { \
+ /* even part */ \
+ int16x8_t sum26 = vaddq_s16(row2, row6); \
+ dct_long_mul(p1e, sum26, rot0_0); \
+ dct_long_mac(t2e, p1e, row6, rot0_1); \
+ dct_long_mac(t3e, p1e, row2, rot0_2); \
+ int16x8_t sum04 = vaddq_s16(row0, row4); \
+ int16x8_t dif04 = vsubq_s16(row0, row4); \
+ dct_widen(t0e, sum04); \
+ dct_widen(t1e, dif04); \
+ dct_wadd(x0, t0e, t3e); \
+ dct_wsub(x3, t0e, t3e); \
+ dct_wadd(x1, t1e, t2e); \
+ dct_wsub(x2, t1e, t2e); \
+ /* odd part */ \
+ int16x8_t sum15 = vaddq_s16(row1, row5); \
+ int16x8_t sum17 = vaddq_s16(row1, row7); \
+ int16x8_t sum35 = vaddq_s16(row3, row5); \
+ int16x8_t sum37 = vaddq_s16(row3, row7); \
+ int16x8_t sumodd = vaddq_s16(sum17, sum35); \
+ dct_long_mul(p5o, sumodd, rot1_0); \
+ dct_long_mac(p1o, p5o, sum17, rot1_1); \
+ dct_long_mac(p2o, p5o, sum35, rot1_2); \
+ dct_long_mul(p3o, sum37, rot2_0); \
+ dct_long_mul(p4o, sum15, rot2_1); \
+ dct_wadd(sump13o, p1o, p3o); \
+ dct_wadd(sump24o, p2o, p4o); \
+ dct_wadd(sump23o, p2o, p3o); \
+ dct_wadd(sump14o, p1o, p4o); \
+ dct_long_mac(x4, sump13o, row7, rot3_0); \
+ dct_long_mac(x5, sump24o, row5, rot3_1); \
+ dct_long_mac(x6, sump23o, row3, rot3_2); \
+ dct_long_mac(x7, sump14o, row1, rot3_3); \
+ dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
+ dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
+ dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
+ dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
+ }
+
+ // load
+ row0 = vld1q_s16(data + 0*8);
+ row1 = vld1q_s16(data + 1*8);
+ row2 = vld1q_s16(data + 2*8);
+ row3 = vld1q_s16(data + 3*8);
+ row4 = vld1q_s16(data + 4*8);
+ row5 = vld1q_s16(data + 5*8);
+ row6 = vld1q_s16(data + 6*8);
+ row7 = vld1q_s16(data + 7*8);
+
+ // add DC bias
+ row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
+
+ // column pass
+ dct_pass(vrshrn_n_s32, 10);
+
+ // 16bit 8x8 transpose
+ {
+// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively.
+// whether compilers actually get this is another story, sadly.
+#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
+#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); }
+#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); }
+
+ // pass 1
+ dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6
+ dct_trn16(row2, row3);
+ dct_trn16(row4, row5);
+ dct_trn16(row6, row7);
+
+ // pass 2
+ dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4
+ dct_trn32(row1, row3);
+ dct_trn32(row4, row6);
+ dct_trn32(row5, row7);
+
+ // pass 3
+ dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0
+ dct_trn64(row1, row5);
+ dct_trn64(row2, row6);
+ dct_trn64(row3, row7);
+
+#undef dct_trn16
+#undef dct_trn32
+#undef dct_trn64
+ }
+
+ // row pass
+ // vrshrn_n_s32 only supports shifts up to 16, we need
+ // 17. so do a non-rounding shift of 16 first then follow
+ // up with a rounding shift by 1.
+ dct_pass(vshrn_n_s32, 16);
+
+ {
+ // pack and round
+ uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
+ uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
+ uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
+ uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
+ uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
+ uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
+ uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
+ uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
+
+ // again, these can translate into one instruction, but often don't.
+#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
+#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); }
+#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); }
+
+ // sadly can't use interleaved stores here since we only write
+ // 8 bytes to each scan line!
+
+ // 8x8 8-bit transpose pass 1
+ dct_trn8_8(p0, p1);
+ dct_trn8_8(p2, p3);
+ dct_trn8_8(p4, p5);
+ dct_trn8_8(p6, p7);
+
+ // pass 2
+ dct_trn8_16(p0, p2);
+ dct_trn8_16(p1, p3);
+ dct_trn8_16(p4, p6);
+ dct_trn8_16(p5, p7);
+
+ // pass 3
+ dct_trn8_32(p0, p4);
+ dct_trn8_32(p1, p5);
+ dct_trn8_32(p2, p6);
+ dct_trn8_32(p3, p7);
+
+ // store
+ vst1_u8(out, p0); out += out_stride;
+ vst1_u8(out, p1); out += out_stride;
+ vst1_u8(out, p2); out += out_stride;
+ vst1_u8(out, p3); out += out_stride;
+ vst1_u8(out, p4); out += out_stride;
+ vst1_u8(out, p5); out += out_stride;
+ vst1_u8(out, p6); out += out_stride;
+ vst1_u8(out, p7);
+
+#undef dct_trn8_8
+#undef dct_trn8_16
+#undef dct_trn8_32
+ }
+
+#undef dct_long_mul
+#undef dct_long_mac
+#undef dct_widen
+#undef dct_wadd
+#undef dct_wsub
+#undef dct_bfly32o
+#undef dct_pass
+}
+
+#endif // STBI_NEON
+
+#define STBI__MARKER_none 0xff
+// if there's a pending marker from the entropy stream, return that
+// otherwise, fetch from the stream and get a marker. if there's no
+// marker, return 0xff, which is never a valid marker value
+static stbi_uc stbi__get_marker(stbi__jpeg *j)
+{
+ stbi_uc x;
+ if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; }
+ x = stbi__get8(j->s);
+ if (x != 0xff) return STBI__MARKER_none;
+ while (x == 0xff)
+ x = stbi__get8(j->s); // consume repeated 0xff fill bytes
+ return x;
+}
+
+// in each scan, we'll have scan_n components, and the order
+// of the components is specified by order[]
+#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
+
+// after a restart interval, stbi__jpeg_reset the entropy decoder and
+// the dc prediction
+static void stbi__jpeg_reset(stbi__jpeg *j)
+{
+ j->code_bits = 0;
+ j->code_buffer = 0;
+ j->nomore = 0;
+ j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0;
+ j->marker = STBI__MARKER_none;
+ j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
+ j->eob_run = 0;
+ // no more than 1<<31 MCUs if no restart_interal? that's plenty safe,
+ // since we don't even allow 1<<30 pixels
+}
+
+static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
+{
+ stbi__jpeg_reset(z);
+ if (!z->progressive) {
+ if (z->scan_n == 1) {
+ int i,j;
+ STBI_SIMD_ALIGN(short, data[64]);
+ int n = z->order[0];
+ // non-interleaved data, we just need to process one block at a time,
+ // in trivial scanline order
+ // number of blocks to do just depends on how many actual "pixels" this
+ // component has, independent of interleaved MCU blocking and such
+ int w = (z->img_comp[n].x+7) >> 3;
+ int h = (z->img_comp[n].y+7) >> 3;
+ for (j=0; j < h; ++j) {
+ for (i=0; i < w; ++i) {
+ int ha = z->img_comp[n].ha;
+ if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;
+ z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
+ // every data block is an MCU, so countdown the restart interval
+ if (--z->todo <= 0) {
+ if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
+ // if it's NOT a restart, then just bail, so we get corrupt data
+ // rather than no data
+ if (!STBI__RESTART(z->marker)) return 1;
+ stbi__jpeg_reset(z);
+ }
+ }
+ }
+ return 1;
+ } else { // interleaved
+ int i,j,k,x,y;
+ STBI_SIMD_ALIGN(short, data[64]);
+ for (j=0; j < z->img_mcu_y; ++j) {
+ for (i=0; i < z->img_mcu_x; ++i) {
+ // scan an interleaved mcu... process scan_n components in order
+ for (k=0; k < z->scan_n; ++k) {
+ int n = z->order[k];
+ // scan out an mcu's worth of this component; that's just determined
+ // by the basic H and V specified for the component
+ for (y=0; y < z->img_comp[n].v; ++y) {
+ for (x=0; x < z->img_comp[n].h; ++x) {
+ int x2 = (i*z->img_comp[n].h + x)*8;
+ int y2 = (j*z->img_comp[n].v + y)*8;
+ int ha = z->img_comp[n].ha;
+ if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;
+ z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
+ }
+ }
+ }
+ // after all interleaved components, that's an interleaved MCU,
+ // so now count down the restart interval
+ if (--z->todo <= 0) {
+ if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
+ if (!STBI__RESTART(z->marker)) return 1;
+ stbi__jpeg_reset(z);
+ }
+ }
+ }
+ return 1;
+ }
+ } else {
+ if (z->scan_n == 1) {
+ int i,j;
+ int n = z->order[0];
+ // non-interleaved data, we just need to process one block at a time,
+ // in trivial scanline order
+ // number of blocks to do just depends on how many actual "pixels" this
+ // component has, independent of interleaved MCU blocking and such
+ int w = (z->img_comp[n].x+7) >> 3;
+ int h = (z->img_comp[n].y+7) >> 3;
+ for (j=0; j < h; ++j) {
+ for (i=0; i < w; ++i) {
+ short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
+ if (z->spec_start == 0) {
+ if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
+ return 0;
+ } else {
+ int ha = z->img_comp[n].ha;
+ if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
+ return 0;
+ }
+ // every data block is an MCU, so countdown the restart interval
+ if (--z->todo <= 0) {
+ if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
+ if (!STBI__RESTART(z->marker)) return 1;
+ stbi__jpeg_reset(z);
+ }
+ }
+ }
+ return 1;
+ } else { // interleaved
+ int i,j,k,x,y;
+ for (j=0; j < z->img_mcu_y; ++j) {
+ for (i=0; i < z->img_mcu_x; ++i) {
+ // scan an interleaved mcu... process scan_n components in order
+ for (k=0; k < z->scan_n; ++k) {
+ int n = z->order[k];
+ // scan out an mcu's worth of this component; that's just determined
+ // by the basic H and V specified for the component
+ for (y=0; y < z->img_comp[n].v; ++y) {
+ for (x=0; x < z->img_comp[n].h; ++x) {
+ int x2 = (i*z->img_comp[n].h + x);
+ int y2 = (j*z->img_comp[n].v + y);
+ short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
+ if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
+ return 0;
+ }
+ }
+ }
+ // after all interleaved components, that's an interleaved MCU,
+ // so now count down the restart interval
+ if (--z->todo <= 0) {
+ if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
+ if (!STBI__RESTART(z->marker)) return 1;
+ stbi__jpeg_reset(z);
+ }
+ }
+ }
+ return 1;
+ }
+ }
+}
+
+static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant)
+{
+ int i;
+ for (i=0; i < 64; ++i)
+ data[i] *= dequant[i];
+}
+
+static void stbi__jpeg_finish(stbi__jpeg *z)
+{
+ if (z->progressive) {
+ // dequantize and idct the data
+ int i,j,n;
+ for (n=0; n < z->s->img_n; ++n) {
+ int w = (z->img_comp[n].x+7) >> 3;
+ int h = (z->img_comp[n].y+7) >> 3;
+ for (j=0; j < h; ++j) {
+ for (i=0; i < w; ++i) {
+ short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
+ stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
+ z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
+ }
+ }
+ }
+ }
+}
+
+static int stbi__process_marker(stbi__jpeg *z, int m)
+{
+ int L;
+ switch (m) {
+ case STBI__MARKER_none: // no marker found
+ return stbi__err("expected marker","Corrupt JPEG");
+
+ case 0xDD: // DRI - specify restart interval
+ if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG");
+ z->restart_interval = stbi__get16be(z->s);
+ return 1;
+
+ case 0xDB: // DQT - define quantization table
+ L = stbi__get16be(z->s)-2;
+ while (L > 0) {
+ int q = stbi__get8(z->s);
+ int p = q >> 4, sixteen = (p != 0);
+ int t = q & 15,i;
+ if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG");
+ if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG");
+
+ for (i=0; i < 64; ++i)
+ z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));
+ L -= (sixteen ? 129 : 65);
+ }
+ return L==0;
+
+ case 0xC4: // DHT - define huffman table
+ L = stbi__get16be(z->s)-2;
+ while (L > 0) {
+ stbi_uc *v;
+ int sizes[16],i,n=0;
+ int q = stbi__get8(z->s);
+ int tc = q >> 4;
+ int th = q & 15;
+ if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG");
+ for (i=0; i < 16; ++i) {
+ sizes[i] = stbi__get8(z->s);
+ n += sizes[i];
+ }
+ if(n > 256) return stbi__err("bad DHT header","Corrupt JPEG"); // Loop over i < n would write past end of values!
+ L -= 17;
+ if (tc == 0) {
+ if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0;
+ v = z->huff_dc[th].values;
+ } else {
+ if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0;
+ v = z->huff_ac[th].values;
+ }
+ for (i=0; i < n; ++i)
+ v[i] = stbi__get8(z->s);
+ if (tc != 0)
+ stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
+ L -= n;
+ }
+ return L==0;
+ }
+
+ // check for comment block or APP blocks
+ if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
+ L = stbi__get16be(z->s);
+ if (L < 2) {
+ if (m == 0xFE)
+ return stbi__err("bad COM len","Corrupt JPEG");
+ else
+ return stbi__err("bad APP len","Corrupt JPEG");
+ }
+ L -= 2;
+
+ if (m == 0xE0 && L >= 5) { // JFIF APP0 segment
+ static const unsigned char tag[5] = {'J','F','I','F','\0'};
+ int ok = 1;
+ int i;
+ for (i=0; i < 5; ++i)
+ if (stbi__get8(z->s) != tag[i])
+ ok = 0;
+ L -= 5;
+ if (ok)
+ z->jfif = 1;
+ } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment
+ static const unsigned char tag[6] = {'A','d','o','b','e','\0'};
+ int ok = 1;
+ int i;
+ for (i=0; i < 6; ++i)
+ if (stbi__get8(z->s) != tag[i])
+ ok = 0;
+ L -= 6;
+ if (ok) {
+ stbi__get8(z->s); // version
+ stbi__get16be(z->s); // flags0
+ stbi__get16be(z->s); // flags1
+ z->app14_color_transform = stbi__get8(z->s); // color transform
+ L -= 6;
+ }
+ }
+
+ stbi__skip(z->s, L);
+ return 1;
+ }
+
+ return stbi__err("unknown marker","Corrupt JPEG");
+}
+
+// after we see SOS
+static int stbi__process_scan_header(stbi__jpeg *z)
+{
+ int i;
+ int Ls = stbi__get16be(z->s);
+ z->scan_n = stbi__get8(z->s);
+ if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG");
+ if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG");
+ for (i=0; i < z->scan_n; ++i) {
+ int id = stbi__get8(z->s), which;
+ int q = stbi__get8(z->s);
+ for (which = 0; which < z->s->img_n; ++which)
+ if (z->img_comp[which].id == id)
+ break;
+ if (which == z->s->img_n) return 0; // no match
+ z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG");
+ z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG");
+ z->order[i] = which;
+ }
+
+ {
+ int aa;
+ z->spec_start = stbi__get8(z->s);
+ z->spec_end = stbi__get8(z->s); // should be 63, but might be 0
+ aa = stbi__get8(z->s);
+ z->succ_high = (aa >> 4);
+ z->succ_low = (aa & 15);
+ if (z->progressive) {
+ if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
+ return stbi__err("bad SOS", "Corrupt JPEG");
+ } else {
+ if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG");
+ if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG");
+ z->spec_end = 63;
+ }
+ }
+
+ return 1;
+}
+
+static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why)
+{
+ int i;
+ for (i=0; i < ncomp; ++i) {
+ if (z->img_comp[i].raw_data) {
+ STBI_FREE(z->img_comp[i].raw_data);
+ z->img_comp[i].raw_data = NULL;
+ z->img_comp[i].data = NULL;
+ }
+ if (z->img_comp[i].raw_coeff) {
+ STBI_FREE(z->img_comp[i].raw_coeff);
+ z->img_comp[i].raw_coeff = 0;
+ z->img_comp[i].coeff = 0;
+ }
+ if (z->img_comp[i].linebuf) {
+ STBI_FREE(z->img_comp[i].linebuf);
+ z->img_comp[i].linebuf = NULL;
+ }
+ }
+ return why;
+}
+
+static int stbi__process_frame_header(stbi__jpeg *z, int scan)
+{
+ stbi__context *s = z->s;
+ int Lf,p,i,q, h_max=1,v_max=1,c;
+ Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG
+ p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline
+ s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG
+ s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires
+ if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
+ if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
+ c = stbi__get8(s);
+ if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG");
+ s->img_n = c;
+ for (i=0; i < c; ++i) {
+ z->img_comp[i].data = NULL;
+ z->img_comp[i].linebuf = NULL;
+ }
+
+ if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG");
+
+ z->rgb = 0;
+ for (i=0; i < s->img_n; ++i) {
+ static const unsigned char rgb[3] = { 'R', 'G', 'B' };
+ z->img_comp[i].id = stbi__get8(s);
+ if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
+ ++z->rgb;
+ q = stbi__get8(s);
+ z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG");
+ z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG");
+ z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG");
+ }
+
+ if (scan != STBI__SCAN_load) return 1;
+
+ if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode");
+
+ for (i=0; i < s->img_n; ++i) {
+ if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
+ if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
+ }
+
+ // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios
+ // and I've never seen a non-corrupted JPEG file actually use them
+ for (i=0; i < s->img_n; ++i) {
+ if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG");
+ if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG");
+ }
+
+ // compute interleaved mcu info
+ z->img_h_max = h_max;
+ z->img_v_max = v_max;
+ z->img_mcu_w = h_max * 8;
+ z->img_mcu_h = v_max * 8;
+ // these sizes can't be more than 17 bits
+ z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
+ z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
+
+ for (i=0; i < s->img_n; ++i) {
+ // number of effective pixels (e.g. for non-interleaved MCU)
+ z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
+ z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
+ // to simplify generation, we'll allocate enough memory to decode
+ // the bogus oversized data from using interleaved MCUs and their
+ // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't
+ // discard the extra data until colorspace conversion
+ //
+ // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier)
+ // so these muls can't overflow with 32-bit ints (which we require)
+ z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
+ z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
+ z->img_comp[i].coeff = 0;
+ z->img_comp[i].raw_coeff = 0;
+ z->img_comp[i].linebuf = NULL;
+ z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
+ if (z->img_comp[i].raw_data == NULL)
+ return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory"));
+ // align blocks for idct using mmx/sse
+ z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);
+ if (z->progressive) {
+ // w2, h2 are multiples of 8 (see above)
+ z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
+ z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
+ z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15);
+ if (z->img_comp[i].raw_coeff == NULL)
+ return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory"));
+ z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15);
+ }
+ }
+
+ return 1;
+}
+
+// use comparisons since in some cases we handle more than one case (e.g. SOF)
+#define stbi__DNL(x) ((x) == 0xdc)
+#define stbi__SOI(x) ((x) == 0xd8)
+#define stbi__EOI(x) ((x) == 0xd9)
+#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
+#define stbi__SOS(x) ((x) == 0xda)
+
+#define stbi__SOF_progressive(x) ((x) == 0xc2)
+
+static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)
+{
+ int m;
+ z->jfif = 0;
+ z->app14_color_transform = -1; // valid values are 0,1,2
+ z->marker = STBI__MARKER_none; // initialize cached marker to empty
+ m = stbi__get_marker(z);
+ if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG");
+ if (scan == STBI__SCAN_type) return 1;
+ m = stbi__get_marker(z);
+ while (!stbi__SOF(m)) {
+ if (!stbi__process_marker(z,m)) return 0;
+ m = stbi__get_marker(z);
+ while (m == STBI__MARKER_none) {
+ // some files have extra padding after their blocks, so ok, we'll scan
+ if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG");
+ m = stbi__get_marker(z);
+ }
+ }
+ z->progressive = stbi__SOF_progressive(m);
+ if (!stbi__process_frame_header(z, scan)) return 0;
+ return 1;
+}
+
+static stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg *j)
+{
+ // some JPEGs have junk at end, skip over it but if we find what looks
+ // like a valid marker, resume there
+ while (!stbi__at_eof(j->s)) {
+ stbi_uc x = stbi__get8(j->s);
+ while (x == 0xff) { // might be a marker
+ if (stbi__at_eof(j->s)) return STBI__MARKER_none;
+ x = stbi__get8(j->s);
+ if (x != 0x00 && x != 0xff) {
+ // not a stuffed zero or lead-in to another marker, looks
+ // like an actual marker, return it
+ return x;
+ }
+ // stuffed zero has x=0 now which ends the loop, meaning we go
+ // back to regular scan loop.
+ // repeated 0xff keeps trying to read the next byte of the marker.
+ }
+ }
+ return STBI__MARKER_none;
+}
+
+// decode image to YCbCr format
+static int stbi__decode_jpeg_image(stbi__jpeg *j)
+{
+ int m;
+ for (m = 0; m < 4; m++) {
+ j->img_comp[m].raw_data = NULL;
+ j->img_comp[m].raw_coeff = NULL;
+ }
+ j->restart_interval = 0;
+ if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0;
+ m = stbi__get_marker(j);
+ while (!stbi__EOI(m)) {
+ if (stbi__SOS(m)) {
+ if (!stbi__process_scan_header(j)) return 0;
+ if (!stbi__parse_entropy_coded_data(j)) return 0;
+ if (j->marker == STBI__MARKER_none ) {
+ j->marker = stbi__skip_jpeg_junk_at_end(j);
+ // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0
+ }
+ m = stbi__get_marker(j);
+ if (STBI__RESTART(m))
+ m = stbi__get_marker(j);
+ } else if (stbi__DNL(m)) {
+ int Ld = stbi__get16be(j->s);
+ stbi__uint32 NL = stbi__get16be(j->s);
+ if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG");
+ if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG");
+ m = stbi__get_marker(j);
+ } else {
+ if (!stbi__process_marker(j, m)) return 1;
+ m = stbi__get_marker(j);
+ }
+ }
+ if (j->progressive)
+ stbi__jpeg_finish(j);
+ return 1;
+}
+
+// static jfif-centered resampling (across block boundaries)
+
+typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,
+ int w, int hs);
+
+#define stbi__div4(x) ((stbi_uc) ((x) >> 2))
+
+static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
+{
+ STBI_NOTUSED(out);
+ STBI_NOTUSED(in_far);
+ STBI_NOTUSED(w);
+ STBI_NOTUSED(hs);
+ return in_near;
+}
+
+static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
+{
+ // need to generate two samples vertically for every one in input
+ int i;
+ STBI_NOTUSED(hs);
+ for (i=0; i < w; ++i)
+ out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
+ return out;
+}
+
+static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
+{
+ // need to generate two samples horizontally for every one in input
+ int i;
+ stbi_uc *input = in_near;
+
+ if (w == 1) {
+ // if only one sample, can't do any interpolation
+ out[0] = out[1] = input[0];
+ return out;
+ }
+
+ out[0] = input[0];
+ out[1] = stbi__div4(input[0]*3 + input[1] + 2);
+ for (i=1; i < w-1; ++i) {
+ int n = 3*input[i]+2;
+ out[i*2+0] = stbi__div4(n+input[i-1]);
+ out[i*2+1] = stbi__div4(n+input[i+1]);
+ }
+ out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
+ out[i*2+1] = input[w-1];
+
+ STBI_NOTUSED(in_far);
+ STBI_NOTUSED(hs);
+
+ return out;
+}
+
+#define stbi__div16(x) ((stbi_uc) ((x) >> 4))
+
+static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
+{
+ // need to generate 2x2 samples for every one in input
+ int i,t0,t1;
+ if (w == 1) {
+ out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
+ return out;
+ }
+
+ t1 = 3*in_near[0] + in_far[0];
+ out[0] = stbi__div4(t1+2);
+ for (i=1; i < w; ++i) {
+ t0 = t1;
+ t1 = 3*in_near[i]+in_far[i];
+ out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
+ out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
+ }
+ out[w*2-1] = stbi__div4(t1+2);
+
+ STBI_NOTUSED(hs);
+
+ return out;
+}
+
+#if defined(STBI_SSE2) || defined(STBI_NEON)
+static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
+{
+ // need to generate 2x2 samples for every one in input
+ int i=0,t0,t1;
+
+ if (w == 1) {
+ out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
+ return out;
+ }
+
+ t1 = 3*in_near[0] + in_far[0];
+ // process groups of 8 pixels for as long as we can.
+ // note we can't handle the last pixel in a row in this loop
+ // because we need to handle the filter boundary conditions.
+ for (; i < ((w-1) & ~7); i += 8) {
+#if defined(STBI_SSE2)
+ // load and perform the vertical filtering pass
+ // this uses 3*x + y = 4*x + (y - x)
+ __m128i zero = _mm_setzero_si128();
+ __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));
+ __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
+ __m128i farw = _mm_unpacklo_epi8(farb, zero);
+ __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
+ __m128i diff = _mm_sub_epi16(farw, nearw);
+ __m128i nears = _mm_slli_epi16(nearw, 2);
+ __m128i curr = _mm_add_epi16(nears, diff); // current row
+
+ // horizontal filter works the same based on shifted vers of current
+ // row. "prev" is current row shifted right by 1 pixel; we need to
+ // insert the previous pixel value (from t1).
+ // "next" is current row shifted left by 1 pixel, with first pixel
+ // of next block of 8 pixels added in.
+ __m128i prv0 = _mm_slli_si128(curr, 2);
+ __m128i nxt0 = _mm_srli_si128(curr, 2);
+ __m128i prev = _mm_insert_epi16(prv0, t1, 0);
+ __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
+
+ // horizontal filter, polyphase implementation since it's convenient:
+ // even pixels = 3*cur + prev = cur*4 + (prev - cur)
+ // odd pixels = 3*cur + next = cur*4 + (next - cur)
+ // note the shared term.
+ __m128i bias = _mm_set1_epi16(8);
+ __m128i curs = _mm_slli_epi16(curr, 2);
+ __m128i prvd = _mm_sub_epi16(prev, curr);
+ __m128i nxtd = _mm_sub_epi16(next, curr);
+ __m128i curb = _mm_add_epi16(curs, bias);
+ __m128i even = _mm_add_epi16(prvd, curb);
+ __m128i odd = _mm_add_epi16(nxtd, curb);
+
+ // interleave even and odd pixels, then undo scaling.
+ __m128i int0 = _mm_unpacklo_epi16(even, odd);
+ __m128i int1 = _mm_unpackhi_epi16(even, odd);
+ __m128i de0 = _mm_srli_epi16(int0, 4);
+ __m128i de1 = _mm_srli_epi16(int1, 4);
+
+ // pack and write output
+ __m128i outv = _mm_packus_epi16(de0, de1);
+ _mm_storeu_si128((__m128i *) (out + i*2), outv);
+#elif defined(STBI_NEON)
+ // load and perform the vertical filtering pass
+ // this uses 3*x + y = 4*x + (y - x)
+ uint8x8_t farb = vld1_u8(in_far + i);
+ uint8x8_t nearb = vld1_u8(in_near + i);
+ int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
+ int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
+ int16x8_t curr = vaddq_s16(nears, diff); // current row
+
+ // horizontal filter works the same based on shifted vers of current
+ // row. "prev" is current row shifted right by 1 pixel; we need to
+ // insert the previous pixel value (from t1).
+ // "next" is current row shifted left by 1 pixel, with first pixel
+ // of next block of 8 pixels added in.
+ int16x8_t prv0 = vextq_s16(curr, curr, 7);
+ int16x8_t nxt0 = vextq_s16(curr, curr, 1);
+ int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
+ int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
+
+ // horizontal filter, polyphase implementation since it's convenient:
+ // even pixels = 3*cur + prev = cur*4 + (prev - cur)
+ // odd pixels = 3*cur + next = cur*4 + (next - cur)
+ // note the shared term.
+ int16x8_t curs = vshlq_n_s16(curr, 2);
+ int16x8_t prvd = vsubq_s16(prev, curr);
+ int16x8_t nxtd = vsubq_s16(next, curr);
+ int16x8_t even = vaddq_s16(curs, prvd);
+ int16x8_t odd = vaddq_s16(curs, nxtd);
+
+ // undo scaling and round, then store with even/odd phases interleaved
+ uint8x8x2_t o;
+ o.val[0] = vqrshrun_n_s16(even, 4);
+ o.val[1] = vqrshrun_n_s16(odd, 4);
+ vst2_u8(out + i*2, o);
+#endif
+
+ // "previous" value for next iter
+ t1 = 3*in_near[i+7] + in_far[i+7];
+ }
+
+ t0 = t1;
+ t1 = 3*in_near[i] + in_far[i];
+ out[i*2] = stbi__div16(3*t1 + t0 + 8);
+
+ for (++i; i < w; ++i) {
+ t0 = t1;
+ t1 = 3*in_near[i]+in_far[i];
+ out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
+ out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
+ }
+ out[w*2-1] = stbi__div4(t1+2);
+
+ STBI_NOTUSED(hs);
+
+ return out;
+}
+#endif
+
+static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
+{
+ // resample with nearest-neighbor
+ int i,j;
+ STBI_NOTUSED(in_far);
+ for (i=0; i < w; ++i)
+ for (j=0; j < hs; ++j)
+ out[i*hs+j] = in_near[i];
+ return out;
+}
+
+// this is a reduced-precision calculation of YCbCr-to-RGB introduced
+// to make sure the code produces the same results in both SIMD and scalar
+#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
+static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step)
+{
+ int i;
+ for (i=0; i < count; ++i) {
+ int y_fixed = (y[i] << 20) + (1<<19); // rounding
+ int r,g,b;
+ int cr = pcr[i] - 128;
+ int cb = pcb[i] - 128;
+ r = y_fixed + cr* stbi__float2fixed(1.40200f);
+ g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
+ b = y_fixed + cb* stbi__float2fixed(1.77200f);
+ r >>= 20;
+ g >>= 20;
+ b >>= 20;
+ if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
+ if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
+ if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
+ out[0] = (stbi_uc)r;
+ out[1] = (stbi_uc)g;
+ out[2] = (stbi_uc)b;
+ out[3] = 255;
+ out += step;
+ }
+}
+
+#if defined(STBI_SSE2) || defined(STBI_NEON)
+static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step)
+{
+ int i = 0;
+
+#ifdef STBI_SSE2
+ // step == 3 is pretty ugly on the final interleave, and i'm not convinced
+ // it's useful in practice (you wouldn't use it for textures, for example).
+ // so just accelerate step == 4 case.
+ if (step == 4) {
+ // this is a fairly straightforward implementation and not super-optimized.
+ __m128i signflip = _mm_set1_epi8(-0x80);
+ __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f));
+ __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f));
+ __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f));
+ __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f));
+ __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128);
+ __m128i xw = _mm_set1_epi16(255); // alpha channel
+
+ for (; i+7 < count; i += 8) {
+ // load
+ __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
+ __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
+ __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
+ __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128
+ __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128
+
+ // unpack to short (and left-shift cr, cb by 8)
+ __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
+ __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
+ __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
+
+ // color transform
+ __m128i yws = _mm_srli_epi16(yw, 4);
+ __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
+ __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
+ __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
+ __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
+ __m128i rws = _mm_add_epi16(cr0, yws);
+ __m128i gwt = _mm_add_epi16(cb0, yws);
+ __m128i bws = _mm_add_epi16(yws, cb1);
+ __m128i gws = _mm_add_epi16(gwt, cr1);
+
+ // descale
+ __m128i rw = _mm_srai_epi16(rws, 4);
+ __m128i bw = _mm_srai_epi16(bws, 4);
+ __m128i gw = _mm_srai_epi16(gws, 4);
+
+ // back to byte, set up for transpose
+ __m128i brb = _mm_packus_epi16(rw, bw);
+ __m128i gxb = _mm_packus_epi16(gw, xw);
+
+ // transpose to interleave channels
+ __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
+ __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
+ __m128i o0 = _mm_unpacklo_epi16(t0, t1);
+ __m128i o1 = _mm_unpackhi_epi16(t0, t1);
+
+ // store
+ _mm_storeu_si128((__m128i *) (out + 0), o0);
+ _mm_storeu_si128((__m128i *) (out + 16), o1);
+ out += 32;
+ }
+ }
+#endif
+
+#ifdef STBI_NEON
+ // in this version, step=3 support would be easy to add. but is there demand?
+ if (step == 4) {
+ // this is a fairly straightforward implementation and not super-optimized.
+ uint8x8_t signflip = vdup_n_u8(0x80);
+ int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f));
+ int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f));
+ int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f));
+ int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f));
+
+ for (; i+7 < count; i += 8) {
+ // load
+ uint8x8_t y_bytes = vld1_u8(y + i);
+ uint8x8_t cr_bytes = vld1_u8(pcr + i);
+ uint8x8_t cb_bytes = vld1_u8(pcb + i);
+ int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
+ int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
+
+ // expand to s16
+ int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
+ int16x8_t crw = vshll_n_s8(cr_biased, 7);
+ int16x8_t cbw = vshll_n_s8(cb_biased, 7);
+
+ // color transform
+ int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
+ int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
+ int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
+ int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
+ int16x8_t rws = vaddq_s16(yws, cr0);
+ int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
+ int16x8_t bws = vaddq_s16(yws, cb1);
+
+ // undo scaling, round, convert to byte
+ uint8x8x4_t o;
+ o.val[0] = vqrshrun_n_s16(rws, 4);
+ o.val[1] = vqrshrun_n_s16(gws, 4);
+ o.val[2] = vqrshrun_n_s16(bws, 4);
+ o.val[3] = vdup_n_u8(255);
+
+ // store, interleaving r/g/b/a
+ vst4_u8(out, o);
+ out += 8*4;
+ }
+ }
+#endif
+
+ for (; i < count; ++i) {
+ int y_fixed = (y[i] << 20) + (1<<19); // rounding
+ int r,g,b;
+ int cr = pcr[i] - 128;
+ int cb = pcb[i] - 128;
+ r = y_fixed + cr* stbi__float2fixed(1.40200f);
+ g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
+ b = y_fixed + cb* stbi__float2fixed(1.77200f);
+ r >>= 20;
+ g >>= 20;
+ b >>= 20;
+ if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
+ if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
+ if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
+ out[0] = (stbi_uc)r;
+ out[1] = (stbi_uc)g;
+ out[2] = (stbi_uc)b;
+ out[3] = 255;
+ out += step;
+ }
+}
+#endif
+
+// set up the kernels
+static void stbi__setup_jpeg(stbi__jpeg *j)
+{
+ j->idct_block_kernel = stbi__idct_block;
+ j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
+ j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
+
+#ifdef STBI_SSE2
+ if (stbi__sse2_available()) {
+ j->idct_block_kernel = stbi__idct_simd;
+ j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
+ j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
+ }
+#endif
+
+#ifdef STBI_NEON
+ j->idct_block_kernel = stbi__idct_simd;
+ j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
+ j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
+#endif
+}
+
+// clean up the temporary component buffers
+static void stbi__cleanup_jpeg(stbi__jpeg *j)
+{
+ stbi__free_jpeg_components(j, j->s->img_n, 0);
+}
+
+typedef struct
+{
+ resample_row_func resample;
+ stbi_uc *line0,*line1;
+ int hs,vs; // expansion factor in each axis
+ int w_lores; // horizontal pixels pre-expansion
+ int ystep; // how far through vertical expansion we are
+ int ypos; // which pre-expansion row we're on
+} stbi__resample;
+
+// fast 0..255 * 0..255 => 0..255 rounded multiplication
+static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)
+{
+ unsigned int t = x*y + 128;
+ return (stbi_uc) ((t + (t >>8)) >> 8);
+}
+
+static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)
+{
+ int n, decode_n, is_rgb;
+ z->s->img_n = 0; // make stbi__cleanup_jpeg safe
+
+ // validate req_comp
+ if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
+
+ // load a jpeg image from whichever source, but leave in YCbCr format
+ if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }
+
+ // determine actual number of components to generate
+ n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
+
+ is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
+
+ if (z->s->img_n == 3 && n < 3 && !is_rgb)
+ decode_n = 1;
+ else
+ decode_n = z->s->img_n;
+
+ // nothing to do if no components requested; check this now to avoid
+ // accessing uninitialized coutput[0] later
+ if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; }
+
+ // resample and color-convert
+ {
+ int k;
+ unsigned int i,j;
+ stbi_uc *output;
+ stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL };
+
+ stbi__resample res_comp[4];
+
+ for (k=0; k < decode_n; ++k) {
+ stbi__resample *r = &res_comp[k];
+
+ // allocate line buffer big enough for upsampling off the edges
+ // with upsample factor of 4
+ z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);
+ if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
+
+ r->hs = z->img_h_max / z->img_comp[k].h;
+ r->vs = z->img_v_max / z->img_comp[k].v;
+ r->ystep = r->vs >> 1;
+ r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
+ r->ypos = 0;
+ r->line0 = r->line1 = z->img_comp[k].data;
+
+ if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
+ else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
+ else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
+ else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
+ else r->resample = stbi__resample_row_generic;
+ }
+
+ // can't error after this so, this is safe
+ output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
+ if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
+
+ // now go ahead and resample
+ for (j=0; j < z->s->img_y; ++j) {
+ stbi_uc *out = output + n * z->s->img_x * j;
+ for (k=0; k < decode_n; ++k) {
+ stbi__resample *r = &res_comp[k];
+ int y_bot = r->ystep >= (r->vs >> 1);
+ coutput[k] = r->resample(z->img_comp[k].linebuf,
+ y_bot ? r->line1 : r->line0,
+ y_bot ? r->line0 : r->line1,
+ r->w_lores, r->hs);
+ if (++r->ystep >= r->vs) {
+ r->ystep = 0;
+ r->line0 = r->line1;
+ if (++r->ypos < z->img_comp[k].y)
+ r->line1 += z->img_comp[k].w2;
+ }
+ }
+ if (n >= 3) {
+ stbi_uc *y = coutput[0];
+ if (z->s->img_n == 3) {
+ if (is_rgb) {
+ for (i=0; i < z->s->img_x; ++i) {
+ out[0] = y[i];
+ out[1] = coutput[1][i];
+ out[2] = coutput[2][i];
+ out[3] = 255;
+ out += n;
+ }
+ } else {
+ z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
+ }
+ } else if (z->s->img_n == 4) {
+ if (z->app14_color_transform == 0) { // CMYK
+ for (i=0; i < z->s->img_x; ++i) {
+ stbi_uc m = coutput[3][i];
+ out[0] = stbi__blinn_8x8(coutput[0][i], m);
+ out[1] = stbi__blinn_8x8(coutput[1][i], m);
+ out[2] = stbi__blinn_8x8(coutput[2][i], m);
+ out[3] = 255;
+ out += n;
+ }
+ } else if (z->app14_color_transform == 2) { // YCCK
+ z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
+ for (i=0; i < z->s->img_x; ++i) {
+ stbi_uc m = coutput[3][i];
+ out[0] = stbi__blinn_8x8(255 - out[0], m);
+ out[1] = stbi__blinn_8x8(255 - out[1], m);
+ out[2] = stbi__blinn_8x8(255 - out[2], m);
+ out += n;
+ }
+ } else { // YCbCr + alpha? Ignore the fourth channel for now
+ z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
+ }
+ } else
+ for (i=0; i < z->s->img_x; ++i) {
+ out[0] = out[1] = out[2] = y[i];
+ out[3] = 255; // not used if n==3
+ out += n;
+ }
+ } else {
+ if (is_rgb) {
+ if (n == 1)
+ for (i=0; i < z->s->img_x; ++i)
+ *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
+ else {
+ for (i=0; i < z->s->img_x; ++i, out += 2) {
+ out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
+ out[1] = 255;
+ }
+ }
+ } else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
+ for (i=0; i < z->s->img_x; ++i) {
+ stbi_uc m = coutput[3][i];
+ stbi_uc r = stbi__blinn_8x8(coutput[0][i], m);
+ stbi_uc g = stbi__blinn_8x8(coutput[1][i], m);
+ stbi_uc b = stbi__blinn_8x8(coutput[2][i], m);
+ out[0] = stbi__compute_y(r, g, b);
+ out[1] = 255;
+ out += n;
+ }
+ } else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
+ for (i=0; i < z->s->img_x; ++i) {
+ out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);
+ out[1] = 255;
+ out += n;
+ }
+ } else {
+ stbi_uc *y = coutput[0];
+ if (n == 1)
+ for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
+ else
+ for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; }
+ }
+ }
+ }
+ stbi__cleanup_jpeg(z);
+ *out_x = z->s->img_x;
+ *out_y = z->s->img_y;
+ if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output
+ return output;
+ }
+}
+
+static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
+{
+ unsigned char* result;
+ stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg));
+ if (!j) return stbi__errpuc("outofmem", "Out of memory");
+ memset(j, 0, sizeof(stbi__jpeg));
+ STBI_NOTUSED(ri);
+ j->s = s;
+ stbi__setup_jpeg(j);
+ result = load_jpeg_image(j, x,y,comp,req_comp);
+ STBI_FREE(j);
+ return result;
+}
+
+static int stbi__jpeg_test(stbi__context *s)
+{
+ int r;
+ stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg));
+ if (!j) return stbi__err("outofmem", "Out of memory");
+ memset(j, 0, sizeof(stbi__jpeg));
+ j->s = s;
+ stbi__setup_jpeg(j);
+ r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
+ stbi__rewind(s);
+ STBI_FREE(j);
+ return r;
+}
+
+static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)
+{
+ if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
+ stbi__rewind( j->s );
+ return 0;
+ }
+ if (x) *x = j->s->img_x;
+ if (y) *y = j->s->img_y;
+ if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;
+ return 1;
+}
+
+static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)
+{
+ int result;
+ stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg)));
+ if (!j) return stbi__err("outofmem", "Out of memory");
+ memset(j, 0, sizeof(stbi__jpeg));
+ j->s = s;
+ result = stbi__jpeg_info_raw(j, x, y, comp);
+ STBI_FREE(j);
+ return result;
+}
+#endif
+
+// public domain zlib decode v0.2 Sean Barrett 2006-11-18
+// simple implementation
+// - all input must be provided in an upfront buffer
+// - all output is written to a single output buffer (can malloc/realloc)
+// performance
+// - fast huffman
+
+#ifndef STBI_NO_ZLIB
+
+// fast-way is faster to check than jpeg huffman, but slow way is slower
+#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables
+#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
+#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet
+
+// zlib-style huffman encoding
+// (jpegs packs from left, zlib from right, so can't share code)
+typedef struct
+{
+ stbi__uint16 fast[1 << STBI__ZFAST_BITS];
+ stbi__uint16 firstcode[16];
+ int maxcode[17];
+ stbi__uint16 firstsymbol[16];
+ stbi_uc size[STBI__ZNSYMS];
+ stbi__uint16 value[STBI__ZNSYMS];
+} stbi__zhuffman;
+
+stbi_inline static int stbi__bitreverse16(int n)
+{
+ n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
+ n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
+ n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
+ n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
+ return n;
+}
+
+stbi_inline static int stbi__bit_reverse(int v, int bits)
+{
+ STBI_ASSERT(bits <= 16);
+ // to bit reverse n bits, reverse 16 and shift
+ // e.g. 11 bits, bit reverse and shift away 5
+ return stbi__bitreverse16(v) >> (16-bits);
+}
+
+static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num)
+{
+ int i,k=0;
+ int code, next_code[16], sizes[17];
+
+ // DEFLATE spec for generating codes
+ memset(sizes, 0, sizeof(sizes));
+ memset(z->fast, 0, sizeof(z->fast));
+ for (i=0; i < num; ++i)
+ ++sizes[sizelist[i]];
+ sizes[0] = 0;
+ for (i=1; i < 16; ++i)
+ if (sizes[i] > (1 << i))
+ return stbi__err("bad sizes", "Corrupt PNG");
+ code = 0;
+ for (i=1; i < 16; ++i) {
+ next_code[i] = code;
+ z->firstcode[i] = (stbi__uint16) code;
+ z->firstsymbol[i] = (stbi__uint16) k;
+ code = (code + sizes[i]);
+ if (sizes[i])
+ if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG");
+ z->maxcode[i] = code << (16-i); // preshift for inner loop
+ code <<= 1;
+ k += sizes[i];
+ }
+ z->maxcode[16] = 0x10000; // sentinel
+ for (i=0; i < num; ++i) {
+ int s = sizelist[i];
+ if (s) {
+ int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
+ stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
+ z->size [c] = (stbi_uc ) s;
+ z->value[c] = (stbi__uint16) i;
+ if (s <= STBI__ZFAST_BITS) {
+ int j = stbi__bit_reverse(next_code[s],s);
+ while (j < (1 << STBI__ZFAST_BITS)) {
+ z->fast[j] = fastv;
+ j += (1 << s);
+ }
+ }
+ ++next_code[s];
+ }
+ }
+ return 1;
+}
+
+// zlib-from-memory implementation for PNG reading
+// because PNG allows splitting the zlib stream arbitrarily,
+// and it's annoying structurally to have PNG call ZLIB call PNG,
+// we require PNG read all the IDATs and combine them into a single
+// memory buffer
+
+typedef struct
+{
+ stbi_uc *zbuffer, *zbuffer_end;
+ int num_bits;
+ int hit_zeof_once;
+ stbi__uint32 code_buffer;
+
+ char *zout;
+ char *zout_start;
+ char *zout_end;
+ int z_expandable;
+
+ stbi__zhuffman z_length, z_distance;
+} stbi__zbuf;
+
+stbi_inline static int stbi__zeof(stbi__zbuf *z)
+{
+ return (z->zbuffer >= z->zbuffer_end);
+}
+
+stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z)
+{
+ return stbi__zeof(z) ? 0 : *z->zbuffer++;
+}
+
+static void stbi__fill_bits(stbi__zbuf *z)
+{
+ do {
+ if (z->code_buffer >= (1U << z->num_bits)) {
+ z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */
+ return;
+ }
+ z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits;
+ z->num_bits += 8;
+ } while (z->num_bits <= 24);
+}
+
+stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n)
+{
+ unsigned int k;
+ if (z->num_bits < n) stbi__fill_bits(z);
+ k = z->code_buffer & ((1 << n) - 1);
+ z->code_buffer >>= n;
+ z->num_bits -= n;
+ return k;
+}
+
+static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
+{
+ int b,s,k;
+ // not resolved by fast table, so compute it the slow way
+ // use jpeg approach, which requires MSbits at top
+ k = stbi__bit_reverse(a->code_buffer, 16);
+ for (s=STBI__ZFAST_BITS+1; ; ++s)
+ if (k < z->maxcode[s])
+ break;
+ if (s >= 16) return -1; // invalid code!
+ // code size is s, so:
+ b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
+ if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere!
+ if (z->size[b] != s) return -1; // was originally an assert, but report failure instead.
+ a->code_buffer >>= s;
+ a->num_bits -= s;
+ return z->value[b];
+}
+
+stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
+{
+ int b,s;
+ if (a->num_bits < 16) {
+ if (stbi__zeof(a)) {
+ if (!a->hit_zeof_once) {
+ // This is the first time we hit eof, insert 16 extra padding btis
+ // to allow us to keep going; if we actually consume any of them
+ // though, that is invalid data. This is caught later.
+ a->hit_zeof_once = 1;
+ a->num_bits += 16; // add 16 implicit zero bits
+ } else {
+ // We already inserted our extra 16 padding bits and are again
+ // out, this stream is actually prematurely terminated.
+ return -1;
+ }
+ } else {
+ stbi__fill_bits(a);
+ }
+ }
+ b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
+ if (b) {
+ s = b >> 9;
+ a->code_buffer >>= s;
+ a->num_bits -= s;
+ return b & 511;
+ }
+ return stbi__zhuffman_decode_slowpath(a, z);
+}
+
+static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes
+{
+ char *q;
+ unsigned int cur, limit, old_limit;
+ z->zout = zout;
+ if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG");
+ cur = (unsigned int) (z->zout - z->zout_start);
+ limit = old_limit = (unsigned) (z->zout_end - z->zout_start);
+ if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory");
+ while (cur + n > limit) {
+ if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory");
+ limit *= 2;
+ }
+ q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
+ STBI_NOTUSED(old_limit);
+ if (q == NULL) return stbi__err("outofmem", "Out of memory");
+ z->zout_start = q;
+ z->zout = q + cur;
+ z->zout_end = q + limit;
+ return 1;
+}
+
+static const int stbi__zlength_base[31] = {
+ 3,4,5,6,7,8,9,10,11,13,
+ 15,17,19,23,27,31,35,43,51,59,
+ 67,83,99,115,131,163,195,227,258,0,0 };
+
+static const int stbi__zlength_extra[31]=
+{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };
+
+static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
+257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
+
+static const int stbi__zdist_extra[32] =
+{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
+
+static int stbi__parse_huffman_block(stbi__zbuf *a)
+{
+ char *zout = a->zout;
+ for(;;) {
+ int z = stbi__zhuffman_decode(a, &a->z_length);
+ if (z < 256) {
+ if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes
+ if (zout >= a->zout_end) {
+ if (!stbi__zexpand(a, zout, 1)) return 0;
+ zout = a->zout;
+ }
+ *zout++ = (char) z;
+ } else {
+ stbi_uc *p;
+ int len,dist;
+ if (z == 256) {
+ a->zout = zout;
+ if (a->hit_zeof_once && a->num_bits < 16) {
+ // The first time we hit zeof, we inserted 16 extra zero bits into our bit
+ // buffer so the decoder can just do its speculative decoding. But if we
+ // actually consumed any of those bits (which is the case when num_bits < 16),
+ // the stream actually read past the end so it is malformed.
+ return stbi__err("unexpected end","Corrupt PNG");
+ }
+ return 1;
+ }
+ if (z >= 286) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data
+ z -= 257;
+ len = stbi__zlength_base[z];
+ if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
+ z = stbi__zhuffman_decode(a, &a->z_distance);
+ if (z < 0 || z >= 30) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data
+ dist = stbi__zdist_base[z];
+ if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
+ if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG");
+ if (len > a->zout_end - zout) {
+ if (!stbi__zexpand(a, zout, len)) return 0;
+ zout = a->zout;
+ }
+ p = (stbi_uc *) (zout - dist);
+ if (dist == 1) { // run of one byte; common in images.
+ stbi_uc v = *p;
+ if (len) { do *zout++ = v; while (--len); }
+ } else {
+ if (len) { do *zout++ = *p++; while (--len); }
+ }
+ }
+ }
+}
+
+static int stbi__compute_huffman_codes(stbi__zbuf *a)
+{
+ static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
+ stbi__zhuffman z_codelength;
+ stbi_uc lencodes[286+32+137];//padding for maximum single op
+ stbi_uc codelength_sizes[19];
+ int i,n;
+
+ int hlit = stbi__zreceive(a,5) + 257;
+ int hdist = stbi__zreceive(a,5) + 1;
+ int hclen = stbi__zreceive(a,4) + 4;
+ int ntot = hlit + hdist;
+
+ memset(codelength_sizes, 0, sizeof(codelength_sizes));
+ for (i=0; i < hclen; ++i) {
+ int s = stbi__zreceive(a,3);
+ codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;
+ }
+ if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;
+
+ n = 0;
+ while (n < ntot) {
+ int c = stbi__zhuffman_decode(a, &z_codelength);
+ if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG");
+ if (c < 16)
+ lencodes[n++] = (stbi_uc) c;
+ else {
+ stbi_uc fill = 0;
+ if (c == 16) {
+ c = stbi__zreceive(a,2)+3;
+ if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG");
+ fill = lencodes[n-1];
+ } else if (c == 17) {
+ c = stbi__zreceive(a,3)+3;
+ } else if (c == 18) {
+ c = stbi__zreceive(a,7)+11;
+ } else {
+ return stbi__err("bad codelengths", "Corrupt PNG");
+ }
+ if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG");
+ memset(lencodes+n, fill, c);
+ n += c;
+ }
+ }
+ if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG");
+ if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;
+ if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;
+ return 1;
+}
+
+static int stbi__parse_uncompressed_block(stbi__zbuf *a)
+{
+ stbi_uc header[4];
+ int len,nlen,k;
+ if (a->num_bits & 7)
+ stbi__zreceive(a, a->num_bits & 7); // discard
+ // drain the bit-packed data into header
+ k = 0;
+ while (a->num_bits > 0) {
+ header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check
+ a->code_buffer >>= 8;
+ a->num_bits -= 8;
+ }
+ if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG");
+ // now fill header the normal way
+ while (k < 4)
+ header[k++] = stbi__zget8(a);
+ len = header[1] * 256 + header[0];
+ nlen = header[3] * 256 + header[2];
+ if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG");
+ if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG");
+ if (a->zout + len > a->zout_end)
+ if (!stbi__zexpand(a, a->zout, len)) return 0;
+ memcpy(a->zout, a->zbuffer, len);
+ a->zbuffer += len;
+ a->zout += len;
+ return 1;
+}
+
+static int stbi__parse_zlib_header(stbi__zbuf *a)
+{
+ int cmf = stbi__zget8(a);
+ int cm = cmf & 15;
+ /* int cinfo = cmf >> 4; */
+ int flg = stbi__zget8(a);
+ if (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec
+ if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec
+ if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png
+ if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png
+ // window = 1 << (8 + cinfo)... but who cares, we fully buffer output
+ return 1;
+}
+
+static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] =
+{
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
+ 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
+ 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
+ 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8
+};
+static const stbi_uc stbi__zdefault_distance[32] =
+{
+ 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
+};
+/*
+Init algorithm:
+{
+ int i; // use <= to match clearly with spec
+ for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8;
+ for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9;
+ for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7;
+ for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8;
+
+ for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5;
+}
+*/
+
+static int stbi__parse_zlib(stbi__zbuf *a, int parse_header)
+{
+ int final, type;
+ if (parse_header)
+ if (!stbi__parse_zlib_header(a)) return 0;
+ a->num_bits = 0;
+ a->code_buffer = 0;
+ a->hit_zeof_once = 0;
+ do {
+ final = stbi__zreceive(a,1);
+ type = stbi__zreceive(a,2);
+ if (type == 0) {
+ if (!stbi__parse_uncompressed_block(a)) return 0;
+ } else if (type == 3) {
+ return 0;
+ } else {
+ if (type == 1) {
+ // use fixed code lengths
+ if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS)) return 0;
+ if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0;
+ } else {
+ if (!stbi__compute_huffman_codes(a)) return 0;
+ }
+ if (!stbi__parse_huffman_block(a)) return 0;
+ }
+ } while (!final);
+ return 1;
+}
+
+static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header)
+{
+ a->zout_start = obuf;
+ a->zout = obuf;
+ a->zout_end = obuf + olen;
+ a->z_expandable = exp;
+
+ return stbi__parse_zlib(a, parse_header);
+}
+
+STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)
+{
+ stbi__zbuf a;
+ char *p = (char *) stbi__malloc(initial_size);
+ if (p == NULL) return NULL;
+ a.zbuffer = (stbi_uc *) buffer;
+ a.zbuffer_end = (stbi_uc *) buffer + len;
+ if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
+ if (outlen) *outlen = (int) (a.zout - a.zout_start);
+ return a.zout_start;
+ } else {
+ STBI_FREE(a.zout_start);
+ return NULL;
+ }
+}
+
+STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)
+{
+ return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
+}
+
+STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)
+{
+ stbi__zbuf a;
+ char *p = (char *) stbi__malloc(initial_size);
+ if (p == NULL) return NULL;
+ a.zbuffer = (stbi_uc *) buffer;
+ a.zbuffer_end = (stbi_uc *) buffer + len;
+ if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
+ if (outlen) *outlen = (int) (a.zout - a.zout_start);
+ return a.zout_start;
+ } else {
+ STBI_FREE(a.zout_start);
+ return NULL;
+ }
+}
+
+STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)
+{
+ stbi__zbuf a;
+ a.zbuffer = (stbi_uc *) ibuffer;
+ a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
+ if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
+ return (int) (a.zout - a.zout_start);
+ else
+ return -1;
+}
+
+STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)
+{
+ stbi__zbuf a;
+ char *p = (char *) stbi__malloc(16384);
+ if (p == NULL) return NULL;
+ a.zbuffer = (stbi_uc *) buffer;
+ a.zbuffer_end = (stbi_uc *) buffer+len;
+ if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
+ if (outlen) *outlen = (int) (a.zout - a.zout_start);
+ return a.zout_start;
+ } else {
+ STBI_FREE(a.zout_start);
+ return NULL;
+ }
+}
+
+STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
+{
+ stbi__zbuf a;
+ a.zbuffer = (stbi_uc *) ibuffer;
+ a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
+ if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
+ return (int) (a.zout - a.zout_start);
+ else
+ return -1;
+}
+#endif
+
+// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18
+// simple implementation
+// - only 8-bit samples
+// - no CRC checking
+// - allocates lots of intermediate memory
+// - avoids problem of streaming data between subsystems
+// - avoids explicit window management
+// performance
+// - uses stb_zlib, a PD zlib implementation with fast huffman decoding
+
+#ifndef STBI_NO_PNG
+typedef struct
+{
+ stbi__uint32 length;
+ stbi__uint32 type;
+} stbi__pngchunk;
+
+static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
+{
+ stbi__pngchunk c;
+ c.length = stbi__get32be(s);
+ c.type = stbi__get32be(s);
+ return c;
+}
+
+static int stbi__check_png_header(stbi__context *s)
+{
+ static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
+ int i;
+ for (i=0; i < 8; ++i)
+ if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG");
+ return 1;
+}
+
+typedef struct
+{
+ stbi__context *s;
+ stbi_uc *idata, *expanded, *out;
+ int depth;
+} stbi__png;
+
+
+enum {
+ STBI__F_none=0,
+ STBI__F_sub=1,
+ STBI__F_up=2,
+ STBI__F_avg=3,
+ STBI__F_paeth=4,
+ // synthetic filter used for first scanline to avoid needing a dummy row of 0s
+ STBI__F_avg_first
+};
+
+static stbi_uc first_row_filter[5] =
+{
+ STBI__F_none,
+ STBI__F_sub,
+ STBI__F_none,
+ STBI__F_avg_first,
+ STBI__F_sub // Paeth with b=c=0 turns out to be equivalent to sub
+};
+
+static int stbi__paeth(int a, int b, int c)
+{
+ // This formulation looks very different from the reference in the PNG spec, but is
+ // actually equivalent and has favorable data dependencies and admits straightforward
+ // generation of branch-free code, which helps performance significantly.
+ int thresh = c*3 - (a + b);
+ int lo = a < b ? a : b;
+ int hi = a < b ? b : a;
+ int t0 = (hi <= thresh) ? lo : c;
+ int t1 = (thresh <= lo) ? hi : t0;
+ return t1;
+}
+
+static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
+
+// adds an extra all-255 alpha channel
+// dest == src is legal
+// img_n must be 1 or 3
+static void stbi__create_png_alpha_expand8(stbi_uc *dest, stbi_uc *src, stbi__uint32 x, int img_n)
+{
+ int i;
+ // must process data backwards since we allow dest==src
+ if (img_n == 1) {
+ for (i=x-1; i >= 0; --i) {
+ dest[i*2+1] = 255;
+ dest[i*2+0] = src[i];
+ }
+ } else {
+ STBI_ASSERT(img_n == 3);
+ for (i=x-1; i >= 0; --i) {
+ dest[i*4+3] = 255;
+ dest[i*4+2] = src[i*3+2];
+ dest[i*4+1] = src[i*3+1];
+ dest[i*4+0] = src[i*3+0];
+ }
+ }
+}
+
+// create the png data from post-deflated data
+static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color)
+{
+ int bytes = (depth == 16 ? 2 : 1);
+ stbi__context *s = a->s;
+ stbi__uint32 i,j,stride = x*out_n*bytes;
+ stbi__uint32 img_len, img_width_bytes;
+ stbi_uc *filter_buf;
+ int all_ok = 1;
+ int k;
+ int img_n = s->img_n; // copy it into a local for later
+
+ int output_bytes = out_n*bytes;
+ int filter_bytes = img_n*bytes;
+ int width = x;
+
+ STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
+ a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into
+ if (!a->out) return stbi__err("outofmem", "Out of memory");
+
+ // note: error exits here don't need to clean up a->out individually,
+ // stbi__do_png always does on error.
+ if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG");
+ img_width_bytes = (((img_n * x * depth) + 7) >> 3);
+ if (!stbi__mad2sizes_valid(img_width_bytes, y, img_width_bytes)) return stbi__err("too large", "Corrupt PNG");
+ img_len = (img_width_bytes + 1) * y;
+
+ // we used to check for exact match between raw_len and img_len on non-interlaced PNGs,
+ // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros),
+ // so just check for raw_len < img_len always.
+ if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG");
+
+ // Allocate two scan lines worth of filter workspace buffer.
+ filter_buf = (stbi_uc *) stbi__malloc_mad2(img_width_bytes, 2, 0);
+ if (!filter_buf) return stbi__err("outofmem", "Out of memory");
+
+ // Filtering for low-bit-depth images
+ if (depth < 8) {
+ filter_bytes = 1;
+ width = img_width_bytes;
+ }
+
+ for (j=0; j < y; ++j) {
+ // cur/prior filter buffers alternate
+ stbi_uc *cur = filter_buf + (j & 1)*img_width_bytes;
+ stbi_uc *prior = filter_buf + (~j & 1)*img_width_bytes;
+ stbi_uc *dest = a->out + stride*j;
+ int nk = width * filter_bytes;
+ int filter = *raw++;
+
+ // check filter type
+ if (filter > 4) {
+ all_ok = stbi__err("invalid filter","Corrupt PNG");
+ break;
+ }
+
+ // if first row, use special filter that doesn't sample previous row
+ if (j == 0) filter = first_row_filter[filter];
+
+ // perform actual filtering
+ switch (filter) {
+ case STBI__F_none:
+ memcpy(cur, raw, nk);
+ break;
+ case STBI__F_sub:
+ memcpy(cur, raw, filter_bytes);
+ for (k = filter_bytes; k < nk; ++k)
+ cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]);
+ break;
+ case STBI__F_up:
+ for (k = 0; k < nk; ++k)
+ cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
+ break;
+ case STBI__F_avg:
+ for (k = 0; k < filter_bytes; ++k)
+ cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1));
+ for (k = filter_bytes; k < nk; ++k)
+ cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1));
+ break;
+ case STBI__F_paeth:
+ for (k = 0; k < filter_bytes; ++k)
+ cur[k] = STBI__BYTECAST(raw[k] + prior[k]); // prior[k] == stbi__paeth(0,prior[k],0)
+ for (k = filter_bytes; k < nk; ++k)
+ cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes], prior[k], prior[k-filter_bytes]));
+ break;
+ case STBI__F_avg_first:
+ memcpy(cur, raw, filter_bytes);
+ for (k = filter_bytes; k < nk; ++k)
+ cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1));
+ break;
+ }
+
+ raw += nk;
+
+ // expand decoded bits in cur to dest, also adding an extra alpha channel if desired
+ if (depth < 8) {
+ stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range
+ stbi_uc *in = cur;
+ stbi_uc *out = dest;
+ stbi_uc inb = 0;
+ stbi__uint32 nsmp = x*img_n;
+
+ // expand bits to bytes first
+ if (depth == 4) {
+ for (i=0; i < nsmp; ++i) {
+ if ((i & 1) == 0) inb = *in++;
+ *out++ = scale * (inb >> 4);
+ inb <<= 4;
+ }
+ } else if (depth == 2) {
+ for (i=0; i < nsmp; ++i) {
+ if ((i & 3) == 0) inb = *in++;
+ *out++ = scale * (inb >> 6);
+ inb <<= 2;
+ }
+ } else {
+ STBI_ASSERT(depth == 1);
+ for (i=0; i < nsmp; ++i) {
+ if ((i & 7) == 0) inb = *in++;
+ *out++ = scale * (inb >> 7);
+ inb <<= 1;
+ }
+ }
+
+ // insert alpha=255 values if desired
+ if (img_n != out_n)
+ stbi__create_png_alpha_expand8(dest, dest, x, img_n);
+ } else if (depth == 8) {
+ if (img_n == out_n)
+ memcpy(dest, cur, x*img_n);
+ else
+ stbi__create_png_alpha_expand8(dest, cur, x, img_n);
+ } else if (depth == 16) {
+ // convert the image data from big-endian to platform-native
+ stbi__uint16 *dest16 = (stbi__uint16*)dest;
+ stbi__uint32 nsmp = x*img_n;
+
+ if (img_n == out_n) {
+ for (i = 0; i < nsmp; ++i, ++dest16, cur += 2)
+ *dest16 = (cur[0] << 8) | cur[1];
+ } else {
+ STBI_ASSERT(img_n+1 == out_n);
+ if (img_n == 1) {
+ for (i = 0; i < x; ++i, dest16 += 2, cur += 2) {
+ dest16[0] = (cur[0] << 8) | cur[1];
+ dest16[1] = 0xffff;
+ }
+ } else {
+ STBI_ASSERT(img_n == 3);
+ for (i = 0; i < x; ++i, dest16 += 4, cur += 6) {
+ dest16[0] = (cur[0] << 8) | cur[1];
+ dest16[1] = (cur[2] << 8) | cur[3];
+ dest16[2] = (cur[4] << 8) | cur[5];
+ dest16[3] = 0xffff;
+ }
+ }
+ }
+ }
+ }
+
+ STBI_FREE(filter_buf);
+ if (!all_ok) return 0;
+
+ return 1;
+}
+
+static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced)
+{
+ int bytes = (depth == 16 ? 2 : 1);
+ int out_bytes = out_n * bytes;
+ stbi_uc *final;
+ int p;
+ if (!interlaced)
+ return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
+
+ // de-interlacing
+ final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
+ if (!final) return stbi__err("outofmem", "Out of memory");
+ for (p=0; p < 7; ++p) {
+ int xorig[] = { 0,4,0,2,0,1,0 };
+ int yorig[] = { 0,0,4,0,2,0,1 };
+ int xspc[] = { 8,8,4,4,2,2,1 };
+ int yspc[] = { 8,8,8,4,4,2,2 };
+ int i,j,x,y;
+ // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1
+ x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
+ y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
+ if (x && y) {
+ stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
+ if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
+ STBI_FREE(final);
+ return 0;
+ }
+ for (j=0; j < y; ++j) {
+ for (i=0; i < x; ++i) {
+ int out_y = j*yspc[p]+yorig[p];
+ int out_x = i*xspc[p]+xorig[p];
+ memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,
+ a->out + (j*x+i)*out_bytes, out_bytes);
+ }
+ }
+ STBI_FREE(a->out);
+ image_data += img_len;
+ image_data_len -= img_len;
+ }
+ }
+ a->out = final;
+
+ return 1;
+}
+
+static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n)
+{
+ stbi__context *s = z->s;
+ stbi__uint32 i, pixel_count = s->img_x * s->img_y;
+ stbi_uc *p = z->out;
+
+ // compute color-based transparency, assuming we've
+ // already got 255 as the alpha value in the output
+ STBI_ASSERT(out_n == 2 || out_n == 4);
+
+ if (out_n == 2) {
+ for (i=0; i < pixel_count; ++i) {
+ p[1] = (p[0] == tc[0] ? 0 : 255);
+ p += 2;
+ }
+ } else {
+ for (i=0; i < pixel_count; ++i) {
+ if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
+ p[3] = 0;
+ p += 4;
+ }
+ }
+ return 1;
+}
+
+static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n)
+{
+ stbi__context *s = z->s;
+ stbi__uint32 i, pixel_count = s->img_x * s->img_y;
+ stbi__uint16 *p = (stbi__uint16*) z->out;
+
+ // compute color-based transparency, assuming we've
+ // already got 65535 as the alpha value in the output
+ STBI_ASSERT(out_n == 2 || out_n == 4);
+
+ if (out_n == 2) {
+ for (i = 0; i < pixel_count; ++i) {
+ p[1] = (p[0] == tc[0] ? 0 : 65535);
+ p += 2;
+ }
+ } else {
+ for (i = 0; i < pixel_count; ++i) {
+ if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
+ p[3] = 0;
+ p += 4;
+ }
+ }
+ return 1;
+}
+
+static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n)
+{
+ stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
+ stbi_uc *p, *temp_out, *orig = a->out;
+
+ p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0);
+ if (p == NULL) return stbi__err("outofmem", "Out of memory");
+
+ // between here and free(out) below, exitting would leak
+ temp_out = p;
+
+ if (pal_img_n == 3) {
+ for (i=0; i < pixel_count; ++i) {
+ int n = orig[i]*4;
+ p[0] = palette[n ];
+ p[1] = palette[n+1];
+ p[2] = palette[n+2];
+ p += 3;
+ }
+ } else {
+ for (i=0; i < pixel_count; ++i) {
+ int n = orig[i]*4;
+ p[0] = palette[n ];
+ p[1] = palette[n+1];
+ p[2] = palette[n+2];
+ p[3] = palette[n+3];
+ p += 4;
+ }
+ }
+ STBI_FREE(a->out);
+ a->out = temp_out;
+
+ STBI_NOTUSED(len);
+
+ return 1;
+}
+
+static int stbi__unpremultiply_on_load_global = 0;
+static int stbi__de_iphone_flag_global = 0;
+
+STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
+{
+ stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply;
+}
+
+STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
+{
+ stbi__de_iphone_flag_global = flag_true_if_should_convert;
+}
+
+#ifndef STBI_THREAD_LOCAL
+#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global
+#define stbi__de_iphone_flag stbi__de_iphone_flag_global
+#else
+static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set;
+static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set;
+
+STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply)
+{
+ stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply;
+ stbi__unpremultiply_on_load_set = 1;
+}
+
+STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert)
+{
+ stbi__de_iphone_flag_local = flag_true_if_should_convert;
+ stbi__de_iphone_flag_set = 1;
+}
+
+#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \
+ ? stbi__unpremultiply_on_load_local \
+ : stbi__unpremultiply_on_load_global)
+#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \
+ ? stbi__de_iphone_flag_local \
+ : stbi__de_iphone_flag_global)
+#endif // STBI_THREAD_LOCAL
+
+static void stbi__de_iphone(stbi__png *z)
+{
+ stbi__context *s = z->s;
+ stbi__uint32 i, pixel_count = s->img_x * s->img_y;
+ stbi_uc *p = z->out;
+
+ if (s->img_out_n == 3) { // convert bgr to rgb
+ for (i=0; i < pixel_count; ++i) {
+ stbi_uc t = p[0];
+ p[0] = p[2];
+ p[2] = t;
+ p += 3;
+ }
+ } else {
+ STBI_ASSERT(s->img_out_n == 4);
+ if (stbi__unpremultiply_on_load) {
+ // convert bgr to rgb and unpremultiply
+ for (i=0; i < pixel_count; ++i) {
+ stbi_uc a = p[3];
+ stbi_uc t = p[0];
+ if (a) {
+ stbi_uc half = a / 2;
+ p[0] = (p[2] * 255 + half) / a;
+ p[1] = (p[1] * 255 + half) / a;
+ p[2] = ( t * 255 + half) / a;
+ } else {
+ p[0] = p[2];
+ p[2] = t;
+ }
+ p += 4;
+ }
+ } else {
+ // convert bgr to rgb
+ for (i=0; i < pixel_count; ++i) {
+ stbi_uc t = p[0];
+ p[0] = p[2];
+ p[2] = t;
+ p += 4;
+ }
+ }
+ }
+}
+
+#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d))
+
+static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
+{
+ stbi_uc palette[1024], pal_img_n=0;
+ stbi_uc has_trans=0, tc[3]={0};
+ stbi__uint16 tc16[3];
+ stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
+ int first=1,k,interlace=0, color=0, is_iphone=0;
+ stbi__context *s = z->s;
+
+ z->expanded = NULL;
+ z->idata = NULL;
+ z->out = NULL;
+
+ if (!stbi__check_png_header(s)) return 0;
+
+ if (scan == STBI__SCAN_type) return 1;
+
+ for (;;) {
+ stbi__pngchunk c = stbi__get_chunk_header(s);
+ switch (c.type) {
+ case STBI__PNG_TYPE('C','g','B','I'):
+ is_iphone = 1;
+ stbi__skip(s, c.length);
+ break;
+ case STBI__PNG_TYPE('I','H','D','R'): {
+ int comp,filter;
+ if (!first) return stbi__err("multiple IHDR","Corrupt PNG");
+ first = 0;
+ if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG");
+ s->img_x = stbi__get32be(s);
+ s->img_y = stbi__get32be(s);
+ if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
+ if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
+ z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only");
+ color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG");
+ if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG");
+ if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG");
+ comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG");
+ filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG");
+ interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG");
+ if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG");
+ if (!pal_img_n) {
+ s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
+ if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode");
+ } else {
+ // if paletted, then pal_n is our final components, and
+ // img_n is # components to decompress/filter.
+ s->img_n = 1;
+ if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG");
+ }
+ // even with SCAN_header, have to scan to see if we have a tRNS
+ break;
+ }
+
+ case STBI__PNG_TYPE('P','L','T','E'): {
+ if (first) return stbi__err("first not IHDR", "Corrupt PNG");
+ if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG");
+ pal_len = c.length / 3;
+ if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG");
+ for (i=0; i < pal_len; ++i) {
+ palette[i*4+0] = stbi__get8(s);
+ palette[i*4+1] = stbi__get8(s);
+ palette[i*4+2] = stbi__get8(s);
+ palette[i*4+3] = 255;
+ }
+ break;
+ }
+
+ case STBI__PNG_TYPE('t','R','N','S'): {
+ if (first) return stbi__err("first not IHDR", "Corrupt PNG");
+ if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG");
+ if (pal_img_n) {
+ if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; }
+ if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG");
+ if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG");
+ pal_img_n = 4;
+ for (i=0; i < c.length; ++i)
+ palette[i*4+3] = stbi__get8(s);
+ } else {
+ if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG");
+ if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG");
+ has_trans = 1;
+ // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now.
+ if (scan == STBI__SCAN_header) { ++s->img_n; return 1; }
+ if (z->depth == 16) {
+ for (k = 0; k < s->img_n && k < 3; ++k) // extra loop test to suppress false GCC warning
+ tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is
+ } else {
+ for (k = 0; k < s->img_n && k < 3; ++k)
+ tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger
+ }
+ }
+ break;
+ }
+
+ case STBI__PNG_TYPE('I','D','A','T'): {
+ if (first) return stbi__err("first not IHDR", "Corrupt PNG");
+ if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG");
+ if (scan == STBI__SCAN_header) {
+ // header scan definitely stops at first IDAT
+ if (pal_img_n)
+ s->img_n = pal_img_n;
+ return 1;
+ }
+ if (c.length > (1u << 30)) return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes");
+ if ((int)(ioff + c.length) < (int)ioff) return 0;
+ if (ioff + c.length > idata_limit) {
+ stbi__uint32 idata_limit_old = idata_limit;
+ stbi_uc *p;
+ if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
+ while (ioff + c.length > idata_limit)
+ idata_limit *= 2;
+ STBI_NOTUSED(idata_limit_old);
+ p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory");
+ z->idata = p;
+ }
+ if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG");
+ ioff += c.length;
+ break;
+ }
+
+ case STBI__PNG_TYPE('I','E','N','D'): {
+ stbi__uint32 raw_len, bpl;
+ if (first) return stbi__err("first not IHDR", "Corrupt PNG");
+ if (scan != STBI__SCAN_load) return 1;
+ if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG");
+ // initial guess for decoded data size to avoid unnecessary reallocs
+ bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component
+ raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */;
+ z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone);
+ if (z->expanded == NULL) return 0; // zlib should set error
+ STBI_FREE(z->idata); z->idata = NULL;
+ if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
+ s->img_out_n = s->img_n+1;
+ else
+ s->img_out_n = s->img_n;
+ if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0;
+ if (has_trans) {
+ if (z->depth == 16) {
+ if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0;
+ } else {
+ if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0;
+ }
+ }
+ if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
+ stbi__de_iphone(z);
+ if (pal_img_n) {
+ // pal_img_n == 3 or 4
+ s->img_n = pal_img_n; // record the actual colors we had
+ s->img_out_n = pal_img_n;
+ if (req_comp >= 3) s->img_out_n = req_comp;
+ if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
+ return 0;
+ } else if (has_trans) {
+ // non-paletted image with tRNS -> source image has (constant) alpha
+ ++s->img_n;
+ }
+ STBI_FREE(z->expanded); z->expanded = NULL;
+ // end of PNG chunk, read and skip CRC
+ stbi__get32be(s);
+ return 1;
+ }
+
+ default:
+ // if critical, fail
+ if (first) return stbi__err("first not IHDR", "Corrupt PNG");
+ if ((c.type & (1 << 29)) == 0) {
+ #ifndef STBI_NO_FAILURE_STRINGS
+ // not threadsafe
+ static char invalid_chunk[] = "XXXX PNG chunk not known";
+ invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
+ invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
+ invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
+ invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
+ #endif
+ return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type");
+ }
+ stbi__skip(s, c.length);
+ break;
+ }
+ // end of PNG chunk, read and skip CRC
+ stbi__get32be(s);
+ }
+}
+
+static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri)
+{
+ void *result=NULL;
+ if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
+ if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
+ if (p->depth <= 8)
+ ri->bits_per_channel = 8;
+ else if (p->depth == 16)
+ ri->bits_per_channel = 16;
+ else
+ return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth");
+ result = p->out;
+ p->out = NULL;
+ if (req_comp && req_comp != p->s->img_out_n) {
+ if (ri->bits_per_channel == 8)
+ result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
+ else
+ result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
+ p->s->img_out_n = req_comp;
+ if (result == NULL) return result;
+ }
+ *x = p->s->img_x;
+ *y = p->s->img_y;
+ if (n) *n = p->s->img_n;
+ }
+ STBI_FREE(p->out); p->out = NULL;
+ STBI_FREE(p->expanded); p->expanded = NULL;
+ STBI_FREE(p->idata); p->idata = NULL;
+
+ return result;
+}
+
+static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
+{
+ stbi__png p;
+ p.s = s;
+ return stbi__do_png(&p, x,y,comp,req_comp, ri);
+}
+
+static int stbi__png_test(stbi__context *s)
+{
+ int r;
+ r = stbi__check_png_header(s);
+ stbi__rewind(s);
+ return r;
+}
+
+static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp)
+{
+ if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
+ stbi__rewind( p->s );
+ return 0;
+ }
+ if (x) *x = p->s->img_x;
+ if (y) *y = p->s->img_y;
+ if (comp) *comp = p->s->img_n;
+ return 1;
+}
+
+static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)
+{
+ stbi__png p;
+ p.s = s;
+ return stbi__png_info_raw(&p, x, y, comp);
+}
+
+static int stbi__png_is16(stbi__context *s)
+{
+ stbi__png p;
+ p.s = s;
+ if (!stbi__png_info_raw(&p, NULL, NULL, NULL))
+ return 0;
+ if (p.depth != 16) {
+ stbi__rewind(p.s);
+ return 0;
+ }
+ return 1;
+}
+#endif
+
+// Microsoft/Windows BMP image
+
+#ifndef STBI_NO_BMP
+static int stbi__bmp_test_raw(stbi__context *s)
+{
+ int r;
+ int sz;
+ if (stbi__get8(s) != 'B') return 0;
+ if (stbi__get8(s) != 'M') return 0;
+ stbi__get32le(s); // discard filesize
+ stbi__get16le(s); // discard reserved
+ stbi__get16le(s); // discard reserved
+ stbi__get32le(s); // discard data offset
+ sz = stbi__get32le(s);
+ r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
+ return r;
+}
+
+static int stbi__bmp_test(stbi__context *s)
+{
+ int r = stbi__bmp_test_raw(s);
+ stbi__rewind(s);
+ return r;
+}
+
+
+// returns 0..31 for the highest set bit
+static int stbi__high_bit(unsigned int z)
+{
+ int n=0;
+ if (z == 0) return -1;
+ if (z >= 0x10000) { n += 16; z >>= 16; }
+ if (z >= 0x00100) { n += 8; z >>= 8; }
+ if (z >= 0x00010) { n += 4; z >>= 4; }
+ if (z >= 0x00004) { n += 2; z >>= 2; }
+ if (z >= 0x00002) { n += 1;/* >>= 1;*/ }
+ return n;
+}
+
+static int stbi__bitcount(unsigned int a)
+{
+ a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2
+ a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4
+ a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits
+ a = (a + (a >> 8)); // max 16 per 8 bits
+ a = (a + (a >> 16)); // max 32 per 8 bits
+ return a & 0xff;
+}
+
+// extract an arbitrarily-aligned N-bit value (N=bits)
+// from v, and then make it 8-bits long and fractionally
+// extend it to full full range.
+static int stbi__shiftsigned(unsigned int v, int shift, int bits)
+{
+ static unsigned int mul_table[9] = {
+ 0,
+ 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/,
+ 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/,
+ };
+ static unsigned int shift_table[9] = {
+ 0, 0,0,1,0,2,4,6,0,
+ };
+ if (shift < 0)
+ v <<= -shift;
+ else
+ v >>= shift;
+ STBI_ASSERT(v < 256);
+ v >>= (8-bits);
+ STBI_ASSERT(bits >= 0 && bits <= 8);
+ return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];
+}
+
+typedef struct
+{
+ int bpp, offset, hsz;
+ unsigned int mr,mg,mb,ma, all_a;
+ int extra_read;
+} stbi__bmp_data;
+
+static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress)
+{
+ // BI_BITFIELDS specifies masks explicitly, don't override
+ if (compress == 3)
+ return 1;
+
+ if (compress == 0) {
+ if (info->bpp == 16) {
+ info->mr = 31u << 10;
+ info->mg = 31u << 5;
+ info->mb = 31u << 0;
+ } else if (info->bpp == 32) {
+ info->mr = 0xffu << 16;
+ info->mg = 0xffu << 8;
+ info->mb = 0xffu << 0;
+ info->ma = 0xffu << 24;
+ info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0
+ } else {
+ // otherwise, use defaults, which is all-0
+ info->mr = info->mg = info->mb = info->ma = 0;
+ }
+ return 1;
+ }
+ return 0; // error
+}
+
+static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
+{
+ int hsz;
+ if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP");
+ stbi__get32le(s); // discard filesize
+ stbi__get16le(s); // discard reserved
+ stbi__get16le(s); // discard reserved
+ info->offset = stbi__get32le(s);
+ info->hsz = hsz = stbi__get32le(s);
+ info->mr = info->mg = info->mb = info->ma = 0;
+ info->extra_read = 14;
+
+ if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP");
+
+ if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown");
+ if (hsz == 12) {
+ s->img_x = stbi__get16le(s);
+ s->img_y = stbi__get16le(s);
+ } else {
+ s->img_x = stbi__get32le(s);
+ s->img_y = stbi__get32le(s);
+ }
+ if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP");
+ info->bpp = stbi__get16le(s);
+ if (hsz != 12) {
+ int compress = stbi__get32le(s);
+ if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE");
+ if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes
+ if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel
+ stbi__get32le(s); // discard sizeof
+ stbi__get32le(s); // discard hres
+ stbi__get32le(s); // discard vres
+ stbi__get32le(s); // discard colorsused
+ stbi__get32le(s); // discard max important
+ if (hsz == 40 || hsz == 56) {
+ if (hsz == 56) {
+ stbi__get32le(s);
+ stbi__get32le(s);
+ stbi__get32le(s);
+ stbi__get32le(s);
+ }
+ if (info->bpp == 16 || info->bpp == 32) {
+ if (compress == 0) {
+ stbi__bmp_set_mask_defaults(info, compress);
+ } else if (compress == 3) {
+ info->mr = stbi__get32le(s);
+ info->mg = stbi__get32le(s);
+ info->mb = stbi__get32le(s);
+ info->extra_read += 12;
+ // not documented, but generated by photoshop and handled by mspaint
+ if (info->mr == info->mg && info->mg == info->mb) {
+ // ?!?!?
+ return stbi__errpuc("bad BMP", "bad BMP");
+ }
+ } else
+ return stbi__errpuc("bad BMP", "bad BMP");
+ }
+ } else {
+ // V4/V5 header
+ int i;
+ if (hsz != 108 && hsz != 124)
+ return stbi__errpuc("bad BMP", "bad BMP");
+ info->mr = stbi__get32le(s);
+ info->mg = stbi__get32le(s);
+ info->mb = stbi__get32le(s);
+ info->ma = stbi__get32le(s);
+ if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs
+ stbi__bmp_set_mask_defaults(info, compress);
+ stbi__get32le(s); // discard color space
+ for (i=0; i < 12; ++i)
+ stbi__get32le(s); // discard color space parameters
+ if (hsz == 124) {
+ stbi__get32le(s); // discard rendering intent
+ stbi__get32le(s); // discard offset of profile data
+ stbi__get32le(s); // discard size of profile data
+ stbi__get32le(s); // discard reserved
+ }
+ }
+ }
+ return (void *) 1;
+}
+
+
+static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
+{
+ stbi_uc *out;
+ unsigned int mr=0,mg=0,mb=0,ma=0, all_a;
+ stbi_uc pal[256][4];
+ int psize=0,i,j,width;
+ int flip_vertically, pad, target;
+ stbi__bmp_data info;
+ STBI_NOTUSED(ri);
+
+ info.all_a = 255;
+ if (stbi__bmp_parse_header(s, &info) == NULL)
+ return NULL; // error code already set
+
+ flip_vertically = ((int) s->img_y) > 0;
+ s->img_y = abs((int) s->img_y);
+
+ if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
+ if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
+
+ mr = info.mr;
+ mg = info.mg;
+ mb = info.mb;
+ ma = info.ma;
+ all_a = info.all_a;
+
+ if (info.hsz == 12) {
+ if (info.bpp < 24)
+ psize = (info.offset - info.extra_read - 24) / 3;
+ } else {
+ if (info.bpp < 16)
+ psize = (info.offset - info.extra_read - info.hsz) >> 2;
+ }
+ if (psize == 0) {
+ // accept some number of extra bytes after the header, but if the offset points either to before
+ // the header ends or implies a large amount of extra data, reject the file as malformed
+ int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original);
+ int header_limit = 1024; // max we actually read is below 256 bytes currently.
+ int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size.
+ if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) {
+ return stbi__errpuc("bad header", "Corrupt BMP");
+ }
+ // we established that bytes_read_so_far is positive and sensible.
+ // the first half of this test rejects offsets that are either too small positives, or
+ // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn
+ // ensures the number computed in the second half of the test can't overflow.
+ if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) {
+ return stbi__errpuc("bad offset", "Corrupt BMP");
+ } else {
+ stbi__skip(s, info.offset - bytes_read_so_far);
+ }
+ }
+
+ if (info.bpp == 24 && ma == 0xff000000)
+ s->img_n = 3;
+ else
+ s->img_n = ma ? 4 : 3;
+ if (req_comp && req_comp >= 3) // we can directly decode 3 or 4
+ target = req_comp;
+ else
+ target = s->img_n; // if they want monochrome, we'll post-convert
+
+ // sanity-check size
+ if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
+ return stbi__errpuc("too large", "Corrupt BMP");
+
+ out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
+ if (!out) return stbi__errpuc("outofmem", "Out of memory");
+ if (info.bpp < 16) {
+ int z=0;
+ if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); }
+ for (i=0; i < psize; ++i) {
+ pal[i][2] = stbi__get8(s);
+ pal[i][1] = stbi__get8(s);
+ pal[i][0] = stbi__get8(s);
+ if (info.hsz != 12) stbi__get8(s);
+ pal[i][3] = 255;
+ }
+ stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
+ if (info.bpp == 1) width = (s->img_x + 7) >> 3;
+ else if (info.bpp == 4) width = (s->img_x + 1) >> 1;
+ else if (info.bpp == 8) width = s->img_x;
+ else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); }
+ pad = (-width)&3;
+ if (info.bpp == 1) {
+ for (j=0; j < (int) s->img_y; ++j) {
+ int bit_offset = 7, v = stbi__get8(s);
+ for (i=0; i < (int) s->img_x; ++i) {
+ int color = (v>>bit_offset)&0x1;
+ out[z++] = pal[color][0];
+ out[z++] = pal[color][1];
+ out[z++] = pal[color][2];
+ if (target == 4) out[z++] = 255;
+ if (i+1 == (int) s->img_x) break;
+ if((--bit_offset) < 0) {
+ bit_offset = 7;
+ v = stbi__get8(s);
+ }
+ }
+ stbi__skip(s, pad);
+ }
+ } else {
+ for (j=0; j < (int) s->img_y; ++j) {
+ for (i=0; i < (int) s->img_x; i += 2) {
+ int v=stbi__get8(s),v2=0;
+ if (info.bpp == 4) {
+ v2 = v & 15;
+ v >>= 4;
+ }
+ out[z++] = pal[v][0];
+ out[z++] = pal[v][1];
+ out[z++] = pal[v][2];
+ if (target == 4) out[z++] = 255;
+ if (i+1 == (int) s->img_x) break;
+ v = (info.bpp == 8) ? stbi__get8(s) : v2;
+ out[z++] = pal[v][0];
+ out[z++] = pal[v][1];
+ out[z++] = pal[v][2];
+ if (target == 4) out[z++] = 255;
+ }
+ stbi__skip(s, pad);
+ }
+ }
+ } else {
+ int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
+ int z = 0;
+ int easy=0;
+ stbi__skip(s, info.offset - info.extra_read - info.hsz);
+ if (info.bpp == 24) width = 3 * s->img_x;
+ else if (info.bpp == 16) width = 2*s->img_x;
+ else /* bpp = 32 and pad = 0 */ width=0;
+ pad = (-width) & 3;
+ if (info.bpp == 24) {
+ easy = 1;
+ } else if (info.bpp == 32) {
+ if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
+ easy = 2;
+ }
+ if (!easy) {
+ if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); }
+ // right shift amt to put high bit in position #7
+ rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
+ gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
+ bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
+ ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
+ if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); }
+ }
+ for (j=0; j < (int) s->img_y; ++j) {
+ if (easy) {
+ for (i=0; i < (int) s->img_x; ++i) {
+ unsigned char a;
+ out[z+2] = stbi__get8(s);
+ out[z+1] = stbi__get8(s);
+ out[z+0] = stbi__get8(s);
+ z += 3;
+ a = (easy == 2 ? stbi__get8(s) : 255);
+ all_a |= a;
+ if (target == 4) out[z++] = a;
+ }
+ } else {
+ int bpp = info.bpp;
+ for (i=0; i < (int) s->img_x; ++i) {
+ stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
+ unsigned int a;
+ out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
+ out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
+ out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
+ a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
+ all_a |= a;
+ if (target == 4) out[z++] = STBI__BYTECAST(a);
+ }
+ }
+ stbi__skip(s, pad);
+ }
+ }
+
+ // if alpha channel is all 0s, replace with all 255s
+ if (target == 4 && all_a == 0)
+ for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)
+ out[i] = 255;
+
+ if (flip_vertically) {
+ stbi_uc t;
+ for (j=0; j < (int) s->img_y>>1; ++j) {
+ stbi_uc *p1 = out + j *s->img_x*target;
+ stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
+ for (i=0; i < (int) s->img_x*target; ++i) {
+ t = p1[i]; p1[i] = p2[i]; p2[i] = t;
+ }
+ }
+ }
+
+ if (req_comp && req_comp != target) {
+ out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
+ if (out == NULL) return out; // stbi__convert_format frees input on failure
+ }
+
+ *x = s->img_x;
+ *y = s->img_y;
+ if (comp) *comp = s->img_n;
+ return out;
+}
+#endif
+
+// Targa Truevision - TGA
+// by Jonathan Dummer
+#ifndef STBI_NO_TGA
+// returns STBI_rgb or whatever, 0 on error
+static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16)
+{
+ // only RGB or RGBA (incl. 16bit) or grey allowed
+ if (is_rgb16) *is_rgb16 = 0;
+ switch(bits_per_pixel) {
+ case 8: return STBI_grey;
+ case 16: if(is_grey) return STBI_grey_alpha;
+ // fallthrough
+ case 15: if(is_rgb16) *is_rgb16 = 1;
+ return STBI_rgb;
+ case 24: // fallthrough
+ case 32: return bits_per_pixel/8;
+ default: return 0;
+ }
+}
+
+static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)
+{
+ int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
+ int sz, tga_colormap_type;
+ stbi__get8(s); // discard Offset
+ tga_colormap_type = stbi__get8(s); // colormap type
+ if( tga_colormap_type > 1 ) {
+ stbi__rewind(s);
+ return 0; // only RGB or indexed allowed
+ }
+ tga_image_type = stbi__get8(s); // image type
+ if ( tga_colormap_type == 1 ) { // colormapped (paletted) image
+ if (tga_image_type != 1 && tga_image_type != 9) {
+ stbi__rewind(s);
+ return 0;
+ }
+ stbi__skip(s,4); // skip index of first colormap entry and number of entries
+ sz = stbi__get8(s); // check bits per palette color entry
+ if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {
+ stbi__rewind(s);
+ return 0;
+ }
+ stbi__skip(s,4); // skip image x and y origin
+ tga_colormap_bpp = sz;
+ } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE
+ if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {
+ stbi__rewind(s);
+ return 0; // only RGB or grey allowed, +/- RLE
+ }
+ stbi__skip(s,9); // skip colormap specification and image x/y origin
+ tga_colormap_bpp = 0;
+ }
+ tga_w = stbi__get16le(s);
+ if( tga_w < 1 ) {
+ stbi__rewind(s);
+ return 0; // test width
+ }
+ tga_h = stbi__get16le(s);
+ if( tga_h < 1 ) {
+ stbi__rewind(s);
+ return 0; // test height
+ }
+ tga_bits_per_pixel = stbi__get8(s); // bits per pixel
+ stbi__get8(s); // ignore alpha bits
+ if (tga_colormap_bpp != 0) {
+ if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
+ // when using a colormap, tga_bits_per_pixel is the size of the indexes
+ // I don't think anything but 8 or 16bit indexes makes sense
+ stbi__rewind(s);
+ return 0;
+ }
+ tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
+ } else {
+ tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
+ }
+ if(!tga_comp) {
+ stbi__rewind(s);
+ return 0;
+ }
+ if (x) *x = tga_w;
+ if (y) *y = tga_h;
+ if (comp) *comp = tga_comp;
+ return 1; // seems to have passed everything
+}
+
+static int stbi__tga_test(stbi__context *s)
+{
+ int res = 0;
+ int sz, tga_color_type;
+ stbi__get8(s); // discard Offset
+ tga_color_type = stbi__get8(s); // color type
+ if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed
+ sz = stbi__get8(s); // image type
+ if ( tga_color_type == 1 ) { // colormapped (paletted) image
+ if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9
+ stbi__skip(s,4); // skip index of first colormap entry and number of entries
+ sz = stbi__get8(s); // check bits per palette color entry
+ if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;
+ stbi__skip(s,4); // skip image x and y origin
+ } else { // "normal" image w/o colormap
+ if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE
+ stbi__skip(s,9); // skip colormap specification and image x/y origin
+ }
+ if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width
+ if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height
+ sz = stbi__get8(s); // bits per pixel
+ if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index
+ if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;
+
+ res = 1; // if we got this far, everything's good and we can return 1 instead of 0
+
+errorEnd:
+ stbi__rewind(s);
+ return res;
+}
+
+// read 16bit value and convert to 24bit RGB
+static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)
+{
+ stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
+ stbi__uint16 fiveBitMask = 31;
+ // we have 3 channels with 5bits each
+ int r = (px >> 10) & fiveBitMask;
+ int g = (px >> 5) & fiveBitMask;
+ int b = px & fiveBitMask;
+ // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later
+ out[0] = (stbi_uc)((r * 255)/31);
+ out[1] = (stbi_uc)((g * 255)/31);
+ out[2] = (stbi_uc)((b * 255)/31);
+
+ // some people claim that the most significant bit might be used for alpha
+ // (possibly if an alpha-bit is set in the "image descriptor byte")
+ // but that only made 16bit test images completely translucent..
+ // so let's treat all 15 and 16bit TGAs as RGB with no alpha.
+}
+
+static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
+{
+ // read in the TGA header stuff
+ int tga_offset = stbi__get8(s);
+ int tga_indexed = stbi__get8(s);
+ int tga_image_type = stbi__get8(s);
+ int tga_is_RLE = 0;
+ int tga_palette_start = stbi__get16le(s);
+ int tga_palette_len = stbi__get16le(s);
+ int tga_palette_bits = stbi__get8(s);
+ int tga_x_origin = stbi__get16le(s);
+ int tga_y_origin = stbi__get16le(s);
+ int tga_width = stbi__get16le(s);
+ int tga_height = stbi__get16le(s);
+ int tga_bits_per_pixel = stbi__get8(s);
+ int tga_comp, tga_rgb16=0;
+ int tga_inverted = stbi__get8(s);
+ // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?)
+ // image data
+ unsigned char *tga_data;
+ unsigned char *tga_palette = NULL;
+ int i, j;
+ unsigned char raw_data[4] = {0};
+ int RLE_count = 0;
+ int RLE_repeating = 0;
+ int read_next_pixel = 1;
+ STBI_NOTUSED(ri);
+ STBI_NOTUSED(tga_x_origin); // @TODO
+ STBI_NOTUSED(tga_y_origin); // @TODO
+
+ if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
+ if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
+
+ // do a tiny bit of precessing
+ if ( tga_image_type >= 8 )
+ {
+ tga_image_type -= 8;
+ tga_is_RLE = 1;
+ }
+ tga_inverted = 1 - ((tga_inverted >> 5) & 1);
+
+ // If I'm paletted, then I'll use the number of bits from the palette
+ if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
+ else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
+
+ if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency
+ return stbi__errpuc("bad format", "Can't find out TGA pixelformat");
+
+ // tga info
+ *x = tga_width;
+ *y = tga_height;
+ if (comp) *comp = tga_comp;
+
+ if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
+ return stbi__errpuc("too large", "Corrupt TGA");
+
+ tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
+ if (!tga_data) return stbi__errpuc("outofmem", "Out of memory");
+
+ // skip to the data's starting position (offset usually = 0)
+ stbi__skip(s, tga_offset );
+
+ if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {
+ for (i=0; i < tga_height; ++i) {
+ int row = tga_inverted ? tga_height -i - 1 : i;
+ stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
+ stbi__getn(s, tga_row, tga_width * tga_comp);
+ }
+ } else {
+ // do I need to load a palette?
+ if ( tga_indexed)
+ {
+ if (tga_palette_len == 0) { /* you have to have at least one entry! */
+ STBI_FREE(tga_data);
+ return stbi__errpuc("bad palette", "Corrupt TGA");
+ }
+
+ // any data to skip? (offset usually = 0)
+ stbi__skip(s, tga_palette_start );
+ // load the palette
+ tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
+ if (!tga_palette) {
+ STBI_FREE(tga_data);
+ return stbi__errpuc("outofmem", "Out of memory");
+ }
+ if (tga_rgb16) {
+ stbi_uc *pal_entry = tga_palette;
+ STBI_ASSERT(tga_comp == STBI_rgb);
+ for (i=0; i < tga_palette_len; ++i) {
+ stbi__tga_read_rgb16(s, pal_entry);
+ pal_entry += tga_comp;
+ }
+ } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
+ STBI_FREE(tga_data);
+ STBI_FREE(tga_palette);
+ return stbi__errpuc("bad palette", "Corrupt TGA");
+ }
+ }
+ // load the data
+ for (i=0; i < tga_width * tga_height; ++i)
+ {
+ // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk?
+ if ( tga_is_RLE )
+ {
+ if ( RLE_count == 0 )
+ {
+ // yep, get the next byte as a RLE command
+ int RLE_cmd = stbi__get8(s);
+ RLE_count = 1 + (RLE_cmd & 127);
+ RLE_repeating = RLE_cmd >> 7;
+ read_next_pixel = 1;
+ } else if ( !RLE_repeating )
+ {
+ read_next_pixel = 1;
+ }
+ } else
+ {
+ read_next_pixel = 1;
+ }
+ // OK, if I need to read a pixel, do it now
+ if ( read_next_pixel )
+ {
+ // load however much data we did have
+ if ( tga_indexed )
+ {
+ // read in index, then perform the lookup
+ int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
+ if ( pal_idx >= tga_palette_len ) {
+ // invalid index
+ pal_idx = 0;
+ }
+ pal_idx *= tga_comp;
+ for (j = 0; j < tga_comp; ++j) {
+ raw_data[j] = tga_palette[pal_idx+j];
+ }
+ } else if(tga_rgb16) {
+ STBI_ASSERT(tga_comp == STBI_rgb);
+ stbi__tga_read_rgb16(s, raw_data);
+ } else {
+ // read in the data raw
+ for (j = 0; j < tga_comp; ++j) {
+ raw_data[j] = stbi__get8(s);
+ }
+ }
+ // clear the reading flag for the next pixel
+ read_next_pixel = 0;
+ } // end of reading a pixel
+
+ // copy data
+ for (j = 0; j < tga_comp; ++j)
+ tga_data[i*tga_comp+j] = raw_data[j];
+
+ // in case we're in RLE mode, keep counting down
+ --RLE_count;
+ }
+ // do I need to invert the image?
+ if ( tga_inverted )
+ {
+ for (j = 0; j*2 < tga_height; ++j)
+ {
+ int index1 = j * tga_width * tga_comp;
+ int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
+ for (i = tga_width * tga_comp; i > 0; --i)
+ {
+ unsigned char temp = tga_data[index1];
+ tga_data[index1] = tga_data[index2];
+ tga_data[index2] = temp;
+ ++index1;
+ ++index2;
+ }
+ }
+ }
+ // clear my palette, if I had one
+ if ( tga_palette != NULL )
+ {
+ STBI_FREE( tga_palette );
+ }
+ }
+
+ // swap RGB - if the source data was RGB16, it already is in the right order
+ if (tga_comp >= 3 && !tga_rgb16)
+ {
+ unsigned char* tga_pixel = tga_data;
+ for (i=0; i < tga_width * tga_height; ++i)
+ {
+ unsigned char temp = tga_pixel[0];
+ tga_pixel[0] = tga_pixel[2];
+ tga_pixel[2] = temp;
+ tga_pixel += tga_comp;
+ }
+ }
+
+ // convert to target component count
+ if (req_comp && req_comp != tga_comp)
+ tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
+
+ // the things I do to get rid of an error message, and yet keep
+ // Microsoft's C compilers happy... [8^(
+ tga_palette_start = tga_palette_len = tga_palette_bits =
+ tga_x_origin = tga_y_origin = 0;
+ STBI_NOTUSED(tga_palette_start);
+ // OK, done
+ return tga_data;
+}
+#endif
+
+// *************************************************************************************************
+// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB
+
+#ifndef STBI_NO_PSD
+static int stbi__psd_test(stbi__context *s)
+{
+ int r = (stbi__get32be(s) == 0x38425053);
+ stbi__rewind(s);
+ return r;
+}
+
+static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount)
+{
+ int count, nleft, len;
+
+ count = 0;
+ while ((nleft = pixelCount - count) > 0) {
+ len = stbi__get8(s);
+ if (len == 128) {
+ // No-op.
+ } else if (len < 128) {
+ // Copy next len+1 bytes literally.
+ len++;
+ if (len > nleft) return 0; // corrupt data
+ count += len;
+ while (len) {
+ *p = stbi__get8(s);
+ p += 4;
+ len--;
+ }
+ } else if (len > 128) {
+ stbi_uc val;
+ // Next -len+1 bytes in the dest are replicated from next source byte.
+ // (Interpret len as a negative 8-bit int.)
+ len = 257 - len;
+ if (len > nleft) return 0; // corrupt data
+ val = stbi__get8(s);
+ count += len;
+ while (len) {
+ *p = val;
+ p += 4;
+ len--;
+ }
+ }
+ }
+
+ return 1;
+}
+
+static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)
+{
+ int pixelCount;
+ int channelCount, compression;
+ int channel, i;
+ int bitdepth;
+ int w,h;
+ stbi_uc *out;
+ STBI_NOTUSED(ri);
+
+ // Check identifier
+ if (stbi__get32be(s) != 0x38425053) // "8BPS"
+ return stbi__errpuc("not PSD", "Corrupt PSD image");
+
+ // Check file type version.
+ if (stbi__get16be(s) != 1)
+ return stbi__errpuc("wrong version", "Unsupported version of PSD image");
+
+ // Skip 6 reserved bytes.
+ stbi__skip(s, 6 );
+
+ // Read the number of channels (R, G, B, A, etc).
+ channelCount = stbi__get16be(s);
+ if (channelCount < 0 || channelCount > 16)
+ return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image");
+
+ // Read the rows and columns of the image.
+ h = stbi__get32be(s);
+ w = stbi__get32be(s);
+
+ if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
+ if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
+
+ // Make sure the depth is 8 bits.
+ bitdepth = stbi__get16be(s);
+ if (bitdepth != 8 && bitdepth != 16)
+ return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit");
+
+ // Make sure the color mode is RGB.
+ // Valid options are:
+ // 0: Bitmap
+ // 1: Grayscale
+ // 2: Indexed color
+ // 3: RGB color
+ // 4: CMYK color
+ // 7: Multichannel
+ // 8: Duotone
+ // 9: Lab color
+ if (stbi__get16be(s) != 3)
+ return stbi__errpuc("wrong color format", "PSD is not in RGB color format");
+
+ // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.)
+ stbi__skip(s,stbi__get32be(s) );
+
+ // Skip the image resources. (resolution, pen tool paths, etc)
+ stbi__skip(s, stbi__get32be(s) );
+
+ // Skip the reserved data.
+ stbi__skip(s, stbi__get32be(s) );
+
+ // Find out if the data is compressed.
+ // Known values:
+ // 0: no compression
+ // 1: RLE compressed
+ compression = stbi__get16be(s);
+ if (compression > 1)
+ return stbi__errpuc("bad compression", "PSD has an unknown compression format");
+
+ // Check size
+ if (!stbi__mad3sizes_valid(4, w, h, 0))
+ return stbi__errpuc("too large", "Corrupt PSD");
+
+ // Create the destination image.
+
+ if (!compression && bitdepth == 16 && bpc == 16) {
+ out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0);
+ ri->bits_per_channel = 16;
+ } else
+ out = (stbi_uc *) stbi__malloc(4 * w*h);
+
+ if (!out) return stbi__errpuc("outofmem", "Out of memory");
+ pixelCount = w*h;
+
+ // Initialize the data to zero.
+ //memset( out, 0, pixelCount * 4 );
+
+ // Finally, the image data.
+ if (compression) {
+ // RLE as used by .PSD and .TIFF
+ // Loop until you get the number of unpacked bytes you are expecting:
+ // Read the next source byte into n.
+ // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.
+ // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.
+ // Else if n is 128, noop.
+ // Endloop
+
+ // The RLE-compressed data is preceded by a 2-byte data count for each row in the data,
+ // which we're going to just skip.
+ stbi__skip(s, h * channelCount * 2 );
+
+ // Read the RLE data by channel.
+ for (channel = 0; channel < 4; channel++) {
+ stbi_uc *p;
+
+ p = out+channel;
+ if (channel >= channelCount) {
+ // Fill this channel with default data.
+ for (i = 0; i < pixelCount; i++, p += 4)
+ *p = (channel == 3 ? 255 : 0);
+ } else {
+ // Read the RLE data.
+ if (!stbi__psd_decode_rle(s, p, pixelCount)) {
+ STBI_FREE(out);
+ return stbi__errpuc("corrupt", "bad RLE data");
+ }
+ }
+ }
+
+ } else {
+ // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...)
+ // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image.
+
+ // Read the data by channel.
+ for (channel = 0; channel < 4; channel++) {
+ if (channel >= channelCount) {
+ // Fill this channel with default data.
+ if (bitdepth == 16 && bpc == 16) {
+ stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
+ stbi__uint16 val = channel == 3 ? 65535 : 0;
+ for (i = 0; i < pixelCount; i++, q += 4)
+ *q = val;
+ } else {
+ stbi_uc *p = out+channel;
+ stbi_uc val = channel == 3 ? 255 : 0;
+ for (i = 0; i < pixelCount; i++, p += 4)
+ *p = val;
+ }
+ } else {
+ if (ri->bits_per_channel == 16) { // output bpc
+ stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
+ for (i = 0; i < pixelCount; i++, q += 4)
+ *q = (stbi__uint16) stbi__get16be(s);
+ } else {
+ stbi_uc *p = out+channel;
+ if (bitdepth == 16) { // input bpc
+ for (i = 0; i < pixelCount; i++, p += 4)
+ *p = (stbi_uc) (stbi__get16be(s) >> 8);
+ } else {
+ for (i = 0; i < pixelCount; i++, p += 4)
+ *p = stbi__get8(s);
+ }
+ }
+ }
+ }
+ }
+
+ // remove weird white matte from PSD
+ if (channelCount >= 4) {
+ if (ri->bits_per_channel == 16) {
+ for (i=0; i < w*h; ++i) {
+ stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i;
+ if (pixel[3] != 0 && pixel[3] != 65535) {
+ float a = pixel[3] / 65535.0f;
+ float ra = 1.0f / a;
+ float inv_a = 65535.0f * (1 - ra);
+ pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a);
+ pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a);
+ pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a);
+ }
+ }
+ } else {
+ for (i=0; i < w*h; ++i) {
+ unsigned char *pixel = out + 4*i;
+ if (pixel[3] != 0 && pixel[3] != 255) {
+ float a = pixel[3] / 255.0f;
+ float ra = 1.0f / a;
+ float inv_a = 255.0f * (1 - ra);
+ pixel[0] = (unsigned char) (pixel[0]*ra + inv_a);
+ pixel[1] = (unsigned char) (pixel[1]*ra + inv_a);
+ pixel[2] = (unsigned char) (pixel[2]*ra + inv_a);
+ }
+ }
+ }
+ }
+
+ // convert to desired output format
+ if (req_comp && req_comp != 4) {
+ if (ri->bits_per_channel == 16)
+ out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h);
+ else
+ out = stbi__convert_format(out, 4, req_comp, w, h);
+ if (out == NULL) return out; // stbi__convert_format frees input on failure
+ }
+
+ if (comp) *comp = 4;
+ *y = h;
+ *x = w;
+
+ return out;
+}
+#endif
+
+// *************************************************************************************************
+// Softimage PIC loader
+// by Tom Seddon
+//
+// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format
+// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/
+
+#ifndef STBI_NO_PIC
+static int stbi__pic_is4(stbi__context *s,const char *str)
+{
+ int i;
+ for (i=0; i<4; ++i)
+ if (stbi__get8(s) != (stbi_uc)str[i])
+ return 0;
+
+ return 1;
+}
+
+static int stbi__pic_test_core(stbi__context *s)
+{
+ int i;
+
+ if (!stbi__pic_is4(s,"\x53\x80\xF6\x34"))
+ return 0;
+
+ for(i=0;i<84;++i)
+ stbi__get8(s);
+
+ if (!stbi__pic_is4(s,"PICT"))
+ return 0;
+
+ return 1;
+}
+
+typedef struct
+{
+ stbi_uc size,type,channel;
+} stbi__pic_packet;
+
+static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest)
+{
+ int mask=0x80, i;
+
+ for (i=0; i<4; ++i, mask>>=1) {
+ if (channel & mask) {
+ if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short");
+ dest[i]=stbi__get8(s);
+ }
+ }
+
+ return dest;
+}
+
+static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src)
+{
+ int mask=0x80,i;
+
+ for (i=0;i<4; ++i, mask>>=1)
+ if (channel&mask)
+ dest[i]=src[i];
+}
+
+static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result)
+{
+ int act_comp=0,num_packets=0,y,chained;
+ stbi__pic_packet packets[10];
+
+ // this will (should...) cater for even some bizarre stuff like having data
+ // for the same channel in multiple packets.
+ do {
+ stbi__pic_packet *packet;
+
+ if (num_packets==sizeof(packets)/sizeof(packets[0]))
+ return stbi__errpuc("bad format","too many packets");
+
+ packet = &packets[num_packets++];
+
+ chained = stbi__get8(s);
+ packet->size = stbi__get8(s);
+ packet->type = stbi__get8(s);
+ packet->channel = stbi__get8(s);
+
+ act_comp |= packet->channel;
+
+ if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)");
+ if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp");
+ } while (chained);
+
+ *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?
+
+ for(y=0; ytype) {
+ default:
+ return stbi__errpuc("bad format","packet has bad compression type");
+
+ case 0: {//uncompressed
+ int x;
+
+ for(x=0;xchannel,dest))
+ return 0;
+ break;
+ }
+
+ case 1://Pure RLE
+ {
+ int left=width, i;
+
+ while (left>0) {
+ stbi_uc count,value[4];
+
+ count=stbi__get8(s);
+ if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)");
+
+ if (count > left)
+ count = (stbi_uc) left;
+
+ if (!stbi__readval(s,packet->channel,value)) return 0;
+
+ for(i=0; ichannel,dest,value);
+ left -= count;
+ }
+ }
+ break;
+
+ case 2: {//Mixed RLE
+ int left=width;
+ while (left>0) {
+ int count = stbi__get8(s), i;
+ if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)");
+
+ if (count >= 128) { // Repeated
+ stbi_uc value[4];
+
+ if (count==128)
+ count = stbi__get16be(s);
+ else
+ count -= 127;
+ if (count > left)
+ return stbi__errpuc("bad file","scanline overrun");
+
+ if (!stbi__readval(s,packet->channel,value))
+ return 0;
+
+ for(i=0;ichannel,dest,value);
+ } else { // Raw
+ ++count;
+ if (count>left) return stbi__errpuc("bad file","scanline overrun");
+
+ for(i=0;ichannel,dest))
+ return 0;
+ }
+ left-=count;
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ return result;
+}
+
+static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri)
+{
+ stbi_uc *result;
+ int i, x,y, internal_comp;
+ STBI_NOTUSED(ri);
+
+ if (!comp) comp = &internal_comp;
+
+ for (i=0; i<92; ++i)
+ stbi__get8(s);
+
+ x = stbi__get16be(s);
+ y = stbi__get16be(s);
+
+ if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
+ if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
+
+ if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)");
+ if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode");
+
+ stbi__get32be(s); //skip `ratio'
+ stbi__get16be(s); //skip `fields'
+ stbi__get16be(s); //skip `pad'
+
+ // intermediate buffer is RGBA
+ result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0);
+ if (!result) return stbi__errpuc("outofmem", "Out of memory");
+ memset(result, 0xff, x*y*4);
+
+ if (!stbi__pic_load_core(s,x,y,comp, result)) {
+ STBI_FREE(result);
+ result=0;
+ }
+ *px = x;
+ *py = y;
+ if (req_comp == 0) req_comp = *comp;
+ result=stbi__convert_format(result,4,req_comp,x,y);
+
+ return result;
+}
+
+static int stbi__pic_test(stbi__context *s)
+{
+ int r = stbi__pic_test_core(s);
+ stbi__rewind(s);
+ return r;
+}
+#endif
+
+// *************************************************************************************************
+// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb
+
+#ifndef STBI_NO_GIF
+typedef struct
+{
+ stbi__int16 prefix;
+ stbi_uc first;
+ stbi_uc suffix;
+} stbi__gif_lzw;
+
+typedef struct
+{
+ int w,h;
+ stbi_uc *out; // output buffer (always 4 components)
+ stbi_uc *background; // The current "background" as far as a gif is concerned
+ stbi_uc *history;
+ int flags, bgindex, ratio, transparent, eflags;
+ stbi_uc pal[256][4];
+ stbi_uc lpal[256][4];
+ stbi__gif_lzw codes[8192];
+ stbi_uc *color_table;
+ int parse, step;
+ int lflags;
+ int start_x, start_y;
+ int max_x, max_y;
+ int cur_x, cur_y;
+ int line_size;
+ int delay;
+} stbi__gif;
+
+static int stbi__gif_test_raw(stbi__context *s)
+{
+ int sz;
+ if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0;
+ sz = stbi__get8(s);
+ if (sz != '9' && sz != '7') return 0;
+ if (stbi__get8(s) != 'a') return 0;
+ return 1;
+}
+
+static int stbi__gif_test(stbi__context *s)
+{
+ int r = stbi__gif_test_raw(s);
+ stbi__rewind(s);
+ return r;
+}
+
+static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp)
+{
+ int i;
+ for (i=0; i < num_entries; ++i) {
+ pal[i][2] = stbi__get8(s);
+ pal[i][1] = stbi__get8(s);
+ pal[i][0] = stbi__get8(s);
+ pal[i][3] = transp == i ? 0 : 255;
+ }
+}
+
+static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info)
+{
+ stbi_uc version;
+ if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8')
+ return stbi__err("not GIF", "Corrupt GIF");
+
+ version = stbi__get8(s);
+ if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF");
+ if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF");
+
+ stbi__g_failure_reason = "";
+ g->w = stbi__get16le(s);
+ g->h = stbi__get16le(s);
+ g->flags = stbi__get8(s);
+ g->bgindex = stbi__get8(s);
+ g->ratio = stbi__get8(s);
+ g->transparent = -1;
+
+ if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
+ if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
+
+ if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments
+
+ if (is_info) return 1;
+
+ if (g->flags & 0x80)
+ stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
+
+ return 1;
+}
+
+static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)
+{
+ stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif));
+ if (!g) return stbi__err("outofmem", "Out of memory");
+ if (!stbi__gif_header(s, g, comp, 1)) {
+ STBI_FREE(g);
+ stbi__rewind( s );
+ return 0;
+ }
+ if (x) *x = g->w;
+ if (y) *y = g->h;
+ STBI_FREE(g);
+ return 1;
+}
+
+static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
+{
+ stbi_uc *p, *c;
+ int idx;
+
+ // recurse to decode the prefixes, since the linked-list is backwards,
+ // and working backwards through an interleaved image would be nasty
+ if (g->codes[code].prefix >= 0)
+ stbi__out_gif_code(g, g->codes[code].prefix);
+
+ if (g->cur_y >= g->max_y) return;
+
+ idx = g->cur_x + g->cur_y;
+ p = &g->out[idx];
+ g->history[idx / 4] = 1;
+
+ c = &g->color_table[g->codes[code].suffix * 4];
+ if (c[3] > 128) { // don't render transparent pixels;
+ p[0] = c[2];
+ p[1] = c[1];
+ p[2] = c[0];
+ p[3] = c[3];
+ }
+ g->cur_x += 4;
+
+ if (g->cur_x >= g->max_x) {
+ g->cur_x = g->start_x;
+ g->cur_y += g->step;
+
+ while (g->cur_y >= g->max_y && g->parse > 0) {
+ g->step = (1 << g->parse) * g->line_size;
+ g->cur_y = g->start_y + (g->step >> 1);
+ --g->parse;
+ }
+ }
+}
+
+static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
+{
+ stbi_uc lzw_cs;
+ stbi__int32 len, init_code;
+ stbi__uint32 first;
+ stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
+ stbi__gif_lzw *p;
+
+ lzw_cs = stbi__get8(s);
+ if (lzw_cs > 12) return NULL;
+ clear = 1 << lzw_cs;
+ first = 1;
+ codesize = lzw_cs + 1;
+ codemask = (1 << codesize) - 1;
+ bits = 0;
+ valid_bits = 0;
+ for (init_code = 0; init_code < clear; init_code++) {
+ g->codes[init_code].prefix = -1;
+ g->codes[init_code].first = (stbi_uc) init_code;
+ g->codes[init_code].suffix = (stbi_uc) init_code;
+ }
+
+ // support no starting clear code
+ avail = clear+2;
+ oldcode = -1;
+
+ len = 0;
+ for(;;) {
+ if (valid_bits < codesize) {
+ if (len == 0) {
+ len = stbi__get8(s); // start new block
+ if (len == 0)
+ return g->out;
+ }
+ --len;
+ bits |= (stbi__int32) stbi__get8(s) << valid_bits;
+ valid_bits += 8;
+ } else {
+ stbi__int32 code = bits & codemask;
+ bits >>= codesize;
+ valid_bits -= codesize;
+ // @OPTIMIZE: is there some way we can accelerate the non-clear path?
+ if (code == clear) { // clear code
+ codesize = lzw_cs + 1;
+ codemask = (1 << codesize) - 1;
+ avail = clear + 2;
+ oldcode = -1;
+ first = 0;
+ } else if (code == clear + 1) { // end of stream code
+ stbi__skip(s, len);
+ while ((len = stbi__get8(s)) > 0)
+ stbi__skip(s,len);
+ return g->out;
+ } else if (code <= avail) {
+ if (first) {
+ return stbi__errpuc("no clear code", "Corrupt GIF");
+ }
+
+ if (oldcode >= 0) {
+ p = &g->codes[avail++];
+ if (avail > 8192) {
+ return stbi__errpuc("too many codes", "Corrupt GIF");
+ }
+
+ p->prefix = (stbi__int16) oldcode;
+ p->first = g->codes[oldcode].first;
+ p->suffix = (code == avail) ? p->first : g->codes[code].first;
+ } else if (code == avail)
+ return stbi__errpuc("illegal code in raster", "Corrupt GIF");
+
+ stbi__out_gif_code(g, (stbi__uint16) code);
+
+ if ((avail & codemask) == 0 && avail <= 0x0FFF) {
+ codesize++;
+ codemask = (1 << codesize) - 1;
+ }
+
+ oldcode = code;
+ } else {
+ return stbi__errpuc("illegal code in raster", "Corrupt GIF");
+ }
+ }
+ }
+}
+
+// this function is designed to support animated gifs, although stb_image doesn't support it
+// two back is the image from two frames ago, used for a very specific disposal format
+static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back)
+{
+ int dispose;
+ int first_frame;
+ int pi;
+ int pcount;
+ STBI_NOTUSED(req_comp);
+
+ // on first frame, any non-written pixels get the background colour (non-transparent)
+ first_frame = 0;
+ if (g->out == 0) {
+ if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header
+ if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
+ return stbi__errpuc("too large", "GIF image is too large");
+ pcount = g->w * g->h;
+ g->out = (stbi_uc *) stbi__malloc(4 * pcount);
+ g->background = (stbi_uc *) stbi__malloc(4 * pcount);
+ g->history = (stbi_uc *) stbi__malloc(pcount);
+ if (!g->out || !g->background || !g->history)
+ return stbi__errpuc("outofmem", "Out of memory");
+
+ // image is treated as "transparent" at the start - ie, nothing overwrites the current background;
+ // background colour is only used for pixels that are not rendered first frame, after that "background"
+ // color refers to the color that was there the previous frame.
+ memset(g->out, 0x00, 4 * pcount);
+ memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent)
+ memset(g->history, 0x00, pcount); // pixels that were affected previous frame
+ first_frame = 1;
+ } else {
+ // second frame - how do we dispose of the previous one?
+ dispose = (g->eflags & 0x1C) >> 2;
+ pcount = g->w * g->h;
+
+ if ((dispose == 3) && (two_back == 0)) {
+ dispose = 2; // if I don't have an image to revert back to, default to the old background
+ }
+
+ if (dispose == 3) { // use previous graphic
+ for (pi = 0; pi < pcount; ++pi) {
+ if (g->history[pi]) {
+ memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );
+ }
+ }
+ } else if (dispose == 2) {
+ // restore what was changed last frame to background before that frame;
+ for (pi = 0; pi < pcount; ++pi) {
+ if (g->history[pi]) {
+ memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );
+ }
+ }
+ } else {
+ // This is a non-disposal case eithe way, so just
+ // leave the pixels as is, and they will become the new background
+ // 1: do not dispose
+ // 0: not specified.
+ }
+
+ // background is what out is after the undoing of the previou frame;
+ memcpy( g->background, g->out, 4 * g->w * g->h );
+ }
+
+ // clear my history;
+ memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame
+
+ for (;;) {
+ int tag = stbi__get8(s);
+ switch (tag) {
+ case 0x2C: /* Image Descriptor */
+ {
+ stbi__int32 x, y, w, h;
+ stbi_uc *o;
+
+ x = stbi__get16le(s);
+ y = stbi__get16le(s);
+ w = stbi__get16le(s);
+ h = stbi__get16le(s);
+ if (((x + w) > (g->w)) || ((y + h) > (g->h)))
+ return stbi__errpuc("bad Image Descriptor", "Corrupt GIF");
+
+ g->line_size = g->w * 4;
+ g->start_x = x * 4;
+ g->start_y = y * g->line_size;
+ g->max_x = g->start_x + w * 4;
+ g->max_y = g->start_y + h * g->line_size;
+ g->cur_x = g->start_x;
+ g->cur_y = g->start_y;
+
+ // if the width of the specified rectangle is 0, that means
+ // we may not see *any* pixels or the image is malformed;
+ // to make sure this is caught, move the current y down to
+ // max_y (which is what out_gif_code checks).
+ if (w == 0)
+ g->cur_y = g->max_y;
+
+ g->lflags = stbi__get8(s);
+
+ if (g->lflags & 0x40) {
+ g->step = 8 * g->line_size; // first interlaced spacing
+ g->parse = 3;
+ } else {
+ g->step = g->line_size;
+ g->parse = 0;
+ }
+
+ if (g->lflags & 0x80) {
+ stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
+ g->color_table = (stbi_uc *) g->lpal;
+ } else if (g->flags & 0x80) {
+ g->color_table = (stbi_uc *) g->pal;
+ } else
+ return stbi__errpuc("missing color table", "Corrupt GIF");
+
+ o = stbi__process_gif_raster(s, g);
+ if (!o) return NULL;
+
+ // if this was the first frame,
+ pcount = g->w * g->h;
+ if (first_frame && (g->bgindex > 0)) {
+ // if first frame, any pixel not drawn to gets the background color
+ for (pi = 0; pi < pcount; ++pi) {
+ if (g->history[pi] == 0) {
+ g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be;
+ memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );
+ }
+ }
+ }
+
+ return o;
+ }
+
+ case 0x21: // Comment Extension.
+ {
+ int len;
+ int ext = stbi__get8(s);
+ if (ext == 0xF9) { // Graphic Control Extension.
+ len = stbi__get8(s);
+ if (len == 4) {
+ g->eflags = stbi__get8(s);
+ g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths.
+
+ // unset old transparent
+ if (g->transparent >= 0) {
+ g->pal[g->transparent][3] = 255;
+ }
+ if (g->eflags & 0x01) {
+ g->transparent = stbi__get8(s);
+ if (g->transparent >= 0) {
+ g->pal[g->transparent][3] = 0;
+ }
+ } else {
+ // don't need transparent
+ stbi__skip(s, 1);
+ g->transparent = -1;
+ }
+ } else {
+ stbi__skip(s, len);
+ break;
+ }
+ }
+ while ((len = stbi__get8(s)) != 0) {
+ stbi__skip(s, len);
+ }
+ break;
+ }
+
+ case 0x3B: // gif stream termination code
+ return (stbi_uc *) s; // using '1' causes warning on some compilers
+
+ default:
+ return stbi__errpuc("unknown code", "Corrupt GIF");
+ }
+ }
+}
+
+static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays)
+{
+ STBI_FREE(g->out);
+ STBI_FREE(g->history);
+ STBI_FREE(g->background);
+
+ if (out) STBI_FREE(out);
+ if (delays && *delays) STBI_FREE(*delays);
+ return stbi__errpuc("outofmem", "Out of memory");
+}
+
+static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
+{
+ if (stbi__gif_test(s)) {
+ int layers = 0;
+ stbi_uc *u = 0;
+ stbi_uc *out = 0;
+ stbi_uc *two_back = 0;
+ stbi__gif g;
+ int stride;
+ int out_size = 0;
+ int delays_size = 0;
+
+ STBI_NOTUSED(out_size);
+ STBI_NOTUSED(delays_size);
+
+ memset(&g, 0, sizeof(g));
+ if (delays) {
+ *delays = 0;
+ }
+
+ do {
+ u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);
+ if (u == (stbi_uc *) s) u = 0; // end of animated gif marker
+
+ if (u) {
+ *x = g.w;
+ *y = g.h;
+ ++layers;
+ stride = g.w * g.h * 4;
+
+ if (out) {
+ void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride );
+ if (!tmp)
+ return stbi__load_gif_main_outofmem(&g, out, delays);
+ else {
+ out = (stbi_uc*) tmp;
+ out_size = layers * stride;
+ }
+
+ if (delays) {
+ int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers );
+ if (!new_delays)
+ return stbi__load_gif_main_outofmem(&g, out, delays);
+ *delays = new_delays;
+ delays_size = layers * sizeof(int);
+ }
+ } else {
+ out = (stbi_uc*)stbi__malloc( layers * stride );
+ if (!out)
+ return stbi__load_gif_main_outofmem(&g, out, delays);
+ out_size = layers * stride;
+ if (delays) {
+ *delays = (int*) stbi__malloc( layers * sizeof(int) );
+ if (!*delays)
+ return stbi__load_gif_main_outofmem(&g, out, delays);
+ delays_size = layers * sizeof(int);
+ }
+ }
+ memcpy( out + ((layers - 1) * stride), u, stride );
+ if (layers >= 2) {
+ two_back = out - 2 * stride;
+ }
+
+ if (delays) {
+ (*delays)[layers - 1U] = g.delay;
+ }
+ }
+ } while (u != 0);
+
+ // free temp buffer;
+ STBI_FREE(g.out);
+ STBI_FREE(g.history);
+ STBI_FREE(g.background);
+
+ // do the final conversion after loading everything;
+ if (req_comp && req_comp != 4)
+ out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
+
+ *z = layers;
+ return out;
+ } else {
+ return stbi__errpuc("not GIF", "Image was not as a gif type.");
+ }
+}
+
+static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
+{
+ stbi_uc *u = 0;
+ stbi__gif g;
+ memset(&g, 0, sizeof(g));
+ STBI_NOTUSED(ri);
+
+ u = stbi__gif_load_next(s, &g, comp, req_comp, 0);
+ if (u == (stbi_uc *) s) u = 0; // end of animated gif marker
+ if (u) {
+ *x = g.w;
+ *y = g.h;
+
+ // moved conversion to after successful load so that the same
+ // can be done for multiple frames.
+ if (req_comp && req_comp != 4)
+ u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
+ } else if (g.out) {
+ // if there was an error and we allocated an image buffer, free it!
+ STBI_FREE(g.out);
+ }
+
+ // free buffers needed for multiple frame loading;
+ STBI_FREE(g.history);
+ STBI_FREE(g.background);
+
+ return u;
+}
+
+static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)
+{
+ return stbi__gif_info_raw(s,x,y,comp);
+}
+#endif
+
+// *************************************************************************************************
+// Radiance RGBE HDR loader
+// originally by Nicolas Schulz
+#ifndef STBI_NO_HDR
+static int stbi__hdr_test_core(stbi__context *s, const char *signature)
+{
+ int i;
+ for (i=0; signature[i]; ++i)
+ if (stbi__get8(s) != signature[i])
+ return 0;
+ stbi__rewind(s);
+ return 1;
+}
+
+static int stbi__hdr_test(stbi__context* s)
+{
+ int r = stbi__hdr_test_core(s, "#?RADIANCE\n");
+ stbi__rewind(s);
+ if(!r) {
+ r = stbi__hdr_test_core(s, "#?RGBE\n");
+ stbi__rewind(s);
+ }
+ return r;
+}
+
+#define STBI__HDR_BUFLEN 1024
+static char *stbi__hdr_gettoken(stbi__context *z, char *buffer)
+{
+ int len=0;
+ char c = '\0';
+
+ c = (char) stbi__get8(z);
+
+ while (!stbi__at_eof(z) && c != '\n') {
+ buffer[len++] = c;
+ if (len == STBI__HDR_BUFLEN-1) {
+ // flush to end of line
+ while (!stbi__at_eof(z) && stbi__get8(z) != '\n')
+ ;
+ break;
+ }
+ c = (char) stbi__get8(z);
+ }
+
+ buffer[len] = 0;
+ return buffer;
+}
+
+static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp)
+{
+ if ( input[3] != 0 ) {
+ float f1;
+ // Exponent
+ f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));
+ if (req_comp <= 2)
+ output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
+ else {
+ output[0] = input[0] * f1;
+ output[1] = input[1] * f1;
+ output[2] = input[2] * f1;
+ }
+ if (req_comp == 2) output[1] = 1;
+ if (req_comp == 4) output[3] = 1;
+ } else {
+ switch (req_comp) {
+ case 4: output[3] = 1; /* fallthrough */
+ case 3: output[0] = output[1] = output[2] = 0;
+ break;
+ case 2: output[1] = 1; /* fallthrough */
+ case 1: output[0] = 0;
+ break;
+ }
+ }
+}
+
+static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
+{
+ char buffer[STBI__HDR_BUFLEN];
+ char *token;
+ int valid = 0;
+ int width, height;
+ stbi_uc *scanline;
+ float *hdr_data;
+ int len;
+ unsigned char count, value;
+ int i, j, k, c1,c2, z;
+ const char *headerToken;
+ STBI_NOTUSED(ri);
+
+ // Check identifier
+ headerToken = stbi__hdr_gettoken(s,buffer);
+ if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0)
+ return stbi__errpf("not HDR", "Corrupt HDR image");
+
+ // Parse header
+ for(;;) {
+ token = stbi__hdr_gettoken(s,buffer);
+ if (token[0] == 0) break;
+ if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
+ }
+
+ if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format");
+
+ // Parse width and height
+ // can't use sscanf() if we're not using stdio!
+ token = stbi__hdr_gettoken(s,buffer);
+ if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format");
+ token += 3;
+ height = (int) strtol(token, &token, 10);
+ while (*token == ' ') ++token;
+ if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format");
+ token += 3;
+ width = (int) strtol(token, NULL, 10);
+
+ if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)");
+ if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)");
+
+ *x = width;
+ *y = height;
+
+ if (comp) *comp = 3;
+ if (req_comp == 0) req_comp = 3;
+
+ if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0))
+ return stbi__errpf("too large", "HDR image is too large");
+
+ // Read data
+ hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0);
+ if (!hdr_data)
+ return stbi__errpf("outofmem", "Out of memory");
+
+ // Load image data
+ // image data is stored as some number of sca
+ if ( width < 8 || width >= 32768) {
+ // Read flat data
+ for (j=0; j < height; ++j) {
+ for (i=0; i < width; ++i) {
+ stbi_uc rgbe[4];
+ main_decode_loop:
+ stbi__getn(s, rgbe, 4);
+ stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
+ }
+ }
+ } else {
+ // Read RLE-encoded data
+ scanline = NULL;
+
+ for (j = 0; j < height; ++j) {
+ c1 = stbi__get8(s);
+ c2 = stbi__get8(s);
+ len = stbi__get8(s);
+ if (c1 != 2 || c2 != 2 || (len & 0x80)) {
+ // not run-length encoded, so we have to actually use THIS data as a decoded
+ // pixel (note this can't be a valid pixel--one of RGB must be >= 128)
+ stbi_uc rgbe[4];
+ rgbe[0] = (stbi_uc) c1;
+ rgbe[1] = (stbi_uc) c2;
+ rgbe[2] = (stbi_uc) len;
+ rgbe[3] = (stbi_uc) stbi__get8(s);
+ stbi__hdr_convert(hdr_data, rgbe, req_comp);
+ i = 1;
+ j = 0;
+ STBI_FREE(scanline);
+ goto main_decode_loop; // yes, this makes no sense
+ }
+ len <<= 8;
+ len |= stbi__get8(s);
+ if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); }
+ if (scanline == NULL) {
+ scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0);
+ if (!scanline) {
+ STBI_FREE(hdr_data);
+ return stbi__errpf("outofmem", "Out of memory");
+ }
+ }
+
+ for (k = 0; k < 4; ++k) {
+ int nleft;
+ i = 0;
+ while ((nleft = width - i) > 0) {
+ count = stbi__get8(s);
+ if (count > 128) {
+ // Run
+ value = stbi__get8(s);
+ count -= 128;
+ if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); }
+ for (z = 0; z < count; ++z)
+ scanline[i++ * 4 + k] = value;
+ } else {
+ // Dump
+ if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); }
+ for (z = 0; z < count; ++z)
+ scanline[i++ * 4 + k] = stbi__get8(s);
+ }
+ }
+ }
+ for (i=0; i < width; ++i)
+ stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
+ }
+ if (scanline)
+ STBI_FREE(scanline);
+ }
+
+ return hdr_data;
+}
+
+static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)
+{
+ char buffer[STBI__HDR_BUFLEN];
+ char *token;
+ int valid = 0;
+ int dummy;
+
+ if (!x) x = &dummy;
+ if (!y) y = &dummy;
+ if (!comp) comp = &dummy;
+
+ if (stbi__hdr_test(s) == 0) {
+ stbi__rewind( s );
+ return 0;
+ }
+
+ for(;;) {
+ token = stbi__hdr_gettoken(s,buffer);
+ if (token[0] == 0) break;
+ if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
+ }
+
+ if (!valid) {
+ stbi__rewind( s );
+ return 0;
+ }
+ token = stbi__hdr_gettoken(s,buffer);
+ if (strncmp(token, "-Y ", 3)) {
+ stbi__rewind( s );
+ return 0;
+ }
+ token += 3;
+ *y = (int) strtol(token, &token, 10);
+ while (*token == ' ') ++token;
+ if (strncmp(token, "+X ", 3)) {
+ stbi__rewind( s );
+ return 0;
+ }
+ token += 3;
+ *x = (int) strtol(token, NULL, 10);
+ *comp = 3;
+ return 1;
+}
+#endif // STBI_NO_HDR
+
+#ifndef STBI_NO_BMP
+static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)
+{
+ void *p;
+ stbi__bmp_data info;
+
+ info.all_a = 255;
+ p = stbi__bmp_parse_header(s, &info);
+ if (p == NULL) {
+ stbi__rewind( s );
+ return 0;
+ }
+ if (x) *x = s->img_x;
+ if (y) *y = s->img_y;
+ if (comp) {
+ if (info.bpp == 24 && info.ma == 0xff000000)
+ *comp = 3;
+ else
+ *comp = info.ma ? 4 : 3;
+ }
+ return 1;
+}
+#endif
+
+#ifndef STBI_NO_PSD
+static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
+{
+ int channelCount, dummy, depth;
+ if (!x) x = &dummy;
+ if (!y) y = &dummy;
+ if (!comp) comp = &dummy;
+ if (stbi__get32be(s) != 0x38425053) {
+ stbi__rewind( s );
+ return 0;
+ }
+ if (stbi__get16be(s) != 1) {
+ stbi__rewind( s );
+ return 0;
+ }
+ stbi__skip(s, 6);
+ channelCount = stbi__get16be(s);
+ if (channelCount < 0 || channelCount > 16) {
+ stbi__rewind( s );
+ return 0;
+ }
+ *y = stbi__get32be(s);
+ *x = stbi__get32be(s);
+ depth = stbi__get16be(s);
+ if (depth != 8 && depth != 16) {
+ stbi__rewind( s );
+ return 0;
+ }
+ if (stbi__get16be(s) != 3) {
+ stbi__rewind( s );
+ return 0;
+ }
+ *comp = 4;
+ return 1;
+}
+
+static int stbi__psd_is16(stbi__context *s)
+{
+ int channelCount, depth;
+ if (stbi__get32be(s) != 0x38425053) {
+ stbi__rewind( s );
+ return 0;
+ }
+ if (stbi__get16be(s) != 1) {
+ stbi__rewind( s );
+ return 0;
+ }
+ stbi__skip(s, 6);
+ channelCount = stbi__get16be(s);
+ if (channelCount < 0 || channelCount > 16) {
+ stbi__rewind( s );
+ return 0;
+ }
+ STBI_NOTUSED(stbi__get32be(s));
+ STBI_NOTUSED(stbi__get32be(s));
+ depth = stbi__get16be(s);
+ if (depth != 16) {
+ stbi__rewind( s );
+ return 0;
+ }
+ return 1;
+}
+#endif
+
+#ifndef STBI_NO_PIC
+static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)
+{
+ int act_comp=0,num_packets=0,chained,dummy;
+ stbi__pic_packet packets[10];
+
+ if (!x) x = &dummy;
+ if (!y) y = &dummy;
+ if (!comp) comp = &dummy;
+
+ if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) {
+ stbi__rewind(s);
+ return 0;
+ }
+
+ stbi__skip(s, 88);
+
+ *x = stbi__get16be(s);
+ *y = stbi__get16be(s);
+ if (stbi__at_eof(s)) {
+ stbi__rewind( s);
+ return 0;
+ }
+ if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
+ stbi__rewind( s );
+ return 0;
+ }
+
+ stbi__skip(s, 8);
+
+ do {
+ stbi__pic_packet *packet;
+
+ if (num_packets==sizeof(packets)/sizeof(packets[0]))
+ return 0;
+
+ packet = &packets[num_packets++];
+ chained = stbi__get8(s);
+ packet->size = stbi__get8(s);
+ packet->type = stbi__get8(s);
+ packet->channel = stbi__get8(s);
+ act_comp |= packet->channel;
+
+ if (stbi__at_eof(s)) {
+ stbi__rewind( s );
+ return 0;
+ }
+ if (packet->size != 8) {
+ stbi__rewind( s );
+ return 0;
+ }
+ } while (chained);
+
+ *comp = (act_comp & 0x10 ? 4 : 3);
+
+ return 1;
+}
+#endif
+
+// *************************************************************************************************
+// Portable Gray Map and Portable Pixel Map loader
+// by Ken Miller
+//
+// PGM: http://netpbm.sourceforge.net/doc/pgm.html
+// PPM: http://netpbm.sourceforge.net/doc/ppm.html
+//
+// Known limitations:
+// Does not support comments in the header section
+// Does not support ASCII image data (formats P2 and P3)
+
+#ifndef STBI_NO_PNM
+
+static int stbi__pnm_test(stbi__context *s)
+{
+ char p, t;
+ p = (char) stbi__get8(s);
+ t = (char) stbi__get8(s);
+ if (p != 'P' || (t != '5' && t != '6')) {
+ stbi__rewind( s );
+ return 0;
+ }
+ return 1;
+}
+
+static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
+{
+ stbi_uc *out;
+ STBI_NOTUSED(ri);
+
+ ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n);
+ if (ri->bits_per_channel == 0)
+ return 0;
+
+ if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
+ if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
+
+ *x = s->img_x;
+ *y = s->img_y;
+ if (comp) *comp = s->img_n;
+
+ if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0))
+ return stbi__errpuc("too large", "PNM too large");
+
+ out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0);
+ if (!out) return stbi__errpuc("outofmem", "Out of memory");
+ if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) {
+ STBI_FREE(out);
+ return stbi__errpuc("bad PNM", "PNM file truncated");
+ }
+
+ if (req_comp && req_comp != s->img_n) {
+ if (ri->bits_per_channel == 16) {
+ out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y);
+ } else {
+ out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
+ }
+ if (out == NULL) return out; // stbi__convert_format frees input on failure
+ }
+ return out;
+}
+
+static int stbi__pnm_isspace(char c)
+{
+ return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';
+}
+
+static void stbi__pnm_skip_whitespace(stbi__context *s, char *c)
+{
+ for (;;) {
+ while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
+ *c = (char) stbi__get8(s);
+
+ if (stbi__at_eof(s) || *c != '#')
+ break;
+
+ while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' )
+ *c = (char) stbi__get8(s);
+ }
+}
+
+static int stbi__pnm_isdigit(char c)
+{
+ return c >= '0' && c <= '9';
+}
+
+static int stbi__pnm_getinteger(stbi__context *s, char *c)
+{
+ int value = 0;
+
+ while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
+ value = value*10 + (*c - '0');
+ *c = (char) stbi__get8(s);
+ if((value > 214748364) || (value == 214748364 && *c > '7'))
+ return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int");
+ }
+
+ return value;
+}
+
+static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)
+{
+ int maxv, dummy;
+ char c, p, t;
+
+ if (!x) x = &dummy;
+ if (!y) y = &dummy;
+ if (!comp) comp = &dummy;
+
+ stbi__rewind(s);
+
+ // Get identifier
+ p = (char) stbi__get8(s);
+ t = (char) stbi__get8(s);
+ if (p != 'P' || (t != '5' && t != '6')) {
+ stbi__rewind(s);
+ return 0;
+ }
+
+ *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm
+
+ c = (char) stbi__get8(s);
+ stbi__pnm_skip_whitespace(s, &c);
+
+ *x = stbi__pnm_getinteger(s, &c); // read width
+ if(*x == 0)
+ return stbi__err("invalid width", "PPM image header had zero or overflowing width");
+ stbi__pnm_skip_whitespace(s, &c);
+
+ *y = stbi__pnm_getinteger(s, &c); // read height
+ if (*y == 0)
+ return stbi__err("invalid width", "PPM image header had zero or overflowing width");
+ stbi__pnm_skip_whitespace(s, &c);
+
+ maxv = stbi__pnm_getinteger(s, &c); // read max value
+ if (maxv > 65535)
+ return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images");
+ else if (maxv > 255)
+ return 16;
+ else
+ return 8;
+}
+
+static int stbi__pnm_is16(stbi__context *s)
+{
+ if (stbi__pnm_info(s, NULL, NULL, NULL) == 16)
+ return 1;
+ return 0;
+}
+#endif
+
+static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)
+{
+ #ifndef STBI_NO_JPEG
+ if (stbi__jpeg_info(s, x, y, comp)) return 1;
+ #endif
+
+ #ifndef STBI_NO_PNG
+ if (stbi__png_info(s, x, y, comp)) return 1;
+ #endif
+
+ #ifndef STBI_NO_GIF
+ if (stbi__gif_info(s, x, y, comp)) return 1;
+ #endif
+
+ #ifndef STBI_NO_BMP
+ if (stbi__bmp_info(s, x, y, comp)) return 1;
+ #endif
+
+ #ifndef STBI_NO_PSD
+ if (stbi__psd_info(s, x, y, comp)) return 1;
+ #endif
+
+ #ifndef STBI_NO_PIC
+ if (stbi__pic_info(s, x, y, comp)) return 1;
+ #endif
+
+ #ifndef STBI_NO_PNM
+ if (stbi__pnm_info(s, x, y, comp)) return 1;
+ #endif
+
+ #ifndef STBI_NO_HDR
+ if (stbi__hdr_info(s, x, y, comp)) return 1;
+ #endif
+
+ // test tga last because it's a crappy test!
+ #ifndef STBI_NO_TGA
+ if (stbi__tga_info(s, x, y, comp))
+ return 1;
+ #endif
+ return stbi__err("unknown image type", "Image not of any known type, or corrupt");
+}
+
+static int stbi__is_16_main(stbi__context *s)
+{
+ #ifndef STBI_NO_PNG
+ if (stbi__png_is16(s)) return 1;
+ #endif
+
+ #ifndef STBI_NO_PSD
+ if (stbi__psd_is16(s)) return 1;
+ #endif
+
+ #ifndef STBI_NO_PNM
+ if (stbi__pnm_is16(s)) return 1;
+ #endif
+ return 0;
+}
+
+#ifndef STBI_NO_STDIO
+STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)
+{
+ FILE *f = stbi__fopen(filename, "rb");
+ int result;
+ if (!f) return stbi__err("can't fopen", "Unable to open file");
+ result = stbi_info_from_file(f, x, y, comp);
+ fclose(f);
+ return result;
+}
+
+STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
+{
+ int r;
+ stbi__context s;
+ long pos = ftell(f);
+ stbi__start_file(&s, f);
+ r = stbi__info_main(&s,x,y,comp);
+ fseek(f,pos,SEEK_SET);
+ return r;
+}
+
+STBIDEF int stbi_is_16_bit(char const *filename)
+{
+ FILE *f = stbi__fopen(filename, "rb");
+ int result;
+ if (!f) return stbi__err("can't fopen", "Unable to open file");
+ result = stbi_is_16_bit_from_file(f);
+ fclose(f);
+ return result;
+}
+
+STBIDEF int stbi_is_16_bit_from_file(FILE *f)
+{
+ int r;
+ stbi__context s;
+ long pos = ftell(f);
+ stbi__start_file(&s, f);
+ r = stbi__is_16_main(&s);
+ fseek(f,pos,SEEK_SET);
+ return r;
+}
+#endif // !STBI_NO_STDIO
+
+STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
+{
+ stbi__context s;
+ stbi__start_mem(&s,buffer,len);
+ return stbi__info_main(&s,x,y,comp);
+}
+
+STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp)
+{
+ stbi__context s;
+ stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);
+ return stbi__info_main(&s,x,y,comp);
+}
+
+STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len)
+{
+ stbi__context s;
+ stbi__start_mem(&s,buffer,len);
+ return stbi__is_16_main(&s);
+}
+
+STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user)
+{
+ stbi__context s;
+ stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);
+ return stbi__is_16_main(&s);
+}
+
+#endif // STB_IMAGE_IMPLEMENTATION
+
+/*
+ revision history:
+ 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
+ 2.19 (2018-02-11) fix warning
+ 2.18 (2018-01-30) fix warnings
+ 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug
+ 1-bit BMP
+ *_is_16_bit api
+ avoid warnings
+ 2.16 (2017-07-23) all functions have 16-bit variants;
+ STBI_NO_STDIO works again;
+ compilation fixes;
+ fix rounding in unpremultiply;
+ optimize vertical flip;
+ disable raw_len validation;
+ documentation fixes
+ 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode;
+ warning fixes; disable run-time SSE detection on gcc;
+ uniform handling of optional "return" values;
+ thread-safe initialization of zlib tables
+ 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs
+ 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now
+ 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes
+ 2.11 (2016-04-02) allocate large structures on the stack
+ remove white matting for transparent PSD
+ fix reported channel count for PNG & BMP
+ re-enable SSE2 in non-gcc 64-bit
+ support RGB-formatted JPEG
+ read 16-bit PNGs (only as 8-bit)
+ 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED
+ 2.09 (2016-01-16) allow comments in PNM files
+ 16-bit-per-pixel TGA (not bit-per-component)
+ info() for TGA could break due to .hdr handling
+ info() for BMP to shares code instead of sloppy parse
+ can use STBI_REALLOC_SIZED if allocator doesn't support realloc
+ code cleanup
+ 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA
+ 2.07 (2015-09-13) fix compiler warnings
+ partial animated GIF support
+ limited 16-bpc PSD support
+ #ifdef unused functions
+ bug with < 92 byte PIC,PNM,HDR,TGA
+ 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value
+ 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning
+ 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit
+ 2.03 (2015-04-12) extra corruption checking (mmozeiko)
+ stbi_set_flip_vertically_on_load (nguillemot)
+ fix NEON support; fix mingw support
+ 2.02 (2015-01-19) fix incorrect assert, fix warning
+ 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2
+ 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG
+ 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg)
+ progressive JPEG (stb)
+ PGM/PPM support (Ken Miller)
+ STBI_MALLOC,STBI_REALLOC,STBI_FREE
+ GIF bugfix -- seemingly never worked
+ STBI_NO_*, STBI_ONLY_*
+ 1.48 (2014-12-14) fix incorrectly-named assert()
+ 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb)
+ optimize PNG (ryg)
+ fix bug in interlaced PNG with user-specified channel count (stb)
+ 1.46 (2014-08-26)
+ fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG
+ 1.45 (2014-08-16)
+ fix MSVC-ARM internal compiler error by wrapping malloc
+ 1.44 (2014-08-07)
+ various warning fixes from Ronny Chevalier
+ 1.43 (2014-07-15)
+ fix MSVC-only compiler problem in code changed in 1.42
+ 1.42 (2014-07-09)
+ don't define _CRT_SECURE_NO_WARNINGS (affects user code)
+ fixes to stbi__cleanup_jpeg path
+ added STBI_ASSERT to avoid requiring assert.h
+ 1.41 (2014-06-25)
+ fix search&replace from 1.36 that messed up comments/error messages
+ 1.40 (2014-06-22)
+ fix gcc struct-initialization warning
+ 1.39 (2014-06-15)
+ fix to TGA optimization when req_comp != number of components in TGA;
+ fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite)
+ add support for BMP version 5 (more ignored fields)
+ 1.38 (2014-06-06)
+ suppress MSVC warnings on integer casts truncating values
+ fix accidental rename of 'skip' field of I/O
+ 1.37 (2014-06-04)
+ remove duplicate typedef
+ 1.36 (2014-06-03)
+ convert to header file single-file library
+ if de-iphone isn't set, load iphone images color-swapped instead of returning NULL
+ 1.35 (2014-05-27)
+ various warnings
+ fix broken STBI_SIMD path
+ fix bug where stbi_load_from_file no longer left file pointer in correct place
+ fix broken non-easy path for 32-bit BMP (possibly never used)
+ TGA optimization by Arseny Kapoulkine
+ 1.34 (unknown)
+ use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case
+ 1.33 (2011-07-14)
+ make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements
+ 1.32 (2011-07-13)
+ support for "info" function for all supported filetypes (SpartanJ)
+ 1.31 (2011-06-20)
+ a few more leak fixes, bug in PNG handling (SpartanJ)
+ 1.30 (2011-06-11)
+ added ability to load files via callbacks to accomidate custom input streams (Ben Wenger)
+ removed deprecated format-specific test/load functions
+ removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway
+ error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha)
+ fix inefficiency in decoding 32-bit BMP (David Woo)
+ 1.29 (2010-08-16)
+ various warning fixes from Aurelien Pocheville
+ 1.28 (2010-08-01)
+ fix bug in GIF palette transparency (SpartanJ)
+ 1.27 (2010-08-01)
+ cast-to-stbi_uc to fix warnings
+ 1.26 (2010-07-24)
+ fix bug in file buffering for PNG reported by SpartanJ
+ 1.25 (2010-07-17)
+ refix trans_data warning (Won Chun)
+ 1.24 (2010-07-12)
+ perf improvements reading from files on platforms with lock-heavy fgetc()
+ minor perf improvements for jpeg
+ deprecated type-specific functions so we'll get feedback if they're needed
+ attempt to fix trans_data warning (Won Chun)
+ 1.23 fixed bug in iPhone support
+ 1.22 (2010-07-10)
+ removed image *writing* support
+ stbi_info support from Jetro Lauha
+ GIF support from Jean-Marc Lienher
+ iPhone PNG-extensions from James Brown
+ warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva)
+ 1.21 fix use of 'stbi_uc' in header (reported by jon blow)
+ 1.20 added support for Softimage PIC, by Tom Seddon
+ 1.19 bug in interlaced PNG corruption check (found by ryg)
+ 1.18 (2008-08-02)
+ fix a threading bug (local mutable static)
+ 1.17 support interlaced PNG
+ 1.16 major bugfix - stbi__convert_format converted one too many pixels
+ 1.15 initialize some fields for thread safety
+ 1.14 fix threadsafe conversion bug
+ header-file-only version (#define STBI_HEADER_FILE_ONLY before including)
+ 1.13 threadsafe
+ 1.12 const qualifiers in the API
+ 1.11 Support installable IDCT, colorspace conversion routines
+ 1.10 Fixes for 64-bit (don't use "unsigned long")
+ optimized upsampling by Fabian "ryg" Giesen
+ 1.09 Fix format-conversion for PSD code (bad global variables!)
+ 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz
+ 1.07 attempt to fix C++ warning/errors again
+ 1.06 attempt to fix C++ warning/errors again
+ 1.05 fix TGA loading to return correct *comp and use good luminance calc
+ 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free
+ 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR
+ 1.02 support for (subset of) HDR files, float interface for preferred access to them
+ 1.01 fix bug: possible bug in handling right-side up bmps... not sure
+ fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all
+ 1.00 interface to zlib that skips zlib header
+ 0.99 correct handling of alpha in palette
+ 0.98 TGA loader by lonesock; dynamically add loaders (untested)
+ 0.97 jpeg errors on too large a file; also catch another malloc failure
+ 0.96 fix detection of invalid v value - particleman@mollyrocket forum
+ 0.95 during header scan, seek to markers in case of padding
+ 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same
+ 0.93 handle jpegtran output; verbose errors
+ 0.92 read 4,8,16,24,32-bit BMP files of several formats
+ 0.91 output 24-bit Windows 3.0 BMP files
+ 0.90 fix a few more warnings; bump version number to approach 1.0
+ 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd
+ 0.60 fix compiling as c++
+ 0.59 fix warnings: merge Dave Moore's -Wall fixes
+ 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian
+ 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available
+ 0.56 fix bug: zlib uncompressed mode len vs. nlen
+ 0.55 fix bug: restart_interval not initialized to 0
+ 0.54 allow NULL for 'int *comp'
+ 0.53 fix bug in png 3->4; speedup png decoding
+ 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments
+ 0.51 obey req_comp requests, 1-component jpegs return as 1-component,
+ on 'test' only check type, not whether we support this variant
+ 0.50 (2006-11-19)
+ first released version
+*/
+
+
+/*
+------------------------------------------------------------------------------
+This software is available under 2 licenses -- choose whichever you prefer.
+------------------------------------------------------------------------------
+ALTERNATIVE A - MIT License
+Copyright (c) 2017 Sean Barrett
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+------------------------------------------------------------------------------
+ALTERNATIVE B - Public Domain (www.unlicense.org)
+This is free and unencumbered software released into the public domain.
+Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
+software, either in source code form or as a compiled binary, for any purpose,
+commercial or non-commercial, and by any means.
+In jurisdictions that recognize copyright laws, the author or authors of this
+software dedicate any and all copyright interest in the software to the public
+domain. We make this dedication for the benefit of the public at large and to
+the detriment of our heirs and successors. We intend this dedication to be an
+overt act of relinquishment in perpetuity of all present and future rights to
+this software under copyright law.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+------------------------------------------------------------------------------
+*/
\ No newline at end of file
diff --git a/neo/renderer/tr_backend.cpp b/neo/engine/renderer/tr_backend.cpp
similarity index 100%
rename from neo/renderer/tr_backend.cpp
rename to neo/engine/renderer/tr_backend.cpp
diff --git a/neo/renderer/tr_deform.cpp b/neo/engine/renderer/tr_deform.cpp
similarity index 100%
rename from neo/renderer/tr_deform.cpp
rename to neo/engine/renderer/tr_deform.cpp
diff --git a/neo/renderer/tr_font.cpp b/neo/engine/renderer/tr_font.cpp
similarity index 100%
rename from neo/renderer/tr_font.cpp
rename to neo/engine/renderer/tr_font.cpp
diff --git a/neo/renderer/tr_guisurf.cpp b/neo/engine/renderer/tr_guisurf.cpp
similarity index 100%
rename from neo/renderer/tr_guisurf.cpp
rename to neo/engine/renderer/tr_guisurf.cpp
diff --git a/neo/renderer/tr_light.cpp b/neo/engine/renderer/tr_light.cpp
similarity index 100%
rename from neo/renderer/tr_light.cpp
rename to neo/engine/renderer/tr_light.cpp
diff --git a/neo/renderer/tr_lightrun.cpp b/neo/engine/renderer/tr_lightrun.cpp
similarity index 100%
rename from neo/renderer/tr_lightrun.cpp
rename to neo/engine/renderer/tr_lightrun.cpp
diff --git a/neo/renderer/tr_local.h b/neo/engine/renderer/tr_local.h
similarity index 100%
rename from neo/renderer/tr_local.h
rename to neo/engine/renderer/tr_local.h
diff --git a/neo/renderer/tr_main.cpp b/neo/engine/renderer/tr_main.cpp
similarity index 100%
rename from neo/renderer/tr_main.cpp
rename to neo/engine/renderer/tr_main.cpp
diff --git a/neo/renderer/tr_polytope.cpp b/neo/engine/renderer/tr_polytope.cpp
similarity index 100%
rename from neo/renderer/tr_polytope.cpp
rename to neo/engine/renderer/tr_polytope.cpp
diff --git a/neo/renderer/tr_render.cpp b/neo/engine/renderer/tr_render.cpp
similarity index 100%
rename from neo/renderer/tr_render.cpp
rename to neo/engine/renderer/tr_render.cpp
diff --git a/neo/renderer/tr_rendertools.cpp b/neo/engine/renderer/tr_rendertools.cpp
similarity index 100%
rename from neo/renderer/tr_rendertools.cpp
rename to neo/engine/renderer/tr_rendertools.cpp
diff --git a/neo/renderer/tr_subview.cpp b/neo/engine/renderer/tr_subview.cpp
similarity index 100%
rename from neo/renderer/tr_subview.cpp
rename to neo/engine/renderer/tr_subview.cpp
diff --git a/neo/renderer/tr_trace.cpp b/neo/engine/renderer/tr_trace.cpp
similarity index 100%
rename from neo/renderer/tr_trace.cpp
rename to neo/engine/renderer/tr_trace.cpp
diff --git a/neo/renderer/tr_trisurf.cpp b/neo/engine/renderer/tr_trisurf.cpp
similarity index 100%
rename from neo/renderer/tr_trisurf.cpp
rename to neo/engine/renderer/tr_trisurf.cpp
diff --git a/neo/sound/OggVorbis/ogg/AUTHORS b/neo/engine/sound/OggVorbis/ogg/AUTHORS
similarity index 100%
rename from neo/sound/OggVorbis/ogg/AUTHORS
rename to neo/engine/sound/OggVorbis/ogg/AUTHORS
diff --git a/neo/sound/OggVorbis/ogg/COPYING b/neo/engine/sound/OggVorbis/ogg/COPYING
similarity index 100%
rename from neo/sound/OggVorbis/ogg/COPYING
rename to neo/engine/sound/OggVorbis/ogg/COPYING
diff --git a/neo/sound/OggVorbis/ogg/README b/neo/engine/sound/OggVorbis/ogg/README
similarity index 100%
rename from neo/sound/OggVorbis/ogg/README
rename to neo/engine/sound/OggVorbis/ogg/README
diff --git a/neo/sound/OggVorbis/ogg/config_types.h.in b/neo/engine/sound/OggVorbis/ogg/config_types.h.in
similarity index 100%
rename from neo/sound/OggVorbis/ogg/config_types.h.in
rename to neo/engine/sound/OggVorbis/ogg/config_types.h.in
diff --git a/neo/sound/OggVorbis/ogg/ogg.h b/neo/engine/sound/OggVorbis/ogg/ogg.h
similarity index 100%
rename from neo/sound/OggVorbis/ogg/ogg.h
rename to neo/engine/sound/OggVorbis/ogg/ogg.h
diff --git a/neo/sound/OggVorbis/ogg/os_types.h b/neo/engine/sound/OggVorbis/ogg/os_types.h
similarity index 100%
rename from neo/sound/OggVorbis/ogg/os_types.h
rename to neo/engine/sound/OggVorbis/ogg/os_types.h
diff --git a/neo/sound/OggVorbis/oggsrc/bitwise.c b/neo/engine/sound/OggVorbis/oggsrc/bitwise.c
similarity index 100%
rename from neo/sound/OggVorbis/oggsrc/bitwise.c
rename to neo/engine/sound/OggVorbis/oggsrc/bitwise.c
diff --git a/neo/sound/OggVorbis/oggsrc/framing.c b/neo/engine/sound/OggVorbis/oggsrc/framing.c
similarity index 100%
rename from neo/sound/OggVorbis/oggsrc/framing.c
rename to neo/engine/sound/OggVorbis/oggsrc/framing.c
diff --git a/neo/sound/OggVorbis/version.txt b/neo/engine/sound/OggVorbis/version.txt
similarity index 100%
rename from neo/sound/OggVorbis/version.txt
rename to neo/engine/sound/OggVorbis/version.txt
diff --git a/neo/sound/OggVorbis/vorbis/AUTHORS b/neo/engine/sound/OggVorbis/vorbis/AUTHORS
similarity index 100%
rename from neo/sound/OggVorbis/vorbis/AUTHORS
rename to neo/engine/sound/OggVorbis/vorbis/AUTHORS
diff --git a/neo/sound/OggVorbis/vorbis/COPYING b/neo/engine/sound/OggVorbis/vorbis/COPYING
similarity index 100%
rename from neo/sound/OggVorbis/vorbis/COPYING
rename to neo/engine/sound/OggVorbis/vorbis/COPYING
diff --git a/neo/sound/OggVorbis/vorbis/README b/neo/engine/sound/OggVorbis/vorbis/README
similarity index 100%
rename from neo/sound/OggVorbis/vorbis/README
rename to neo/engine/sound/OggVorbis/vorbis/README
diff --git a/neo/sound/OggVorbis/vorbis/codec.h b/neo/engine/sound/OggVorbis/vorbis/codec.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbis/codec.h
rename to neo/engine/sound/OggVorbis/vorbis/codec.h
diff --git a/neo/sound/OggVorbis/vorbis/vorbisenc.h b/neo/engine/sound/OggVorbis/vorbis/vorbisenc.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbis/vorbisenc.h
rename to neo/engine/sound/OggVorbis/vorbis/vorbisenc.h
diff --git a/neo/sound/OggVorbis/vorbis/vorbisfile.h b/neo/engine/sound/OggVorbis/vorbis/vorbisfile.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbis/vorbisfile.h
rename to neo/engine/sound/OggVorbis/vorbis/vorbisfile.h
diff --git a/neo/sound/OggVorbis/vorbissrc/analysis.c b/neo/engine/sound/OggVorbis/vorbissrc/analysis.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/analysis.c
rename to neo/engine/sound/OggVorbis/vorbissrc/analysis.c
diff --git a/neo/sound/OggVorbis/vorbissrc/backends.h b/neo/engine/sound/OggVorbis/vorbissrc/backends.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/backends.h
rename to neo/engine/sound/OggVorbis/vorbissrc/backends.h
diff --git a/neo/sound/OggVorbis/vorbissrc/barkmel.c b/neo/engine/sound/OggVorbis/vorbissrc/barkmel.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/barkmel.c
rename to neo/engine/sound/OggVorbis/vorbissrc/barkmel.c
diff --git a/neo/sound/OggVorbis/vorbissrc/bitrate.c b/neo/engine/sound/OggVorbis/vorbissrc/bitrate.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/bitrate.c
rename to neo/engine/sound/OggVorbis/vorbissrc/bitrate.c
diff --git a/neo/sound/OggVorbis/vorbissrc/bitrate.h b/neo/engine/sound/OggVorbis/vorbissrc/bitrate.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/bitrate.h
rename to neo/engine/sound/OggVorbis/vorbissrc/bitrate.h
diff --git a/neo/sound/OggVorbis/vorbissrc/block.c b/neo/engine/sound/OggVorbis/vorbissrc/block.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/block.c
rename to neo/engine/sound/OggVorbis/vorbissrc/block.c
diff --git a/neo/sound/OggVorbis/vorbissrc/books/coupled/res_books_stereo.h b/neo/engine/sound/OggVorbis/vorbissrc/books/coupled/res_books_stereo.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/books/coupled/res_books_stereo.h
rename to neo/engine/sound/OggVorbis/vorbissrc/books/coupled/res_books_stereo.h
diff --git a/neo/sound/OggVorbis/vorbissrc/books/floor/floor_books.h b/neo/engine/sound/OggVorbis/vorbissrc/books/floor/floor_books.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/books/floor/floor_books.h
rename to neo/engine/sound/OggVorbis/vorbissrc/books/floor/floor_books.h
diff --git a/neo/sound/OggVorbis/vorbissrc/books/uncoupled/res_books_uncoupled.h b/neo/engine/sound/OggVorbis/vorbissrc/books/uncoupled/res_books_uncoupled.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/books/uncoupled/res_books_uncoupled.h
rename to neo/engine/sound/OggVorbis/vorbissrc/books/uncoupled/res_books_uncoupled.h
diff --git a/neo/sound/OggVorbis/vorbissrc/codebook.c b/neo/engine/sound/OggVorbis/vorbissrc/codebook.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/codebook.c
rename to neo/engine/sound/OggVorbis/vorbissrc/codebook.c
diff --git a/neo/sound/OggVorbis/vorbissrc/codebook.h b/neo/engine/sound/OggVorbis/vorbissrc/codebook.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/codebook.h
rename to neo/engine/sound/OggVorbis/vorbissrc/codebook.h
diff --git a/neo/sound/OggVorbis/vorbissrc/codec_internal.h b/neo/engine/sound/OggVorbis/vorbissrc/codec_internal.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/codec_internal.h
rename to neo/engine/sound/OggVorbis/vorbissrc/codec_internal.h
diff --git a/neo/sound/OggVorbis/vorbissrc/envelope.c b/neo/engine/sound/OggVorbis/vorbissrc/envelope.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/envelope.c
rename to neo/engine/sound/OggVorbis/vorbissrc/envelope.c
diff --git a/neo/sound/OggVorbis/vorbissrc/envelope.h b/neo/engine/sound/OggVorbis/vorbissrc/envelope.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/envelope.h
rename to neo/engine/sound/OggVorbis/vorbissrc/envelope.h
diff --git a/neo/sound/OggVorbis/vorbissrc/floor0.c b/neo/engine/sound/OggVorbis/vorbissrc/floor0.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/floor0.c
rename to neo/engine/sound/OggVorbis/vorbissrc/floor0.c
diff --git a/neo/sound/OggVorbis/vorbissrc/floor1.c b/neo/engine/sound/OggVorbis/vorbissrc/floor1.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/floor1.c
rename to neo/engine/sound/OggVorbis/vorbissrc/floor1.c
diff --git a/neo/sound/OggVorbis/vorbissrc/highlevel.h b/neo/engine/sound/OggVorbis/vorbissrc/highlevel.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/highlevel.h
rename to neo/engine/sound/OggVorbis/vorbissrc/highlevel.h
diff --git a/neo/sound/OggVorbis/vorbissrc/info.c b/neo/engine/sound/OggVorbis/vorbissrc/info.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/info.c
rename to neo/engine/sound/OggVorbis/vorbissrc/info.c
diff --git a/neo/sound/OggVorbis/vorbissrc/lookup.c b/neo/engine/sound/OggVorbis/vorbissrc/lookup.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/lookup.c
rename to neo/engine/sound/OggVorbis/vorbissrc/lookup.c
diff --git a/neo/sound/OggVorbis/vorbissrc/lookup.h b/neo/engine/sound/OggVorbis/vorbissrc/lookup.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/lookup.h
rename to neo/engine/sound/OggVorbis/vorbissrc/lookup.h
diff --git a/neo/sound/OggVorbis/vorbissrc/lookup_data.h b/neo/engine/sound/OggVorbis/vorbissrc/lookup_data.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/lookup_data.h
rename to neo/engine/sound/OggVorbis/vorbissrc/lookup_data.h
diff --git a/neo/sound/OggVorbis/vorbissrc/lookups.pl b/neo/engine/sound/OggVorbis/vorbissrc/lookups.pl
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/lookups.pl
rename to neo/engine/sound/OggVorbis/vorbissrc/lookups.pl
diff --git a/neo/sound/OggVorbis/vorbissrc/lpc.c b/neo/engine/sound/OggVorbis/vorbissrc/lpc.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/lpc.c
rename to neo/engine/sound/OggVorbis/vorbissrc/lpc.c
diff --git a/neo/sound/OggVorbis/vorbissrc/lpc.h b/neo/engine/sound/OggVorbis/vorbissrc/lpc.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/lpc.h
rename to neo/engine/sound/OggVorbis/vorbissrc/lpc.h
diff --git a/neo/sound/OggVorbis/vorbissrc/lsp.c b/neo/engine/sound/OggVorbis/vorbissrc/lsp.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/lsp.c
rename to neo/engine/sound/OggVorbis/vorbissrc/lsp.c
diff --git a/neo/sound/OggVorbis/vorbissrc/lsp.h b/neo/engine/sound/OggVorbis/vorbissrc/lsp.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/lsp.h
rename to neo/engine/sound/OggVorbis/vorbissrc/lsp.h
diff --git a/neo/sound/OggVorbis/vorbissrc/mapping0.c b/neo/engine/sound/OggVorbis/vorbissrc/mapping0.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/mapping0.c
rename to neo/engine/sound/OggVorbis/vorbissrc/mapping0.c
diff --git a/neo/sound/OggVorbis/vorbissrc/masking.h b/neo/engine/sound/OggVorbis/vorbissrc/masking.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/masking.h
rename to neo/engine/sound/OggVorbis/vorbissrc/masking.h
diff --git a/neo/sound/OggVorbis/vorbissrc/mdct.c b/neo/engine/sound/OggVorbis/vorbissrc/mdct.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/mdct.c
rename to neo/engine/sound/OggVorbis/vorbissrc/mdct.c
diff --git a/neo/sound/OggVorbis/vorbissrc/mdct.h b/neo/engine/sound/OggVorbis/vorbissrc/mdct.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/mdct.h
rename to neo/engine/sound/OggVorbis/vorbissrc/mdct.h
diff --git a/neo/sound/OggVorbis/vorbissrc/misc.h b/neo/engine/sound/OggVorbis/vorbissrc/misc.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/misc.h
rename to neo/engine/sound/OggVorbis/vorbissrc/misc.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/floor_all.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/floor_all.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/floor_all.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/floor_all.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/psych_11.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/psych_11.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/psych_11.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/psych_11.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/psych_16.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/psych_16.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/psych_16.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/psych_16.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/psych_44.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/psych_44.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/psych_44.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/psych_44.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/psych_8.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/psych_8.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/psych_8.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/psych_8.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/residue_16.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/residue_16.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/residue_16.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/residue_16.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/residue_44.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/residue_44.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/residue_44.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/residue_44.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/residue_44u.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/residue_44u.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/residue_44u.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/residue_44u.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/residue_8.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/residue_8.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/residue_8.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/residue_8.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/setup_11.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/setup_11.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/setup_11.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/setup_11.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/setup_16.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/setup_16.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/setup_16.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/setup_16.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/setup_22.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/setup_22.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/setup_22.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/setup_22.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/setup_32.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/setup_32.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/setup_32.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/setup_32.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/setup_44.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/setup_44.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/setup_44.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/setup_44.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/setup_44u.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/setup_44u.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/setup_44u.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/setup_44u.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/setup_8.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/setup_8.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/setup_8.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/setup_8.h
diff --git a/neo/sound/OggVorbis/vorbissrc/modes/setup_X.h b/neo/engine/sound/OggVorbis/vorbissrc/modes/setup_X.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/modes/setup_X.h
rename to neo/engine/sound/OggVorbis/vorbissrc/modes/setup_X.h
diff --git a/neo/sound/OggVorbis/vorbissrc/os.h b/neo/engine/sound/OggVorbis/vorbissrc/os.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/os.h
rename to neo/engine/sound/OggVorbis/vorbissrc/os.h
diff --git a/neo/sound/OggVorbis/vorbissrc/psy.c b/neo/engine/sound/OggVorbis/vorbissrc/psy.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/psy.c
rename to neo/engine/sound/OggVorbis/vorbissrc/psy.c
diff --git a/neo/sound/OggVorbis/vorbissrc/psy.h b/neo/engine/sound/OggVorbis/vorbissrc/psy.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/psy.h
rename to neo/engine/sound/OggVorbis/vorbissrc/psy.h
diff --git a/neo/sound/OggVorbis/vorbissrc/psytune.c b/neo/engine/sound/OggVorbis/vorbissrc/psytune.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/psytune.c
rename to neo/engine/sound/OggVorbis/vorbissrc/psytune.c
diff --git a/neo/sound/OggVorbis/vorbissrc/registry.c b/neo/engine/sound/OggVorbis/vorbissrc/registry.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/registry.c
rename to neo/engine/sound/OggVorbis/vorbissrc/registry.c
diff --git a/neo/sound/OggVorbis/vorbissrc/registry.h b/neo/engine/sound/OggVorbis/vorbissrc/registry.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/registry.h
rename to neo/engine/sound/OggVorbis/vorbissrc/registry.h
diff --git a/neo/sound/OggVorbis/vorbissrc/res0.c b/neo/engine/sound/OggVorbis/vorbissrc/res0.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/res0.c
rename to neo/engine/sound/OggVorbis/vorbissrc/res0.c
diff --git a/neo/sound/OggVorbis/vorbissrc/scales.h b/neo/engine/sound/OggVorbis/vorbissrc/scales.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/scales.h
rename to neo/engine/sound/OggVorbis/vorbissrc/scales.h
diff --git a/neo/sound/OggVorbis/vorbissrc/sharedbook.c b/neo/engine/sound/OggVorbis/vorbissrc/sharedbook.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/sharedbook.c
rename to neo/engine/sound/OggVorbis/vorbissrc/sharedbook.c
diff --git a/neo/sound/OggVorbis/vorbissrc/smallft.c b/neo/engine/sound/OggVorbis/vorbissrc/smallft.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/smallft.c
rename to neo/engine/sound/OggVorbis/vorbissrc/smallft.c
diff --git a/neo/sound/OggVorbis/vorbissrc/smallft.h b/neo/engine/sound/OggVorbis/vorbissrc/smallft.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/smallft.h
rename to neo/engine/sound/OggVorbis/vorbissrc/smallft.h
diff --git a/neo/sound/OggVorbis/vorbissrc/synthesis.c b/neo/engine/sound/OggVorbis/vorbissrc/synthesis.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/synthesis.c
rename to neo/engine/sound/OggVorbis/vorbissrc/synthesis.c
diff --git a/neo/sound/OggVorbis/vorbissrc/tone.c b/neo/engine/sound/OggVorbis/vorbissrc/tone.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/tone.c
rename to neo/engine/sound/OggVorbis/vorbissrc/tone.c
diff --git a/neo/sound/OggVorbis/vorbissrc/vorbisenc.c b/neo/engine/sound/OggVorbis/vorbissrc/vorbisenc.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/vorbisenc.c
rename to neo/engine/sound/OggVorbis/vorbissrc/vorbisenc.c
diff --git a/neo/sound/OggVorbis/vorbissrc/vorbisfile.c b/neo/engine/sound/OggVorbis/vorbissrc/vorbisfile.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/vorbisfile.c
rename to neo/engine/sound/OggVorbis/vorbissrc/vorbisfile.c
diff --git a/neo/sound/OggVorbis/vorbissrc/window.h b/neo/engine/sound/OggVorbis/vorbissrc/window.h
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/window.h
rename to neo/engine/sound/OggVorbis/vorbissrc/window.h
diff --git a/neo/sound/OggVorbis/vorbissrc/windowvb.c b/neo/engine/sound/OggVorbis/vorbissrc/windowvb.c
similarity index 100%
rename from neo/sound/OggVorbis/vorbissrc/windowvb.c
rename to neo/engine/sound/OggVorbis/vorbissrc/windowvb.c
diff --git a/neo/sound/snd_cache.cpp b/neo/engine/sound/snd_cache.cpp
similarity index 100%
rename from neo/sound/snd_cache.cpp
rename to neo/engine/sound/snd_cache.cpp
diff --git a/neo/sound/snd_decoder.cpp b/neo/engine/sound/snd_decoder.cpp
similarity index 100%
rename from neo/sound/snd_decoder.cpp
rename to neo/engine/sound/snd_decoder.cpp
diff --git a/neo/sound/snd_efxfile.cpp b/neo/engine/sound/snd_efxfile.cpp
similarity index 100%
rename from neo/sound/snd_efxfile.cpp
rename to neo/engine/sound/snd_efxfile.cpp
diff --git a/neo/sound/snd_emitter.cpp b/neo/engine/sound/snd_emitter.cpp
similarity index 100%
rename from neo/sound/snd_emitter.cpp
rename to neo/engine/sound/snd_emitter.cpp
diff --git a/neo/sound/snd_local.h b/neo/engine/sound/snd_local.h
similarity index 100%
rename from neo/sound/snd_local.h
rename to neo/engine/sound/snd_local.h
diff --git a/neo/sound/snd_shader.cpp b/neo/engine/sound/snd_shader.cpp
similarity index 100%
rename from neo/sound/snd_shader.cpp
rename to neo/engine/sound/snd_shader.cpp
diff --git a/neo/sound/snd_system.cpp b/neo/engine/sound/snd_system.cpp
similarity index 100%
rename from neo/sound/snd_system.cpp
rename to neo/engine/sound/snd_system.cpp
diff --git a/neo/sound/snd_wavefile.cpp b/neo/engine/sound/snd_wavefile.cpp
similarity index 100%
rename from neo/sound/snd_wavefile.cpp
rename to neo/engine/sound/snd_wavefile.cpp
diff --git a/neo/sound/snd_world.cpp b/neo/engine/sound/snd_world.cpp
similarity index 100%
rename from neo/sound/snd_world.cpp
rename to neo/engine/sound/snd_world.cpp
diff --git a/neo/sound/sound.h b/neo/engine/sound/sound.h
similarity index 100%
rename from neo/sound/sound.h
rename to neo/engine/sound/sound.h
diff --git a/neo/sys/gllog/gl.api b/neo/engine/sys/gllog/gl.api
similarity index 100%
rename from neo/sys/gllog/gl.api
rename to neo/engine/sys/gllog/gl.api
diff --git a/neo/sys/gllog/glX.api b/neo/engine/sys/gllog/glX.api
similarity index 100%
rename from neo/sys/gllog/glX.api
rename to neo/engine/sys/gllog/glX.api
diff --git a/neo/sys/gllog/gl_def.m4 b/neo/engine/sys/gllog/gl_def.m4
similarity index 100%
rename from neo/sys/gllog/gl_def.m4
rename to neo/engine/sys/gllog/gl_def.m4
diff --git a/neo/sys/gllog/gl_extensions.cpp.m4 b/neo/engine/sys/gllog/gl_extensions.cpp.m4
similarity index 100%
rename from neo/sys/gllog/gl_extensions.cpp.m4
rename to neo/engine/sys/gllog/gl_extensions.cpp.m4
diff --git a/neo/sys/gllog/logfunc.py b/neo/engine/sys/gllog/logfunc.py
similarity index 100%
rename from neo/sys/gllog/logfunc.py
rename to neo/engine/sys/gllog/logfunc.py
diff --git a/neo/sys/gllog/read.py b/neo/engine/sys/gllog/read.py
similarity index 100%
rename from neo/sys/gllog/read.py
rename to neo/engine/sys/gllog/read.py
diff --git a/neo/sys/gllog/wgl.api b/neo/engine/sys/gllog/wgl.api
similarity index 100%
rename from neo/sys/gllog/wgl.api
rename to neo/engine/sys/gllog/wgl.api
diff --git a/neo/sys/linux/SDK-1.3.list.txt b/neo/engine/sys/linux/SDK-1.3.list.txt
similarity index 100%
rename from neo/sys/linux/SDK-1.3.list.txt
rename to neo/engine/sys/linux/SDK-1.3.list.txt
diff --git a/neo/sys/linux/SDK.list.txt b/neo/engine/sys/linux/SDK.list.txt
similarity index 100%
rename from neo/sys/linux/SDK.list.txt
rename to neo/engine/sys/linux/SDK.list.txt
diff --git a/neo/sys/linux/casedir.patch b/neo/engine/sys/linux/casedir.patch
similarity index 100%
rename from neo/sys/linux/casedir.patch
rename to neo/engine/sys/linux/casedir.patch
diff --git a/neo/sys/linux/dedicated.cpp b/neo/engine/sys/linux/dedicated.cpp
similarity index 100%
rename from neo/sys/linux/dedicated.cpp
rename to neo/engine/sys/linux/dedicated.cpp
diff --git a/neo/sys/linux/glimp.cpp b/neo/engine/sys/linux/glimp.cpp
similarity index 100%
rename from neo/sys/linux/glimp.cpp
rename to neo/engine/sys/linux/glimp.cpp
diff --git a/neo/sys/linux/glimp_dlopen.cpp.m4 b/neo/engine/sys/linux/glimp_dlopen.cpp.m4
similarity index 100%
rename from neo/sys/linux/glimp_dlopen.cpp.m4
rename to neo/engine/sys/linux/glimp_dlopen.cpp.m4
diff --git a/neo/sys/linux/glimp_glenum.h b/neo/engine/sys/linux/glimp_glenum.h
similarity index 100%
rename from neo/sys/linux/glimp_glenum.h
rename to neo/engine/sys/linux/glimp_glenum.h
diff --git a/neo/sys/linux/glimp_local.h.m4 b/neo/engine/sys/linux/glimp_local.h.m4
similarity index 100%
rename from neo/sys/linux/glimp_local.h.m4
rename to neo/engine/sys/linux/glimp_local.h.m4
diff --git a/neo/sys/linux/glimp_logging.cpp.m4 b/neo/engine/sys/linux/glimp_logging.cpp.m4
similarity index 100%
rename from neo/sys/linux/glimp_logging.cpp.m4
rename to neo/engine/sys/linux/glimp_logging.cpp.m4
diff --git a/neo/sys/linux/glimp_stub.cpp.m4 b/neo/engine/sys/linux/glimp_stub.cpp.m4
similarity index 100%
rename from neo/sys/linux/glimp_stub.cpp.m4
rename to neo/engine/sys/linux/glimp_stub.cpp.m4
diff --git a/neo/sys/linux/input.cpp b/neo/engine/sys/linux/input.cpp
similarity index 100%
rename from neo/sys/linux/input.cpp
rename to neo/engine/sys/linux/input.cpp
diff --git a/neo/sys/linux/libXNVCtrl/NV-CONTROL-API.txt b/neo/engine/sys/linux/libXNVCtrl/NV-CONTROL-API.txt
similarity index 100%
rename from neo/sys/linux/libXNVCtrl/NV-CONTROL-API.txt
rename to neo/engine/sys/linux/libXNVCtrl/NV-CONTROL-API.txt
diff --git a/neo/sys/linux/libXNVCtrl/NVCtrl.c b/neo/engine/sys/linux/libXNVCtrl/NVCtrl.c
similarity index 100%
rename from neo/sys/linux/libXNVCtrl/NVCtrl.c
rename to neo/engine/sys/linux/libXNVCtrl/NVCtrl.c
diff --git a/neo/sys/linux/libXNVCtrl/NVCtrl.h b/neo/engine/sys/linux/libXNVCtrl/NVCtrl.h
similarity index 100%
rename from neo/sys/linux/libXNVCtrl/NVCtrl.h
rename to neo/engine/sys/linux/libXNVCtrl/NVCtrl.h
diff --git a/neo/sys/linux/libXNVCtrl/NVCtrlLib.h b/neo/engine/sys/linux/libXNVCtrl/NVCtrlLib.h
similarity index 100%
rename from neo/sys/linux/libXNVCtrl/NVCtrlLib.h
rename to neo/engine/sys/linux/libXNVCtrl/NVCtrlLib.h
diff --git a/neo/sys/linux/libXNVCtrl/extutil.h b/neo/engine/sys/linux/libXNVCtrl/extutil.h
similarity index 100%
rename from neo/sys/linux/libXNVCtrl/extutil.h
rename to neo/engine/sys/linux/libXNVCtrl/extutil.h
diff --git a/neo/sys/linux/libXNVCtrl/nv_control.h b/neo/engine/sys/linux/libXNVCtrl/nv_control.h
similarity index 100%
rename from neo/sys/linux/libXNVCtrl/nv_control.h
rename to neo/engine/sys/linux/libXNVCtrl/nv_control.h
diff --git a/neo/sys/linux/local.h b/neo/engine/sys/linux/local.h
similarity index 100%
rename from neo/sys/linux/local.h
rename to neo/engine/sys/linux/local.h
diff --git a/neo/sys/linux/main.cpp b/neo/engine/sys/linux/main.cpp
similarity index 100%
rename from neo/sys/linux/main.cpp
rename to neo/engine/sys/linux/main.cpp
diff --git a/neo/sys/linux/oss/include/audio_core.h b/neo/engine/sys/linux/oss/include/audio_core.h
similarity index 100%
rename from neo/sys/linux/oss/include/audio_core.h
rename to neo/engine/sys/linux/oss/include/audio_core.h
diff --git a/neo/sys/linux/oss/include/midi_core.h b/neo/engine/sys/linux/oss/include/midi_core.h
similarity index 100%
rename from neo/sys/linux/oss/include/midi_core.h
rename to neo/engine/sys/linux/oss/include/midi_core.h
diff --git a/neo/sys/linux/oss/include/mixer_core.h b/neo/engine/sys/linux/oss/include/mixer_core.h
similarity index 100%
rename from neo/sys/linux/oss/include/mixer_core.h
rename to neo/engine/sys/linux/oss/include/mixer_core.h
diff --git a/neo/sys/linux/oss/include/sys/soundcard.h b/neo/engine/sys/linux/oss/include/sys/soundcard.h
similarity index 100%
rename from neo/sys/linux/oss/include/sys/soundcard.h
rename to neo/engine/sys/linux/oss/include/sys/soundcard.h
diff --git a/neo/sys/linux/oss/include/sys/ultrasound.h b/neo/engine/sys/linux/oss/include/sys/ultrasound.h
similarity index 100%
rename from neo/sys/linux/oss/include/sys/ultrasound.h
rename to neo/engine/sys/linux/oss/include/sys/ultrasound.h
diff --git a/neo/sys/linux/pk4/id_utils.py b/neo/engine/sys/linux/pk4/id_utils.py
similarity index 100%
rename from neo/sys/linux/pk4/id_utils.py
rename to neo/engine/sys/linux/pk4/id_utils.py
diff --git a/neo/sys/linux/pk4/packup-nocase.sh b/neo/engine/sys/linux/pk4/packup-nocase.sh
similarity index 100%
rename from neo/sys/linux/pk4/packup-nocase.sh
rename to neo/engine/sys/linux/pk4/packup-nocase.sh
diff --git a/neo/sys/linux/pk4/packup.sh b/neo/engine/sys/linux/pk4/packup.sh
similarity index 100%
rename from neo/sys/linux/pk4/packup.sh
rename to neo/engine/sys/linux/pk4/packup.sh
diff --git a/neo/sys/linux/pk4/syncfromlist.sh b/neo/engine/sys/linux/pk4/syncfromlist.sh
similarity index 100%
rename from neo/sys/linux/pk4/syncfromlist.sh
rename to neo/engine/sys/linux/pk4/syncfromlist.sh
diff --git a/neo/sys/linux/pk4/updatepaks.sh b/neo/engine/sys/linux/pk4/updatepaks.sh
similarity index 100%
rename from neo/sys/linux/pk4/updatepaks.sh
rename to neo/engine/sys/linux/pk4/updatepaks.sh
diff --git a/neo/sys/linux/process.py b/neo/engine/sys/linux/process.py
similarity index 100%
rename from neo/sys/linux/process.py
rename to neo/engine/sys/linux/process.py
diff --git a/neo/sys/linux/process_undef.pl b/neo/engine/sys/linux/process_undef.pl
similarity index 100%
rename from neo/sys/linux/process_undef.pl
rename to neo/engine/sys/linux/process_undef.pl
diff --git a/neo/sys/linux/qgl_enforce.h b/neo/engine/sys/linux/qgl_enforce.h
similarity index 100%
rename from neo/sys/linux/qgl_enforce.h
rename to neo/engine/sys/linux/qgl_enforce.h
diff --git a/neo/sys/linux/qgl_enforce.h.m4 b/neo/engine/sys/linux/qgl_enforce.h.m4
similarity index 100%
rename from neo/sys/linux/qgl_enforce.h.m4
rename to neo/engine/sys/linux/qgl_enforce.h.m4
diff --git a/neo/sys/linux/runner/runner.tac b/neo/engine/sys/linux/runner/runner.tac
similarity index 100%
rename from neo/sys/linux/runner/runner.tac
rename to neo/engine/sys/linux/runner/runner.tac
diff --git a/neo/sys/linux/runner/runner_lib.py b/neo/engine/sys/linux/runner/runner_lib.py
similarity index 100%
rename from neo/sys/linux/runner/runner_lib.py
rename to neo/engine/sys/linux/runner/runner_lib.py
diff --git a/neo/sys/linux/setup/binary.conf b/neo/engine/sys/linux/setup/binary.conf
similarity index 100%
rename from neo/sys/linux/setup/binary.conf
rename to neo/engine/sys/linux/setup/binary.conf
diff --git a/neo/sys/linux/setup/brandelf.c b/neo/engine/sys/linux/setup/brandelf.c
similarity index 100%
rename from neo/sys/linux/setup/brandelf.c
rename to neo/engine/sys/linux/setup/brandelf.c
diff --git a/neo/sys/linux/setup/image-base/setup.data/bin/Linux/x86/glibc-2.1/setup.gtk b/neo/engine/sys/linux/setup/image-base/setup.data/bin/Linux/x86/glibc-2.1/setup.gtk
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/bin/Linux/x86/glibc-2.1/setup.gtk
rename to neo/engine/sys/linux/setup/image-base/setup.data/bin/Linux/x86/glibc-2.1/setup.gtk
diff --git a/neo/sys/linux/setup/image-base/setup.data/bin/Linux/x86/glibc-2.1/xsu b/neo/engine/sys/linux/setup/image-base/setup.data/bin/Linux/x86/glibc-2.1/xsu
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/bin/Linux/x86/glibc-2.1/xsu
rename to neo/engine/sys/linux/setup/image-base/setup.data/bin/Linux/x86/glibc-2.1/xsu
diff --git a/neo/sys/linux/setup/image-base/setup.data/bin/Linux/x86/setup b/neo/engine/sys/linux/setup/image-base/setup.data/bin/Linux/x86/setup
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/bin/Linux/x86/setup
rename to neo/engine/sys/linux/setup/image-base/setup.data/bin/Linux/x86/setup
diff --git a/neo/sys/linux/setup/image-base/setup.data/config.sh b/neo/engine/sys/linux/setup/image-base/setup.data/config.sh
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/config.sh
rename to neo/engine/sys/linux/setup/image-base/setup.data/config.sh
diff --git a/neo/sys/linux/setup/image-base/setup.data/locale/de/LC_MESSAGES/loki-uninstall.mo b/neo/engine/sys/linux/setup/image-base/setup.data/locale/de/LC_MESSAGES/loki-uninstall.mo
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/locale/de/LC_MESSAGES/loki-uninstall.mo
rename to neo/engine/sys/linux/setup/image-base/setup.data/locale/de/LC_MESSAGES/loki-uninstall.mo
diff --git a/neo/sys/linux/setup/image-base/setup.data/locale/de/LC_MESSAGES/setup.mo b/neo/engine/sys/linux/setup/image-base/setup.data/locale/de/LC_MESSAGES/setup.mo
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/locale/de/LC_MESSAGES/setup.mo
rename to neo/engine/sys/linux/setup/image-base/setup.data/locale/de/LC_MESSAGES/setup.mo
diff --git a/neo/sys/linux/setup/image-base/setup.data/locale/en_UK/LC_MESSAGES/loki-uninstall.mo b/neo/engine/sys/linux/setup/image-base/setup.data/locale/en_UK/LC_MESSAGES/loki-uninstall.mo
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/locale/en_UK/LC_MESSAGES/loki-uninstall.mo
rename to neo/engine/sys/linux/setup/image-base/setup.data/locale/en_UK/LC_MESSAGES/loki-uninstall.mo
diff --git a/neo/sys/linux/setup/image-base/setup.data/locale/en_UK/LC_MESSAGES/setup.mo b/neo/engine/sys/linux/setup/image-base/setup.data/locale/en_UK/LC_MESSAGES/setup.mo
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/locale/en_UK/LC_MESSAGES/setup.mo
rename to neo/engine/sys/linux/setup/image-base/setup.data/locale/en_UK/LC_MESSAGES/setup.mo
diff --git a/neo/sys/linux/setup/image-base/setup.data/locale/es/LC_MESSAGES/loki-uninstall.mo b/neo/engine/sys/linux/setup/image-base/setup.data/locale/es/LC_MESSAGES/loki-uninstall.mo
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/locale/es/LC_MESSAGES/loki-uninstall.mo
rename to neo/engine/sys/linux/setup/image-base/setup.data/locale/es/LC_MESSAGES/loki-uninstall.mo
diff --git a/neo/sys/linux/setup/image-base/setup.data/locale/es/LC_MESSAGES/setup.mo b/neo/engine/sys/linux/setup/image-base/setup.data/locale/es/LC_MESSAGES/setup.mo
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/locale/es/LC_MESSAGES/setup.mo
rename to neo/engine/sys/linux/setup/image-base/setup.data/locale/es/LC_MESSAGES/setup.mo
diff --git a/neo/sys/linux/setup/image-base/setup.data/locale/fr/LC_MESSAGES/loki-uninstall.mo b/neo/engine/sys/linux/setup/image-base/setup.data/locale/fr/LC_MESSAGES/loki-uninstall.mo
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/locale/fr/LC_MESSAGES/loki-uninstall.mo
rename to neo/engine/sys/linux/setup/image-base/setup.data/locale/fr/LC_MESSAGES/loki-uninstall.mo
diff --git a/neo/sys/linux/setup/image-base/setup.data/locale/fr/LC_MESSAGES/setup.mo b/neo/engine/sys/linux/setup/image-base/setup.data/locale/fr/LC_MESSAGES/setup.mo
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/locale/fr/LC_MESSAGES/setup.mo
rename to neo/engine/sys/linux/setup/image-base/setup.data/locale/fr/LC_MESSAGES/setup.mo
diff --git a/neo/sys/linux/setup/image-base/setup.data/locale/it/LC_MESSAGES/loki-uninstall.mo b/neo/engine/sys/linux/setup/image-base/setup.data/locale/it/LC_MESSAGES/loki-uninstall.mo
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/locale/it/LC_MESSAGES/loki-uninstall.mo
rename to neo/engine/sys/linux/setup/image-base/setup.data/locale/it/LC_MESSAGES/loki-uninstall.mo
diff --git a/neo/sys/linux/setup/image-base/setup.data/locale/it/LC_MESSAGES/setup.mo b/neo/engine/sys/linux/setup/image-base/setup.data/locale/it/LC_MESSAGES/setup.mo
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/locale/it/LC_MESSAGES/setup.mo
rename to neo/engine/sys/linux/setup/image-base/setup.data/locale/it/LC_MESSAGES/setup.mo
diff --git a/neo/sys/linux/setup/image-base/setup.data/locale/nl/LC_MESSAGES/loki-uninstall.mo b/neo/engine/sys/linux/setup/image-base/setup.data/locale/nl/LC_MESSAGES/loki-uninstall.mo
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/locale/nl/LC_MESSAGES/loki-uninstall.mo
rename to neo/engine/sys/linux/setup/image-base/setup.data/locale/nl/LC_MESSAGES/loki-uninstall.mo
diff --git a/neo/sys/linux/setup/image-base/setup.data/locale/nl/LC_MESSAGES/setup.mo b/neo/engine/sys/linux/setup/image-base/setup.data/locale/nl/LC_MESSAGES/setup.mo
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/locale/nl/LC_MESSAGES/setup.mo
rename to neo/engine/sys/linux/setup/image-base/setup.data/locale/nl/LC_MESSAGES/setup.mo
diff --git a/neo/sys/linux/setup/image-base/setup.data/locale/ru/LC_MESSAGES/loki-uninstall.mo b/neo/engine/sys/linux/setup/image-base/setup.data/locale/ru/LC_MESSAGES/loki-uninstall.mo
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/locale/ru/LC_MESSAGES/loki-uninstall.mo
rename to neo/engine/sys/linux/setup/image-base/setup.data/locale/ru/LC_MESSAGES/loki-uninstall.mo
diff --git a/neo/sys/linux/setup/image-base/setup.data/locale/ru/LC_MESSAGES/setup.mo b/neo/engine/sys/linux/setup/image-base/setup.data/locale/ru/LC_MESSAGES/setup.mo
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/locale/ru/LC_MESSAGES/setup.mo
rename to neo/engine/sys/linux/setup/image-base/setup.data/locale/ru/LC_MESSAGES/setup.mo
diff --git a/neo/sys/linux/setup/image-base/setup.data/locale/sv/LC_MESSAGES/loki-uninstall.mo b/neo/engine/sys/linux/setup/image-base/setup.data/locale/sv/LC_MESSAGES/loki-uninstall.mo
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/locale/sv/LC_MESSAGES/loki-uninstall.mo
rename to neo/engine/sys/linux/setup/image-base/setup.data/locale/sv/LC_MESSAGES/loki-uninstall.mo
diff --git a/neo/sys/linux/setup/image-base/setup.data/locale/sv/LC_MESSAGES/setup.mo b/neo/engine/sys/linux/setup/image-base/setup.data/locale/sv/LC_MESSAGES/setup.mo
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/locale/sv/LC_MESSAGES/setup.mo
rename to neo/engine/sys/linux/setup/image-base/setup.data/locale/sv/LC_MESSAGES/setup.mo
diff --git a/neo/sys/linux/setup/image-base/setup.data/setup.glade b/neo/engine/sys/linux/setup/image-base/setup.data/setup.glade
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.data/setup.glade
rename to neo/engine/sys/linux/setup/image-base/setup.data/setup.glade
diff --git a/neo/sys/linux/setup/image-base/setup.sh b/neo/engine/sys/linux/setup/image-base/setup.sh
similarity index 100%
rename from neo/sys/linux/setup/image-base/setup.sh
rename to neo/engine/sys/linux/setup/image-base/setup.sh
diff --git a/neo/sys/linux/setup/image-demo/License.txt b/neo/engine/sys/linux/setup/image-demo/License.txt
similarity index 100%
rename from neo/sys/linux/setup/image-demo/License.txt
rename to neo/engine/sys/linux/setup/image-demo/License.txt
diff --git a/neo/sys/linux/setup/image-demo/README b/neo/engine/sys/linux/setup/image-demo/README
similarity index 100%
rename from neo/sys/linux/setup/image-demo/README
rename to neo/engine/sys/linux/setup/image-demo/README
diff --git a/neo/sys/linux/setup/image-demo/bin/Linux/x86/doom3-demo b/neo/engine/sys/linux/setup/image-demo/bin/Linux/x86/doom3-demo
similarity index 100%
rename from neo/sys/linux/setup/image-demo/bin/Linux/x86/doom3-demo
rename to neo/engine/sys/linux/setup/image-demo/bin/Linux/x86/doom3-demo
diff --git a/neo/sys/linux/setup/image-demo/setup.data/postinstall.sh b/neo/engine/sys/linux/setup/image-demo/setup.data/postinstall.sh
similarity index 100%
rename from neo/sys/linux/setup/image-demo/setup.data/postinstall.sh
rename to neo/engine/sys/linux/setup/image-demo/setup.data/postinstall.sh
diff --git a/neo/sys/linux/setup/image-demo/setup.data/setup.xml.in b/neo/engine/sys/linux/setup/image-demo/setup.data/setup.xml.in
similarity index 100%
rename from neo/sys/linux/setup/image-demo/setup.data/setup.xml.in
rename to neo/engine/sys/linux/setup/image-demo/setup.data/setup.xml.in
diff --git a/neo/sys/linux/setup/image-sdk/License.SDK.txt b/neo/engine/sys/linux/setup/image-sdk/License.SDK.txt
similarity index 100%
rename from neo/sys/linux/setup/image-sdk/License.SDK.txt
rename to neo/engine/sys/linux/setup/image-sdk/License.SDK.txt
diff --git a/neo/sys/linux/setup/image-sdk/README.SDK.txt b/neo/engine/sys/linux/setup/image-sdk/README.SDK.txt
similarity index 100%
rename from neo/sys/linux/setup/image-sdk/README.SDK.txt
rename to neo/engine/sys/linux/setup/image-sdk/README.SDK.txt
diff --git a/neo/sys/linux/setup/image-sdk/setup.data/config.sh b/neo/engine/sys/linux/setup/image-sdk/setup.data/config.sh
similarity index 100%
rename from neo/sys/linux/setup/image-sdk/setup.data/config.sh
rename to neo/engine/sys/linux/setup/image-sdk/setup.data/config.sh
diff --git a/neo/sys/linux/setup/image-sdk/setup.data/setup.xml.in b/neo/engine/sys/linux/setup/image-sdk/setup.data/setup.xml.in
similarity index 100%
rename from neo/sys/linux/setup/image-sdk/setup.data/setup.xml.in
rename to neo/engine/sys/linux/setup/image-sdk/setup.data/setup.xml.in
diff --git a/neo/sys/linux/setup/image/License.txt b/neo/engine/sys/linux/setup/image/License.txt
similarity index 100%
rename from neo/sys/linux/setup/image/License.txt
rename to neo/engine/sys/linux/setup/image/License.txt
diff --git a/neo/sys/linux/setup/image/README b/neo/engine/sys/linux/setup/image/README
similarity index 100%
rename from neo/sys/linux/setup/image/README
rename to neo/engine/sys/linux/setup/image/README
diff --git a/neo/sys/linux/setup/image/bin/Linux/x86/doom3 b/neo/engine/sys/linux/setup/image/bin/Linux/x86/doom3
similarity index 100%
rename from neo/sys/linux/setup/image/bin/Linux/x86/doom3
rename to neo/engine/sys/linux/setup/image/bin/Linux/x86/doom3
diff --git a/neo/sys/linux/setup/image/bin/Linux/x86/doom3-dedicated b/neo/engine/sys/linux/setup/image/bin/Linux/x86/doom3-dedicated
similarity index 100%
rename from neo/sys/linux/setup/image/bin/Linux/x86/doom3-dedicated
rename to neo/engine/sys/linux/setup/image/bin/Linux/x86/doom3-dedicated
diff --git a/neo/sys/linux/setup/image/doom3.png b/neo/engine/sys/linux/setup/image/doom3.png
similarity index 100%
rename from neo/sys/linux/setup/image/doom3.png
rename to neo/engine/sys/linux/setup/image/doom3.png
diff --git a/neo/sys/linux/setup/image/openurl.sh b/neo/engine/sys/linux/setup/image/openurl.sh
similarity index 100%
rename from neo/sys/linux/setup/image/openurl.sh
rename to neo/engine/sys/linux/setup/image/openurl.sh
diff --git a/neo/sys/linux/setup/image/setup.data/postinstall.sh b/neo/engine/sys/linux/setup/image/setup.data/postinstall.sh
similarity index 100%
rename from neo/sys/linux/setup/image/setup.data/postinstall.sh
rename to neo/engine/sys/linux/setup/image/setup.data/postinstall.sh
diff --git a/neo/sys/linux/setup/image/setup.data/setup.xml.in b/neo/engine/sys/linux/setup/image/setup.data/setup.xml.in
similarity index 100%
rename from neo/sys/linux/setup/image/setup.data/setup.xml.in
rename to neo/engine/sys/linux/setup/image/setup.data/setup.xml.in
diff --git a/neo/sys/linux/setup/loki_setup.patch b/neo/engine/sys/linux/setup/loki_setup.patch
similarity index 100%
rename from neo/sys/linux/setup/loki_setup.patch
rename to neo/engine/sys/linux/setup/loki_setup.patch
diff --git a/neo/sys/linux/setup/lokisetup/loki_setup.tgz b/neo/engine/sys/linux/setup/lokisetup/loki_setup.tgz
similarity index 100%
rename from neo/sys/linux/setup/lokisetup/loki_setup.tgz
rename to neo/engine/sys/linux/setup/lokisetup/loki_setup.tgz
diff --git a/neo/sys/linux/setup/lokisetup/loki_setupdb.tgz b/neo/engine/sys/linux/setup/lokisetup/loki_setupdb.tgz
similarity index 100%
rename from neo/sys/linux/setup/lokisetup/loki_setupdb.tgz
rename to neo/engine/sys/linux/setup/lokisetup/loki_setupdb.tgz
diff --git a/neo/sys/linux/setup/lokisetup/xsu.diff b/neo/engine/sys/linux/setup/lokisetup/xsu.diff
similarity index 100%
rename from neo/sys/linux/setup/lokisetup/xsu.diff
rename to neo/engine/sys/linux/setup/lokisetup/xsu.diff
diff --git a/neo/sys/linux/setup/makeself/COPYING b/neo/engine/sys/linux/setup/makeself/COPYING
similarity index 100%
rename from neo/sys/linux/setup/makeself/COPYING
rename to neo/engine/sys/linux/setup/makeself/COPYING
diff --git a/neo/sys/linux/setup/makeself/README b/neo/engine/sys/linux/setup/makeself/README
similarity index 100%
rename from neo/sys/linux/setup/makeself/README
rename to neo/engine/sys/linux/setup/makeself/README
diff --git a/neo/sys/linux/setup/makeself/TODO b/neo/engine/sys/linux/setup/makeself/TODO
similarity index 100%
rename from neo/sys/linux/setup/makeself/TODO
rename to neo/engine/sys/linux/setup/makeself/TODO
diff --git a/neo/sys/linux/setup/makeself/makeself-header.sh b/neo/engine/sys/linux/setup/makeself/makeself-header.sh
similarity index 100%
rename from neo/sys/linux/setup/makeself/makeself-header.sh
rename to neo/engine/sys/linux/setup/makeself/makeself-header.sh
diff --git a/neo/sys/linux/setup/makeself/makeself.1 b/neo/engine/sys/linux/setup/makeself/makeself.1
similarity index 100%
rename from neo/sys/linux/setup/makeself/makeself.1
rename to neo/engine/sys/linux/setup/makeself/makeself.1
diff --git a/neo/sys/linux/setup/makeself/makeself.lsm b/neo/engine/sys/linux/setup/makeself/makeself.lsm
similarity index 100%
rename from neo/sys/linux/setup/makeself/makeself.lsm
rename to neo/engine/sys/linux/setup/makeself/makeself.lsm
diff --git a/neo/sys/linux/setup/makeself/makeself.sh b/neo/engine/sys/linux/setup/makeself/makeself.sh
similarity index 100%
rename from neo/sys/linux/setup/makeself/makeself.sh
rename to neo/engine/sys/linux/setup/makeself/makeself.sh
diff --git a/neo/sys/linux/setup/makeself/update-readme b/neo/engine/sys/linux/setup/makeself/update-readme
similarity index 100%
rename from neo/sys/linux/setup/makeself/update-readme
rename to neo/engine/sys/linux/setup/makeself/update-readme
diff --git a/neo/sys/linux/sound.cpp b/neo/engine/sys/linux/sound.cpp
similarity index 100%
rename from neo/sys/linux/sound.cpp
rename to neo/engine/sys/linux/sound.cpp
diff --git a/neo/sys/linux/sound.h b/neo/engine/sys/linux/sound.h
similarity index 100%
rename from neo/sys/linux/sound.h
rename to neo/engine/sys/linux/sound.h
diff --git a/neo/sys/linux/sound_alsa.cpp b/neo/engine/sys/linux/sound_alsa.cpp
similarity index 100%
rename from neo/sys/linux/sound_alsa.cpp
rename to neo/engine/sys/linux/sound_alsa.cpp
diff --git a/neo/sys/linux/stack.cpp b/neo/engine/sys/linux/stack.cpp
similarity index 100%
rename from neo/sys/linux/stack.cpp
rename to neo/engine/sys/linux/stack.cpp
diff --git a/neo/sys/linux/test_scheduler.c b/neo/engine/sys/linux/test_scheduler.c
similarity index 100%
rename from neo/sys/linux/test_scheduler.c
rename to neo/engine/sys/linux/test_scheduler.c
diff --git a/neo/sys/osx/DLL.OSX.txt b/neo/engine/sys/osx/DLL.OSX.txt
similarity index 100%
rename from neo/sys/osx/DLL.OSX.txt
rename to neo/engine/sys/osx/DLL.OSX.txt
diff --git a/neo/sys/osx/DOOMController.h b/neo/engine/sys/osx/DOOMController.h
similarity index 100%
rename from neo/sys/osx/DOOMController.h
rename to neo/engine/sys/osx/DOOMController.h
diff --git a/neo/sys/osx/DOOMController.mm b/neo/engine/sys/osx/DOOMController.mm
similarity index 100%
rename from neo/sys/osx/DOOMController.mm
rename to neo/engine/sys/osx/DOOMController.mm
diff --git a/neo/sys/osx/Doom 3.rsrc b/neo/engine/sys/osx/Doom 3.rsrc
similarity index 100%
rename from neo/sys/osx/Doom 3.rsrc
rename to neo/engine/sys/osx/Doom 3.rsrc
diff --git a/neo/sys/osx/Doom3.icns b/neo/engine/sys/osx/Doom3.icns
similarity index 100%
rename from neo/sys/osx/Doom3.icns
rename to neo/engine/sys/osx/Doom3.icns
diff --git a/neo/sys/osx/Doom3.xcodeproj/project.pbxproj b/neo/engine/sys/osx/Doom3.xcodeproj/project.pbxproj
similarity index 100%
rename from neo/sys/osx/Doom3.xcodeproj/project.pbxproj
rename to neo/engine/sys/osx/Doom3.xcodeproj/project.pbxproj
diff --git a/neo/sys/osx/English.lproj/ASLCore.nib/classes.nib b/neo/engine/sys/osx/English.lproj/ASLCore.nib/classes.nib
similarity index 100%
rename from neo/sys/osx/English.lproj/ASLCore.nib/classes.nib
rename to neo/engine/sys/osx/English.lproj/ASLCore.nib/classes.nib
diff --git a/neo/sys/osx/English.lproj/ASLCore.nib/info.nib b/neo/engine/sys/osx/English.lproj/ASLCore.nib/info.nib
similarity index 100%
rename from neo/sys/osx/English.lproj/ASLCore.nib/info.nib
rename to neo/engine/sys/osx/English.lproj/ASLCore.nib/info.nib
diff --git a/neo/sys/osx/English.lproj/ASLCore.nib/objects.xib b/neo/engine/sys/osx/English.lproj/ASLCore.nib/objects.xib
similarity index 100%
rename from neo/sys/osx/English.lproj/ASLCore.nib/objects.xib
rename to neo/engine/sys/osx/English.lproj/ASLCore.nib/objects.xib
diff --git a/neo/sys/osx/English.lproj/InfoPlist.strings b/neo/engine/sys/osx/English.lproj/InfoPlist.strings
similarity index 100%
rename from neo/sys/osx/English.lproj/InfoPlist.strings
rename to neo/engine/sys/osx/English.lproj/InfoPlist.strings
diff --git a/neo/sys/osx/English.lproj/Localizable.strings b/neo/engine/sys/osx/English.lproj/Localizable.strings
similarity index 100%
rename from neo/sys/osx/English.lproj/Localizable.strings
rename to neo/engine/sys/osx/English.lproj/Localizable.strings
diff --git a/neo/sys/osx/English.lproj/MainMenu.nib/classes.nib b/neo/engine/sys/osx/English.lproj/MainMenu.nib/classes.nib
similarity index 100%
rename from neo/sys/osx/English.lproj/MainMenu.nib/classes.nib
rename to neo/engine/sys/osx/English.lproj/MainMenu.nib/classes.nib
diff --git a/neo/sys/osx/English.lproj/MainMenu.nib/info.nib b/neo/engine/sys/osx/English.lproj/MainMenu.nib/info.nib
similarity index 100%
rename from neo/sys/osx/English.lproj/MainMenu.nib/info.nib
rename to neo/engine/sys/osx/English.lproj/MainMenu.nib/info.nib
diff --git a/neo/sys/osx/English.lproj/MainMenu.nib/objects.nib b/neo/engine/sys/osx/English.lproj/MainMenu.nib/objects.nib
similarity index 100%
rename from neo/sys/osx/English.lproj/MainMenu.nib/objects.nib
rename to neo/engine/sys/osx/English.lproj/MainMenu.nib/objects.nib
diff --git a/neo/sys/osx/English.lproj/locversion.plist b/neo/engine/sys/osx/English.lproj/locversion.plist
similarity index 100%
rename from neo/sys/osx/English.lproj/locversion.plist
rename to neo/engine/sys/osx/English.lproj/locversion.plist
diff --git a/neo/sys/osx/French.lproj/ASLCore.nib/classes.nib b/neo/engine/sys/osx/French.lproj/ASLCore.nib/classes.nib
similarity index 100%
rename from neo/sys/osx/French.lproj/ASLCore.nib/classes.nib
rename to neo/engine/sys/osx/French.lproj/ASLCore.nib/classes.nib
diff --git a/neo/sys/osx/French.lproj/ASLCore.nib/info.nib b/neo/engine/sys/osx/French.lproj/ASLCore.nib/info.nib
similarity index 100%
rename from neo/sys/osx/French.lproj/ASLCore.nib/info.nib
rename to neo/engine/sys/osx/French.lproj/ASLCore.nib/info.nib
diff --git a/neo/sys/osx/French.lproj/ASLCore.nib/objects.xib b/neo/engine/sys/osx/French.lproj/ASLCore.nib/objects.xib
similarity index 100%
rename from neo/sys/osx/French.lproj/ASLCore.nib/objects.xib
rename to neo/engine/sys/osx/French.lproj/ASLCore.nib/objects.xib
diff --git a/neo/sys/osx/French.lproj/InfoPlist.strings b/neo/engine/sys/osx/French.lproj/InfoPlist.strings
similarity index 100%
rename from neo/sys/osx/French.lproj/InfoPlist.strings
rename to neo/engine/sys/osx/French.lproj/InfoPlist.strings
diff --git a/neo/sys/osx/French.lproj/Localizable.strings b/neo/engine/sys/osx/French.lproj/Localizable.strings
similarity index 100%
rename from neo/sys/osx/French.lproj/Localizable.strings
rename to neo/engine/sys/osx/French.lproj/Localizable.strings
diff --git a/neo/sys/osx/French.lproj/MainMenu.nib/classes.nib b/neo/engine/sys/osx/French.lproj/MainMenu.nib/classes.nib
similarity index 100%
rename from neo/sys/osx/French.lproj/MainMenu.nib/classes.nib
rename to neo/engine/sys/osx/French.lproj/MainMenu.nib/classes.nib
diff --git a/neo/sys/osx/French.lproj/MainMenu.nib/info.nib b/neo/engine/sys/osx/French.lproj/MainMenu.nib/info.nib
similarity index 100%
rename from neo/sys/osx/French.lproj/MainMenu.nib/info.nib
rename to neo/engine/sys/osx/French.lproj/MainMenu.nib/info.nib
diff --git a/neo/sys/osx/French.lproj/MainMenu.nib/objects.nib b/neo/engine/sys/osx/French.lproj/MainMenu.nib/objects.nib
similarity index 100%
rename from neo/sys/osx/French.lproj/MainMenu.nib/objects.nib
rename to neo/engine/sys/osx/French.lproj/MainMenu.nib/objects.nib
diff --git a/neo/sys/osx/Info.plist b/neo/engine/sys/osx/Info.plist
similarity index 100%
rename from neo/sys/osx/Info.plist
rename to neo/engine/sys/osx/Info.plist
diff --git a/neo/sys/osx/PickMonitor.cpp b/neo/engine/sys/osx/PickMonitor.cpp
similarity index 100%
rename from neo/sys/osx/PickMonitor.cpp
rename to neo/engine/sys/osx/PickMonitor.cpp
diff --git a/neo/sys/osx/PickMonitor.h b/neo/engine/sys/osx/PickMonitor.h
similarity index 100%
rename from neo/sys/osx/PickMonitor.h
rename to neo/engine/sys/osx/PickMonitor.h
diff --git a/neo/sys/osx/PreferencesDialog.cpp b/neo/engine/sys/osx/PreferencesDialog.cpp
similarity index 100%
rename from neo/sys/osx/PreferencesDialog.cpp
rename to neo/engine/sys/osx/PreferencesDialog.cpp
diff --git a/neo/sys/osx/PreferencesDialog.h b/neo/engine/sys/osx/PreferencesDialog.h
similarity index 100%
rename from neo/sys/osx/PreferencesDialog.h
rename to neo/engine/sys/osx/PreferencesDialog.h
diff --git a/neo/sys/osx/SubProjects/curl.xcodeproj/project.pbxproj b/neo/engine/sys/osx/SubProjects/curl.xcodeproj/project.pbxproj
similarity index 100%
rename from neo/sys/osx/SubProjects/curl.xcodeproj/project.pbxproj
rename to neo/engine/sys/osx/SubProjects/curl.xcodeproj/project.pbxproj
diff --git a/neo/sys/osx/d3xp.xcodeproj/project.pbxproj b/neo/engine/sys/osx/d3xp.xcodeproj/project.pbxproj
similarity index 100%
rename from neo/sys/osx/d3xp.xcodeproj/project.pbxproj
rename to neo/engine/sys/osx/d3xp.xcodeproj/project.pbxproj
diff --git a/neo/sys/osx/game.xcodeproj/project.pbxproj b/neo/engine/sys/osx/game.xcodeproj/project.pbxproj
similarity index 100%
rename from neo/sys/osx/game.xcodeproj/project.pbxproj
rename to neo/engine/sys/osx/game.xcodeproj/project.pbxproj
diff --git a/neo/sys/osx/idlib.xcodeproj/project.pbxproj b/neo/engine/sys/osx/idlib.xcodeproj/project.pbxproj
similarity index 100%
rename from neo/sys/osx/idlib.xcodeproj/project.pbxproj
rename to neo/engine/sys/osx/idlib.xcodeproj/project.pbxproj
diff --git a/neo/sys/osx/macosx_common.h b/neo/engine/sys/osx/macosx_common.h
similarity index 100%
rename from neo/sys/osx/macosx_common.h
rename to neo/engine/sys/osx/macosx_common.h
diff --git a/neo/sys/osx/macosx_display.h b/neo/engine/sys/osx/macosx_display.h
similarity index 100%
rename from neo/sys/osx/macosx_display.h
rename to neo/engine/sys/osx/macosx_display.h
diff --git a/neo/sys/osx/macosx_event.mm b/neo/engine/sys/osx/macosx_event.mm
similarity index 100%
rename from neo/sys/osx/macosx_event.mm
rename to neo/engine/sys/osx/macosx_event.mm
diff --git a/neo/sys/osx/macosx_glimp.h b/neo/engine/sys/osx/macosx_glimp.h
similarity index 100%
rename from neo/sys/osx/macosx_glimp.h
rename to neo/engine/sys/osx/macosx_glimp.h
diff --git a/neo/sys/osx/macosx_glimp.mm b/neo/engine/sys/osx/macosx_glimp.mm
similarity index 100%
rename from neo/sys/osx/macosx_glimp.mm
rename to neo/engine/sys/osx/macosx_glimp.mm
diff --git a/neo/sys/osx/macosx_guids.cpp b/neo/engine/sys/osx/macosx_guids.cpp
similarity index 100%
rename from neo/sys/osx/macosx_guids.cpp
rename to neo/engine/sys/osx/macosx_guids.cpp
diff --git a/neo/sys/osx/macosx_local.h b/neo/engine/sys/osx/macosx_local.h
similarity index 100%
rename from neo/sys/osx/macosx_local.h
rename to neo/engine/sys/osx/macosx_local.h
diff --git a/neo/sys/osx/macosx_misc.mm b/neo/engine/sys/osx/macosx_misc.mm
similarity index 100%
rename from neo/sys/osx/macosx_misc.mm
rename to neo/engine/sys/osx/macosx_misc.mm
diff --git a/neo/sys/osx/macosx_sound.cpp b/neo/engine/sys/osx/macosx_sound.cpp
similarity index 100%
rename from neo/sys/osx/macosx_sound.cpp
rename to neo/engine/sys/osx/macosx_sound.cpp
diff --git a/neo/sys/osx/macosx_sys.h b/neo/engine/sys/osx/macosx_sys.h
similarity index 100%
rename from neo/sys/osx/macosx_sys.h
rename to neo/engine/sys/osx/macosx_sys.h
diff --git a/neo/sys/osx/macosx_sys.mm b/neo/engine/sys/osx/macosx_sys.mm
similarity index 100%
rename from neo/sys/osx/macosx_sys.mm
rename to neo/engine/sys/osx/macosx_sys.mm
diff --git a/neo/sys/osx/macosx_timers.h b/neo/engine/sys/osx/macosx_timers.h
similarity index 100%
rename from neo/sys/osx/macosx_timers.h
rename to neo/engine/sys/osx/macosx_timers.h
diff --git a/neo/sys/osx/macosx_utils.mm b/neo/engine/sys/osx/macosx_utils.mm
similarity index 100%
rename from neo/sys/osx/macosx_utils.mm
rename to neo/engine/sys/osx/macosx_utils.mm
diff --git a/neo/sys/osx/misc/ftoi.patch b/neo/engine/sys/osx/misc/ftoi.patch
similarity index 100%
rename from neo/sys/osx/misc/ftoi.patch
rename to neo/engine/sys/osx/misc/ftoi.patch
diff --git a/neo/sys/osx/oggVorbis.xcodeproj/project.pbxproj b/neo/engine/sys/osx/oggVorbis.xcodeproj/project.pbxproj
similarity index 100%
rename from neo/sys/osx/oggVorbis.xcodeproj/project.pbxproj
rename to neo/engine/sys/osx/oggVorbis.xcodeproj/project.pbxproj
diff --git a/neo/sys/osx/showcursor b/neo/engine/sys/osx/showcursor
similarity index 100%
rename from neo/sys/osx/showcursor
rename to neo/engine/sys/osx/showcursor
diff --git a/neo/sys/osx/showcursor.c b/neo/engine/sys/osx/showcursor.c
similarity index 100%
rename from neo/sys/osx/showcursor.c
rename to neo/engine/sys/osx/showcursor.c
diff --git a/neo/sys/osx/version.plist b/neo/engine/sys/osx/version.plist
similarity index 100%
rename from neo/sys/osx/version.plist
rename to neo/engine/sys/osx/version.plist
diff --git a/neo/sys/posix/posix_input.cpp b/neo/engine/sys/posix/posix_input.cpp
similarity index 100%
rename from neo/sys/posix/posix_input.cpp
rename to neo/engine/sys/posix/posix_input.cpp
diff --git a/neo/sys/posix/posix_main.cpp b/neo/engine/sys/posix/posix_main.cpp
similarity index 100%
rename from neo/sys/posix/posix_main.cpp
rename to neo/engine/sys/posix/posix_main.cpp
diff --git a/neo/sys/posix/posix_net.cpp b/neo/engine/sys/posix/posix_net.cpp
similarity index 100%
rename from neo/sys/posix/posix_net.cpp
rename to neo/engine/sys/posix/posix_net.cpp
diff --git a/neo/sys/posix/posix_public.h b/neo/engine/sys/posix/posix_public.h
similarity index 100%
rename from neo/sys/posix/posix_public.h
rename to neo/engine/sys/posix/posix_public.h
diff --git a/neo/sys/posix/posix_signal.cpp b/neo/engine/sys/posix/posix_signal.cpp
similarity index 100%
rename from neo/sys/posix/posix_signal.cpp
rename to neo/engine/sys/posix/posix_signal.cpp
diff --git a/neo/sys/posix/posix_threads.cpp b/neo/engine/sys/posix/posix_threads.cpp
similarity index 100%
rename from neo/sys/posix/posix_threads.cpp
rename to neo/engine/sys/posix/posix_threads.cpp
diff --git a/neo/sys/scons/SConscript.core b/neo/engine/sys/scons/SConscript.core
similarity index 100%
rename from neo/sys/scons/SConscript.core
rename to neo/engine/sys/scons/SConscript.core
diff --git a/neo/sys/scons/SConscript.curl b/neo/engine/sys/scons/SConscript.curl
similarity index 100%
rename from neo/sys/scons/SConscript.curl
rename to neo/engine/sys/scons/SConscript.curl
diff --git a/neo/sys/scons/SConscript.game b/neo/engine/sys/scons/SConscript.game
similarity index 100%
rename from neo/sys/scons/SConscript.game
rename to neo/engine/sys/scons/SConscript.game
diff --git a/neo/sys/scons/SConscript.gl b/neo/engine/sys/scons/SConscript.gl
similarity index 100%
rename from neo/sys/scons/SConscript.gl
rename to neo/engine/sys/scons/SConscript.gl
diff --git a/neo/sys/scons/SConscript.idlib b/neo/engine/sys/scons/SConscript.idlib
similarity index 100%
rename from neo/sys/scons/SConscript.idlib
rename to neo/engine/sys/scons/SConscript.idlib
diff --git a/neo/sys/scons/SDK.py b/neo/engine/sys/scons/SDK.py
similarity index 100%
rename from neo/sys/scons/SDK.py
rename to neo/engine/sys/scons/SDK.py
diff --git a/neo/sys/scons/Setup.py b/neo/engine/sys/scons/Setup.py
similarity index 100%
rename from neo/sys/scons/Setup.py
rename to neo/engine/sys/scons/Setup.py
diff --git a/neo/sys/scons/scons_utils.py b/neo/engine/sys/scons/scons_utils.py
similarity index 100%
rename from neo/sys/scons/scons_utils.py
rename to neo/engine/sys/scons/scons_utils.py
diff --git a/neo/sys/stub/stub_gl.cpp b/neo/engine/sys/stub/stub_gl.cpp
similarity index 100%
rename from neo/sys/stub/stub_gl.cpp
rename to neo/engine/sys/stub/stub_gl.cpp
diff --git a/neo/sys/stub/sys_stub.cpp b/neo/engine/sys/stub/sys_stub.cpp
similarity index 100%
rename from neo/sys/stub/sys_stub.cpp
rename to neo/engine/sys/stub/sys_stub.cpp
diff --git a/neo/sys/stub/util_stub.cpp b/neo/engine/sys/stub/util_stub.cpp
similarity index 100%
rename from neo/sys/stub/util_stub.cpp
rename to neo/engine/sys/stub/util_stub.cpp
diff --git a/neo/sys/sys_local.cpp b/neo/engine/sys/sys_local.cpp
similarity index 100%
rename from neo/sys/sys_local.cpp
rename to neo/engine/sys/sys_local.cpp
diff --git a/neo/sys/sys_local.h b/neo/engine/sys/sys_local.h
similarity index 100%
rename from neo/sys/sys_local.h
rename to neo/engine/sys/sys_local.h
diff --git a/neo/sys/sys_public.h b/neo/engine/sys/sys_public.h
similarity index 100%
rename from neo/sys/sys_public.h
rename to neo/engine/sys/sys_public.h
diff --git a/neo/sys/win32/eax.h b/neo/engine/sys/win32/eax.h
similarity index 100%
rename from neo/sys/win32/eax.h
rename to neo/engine/sys/win32/eax.h
diff --git a/neo/sys/win32/eaxguid.lib b/neo/engine/sys/win32/eaxguid.lib
similarity index 100%
rename from neo/sys/win32/eaxguid.lib
rename to neo/engine/sys/win32/eaxguid.lib
diff --git a/neo/sys/win32/gl_logfuncs.cpp b/neo/engine/sys/win32/gl_logfuncs.cpp
similarity index 100%
rename from neo/sys/win32/gl_logfuncs.cpp
rename to neo/engine/sys/win32/gl_logfuncs.cpp
diff --git a/neo/sys/win32/rc/AFEditor.rc b/neo/engine/sys/win32/rc/AFEditor.rc
similarity index 100%
rename from neo/sys/win32/rc/AFEditor.rc
rename to neo/engine/sys/win32/rc/AFEditor.rc
diff --git a/neo/sys/win32/rc/AFEditor_resource.h b/neo/engine/sys/win32/rc/AFEditor_resource.h
similarity index 100%
rename from neo/sys/win32/rc/AFEditor_resource.h
rename to neo/engine/sys/win32/rc/AFEditor_resource.h
diff --git a/neo/sys/win32/rc/Common.rc b/neo/engine/sys/win32/rc/Common.rc
similarity index 100%
rename from neo/sys/win32/rc/Common.rc
rename to neo/engine/sys/win32/rc/Common.rc
diff --git a/neo/sys/win32/rc/Common_resource.h b/neo/engine/sys/win32/rc/Common_resource.h
similarity index 100%
rename from neo/sys/win32/rc/Common_resource.h
rename to neo/engine/sys/win32/rc/Common_resource.h
diff --git a/neo/sys/win32/rc/CreateResourceIDs.cpp b/neo/engine/sys/win32/rc/CreateResourceIDs.cpp
similarity index 100%
rename from neo/sys/win32/rc/CreateResourceIDs.cpp
rename to neo/engine/sys/win32/rc/CreateResourceIDs.cpp
diff --git a/neo/sys/win32/rc/CreateResourceIDs.h b/neo/engine/sys/win32/rc/CreateResourceIDs.h
similarity index 100%
rename from neo/sys/win32/rc/CreateResourceIDs.h
rename to neo/engine/sys/win32/rc/CreateResourceIDs.h
diff --git a/neo/sys/win32/rc/Debugger.rc b/neo/engine/sys/win32/rc/Debugger.rc
similarity index 100%
rename from neo/sys/win32/rc/Debugger.rc
rename to neo/engine/sys/win32/rc/Debugger.rc
diff --git a/neo/sys/win32/rc/Debugger_resource.h b/neo/engine/sys/win32/rc/Debugger_resource.h
similarity index 100%
rename from neo/sys/win32/rc/Debugger_resource.h
rename to neo/engine/sys/win32/rc/Debugger_resource.h
diff --git a/neo/sys/win32/rc/DeclEditor.rc b/neo/engine/sys/win32/rc/DeclEditor.rc
similarity index 100%
rename from neo/sys/win32/rc/DeclEditor.rc
rename to neo/engine/sys/win32/rc/DeclEditor.rc
diff --git a/neo/sys/win32/rc/DeclEditor_resource.h b/neo/engine/sys/win32/rc/DeclEditor_resource.h
similarity index 100%
rename from neo/sys/win32/rc/DeclEditor_resource.h
rename to neo/engine/sys/win32/rc/DeclEditor_resource.h
diff --git a/neo/sys/win32/rc/GuiEd.rc b/neo/engine/sys/win32/rc/GuiEd.rc
similarity index 100%
rename from neo/sys/win32/rc/GuiEd.rc
rename to neo/engine/sys/win32/rc/GuiEd.rc
diff --git a/neo/sys/win32/rc/GuiEd_resource.h b/neo/engine/sys/win32/rc/GuiEd_resource.h
similarity index 100%
rename from neo/sys/win32/rc/GuiEd_resource.h
rename to neo/engine/sys/win32/rc/GuiEd_resource.h
diff --git a/neo/sys/win32/rc/MaterialEditor.rc b/neo/engine/sys/win32/rc/MaterialEditor.rc
similarity index 100%
rename from neo/sys/win32/rc/MaterialEditor.rc
rename to neo/engine/sys/win32/rc/MaterialEditor.rc
diff --git a/neo/sys/win32/rc/MaterialEditor_Resource.h b/neo/engine/sys/win32/rc/MaterialEditor_Resource.h
similarity index 100%
rename from neo/sys/win32/rc/MaterialEditor_Resource.h
rename to neo/engine/sys/win32/rc/MaterialEditor_Resource.h
diff --git a/neo/sys/win32/rc/PDAEditor.rc b/neo/engine/sys/win32/rc/PDAEditor.rc
similarity index 100%
rename from neo/sys/win32/rc/PDAEditor.rc
rename to neo/engine/sys/win32/rc/PDAEditor.rc
diff --git a/neo/sys/win32/rc/PDAEditor_resource.h b/neo/engine/sys/win32/rc/PDAEditor_resource.h
similarity index 100%
rename from neo/sys/win32/rc/PDAEditor_resource.h
rename to neo/engine/sys/win32/rc/PDAEditor_resource.h
diff --git a/neo/sys/win32/rc/ParticleEditor.rc b/neo/engine/sys/win32/rc/ParticleEditor.rc
similarity index 100%
rename from neo/sys/win32/rc/ParticleEditor.rc
rename to neo/engine/sys/win32/rc/ParticleEditor.rc
diff --git a/neo/sys/win32/rc/ParticleEditor_resource.h b/neo/engine/sys/win32/rc/ParticleEditor_resource.h
similarity index 100%
rename from neo/sys/win32/rc/ParticleEditor_resource.h
rename to neo/engine/sys/win32/rc/ParticleEditor_resource.h
diff --git a/neo/sys/win32/rc/PropTree.rc b/neo/engine/sys/win32/rc/PropTree.rc
similarity index 100%
rename from neo/sys/win32/rc/PropTree.rc
rename to neo/engine/sys/win32/rc/PropTree.rc
diff --git a/neo/sys/win32/rc/PropTree_resource.h b/neo/engine/sys/win32/rc/PropTree_resource.h
similarity index 100%
rename from neo/sys/win32/rc/PropTree_resource.h
rename to neo/engine/sys/win32/rc/PropTree_resource.h
diff --git a/neo/sys/win32/rc/Radiant.rc b/neo/engine/sys/win32/rc/Radiant.rc
similarity index 100%
rename from neo/sys/win32/rc/Radiant.rc
rename to neo/engine/sys/win32/rc/Radiant.rc
diff --git a/neo/sys/win32/rc/Radiant_resource.h b/neo/engine/sys/win32/rc/Radiant_resource.h
similarity index 100%
rename from neo/sys/win32/rc/Radiant_resource.h
rename to neo/engine/sys/win32/rc/Radiant_resource.h
diff --git a/neo/sys/win32/rc/ScriptEditor.rc b/neo/engine/sys/win32/rc/ScriptEditor.rc
similarity index 100%
rename from neo/sys/win32/rc/ScriptEditor.rc
rename to neo/engine/sys/win32/rc/ScriptEditor.rc
diff --git a/neo/sys/win32/rc/ScriptEditor_resource.h b/neo/engine/sys/win32/rc/ScriptEditor_resource.h
similarity index 100%
rename from neo/sys/win32/rc/ScriptEditor_resource.h
rename to neo/engine/sys/win32/rc/ScriptEditor_resource.h
diff --git a/neo/sys/win32/rc/SoundEditor.rc b/neo/engine/sys/win32/rc/SoundEditor.rc
similarity index 100%
rename from neo/sys/win32/rc/SoundEditor.rc
rename to neo/engine/sys/win32/rc/SoundEditor.rc
diff --git a/neo/sys/win32/rc/SoundEditor_resource.h b/neo/engine/sys/win32/rc/SoundEditor_resource.h
similarity index 100%
rename from neo/sys/win32/rc/SoundEditor_resource.h
rename to neo/engine/sys/win32/rc/SoundEditor_resource.h
diff --git a/neo/sys/win32/rc/doom.rc b/neo/engine/sys/win32/rc/doom.rc
similarity index 100%
rename from neo/sys/win32/rc/doom.rc
rename to neo/engine/sys/win32/rc/doom.rc
diff --git a/neo/sys/win32/rc/doom_resource.h b/neo/engine/sys/win32/rc/doom_resource.h
similarity index 100%
rename from neo/sys/win32/rc/doom_resource.h
rename to neo/engine/sys/win32/rc/doom_resource.h
diff --git a/neo/sys/win32/rc/res/BEVEL.BMP b/neo/engine/sys/win32/rc/res/BEVEL.BMP
similarity index 100%
rename from neo/sys/win32/rc/res/BEVEL.BMP
rename to neo/engine/sys/win32/rc/res/BEVEL.BMP
diff --git a/neo/sys/win32/rc/res/BITMAP2.BMP b/neo/engine/sys/win32/rc/res/BITMAP2.BMP
similarity index 100%
rename from neo/sys/win32/rc/res/BITMAP2.BMP
rename to neo/engine/sys/win32/rc/res/BITMAP2.BMP
diff --git a/neo/sys/win32/rc/res/BMP00001.BMP b/neo/engine/sys/win32/rc/res/BMP00001.BMP
similarity index 100%
rename from neo/sys/win32/rc/res/BMP00001.BMP
rename to neo/engine/sys/win32/rc/res/BMP00001.BMP
diff --git a/neo/sys/win32/rc/res/BMP0002.BMP b/neo/engine/sys/win32/rc/res/BMP0002.BMP
similarity index 100%
rename from neo/sys/win32/rc/res/BMP0002.BMP
rename to neo/engine/sys/win32/rc/res/BMP0002.BMP
diff --git a/neo/sys/win32/rc/res/DEFTEX.WAL b/neo/engine/sys/win32/rc/res/DEFTEX.WAL
similarity index 100%
rename from neo/sys/win32/rc/res/DEFTEX.WAL
rename to neo/engine/sys/win32/rc/res/DEFTEX.WAL
diff --git a/neo/sys/win32/rc/res/ENDCAP.BMP b/neo/engine/sys/win32/rc/res/ENDCAP.BMP
similarity index 100%
rename from neo/sys/win32/rc/res/ENDCAP.BMP
rename to neo/engine/sys/win32/rc/res/ENDCAP.BMP
diff --git a/neo/sys/win32/rc/res/GetString.htm b/neo/engine/sys/win32/rc/res/GetString.htm
similarity index 100%
rename from neo/sys/win32/rc/res/GetString.htm
rename to neo/engine/sys/win32/rc/res/GetString.htm
diff --git a/neo/sys/win32/rc/res/IBEVEL.BMP b/neo/engine/sys/win32/rc/res/IBEVEL.BMP
similarity index 100%
rename from neo/sys/win32/rc/res/IBEVEL.BMP
rename to neo/engine/sys/win32/rc/res/IBEVEL.BMP
diff --git a/neo/sys/win32/rc/res/IENDCAP.BMP b/neo/engine/sys/win32/rc/res/IENDCAP.BMP
similarity index 100%
rename from neo/sys/win32/rc/res/IENDCAP.BMP
rename to neo/engine/sys/win32/rc/res/IENDCAP.BMP
diff --git a/neo/sys/win32/rc/res/MEFileToolbar.bmp b/neo/engine/sys/win32/rc/res/MEFileToolbar.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/MEFileToolbar.bmp
rename to neo/engine/sys/win32/rc/res/MEFileToolbar.bmp
diff --git a/neo/sys/win32/rc/res/MEtoolbar.bmp b/neo/engine/sys/win32/rc/res/MEtoolbar.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/MEtoolbar.bmp
rename to neo/engine/sys/win32/rc/res/MEtoolbar.bmp
diff --git a/neo/sys/win32/rc/res/MaterialEditor.ico b/neo/engine/sys/win32/rc/res/MaterialEditor.ico
similarity index 100%
rename from neo/sys/win32/rc/res/MaterialEditor.ico
rename to neo/engine/sys/win32/rc/res/MaterialEditor.ico
diff --git a/neo/sys/win32/rc/res/PropTree.rc2 b/neo/engine/sys/win32/rc/res/PropTree.rc2
similarity index 100%
rename from neo/sys/win32/rc/res/PropTree.rc2
rename to neo/engine/sys/win32/rc/res/PropTree.rc2
diff --git a/neo/sys/win32/rc/res/Q.BMP b/neo/engine/sys/win32/rc/res/Q.BMP
similarity index 100%
rename from neo/sys/win32/rc/res/Q.BMP
rename to neo/engine/sys/win32/rc/res/Q.BMP
diff --git a/neo/sys/win32/rc/res/RADIANT3.GIF b/neo/engine/sys/win32/rc/res/RADIANT3.GIF
similarity index 100%
rename from neo/sys/win32/rc/res/RADIANT3.GIF
rename to neo/engine/sys/win32/rc/res/RADIANT3.GIF
diff --git a/neo/sys/win32/rc/res/Radiant.ico b/neo/engine/sys/win32/rc/res/Radiant.ico
similarity index 100%
rename from neo/sys/win32/rc/res/Radiant.ico
rename to neo/engine/sys/win32/rc/res/Radiant.ico
diff --git a/neo/sys/win32/rc/res/RadiantDoc.ico b/neo/engine/sys/win32/rc/res/RadiantDoc.ico
similarity index 100%
rename from neo/sys/win32/rc/res/RadiantDoc.ico
rename to neo/engine/sys/win32/rc/res/RadiantDoc.ico
diff --git a/neo/sys/win32/rc/res/TOOLBAR1.BMP b/neo/engine/sys/win32/rc/res/TOOLBAR1.BMP
similarity index 100%
rename from neo/sys/win32/rc/res/TOOLBAR1.BMP
rename to neo/engine/sys/win32/rc/res/TOOLBAR1.BMP
diff --git a/neo/sys/win32/rc/res/TOOLBAR2.BMP b/neo/engine/sys/win32/rc/res/TOOLBAR2.BMP
similarity index 100%
rename from neo/sys/win32/rc/res/TOOLBAR2.BMP
rename to neo/engine/sys/win32/rc/res/TOOLBAR2.BMP
diff --git a/neo/sys/win32/rc/res/Toolbar.bmp b/neo/engine/sys/win32/rc/res/Toolbar.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/Toolbar.bmp
rename to neo/engine/sys/win32/rc/res/Toolbar.bmp
diff --git a/neo/sys/win32/rc/res/VIEWDEFA.BMP b/neo/engine/sys/win32/rc/res/VIEWDEFA.BMP
similarity index 100%
rename from neo/sys/win32/rc/res/VIEWDEFA.BMP
rename to neo/engine/sys/win32/rc/res/VIEWDEFA.BMP
diff --git a/neo/sys/win32/rc/res/VIEWOPPO.BMP b/neo/engine/sys/win32/rc/res/VIEWOPPO.BMP
similarity index 100%
rename from neo/sys/win32/rc/res/VIEWOPPO.BMP
rename to neo/engine/sys/win32/rc/res/VIEWOPPO.BMP
diff --git a/neo/sys/win32/rc/res/bmp00002.bmp b/neo/engine/sys/win32/rc/res/bmp00002.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/bmp00002.bmp
rename to neo/engine/sys/win32/rc/res/bmp00002.bmp
diff --git a/neo/sys/win32/rc/res/bmp00003.bmp b/neo/engine/sys/win32/rc/res/bmp00003.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/bmp00003.bmp
rename to neo/engine/sys/win32/rc/res/bmp00003.bmp
diff --git a/neo/sys/win32/rc/res/bmp00004.bmp b/neo/engine/sys/win32/rc/res/bmp00004.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/bmp00004.bmp
rename to neo/engine/sys/win32/rc/res/bmp00004.bmp
diff --git a/neo/sys/win32/rc/res/bmp00005.bmp b/neo/engine/sys/win32/rc/res/bmp00005.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/bmp00005.bmp
rename to neo/engine/sys/win32/rc/res/bmp00005.bmp
diff --git a/neo/sys/win32/rc/res/cchsb.bmp b/neo/engine/sys/win32/rc/res/cchsb.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/cchsb.bmp
rename to neo/engine/sys/win32/rc/res/cchsb.bmp
diff --git a/neo/sys/win32/rc/res/ccrgb.bmp b/neo/engine/sys/win32/rc/res/ccrgb.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/ccrgb.bmp
rename to neo/engine/sys/win32/rc/res/ccrgb.bmp
diff --git a/neo/sys/win32/rc/res/dbg_back.bmp b/neo/engine/sys/win32/rc/res/dbg_back.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/dbg_back.bmp
rename to neo/engine/sys/win32/rc/res/dbg_back.bmp
diff --git a/neo/sys/win32/rc/res/dbg_breakpoint.ico b/neo/engine/sys/win32/rc/res/dbg_breakpoint.ico
similarity index 100%
rename from neo/sys/win32/rc/res/dbg_breakpoint.ico
rename to neo/engine/sys/win32/rc/res/dbg_breakpoint.ico
diff --git a/neo/sys/win32/rc/res/dbg_current.ico b/neo/engine/sys/win32/rc/res/dbg_current.ico
similarity index 100%
rename from neo/sys/win32/rc/res/dbg_current.ico
rename to neo/engine/sys/win32/rc/res/dbg_current.ico
diff --git a/neo/sys/win32/rc/res/dbg_currentline.ico b/neo/engine/sys/win32/rc/res/dbg_currentline.ico
similarity index 100%
rename from neo/sys/win32/rc/res/dbg_currentline.ico
rename to neo/engine/sys/win32/rc/res/dbg_currentline.ico
diff --git a/neo/sys/win32/rc/res/dbg_empty.ico b/neo/engine/sys/win32/rc/res/dbg_empty.ico
similarity index 100%
rename from neo/sys/win32/rc/res/dbg_empty.ico
rename to neo/engine/sys/win32/rc/res/dbg_empty.ico
diff --git a/neo/sys/win32/rc/res/dbg_open.bmp b/neo/engine/sys/win32/rc/res/dbg_open.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/dbg_open.bmp
rename to neo/engine/sys/win32/rc/res/dbg_open.bmp
diff --git a/neo/sys/win32/rc/res/dbg_toolbar.bmp b/neo/engine/sys/win32/rc/res/dbg_toolbar.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/dbg_toolbar.bmp
rename to neo/engine/sys/win32/rc/res/dbg_toolbar.bmp
diff --git a/neo/sys/win32/rc/res/doom.ico b/neo/engine/sys/win32/rc/res/doom.ico
similarity index 100%
rename from neo/sys/win32/rc/res/doom.ico
rename to neo/engine/sys/win32/rc/res/doom.ico
diff --git a/neo/sys/win32/rc/res/fpoint.cur b/neo/engine/sys/win32/rc/res/fpoint.cur
similarity index 100%
rename from neo/sys/win32/rc/res/fpoint.cur
rename to neo/engine/sys/win32/rc/res/fpoint.cur
diff --git a/neo/sys/win32/rc/res/fxed_link.ico b/neo/engine/sys/win32/rc/res/fxed_link.ico
similarity index 100%
rename from neo/sys/win32/rc/res/fxed_link.ico
rename to neo/engine/sys/win32/rc/res/fxed_link.ico
diff --git a/neo/sys/win32/rc/res/fxed_toolbar.bmp b/neo/engine/sys/win32/rc/res/fxed_toolbar.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/fxed_toolbar.bmp
rename to neo/engine/sys/win32/rc/res/fxed_toolbar.bmp
diff --git a/neo/sys/win32/rc/res/fxeditor.ico b/neo/engine/sys/win32/rc/res/fxeditor.ico
similarity index 100%
rename from neo/sys/win32/rc/res/fxeditor.ico
rename to neo/engine/sys/win32/rc/res/fxeditor.ico
diff --git a/neo/sys/win32/rc/res/guied.ico b/neo/engine/sys/win32/rc/res/guied.ico
similarity index 100%
rename from neo/sys/win32/rc/res/guied.ico
rename to neo/engine/sys/win32/rc/res/guied.ico
diff --git a/neo/sys/win32/rc/res/guied_collapse.ico b/neo/engine/sys/win32/rc/res/guied_collapse.ico
similarity index 100%
rename from neo/sys/win32/rc/res/guied_collapse.ico
rename to neo/engine/sys/win32/rc/res/guied_collapse.ico
diff --git a/neo/sys/win32/rc/res/guied_expand.ico b/neo/engine/sys/win32/rc/res/guied_expand.ico
similarity index 100%
rename from neo/sys/win32/rc/res/guied_expand.ico
rename to neo/engine/sys/win32/rc/res/guied_expand.ico
diff --git a/neo/sys/win32/rc/res/guied_hand.cur b/neo/engine/sys/win32/rc/res/guied_hand.cur
similarity index 100%
rename from neo/sys/win32/rc/res/guied_hand.cur
rename to neo/engine/sys/win32/rc/res/guied_hand.cur
diff --git a/neo/sys/win32/rc/res/guied_nav_visible.ico b/neo/engine/sys/win32/rc/res/guied_nav_visible.ico
similarity index 100%
rename from neo/sys/win32/rc/res/guied_nav_visible.ico
rename to neo/engine/sys/win32/rc/res/guied_nav_visible.ico
diff --git a/neo/sys/win32/rc/res/guied_nav_visibledisabled.ico b/neo/engine/sys/win32/rc/res/guied_nav_visibledisabled.ico
similarity index 100%
rename from neo/sys/win32/rc/res/guied_nav_visibledisabled.ico
rename to neo/engine/sys/win32/rc/res/guied_nav_visibledisabled.ico
diff --git a/neo/sys/win32/rc/res/guied_scripts.ico b/neo/engine/sys/win32/rc/res/guied_scripts.ico
similarity index 100%
rename from neo/sys/win32/rc/res/guied_scripts.ico
rename to neo/engine/sys/win32/rc/res/guied_scripts.ico
diff --git a/neo/sys/win32/rc/res/guied_scripts_white.ico b/neo/engine/sys/win32/rc/res/guied_scripts_white.ico
similarity index 100%
rename from neo/sys/win32/rc/res/guied_scripts_white.ico
rename to neo/engine/sys/win32/rc/res/guied_scripts_white.ico
diff --git a/neo/sys/win32/rc/res/guied_viewer_toolbar.bmp b/neo/engine/sys/win32/rc/res/guied_viewer_toolbar.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/guied_viewer_toolbar.bmp
rename to neo/engine/sys/win32/rc/res/guied_viewer_toolbar.bmp
diff --git a/neo/sys/win32/rc/res/icon2.ico b/neo/engine/sys/win32/rc/res/icon2.ico
similarity index 100%
rename from neo/sys/win32/rc/res/icon2.ico
rename to neo/engine/sys/win32/rc/res/icon2.ico
diff --git a/neo/sys/win32/rc/res/logo_sm3dfx.bmp b/neo/engine/sys/win32/rc/res/logo_sm3dfx.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/logo_sm3dfx.bmp
rename to neo/engine/sys/win32/rc/res/logo_sm3dfx.bmp
diff --git a/neo/sys/win32/rc/res/matedtree.bmp b/neo/engine/sys/win32/rc/res/matedtree.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/matedtree.bmp
rename to neo/engine/sys/win32/rc/res/matedtree.bmp
diff --git a/neo/sys/win32/rc/res/me_disabled_icon.ico b/neo/engine/sys/win32/rc/res/me_disabled_icon.ico
similarity index 100%
rename from neo/sys/win32/rc/res/me_disabled_icon.ico
rename to neo/engine/sys/win32/rc/res/me_disabled_icon.ico
diff --git a/neo/sys/win32/rc/res/me_enabled.ico b/neo/engine/sys/win32/rc/res/me_enabled.ico
similarity index 100%
rename from neo/sys/win32/rc/res/me_enabled.ico
rename to neo/engine/sys/win32/rc/res/me_enabled.ico
diff --git a/neo/sys/win32/rc/res/me_off_icon.ico b/neo/engine/sys/win32/rc/res/me_off_icon.ico
similarity index 100%
rename from neo/sys/win32/rc/res/me_off_icon.ico
rename to neo/engine/sys/win32/rc/res/me_off_icon.ico
diff --git a/neo/sys/win32/rc/res/me_on_icon.ico b/neo/engine/sys/win32/rc/res/me_on_icon.ico
similarity index 100%
rename from neo/sys/win32/rc/res/me_on_icon.ico
rename to neo/engine/sys/win32/rc/res/me_on_icon.ico
diff --git a/neo/sys/win32/rc/res/prey.ico b/neo/engine/sys/win32/rc/res/prey.ico
similarity index 100%
rename from neo/sys/win32/rc/res/prey.ico
rename to neo/engine/sys/win32/rc/res/prey.ico
diff --git a/neo/sys/win32/rc/res/qe3.ico b/neo/engine/sys/win32/rc/res/qe3.ico
similarity index 100%
rename from neo/sys/win32/rc/res/qe3.ico
rename to neo/engine/sys/win32/rc/res/qe3.ico
diff --git a/neo/sys/win32/rc/res/shaderbar.bmp b/neo/engine/sys/win32/rc/res/shaderbar.bmp
similarity index 100%
rename from neo/sys/win32/rc/res/shaderbar.bmp
rename to neo/engine/sys/win32/rc/res/shaderbar.bmp
diff --git a/neo/sys/win32/rc/res/shaderdoc.ico b/neo/engine/sys/win32/rc/res/shaderdoc.ico
similarity index 100%
rename from neo/sys/win32/rc/res/shaderdoc.ico
rename to neo/engine/sys/win32/rc/res/shaderdoc.ico
diff --git a/neo/sys/win32/rc/res/shaderframe.ico b/neo/engine/sys/win32/rc/res/shaderframe.ico
similarity index 100%
rename from neo/sys/win32/rc/res/shaderframe.ico
rename to neo/engine/sys/win32/rc/res/shaderframe.ico
diff --git a/neo/sys/win32/rc/res/spliter.cur b/neo/engine/sys/win32/rc/res/spliter.cur
similarity index 100%
rename from neo/sys/win32/rc/res/spliter.cur
rename to neo/engine/sys/win32/rc/res/spliter.cur
diff --git a/neo/sys/win32/sdk/D3SDK.nsi b/neo/engine/sys/win32/sdk/D3SDK.nsi
similarity index 100%
rename from neo/sys/win32/sdk/D3SDK.nsi
rename to neo/engine/sys/win32/sdk/D3SDK.nsi
diff --git a/neo/sys/win32/sdk/prepare.py b/neo/engine/sys/win32/sdk/prepare.py
similarity index 100%
rename from neo/sys/win32/sdk/prepare.py
rename to neo/engine/sys/win32/sdk/prepare.py
diff --git a/neo/sys/win32/sdk/source.list b/neo/engine/sys/win32/sdk/source.list
similarity index 100%
rename from neo/sys/win32/sdk/source.list
rename to neo/engine/sys/win32/sdk/source.list
diff --git a/neo/sys/win32/win_cpu.cpp b/neo/engine/sys/win32/win_cpu.cpp
similarity index 100%
rename from neo/sys/win32/win_cpu.cpp
rename to neo/engine/sys/win32/win_cpu.cpp
diff --git a/neo/sys/win32/win_gamma.cpp b/neo/engine/sys/win32/win_gamma.cpp
similarity index 100%
rename from neo/sys/win32/win_gamma.cpp
rename to neo/engine/sys/win32/win_gamma.cpp
diff --git a/neo/sys/win32/win_glimp.cpp b/neo/engine/sys/win32/win_glimp.cpp
similarity index 100%
rename from neo/sys/win32/win_glimp.cpp
rename to neo/engine/sys/win32/win_glimp.cpp
diff --git a/neo/sys/win32/win_input.cpp b/neo/engine/sys/win32/win_input.cpp
similarity index 100%
rename from neo/sys/win32/win_input.cpp
rename to neo/engine/sys/win32/win_input.cpp
diff --git a/neo/sys/win32/win_local.h b/neo/engine/sys/win32/win_local.h
similarity index 100%
rename from neo/sys/win32/win_local.h
rename to neo/engine/sys/win32/win_local.h
diff --git a/neo/sys/win32/win_main.cpp b/neo/engine/sys/win32/win_main.cpp
similarity index 100%
rename from neo/sys/win32/win_main.cpp
rename to neo/engine/sys/win32/win_main.cpp
diff --git a/neo/sys/win32/win_net.cpp b/neo/engine/sys/win32/win_net.cpp
similarity index 100%
rename from neo/sys/win32/win_net.cpp
rename to neo/engine/sys/win32/win_net.cpp
diff --git a/neo/sys/win32/win_shared.cpp b/neo/engine/sys/win32/win_shared.cpp
similarity index 100%
rename from neo/sys/win32/win_shared.cpp
rename to neo/engine/sys/win32/win_shared.cpp
diff --git a/neo/sys/win32/win_snd.cpp b/neo/engine/sys/win32/win_snd.cpp
similarity index 100%
rename from neo/sys/win32/win_snd.cpp
rename to neo/engine/sys/win32/win_snd.cpp
diff --git a/neo/sys/win32/win_syscon.cpp b/neo/engine/sys/win32/win_syscon.cpp
similarity index 100%
rename from neo/sys/win32/win_syscon.cpp
rename to neo/engine/sys/win32/win_syscon.cpp
diff --git a/neo/sys/win32/win_taskkeyhook.cpp b/neo/engine/sys/win32/win_taskkeyhook.cpp
similarity index 100%
rename from neo/sys/win32/win_taskkeyhook.cpp
rename to neo/engine/sys/win32/win_taskkeyhook.cpp
diff --git a/neo/sys/win32/win_wndproc.cpp b/neo/engine/sys/win32/win_wndproc.cpp
similarity index 100%
rename from neo/sys/win32/win_wndproc.cpp
rename to neo/engine/sys/win32/win_wndproc.cpp
diff --git a/neo/tools/Help/MT_help.htm b/neo/engine/tools/Help/MT_help.htm
similarity index 100%
rename from neo/tools/Help/MT_help.htm
rename to neo/engine/tools/Help/MT_help.htm
diff --git a/neo/tools/Help/MVH_Controls.htm b/neo/engine/tools/Help/MVH_Controls.htm
similarity index 100%
rename from neo/tools/Help/MVH_Controls.htm
rename to neo/engine/tools/Help/MVH_Controls.htm
diff --git a/neo/tools/Help/MVH_Issues.htm b/neo/engine/tools/Help/MVH_Issues.htm
similarity index 100%
rename from neo/tools/Help/MVH_Issues.htm
rename to neo/engine/tools/Help/MVH_Issues.htm
diff --git a/neo/tools/Help/MVH_Misc.htm b/neo/engine/tools/Help/MVH_Misc.htm
similarity index 100%
rename from neo/tools/Help/MVH_Misc.htm
rename to neo/engine/tools/Help/MVH_Misc.htm
diff --git a/neo/tools/Help/MVH_Mouse.htm b/neo/engine/tools/Help/MVH_Mouse.htm
similarity index 100%
rename from neo/tools/Help/MVH_Mouse.htm
rename to neo/engine/tools/Help/MVH_Mouse.htm
diff --git a/neo/tools/Help/MVH_Overview.htm b/neo/engine/tools/Help/MVH_Overview.htm
similarity index 100%
rename from neo/tools/Help/MVH_Overview.htm
rename to neo/engine/tools/Help/MVH_Overview.htm
diff --git a/neo/tools/Help/Tools.hhc b/neo/engine/tools/Help/Tools.hhc
similarity index 100%
rename from neo/tools/Help/Tools.hhc
rename to neo/engine/tools/Help/Tools.hhc
diff --git a/neo/tools/Help/Tools.hhk b/neo/engine/tools/Help/Tools.hhk
similarity index 100%
rename from neo/tools/Help/Tools.hhk
rename to neo/engine/tools/Help/Tools.hhk
diff --git a/neo/tools/Help/Tools.hhp b/neo/engine/tools/Help/Tools.hhp
similarity index 100%
rename from neo/tools/Help/Tools.hhp
rename to neo/engine/tools/Help/Tools.hhp
diff --git a/neo/tools/Help/default.htm b/neo/engine/tools/Help/default.htm
similarity index 100%
rename from neo/tools/Help/default.htm
rename to neo/engine/tools/Help/default.htm
diff --git a/neo/tools/Help/images/FirstAnim.png b/neo/engine/tools/Help/images/FirstAnim.png
similarity index 100%
rename from neo/tools/Help/images/FirstAnim.png
rename to neo/engine/tools/Help/images/FirstAnim.png
diff --git a/neo/tools/Help/images/OpenAnim.png b/neo/engine/tools/Help/images/OpenAnim.png
similarity index 100%
rename from neo/tools/Help/images/OpenAnim.png
rename to neo/engine/tools/Help/images/OpenAnim.png
diff --git a/neo/tools/Help/images/OpenMesh.png b/neo/engine/tools/Help/images/OpenMesh.png
similarity index 100%
rename from neo/tools/Help/images/OpenMesh.png
rename to neo/engine/tools/Help/images/OpenMesh.png
diff --git a/neo/tools/Help/images/Play.png b/neo/engine/tools/Help/images/Play.png
similarity index 100%
rename from neo/tools/Help/images/Play.png
rename to neo/engine/tools/Help/images/Play.png
diff --git a/neo/tools/Help/images/PrevAnim.png b/neo/engine/tools/Help/images/PrevAnim.png
similarity index 100%
rename from neo/tools/Help/images/PrevAnim.png
rename to neo/engine/tools/Help/images/PrevAnim.png
diff --git a/neo/tools/Help/images/animloop.png b/neo/engine/tools/Help/images/animloop.png
similarity index 100%
rename from neo/tools/Help/images/animloop.png
rename to neo/engine/tools/Help/images/animloop.png
diff --git a/neo/tools/Help/images/diffuse.png b/neo/engine/tools/Help/images/diffuse.png
similarity index 100%
rename from neo/tools/Help/images/diffuse.png
rename to neo/engine/tools/Help/images/diffuse.png
diff --git a/neo/tools/Help/images/lastanim.png b/neo/engine/tools/Help/images/lastanim.png
similarity index 100%
rename from neo/tools/Help/images/lastanim.png
rename to neo/engine/tools/Help/images/lastanim.png
diff --git a/neo/tools/Help/images/nextanim.png b/neo/engine/tools/Help/images/nextanim.png
similarity index 100%
rename from neo/tools/Help/images/nextanim.png
rename to neo/engine/tools/Help/images/nextanim.png
diff --git a/neo/tools/Help/images/orgoff.png b/neo/engine/tools/Help/images/orgoff.png
similarity index 100%
rename from neo/tools/Help/images/orgoff.png
rename to neo/engine/tools/Help/images/orgoff.png
diff --git a/neo/tools/Help/images/reloadtex.png b/neo/engine/tools/Help/images/reloadtex.png
similarity index 100%
rename from neo/tools/Help/images/reloadtex.png
rename to neo/engine/tools/Help/images/reloadtex.png
diff --git a/neo/tools/Help/images/resetcam.png b/neo/engine/tools/Help/images/resetcam.png
similarity index 100%
rename from neo/tools/Help/images/resetcam.png
rename to neo/engine/tools/Help/images/resetcam.png
diff --git a/neo/tools/Help/images/showbones.png b/neo/engine/tools/Help/images/showbones.png
similarity index 100%
rename from neo/tools/Help/images/showbones.png
rename to neo/engine/tools/Help/images/showbones.png
diff --git a/neo/tools/Help/images/shownorms.png b/neo/engine/tools/Help/images/shownorms.png
similarity index 100%
rename from neo/tools/Help/images/shownorms.png
rename to neo/engine/tools/Help/images/shownorms.png
diff --git a/neo/tools/Help/images/showoverdraw.png b/neo/engine/tools/Help/images/showoverdraw.png
similarity index 100%
rename from neo/tools/Help/images/showoverdraw.png
rename to neo/engine/tools/Help/images/showoverdraw.png
diff --git a/neo/tools/Help/images/showskel.png b/neo/engine/tools/Help/images/showskel.png
similarity index 100%
rename from neo/tools/Help/images/showskel.png
rename to neo/engine/tools/Help/images/showskel.png
diff --git a/neo/tools/Help/images/showsurf.png b/neo/engine/tools/Help/images/showsurf.png
similarity index 100%
rename from neo/tools/Help/images/showsurf.png
rename to neo/engine/tools/Help/images/showsurf.png
diff --git a/neo/tools/Help/images/showtris.png b/neo/engine/tools/Help/images/showtris.png
similarity index 100%
rename from neo/tools/Help/images/showtris.png
rename to neo/engine/tools/Help/images/showtris.png
diff --git a/neo/tools/Help/images/specular.png b/neo/engine/tools/Help/images/specular.png
similarity index 100%
rename from neo/tools/Help/images/specular.png
rename to neo/engine/tools/Help/images/specular.png
diff --git a/neo/tools/Help/images/stop.png b/neo/engine/tools/Help/images/stop.png
similarity index 100%
rename from neo/tools/Help/images/stop.png
rename to neo/engine/tools/Help/images/stop.png
diff --git a/neo/tools/af/DialogAF.cpp b/neo/engine/tools/af/DialogAF.cpp
similarity index 100%
rename from neo/tools/af/DialogAF.cpp
rename to neo/engine/tools/af/DialogAF.cpp
diff --git a/neo/tools/af/DialogAF.h b/neo/engine/tools/af/DialogAF.h
similarity index 100%
rename from neo/tools/af/DialogAF.h
rename to neo/engine/tools/af/DialogAF.h
diff --git a/neo/tools/af/DialogAFBody.cpp b/neo/engine/tools/af/DialogAFBody.cpp
similarity index 100%
rename from neo/tools/af/DialogAFBody.cpp
rename to neo/engine/tools/af/DialogAFBody.cpp
diff --git a/neo/tools/af/DialogAFBody.h b/neo/engine/tools/af/DialogAFBody.h
similarity index 100%
rename from neo/tools/af/DialogAFBody.h
rename to neo/engine/tools/af/DialogAFBody.h
diff --git a/neo/tools/af/DialogAFConstraint.cpp b/neo/engine/tools/af/DialogAFConstraint.cpp
similarity index 100%
rename from neo/tools/af/DialogAFConstraint.cpp
rename to neo/engine/tools/af/DialogAFConstraint.cpp
diff --git a/neo/tools/af/DialogAFConstraint.h b/neo/engine/tools/af/DialogAFConstraint.h
similarity index 100%
rename from neo/tools/af/DialogAFConstraint.h
rename to neo/engine/tools/af/DialogAFConstraint.h
diff --git a/neo/tools/af/DialogAFConstraintBallAndSocket.cpp b/neo/engine/tools/af/DialogAFConstraintBallAndSocket.cpp
similarity index 100%
rename from neo/tools/af/DialogAFConstraintBallAndSocket.cpp
rename to neo/engine/tools/af/DialogAFConstraintBallAndSocket.cpp
diff --git a/neo/tools/af/DialogAFConstraintBallAndSocket.h b/neo/engine/tools/af/DialogAFConstraintBallAndSocket.h
similarity index 100%
rename from neo/tools/af/DialogAFConstraintBallAndSocket.h
rename to neo/engine/tools/af/DialogAFConstraintBallAndSocket.h
diff --git a/neo/tools/af/DialogAFConstraintFixed.cpp b/neo/engine/tools/af/DialogAFConstraintFixed.cpp
similarity index 100%
rename from neo/tools/af/DialogAFConstraintFixed.cpp
rename to neo/engine/tools/af/DialogAFConstraintFixed.cpp
diff --git a/neo/tools/af/DialogAFConstraintFixed.h b/neo/engine/tools/af/DialogAFConstraintFixed.h
similarity index 100%
rename from neo/tools/af/DialogAFConstraintFixed.h
rename to neo/engine/tools/af/DialogAFConstraintFixed.h
diff --git a/neo/tools/af/DialogAFConstraintHinge.cpp b/neo/engine/tools/af/DialogAFConstraintHinge.cpp
similarity index 100%
rename from neo/tools/af/DialogAFConstraintHinge.cpp
rename to neo/engine/tools/af/DialogAFConstraintHinge.cpp
diff --git a/neo/tools/af/DialogAFConstraintHinge.h b/neo/engine/tools/af/DialogAFConstraintHinge.h
similarity index 100%
rename from neo/tools/af/DialogAFConstraintHinge.h
rename to neo/engine/tools/af/DialogAFConstraintHinge.h
diff --git a/neo/tools/af/DialogAFConstraintSlider.cpp b/neo/engine/tools/af/DialogAFConstraintSlider.cpp
similarity index 100%
rename from neo/tools/af/DialogAFConstraintSlider.cpp
rename to neo/engine/tools/af/DialogAFConstraintSlider.cpp
diff --git a/neo/tools/af/DialogAFConstraintSlider.h b/neo/engine/tools/af/DialogAFConstraintSlider.h
similarity index 100%
rename from neo/tools/af/DialogAFConstraintSlider.h
rename to neo/engine/tools/af/DialogAFConstraintSlider.h
diff --git a/neo/tools/af/DialogAFConstraintSpring.cpp b/neo/engine/tools/af/DialogAFConstraintSpring.cpp
similarity index 100%
rename from neo/tools/af/DialogAFConstraintSpring.cpp
rename to neo/engine/tools/af/DialogAFConstraintSpring.cpp
diff --git a/neo/tools/af/DialogAFConstraintSpring.h b/neo/engine/tools/af/DialogAFConstraintSpring.h
similarity index 100%
rename from neo/tools/af/DialogAFConstraintSpring.h
rename to neo/engine/tools/af/DialogAFConstraintSpring.h
diff --git a/neo/tools/af/DialogAFConstraintUniversal.cpp b/neo/engine/tools/af/DialogAFConstraintUniversal.cpp
similarity index 100%
rename from neo/tools/af/DialogAFConstraintUniversal.cpp
rename to neo/engine/tools/af/DialogAFConstraintUniversal.cpp
diff --git a/neo/tools/af/DialogAFConstraintUniversal.h b/neo/engine/tools/af/DialogAFConstraintUniversal.h
similarity index 100%
rename from neo/tools/af/DialogAFConstraintUniversal.h
rename to neo/engine/tools/af/DialogAFConstraintUniversal.h
diff --git a/neo/tools/af/DialogAFName.cpp b/neo/engine/tools/af/DialogAFName.cpp
similarity index 100%
rename from neo/tools/af/DialogAFName.cpp
rename to neo/engine/tools/af/DialogAFName.cpp
diff --git a/neo/tools/af/DialogAFName.h b/neo/engine/tools/af/DialogAFName.h
similarity index 100%
rename from neo/tools/af/DialogAFName.h
rename to neo/engine/tools/af/DialogAFName.h
diff --git a/neo/tools/af/DialogAFProperties.cpp b/neo/engine/tools/af/DialogAFProperties.cpp
similarity index 100%
rename from neo/tools/af/DialogAFProperties.cpp
rename to neo/engine/tools/af/DialogAFProperties.cpp
diff --git a/neo/tools/af/DialogAFProperties.h b/neo/engine/tools/af/DialogAFProperties.h
similarity index 100%
rename from neo/tools/af/DialogAFProperties.h
rename to neo/engine/tools/af/DialogAFProperties.h
diff --git a/neo/tools/af/DialogAFView.cpp b/neo/engine/tools/af/DialogAFView.cpp
similarity index 100%
rename from neo/tools/af/DialogAFView.cpp
rename to neo/engine/tools/af/DialogAFView.cpp
diff --git a/neo/tools/af/DialogAFView.h b/neo/engine/tools/af/DialogAFView.h
similarity index 100%
rename from neo/tools/af/DialogAFView.h
rename to neo/engine/tools/af/DialogAFView.h
diff --git a/neo/tools/comafx/CDIB.cpp b/neo/engine/tools/comafx/CDIB.cpp
similarity index 100%
rename from neo/tools/comafx/CDIB.cpp
rename to neo/engine/tools/comafx/CDIB.cpp
diff --git a/neo/tools/comafx/CDIB.h b/neo/engine/tools/comafx/CDIB.h
similarity index 100%
rename from neo/tools/comafx/CDIB.h
rename to neo/engine/tools/comafx/CDIB.h
diff --git a/neo/tools/comafx/CPathTreeCtrl.cpp b/neo/engine/tools/comafx/CPathTreeCtrl.cpp
similarity index 100%
rename from neo/tools/comafx/CPathTreeCtrl.cpp
rename to neo/engine/tools/comafx/CPathTreeCtrl.cpp
diff --git a/neo/tools/comafx/CPathTreeCtrl.h b/neo/engine/tools/comafx/CPathTreeCtrl.h
similarity index 100%
rename from neo/tools/comafx/CPathTreeCtrl.h
rename to neo/engine/tools/comafx/CPathTreeCtrl.h
diff --git a/neo/tools/comafx/CSyntaxRichEditCtrl.cpp b/neo/engine/tools/comafx/CSyntaxRichEditCtrl.cpp
similarity index 100%
rename from neo/tools/comafx/CSyntaxRichEditCtrl.cpp
rename to neo/engine/tools/comafx/CSyntaxRichEditCtrl.cpp
diff --git a/neo/tools/comafx/CSyntaxRichEditCtrl.h b/neo/engine/tools/comafx/CSyntaxRichEditCtrl.h
similarity index 100%
rename from neo/tools/comafx/CSyntaxRichEditCtrl.h
rename to neo/engine/tools/comafx/CSyntaxRichEditCtrl.h
diff --git a/neo/tools/comafx/DialogColorPicker.cpp b/neo/engine/tools/comafx/DialogColorPicker.cpp
similarity index 100%
rename from neo/tools/comafx/DialogColorPicker.cpp
rename to neo/engine/tools/comafx/DialogColorPicker.cpp
diff --git a/neo/tools/comafx/DialogColorPicker.h b/neo/engine/tools/comafx/DialogColorPicker.h
similarity index 100%
rename from neo/tools/comafx/DialogColorPicker.h
rename to neo/engine/tools/comafx/DialogColorPicker.h
diff --git a/neo/tools/comafx/DialogGoToLine.cpp b/neo/engine/tools/comafx/DialogGoToLine.cpp
similarity index 100%
rename from neo/tools/comafx/DialogGoToLine.cpp
rename to neo/engine/tools/comafx/DialogGoToLine.cpp
diff --git a/neo/tools/comafx/DialogGoToLine.h b/neo/engine/tools/comafx/DialogGoToLine.h
similarity index 100%
rename from neo/tools/comafx/DialogGoToLine.h
rename to neo/engine/tools/comafx/DialogGoToLine.h
diff --git a/neo/tools/comafx/DialogName.cpp b/neo/engine/tools/comafx/DialogName.cpp
similarity index 100%
rename from neo/tools/comafx/DialogName.cpp
rename to neo/engine/tools/comafx/DialogName.cpp
diff --git a/neo/tools/comafx/DialogName.h b/neo/engine/tools/comafx/DialogName.h
similarity index 100%
rename from neo/tools/comafx/DialogName.h
rename to neo/engine/tools/comafx/DialogName.h
diff --git a/neo/tools/comafx/StdAfx.cpp b/neo/engine/tools/comafx/StdAfx.cpp
similarity index 100%
rename from neo/tools/comafx/StdAfx.cpp
rename to neo/engine/tools/comafx/StdAfx.cpp
diff --git a/neo/tools/comafx/StdAfx.h b/neo/engine/tools/comafx/StdAfx.h
similarity index 100%
rename from neo/tools/comafx/StdAfx.h
rename to neo/engine/tools/comafx/StdAfx.h
diff --git a/neo/tools/comafx/VectorCtl.cpp b/neo/engine/tools/comafx/VectorCtl.cpp
similarity index 100%
rename from neo/tools/comafx/VectorCtl.cpp
rename to neo/engine/tools/comafx/VectorCtl.cpp
diff --git a/neo/tools/comafx/VectorCtl.h b/neo/engine/tools/comafx/VectorCtl.h
similarity index 100%
rename from neo/tools/comafx/VectorCtl.h
rename to neo/engine/tools/comafx/VectorCtl.h
diff --git a/neo/tools/comafx/riched20.tlh b/neo/engine/tools/comafx/riched20.tlh
similarity index 100%
rename from neo/tools/comafx/riched20.tlh
rename to neo/engine/tools/comafx/riched20.tlh
diff --git a/neo/tools/common/AlphaPopup.cpp b/neo/engine/tools/common/AlphaPopup.cpp
similarity index 100%
rename from neo/tools/common/AlphaPopup.cpp
rename to neo/engine/tools/common/AlphaPopup.cpp
diff --git a/neo/tools/common/ColorButton.cpp b/neo/engine/tools/common/ColorButton.cpp
similarity index 100%
rename from neo/tools/common/ColorButton.cpp
rename to neo/engine/tools/common/ColorButton.cpp
diff --git a/neo/tools/common/ColorButton.h b/neo/engine/tools/common/ColorButton.h
similarity index 100%
rename from neo/tools/common/ColorButton.h
rename to neo/engine/tools/common/ColorButton.h
diff --git a/neo/tools/common/DialogHelpers.h b/neo/engine/tools/common/DialogHelpers.h
similarity index 100%
rename from neo/tools/common/DialogHelpers.h
rename to neo/engine/tools/common/DialogHelpers.h
diff --git a/neo/tools/common/MaskEdit.cpp b/neo/engine/tools/common/MaskEdit.cpp
similarity index 100%
rename from neo/tools/common/MaskEdit.cpp
rename to neo/engine/tools/common/MaskEdit.cpp
diff --git a/neo/tools/common/MaskEdit.h b/neo/engine/tools/common/MaskEdit.h
similarity index 100%
rename from neo/tools/common/MaskEdit.h
rename to neo/engine/tools/common/MaskEdit.h
diff --git a/neo/tools/common/OpenFileDialog.cpp b/neo/engine/tools/common/OpenFileDialog.cpp
similarity index 100%
rename from neo/tools/common/OpenFileDialog.cpp
rename to neo/engine/tools/common/OpenFileDialog.cpp
diff --git a/neo/tools/common/OpenFileDialog.h b/neo/engine/tools/common/OpenFileDialog.h
similarity index 100%
rename from neo/tools/common/OpenFileDialog.h
rename to neo/engine/tools/common/OpenFileDialog.h
diff --git a/neo/tools/common/PropTree/PropTree.cpp b/neo/engine/tools/common/PropTree/PropTree.cpp
similarity index 100%
rename from neo/tools/common/PropTree/PropTree.cpp
rename to neo/engine/tools/common/PropTree/PropTree.cpp
diff --git a/neo/tools/common/PropTree/PropTree.h b/neo/engine/tools/common/PropTree/PropTree.h
similarity index 100%
rename from neo/tools/common/PropTree/PropTree.h
rename to neo/engine/tools/common/PropTree/PropTree.h
diff --git a/neo/tools/common/PropTree/PropTreeInfo.cpp b/neo/engine/tools/common/PropTree/PropTreeInfo.cpp
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeInfo.cpp
rename to neo/engine/tools/common/PropTree/PropTreeInfo.cpp
diff --git a/neo/tools/common/PropTree/PropTreeInfo.h b/neo/engine/tools/common/PropTree/PropTreeInfo.h
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeInfo.h
rename to neo/engine/tools/common/PropTree/PropTreeInfo.h
diff --git a/neo/tools/common/PropTree/PropTreeItem.cpp b/neo/engine/tools/common/PropTree/PropTreeItem.cpp
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItem.cpp
rename to neo/engine/tools/common/PropTree/PropTreeItem.cpp
diff --git a/neo/tools/common/PropTree/PropTreeItem.h b/neo/engine/tools/common/PropTree/PropTreeItem.h
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItem.h
rename to neo/engine/tools/common/PropTree/PropTreeItem.h
diff --git a/neo/tools/common/PropTree/PropTreeItemButton.cpp b/neo/engine/tools/common/PropTree/PropTreeItemButton.cpp
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItemButton.cpp
rename to neo/engine/tools/common/PropTree/PropTreeItemButton.cpp
diff --git a/neo/tools/common/PropTree/PropTreeItemButton.h b/neo/engine/tools/common/PropTree/PropTreeItemButton.h
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItemButton.h
rename to neo/engine/tools/common/PropTree/PropTreeItemButton.h
diff --git a/neo/tools/common/PropTree/PropTreeItemCheck.cpp b/neo/engine/tools/common/PropTree/PropTreeItemCheck.cpp
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItemCheck.cpp
rename to neo/engine/tools/common/PropTree/PropTreeItemCheck.cpp
diff --git a/neo/tools/common/PropTree/PropTreeItemCheck.h b/neo/engine/tools/common/PropTree/PropTreeItemCheck.h
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItemCheck.h
rename to neo/engine/tools/common/PropTree/PropTreeItemCheck.h
diff --git a/neo/tools/common/PropTree/PropTreeItemColor.cpp b/neo/engine/tools/common/PropTree/PropTreeItemColor.cpp
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItemColor.cpp
rename to neo/engine/tools/common/PropTree/PropTreeItemColor.cpp
diff --git a/neo/tools/common/PropTree/PropTreeItemColor.h b/neo/engine/tools/common/PropTree/PropTreeItemColor.h
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItemColor.h
rename to neo/engine/tools/common/PropTree/PropTreeItemColor.h
diff --git a/neo/tools/common/PropTree/PropTreeItemCombo.cpp b/neo/engine/tools/common/PropTree/PropTreeItemCombo.cpp
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItemCombo.cpp
rename to neo/engine/tools/common/PropTree/PropTreeItemCombo.cpp
diff --git a/neo/tools/common/PropTree/PropTreeItemCombo.h b/neo/engine/tools/common/PropTree/PropTreeItemCombo.h
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItemCombo.h
rename to neo/engine/tools/common/PropTree/PropTreeItemCombo.h
diff --git a/neo/tools/common/PropTree/PropTreeItemEdit.cpp b/neo/engine/tools/common/PropTree/PropTreeItemEdit.cpp
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItemEdit.cpp
rename to neo/engine/tools/common/PropTree/PropTreeItemEdit.cpp
diff --git a/neo/tools/common/PropTree/PropTreeItemEdit.h b/neo/engine/tools/common/PropTree/PropTreeItemEdit.h
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItemEdit.h
rename to neo/engine/tools/common/PropTree/PropTreeItemEdit.h
diff --git a/neo/tools/common/PropTree/PropTreeItemEditButton.cpp b/neo/engine/tools/common/PropTree/PropTreeItemEditButton.cpp
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItemEditButton.cpp
rename to neo/engine/tools/common/PropTree/PropTreeItemEditButton.cpp
diff --git a/neo/tools/common/PropTree/PropTreeItemEditButton.h b/neo/engine/tools/common/PropTree/PropTreeItemEditButton.h
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItemEditButton.h
rename to neo/engine/tools/common/PropTree/PropTreeItemEditButton.h
diff --git a/neo/tools/common/PropTree/PropTreeItemFileEdit.cpp b/neo/engine/tools/common/PropTree/PropTreeItemFileEdit.cpp
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItemFileEdit.cpp
rename to neo/engine/tools/common/PropTree/PropTreeItemFileEdit.cpp
diff --git a/neo/tools/common/PropTree/PropTreeItemFileEdit.h b/neo/engine/tools/common/PropTree/PropTreeItemFileEdit.h
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItemFileEdit.h
rename to neo/engine/tools/common/PropTree/PropTreeItemFileEdit.h
diff --git a/neo/tools/common/PropTree/PropTreeItemStatic.cpp b/neo/engine/tools/common/PropTree/PropTreeItemStatic.cpp
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItemStatic.cpp
rename to neo/engine/tools/common/PropTree/PropTreeItemStatic.cpp
diff --git a/neo/tools/common/PropTree/PropTreeItemStatic.h b/neo/engine/tools/common/PropTree/PropTreeItemStatic.h
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeItemStatic.h
rename to neo/engine/tools/common/PropTree/PropTreeItemStatic.h
diff --git a/neo/tools/common/PropTree/PropTreeList.cpp b/neo/engine/tools/common/PropTree/PropTreeList.cpp
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeList.cpp
rename to neo/engine/tools/common/PropTree/PropTreeList.cpp
diff --git a/neo/tools/common/PropTree/PropTreeList.h b/neo/engine/tools/common/PropTree/PropTreeList.h
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeList.h
rename to neo/engine/tools/common/PropTree/PropTreeList.h
diff --git a/neo/tools/common/PropTree/PropTreeView.cpp b/neo/engine/tools/common/PropTree/PropTreeView.cpp
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeView.cpp
rename to neo/engine/tools/common/PropTree/PropTreeView.cpp
diff --git a/neo/tools/common/PropTree/PropTreeView.h b/neo/engine/tools/common/PropTree/PropTreeView.h
similarity index 100%
rename from neo/tools/common/PropTree/PropTreeView.h
rename to neo/engine/tools/common/PropTree/PropTreeView.h
diff --git a/neo/tools/common/PropertyGrid.cpp b/neo/engine/tools/common/PropertyGrid.cpp
similarity index 100%
rename from neo/tools/common/PropertyGrid.cpp
rename to neo/engine/tools/common/PropertyGrid.cpp
diff --git a/neo/tools/common/PropertyGrid.h b/neo/engine/tools/common/PropertyGrid.h
similarity index 100%
rename from neo/tools/common/PropertyGrid.h
rename to neo/engine/tools/common/PropertyGrid.h
diff --git a/neo/tools/common/RegistryOptions.cpp b/neo/engine/tools/common/RegistryOptions.cpp
similarity index 100%
rename from neo/tools/common/RegistryOptions.cpp
rename to neo/engine/tools/common/RegistryOptions.cpp
diff --git a/neo/tools/common/RegistryOptions.h b/neo/engine/tools/common/RegistryOptions.h
similarity index 100%
rename from neo/tools/common/RegistryOptions.h
rename to neo/engine/tools/common/RegistryOptions.h
diff --git a/neo/tools/common/RenderBumpFlatDialog.cpp b/neo/engine/tools/common/RenderBumpFlatDialog.cpp
similarity index 100%
rename from neo/tools/common/RenderBumpFlatDialog.cpp
rename to neo/engine/tools/common/RenderBumpFlatDialog.cpp
diff --git a/neo/tools/common/RenderBumpFlatDialog.h b/neo/engine/tools/common/RenderBumpFlatDialog.h
similarity index 100%
rename from neo/tools/common/RenderBumpFlatDialog.h
rename to neo/engine/tools/common/RenderBumpFlatDialog.h
diff --git a/neo/tools/common/RollupPanel.cpp b/neo/engine/tools/common/RollupPanel.cpp
similarity index 100%
rename from neo/tools/common/RollupPanel.cpp
rename to neo/engine/tools/common/RollupPanel.cpp
diff --git a/neo/tools/common/RollupPanel.h b/neo/engine/tools/common/RollupPanel.h
similarity index 100%
rename from neo/tools/common/RollupPanel.h
rename to neo/engine/tools/common/RollupPanel.h
diff --git a/neo/tools/common/SpinButton.cpp b/neo/engine/tools/common/SpinButton.cpp
similarity index 100%
rename from neo/tools/common/SpinButton.cpp
rename to neo/engine/tools/common/SpinButton.cpp
diff --git a/neo/tools/common/SpinButton.h b/neo/engine/tools/common/SpinButton.h
similarity index 100%
rename from neo/tools/common/SpinButton.h
rename to neo/engine/tools/common/SpinButton.h
diff --git a/neo/tools/compilers/aas/AASBuild.cpp b/neo/engine/tools/compilers/aas/AASBuild.cpp
similarity index 100%
rename from neo/tools/compilers/aas/AASBuild.cpp
rename to neo/engine/tools/compilers/aas/AASBuild.cpp
diff --git a/neo/tools/compilers/aas/AASBuild_file.cpp b/neo/engine/tools/compilers/aas/AASBuild_file.cpp
similarity index 100%
rename from neo/tools/compilers/aas/AASBuild_file.cpp
rename to neo/engine/tools/compilers/aas/AASBuild_file.cpp
diff --git a/neo/tools/compilers/aas/AASBuild_gravity.cpp b/neo/engine/tools/compilers/aas/AASBuild_gravity.cpp
similarity index 100%
rename from neo/tools/compilers/aas/AASBuild_gravity.cpp
rename to neo/engine/tools/compilers/aas/AASBuild_gravity.cpp
diff --git a/neo/tools/compilers/aas/AASBuild_ledge.cpp b/neo/engine/tools/compilers/aas/AASBuild_ledge.cpp
similarity index 100%
rename from neo/tools/compilers/aas/AASBuild_ledge.cpp
rename to neo/engine/tools/compilers/aas/AASBuild_ledge.cpp
diff --git a/neo/tools/compilers/aas/AASBuild_local.h b/neo/engine/tools/compilers/aas/AASBuild_local.h
similarity index 100%
rename from neo/tools/compilers/aas/AASBuild_local.h
rename to neo/engine/tools/compilers/aas/AASBuild_local.h
diff --git a/neo/tools/compilers/aas/AASBuild_merge.cpp b/neo/engine/tools/compilers/aas/AASBuild_merge.cpp
similarity index 100%
rename from neo/tools/compilers/aas/AASBuild_merge.cpp
rename to neo/engine/tools/compilers/aas/AASBuild_merge.cpp
diff --git a/neo/tools/compilers/aas/AASCluster.cpp b/neo/engine/tools/compilers/aas/AASCluster.cpp
similarity index 100%
rename from neo/tools/compilers/aas/AASCluster.cpp
rename to neo/engine/tools/compilers/aas/AASCluster.cpp
diff --git a/neo/tools/compilers/aas/AASCluster.h b/neo/engine/tools/compilers/aas/AASCluster.h
similarity index 100%
rename from neo/tools/compilers/aas/AASCluster.h
rename to neo/engine/tools/compilers/aas/AASCluster.h
diff --git a/neo/tools/compilers/aas/AASFile.cpp b/neo/engine/tools/compilers/aas/AASFile.cpp
similarity index 100%
rename from neo/tools/compilers/aas/AASFile.cpp
rename to neo/engine/tools/compilers/aas/AASFile.cpp
diff --git a/neo/tools/compilers/aas/AASFile.h b/neo/engine/tools/compilers/aas/AASFile.h
similarity index 100%
rename from neo/tools/compilers/aas/AASFile.h
rename to neo/engine/tools/compilers/aas/AASFile.h
diff --git a/neo/tools/compilers/aas/AASFileManager.cpp b/neo/engine/tools/compilers/aas/AASFileManager.cpp
similarity index 100%
rename from neo/tools/compilers/aas/AASFileManager.cpp
rename to neo/engine/tools/compilers/aas/AASFileManager.cpp
diff --git a/neo/tools/compilers/aas/AASFileManager.h b/neo/engine/tools/compilers/aas/AASFileManager.h
similarity index 100%
rename from neo/tools/compilers/aas/AASFileManager.h
rename to neo/engine/tools/compilers/aas/AASFileManager.h
diff --git a/neo/tools/compilers/aas/AASFile_local.h b/neo/engine/tools/compilers/aas/AASFile_local.h
similarity index 100%
rename from neo/tools/compilers/aas/AASFile_local.h
rename to neo/engine/tools/compilers/aas/AASFile_local.h
diff --git a/neo/tools/compilers/aas/AASFile_optimize.cpp b/neo/engine/tools/compilers/aas/AASFile_optimize.cpp
similarity index 100%
rename from neo/tools/compilers/aas/AASFile_optimize.cpp
rename to neo/engine/tools/compilers/aas/AASFile_optimize.cpp
diff --git a/neo/tools/compilers/aas/AASFile_sample.cpp b/neo/engine/tools/compilers/aas/AASFile_sample.cpp
similarity index 100%
rename from neo/tools/compilers/aas/AASFile_sample.cpp
rename to neo/engine/tools/compilers/aas/AASFile_sample.cpp
diff --git a/neo/tools/compilers/aas/AASReach.cpp b/neo/engine/tools/compilers/aas/AASReach.cpp
similarity index 100%
rename from neo/tools/compilers/aas/AASReach.cpp
rename to neo/engine/tools/compilers/aas/AASReach.cpp
diff --git a/neo/tools/compilers/aas/AASReach.h b/neo/engine/tools/compilers/aas/AASReach.h
similarity index 100%
rename from neo/tools/compilers/aas/AASReach.h
rename to neo/engine/tools/compilers/aas/AASReach.h
diff --git a/neo/tools/compilers/aas/Brush.cpp b/neo/engine/tools/compilers/aas/Brush.cpp
similarity index 100%
rename from neo/tools/compilers/aas/Brush.cpp
rename to neo/engine/tools/compilers/aas/Brush.cpp
diff --git a/neo/tools/compilers/aas/Brush.h b/neo/engine/tools/compilers/aas/Brush.h
similarity index 100%
rename from neo/tools/compilers/aas/Brush.h
rename to neo/engine/tools/compilers/aas/Brush.h
diff --git a/neo/tools/compilers/aas/BrushBSP.cpp b/neo/engine/tools/compilers/aas/BrushBSP.cpp
similarity index 100%
rename from neo/tools/compilers/aas/BrushBSP.cpp
rename to neo/engine/tools/compilers/aas/BrushBSP.cpp
diff --git a/neo/tools/compilers/aas/BrushBSP.h b/neo/engine/tools/compilers/aas/BrushBSP.h
similarity index 100%
rename from neo/tools/compilers/aas/BrushBSP.h
rename to neo/engine/tools/compilers/aas/BrushBSP.h
diff --git a/neo/tools/compilers/compiler_public.h b/neo/engine/tools/compilers/compiler_public.h
similarity index 100%
rename from neo/tools/compilers/compiler_public.h
rename to neo/engine/tools/compilers/compiler_public.h
diff --git a/neo/tools/compilers/dmap/dmap.cpp b/neo/engine/tools/compilers/dmap/dmap.cpp
similarity index 100%
rename from neo/tools/compilers/dmap/dmap.cpp
rename to neo/engine/tools/compilers/dmap/dmap.cpp
diff --git a/neo/tools/compilers/dmap/dmap.h b/neo/engine/tools/compilers/dmap/dmap.h
similarity index 100%
rename from neo/tools/compilers/dmap/dmap.h
rename to neo/engine/tools/compilers/dmap/dmap.h
diff --git a/neo/tools/compilers/dmap/facebsp.cpp b/neo/engine/tools/compilers/dmap/facebsp.cpp
similarity index 100%
rename from neo/tools/compilers/dmap/facebsp.cpp
rename to neo/engine/tools/compilers/dmap/facebsp.cpp
diff --git a/neo/tools/compilers/dmap/gldraw.cpp b/neo/engine/tools/compilers/dmap/gldraw.cpp
similarity index 100%
rename from neo/tools/compilers/dmap/gldraw.cpp
rename to neo/engine/tools/compilers/dmap/gldraw.cpp
diff --git a/neo/tools/compilers/dmap/glfile.cpp b/neo/engine/tools/compilers/dmap/glfile.cpp
similarity index 100%
rename from neo/tools/compilers/dmap/glfile.cpp
rename to neo/engine/tools/compilers/dmap/glfile.cpp
diff --git a/neo/tools/compilers/dmap/leakfile.cpp b/neo/engine/tools/compilers/dmap/leakfile.cpp
similarity index 100%
rename from neo/tools/compilers/dmap/leakfile.cpp
rename to neo/engine/tools/compilers/dmap/leakfile.cpp
diff --git a/neo/tools/compilers/dmap/map.cpp b/neo/engine/tools/compilers/dmap/map.cpp
similarity index 100%
rename from neo/tools/compilers/dmap/map.cpp
rename to neo/engine/tools/compilers/dmap/map.cpp
diff --git a/neo/tools/compilers/dmap/optimize.cpp b/neo/engine/tools/compilers/dmap/optimize.cpp
similarity index 100%
rename from neo/tools/compilers/dmap/optimize.cpp
rename to neo/engine/tools/compilers/dmap/optimize.cpp
diff --git a/neo/tools/compilers/dmap/optimize_gcc.cpp b/neo/engine/tools/compilers/dmap/optimize_gcc.cpp
similarity index 100%
rename from neo/tools/compilers/dmap/optimize_gcc.cpp
rename to neo/engine/tools/compilers/dmap/optimize_gcc.cpp
diff --git a/neo/tools/compilers/dmap/output.cpp b/neo/engine/tools/compilers/dmap/output.cpp
similarity index 100%
rename from neo/tools/compilers/dmap/output.cpp
rename to neo/engine/tools/compilers/dmap/output.cpp
diff --git a/neo/tools/compilers/dmap/portals.cpp b/neo/engine/tools/compilers/dmap/portals.cpp
similarity index 100%
rename from neo/tools/compilers/dmap/portals.cpp
rename to neo/engine/tools/compilers/dmap/portals.cpp
diff --git a/neo/tools/compilers/dmap/tritjunction.cpp b/neo/engine/tools/compilers/dmap/tritjunction.cpp
similarity index 100%
rename from neo/tools/compilers/dmap/tritjunction.cpp
rename to neo/engine/tools/compilers/dmap/tritjunction.cpp
diff --git a/neo/tools/compilers/dmap/tritools.cpp b/neo/engine/tools/compilers/dmap/tritools.cpp
similarity index 100%
rename from neo/tools/compilers/dmap/tritools.cpp
rename to neo/engine/tools/compilers/dmap/tritools.cpp
diff --git a/neo/tools/compilers/dmap/ubrush.cpp b/neo/engine/tools/compilers/dmap/ubrush.cpp
similarity index 100%
rename from neo/tools/compilers/dmap/ubrush.cpp
rename to neo/engine/tools/compilers/dmap/ubrush.cpp
diff --git a/neo/tools/compilers/dmap/usurface.cpp b/neo/engine/tools/compilers/dmap/usurface.cpp
similarity index 100%
rename from neo/tools/compilers/dmap/usurface.cpp
rename to neo/engine/tools/compilers/dmap/usurface.cpp
diff --git a/neo/tools/compilers/renderbump/renderbump.cpp b/neo/engine/tools/compilers/renderbump/renderbump.cpp
similarity index 100%
rename from neo/tools/compilers/renderbump/renderbump.cpp
rename to neo/engine/tools/compilers/renderbump/renderbump.cpp
diff --git a/neo/tools/compilers/roqvq/NSBitmapImageRep.cpp b/neo/engine/tools/compilers/roqvq/NSBitmapImageRep.cpp
similarity index 100%
rename from neo/tools/compilers/roqvq/NSBitmapImageRep.cpp
rename to neo/engine/tools/compilers/roqvq/NSBitmapImageRep.cpp
diff --git a/neo/tools/compilers/roqvq/codec.cpp b/neo/engine/tools/compilers/roqvq/codec.cpp
similarity index 100%
rename from neo/tools/compilers/roqvq/codec.cpp
rename to neo/engine/tools/compilers/roqvq/codec.cpp
diff --git a/neo/tools/compilers/roqvq/codec.h b/neo/engine/tools/compilers/roqvq/codec.h
similarity index 100%
rename from neo/tools/compilers/roqvq/codec.h
rename to neo/engine/tools/compilers/roqvq/codec.h
diff --git a/neo/tools/compilers/roqvq/gdefs.h b/neo/engine/tools/compilers/roqvq/gdefs.h
similarity index 100%
rename from neo/tools/compilers/roqvq/gdefs.h
rename to neo/engine/tools/compilers/roqvq/gdefs.h
diff --git a/neo/tools/compilers/roqvq/quaddefs.h b/neo/engine/tools/compilers/roqvq/quaddefs.h
similarity index 100%
rename from neo/tools/compilers/roqvq/quaddefs.h
rename to neo/engine/tools/compilers/roqvq/quaddefs.h
diff --git a/neo/tools/compilers/roqvq/roq.cpp b/neo/engine/tools/compilers/roqvq/roq.cpp
similarity index 100%
rename from neo/tools/compilers/roqvq/roq.cpp
rename to neo/engine/tools/compilers/roqvq/roq.cpp
diff --git a/neo/tools/compilers/roqvq/roq.h b/neo/engine/tools/compilers/roqvq/roq.h
similarity index 100%
rename from neo/tools/compilers/roqvq/roq.h
rename to neo/engine/tools/compilers/roqvq/roq.h
diff --git a/neo/tools/compilers/roqvq/roq.m b/neo/engine/tools/compilers/roqvq/roq.m
similarity index 100%
rename from neo/tools/compilers/roqvq/roq.m
rename to neo/engine/tools/compilers/roqvq/roq.m
diff --git a/neo/tools/compilers/roqvq/roqParam.cpp b/neo/engine/tools/compilers/roqvq/roqParam.cpp
similarity index 100%
rename from neo/tools/compilers/roqvq/roqParam.cpp
rename to neo/engine/tools/compilers/roqvq/roqParam.cpp
diff --git a/neo/tools/compilers/roqvq/roqParam.h b/neo/engine/tools/compilers/roqvq/roqParam.h
similarity index 100%
rename from neo/tools/compilers/roqvq/roqParam.h
rename to neo/engine/tools/compilers/roqvq/roqParam.h
diff --git a/neo/tools/compilers/roqvq/stb_image_write.h b/neo/engine/tools/compilers/roqvq/stb_image_write.h
similarity index 100%
rename from neo/tools/compilers/roqvq/stb_image_write.h
rename to neo/engine/tools/compilers/roqvq/stb_image_write.h
diff --git a/neo/tools/debugger/DebuggerApp.cpp b/neo/engine/tools/debugger/DebuggerApp.cpp
similarity index 100%
rename from neo/tools/debugger/DebuggerApp.cpp
rename to neo/engine/tools/debugger/DebuggerApp.cpp
diff --git a/neo/tools/debugger/DebuggerApp.h b/neo/engine/tools/debugger/DebuggerApp.h
similarity index 100%
rename from neo/tools/debugger/DebuggerApp.h
rename to neo/engine/tools/debugger/DebuggerApp.h
diff --git a/neo/tools/debugger/DebuggerBreakpoint.cpp b/neo/engine/tools/debugger/DebuggerBreakpoint.cpp
similarity index 100%
rename from neo/tools/debugger/DebuggerBreakpoint.cpp
rename to neo/engine/tools/debugger/DebuggerBreakpoint.cpp
diff --git a/neo/tools/debugger/DebuggerBreakpoint.h b/neo/engine/tools/debugger/DebuggerBreakpoint.h
similarity index 100%
rename from neo/tools/debugger/DebuggerBreakpoint.h
rename to neo/engine/tools/debugger/DebuggerBreakpoint.h
diff --git a/neo/tools/debugger/DebuggerClient.cpp b/neo/engine/tools/debugger/DebuggerClient.cpp
similarity index 100%
rename from neo/tools/debugger/DebuggerClient.cpp
rename to neo/engine/tools/debugger/DebuggerClient.cpp
diff --git a/neo/tools/debugger/DebuggerClient.h b/neo/engine/tools/debugger/DebuggerClient.h
similarity index 100%
rename from neo/tools/debugger/DebuggerClient.h
rename to neo/engine/tools/debugger/DebuggerClient.h
diff --git a/neo/tools/debugger/DebuggerFindDlg.cpp b/neo/engine/tools/debugger/DebuggerFindDlg.cpp
similarity index 100%
rename from neo/tools/debugger/DebuggerFindDlg.cpp
rename to neo/engine/tools/debugger/DebuggerFindDlg.cpp
diff --git a/neo/tools/debugger/DebuggerFindDlg.h b/neo/engine/tools/debugger/DebuggerFindDlg.h
similarity index 100%
rename from neo/tools/debugger/DebuggerFindDlg.h
rename to neo/engine/tools/debugger/DebuggerFindDlg.h
diff --git a/neo/tools/debugger/DebuggerMessages.h b/neo/engine/tools/debugger/DebuggerMessages.h
similarity index 100%
rename from neo/tools/debugger/DebuggerMessages.h
rename to neo/engine/tools/debugger/DebuggerMessages.h
diff --git a/neo/tools/debugger/DebuggerQuickWatchDlg.cpp b/neo/engine/tools/debugger/DebuggerQuickWatchDlg.cpp
similarity index 100%
rename from neo/tools/debugger/DebuggerQuickWatchDlg.cpp
rename to neo/engine/tools/debugger/DebuggerQuickWatchDlg.cpp
diff --git a/neo/tools/debugger/DebuggerQuickWatchDlg.h b/neo/engine/tools/debugger/DebuggerQuickWatchDlg.h
similarity index 100%
rename from neo/tools/debugger/DebuggerQuickWatchDlg.h
rename to neo/engine/tools/debugger/DebuggerQuickWatchDlg.h
diff --git a/neo/tools/debugger/DebuggerScript.cpp b/neo/engine/tools/debugger/DebuggerScript.cpp
similarity index 100%
rename from neo/tools/debugger/DebuggerScript.cpp
rename to neo/engine/tools/debugger/DebuggerScript.cpp
diff --git a/neo/tools/debugger/DebuggerScript.h b/neo/engine/tools/debugger/DebuggerScript.h
similarity index 100%
rename from neo/tools/debugger/DebuggerScript.h
rename to neo/engine/tools/debugger/DebuggerScript.h
diff --git a/neo/tools/debugger/DebuggerServer.cpp b/neo/engine/tools/debugger/DebuggerServer.cpp
similarity index 100%
rename from neo/tools/debugger/DebuggerServer.cpp
rename to neo/engine/tools/debugger/DebuggerServer.cpp
diff --git a/neo/tools/debugger/DebuggerServer.h b/neo/engine/tools/debugger/DebuggerServer.h
similarity index 100%
rename from neo/tools/debugger/DebuggerServer.h
rename to neo/engine/tools/debugger/DebuggerServer.h
diff --git a/neo/tools/debugger/DebuggerWindow.cpp b/neo/engine/tools/debugger/DebuggerWindow.cpp
similarity index 100%
rename from neo/tools/debugger/DebuggerWindow.cpp
rename to neo/engine/tools/debugger/DebuggerWindow.cpp
diff --git a/neo/tools/debugger/DebuggerWindow.h b/neo/engine/tools/debugger/DebuggerWindow.h
similarity index 100%
rename from neo/tools/debugger/DebuggerWindow.h
rename to neo/engine/tools/debugger/DebuggerWindow.h
diff --git a/neo/tools/debugger/debugger.cpp b/neo/engine/tools/debugger/debugger.cpp
similarity index 100%
rename from neo/tools/debugger/debugger.cpp
rename to neo/engine/tools/debugger/debugger.cpp
diff --git a/neo/tools/decl/DialogDeclBrowser.cpp b/neo/engine/tools/decl/DialogDeclBrowser.cpp
similarity index 100%
rename from neo/tools/decl/DialogDeclBrowser.cpp
rename to neo/engine/tools/decl/DialogDeclBrowser.cpp
diff --git a/neo/tools/decl/DialogDeclBrowser.h b/neo/engine/tools/decl/DialogDeclBrowser.h
similarity index 100%
rename from neo/tools/decl/DialogDeclBrowser.h
rename to neo/engine/tools/decl/DialogDeclBrowser.h
diff --git a/neo/tools/decl/DialogDeclEditor.cpp b/neo/engine/tools/decl/DialogDeclEditor.cpp
similarity index 100%
rename from neo/tools/decl/DialogDeclEditor.cpp
rename to neo/engine/tools/decl/DialogDeclEditor.cpp
diff --git a/neo/tools/decl/DialogDeclEditor.h b/neo/engine/tools/decl/DialogDeclEditor.h
similarity index 100%
rename from neo/tools/decl/DialogDeclEditor.h
rename to neo/engine/tools/decl/DialogDeclEditor.h
diff --git a/neo/tools/decl/DialogDeclNew.cpp b/neo/engine/tools/decl/DialogDeclNew.cpp
similarity index 100%
rename from neo/tools/decl/DialogDeclNew.cpp
rename to neo/engine/tools/decl/DialogDeclNew.cpp
diff --git a/neo/tools/decl/DialogDeclNew.h b/neo/engine/tools/decl/DialogDeclNew.h
similarity index 100%
rename from neo/tools/decl/DialogDeclNew.h
rename to neo/engine/tools/decl/DialogDeclNew.h
diff --git a/neo/tools/decl/DialogEntityDefEditor.cpp b/neo/engine/tools/decl/DialogEntityDefEditor.cpp
similarity index 100%
rename from neo/tools/decl/DialogEntityDefEditor.cpp
rename to neo/engine/tools/decl/DialogEntityDefEditor.cpp
diff --git a/neo/tools/decl/DialogEntityDefEditor.h b/neo/engine/tools/decl/DialogEntityDefEditor.h
similarity index 100%
rename from neo/tools/decl/DialogEntityDefEditor.h
rename to neo/engine/tools/decl/DialogEntityDefEditor.h
diff --git a/neo/tools/edit_public.h b/neo/engine/tools/edit_public.h
similarity index 100%
rename from neo/tools/edit_public.h
rename to neo/engine/tools/edit_public.h
diff --git a/neo/tools/edit_stub.cpp b/neo/engine/tools/edit_stub.cpp
similarity index 100%
rename from neo/tools/edit_stub.cpp
rename to neo/engine/tools/edit_stub.cpp
diff --git a/neo/tools/guied/GEApp.cpp b/neo/engine/tools/guied/GEApp.cpp
similarity index 100%
rename from neo/tools/guied/GEApp.cpp
rename to neo/engine/tools/guied/GEApp.cpp
diff --git a/neo/tools/guied/GEApp.h b/neo/engine/tools/guied/GEApp.h
similarity index 100%
rename from neo/tools/guied/GEApp.h
rename to neo/engine/tools/guied/GEApp.h
diff --git a/neo/tools/guied/GECheckInDlg.cpp b/neo/engine/tools/guied/GECheckInDlg.cpp
similarity index 100%
rename from neo/tools/guied/GECheckInDlg.cpp
rename to neo/engine/tools/guied/GECheckInDlg.cpp
diff --git a/neo/tools/guied/GEDeleteModifier.cpp b/neo/engine/tools/guied/GEDeleteModifier.cpp
similarity index 100%
rename from neo/tools/guied/GEDeleteModifier.cpp
rename to neo/engine/tools/guied/GEDeleteModifier.cpp
diff --git a/neo/tools/guied/GEDeleteModifier.h b/neo/engine/tools/guied/GEDeleteModifier.h
similarity index 100%
rename from neo/tools/guied/GEDeleteModifier.h
rename to neo/engine/tools/guied/GEDeleteModifier.h
diff --git a/neo/tools/guied/GEHideModifier.cpp b/neo/engine/tools/guied/GEHideModifier.cpp
similarity index 100%
rename from neo/tools/guied/GEHideModifier.cpp
rename to neo/engine/tools/guied/GEHideModifier.cpp
diff --git a/neo/tools/guied/GEHideModifier.h b/neo/engine/tools/guied/GEHideModifier.h
similarity index 100%
rename from neo/tools/guied/GEHideModifier.h
rename to neo/engine/tools/guied/GEHideModifier.h
diff --git a/neo/tools/guied/GEInsertModifier.cpp b/neo/engine/tools/guied/GEInsertModifier.cpp
similarity index 100%
rename from neo/tools/guied/GEInsertModifier.cpp
rename to neo/engine/tools/guied/GEInsertModifier.cpp
diff --git a/neo/tools/guied/GEInsertModifier.h b/neo/engine/tools/guied/GEInsertModifier.h
similarity index 100%
rename from neo/tools/guied/GEInsertModifier.h
rename to neo/engine/tools/guied/GEInsertModifier.h
diff --git a/neo/tools/guied/GEItemPropsDlg.cpp b/neo/engine/tools/guied/GEItemPropsDlg.cpp
similarity index 100%
rename from neo/tools/guied/GEItemPropsDlg.cpp
rename to neo/engine/tools/guied/GEItemPropsDlg.cpp
diff --git a/neo/tools/guied/GEItemPropsDlg.h b/neo/engine/tools/guied/GEItemPropsDlg.h
similarity index 100%
rename from neo/tools/guied/GEItemPropsDlg.h
rename to neo/engine/tools/guied/GEItemPropsDlg.h
diff --git a/neo/tools/guied/GEItemScriptsDlg.cpp b/neo/engine/tools/guied/GEItemScriptsDlg.cpp
similarity index 100%
rename from neo/tools/guied/GEItemScriptsDlg.cpp
rename to neo/engine/tools/guied/GEItemScriptsDlg.cpp
diff --git a/neo/tools/guied/GEItemScriptsDlg.h b/neo/engine/tools/guied/GEItemScriptsDlg.h
similarity index 100%
rename from neo/tools/guied/GEItemScriptsDlg.h
rename to neo/engine/tools/guied/GEItemScriptsDlg.h
diff --git a/neo/tools/guied/GEKeyValueModifier.cpp b/neo/engine/tools/guied/GEKeyValueModifier.cpp
similarity index 100%
rename from neo/tools/guied/GEKeyValueModifier.cpp
rename to neo/engine/tools/guied/GEKeyValueModifier.cpp
diff --git a/neo/tools/guied/GEKeyValueModifier.h b/neo/engine/tools/guied/GEKeyValueModifier.h
similarity index 100%
rename from neo/tools/guied/GEKeyValueModifier.h
rename to neo/engine/tools/guied/GEKeyValueModifier.h
diff --git a/neo/tools/guied/GEModifier.cpp b/neo/engine/tools/guied/GEModifier.cpp
similarity index 100%
rename from neo/tools/guied/GEModifier.cpp
rename to neo/engine/tools/guied/GEModifier.cpp
diff --git a/neo/tools/guied/GEModifier.h b/neo/engine/tools/guied/GEModifier.h
similarity index 100%
rename from neo/tools/guied/GEModifier.h
rename to neo/engine/tools/guied/GEModifier.h
diff --git a/neo/tools/guied/GEModifierGroup.cpp b/neo/engine/tools/guied/GEModifierGroup.cpp
similarity index 100%
rename from neo/tools/guied/GEModifierGroup.cpp
rename to neo/engine/tools/guied/GEModifierGroup.cpp
diff --git a/neo/tools/guied/GEModifierGroup.h b/neo/engine/tools/guied/GEModifierGroup.h
similarity index 100%
rename from neo/tools/guied/GEModifierGroup.h
rename to neo/engine/tools/guied/GEModifierGroup.h
diff --git a/neo/tools/guied/GEModifierStack.cpp b/neo/engine/tools/guied/GEModifierStack.cpp
similarity index 100%
rename from neo/tools/guied/GEModifierStack.cpp
rename to neo/engine/tools/guied/GEModifierStack.cpp
diff --git a/neo/tools/guied/GEModifierStack.h b/neo/engine/tools/guied/GEModifierStack.h
similarity index 100%
rename from neo/tools/guied/GEModifierStack.h
rename to neo/engine/tools/guied/GEModifierStack.h
diff --git a/neo/tools/guied/GEMoveModifier.cpp b/neo/engine/tools/guied/GEMoveModifier.cpp
similarity index 100%
rename from neo/tools/guied/GEMoveModifier.cpp
rename to neo/engine/tools/guied/GEMoveModifier.cpp
diff --git a/neo/tools/guied/GEMoveModifier.h b/neo/engine/tools/guied/GEMoveModifier.h
similarity index 100%
rename from neo/tools/guied/GEMoveModifier.h
rename to neo/engine/tools/guied/GEMoveModifier.h
diff --git a/neo/tools/guied/GENavigator.cpp b/neo/engine/tools/guied/GENavigator.cpp
similarity index 100%
rename from neo/tools/guied/GENavigator.cpp
rename to neo/engine/tools/guied/GENavigator.cpp
diff --git a/neo/tools/guied/GENavigator.h b/neo/engine/tools/guied/GENavigator.h
similarity index 100%
rename from neo/tools/guied/GENavigator.h
rename to neo/engine/tools/guied/GENavigator.h
diff --git a/neo/tools/guied/GEOptions.cpp b/neo/engine/tools/guied/GEOptions.cpp
similarity index 100%
rename from neo/tools/guied/GEOptions.cpp
rename to neo/engine/tools/guied/GEOptions.cpp
diff --git a/neo/tools/guied/GEOptions.h b/neo/engine/tools/guied/GEOptions.h
similarity index 100%
rename from neo/tools/guied/GEOptions.h
rename to neo/engine/tools/guied/GEOptions.h
diff --git a/neo/tools/guied/GEOptionsDlg.cpp b/neo/engine/tools/guied/GEOptionsDlg.cpp
similarity index 100%
rename from neo/tools/guied/GEOptionsDlg.cpp
rename to neo/engine/tools/guied/GEOptionsDlg.cpp
diff --git a/neo/tools/guied/GEOptionsDlg.h b/neo/engine/tools/guied/GEOptionsDlg.h
similarity index 100%
rename from neo/tools/guied/GEOptionsDlg.h
rename to neo/engine/tools/guied/GEOptionsDlg.h
diff --git a/neo/tools/guied/GEProperties.cpp b/neo/engine/tools/guied/GEProperties.cpp
similarity index 100%
rename from neo/tools/guied/GEProperties.cpp
rename to neo/engine/tools/guied/GEProperties.cpp
diff --git a/neo/tools/guied/GEProperties.h b/neo/engine/tools/guied/GEProperties.h
similarity index 100%
rename from neo/tools/guied/GEProperties.h
rename to neo/engine/tools/guied/GEProperties.h
diff --git a/neo/tools/guied/GEPropertyPage.cpp b/neo/engine/tools/guied/GEPropertyPage.cpp
similarity index 100%
rename from neo/tools/guied/GEPropertyPage.cpp
rename to neo/engine/tools/guied/GEPropertyPage.cpp
diff --git a/neo/tools/guied/GEPropertyPage.h b/neo/engine/tools/guied/GEPropertyPage.h
similarity index 100%
rename from neo/tools/guied/GEPropertyPage.h
rename to neo/engine/tools/guied/GEPropertyPage.h
diff --git a/neo/tools/guied/GESelectionMgr.cpp b/neo/engine/tools/guied/GESelectionMgr.cpp
similarity index 100%
rename from neo/tools/guied/GESelectionMgr.cpp
rename to neo/engine/tools/guied/GESelectionMgr.cpp
diff --git a/neo/tools/guied/GESelectionMgr.h b/neo/engine/tools/guied/GESelectionMgr.h
similarity index 100%
rename from neo/tools/guied/GESelectionMgr.h
rename to neo/engine/tools/guied/GESelectionMgr.h
diff --git a/neo/tools/guied/GESizeModifier.cpp b/neo/engine/tools/guied/GESizeModifier.cpp
similarity index 100%
rename from neo/tools/guied/GESizeModifier.cpp
rename to neo/engine/tools/guied/GESizeModifier.cpp
diff --git a/neo/tools/guied/GESizeModifier.h b/neo/engine/tools/guied/GESizeModifier.h
similarity index 100%
rename from neo/tools/guied/GESizeModifier.h
rename to neo/engine/tools/guied/GESizeModifier.h
diff --git a/neo/tools/guied/GEStateModifier.cpp b/neo/engine/tools/guied/GEStateModifier.cpp
similarity index 100%
rename from neo/tools/guied/GEStateModifier.cpp
rename to neo/engine/tools/guied/GEStateModifier.cpp
diff --git a/neo/tools/guied/GEStateModifier.h b/neo/engine/tools/guied/GEStateModifier.h
similarity index 100%
rename from neo/tools/guied/GEStateModifier.h
rename to neo/engine/tools/guied/GEStateModifier.h
diff --git a/neo/tools/guied/GEStatusBar.cpp b/neo/engine/tools/guied/GEStatusBar.cpp
similarity index 100%
rename from neo/tools/guied/GEStatusBar.cpp
rename to neo/engine/tools/guied/GEStatusBar.cpp
diff --git a/neo/tools/guied/GEStatusBar.h b/neo/engine/tools/guied/GEStatusBar.h
similarity index 100%
rename from neo/tools/guied/GEStatusBar.h
rename to neo/engine/tools/guied/GEStatusBar.h
diff --git a/neo/tools/guied/GETransformer.cpp b/neo/engine/tools/guied/GETransformer.cpp
similarity index 100%
rename from neo/tools/guied/GETransformer.cpp
rename to neo/engine/tools/guied/GETransformer.cpp
diff --git a/neo/tools/guied/GETransformer.h b/neo/engine/tools/guied/GETransformer.h
similarity index 100%
rename from neo/tools/guied/GETransformer.h
rename to neo/engine/tools/guied/GETransformer.h
diff --git a/neo/tools/guied/GEViewer.cpp b/neo/engine/tools/guied/GEViewer.cpp
similarity index 100%
rename from neo/tools/guied/GEViewer.cpp
rename to neo/engine/tools/guied/GEViewer.cpp
diff --git a/neo/tools/guied/GEViewer.h b/neo/engine/tools/guied/GEViewer.h
similarity index 100%
rename from neo/tools/guied/GEViewer.h
rename to neo/engine/tools/guied/GEViewer.h
diff --git a/neo/tools/guied/GEWindowWrapper.cpp b/neo/engine/tools/guied/GEWindowWrapper.cpp
similarity index 100%
rename from neo/tools/guied/GEWindowWrapper.cpp
rename to neo/engine/tools/guied/GEWindowWrapper.cpp
diff --git a/neo/tools/guied/GEWindowWrapper.h b/neo/engine/tools/guied/GEWindowWrapper.h
similarity index 100%
rename from neo/tools/guied/GEWindowWrapper.h
rename to neo/engine/tools/guied/GEWindowWrapper.h
diff --git a/neo/tools/guied/GEWindowWrapper_stub.cpp b/neo/engine/tools/guied/GEWindowWrapper_stub.cpp
similarity index 100%
rename from neo/tools/guied/GEWindowWrapper_stub.cpp
rename to neo/engine/tools/guied/GEWindowWrapper_stub.cpp
diff --git a/neo/tools/guied/GEWorkspace.cpp b/neo/engine/tools/guied/GEWorkspace.cpp
similarity index 100%
rename from neo/tools/guied/GEWorkspace.cpp
rename to neo/engine/tools/guied/GEWorkspace.cpp
diff --git a/neo/tools/guied/GEWorkspace.h b/neo/engine/tools/guied/GEWorkspace.h
similarity index 100%
rename from neo/tools/guied/GEWorkspace.h
rename to neo/engine/tools/guied/GEWorkspace.h
diff --git a/neo/tools/guied/GEWorkspaceFile.cpp b/neo/engine/tools/guied/GEWorkspaceFile.cpp
similarity index 100%
rename from neo/tools/guied/GEWorkspaceFile.cpp
rename to neo/engine/tools/guied/GEWorkspaceFile.cpp
diff --git a/neo/tools/guied/GEZOrderModifier.cpp b/neo/engine/tools/guied/GEZOrderModifier.cpp
similarity index 100%
rename from neo/tools/guied/GEZOrderModifier.cpp
rename to neo/engine/tools/guied/GEZOrderModifier.cpp
diff --git a/neo/tools/guied/GEZOrderModifier.h b/neo/engine/tools/guied/GEZOrderModifier.h
similarity index 100%
rename from neo/tools/guied/GEZOrderModifier.h
rename to neo/engine/tools/guied/GEZOrderModifier.h
diff --git a/neo/tools/guied/guied.cpp b/neo/engine/tools/guied/guied.cpp
similarity index 100%
rename from neo/tools/guied/guied.cpp
rename to neo/engine/tools/guied/guied.cpp
diff --git a/neo/tools/materialeditor/ConsoleView.cpp b/neo/engine/tools/materialeditor/ConsoleView.cpp
similarity index 100%
rename from neo/tools/materialeditor/ConsoleView.cpp
rename to neo/engine/tools/materialeditor/ConsoleView.cpp
diff --git a/neo/tools/materialeditor/ConsoleView.h b/neo/engine/tools/materialeditor/ConsoleView.h
similarity index 100%
rename from neo/tools/materialeditor/ConsoleView.h
rename to neo/engine/tools/materialeditor/ConsoleView.h
diff --git a/neo/tools/materialeditor/FindDialog.cpp b/neo/engine/tools/materialeditor/FindDialog.cpp
similarity index 100%
rename from neo/tools/materialeditor/FindDialog.cpp
rename to neo/engine/tools/materialeditor/FindDialog.cpp
diff --git a/neo/tools/materialeditor/FindDialog.h b/neo/engine/tools/materialeditor/FindDialog.h
similarity index 100%
rename from neo/tools/materialeditor/FindDialog.h
rename to neo/engine/tools/materialeditor/FindDialog.h
diff --git a/neo/tools/materialeditor/MEMainFrame.cpp b/neo/engine/tools/materialeditor/MEMainFrame.cpp
similarity index 100%
rename from neo/tools/materialeditor/MEMainFrame.cpp
rename to neo/engine/tools/materialeditor/MEMainFrame.cpp
diff --git a/neo/tools/materialeditor/MEMainFrame.h b/neo/engine/tools/materialeditor/MEMainFrame.h
similarity index 100%
rename from neo/tools/materialeditor/MEMainFrame.h
rename to neo/engine/tools/materialeditor/MEMainFrame.h
diff --git a/neo/tools/materialeditor/MEOptions.cpp b/neo/engine/tools/materialeditor/MEOptions.cpp
similarity index 100%
rename from neo/tools/materialeditor/MEOptions.cpp
rename to neo/engine/tools/materialeditor/MEOptions.cpp
diff --git a/neo/tools/materialeditor/MEOptions.h b/neo/engine/tools/materialeditor/MEOptions.h
similarity index 100%
rename from neo/tools/materialeditor/MEOptions.h
rename to neo/engine/tools/materialeditor/MEOptions.h
diff --git a/neo/tools/materialeditor/MaterialDef.cpp b/neo/engine/tools/materialeditor/MaterialDef.cpp
similarity index 100%
rename from neo/tools/materialeditor/MaterialDef.cpp
rename to neo/engine/tools/materialeditor/MaterialDef.cpp
diff --git a/neo/tools/materialeditor/MaterialDef.h b/neo/engine/tools/materialeditor/MaterialDef.h
similarity index 100%
rename from neo/tools/materialeditor/MaterialDef.h
rename to neo/engine/tools/materialeditor/MaterialDef.h
diff --git a/neo/tools/materialeditor/MaterialDoc.cpp b/neo/engine/tools/materialeditor/MaterialDoc.cpp
similarity index 100%
rename from neo/tools/materialeditor/MaterialDoc.cpp
rename to neo/engine/tools/materialeditor/MaterialDoc.cpp
diff --git a/neo/tools/materialeditor/MaterialDoc.h b/neo/engine/tools/materialeditor/MaterialDoc.h
similarity index 100%
rename from neo/tools/materialeditor/MaterialDoc.h
rename to neo/engine/tools/materialeditor/MaterialDoc.h
diff --git a/neo/tools/materialeditor/MaterialDocManager.cpp b/neo/engine/tools/materialeditor/MaterialDocManager.cpp
similarity index 100%
rename from neo/tools/materialeditor/MaterialDocManager.cpp
rename to neo/engine/tools/materialeditor/MaterialDocManager.cpp
diff --git a/neo/tools/materialeditor/MaterialDocManager.h b/neo/engine/tools/materialeditor/MaterialDocManager.h
similarity index 100%
rename from neo/tools/materialeditor/MaterialDocManager.h
rename to neo/engine/tools/materialeditor/MaterialDocManager.h
diff --git a/neo/tools/materialeditor/MaterialEditView.cpp b/neo/engine/tools/materialeditor/MaterialEditView.cpp
similarity index 100%
rename from neo/tools/materialeditor/MaterialEditView.cpp
rename to neo/engine/tools/materialeditor/MaterialEditView.cpp
diff --git a/neo/tools/materialeditor/MaterialEditView.h b/neo/engine/tools/materialeditor/MaterialEditView.h
similarity index 100%
rename from neo/tools/materialeditor/MaterialEditView.h
rename to neo/engine/tools/materialeditor/MaterialEditView.h
diff --git a/neo/tools/materialeditor/MaterialEditor.cpp b/neo/engine/tools/materialeditor/MaterialEditor.cpp
similarity index 100%
rename from neo/tools/materialeditor/MaterialEditor.cpp
rename to neo/engine/tools/materialeditor/MaterialEditor.cpp
diff --git a/neo/tools/materialeditor/MaterialEditor.h b/neo/engine/tools/materialeditor/MaterialEditor.h
similarity index 100%
rename from neo/tools/materialeditor/MaterialEditor.h
rename to neo/engine/tools/materialeditor/MaterialEditor.h
diff --git a/neo/tools/materialeditor/MaterialModifier.cpp b/neo/engine/tools/materialeditor/MaterialModifier.cpp
similarity index 100%
rename from neo/tools/materialeditor/MaterialModifier.cpp
rename to neo/engine/tools/materialeditor/MaterialModifier.cpp
diff --git a/neo/tools/materialeditor/MaterialModifier.h b/neo/engine/tools/materialeditor/MaterialModifier.h
similarity index 100%
rename from neo/tools/materialeditor/MaterialModifier.h
rename to neo/engine/tools/materialeditor/MaterialModifier.h
diff --git a/neo/tools/materialeditor/MaterialPreviewPropView.cpp b/neo/engine/tools/materialeditor/MaterialPreviewPropView.cpp
similarity index 100%
rename from neo/tools/materialeditor/MaterialPreviewPropView.cpp
rename to neo/engine/tools/materialeditor/MaterialPreviewPropView.cpp
diff --git a/neo/tools/materialeditor/MaterialPreviewPropView.h b/neo/engine/tools/materialeditor/MaterialPreviewPropView.h
similarity index 100%
rename from neo/tools/materialeditor/MaterialPreviewPropView.h
rename to neo/engine/tools/materialeditor/MaterialPreviewPropView.h
diff --git a/neo/tools/materialeditor/MaterialPreviewView.cpp b/neo/engine/tools/materialeditor/MaterialPreviewView.cpp
similarity index 100%
rename from neo/tools/materialeditor/MaterialPreviewView.cpp
rename to neo/engine/tools/materialeditor/MaterialPreviewView.cpp
diff --git a/neo/tools/materialeditor/MaterialPreviewView.h b/neo/engine/tools/materialeditor/MaterialPreviewView.h
similarity index 100%
rename from neo/tools/materialeditor/MaterialPreviewView.h
rename to neo/engine/tools/materialeditor/MaterialPreviewView.h
diff --git a/neo/tools/materialeditor/MaterialPropTreeView.cpp b/neo/engine/tools/materialeditor/MaterialPropTreeView.cpp
similarity index 100%
rename from neo/tools/materialeditor/MaterialPropTreeView.cpp
rename to neo/engine/tools/materialeditor/MaterialPropTreeView.cpp
diff --git a/neo/tools/materialeditor/MaterialPropTreeView.h b/neo/engine/tools/materialeditor/MaterialPropTreeView.h
similarity index 100%
rename from neo/tools/materialeditor/MaterialPropTreeView.h
rename to neo/engine/tools/materialeditor/MaterialPropTreeView.h
diff --git a/neo/tools/materialeditor/MaterialTreeView.cpp b/neo/engine/tools/materialeditor/MaterialTreeView.cpp
similarity index 100%
rename from neo/tools/materialeditor/MaterialTreeView.cpp
rename to neo/engine/tools/materialeditor/MaterialTreeView.cpp
diff --git a/neo/tools/materialeditor/MaterialTreeView.h b/neo/engine/tools/materialeditor/MaterialTreeView.h
similarity index 100%
rename from neo/tools/materialeditor/MaterialTreeView.h
rename to neo/engine/tools/materialeditor/MaterialTreeView.h
diff --git a/neo/tools/materialeditor/MaterialView.cpp b/neo/engine/tools/materialeditor/MaterialView.cpp
similarity index 100%
rename from neo/tools/materialeditor/MaterialView.cpp
rename to neo/engine/tools/materialeditor/MaterialView.cpp
diff --git a/neo/tools/materialeditor/MaterialView.h b/neo/engine/tools/materialeditor/MaterialView.h
similarity index 100%
rename from neo/tools/materialeditor/MaterialView.h
rename to neo/engine/tools/materialeditor/MaterialView.h
diff --git a/neo/tools/materialeditor/StageView.cpp b/neo/engine/tools/materialeditor/StageView.cpp
similarity index 100%
rename from neo/tools/materialeditor/StageView.cpp
rename to neo/engine/tools/materialeditor/StageView.cpp
diff --git a/neo/tools/materialeditor/StageView.h b/neo/engine/tools/materialeditor/StageView.h
similarity index 100%
rename from neo/tools/materialeditor/StageView.h
rename to neo/engine/tools/materialeditor/StageView.h
diff --git a/neo/tools/materialeditor/ToggleListView.cpp b/neo/engine/tools/materialeditor/ToggleListView.cpp
similarity index 100%
rename from neo/tools/materialeditor/ToggleListView.cpp
rename to neo/engine/tools/materialeditor/ToggleListView.cpp
diff --git a/neo/tools/materialeditor/ToggleListView.h b/neo/engine/tools/materialeditor/ToggleListView.h
similarity index 100%
rename from neo/tools/materialeditor/ToggleListView.h
rename to neo/engine/tools/materialeditor/ToggleListView.h
diff --git a/neo/tools/particle/DialogParticleEditor.cpp b/neo/engine/tools/particle/DialogParticleEditor.cpp
similarity index 99%
rename from neo/tools/particle/DialogParticleEditor.cpp
rename to neo/engine/tools/particle/DialogParticleEditor.cpp
index 8d2782f6..c0e2b363 100644
--- a/neo/tools/particle/DialogParticleEditor.cpp
+++ b/neo/engine/tools/particle/DialogParticleEditor.cpp
@@ -29,7 +29,6 @@ If you have questions concerning this license or the applicable additional terms
#include "precompiled.h"
#pragma hdrstop
-#include "../../game/game.h"
#include "../../sys/win32/win_local.h"
#include "../../sys/win32/rc/common_resource.h"
#include "../../sys/win32/rc/Radiant_resource.h"
diff --git a/neo/tools/particle/DialogParticleEditor.h b/neo/engine/tools/particle/DialogParticleEditor.h
similarity index 100%
rename from neo/tools/particle/DialogParticleEditor.h
rename to neo/engine/tools/particle/DialogParticleEditor.h
diff --git a/neo/tools/pda/DialogPDAEditor.cpp b/neo/engine/tools/pda/DialogPDAEditor.cpp
similarity index 99%
rename from neo/tools/pda/DialogPDAEditor.cpp
rename to neo/engine/tools/pda/DialogPDAEditor.cpp
index bf370a0c..cda566c8 100644
--- a/neo/tools/pda/DialogPDAEditor.cpp
+++ b/neo/engine/tools/pda/DialogPDAEditor.cpp
@@ -29,7 +29,6 @@ If you have questions concerning this license or the applicable additional terms
#include "precompiled.h"
#pragma hdrstop
-#include "../../game/game.h"
#include "../../sys/win32/win_local.h"
#include "../../sys/win32/rc/common_resource.h"
#include "../../sys/win32/rc/PDAEditor_resource.h"
diff --git a/neo/tools/pda/DialogPDAEditor.h b/neo/engine/tools/pda/DialogPDAEditor.h
similarity index 100%
rename from neo/tools/pda/DialogPDAEditor.h
rename to neo/engine/tools/pda/DialogPDAEditor.h
diff --git a/neo/tools/radiant/CSG.CPP b/neo/engine/tools/radiant/CSG.CPP
similarity index 100%
rename from neo/tools/radiant/CSG.CPP
rename to neo/engine/tools/radiant/CSG.CPP
diff --git a/neo/tools/radiant/CamWnd.cpp b/neo/engine/tools/radiant/CamWnd.cpp
similarity index 100%
rename from neo/tools/radiant/CamWnd.cpp
rename to neo/engine/tools/radiant/CamWnd.cpp
diff --git a/neo/tools/radiant/CamWnd.h b/neo/engine/tools/radiant/CamWnd.h
similarity index 100%
rename from neo/tools/radiant/CamWnd.h
rename to neo/engine/tools/radiant/CamWnd.h
diff --git a/neo/tools/radiant/CameraTargetDlg.cpp b/neo/engine/tools/radiant/CameraTargetDlg.cpp
similarity index 100%
rename from neo/tools/radiant/CameraTargetDlg.cpp
rename to neo/engine/tools/radiant/CameraTargetDlg.cpp
diff --git a/neo/tools/radiant/CameraTargetDlg.h b/neo/engine/tools/radiant/CameraTargetDlg.h
similarity index 100%
rename from neo/tools/radiant/CameraTargetDlg.h
rename to neo/engine/tools/radiant/CameraTargetDlg.h
diff --git a/neo/tools/radiant/CapDialog.cpp b/neo/engine/tools/radiant/CapDialog.cpp
similarity index 100%
rename from neo/tools/radiant/CapDialog.cpp
rename to neo/engine/tools/radiant/CapDialog.cpp
diff --git a/neo/tools/radiant/CapDialog.h b/neo/engine/tools/radiant/CapDialog.h
similarity index 100%
rename from neo/tools/radiant/CapDialog.h
rename to neo/engine/tools/radiant/CapDialog.h
diff --git a/neo/tools/radiant/CommandsDlg.cpp b/neo/engine/tools/radiant/CommandsDlg.cpp
similarity index 100%
rename from neo/tools/radiant/CommandsDlg.cpp
rename to neo/engine/tools/radiant/CommandsDlg.cpp
diff --git a/neo/tools/radiant/CommandsDlg.h b/neo/engine/tools/radiant/CommandsDlg.h
similarity index 100%
rename from neo/tools/radiant/CommandsDlg.h
rename to neo/engine/tools/radiant/CommandsDlg.h
diff --git a/neo/tools/radiant/CommentsDlg.cpp b/neo/engine/tools/radiant/CommentsDlg.cpp
similarity index 100%
rename from neo/tools/radiant/CommentsDlg.cpp
rename to neo/engine/tools/radiant/CommentsDlg.cpp
diff --git a/neo/tools/radiant/CommentsDlg.h b/neo/engine/tools/radiant/CommentsDlg.h
similarity index 100%
rename from neo/tools/radiant/CommentsDlg.h
rename to neo/engine/tools/radiant/CommentsDlg.h
diff --git a/neo/tools/radiant/ConsoleDlg.cpp b/neo/engine/tools/radiant/ConsoleDlg.cpp
similarity index 100%
rename from neo/tools/radiant/ConsoleDlg.cpp
rename to neo/engine/tools/radiant/ConsoleDlg.cpp
diff --git a/neo/tools/radiant/ConsoleDlg.h b/neo/engine/tools/radiant/ConsoleDlg.h
similarity index 100%
rename from neo/tools/radiant/ConsoleDlg.h
rename to neo/engine/tools/radiant/ConsoleDlg.h
diff --git a/neo/tools/radiant/CurveDlg.cpp b/neo/engine/tools/radiant/CurveDlg.cpp
similarity index 100%
rename from neo/tools/radiant/CurveDlg.cpp
rename to neo/engine/tools/radiant/CurveDlg.cpp
diff --git a/neo/tools/radiant/CurveDlg.h b/neo/engine/tools/radiant/CurveDlg.h
similarity index 100%
rename from neo/tools/radiant/CurveDlg.h
rename to neo/engine/tools/radiant/CurveDlg.h
diff --git a/neo/tools/radiant/DRAG.CPP b/neo/engine/tools/radiant/DRAG.CPP
similarity index 100%
rename from neo/tools/radiant/DRAG.CPP
rename to neo/engine/tools/radiant/DRAG.CPP
diff --git a/neo/tools/radiant/DialogInfo.cpp b/neo/engine/tools/radiant/DialogInfo.cpp
similarity index 100%
rename from neo/tools/radiant/DialogInfo.cpp
rename to neo/engine/tools/radiant/DialogInfo.cpp
diff --git a/neo/tools/radiant/DialogInfo.h b/neo/engine/tools/radiant/DialogInfo.h
similarity index 100%
rename from neo/tools/radiant/DialogInfo.h
rename to neo/engine/tools/radiant/DialogInfo.h
diff --git a/neo/tools/radiant/DialogTextures.cpp b/neo/engine/tools/radiant/DialogTextures.cpp
similarity index 100%
rename from neo/tools/radiant/DialogTextures.cpp
rename to neo/engine/tools/radiant/DialogTextures.cpp
diff --git a/neo/tools/radiant/DialogTextures.h b/neo/engine/tools/radiant/DialogTextures.h
similarity index 100%
rename from neo/tools/radiant/DialogTextures.h
rename to neo/engine/tools/radiant/DialogTextures.h
diff --git a/neo/tools/radiant/DialogThick.cpp b/neo/engine/tools/radiant/DialogThick.cpp
similarity index 100%
rename from neo/tools/radiant/DialogThick.cpp
rename to neo/engine/tools/radiant/DialogThick.cpp
diff --git a/neo/tools/radiant/DialogThick.h b/neo/engine/tools/radiant/DialogThick.h
similarity index 100%
rename from neo/tools/radiant/DialogThick.h
rename to neo/engine/tools/radiant/DialogThick.h
diff --git a/neo/tools/radiant/DlgCamera.cpp b/neo/engine/tools/radiant/DlgCamera.cpp
similarity index 100%
rename from neo/tools/radiant/DlgCamera.cpp
rename to neo/engine/tools/radiant/DlgCamera.cpp
diff --git a/neo/tools/radiant/DlgCamera.h b/neo/engine/tools/radiant/DlgCamera.h
similarity index 100%
rename from neo/tools/radiant/DlgCamera.h
rename to neo/engine/tools/radiant/DlgCamera.h
diff --git a/neo/tools/radiant/DlgEvent.cpp b/neo/engine/tools/radiant/DlgEvent.cpp
similarity index 100%
rename from neo/tools/radiant/DlgEvent.cpp
rename to neo/engine/tools/radiant/DlgEvent.cpp
diff --git a/neo/tools/radiant/DlgEvent.h b/neo/engine/tools/radiant/DlgEvent.h
similarity index 100%
rename from neo/tools/radiant/DlgEvent.h
rename to neo/engine/tools/radiant/DlgEvent.h
diff --git a/neo/engine/tools/radiant/DukeMapImporter.cpp b/neo/engine/tools/radiant/DukeMapImporter.cpp
new file mode 100644
index 00000000..30e6611f
--- /dev/null
+++ b/neo/engine/tools/radiant/DukeMapImporter.cpp
@@ -0,0 +1,2465 @@
+#include "precompiled.h"
+#pragma hdrstop
+
+#include "qe3.h"
+#include "Radiant.h"
+
+#define DUKE_BUILD_IMPORTER_PATCH_VERSION "V5 real-face-planepts hole-bridged 2026-04-26"
+
+// These are present in the classic Doom 3 Radiant/DoomEdit tree.
+// In some forks you may need to include the exact headers instead of externs.
+extern brush_t active_brushes;
+extern brush_t selected_brushes;
+extern entity_t* world_entity;
+
+extern brush_t* Brush_Alloc(void);
+extern face_t* Face_Alloc(void);
+extern void Brush_AddToList(brush_t* b, brush_t* list);
+extern void Entity_LinkBrush(entity_t* e, brush_t* b);
+extern void Brush_Build(brush_t* b, bool bSnap, bool bMarkMap, bool bConvert, bool updateLights);
+extern void Sys_UpdateWindows(int nBits);
+extern const idMaterial* Texture_ForName(const char* name);
+
+#ifndef W_ALL
+#define W_ALL 0xFFFFFFFF
+#endif
+
+class idDukeBuildMapImporter {
+public:
+ struct Options {
+ Options() {
+ mapScale = 1.0f; // Build XY units -> Doom units
+ zScale = 1.0f / 16.0f; // Build z is much finer
+ flipY = true; // Build Y -> Doom -Y
+ zOffset = 0.0f;
+
+ wallThickness = 8.0f;
+ floorCeilingThickness = 8.0f;
+
+ importFloors = true;
+ importCeilings = true;
+ importWalls = true;
+ importMaskedWalls = false; // masked portal walls become solid if true
+
+ defaultTileWidth = 64;
+ defaultTileHeight = 64;
+
+ // Build repeat tuning.
+ // These give sensible Duke-style results and keep repeat/pan behavior visible.
+ // If your imported maps look uniformly too stretched or too dense, tune these.
+ wallRepeatBase = 8.0f;
+ flatRepeatBase = 16.0f;
+
+ caulkMaterial = "textures/common/caulk";
+ tileMaterialPrefix = "textures/duke3d/tiles";
+ }
+
+ float mapScale;
+ float zScale;
+ bool flipY;
+ float zOffset;
+
+ float wallThickness;
+ float floorCeilingThickness;
+
+ bool importFloors;
+ bool importCeilings;
+ bool importWalls;
+ bool importMaskedWalls;
+
+ int defaultTileWidth;
+ int defaultTileHeight;
+
+ float wallRepeatBase;
+ float flatRepeatBase;
+
+ idStr caulkMaterial;
+ idStr tileMaterialPrefix;
+ };
+
+public:
+ idDukeBuildMapImporter() {
+ lastError.Clear();
+ }
+
+ const char* GetLastError() const {
+ return lastError.c_str();
+ }
+
+ bool ImportIntoCurrentRadiantMap(const char* buildMapFileName, const Options& opt = Options()) {
+ options = opt;
+ lastError.Clear();
+
+ if (world_entity == NULL) {
+ lastError = "No world entity exists in the current Radiant map.";
+ return false;
+ }
+
+ if (!LoadBuildMap(buildMapFileName)) {
+ return false;
+ }
+
+ ResetRunStats();
+ PrintPatchVerificationStats(buildMapFileName);
+
+ int madeBrushes = 0;
+
+ for (int s = 0; s < sectors.Num(); s++) {
+ BuildSector& sec = sectors[s];
+
+ if (sec.wallptr < 0 || sec.wallnum < 3 || sec.wallptr + sec.wallnum > walls.Num()) {
+ continue;
+ }
+
+ if (options.importWalls) {
+ madeBrushes += ImportSectorWalls(s);
+ }
+
+ if (options.importFloors || options.importCeilings) {
+ madeBrushes += ImportSectorFlats(s);
+ }
+ }
+
+ Sys_UpdateWindows(W_ALL);
+
+ if (madeBrushes <= 0) {
+ lastError = "MAP loaded, but no brushes were generated.";
+ return false;
+ }
+
+ common->Printf(
+ "DukeBuildMapImporter %s: imported %d brushes from '%s' rejectedBrushes=%d rejectedWallSpans=%d rejectedFlatTris=%d rejectedDegenerateSides=%d\n",
+ DUKE_BUILD_IMPORTER_PATCH_VERSION,
+ madeBrushes,
+ buildMapFileName,
+ runStats.rejectedBrushes,
+ runStats.rejectedWallSpans,
+ runStats.rejectedFlatTris,
+ runStats.rejectedDegenerateSides
+ );
+ return true;
+ }
+
+ /*
+ Helper for generating:
+ base/materials/duke3d_tiles.mtr
+
+ Example:
+ idDukeBuildMapImporter::WriteDukeTileMaterialFile(
+ "c:/doom3/base/materials/duke3d_tiles.mtr", 0, 4095 );
+ */
+ static bool WriteDukeTileMaterialFile(const char* outFileName, int firstTile, int lastTile) {
+ // FILE* f = fopen(outFileName, "wt");
+ // if (f == NULL) {
+ // return false;
+ // }
+ //
+ // for (int i = firstTile; i <= lastTile; i++) {
+ // fprintf(f,
+ // "textures/duke3d/tiles/%d\n"
+ // "{\n"
+ // "\tqer_editorimage textures/duke3d/tiles/%d.tga\n"
+ // "\tdiffusemap textures/duke3d/tiles/%d.tga\n"
+ // "}\n\n",
+ // i, i, i);
+ // }
+ //
+ // fclose(f);
+ return true;
+ }
+
+private:
+ /*
+ ===========================================================================
+
+ Build map structs
+
+ ===========================================================================
+ */
+
+ struct BuildSector {
+ short wallptr;
+ short wallnum;
+ int ceilingz;
+ int floorz;
+ short ceilingstat;
+ short floorstat;
+ short ceilingpicnum;
+ short ceilingheinum;
+ byte ceilingshade;
+ byte ceilingpal;
+ byte ceilingxpanning;
+ byte ceilingypanning;
+ short floorpicnum;
+ short floorheinum;
+ byte floorshade;
+ byte floorpal;
+ byte floorxpanning;
+ byte floorypanning;
+ byte visibility;
+ byte filler;
+ short lotag;
+ short hitag;
+ short extra;
+ };
+
+ struct BuildWall {
+ int x;
+ int y;
+ short point2;
+ short nextwall;
+ short nextsector;
+ short cstat;
+ short picnum;
+ short overpicnum;
+ byte shade;
+ byte pal;
+ byte xrepeat;
+ byte yrepeat;
+ byte xpanning;
+ byte ypanning;
+ short lotag;
+ short hitag;
+ short extra;
+ };
+
+ struct BuildSprite {
+ int x, y, z;
+ short cstat;
+ short picnum;
+ signed char shade;
+ byte pal;
+ byte clipdist;
+ byte filler;
+ byte xrepeat;
+ byte yrepeat;
+ signed char xoffset;
+ signed char yoffset;
+ short sectnum;
+ short statnum;
+ short ang;
+ short owner;
+ short xvel, yvel, zvel;
+ short lotag, hitag, extra;
+ };
+
+ struct TileInfo {
+ int w;
+ int h;
+ };
+
+ struct SideDesc {
+ idPlane plane;
+ idStr material;
+ brushprimit_texdef_t bp;
+
+ // DoomEdit/Radiant may rebuild face planes from planepts during
+ // Brush_Build. Keep these as real points from the generated face,
+ // not huge synthetic base-plane points, so failing brush windings
+ // don't leave enormous editor triangles behind.
+ idVec3 planePts[3];
+ };
+
+ struct Tri {
+ int a;
+ int b;
+ int c;
+ };
+
+ struct SectorLoop {
+ idList wallIndices;
+ idList pts2;
+ float area;
+ };
+
+ struct FlatPolyPoint {
+ idVec2 p; // Doom-space XY, used for triangulation
+ int buildX; // Build-space XY, used for slope Z sampling
+ int buildY;
+ };
+
+ struct RunStats {
+ int rejectedBrushes;
+ int rejectedWallSpans;
+ int rejectedFlatTris;
+ int rejectedDegenerateSides;
+ int rejectedBrushLogCount;
+ };
+
+private:
+ Options options;
+ idStr lastError;
+
+ idList sectors;
+ idList walls;
+ idList sprites;
+ RunStats runStats;
+
+ void ResetRunStats() {
+ memset(&runStats, 0, sizeof(runStats));
+ }
+
+ void LogRejectedBrush(const char* context, const char* reason) {
+ runStats.rejectedBrushes++;
+
+ if (runStats.rejectedBrushLogCount < 64) {
+ common->Printf(
+ "DukeBuildMapImporter %s: rejected brush: %s : %s\n",
+ DUKE_BUILD_IMPORTER_PATCH_VERSION,
+ context ? context : "",
+ reason ? reason : "invalid brush"
+ );
+ }
+ else if (runStats.rejectedBrushLogCount == 64) {
+ common->Printf(
+ "DukeBuildMapImporter %s: further rejected-brush messages suppressed.\n",
+ DUKE_BUILD_IMPORTER_PATCH_VERSION
+ );
+ }
+
+ runStats.rejectedBrushLogCount++;
+ }
+
+ void PrintPatchVerificationStats(const char* buildMapFileName) {
+ int slopedFloors = 0;
+ int slopedCeilings = 0;
+ int multiLoopSectors = 0;
+ int badPoint2Walls = 0;
+
+ for (int s = 0; s < sectors.Num(); s++) {
+ const BuildSector& sec = sectors[s];
+ if ((sec.floorstat & 2) && sec.floorheinum != 0) {
+ slopedFloors++;
+ }
+ if ((sec.ceilingstat & 2) && sec.ceilingheinum != 0) {
+ slopedCeilings++;
+ }
+
+ int loops = 0;
+ if (sec.wallptr >= 0 && sec.wallnum >= 3 && sec.wallptr + sec.wallnum <= walls.Num()) {
+ idList used;
+ used.SetNum(sec.wallnum);
+ for (int i = 0; i < used.Num(); i++) {
+ used[i] = 0;
+ }
+
+ for (int startOfs = 0; startOfs < sec.wallnum; startOfs++) {
+ if (used[startOfs]) {
+ continue;
+ }
+
+ const int startWall = sec.wallptr + startOfs;
+ int wi = startWall;
+ bool closed = false;
+
+ for (int guard = 0; guard <= sec.wallnum; guard++) {
+ if (wi < sec.wallptr || wi >= sec.wallptr + sec.wallnum) {
+ badPoint2Walls++;
+ break;
+ }
+
+ const int local = wi - sec.wallptr;
+ if (used[local]) {
+ closed = (wi == startWall);
+ break;
+ }
+
+ used[local] = 1;
+ const BuildWall& w = walls[wi];
+
+ if (w.point2 == startWall) {
+ closed = true;
+ break;
+ }
+
+ wi = w.point2;
+ }
+
+ if (closed) {
+ loops++;
+ }
+ }
+ }
+
+ if (loops > 1) {
+ multiLoopSectors++;
+ }
+ }
+
+ common->Printf(
+ "DukeBuildMapImporter %s ACTIVE: file='%s' sectors=%d walls=%d sprites=%d slopedFloors=%d slopedCeilings=%d multiLoopSectors=%d badPoint2Walls=%d\n",
+ DUKE_BUILD_IMPORTER_PATCH_VERSION,
+ buildMapFileName ? buildMapFileName : "",
+ sectors.Num(),
+ walls.Num(),
+ sprites.Num(),
+ slopedFloors,
+ slopedCeilings,
+ multiLoopSectors,
+ badPoint2Walls
+ );
+ }
+
+ /*
+ ===========================================================================
+ Binary loader
+ ===========================================================================
+ */
+
+ static short ReadLE16(FILE* f) {
+ byte b[2];
+ fread(b, 1, 2, f);
+ return (short)(b[0] | (b[1] << 8));
+ }
+
+ static int ReadLE32(FILE* f) {
+ byte b[4];
+ fread(b, 1, 4, f);
+ return (int)(b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24));
+ }
+
+ static byte ReadU8(FILE* f) {
+ byte b = 0;
+ fread(&b, 1, 1, f);
+ return b;
+ }
+
+ static signed char ReadS8(FILE* f) {
+ signed char b = 0;
+ fread(&b, 1, 1, f);
+ return b;
+ }
+
+ bool LoadBuildMap(const char* fileName) {
+ FILE* f = fopen(fileName, "rb");
+ if (f == NULL) {
+ lastError = va("Could not open Build MAP file '%s'.", fileName);
+ return false;
+ }
+
+ const int mapVersion = ReadLE32(f);
+
+ // Duke3D/Build commercial maps are normally version 7.
+ // Some derivatives may use 8 or 9, but the sector/wall core is similar.
+ if (mapVersion != 7 && mapVersion != 8 && mapVersion != 9) {
+ fclose(f);
+ lastError = va("Unsupported Build MAP version %d. Expected 7, 8, or 9.", mapVersion);
+ return false;
+ }
+
+ // Player start. We read and ignore it here.
+ const int startX = ReadLE32(f);
+ const int startY = ReadLE32(f);
+ const int startZ = ReadLE32(f);
+ const short startAng = ReadLE16(f);
+ const short startSect = ReadLE16(f);
+ (void)startX;
+ (void)startY;
+ (void)startZ;
+ (void)startAng;
+ (void)startSect;
+
+ const short numSectors = ReadLE16(f);
+ if (numSectors < 0 || numSectors > 4096) {
+ fclose(f);
+ lastError = va("Bad sector count: %d.", numSectors);
+ return false;
+ }
+
+ sectors.SetNum(numSectors);
+
+ for (int i = 0; i < numSectors; i++) {
+ BuildSector& s = sectors[i];
+
+ s.wallptr = ReadLE16(f);
+ s.wallnum = ReadLE16(f);
+ s.ceilingz = ReadLE32(f);
+ s.floorz = ReadLE32(f);
+ s.ceilingstat = ReadLE16(f);
+ s.floorstat = ReadLE16(f);
+ s.ceilingpicnum = ReadLE16(f);
+ s.ceilingheinum = ReadLE16(f);
+ s.ceilingshade = ReadU8(f);
+ s.ceilingpal = ReadU8(f);
+ s.ceilingxpanning = ReadU8(f);
+ s.ceilingypanning = ReadU8(f);
+ s.floorpicnum = ReadLE16(f);
+ s.floorheinum = ReadLE16(f);
+ s.floorshade = ReadU8(f);
+ s.floorpal = ReadU8(f);
+ s.floorxpanning = ReadU8(f);
+ s.floorypanning = ReadU8(f);
+ s.visibility = ReadU8(f);
+ s.filler = ReadU8(f);
+ s.lotag = ReadLE16(f);
+ s.hitag = ReadLE16(f);
+ s.extra = ReadLE16(f);
+ }
+
+ const short numWalls = ReadLE16(f);
+ if (numWalls < 0 || numWalls > 32767) {
+ fclose(f);
+ lastError = va("Bad wall count: %d.", numWalls);
+ return false;
+ }
+
+ walls.SetNum(numWalls);
+
+ for (int i = 0; i < numWalls; i++) {
+ BuildWall& w = walls[i];
+
+ w.x = ReadLE32(f);
+ w.y = ReadLE32(f);
+ w.point2 = ReadLE16(f);
+ w.nextwall = ReadLE16(f);
+ w.nextsector = ReadLE16(f);
+ w.cstat = ReadLE16(f);
+ w.picnum = ReadLE16(f);
+ w.overpicnum = ReadLE16(f);
+ w.shade = ReadU8(f);
+ w.pal = ReadU8(f);
+ w.xrepeat = ReadU8(f);
+ w.yrepeat = ReadU8(f);
+ w.xpanning = ReadU8(f);
+ w.ypanning = ReadU8(f);
+ w.lotag = ReadLE16(f);
+ w.hitag = ReadLE16(f);
+ w.extra = ReadLE16(f);
+ }
+
+ const short numSprites = ReadLE16(f);
+ if (numSprites < 0 || numSprites > 32767) {
+ fclose(f);
+ lastError = va("Bad sprite count: %d.", numSprites);
+ return false;
+ }
+
+ sprites.SetNum(numSprites);
+
+ for (int i = 0; i < numSprites; i++) {
+ BuildSprite& sp = sprites[i];
+
+ sp.x = ReadLE32(f);
+ sp.y = ReadLE32(f);
+ sp.z = ReadLE32(f);
+ sp.cstat = ReadLE16(f);
+ sp.picnum = ReadLE16(f);
+ sp.shade = ReadS8(f);
+ sp.pal = ReadU8(f);
+ sp.clipdist = ReadU8(f);
+ sp.filler = ReadU8(f);
+ sp.xrepeat = ReadU8(f);
+ sp.yrepeat = ReadU8(f);
+ sp.xoffset = ReadS8(f);
+ sp.yoffset = ReadS8(f);
+ sp.sectnum = ReadLE16(f);
+ sp.statnum = ReadLE16(f);
+ sp.ang = ReadLE16(f);
+ sp.owner = ReadLE16(f);
+ sp.xvel = ReadLE16(f);
+ sp.yvel = ReadLE16(f);
+ sp.zvel = ReadLE16(f);
+ sp.lotag = ReadLE16(f);
+ sp.hitag = ReadLE16(f);
+ sp.extra = ReadLE16(f);
+ }
+
+ fclose(f);
+ return true;
+ }
+
+ /*
+ ===========================================================================
+ Coordinate / material helpers
+ ===========================================================================
+ */
+
+ idVec3 BuildPointToDoomFloat(float x, float y, float z) const {
+ const float dx = x * options.mapScale;
+ const float dy = y * options.mapScale * (options.flipY ? -1.0f : 1.0f);
+
+ // Build z grows downward. Doom z grows upward.
+ const float dz = options.zOffset - (z * options.zScale);
+
+ return idVec3(dx, dy, dz);
+ }
+
+ idVec3 BuildPointToDoom(int x, int y, int z) const {
+ return BuildPointToDoomFloat((float)x, (float)y, (float)z);
+ }
+
+ float BuildZToDoomZ(float z) const {
+ return options.zOffset - (z * options.zScale);
+ }
+
+ bool SurfaceIsSloped(short stat, short heinum) const {
+ return ((stat & 2) != 0) && (heinum != 0);
+ }
+
+ /*
+ Build sector slopes use the first wall of the sector as the hinge.
+ floorstat/ceilingstat bit 1, i.e. value 2, enables the slope, and
+ floorheinum/ceilingheinum stores the signed slope amount.
+
+ Equivalent floating-point form of Build's get*ofslope behavior:
+ z = baseZ + heinum * perpendicularDistanceFromHinge / 256
+ where perpendicularDistanceFromHinge is signed in Build XY space.
+ */
+ float BuildSurfaceZAt(const BuildSector& sec, bool ceiling, float buildX, float buildY) const {
+ const float baseZ = (float)(ceiling ? sec.ceilingz : sec.floorz);
+ const short stat = ceiling ? sec.ceilingstat : sec.floorstat;
+ const short heinum = ceiling ? sec.ceilingheinum : sec.floorheinum;
+
+ if (!SurfaceIsSloped(stat, heinum)) {
+ return baseZ;
+ }
+
+ if (sec.wallptr < 0 || sec.wallptr >= walls.Num()) {
+ return baseZ;
+ }
+
+ const BuildWall& hinge = walls[sec.wallptr];
+ if (hinge.point2 < 0 || hinge.point2 >= walls.Num()) {
+ return baseZ;
+ }
+
+ const BuildWall& hinge2 = walls[hinge.point2];
+
+ const float dx = (float)hinge2.x - (float)hinge.x;
+ const float dy = (float)hinge2.y - (float)hinge.y;
+ const float len = idMath::Sqrt(dx * dx + dy * dy);
+
+ if (len < 0.001f) {
+ return baseZ;
+ }
+
+ // Signed distance times hinge length: dx * relY - dy * relX.
+ const float cross = dx * (buildY - (float)hinge.y) - dy * (buildX - (float)hinge.x);
+ return baseZ + (((float)heinum * cross) / (len * 256.0f));
+ }
+
+ idVec3 BuildSurfacePointToDoom(const BuildSector& sec, bool ceiling, int buildX, int buildY) const {
+ return BuildPointToDoomFloat((float)buildX, (float)buildY, BuildSurfaceZAt(sec, ceiling, (float)buildX, (float)buildY));
+ }
+
+ idStr TileMaterialName(int picnum) const {
+ if (picnum < 0) {
+ picnum = 0;
+ }
+
+ idStr out;
+ out = va("%s/%d", options.tileMaterialPrefix.c_str(), picnum);
+ return out;
+ }
+
+ TileInfo GetTileInfo(int picnum) const {
+ TileInfo info;
+ info.w = Max(1, options.defaultTileWidth);
+ info.h = Max(1, options.defaultTileHeight);
+
+ idStr matName = TileMaterialName(picnum);
+ const idMaterial* mat = Texture_ForName(matName.c_str());
+
+ if (mat != NULL && mat->GetEditorImage() != NULL) {
+ if (mat->GetEditorImage()->uploadWidth > 0) {
+ info.w = mat->GetEditorImage()->uploadWidth;
+ }
+ if (mat->GetEditorImage()->uploadHeight > 0) {
+ info.h = mat->GetEditorImage()->uploadHeight;
+ }
+ }
+
+ return info;
+ }
+
+ /*
+ Doom 3 brush primitive matrices are 2x3 transforms on a plane-local basis.
+ This computes the same kind of plane basis used by Doom 3 map code, then
+ projects desired world-space UV gradients into that local basis.
+ */
+ static void ComputeAxisBaseDoom3(const idVec3& normal, idVec3& texX, idVec3& texY) {
+ idVec3 n = normal;
+ n.Normalize();
+
+ float rotY = -idMath::ATan(n.z, idMath::Sqrt(n.y * n.y + n.x * n.x));
+ float rotZ = idMath::ATan(n.y, n.x);
+
+ // Snap very small values to avoid drifting texture bases.
+ if (idMath::Fabs(rotY) < 1e-6f) {
+ rotY = 0.0f;
+ }
+ if (idMath::Fabs(rotZ) < 1e-6f) {
+ rotZ = 0.0f;
+ }
+
+ // Start with x/y texture axes.
+ texX.Set(-idMath::Sin(rotZ), idMath::Cos(rotZ), 0.0f);
+ texY.Set(
+ -idMath::Sin(rotY) * idMath::Cos(rotZ),
+ -idMath::Sin(rotY) * idMath::Sin(rotZ),
+ -idMath::Cos(rotY)
+ );
+
+ texX.Normalize();
+ texY.Normalize();
+ }
+
+ brushprimit_texdef_t MakeBrushPrimMatrixForWorldUV(
+ const idVec3& planeNormal,
+ const idVec3& worldUGradient,
+ const idVec3& worldVGradient,
+ float uOffset,
+ float vOffset) const {
+
+ brushprimit_texdef_t bp;
+ memset(&bp, 0, sizeof(bp));
+
+ idVec3 texX;
+ idVec3 texY;
+ ComputeAxisBaseDoom3(planeNormal, texX, texY);
+
+ bp.coords[0][0] = worldUGradient * texX;
+ bp.coords[0][1] = worldUGradient * texY;
+ bp.coords[0][2] = uOffset;
+
+ bp.coords[1][0] = worldVGradient * texX;
+ bp.coords[1][1] = worldVGradient * texY;
+ bp.coords[1][2] = vOffset;
+
+ return bp;
+ }
+
+ brushprimit_texdef_t DefaultMatrix() const {
+ brushprimit_texdef_t bp;
+ memset(&bp, 0, sizeof(bp));
+ bp.coords[0][0] = 1.0f / 64.0f;
+ bp.coords[1][1] = 1.0f / 64.0f;
+ return bp;
+ }
+
+ /*
+ ===========================================================================
+ Plane / brush helpers
+ ===========================================================================
+ */
+
+ static void FlipPlane(idPlane& p) {
+ p[0] = -p[0];
+ p[1] = -p[1];
+ p[2] = -p[2];
+ p[3] = -p[3];
+ }
+
+ static bool PlaneFromPointsOutward(const idVec3& a, const idVec3& b, const idVec3& c, const idVec3& insidePoint, idPlane& out) {
+ if (!out.FromPoints(a, b, c, false)) {
+ return false;
+ }
+
+ // A brush face plane's normal should point away from the brush center.
+ const float d = out.Normal() * insidePoint + out[3];
+ if (d > 0.0f) {
+ FlipPlane(out);
+ }
+
+ return true;
+ }
+
+
+ static bool NormalizePlaneForCompare(const idPlane& plane, idVec3& normal, float& dist) {
+ normal = plane.Normal();
+ const float len = normal.Normalize();
+ if (len <= 0.000001f) {
+ dist = 0.0f;
+ return false;
+ }
+ dist = plane[3] / len;
+ return true;
+ }
+
+ static bool IsDuplicatePlane(const idPlane& a, const idPlane& b) {
+ idVec3 na;
+ idVec3 nb;
+ float da;
+ float db;
+ if (!NormalizePlaneForCompare(a, na, da) || !NormalizePlaneForCompare(b, nb, db)) {
+ return false;
+ }
+
+ // Radiant's Brush_MakeFaceWinding treats repeated coplanar faces as a
+ // hard error. Keep one copy before calling Brush_Build.
+ return (na * nb) > 0.9999f && idMath::Fabs(da - db) < 0.05f;
+ }
+
+ static bool IsZeroVolumeOppositePlane(const idPlane& a, const idPlane& b) {
+ idVec3 na;
+ idVec3 nb;
+ float da;
+ float db;
+ if (!NormalizePlaneForCompare(a, na, da) || !NormalizePlaneForCompare(b, nb, db)) {
+ return false;
+ }
+
+ // Opposite normals on the same plane mean zero thickness. That usually
+ // happens at sloped portal crossings or tiny Build detail sectors.
+ return (na * nb) < -0.9999f && idMath::Fabs(da + db) < 0.05f;
+ }
+
+ bool CleanSideList(const idList& inSides, idList& outSides, const char* context) {
+ outSides.SetNum(0);
+
+ for (int i = 0; i < inSides.Num(); i++) {
+ if (!PlaneLooksSane(inSides[i].plane)) {
+ LogRejectedBrush(context, va("bad source plane %d", i));
+ return false;
+ }
+
+ bool duplicate = false;
+ for (int j = 0; j < outSides.Num(); j++) {
+ if (IsDuplicatePlane(inSides[i].plane, outSides[j].plane)) {
+ duplicate = true;
+ break;
+ }
+
+ if (IsZeroVolumeOppositePlane(inSides[i].plane, outSides[j].plane)) {
+ LogRejectedBrush(context, va("opposing zero-volume planes %d/%d", i, j));
+ return false;
+ }
+ }
+
+ if (!duplicate) {
+ outSides.Append(inSides[i]);
+ }
+ }
+
+ if (outSides.Num() < 4) {
+ LogRejectedBrush(context, va("too few unique planes after cleanup: %d", outSides.Num()));
+ return false;
+ }
+
+ return true;
+ }
+
+ static void PointsForPlane(const idPlane& plane, idVec3 outPts[3]) {
+ idVec3 normal = plane.Normal();
+ normal.Normalize();
+
+ idVec3 up;
+ if (idMath::Fabs(normal.z) < 0.999f) {
+ up.Set(0.0f, 0.0f, 1.0f);
+ }
+ else {
+ up.Set(1.0f, 0.0f, 0.0f);
+ }
+
+ idVec3 right = up.Cross(normal);
+ right.Normalize();
+
+ idVec3 planeUp = normal.Cross(right);
+ planeUp.Normalize();
+
+ const idVec3 origin = normal * -plane[3];
+
+ // Keep these points large enough for Radiant code paths that seed face
+ // windings from planepts instead of rebuilding an infinite base winding.
+ // 256 is too small for many scaled Duke floors/ceilings.
+ const float s = 131072.0f;
+
+ // Ordered so Face_MakePlane-style cross products produce plane.Normal().
+ outPts[0] = origin + right * s + planeUp * s;
+ outPts[1] = origin - right * s - planeUp * s;
+ outPts[2] = origin - right * s + planeUp * s;
+ }
+
+ static bool FloatLooksSane(float f) {
+ return (f == f) && idMath::Fabs(f) < 1.0e20f;
+ }
+
+ static bool PlaneLooksSane(const idPlane& plane) {
+ const idVec3 n = plane.Normal();
+ if (!FloatLooksSane(n.x) || !FloatLooksSane(n.y) || !FloatLooksSane(n.z) || !FloatLooksSane(plane[3])) {
+ return false;
+ }
+
+ const float lenSqr = n * n;
+ return lenSqr > 0.5f && lenSqr < 2.0f;
+ }
+
+ static void BaseWindingForPlane(const idPlane& plane, idList& outPoly) {
+ idVec3 normal = plane.Normal();
+ normal.Normalize();
+
+ idVec3 up;
+ if (idMath::Fabs(normal.z) < 0.999f) {
+ up.Set(0.0f, 0.0f, 1.0f);
+ }
+ else {
+ up.Set(1.0f, 0.0f, 0.0f);
+ }
+
+ idVec3 right = up.Cross(normal);
+ right.Normalize();
+
+ idVec3 planeUp = normal.Cross(right);
+ planeUp.Normalize();
+
+ const idVec3 origin = normal * -plane[3];
+ const float s = 131072.0f;
+
+ outPoly.SetNum(4);
+ outPoly[0] = origin + right * s + planeUp * s;
+ outPoly[1] = origin - right * s + planeUp * s;
+ outPoly[2] = origin - right * s - planeUp * s;
+ outPoly[3] = origin + right * s - planeUp * s;
+ }
+
+ static void CleanClipPolygon(idList& poly) {
+ const float sameEpsSqr = 0.000001f;
+ for (int guard = 0; guard < 8192 && poly.Num() > 2; guard++) {
+ bool removed = false;
+
+ for (int i = 0; i < poly.Num(); i++) {
+ const int n = (i + 1) % poly.Num();
+ const idVec3 d = poly[i] - poly[n];
+ if ((d * d) <= sameEpsSqr) {
+ poly.RemoveIndex(n);
+ removed = true;
+ break;
+ }
+ }
+
+ if (removed) {
+ continue;
+ }
+
+ for (int i = 0; i < poly.Num(); i++) {
+ const int p = (i + poly.Num() - 1) % poly.Num();
+ const int n = (i + 1) % poly.Num();
+
+ idVec3 a = poly[i] - poly[p];
+ idVec3 b = poly[n] - poly[i];
+ if ((a * a) <= sameEpsSqr || (b * b) <= sameEpsSqr) {
+ continue;
+ }
+
+ a.Normalize();
+ b.Normalize();
+ if (idMath::Fabs(a * b) > 0.99999f) {
+ poly.RemoveIndex(i);
+ removed = true;
+ break;
+ }
+ }
+
+ if (!removed) {
+ break;
+ }
+ }
+ }
+
+ static bool ClipPolygonByPlane(const idList& inPoly, const idPlane& plane, idList& outPoly) {
+ outPoly.SetNum(0);
+
+ if (inPoly.Num() < 3) {
+ return false;
+ }
+
+ const float epsilon = 0.01f;
+
+ for (int i = 0; i < inPoly.Num(); i++) {
+ const idVec3& s = inPoly[i];
+ const idVec3& e = inPoly[(i + 1) % inPoly.Num()];
+
+ const float sd = plane.Normal() * s + plane[3];
+ const float ed = plane.Normal() * e + plane[3];
+
+ const bool sInside = sd <= epsilon;
+ const bool eInside = ed <= epsilon;
+
+ if (sInside && eInside) {
+ outPoly.Append(e);
+ }
+ else if (sInside && !eInside) {
+ const float denom = sd - ed;
+ if (idMath::Fabs(denom) > 1e-6f) {
+ outPoly.Append(s + (e - s) * (sd / denom));
+ }
+ }
+ else if (!sInside && eInside) {
+ const float denom = sd - ed;
+ if (idMath::Fabs(denom) > 1e-6f) {
+ outPoly.Append(s + (e - s) * (sd / denom));
+ }
+ outPoly.Append(e);
+ }
+ }
+
+ CleanClipPolygon(outPoly);
+ return outPoly.Num() >= 3;
+ }
+
+ static float PolygonAreaOnPlane(const idList& poly, const idVec3& normal) {
+ if (poly.Num() < 3) {
+ return 0.0f;
+ }
+
+ idVec3 sum(0.0f, 0.0f, 0.0f);
+ for (int i = 0; i < poly.Num(); i++) {
+ sum += poly[i].Cross(poly[(i + 1) % poly.Num()]);
+ }
+
+ idVec3 n = normal;
+ if (n.Normalize() == 0.0f) {
+ return 0.0f;
+ }
+
+ return idMath::Fabs(sum * n) * 0.5f;
+ }
+
+ bool ValidateConvexBrush(const idList& sides, const char* context) {
+ if (sides.Num() < 4) {
+ LogRejectedBrush(context, "not enough sides");
+ return false;
+ }
+
+ for (int i = 0; i < sides.Num(); i++) {
+ if (!PlaneLooksSane(sides[i].plane)) {
+ LogRejectedBrush(context, va("bad plane on side %d", i));
+ return false;
+ }
+ }
+
+ for (int i = 0; i < sides.Num(); i++) {
+ idList poly;
+ BaseWindingForPlane(sides[i].plane, poly);
+
+ for (int j = 0; j < sides.Num(); j++) {
+ if (i == j) {
+ continue;
+ }
+
+ idList clipped;
+ if (!ClipPolygonByPlane(poly, sides[j].plane, clipped)) {
+ LogRejectedBrush(context, va("face %d clipped away by side %d", i, j));
+ return false;
+ }
+ poly = clipped;
+ }
+
+ const float area = PolygonAreaOnPlane(poly, sides[i].plane.Normal());
+ if (area < 0.001f) {
+ LogRejectedBrush(context, va("face %d has tiny winding area %.6f", i, area));
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ bool AddBrushFromSides(const idList& sides, const char* context) {
+ idList cleanSides;
+ if (!CleanSideList(sides, cleanSides, context)) {
+ return false;
+ }
+
+ if (!ValidateConvexBrush(cleanSides, context)) {
+ return false;
+ }
+
+ brush_t* b = Brush_Alloc();
+ if (b == NULL) {
+ return false;
+ }
+
+ for (int i = 0; i < cleanSides.Num(); i++) {
+ face_t* f = Face_Alloc();
+ if (f == NULL) {
+ continue;
+ }
+
+ f->plane = cleanSides[i].plane;
+ f->originalPlane = cleanSides[i].plane;
+ f->dirty = false;
+
+ // Use actual generated face points. The previous importer used
+ // synthetic huge triangles on the same plane; that can make failed
+ // windings look like faces stretching forever in the editor.
+ f->planepts[0] = cleanSides[i].planePts[0];
+ f->planepts[1] = cleanSides[i].planePts[1];
+ f->planepts[2] = cleanSides[i].planePts[2];
+
+ f->texdef.SetName(cleanSides[i].material.c_str());
+ f->d_texture = Texture_ForName(cleanSides[i].material.c_str());
+ f->brushprimit_texdef = cleanSides[i].bp;
+
+ f->next = b->brush_faces;
+ b->brush_faces = f;
+ }
+
+ Brush_AddToList(b, &selected_brushes);
+ Entity_LinkBrush(world_entity, b);
+
+ // Do not snap imported Build geometry. Duke slopes and tiny detail sectors
+ // are intentionally off-grid after scale conversion; snapping the plane
+ // points is a common cause of "Unable to create face winding on brush".
+ Brush_Build(b, false, true, false, true);
+
+ return true;
+ }
+
+ bool AddSide(
+ idList& sides,
+ const idVec3& a,
+ const idVec3& b,
+ const idVec3& c,
+ const idVec3& inside,
+ const char* material,
+ const brushprimit_texdef_t& bp) {
+
+ SideDesc s;
+ if (!PlaneFromPointsOutward(a, b, c, inside, s.plane)) {
+ runStats.rejectedDegenerateSides++;
+ return false;
+ }
+
+ // Match planepts winding to the possibly flipped outward plane.
+ // Brush_Build/Face_MakePlane in DoomEdit can recompute the plane
+ // from these three points, so their order must agree with s.plane.
+ idPlane rawPlane;
+ if (rawPlane.FromPoints(a, b, c, false) && (rawPlane.Normal() * s.plane.Normal()) < 0.0f) {
+ s.planePts[0] = a;
+ s.planePts[1] = c;
+ s.planePts[2] = b;
+ }
+ else {
+ s.planePts[0] = a;
+ s.planePts[1] = b;
+ s.planePts[2] = c;
+ }
+
+ s.material = material;
+ s.bp = bp;
+ sides.Append(s);
+ return true;
+ }
+
+ /*
+ ===========================================================================
+ UV helpers
+ ===========================================================================
+ */
+
+ brushprimit_texdef_t MakeWallUV(
+ const BuildWall& w,
+ const idVec3& startAnchor,
+ const idVec3& endAnchor,
+ const idVec3& vAnchor,
+ const idVec3& planeNormal) const {
+
+ TileInfo tile = GetTileInfo(w.picnum);
+
+ idVec3 wallDir = endAnchor - startAnchor;
+ wallDir.z = 0.0f;
+ if (wallDir.Normalize() == 0.0f) {
+ wallDir.Set(1.0f, 0.0f, 0.0f);
+ }
+
+ float xRep = w.xrepeat > 0 ? (float)w.xrepeat : options.wallRepeatBase;
+ float yRep = w.yrepeat > 0 ? (float)w.yrepeat : options.wallRepeatBase;
+
+ float uScale = xRep / ((float)tile.w * options.wallRepeatBase);
+ float vScale = yRep / ((float)tile.h * options.wallRepeatBase);
+
+ idVec3 uGrad = wallDir * uScale;
+
+ // Texture V goes down the wall. Doom Z goes up.
+ idVec3 vGrad(0.0f, 0.0f, -vScale);
+
+ // Build wall cstat common flip bits.
+ // bit 3: x-flip, bit 8: y-flip in classic Build usage.
+ if (w.cstat & 8) {
+ uGrad = -uGrad;
+ }
+ if (w.cstat & 256) {
+ vGrad = -vGrad;
+ }
+
+ // Anchor U on the wall's first point and V on either top or bottom.
+ // Without this, large map coordinates can make brush-primitive offsets
+ // look arbitrary, and portal upper/lower wall pieces will not line up.
+ float uOff = ((float)w.xpanning / (float)tile.w) - (uGrad * startAnchor);
+ float vOff = ((float)w.ypanning / (float)tile.h) - (vGrad * vAnchor);
+
+ return MakeBrushPrimMatrixForWorldUV(planeNormal, uGrad, vGrad, uOff, vOff);
+ }
+
+ brushprimit_texdef_t MakeFlatUV(const BuildSector& sec, bool ceiling, const idVec3& planeNormal) const {
+ const int picnum = ceiling ? sec.ceilingpicnum : sec.floorpicnum;
+ TileInfo tile = GetTileInfo(picnum);
+
+ short stat = ceiling ? sec.ceilingstat : sec.floorstat;
+ byte xpan = ceiling ? sec.ceilingxpanning : sec.floorxpanning;
+ byte ypan = ceiling ? sec.ceilingypanning : sec.floorypanning;
+
+ float repeatBase = options.flatRepeatBase;
+ if (repeatBase <= 0.001f) {
+ repeatBase = 16.0f;
+ }
+
+ /*
+ Build flat texture scale is in Build map units. The importer works
+ in Doom units, so fold mapScale into the denominator. With the
+ default mapScale 1/8 and flatRepeatBase 16, a 64px tile spans
+ 1024 Build units / 128 Doom units instead of 1024 Doom units.
+ */
+ const float doomRepeatBase = Max(0.001f, repeatBase * Max(0.001f, options.mapScale));
+ const float uScale = 1.0f / ((float)tile.w * doomRepeatBase);
+ const float vScale = 1.0f / ((float)tile.h * doomRepeatBase);
+
+ idVec3 uGrad;
+ idVec3 vGrad;
+ idVec3 anchor(0.0f, 0.0f, 0.0f);
+
+ // Build stat bit 6/value 64 is relative alignment. This matters most
+ // on slopes: U follows the hinge wall and V follows the sloped surface
+ // instead of raw world XY, avoiding the giant stretched look.
+ if ((stat & 64) && sec.wallptr >= 0 && sec.wallptr < walls.Num()) {
+ const BuildWall& hinge = walls[sec.wallptr];
+ if (hinge.point2 >= 0 && hinge.point2 < walls.Num()) {
+ const BuildWall& hinge2 = walls[hinge.point2];
+ const idVec3 p0 = BuildSurfacePointToDoom(sec, ceiling, hinge.x, hinge.y);
+ const idVec3 p1 = BuildSurfacePointToDoom(sec, ceiling, hinge2.x, hinge2.y);
+
+ idVec3 xAxis = p1 - p0;
+ if (xAxis.Normalize() == 0.0f) {
+ xAxis.Set(1.0f, 0.0f, 0.0f);
+ }
+
+ idVec3 n = planeNormal;
+ if (n.Normalize() == 0.0f) {
+ n.Set(0.0f, 0.0f, ceiling ? -1.0f : 1.0f);
+ }
+
+ idVec3 yAxis = xAxis.Cross(n);
+ if (yAxis.Normalize() == 0.0f) {
+ yAxis.Set(0.0f, options.flipY ? -1.0f : 1.0f, 0.0f);
+ }
+
+ uGrad = xAxis * uScale;
+ vGrad = yAxis * vScale;
+ anchor = p0;
+ }
+ else {
+ uGrad.Set(uScale, 0.0f, 0.0f);
+ vGrad.Set(0.0f, options.flipY ? -vScale : vScale, 0.0f);
+ }
+ }
+ else {
+ uGrad.Set(uScale, 0.0f, 0.0f);
+ vGrad.Set(0.0f, options.flipY ? -vScale : vScale, 0.0f);
+ }
+
+ // Build flat stat bits commonly used by Duke:
+ // bit 2/value 4: swap x/y
+ // bit 4/value 16: x flip
+ // bit 5/value 32: y flip
+ // bit 3/value 8: double smooshiness. Here we double density.
+ if (stat & 4) {
+ idVec3 tmp = uGrad;
+ uGrad = vGrad;
+ vGrad = tmp;
+ }
+
+ if (stat & 16) {
+ uGrad = -uGrad;
+ }
+
+ if (stat & 32) {
+ vGrad = -vGrad;
+ }
+
+ if (stat & 8) {
+ uGrad *= 2.0f;
+ vGrad *= 2.0f;
+ }
+
+ // Ceiling is viewed from below; flipping V usually matches Build better.
+ if (ceiling) {
+ vGrad = -vGrad;
+ }
+
+ float uOff = ((float)xpan / (float)tile.w) - (uGrad * anchor);
+ float vOff = ((float)ypan / (float)tile.h) - (vGrad * anchor);
+
+ return MakeBrushPrimMatrixForWorldUV(planeNormal, uGrad, vGrad, uOff, vOff);
+ }
+
+ /*
+ ===========================================================================
+ Wall brushes
+ ===========================================================================
+ */
+
+ bool AddWallSpanBrushSegment(
+ int wallIndex,
+ float tA,
+ float tB,
+ float buildZTopA,
+ float buildZTopB,
+ float buildZBottomA,
+ float buildZBottomB,
+ int picnum) {
+
+ if (wallIndex < 0 || wallIndex >= walls.Num()) {
+ return false;
+ }
+
+ BuildWall& w = walls[wallIndex];
+
+ if (w.point2 < 0 || w.point2 >= walls.Num()) {
+ return false;
+ }
+
+ BuildWall& w2 = walls[w.point2];
+
+ if (tB <= tA + 0.0001f) {
+ runStats.rejectedWallSpans++;
+ return false;
+ }
+
+ // Build z grows downward: bottom must be lower than top at least
+ // somewhere on the segment. Exact endpoint-zero spans create duplicate
+ // planes, so AddWallSpanBrushClipped trims those before this is called.
+ if ((buildZBottomA - buildZTopA) <= 0.1f && (buildZBottomB - buildZTopB) <= 0.1f) {
+ runStats.rejectedWallSpans++;
+ return false;
+ }
+
+ const float xA = (float)w.x + ((float)w2.x - (float)w.x) * tA;
+ const float yA = (float)w.y + ((float)w2.y - (float)w.y) * tA;
+ const float xB = (float)w.x + ((float)w2.x - (float)w.x) * tB;
+ const float yB = (float)w.y + ((float)w2.y - (float)w.y) * tB;
+
+ idVec3 aTop = BuildPointToDoomFloat(xA, yA, buildZTopA);
+ idVec3 bTop = BuildPointToDoomFloat(xB, yB, buildZTopB);
+ idVec3 aBot = BuildPointToDoomFloat(xA, yA, buildZBottomA);
+ idVec3 bBot = BuildPointToDoomFloat(xB, yB, buildZBottomB);
+
+ if (Max(idMath::Fabs(aTop.z - aBot.z), idMath::Fabs(bTop.z - bBot.z)) < 0.1f) {
+ runStats.rejectedWallSpans++;
+ return false;
+ }
+
+ idVec3 dir = bBot - aBot;
+ dir.z = 0.0f;
+ if (dir.Normalize() == 0.0f) {
+ runStats.rejectedWallSpans++;
+ return false;
+ }
+
+ idVec3 sideN(-dir.y, dir.x, 0.0f);
+ sideN.Normalize();
+
+ const float halfThick = Max(1.0f, options.wallThickness * 0.5f);
+
+ idVec3 p0 = aBot - sideN * halfThick;
+ idVec3 p1 = bBot - sideN * halfThick;
+ idVec3 p2 = bBot + sideN * halfThick;
+ idVec3 p3 = aBot + sideN * halfThick;
+
+ idVec3 p4 = aTop - sideN * halfThick;
+ idVec3 p5 = bTop - sideN * halfThick;
+ idVec3 p6 = bTop + sideN * halfThick;
+ idVec3 p7 = aTop + sideN * halfThick;
+
+ idVec3 center = (p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7) * (1.0f / 8.0f);
+
+ idStr wallMat = TileMaterialName(picnum);
+ brushprimit_texdef_t caulkBP = DefaultMatrix();
+
+ idList sides;
+ sides.SetNum(0);
+
+ // Use the full original wall length for U anchoring so clipped wall
+ // pieces line up with unclipped pieces instead of restarting at tA.
+ const idVec3 originalStart = BuildPointToDoomFloat((float)w.x, (float)w.y, (w.cstat & 4) ? buildZBottomA : buildZTopA);
+ const idVec3 originalEnd = BuildPointToDoomFloat((float)w2.x, (float)w2.y, (w.cstat & 4) ? buildZBottomB : buildZTopB);
+ const idVec3 vAnchor = (w.cstat & 4) ? aBot : aTop;
+
+ // First broad side.
+ {
+ idPlane tmp;
+ if (!PlaneFromPointsOutward(p0, p1, p5, center, tmp)) {
+ runStats.rejectedDegenerateSides++;
+ return false;
+ }
+ brushprimit_texdef_t wallBP = MakeWallUV(w, originalStart, originalEnd, vAnchor, tmp.Normal());
+ if (!AddSide(sides, p0, p1, p5, center, wallMat.c_str(), wallBP)) {
+ return false;
+ }
+ }
+
+ // Second broad side, also textured so the brush looks right from either side.
+ {
+ idPlane tmp;
+ if (!PlaneFromPointsOutward(p3, p7, p6, center, tmp)) {
+ runStats.rejectedDegenerateSides++;
+ return false;
+ }
+ brushprimit_texdef_t wallBP = MakeWallUV(w, originalStart, originalEnd, vAnchor, tmp.Normal());
+ if (!AddSide(sides, p3, p7, p6, center, wallMat.c_str(), wallBP)) {
+ return false;
+ }
+ }
+
+ // Top, bottom, and end caps are caulk.
+ if (!AddSide(sides, p4, p5, p6, center, options.caulkMaterial.c_str(), caulkBP)) {
+ return false;
+ }
+ if (!AddSide(sides, p0, p2, p1, center, options.caulkMaterial.c_str(), caulkBP)) {
+ return false;
+ }
+ if (!AddSide(sides, p0, p4, p7, center, options.caulkMaterial.c_str(), caulkBP)) {
+ return false;
+ }
+ if (!AddSide(sides, p1, p2, p6, center, options.caulkMaterial.c_str(), caulkBP)) {
+ return false;
+ }
+
+ idStr context = va(
+ "wallSpan wall=%d pic=%d tA=%.4f tB=%.4f topA=%.3f topB=%.3f botA=%.3f botB=%.3f",
+ wallIndex,
+ picnum,
+ tA,
+ tB,
+ buildZTopA,
+ buildZTopB,
+ buildZBottomA,
+ buildZBottomB
+ );
+ return AddBrushFromSides(sides, context.c_str());
+ }
+
+ bool AddWallSpanBrush(
+ int wallIndex,
+ float buildZTopA,
+ float buildZTopB,
+ float buildZBottomA,
+ float buildZBottomB,
+ int picnum) {
+
+ return AddWallSpanBrushSegment(wallIndex, 0.0f, 1.0f, buildZTopA, buildZTopB, buildZBottomA, buildZBottomB, picnum);
+ }
+
+ bool AddWallSpanBrushClipped(
+ int wallIndex,
+ float buildZTopA,
+ float buildZTopB,
+ float buildZBottomA,
+ float buildZBottomB,
+ int picnum) {
+
+ const float minBuildHeight = Max(0.5f, 0.5f / Max(0.001f, options.zScale));
+ const float hA = buildZBottomA - buildZTopA;
+ const float hB = buildZBottomB - buildZTopB;
+
+ if (hA <= minBuildHeight && hB <= minBuildHeight) {
+ runStats.rejectedWallSpans++;
+ return false;
+ }
+
+ float t0 = 0.0f;
+ float t1 = 1.0f;
+
+ // If sloped sector surfaces cross along a portal wall, the visible
+ // upper/lower step may exist only along part of the wall. Clamping the
+ // bad endpoint makes a zero-area cap; trimming the segment avoids the
+ // duplicate/zero-volume planes that cause Radiant winding failures.
+ if (hA <= minBuildHeight && hB > minBuildHeight) {
+ t0 = (minBuildHeight - hA) / (hB - hA);
+ }
+ else if (hB <= minBuildHeight && hA > minBuildHeight) {
+ t1 = (minBuildHeight - hA) / (hB - hA);
+ }
+
+ if (t0 < 0.0f) {
+ t0 = 0.0f;
+ }
+ if (t0 > 1.0f) {
+ t0 = 1.0f;
+ }
+ if (t1 < 0.0f) {
+ t1 = 0.0f;
+ }
+ if (t1 > 1.0f) {
+ t1 = 1.0f;
+ }
+ if (t1 <= t0 + 0.0001f) {
+ runStats.rejectedWallSpans++;
+ return false;
+ }
+
+ const float top0 = buildZTopA + (buildZTopB - buildZTopA) * t0;
+ const float top1 = buildZTopA + (buildZTopB - buildZTopA) * t1;
+ const float bot0 = buildZBottomA + (buildZBottomB - buildZBottomA) * t0;
+ const float bot1 = buildZBottomA + (buildZBottomB - buildZBottomA) * t1;
+
+ return AddWallSpanBrushSegment(wallIndex, t0, t1, top0, top1, bot0, bot1, picnum);
+ }
+
+ int ImportSectorWalls(int sectorIndex) {
+ BuildSector& sec = sectors[sectorIndex];
+ int count = 0;
+
+ for (int i = 0; i < sec.wallnum; i++) {
+ const int wi = sec.wallptr + i;
+ if (wi < 0 || wi >= walls.Num()) {
+ continue;
+ }
+
+ BuildWall& w = walls[wi];
+ if (w.point2 < 0 || w.point2 >= walls.Num()) {
+ continue;
+ }
+ BuildWall& w2 = walls[w.point2];
+
+ const float secCeilA = BuildSurfaceZAt(sec, true, (float)w.x, (float)w.y);
+ const float secCeilB = BuildSurfaceZAt(sec, true, (float)w2.x, (float)w2.y);
+ const float secFloorA = BuildSurfaceZAt(sec, false, (float)w.x, (float)w.y);
+ const float secFloorB = BuildSurfaceZAt(sec, false, (float)w2.x, (float)w2.y);
+
+ // Solid outer wall. Use the clipped path too, because some Build
+ // maps contain nearly-zero endpoint spans on sloped detail sectors.
+ if (w.nextsector < 0 || w.nextsector >= sectors.Num()) {
+ if (AddWallSpanBrushClipped(wi, secCeilA, secCeilB, secFloorA, secFloorB, w.picnum)) {
+ count++;
+ }
+ continue;
+ }
+
+ // Portal wall. Build has no solid brush here, but the visible upper
+ // and lower steps need geometry if neighboring sector heights differ.
+ BuildSector& next = sectors[w.nextsector];
+
+ const float nextCeilA = BuildSurfaceZAt(next, true, (float)w.x, (float)w.y);
+ const float nextCeilB = BuildSurfaceZAt(next, true, (float)w2.x, (float)w2.y);
+ const float nextFloorA = BuildSurfaceZAt(next, false, (float)w.x, (float)w.y);
+ const float nextFloorB = BuildSurfaceZAt(next, false, (float)w2.x, (float)w2.y);
+
+ // Build z: smaller is higher, larger is lower.
+ if (secCeilA < nextCeilA || secCeilB < nextCeilB) {
+ if (AddWallSpanBrushClipped(wi, secCeilA, secCeilB, nextCeilA, nextCeilB, w.picnum)) {
+ count++;
+ }
+ }
+
+ if (secFloorA > nextFloorA || secFloorB > nextFloorB) {
+ if (AddWallSpanBrushClipped(wi, nextFloorA, nextFloorB, secFloorA, secFloorB, w.picnum)) {
+ count++;
+ }
+ }
+
+ // Masked mid texture. This will be solid if enabled, so keep off for
+ // gameplay/blocking imports unless you specifically want brush grates.
+ if (options.importMaskedWalls && (w.cstat & 16) && w.overpicnum >= 0) {
+ const float topA = Max(secCeilA, nextCeilA);
+ const float topB = Max(secCeilB, nextCeilB);
+ const float botA = Min(secFloorA, nextFloorA);
+ const float botB = Min(secFloorB, nextFloorB);
+
+ if (botA > topA || botB > topB) {
+ if (AddWallSpanBrushClipped(wi, topA, topB, botA, botB, w.overpicnum)) {
+ count++;
+ }
+ }
+ }
+ }
+
+ return count;
+ }
+
+ /*
+ ===========================================================================
+ Flat triangulation
+ ===========================================================================
+ */
+
+ static bool SamePoint2D(const idVec2& a, const idVec2& b) {
+ return idMath::Fabs(a.x - b.x) < 0.01f && idMath::Fabs(a.y - b.y) < 0.01f;
+ }
+
+ static float Area2D(const idList& pts) {
+ float a = 0.0f;
+ for (int i = 0; i < pts.Num(); i++) {
+ const idVec2& p = pts[i];
+ const idVec2& q = pts[(i + 1) % pts.Num()];
+ a += p.x * q.y - q.x * p.y;
+ }
+ return a * 0.5f;
+ }
+
+ static float Cross2D(const idVec2& a, const idVec2& b, const idVec2& c) {
+ const idVec2 ab = b - a;
+ const idVec2 ac = c - a;
+ return ab.x * ac.y - ab.y * ac.x;
+ }
+
+ static bool PointInTri2D(const idVec2& p, const idVec2& a, const idVec2& b, const idVec2& c) {
+ const float c1 = Cross2D(a, b, p);
+ const float c2 = Cross2D(b, c, p);
+ const float c3 = Cross2D(c, a, p);
+
+ const bool hasNeg = (c1 < -0.001f) || (c2 < -0.001f) || (c3 < -0.001f);
+ const bool hasPos = (c1 > 0.001f) || (c2 > 0.001f) || (c3 > 0.001f);
+
+ return !(hasNeg && hasPos);
+ }
+
+ static bool TriangulateSimplePolygon(const idList& pts, idList& tris) {
+ tris.SetNum(0);
+
+ const int n = pts.Num();
+ if (n < 3) {
+ return false;
+ }
+
+ idList indices;
+ indices.SetNum(n);
+ for (int i = 0; i < n; i++) {
+ indices[i] = i;
+ }
+
+ const bool ccw = Area2D(pts) > 0.0f;
+
+ int guard = 0;
+ while (indices.Num() > 3 && guard++ < 8192) {
+ bool clipped = false;
+
+ for (int ii = 0; ii < indices.Num(); ii++) {
+ const int ip = indices[(ii + indices.Num() - 1) % indices.Num()];
+ const int ic = indices[ii];
+ const int in = indices[(ii + 1) % indices.Num()];
+
+ const float cross = Cross2D(pts[ip], pts[ic], pts[in]);
+ const bool convex = ccw ? (cross > 0.001f) : (cross < -0.001f);
+
+ if (!convex) {
+ continue;
+ }
+
+ bool contains = false;
+ for (int jj = 0; jj < indices.Num(); jj++) {
+ const int test = indices[jj];
+ if (test == ip || test == ic || test == in) {
+ continue;
+ }
+
+ // Hole-bridged polygons intentionally contain duplicated
+ // bridge endpoints at different indices. Do not let those
+ // duplicated vertices falsely block every possible ear.
+ if (SamePoint2D(pts[test], pts[ip]) || SamePoint2D(pts[test], pts[ic]) || SamePoint2D(pts[test], pts[in])) {
+ continue;
+ }
+
+ if (PointInTri2D(pts[test], pts[ip], pts[ic], pts[in])) {
+ contains = true;
+ break;
+ }
+ }
+
+ if (contains) {
+ continue;
+ }
+
+ Tri t;
+ if (ccw) {
+ t.a = ip;
+ t.b = ic;
+ t.c = in;
+ }
+ else {
+ t.a = ip;
+ t.b = in;
+ t.c = ic;
+ }
+
+ tris.Append(t);
+ indices.RemoveIndex(ii);
+ clipped = true;
+ break;
+ }
+
+ if (!clipped) {
+ return false;
+ }
+ }
+
+ if (indices.Num() == 3) {
+ Tri t;
+ if (ccw) {
+ t.a = indices[0];
+ t.b = indices[1];
+ t.c = indices[2];
+ }
+ else {
+ t.a = indices[0];
+ t.b = indices[2];
+ t.c = indices[1];
+ }
+ tris.Append(t);
+ }
+
+ return tris.Num() > 0;
+ }
+
+ static float TriangleArea3D(const idVec3& a, const idVec3& b, const idVec3& c) {
+ return ((b - a).Cross(c - a)).Length() * 0.5f;
+ }
+
+ bool AddSideFromNormal(
+ idList& sides,
+ const idVec3& normalIn,
+ const idVec3& pointOnPlane,
+ const idVec3& inside,
+ const char* material,
+ const brushprimit_texdef_t& bp) {
+
+ idVec3 n = normalIn;
+ if (n.Normalize() == 0.0f) {
+ runStats.rejectedDegenerateSides++;
+ return false;
+ }
+
+ SideDesc s;
+ s.plane.SetNormal(n);
+ s.plane[3] = -(n * pointOnPlane);
+
+ // Make absolutely sure normal points away from the brush interior.
+ const float d = s.plane.Normal() * inside + s.plane[3];
+ if (d > 0.0f) {
+ FlipPlane(s.plane);
+ }
+
+ if (!PlaneLooksSane(s.plane)) {
+ runStats.rejectedDegenerateSides++;
+ return false;
+ }
+
+ // IMPORTANT:
+ // Use generated plane points that match the final plane.
+ // Do NOT use the tiny real triangle points here; DoomEdit may rebuild
+ // the face plane/winding from planepts and lose the surface face.
+ PointsForPlane(s.plane, s.planePts);
+
+ s.material = material ? material : options.caulkMaterial.c_str();
+ s.bp = bp;
+
+ sides.Append(s);
+ return true;
+ }
+ bool AddTriSlabBrush(
+ const idVec3& inA,
+ const idVec3& inB,
+ const idVec3& inC,
+ float thickness,
+ bool visibleNormalShouldPointUp,
+ const char* visibleMaterial,
+ const brushprimit_texdef_t& visibleBP) {
+
+ if (thickness <= 0.1f) {
+ thickness = 4.0f;
+ }
+
+ if (TriangleArea3D(inA, inB, inC) < 0.001f) {
+ runStats.rejectedFlatTris++;
+ return false;
+ }
+
+ idVec3 a = inA;
+ idVec3 b = inB;
+ idVec3 c = inC;
+
+ idVec3 n = (b - a).Cross(c - a);
+ if (n.Normalize() == 0.0f) {
+ runStats.rejectedFlatTris++;
+ return false;
+ }
+
+ // Correct triangle winding for the visible side.
+ if (visibleNormalShouldPointUp) {
+ if (n.z < 0.0f) {
+ idVec3 tmp = b;
+ b = c;
+ c = tmp;
+ n = -n;
+ }
+ }
+ else {
+ if (n.z > 0.0f) {
+ idVec3 tmp = b;
+ b = c;
+ c = tmp;
+ n = -n;
+ }
+ }
+
+ /*
+ Do NOT extrude along the triangle normal.
+
+ Doom 3 brush generation is much happier if floor/ceiling triangle
+ brushes are vertical columns. Normal extrusion creates tiny angled
+ side planes and can numerically clip the main face away, which is the
+ exact "outline but no filled middle" symptom.
+ */
+ idVec3 verticalOffset;
+
+ if (visibleNormalShouldPointUp) {
+ // Floor: visible top face, solid goes downward.
+ verticalOffset.Set(0.0f, 0.0f, -thickness);
+ }
+ else {
+ // Ceiling: visible bottom face, solid goes upward.
+ verticalOffset.Set(0.0f, 0.0f, thickness);
+ }
+
+ const idVec3 a2 = a + verticalOffset;
+ const idVec3 b2 = b + verticalOffset;
+ const idVec3 c2 = c + verticalOffset;
+
+ const idVec3 center = (a + b + c + a2 + b2 + c2) * (1.0f / 6.0f);
+
+ brushprimit_texdef_t caulkBP = DefaultMatrix();
+
+ idList sides;
+ sides.SetNum(0);
+
+ /*
+ Visible surface.
+ Use AddSide(), not AddSideFromNormal(), so planepts are real generated
+ triangle points.
+ */
+ if (!AddSide(
+ sides,
+ a, b, c,
+ center,
+ visibleMaterial ? visibleMaterial : options.caulkMaterial.c_str(),
+ visibleBP)) {
+ return false;
+ }
+
+ /*
+ Back face.
+ Reverse winding relative to visible face.
+ */
+ if (!AddSide(
+ sides,
+ a2, c2, b2,
+ center,
+ options.caulkMaterial.c_str(),
+ caulkBP)) {
+ return false;
+ }
+
+ /*
+ Vertical edge faces.
+ These are deliberately vertical quads represented by 3 points.
+ */
+
+ // Edge AB.
+ if (!AddSide(
+ sides,
+ a, a2, b2,
+ center,
+ options.caulkMaterial.c_str(),
+ caulkBP)) {
+ return false;
+ }
+
+ // Edge BC.
+ if (!AddSide(
+ sides,
+ b, b2, c2,
+ center,
+ options.caulkMaterial.c_str(),
+ caulkBP)) {
+ return false;
+ }
+
+ // Edge CA.
+ if (!AddSide(
+ sides,
+ c, c2, a2,
+ center,
+ options.caulkMaterial.c_str(),
+ caulkBP)) {
+ return false;
+ }
+
+ idStr context = va(
+ "flatTriColumn material=%s up=%d a=(%.3f %.3f %.3f) b=(%.3f %.3f %.3f) c=(%.3f %.3f %.3f)",
+ visibleMaterial ? visibleMaterial : "",
+ visibleNormalShouldPointUp ? 1 : 0,
+ a.x, a.y, a.z,
+ b.x, b.y, b.z,
+ c.x, c.y, c.z
+ );
+
+ return AddBrushFromSides(sides, context.c_str());
+ }
+
+ static void CleanLoop(SectorLoop& loop) {
+ for (int guard = 0; guard < 8192 && loop.pts2.Num() > 2; guard++) {
+ bool removed = false;
+
+ for (int i = 0; i < loop.pts2.Num(); i++) {
+ const int n = (i + 1) % loop.pts2.Num();
+ if (SamePoint2D(loop.pts2[i], loop.pts2[n])) {
+ loop.pts2.RemoveIndex(n);
+ loop.wallIndices.RemoveIndex(n);
+ removed = true;
+ break;
+ }
+ }
+
+ if (removed) {
+ continue;
+ }
+
+ for (int i = 0; i < loop.pts2.Num(); i++) {
+ const int p = (i + loop.pts2.Num() - 1) % loop.pts2.Num();
+ const int n = (i + 1) % loop.pts2.Num();
+ if (idMath::Fabs(Cross2D(loop.pts2[p], loop.pts2[i], loop.pts2[n])) < 0.001f) {
+ loop.pts2.RemoveIndex(i);
+ loop.wallIndices.RemoveIndex(i);
+ removed = true;
+ break;
+ }
+ }
+
+ if (!removed) {
+ break;
+ }
+ }
+
+ loop.area = loop.pts2.Num() >= 3 ? Area2D(loop.pts2) : 0.0f;
+ }
+
+ bool ExtractSectorLoops(int sectorIndex, idList& loops) {
+ loops.SetNum(0);
+
+ if (sectorIndex < 0 || sectorIndex >= sectors.Num()) {
+ return false;
+ }
+
+ const BuildSector& sec = sectors[sectorIndex];
+ if (sec.wallptr < 0 || sec.wallnum < 3 || sec.wallptr + sec.wallnum > walls.Num()) {
+ return false;
+ }
+
+ idList used;
+ used.SetNum(sec.wallnum);
+ for (int i = 0; i < used.Num(); i++) {
+ used[i] = 0;
+ }
+
+ for (int startOfs = 0; startOfs < sec.wallnum; startOfs++) {
+ if (used[startOfs]) {
+ continue;
+ }
+
+ const int startWall = sec.wallptr + startOfs;
+ int wi = startWall;
+ bool closed = false;
+
+ SectorLoop loop;
+ loop.wallIndices.SetNum(0);
+ loop.pts2.SetNum(0);
+ loop.area = 0.0f;
+
+ for (int guard = 0; guard <= sec.wallnum; guard++) {
+ if (wi < sec.wallptr || wi >= sec.wallptr + sec.wallnum) {
+ break;
+ }
+
+ const int local = wi - sec.wallptr;
+ if (used[local]) {
+ if (wi == startWall) {
+ closed = true;
+ }
+ break;
+ }
+
+ used[local] = 1;
+
+ const BuildWall& w = walls[wi];
+ const idVec3 p = BuildPointToDoomFloat((float)w.x, (float)w.y, 0.0f);
+ loop.wallIndices.Append(wi);
+ loop.pts2.Append(idVec2(p.x, p.y));
+
+ if (w.point2 == startWall) {
+ closed = true;
+ break;
+ }
+
+ wi = w.point2;
+ }
+
+ CleanLoop(loop);
+
+ if (closed && loop.pts2.Num() >= 3 && idMath::Fabs(loop.area) > 0.01f) {
+ loops.Append(loop);
+ }
+ }
+
+ return loops.Num() > 0;
+ }
+
+ static bool PointOnSegment2D(const idVec2& a, const idVec2& p, const idVec2& b) {
+ if (idMath::Fabs(Cross2D(a, b, p)) > 0.01f) {
+ return false;
+ }
+ if (p.x < Min(a.x, b.x) - 0.01f || p.x > Max(a.x, b.x) + 0.01f) {
+ return false;
+ }
+ if (p.y < Min(a.y, b.y) - 0.01f || p.y > Max(a.y, b.y) + 0.01f) {
+ return false;
+ }
+ return true;
+ }
+
+ static bool SegmentIntersects2D(const idVec2& a, const idVec2& b, const idVec2& c, const idVec2& d) {
+ const float o1 = Cross2D(a, b, c);
+ const float o2 = Cross2D(a, b, d);
+ const float o3 = Cross2D(c, d, a);
+ const float o4 = Cross2D(c, d, b);
+ const float eps = 0.01f;
+
+ if (((o1 > eps && o2 < -eps) || (o1 < -eps && o2 > eps)) &&
+ ((o3 > eps && o4 < -eps) || (o3 < -eps && o4 > eps))) {
+ return true;
+ }
+
+ if (idMath::Fabs(o1) <= eps && PointOnSegment2D(a, c, b)) {
+ return true;
+ }
+ if (idMath::Fabs(o2) <= eps && PointOnSegment2D(a, d, b)) {
+ return true;
+ }
+ if (idMath::Fabs(o3) <= eps && PointOnSegment2D(c, a, d)) {
+ return true;
+ }
+ if (idMath::Fabs(o4) <= eps && PointOnSegment2D(c, b, d)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ static bool PointInLoop2D(const idVec2& p, const SectorLoop& loop) {
+ const idList& pts = loop.pts2;
+ if (pts.Num() < 3) {
+ return false;
+ }
+
+ bool inside = false;
+ for (int i = 0, j = pts.Num() - 1; i < pts.Num(); j = i++) {
+ const idVec2& a = pts[i];
+ const idVec2& b = pts[j];
+
+ if (PointOnSegment2D(a, p, b)) {
+ return true;
+ }
+
+ if (((a.y > p.y) != (b.y > p.y))) {
+ const float x = (b.x - a.x) * (p.y - a.y) / (b.y - a.y) + a.x;
+ if (p.x < x) {
+ inside = !inside;
+ }
+ }
+ }
+ return inside;
+ }
+
+ static float Area2DFlat(const idList& pts) {
+ float a = 0.0f;
+ for (int i = 0; i < pts.Num(); i++) {
+ const idVec2& p = pts[i].p;
+ const idVec2& q = pts[(i + 1) % pts.Num()].p;
+ a += p.x * q.y - q.x * p.y;
+ }
+ return a * 0.5f;
+ }
+
+ static void ReverseFlatPoly(idList& pts) {
+ const int n = pts.Num();
+ for (int i = 0; i < n / 2; i++) {
+ FlatPolyPoint tmp = pts[i];
+ pts[i] = pts[n - 1 - i];
+ pts[n - 1 - i] = tmp;
+ }
+ }
+
+ static void FlatPolyToVec2(const idList& in, idList& out) {
+ out.SetNum(0);
+ for (int i = 0; i < in.Num(); i++) {
+ out.Append(in[i].p);
+ }
+ }
+
+ bool LoopToFlatPoly(const SectorLoop& loop, idList& out) const {
+ out.SetNum(0);
+ if (loop.wallIndices.Num() != loop.pts2.Num()) {
+ return false;
+ }
+
+ for (int i = 0; i < loop.wallIndices.Num(); i++) {
+ const int wi = loop.wallIndices[i];
+ if (wi < 0 || wi >= walls.Num()) {
+ return false;
+ }
+
+ const BuildWall& w = walls[wi];
+ FlatPolyPoint fp;
+ fp.p = loop.pts2[i];
+ fp.buildX = w.x;
+ fp.buildY = w.y;
+ out.Append(fp);
+ }
+
+ return out.Num() >= 3;
+ }
+
+ static bool BridgeSegmentClearForPoly(const idList& poly, const idVec2& a, const idVec2& b) {
+ for (int i = 0; i < poly.Num(); i++) {
+ const idVec2& c = poly[i].p;
+ const idVec2& d = poly[(i + 1) % poly.Num()].p;
+
+ // Intersections at the intended bridge endpoint are allowed.
+ if (SamePoint2D(c, b) || SamePoint2D(d, b) || SamePoint2D(c, a) || SamePoint2D(d, a)) {
+ continue;
+ }
+
+ if (SegmentIntersects2D(a, b, c, d)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ static bool CanBridgeHoleToPoly(const idList& poly, const idList& hole, int polyIndex, int holeIndex) {
+ if (polyIndex < 0 || polyIndex >= poly.Num() || holeIndex < 0 || holeIndex >= hole.Num()) {
+ return false;
+ }
+
+ const idVec2 a = hole[holeIndex].p;
+ const idVec2 b = poly[polyIndex].p;
+ if (SamePoint2D(a, b)) {
+ return false;
+ }
+
+ if (!BridgeSegmentClearForPoly(poly, a, b)) {
+ return false;
+ }
+
+ for (int i = 0; i < hole.Num(); i++) {
+ const idVec2& c = hole[i].p;
+ const idVec2& d = hole[(i + 1) % hole.Num()].p;
+
+ // Intersections at the hole bridge endpoint are allowed.
+ if (SamePoint2D(c, a) || SamePoint2D(d, a) || SamePoint2D(c, b) || SamePoint2D(d, b)) {
+ continue;
+ }
+
+ if (SegmentIntersects2D(a, b, c, d)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ static bool BridgeHoleIntoPolygon(idList& poly, const idList& hole) {
+ if (poly.Num() < 3 || hole.Num() < 3) {
+ return false;
+ }
+
+ int holeIndex = 0;
+ for (int i = 1; i < hole.Num(); i++) {
+ if (hole[i].p.x > hole[holeIndex].p.x ||
+ (idMath::Fabs(hole[i].p.x - hole[holeIndex].p.x) < 0.01f && hole[i].p.y < hole[holeIndex].p.y)) {
+ holeIndex = i;
+ }
+ }
+
+ int bestPolyIndex = -1;
+ float bestDistSqr = 1.0e30f;
+
+ // Prefer a rightward bridge from the hole's rightmost point. If that
+ // fails because the polygon is oddly shaped, do a second pass allowing
+ // any visible vertex. E1L1's multi-loop sectors are small enough that
+ // this O(n^2) visibility test is fine.
+ for (int pass = 0; pass < 2; pass++) {
+ for (int i = 0; i < poly.Num(); i++) {
+ if (pass == 0 && poly[i].p.x < hole[holeIndex].p.x - 0.01f) {
+ continue;
+ }
+ if (!CanBridgeHoleToPoly(poly, hole, i, holeIndex)) {
+ continue;
+ }
+
+ const idVec2 d = poly[i].p - hole[holeIndex].p;
+ const float ds = d.x * d.x + d.y * d.y;
+ if (ds < bestDistSqr) {
+ bestDistSqr = ds;
+ bestPolyIndex = i;
+ }
+ }
+ if (bestPolyIndex >= 0) {
+ break;
+ }
+ }
+
+ if (bestPolyIndex < 0) {
+ return false;
+ }
+
+ idList merged;
+ merged.SetNum(0);
+
+ for (int i = 0; i <= bestPolyIndex; i++) {
+ merged.Append(poly[i]);
+ }
+
+ // The duplicate hole and poly endpoints create the two sides of the
+ // bridge. TriangulateSimplePolygon skips duplicated bridge endpoints
+ // when testing whether an ear contains another vertex.
+ for (int k = 0; k < hole.Num(); k++) {
+ merged.Append(hole[(holeIndex + k) % hole.Num()]);
+ }
+ merged.Append(hole[holeIndex]);
+ merged.Append(poly[bestPolyIndex]);
+
+ for (int i = bestPolyIndex + 1; i < poly.Num(); i++) {
+ merged.Append(poly[i]);
+ }
+
+ poly = merged;
+ return true;
+ }
+
+ int AddFlatTrianglesForPoly(const BuildSector& sec, const idList& poly, const idList& tris) {
+ idList floorPts;
+ idList ceilPts;
+ floorPts.SetNum(0);
+ ceilPts.SetNum(0);
+
+ for (int i = 0; i < poly.Num(); i++) {
+ floorPts.Append(BuildSurfacePointToDoom(sec, false, poly[i].buildX, poly[i].buildY));
+ ceilPts.Append(BuildSurfacePointToDoom(sec, true, poly[i].buildX, poly[i].buildY));
+ }
+
+ int count = 0;
+
+ if (options.importFloors) {
+ idStr floorMat = TileMaterialName(sec.floorpicnum);
+
+ for (int i = 0; i < tris.Num(); i++) {
+ const idVec3& a = floorPts[tris[i].a];
+ const idVec3& b = floorPts[tris[i].b];
+ const idVec3& c = floorPts[tris[i].c];
+
+ idPlane p;
+ if (!p.FromPoints(a, b, c, false)) {
+ runStats.rejectedFlatTris++;
+ continue;
+ }
+
+ // Floor visible face should point up.
+ if (p.Normal().z < 0.0f) {
+ FlipPlane(p);
+ }
+
+ brushprimit_texdef_t bp = MakeFlatUV(sec, false, p.Normal());
+ if (AddTriSlabBrush(a, b, c, options.floorCeilingThickness, true, floorMat.c_str(), bp)) {
+ count++;
+ }
+ }
+ }
+
+ if (options.importCeilings) {
+ idStr ceilMat = TileMaterialName(sec.ceilingpicnum);
+
+ for (int i = 0; i < tris.Num(); i++) {
+ const idVec3& a = ceilPts[tris[i].a];
+ const idVec3& b = ceilPts[tris[i].b];
+ const idVec3& c = ceilPts[tris[i].c];
+
+ idPlane p;
+ if (!p.FromPoints(a, b, c, false)) {
+ runStats.rejectedFlatTris++;
+ continue;
+ }
+
+ // Ceiling visible face should point downward.
+ if (p.Normal().z > 0.0f) {
+ FlipPlane(p);
+ }
+
+ brushprimit_texdef_t bp = MakeFlatUV(sec, true, p.Normal());
+ if (AddTriSlabBrush(a, b, c, options.floorCeilingThickness, false, ceilMat.c_str(), bp)) {
+ count++;
+ }
+ }
+ }
+
+ return count;
+ }
+
+ int ImportSectorFlats(int sectorIndex) {
+ BuildSector& sec = sectors[sectorIndex];
+
+ idList loops;
+ if (!ExtractSectorLoops(sectorIndex, loops)) {
+ common->Printf("DukeBuildMapImporter: no valid wall loops for sector %d\n", sectorIndex);
+ return 0;
+ }
+
+ idList depth;
+ idList parent;
+ depth.SetNum(loops.Num());
+ parent.SetNum(loops.Num());
+
+ for (int i = 0; i < loops.Num(); i++) {
+ depth[i] = 0;
+ parent[i] = -1;
+ float parentArea = 1.0e30f;
+
+ if (loops[i].pts2.Num() <= 0) {
+ continue;
+ }
+
+ const idVec2 testPoint = loops[i].pts2[0];
+ const float myArea = idMath::Fabs(loops[i].area);
+
+ for (int j = 0; j < loops.Num(); j++) {
+ if (i == j) {
+ continue;
+ }
+
+ const float otherArea = idMath::Fabs(loops[j].area);
+ if (otherArea <= myArea + 0.01f) {
+ continue;
+ }
+
+ if (PointInLoop2D(testPoint, loops[j])) {
+ depth[i]++;
+ if (otherArea < parentArea) {
+ parentArea = otherArea;
+ parent[i] = j;
+ }
+ }
+ }
+ }
+
+ int count = 0;
+
+ for (int l = 0; l < loops.Num(); l++) {
+ if ((depth[l] & 1) != 0) {
+ // Odd-depth loops are holes. They are bridged into their parent
+ // even-depth island below, not imported as independent floors.
+ continue;
+ }
+
+ idList poly;
+ if (!LoopToFlatPoly(loops[l], poly)) {
+ continue;
+ }
+
+ // Work in CCW order for hole bridging. Triangle winding is corrected
+ // per floor/ceiling face after 3D slope sampling.
+ if (Area2DFlat(poly) < 0.0f) {
+ ReverseFlatPoly(poly);
+ }
+
+ int bridgedHoles = 0;
+ int failedHoleBridges = 0;
+ for (int h = 0; h < loops.Num(); h++) {
+ if (parent[h] != l || (depth[h] & 1) == 0) {
+ continue;
+ }
+
+ idList hole;
+ if (!LoopToFlatPoly(loops[h], hole)) {
+ continue;
+ }
+
+ // Holes are traversed clockwise inside the CCW outer loop.
+ if (Area2DFlat(hole) > 0.0f) {
+ ReverseFlatPoly(hole);
+ }
+
+ if (BridgeHoleIntoPolygon(poly, hole)) {
+ bridgedHoles++;
+ }
+ else {
+ failedHoleBridges++;
+ }
+ }
+
+ idList pts2;
+ FlatPolyToVec2(poly, pts2);
+
+ idList tris;
+ if (!TriangulateSimplePolygon(pts2, tris)) {
+ common->Printf(
+ "DukeBuildMapImporter: could not triangulate sector %d loop %d after hole bridging, holes=%d failed=%d\n",
+ sectorIndex,
+ l,
+ bridgedHoles,
+ failedHoleBridges
+ );
+ runStats.rejectedFlatTris++;
+ continue;
+ }
+
+ count += AddFlatTrianglesForPoly(sec, poly, tris);
+ }
+
+ return count;
+ }
+
+};
+
+void DoImportDukeBuildMap(const char* fileName) {
+ idDukeBuildMapImporter importer;
+ idDukeBuildMapImporter::Options opt;
+
+ /*
+ Good defaults.
+ */
+ opt.mapScale = 1.0f / 8.0f;
+ opt.zScale = opt.mapScale / 16.0f;
+
+ opt.wallThickness = 2.0f;
+ opt.floorCeilingThickness = 8.0f;
+
+ opt.importWalls = true;
+ opt.importFloors = true;
+ opt.importCeilings = true;
+ opt.importMaskedWalls = false;
+
+ opt.tileMaterialPrefix = "textures/duke3d/tiles";
+ opt.caulkMaterial = "textures/common/caulk";
+
+ /*
+ Texture tuning.
+ */
+ opt.wallRepeatBase = 8.0f;
+ opt.flatRepeatBase = 16.0f;
+
+ if (!importer.ImportIntoCurrentRadiantMap(fileName, opt)) {
+ common->Warning(
+ "Duke MAP import failed: %s",
+ importer.GetLastError()
+ );
+ }
+}
diff --git a/neo/tools/radiant/ECLASS.CPP b/neo/engine/tools/radiant/ECLASS.CPP
similarity index 100%
rename from neo/tools/radiant/ECLASS.CPP
rename to neo/engine/tools/radiant/ECLASS.CPP
diff --git a/neo/tools/radiant/EditViewDlg.cpp b/neo/engine/tools/radiant/EditViewDlg.cpp
similarity index 100%
rename from neo/tools/radiant/EditViewDlg.cpp
rename to neo/engine/tools/radiant/EditViewDlg.cpp
diff --git a/neo/tools/radiant/EditViewDlg.h b/neo/engine/tools/radiant/EditViewDlg.h
similarity index 100%
rename from neo/tools/radiant/EditViewDlg.h
rename to neo/engine/tools/radiant/EditViewDlg.h
diff --git a/neo/tools/radiant/EditorBrush.cpp b/neo/engine/tools/radiant/EditorBrush.cpp
similarity index 100%
rename from neo/tools/radiant/EditorBrush.cpp
rename to neo/engine/tools/radiant/EditorBrush.cpp
diff --git a/neo/tools/radiant/EditorBrush.h b/neo/engine/tools/radiant/EditorBrush.h
similarity index 100%
rename from neo/tools/radiant/EditorBrush.h
rename to neo/engine/tools/radiant/EditorBrush.h
diff --git a/neo/tools/radiant/EditorBrushPrimit.cpp b/neo/engine/tools/radiant/EditorBrushPrimit.cpp
similarity index 100%
rename from neo/tools/radiant/EditorBrushPrimit.cpp
rename to neo/engine/tools/radiant/EditorBrushPrimit.cpp
diff --git a/neo/tools/radiant/EditorEntity.cpp b/neo/engine/tools/radiant/EditorEntity.cpp
similarity index 100%
rename from neo/tools/radiant/EditorEntity.cpp
rename to neo/engine/tools/radiant/EditorEntity.cpp
diff --git a/neo/tools/radiant/EditorEntity.h b/neo/engine/tools/radiant/EditorEntity.h
similarity index 100%
rename from neo/tools/radiant/EditorEntity.h
rename to neo/engine/tools/radiant/EditorEntity.h
diff --git a/neo/tools/radiant/EditorMap.cpp b/neo/engine/tools/radiant/EditorMap.cpp
similarity index 100%
rename from neo/tools/radiant/EditorMap.cpp
rename to neo/engine/tools/radiant/EditorMap.cpp
diff --git a/neo/tools/radiant/EditorMap.h b/neo/engine/tools/radiant/EditorMap.h
similarity index 100%
rename from neo/tools/radiant/EditorMap.h
rename to neo/engine/tools/radiant/EditorMap.h
diff --git a/neo/tools/radiant/EntKeyFindReplace.cpp b/neo/engine/tools/radiant/EntKeyFindReplace.cpp
similarity index 100%
rename from neo/tools/radiant/EntKeyFindReplace.cpp
rename to neo/engine/tools/radiant/EntKeyFindReplace.cpp
diff --git a/neo/tools/radiant/EntKeyFindReplace.h b/neo/engine/tools/radiant/EntKeyFindReplace.h
similarity index 100%
rename from neo/tools/radiant/EntKeyFindReplace.h
rename to neo/engine/tools/radiant/EntKeyFindReplace.h
diff --git a/neo/tools/radiant/EntityDlg.cpp b/neo/engine/tools/radiant/EntityDlg.cpp
similarity index 100%
rename from neo/tools/radiant/EntityDlg.cpp
rename to neo/engine/tools/radiant/EntityDlg.cpp
diff --git a/neo/tools/radiant/EntityDlg.h b/neo/engine/tools/radiant/EntityDlg.h
similarity index 100%
rename from neo/tools/radiant/EntityDlg.h
rename to neo/engine/tools/radiant/EntityDlg.h
diff --git a/neo/tools/radiant/EntityListDlg.cpp b/neo/engine/tools/radiant/EntityListDlg.cpp
similarity index 100%
rename from neo/tools/radiant/EntityListDlg.cpp
rename to neo/engine/tools/radiant/EntityListDlg.cpp
diff --git a/neo/tools/radiant/EntityListDlg.h b/neo/engine/tools/radiant/EntityListDlg.h
similarity index 100%
rename from neo/tools/radiant/EntityListDlg.h
rename to neo/engine/tools/radiant/EntityListDlg.h
diff --git a/neo/tools/radiant/FindTextureDlg.cpp b/neo/engine/tools/radiant/FindTextureDlg.cpp
similarity index 100%
rename from neo/tools/radiant/FindTextureDlg.cpp
rename to neo/engine/tools/radiant/FindTextureDlg.cpp
diff --git a/neo/tools/radiant/FindTextureDlg.h b/neo/engine/tools/radiant/FindTextureDlg.h
similarity index 100%
rename from neo/tools/radiant/FindTextureDlg.h
rename to neo/engine/tools/radiant/FindTextureDlg.h
diff --git a/neo/tools/radiant/GLWidget.cpp b/neo/engine/tools/radiant/GLWidget.cpp
similarity index 100%
rename from neo/tools/radiant/GLWidget.cpp
rename to neo/engine/tools/radiant/GLWidget.cpp
diff --git a/neo/tools/radiant/GLWidget.h b/neo/engine/tools/radiant/GLWidget.h
similarity index 100%
rename from neo/tools/radiant/GLWidget.h
rename to neo/engine/tools/radiant/GLWidget.h
diff --git a/neo/tools/radiant/GetString.cpp b/neo/engine/tools/radiant/GetString.cpp
similarity index 100%
rename from neo/tools/radiant/GetString.cpp
rename to neo/engine/tools/radiant/GetString.cpp
diff --git a/neo/tools/radiant/GetString.h b/neo/engine/tools/radiant/GetString.h
similarity index 100%
rename from neo/tools/radiant/GetString.h
rename to neo/engine/tools/radiant/GetString.h
diff --git a/neo/tools/radiant/InspectorDialog.cpp b/neo/engine/tools/radiant/InspectorDialog.cpp
similarity index 100%
rename from neo/tools/radiant/InspectorDialog.cpp
rename to neo/engine/tools/radiant/InspectorDialog.cpp
diff --git a/neo/tools/radiant/InspectorDialog.h b/neo/engine/tools/radiant/InspectorDialog.h
similarity index 100%
rename from neo/tools/radiant/InspectorDialog.h
rename to neo/engine/tools/radiant/InspectorDialog.h
diff --git a/neo/tools/radiant/LightDlg.cpp b/neo/engine/tools/radiant/LightDlg.cpp
similarity index 99%
rename from neo/tools/radiant/LightDlg.cpp
rename to neo/engine/tools/radiant/LightDlg.cpp
index b04003be..358f7331 100644
--- a/neo/tools/radiant/LightDlg.cpp
+++ b/neo/engine/tools/radiant/LightDlg.cpp
@@ -31,7 +31,6 @@ If you have questions concerning this license or the applicable additional terms
#include "qe3.h"
#include "Radiant.h"
-#include "../../game/game.h"
#include "../comafx/DialogColorPicker.h"
#include "LightDlg.h"
diff --git a/neo/tools/radiant/LightDlg.h b/neo/engine/tools/radiant/LightDlg.h
similarity index 100%
rename from neo/tools/radiant/LightDlg.h
rename to neo/engine/tools/radiant/LightDlg.h
diff --git a/neo/tools/radiant/MRU.CPP b/neo/engine/tools/radiant/MRU.CPP
similarity index 100%
rename from neo/tools/radiant/MRU.CPP
rename to neo/engine/tools/radiant/MRU.CPP
diff --git a/neo/tools/radiant/MRU.H b/neo/engine/tools/radiant/MRU.H
similarity index 100%
rename from neo/tools/radiant/MRU.H
rename to neo/engine/tools/radiant/MRU.H
diff --git a/neo/tools/radiant/MainFrm.cpp b/neo/engine/tools/radiant/MainFrm.cpp
similarity index 100%
rename from neo/tools/radiant/MainFrm.cpp
rename to neo/engine/tools/radiant/MainFrm.cpp
diff --git a/neo/tools/radiant/MainFrm.h b/neo/engine/tools/radiant/MainFrm.h
similarity index 100%
rename from neo/tools/radiant/MainFrm.h
rename to neo/engine/tools/radiant/MainFrm.h
diff --git a/neo/tools/radiant/MapInfo.cpp b/neo/engine/tools/radiant/MapInfo.cpp
similarity index 100%
rename from neo/tools/radiant/MapInfo.cpp
rename to neo/engine/tools/radiant/MapInfo.cpp
diff --git a/neo/tools/radiant/MapInfo.h b/neo/engine/tools/radiant/MapInfo.h
similarity index 100%
rename from neo/tools/radiant/MapInfo.h
rename to neo/engine/tools/radiant/MapInfo.h
diff --git a/neo/tools/radiant/MediaPreviewDlg.cpp b/neo/engine/tools/radiant/MediaPreviewDlg.cpp
similarity index 100%
rename from neo/tools/radiant/MediaPreviewDlg.cpp
rename to neo/engine/tools/radiant/MediaPreviewDlg.cpp
diff --git a/neo/tools/radiant/MediaPreviewDlg.h b/neo/engine/tools/radiant/MediaPreviewDlg.h
similarity index 100%
rename from neo/tools/radiant/MediaPreviewDlg.h
rename to neo/engine/tools/radiant/MediaPreviewDlg.h
diff --git a/neo/tools/radiant/NewProjDlg.cpp b/neo/engine/tools/radiant/NewProjDlg.cpp
similarity index 100%
rename from neo/tools/radiant/NewProjDlg.cpp
rename to neo/engine/tools/radiant/NewProjDlg.cpp
diff --git a/neo/tools/radiant/NewProjDlg.h b/neo/engine/tools/radiant/NewProjDlg.h
similarity index 100%
rename from neo/tools/radiant/NewProjDlg.h
rename to neo/engine/tools/radiant/NewProjDlg.h
diff --git a/neo/tools/radiant/NewTexWnd.cpp b/neo/engine/tools/radiant/NewTexWnd.cpp
similarity index 100%
rename from neo/tools/radiant/NewTexWnd.cpp
rename to neo/engine/tools/radiant/NewTexWnd.cpp
diff --git a/neo/tools/radiant/NewTexWnd.h b/neo/engine/tools/radiant/NewTexWnd.h
similarity index 100%
rename from neo/tools/radiant/NewTexWnd.h
rename to neo/engine/tools/radiant/NewTexWnd.h
diff --git a/neo/tools/radiant/OutlinerDlg.cpp b/neo/engine/tools/radiant/OutlinerDlg.cpp
similarity index 100%
rename from neo/tools/radiant/OutlinerDlg.cpp
rename to neo/engine/tools/radiant/OutlinerDlg.cpp
diff --git a/neo/tools/radiant/OutlinerDlg.h b/neo/engine/tools/radiant/OutlinerDlg.h
similarity index 100%
rename from neo/tools/radiant/OutlinerDlg.h
rename to neo/engine/tools/radiant/OutlinerDlg.h
diff --git a/neo/tools/radiant/PARSE.CPP b/neo/engine/tools/radiant/PARSE.CPP
similarity index 100%
rename from neo/tools/radiant/PARSE.CPP
rename to neo/engine/tools/radiant/PARSE.CPP
diff --git a/neo/tools/radiant/PARSE.H b/neo/engine/tools/radiant/PARSE.H
similarity index 100%
rename from neo/tools/radiant/PARSE.H
rename to neo/engine/tools/radiant/PARSE.H
diff --git a/neo/tools/radiant/PMESH.CPP b/neo/engine/tools/radiant/PMESH.CPP
similarity index 100%
rename from neo/tools/radiant/PMESH.CPP
rename to neo/engine/tools/radiant/PMESH.CPP
diff --git a/neo/tools/radiant/PMESH.H b/neo/engine/tools/radiant/PMESH.H
similarity index 100%
rename from neo/tools/radiant/PMESH.H
rename to neo/engine/tools/radiant/PMESH.H
diff --git a/neo/tools/radiant/PatchDensityDlg.cpp b/neo/engine/tools/radiant/PatchDensityDlg.cpp
similarity index 100%
rename from neo/tools/radiant/PatchDensityDlg.cpp
rename to neo/engine/tools/radiant/PatchDensityDlg.cpp
diff --git a/neo/tools/radiant/PatchDensityDlg.h b/neo/engine/tools/radiant/PatchDensityDlg.h
similarity index 100%
rename from neo/tools/radiant/PatchDensityDlg.h
rename to neo/engine/tools/radiant/PatchDensityDlg.h
diff --git a/neo/tools/radiant/PatchDialog.cpp b/neo/engine/tools/radiant/PatchDialog.cpp
similarity index 100%
rename from neo/tools/radiant/PatchDialog.cpp
rename to neo/engine/tools/radiant/PatchDialog.cpp
diff --git a/neo/tools/radiant/PatchDialog.h b/neo/engine/tools/radiant/PatchDialog.h
similarity index 100%
rename from neo/tools/radiant/PatchDialog.h
rename to neo/engine/tools/radiant/PatchDialog.h
diff --git a/neo/tools/radiant/PointFile.cpp b/neo/engine/tools/radiant/PointFile.cpp
similarity index 100%
rename from neo/tools/radiant/PointFile.cpp
rename to neo/engine/tools/radiant/PointFile.cpp
diff --git a/neo/tools/radiant/PrefsDlg.cpp b/neo/engine/tools/radiant/PrefsDlg.cpp
similarity index 100%
rename from neo/tools/radiant/PrefsDlg.cpp
rename to neo/engine/tools/radiant/PrefsDlg.cpp
diff --git a/neo/tools/radiant/PrefsDlg.h b/neo/engine/tools/radiant/PrefsDlg.h
similarity index 100%
rename from neo/tools/radiant/PrefsDlg.h
rename to neo/engine/tools/radiant/PrefsDlg.h
diff --git a/neo/tools/radiant/PreviewDlg.cpp b/neo/engine/tools/radiant/PreviewDlg.cpp
similarity index 100%
rename from neo/tools/radiant/PreviewDlg.cpp
rename to neo/engine/tools/radiant/PreviewDlg.cpp
diff --git a/neo/tools/radiant/PreviewDlg.h b/neo/engine/tools/radiant/PreviewDlg.h
similarity index 100%
rename from neo/tools/radiant/PreviewDlg.h
rename to neo/engine/tools/radiant/PreviewDlg.h
diff --git a/neo/tools/radiant/PropertyList.cpp b/neo/engine/tools/radiant/PropertyList.cpp
similarity index 100%
rename from neo/tools/radiant/PropertyList.cpp
rename to neo/engine/tools/radiant/PropertyList.cpp
diff --git a/neo/tools/radiant/PropertyList.h b/neo/engine/tools/radiant/PropertyList.h
similarity index 100%
rename from neo/tools/radiant/PropertyList.h
rename to neo/engine/tools/radiant/PropertyList.h
diff --git a/neo/tools/radiant/QE3.CPP b/neo/engine/tools/radiant/QE3.CPP
similarity index 100%
rename from neo/tools/radiant/QE3.CPP
rename to neo/engine/tools/radiant/QE3.CPP
diff --git a/neo/tools/radiant/QE3.H b/neo/engine/tools/radiant/QE3.H
similarity index 100%
rename from neo/tools/radiant/QE3.H
rename to neo/engine/tools/radiant/QE3.H
diff --git a/neo/tools/radiant/QEDEFS.H b/neo/engine/tools/radiant/QEDEFS.H
similarity index 100%
rename from neo/tools/radiant/QEDEFS.H
rename to neo/engine/tools/radiant/QEDEFS.H
diff --git a/neo/tools/radiant/QERTYPES.H b/neo/engine/tools/radiant/QERTYPES.H
similarity index 100%
rename from neo/tools/radiant/QERTYPES.H
rename to neo/engine/tools/radiant/QERTYPES.H
diff --git a/neo/tools/radiant/Radiant.cpp b/neo/engine/tools/radiant/Radiant.cpp
similarity index 100%
rename from neo/tools/radiant/Radiant.cpp
rename to neo/engine/tools/radiant/Radiant.cpp
diff --git a/neo/tools/radiant/Radiant.h b/neo/engine/tools/radiant/Radiant.h
similarity index 100%
rename from neo/tools/radiant/Radiant.h
rename to neo/engine/tools/radiant/Radiant.h
diff --git a/neo/tools/radiant/RotateDlg.cpp b/neo/engine/tools/radiant/RotateDlg.cpp
similarity index 100%
rename from neo/tools/radiant/RotateDlg.cpp
rename to neo/engine/tools/radiant/RotateDlg.cpp
diff --git a/neo/tools/radiant/RotateDlg.h b/neo/engine/tools/radiant/RotateDlg.h
similarity index 100%
rename from neo/tools/radiant/RotateDlg.h
rename to neo/engine/tools/radiant/RotateDlg.h
diff --git a/neo/tools/radiant/SELECT.CPP b/neo/engine/tools/radiant/SELECT.CPP
similarity index 100%
rename from neo/tools/radiant/SELECT.CPP
rename to neo/engine/tools/radiant/SELECT.CPP
diff --git a/neo/tools/radiant/SELECT.H b/neo/engine/tools/radiant/SELECT.H
similarity index 100%
rename from neo/tools/radiant/SELECT.H
rename to neo/engine/tools/radiant/SELECT.H
diff --git a/neo/tools/radiant/ScaleDialog.cpp b/neo/engine/tools/radiant/ScaleDialog.cpp
similarity index 100%
rename from neo/tools/radiant/ScaleDialog.cpp
rename to neo/engine/tools/radiant/ScaleDialog.cpp
diff --git a/neo/tools/radiant/ScaleDialog.h b/neo/engine/tools/radiant/ScaleDialog.h
similarity index 100%
rename from neo/tools/radiant/ScaleDialog.h
rename to neo/engine/tools/radiant/ScaleDialog.h
diff --git a/neo/tools/radiant/SurfaceDlg.cpp b/neo/engine/tools/radiant/SurfaceDlg.cpp
similarity index 100%
rename from neo/tools/radiant/SurfaceDlg.cpp
rename to neo/engine/tools/radiant/SurfaceDlg.cpp
diff --git a/neo/tools/radiant/SurfaceDlg.h b/neo/engine/tools/radiant/SurfaceDlg.h
similarity index 100%
rename from neo/tools/radiant/SurfaceDlg.h
rename to neo/engine/tools/radiant/SurfaceDlg.h
diff --git a/neo/tools/radiant/TabsDlg.cpp b/neo/engine/tools/radiant/TabsDlg.cpp
similarity index 100%
rename from neo/tools/radiant/TabsDlg.cpp
rename to neo/engine/tools/radiant/TabsDlg.cpp
diff --git a/neo/tools/radiant/TabsDlg.h b/neo/engine/tools/radiant/TabsDlg.h
similarity index 100%
rename from neo/tools/radiant/TabsDlg.h
rename to neo/engine/tools/radiant/TabsDlg.h
diff --git a/neo/tools/radiant/TearoffContainerWindow.cpp b/neo/engine/tools/radiant/TearoffContainerWindow.cpp
similarity index 100%
rename from neo/tools/radiant/TearoffContainerWindow.cpp
rename to neo/engine/tools/radiant/TearoffContainerWindow.cpp
diff --git a/neo/tools/radiant/TearoffContainerWindow.h b/neo/engine/tools/radiant/TearoffContainerWindow.h
similarity index 100%
rename from neo/tools/radiant/TearoffContainerWindow.h
rename to neo/engine/tools/radiant/TearoffContainerWindow.h
diff --git a/neo/tools/radiant/TextureBar.cpp b/neo/engine/tools/radiant/TextureBar.cpp
similarity index 100%
rename from neo/tools/radiant/TextureBar.cpp
rename to neo/engine/tools/radiant/TextureBar.cpp
diff --git a/neo/tools/radiant/TextureBar.h b/neo/engine/tools/radiant/TextureBar.h
similarity index 100%
rename from neo/tools/radiant/TextureBar.h
rename to neo/engine/tools/radiant/TextureBar.h
diff --git a/neo/tools/radiant/Textures.h b/neo/engine/tools/radiant/Textures.h
similarity index 100%
rename from neo/tools/radiant/Textures.h
rename to neo/engine/tools/radiant/Textures.h
diff --git a/neo/tools/radiant/Undo.cpp b/neo/engine/tools/radiant/Undo.cpp
similarity index 100%
rename from neo/tools/radiant/Undo.cpp
rename to neo/engine/tools/radiant/Undo.cpp
diff --git a/neo/tools/radiant/Undo.h b/neo/engine/tools/radiant/Undo.h
similarity index 100%
rename from neo/tools/radiant/Undo.h
rename to neo/engine/tools/radiant/Undo.h
diff --git a/neo/tools/radiant/VERTSEL.CPP b/neo/engine/tools/radiant/VERTSEL.CPP
similarity index 100%
rename from neo/tools/radiant/VERTSEL.CPP
rename to neo/engine/tools/radiant/VERTSEL.CPP
diff --git a/neo/tools/radiant/WIN_DLG.CPP b/neo/engine/tools/radiant/WIN_DLG.CPP
similarity index 100%
rename from neo/tools/radiant/WIN_DLG.CPP
rename to neo/engine/tools/radiant/WIN_DLG.CPP
diff --git a/neo/tools/radiant/WIN_QE3.CPP b/neo/engine/tools/radiant/WIN_QE3.CPP
similarity index 100%
rename from neo/tools/radiant/WIN_QE3.CPP
rename to neo/engine/tools/radiant/WIN_QE3.CPP
diff --git a/neo/tools/radiant/WIN_QE3.RC2 b/neo/engine/tools/radiant/WIN_QE3.RC2
similarity index 100%
rename from neo/tools/radiant/WIN_QE3.RC2
rename to neo/engine/tools/radiant/WIN_QE3.RC2
diff --git a/neo/tools/radiant/WaitDlg.cpp b/neo/engine/tools/radiant/WaitDlg.cpp
similarity index 100%
rename from neo/tools/radiant/WaitDlg.cpp
rename to neo/engine/tools/radiant/WaitDlg.cpp
diff --git a/neo/tools/radiant/WaitDlg.h b/neo/engine/tools/radiant/WaitDlg.h
similarity index 100%
rename from neo/tools/radiant/WaitDlg.h
rename to neo/engine/tools/radiant/WaitDlg.h
diff --git a/neo/tools/radiant/WaveOpen.cpp b/neo/engine/tools/radiant/WaveOpen.cpp
similarity index 100%
rename from neo/tools/radiant/WaveOpen.cpp
rename to neo/engine/tools/radiant/WaveOpen.cpp
diff --git a/neo/tools/radiant/WaveOpen.h b/neo/engine/tools/radiant/WaveOpen.h
similarity index 100%
rename from neo/tools/radiant/WaveOpen.h
rename to neo/engine/tools/radiant/WaveOpen.h
diff --git a/neo/tools/radiant/XYWnd.cpp b/neo/engine/tools/radiant/XYWnd.cpp
similarity index 100%
rename from neo/tools/radiant/XYWnd.cpp
rename to neo/engine/tools/radiant/XYWnd.cpp
diff --git a/neo/tools/radiant/XYWnd.h b/neo/engine/tools/radiant/XYWnd.h
similarity index 100%
rename from neo/tools/radiant/XYWnd.h
rename to neo/engine/tools/radiant/XYWnd.h
diff --git a/neo/tools/radiant/Z.CPP b/neo/engine/tools/radiant/Z.CPP
similarity index 100%
rename from neo/tools/radiant/Z.CPP
rename to neo/engine/tools/radiant/Z.CPP
diff --git a/neo/tools/radiant/Z.H b/neo/engine/tools/radiant/Z.H
similarity index 100%
rename from neo/tools/radiant/Z.H
rename to neo/engine/tools/radiant/Z.H
diff --git a/neo/tools/radiant/ZClip.cpp b/neo/engine/tools/radiant/ZClip.cpp
similarity index 100%
rename from neo/tools/radiant/ZClip.cpp
rename to neo/engine/tools/radiant/ZClip.cpp
diff --git a/neo/tools/radiant/ZClip.h b/neo/engine/tools/radiant/ZClip.h
similarity index 100%
rename from neo/tools/radiant/ZClip.h
rename to neo/engine/tools/radiant/ZClip.h
diff --git a/neo/tools/radiant/ZWnd.cpp b/neo/engine/tools/radiant/ZWnd.cpp
similarity index 100%
rename from neo/tools/radiant/ZWnd.cpp
rename to neo/engine/tools/radiant/ZWnd.cpp
diff --git a/neo/tools/radiant/ZWnd.h b/neo/engine/tools/radiant/ZWnd.h
similarity index 100%
rename from neo/tools/radiant/ZWnd.h
rename to neo/engine/tools/radiant/ZWnd.h
diff --git a/neo/tools/radiant/autocaulk.cpp b/neo/engine/tools/radiant/autocaulk.cpp
similarity index 100%
rename from neo/tools/radiant/autocaulk.cpp
rename to neo/engine/tools/radiant/autocaulk.cpp
diff --git a/neo/tools/radiant/autocaulk.h b/neo/engine/tools/radiant/autocaulk.h
similarity index 100%
rename from neo/tools/radiant/autocaulk.h
rename to neo/engine/tools/radiant/autocaulk.h
diff --git a/neo/tools/radiant/cmdlib.cpp b/neo/engine/tools/radiant/cmdlib.cpp
similarity index 100%
rename from neo/tools/radiant/cmdlib.cpp
rename to neo/engine/tools/radiant/cmdlib.cpp
diff --git a/neo/tools/radiant/cmdlib.h b/neo/engine/tools/radiant/cmdlib.h
similarity index 100%
rename from neo/tools/radiant/cmdlib.h
rename to neo/engine/tools/radiant/cmdlib.h
diff --git a/neo/tools/radiant/splines.cpp b/neo/engine/tools/radiant/splines.cpp
similarity index 100%
rename from neo/tools/radiant/splines.cpp
rename to neo/engine/tools/radiant/splines.cpp
diff --git a/neo/tools/radiant/splines.h b/neo/engine/tools/radiant/splines.h
similarity index 100%
rename from neo/tools/radiant/splines.h
rename to neo/engine/tools/radiant/splines.h
diff --git a/neo/tools/script/DialogScriptEditor.cpp b/neo/engine/tools/script/DialogScriptEditor.cpp
similarity index 100%
rename from neo/tools/script/DialogScriptEditor.cpp
rename to neo/engine/tools/script/DialogScriptEditor.cpp
diff --git a/neo/tools/script/DialogScriptEditor.h b/neo/engine/tools/script/DialogScriptEditor.h
similarity index 100%
rename from neo/tools/script/DialogScriptEditor.h
rename to neo/engine/tools/script/DialogScriptEditor.h
diff --git a/neo/tools/sound/DialogSound.cpp b/neo/engine/tools/sound/DialogSound.cpp
similarity index 99%
rename from neo/tools/sound/DialogSound.cpp
rename to neo/engine/tools/sound/DialogSound.cpp
index 25baa446..8e56fca4 100644
--- a/neo/tools/sound/DialogSound.cpp
+++ b/neo/engine/tools/sound/DialogSound.cpp
@@ -29,7 +29,6 @@ If you have questions concerning this license or the applicable additional terms
#include "precompiled.h"
#pragma hdrstop
-#include "../../game/game.h"
#include "../../sys/win32/win_local.h"
#include "../../sys/win32/rc/common_resource.h"
#include "../../sys/win32/rc/SoundEditor_resource.h"
diff --git a/neo/tools/sound/DialogSound.h b/neo/engine/tools/sound/DialogSound.h
similarity index 100%
rename from neo/tools/sound/DialogSound.h
rename to neo/engine/tools/sound/DialogSound.h
diff --git a/neo/tools/sound/DialogSoundGroup.cpp b/neo/engine/tools/sound/DialogSoundGroup.cpp
similarity index 100%
rename from neo/tools/sound/DialogSoundGroup.cpp
rename to neo/engine/tools/sound/DialogSoundGroup.cpp
diff --git a/neo/tools/sound/DialogSoundGroup.h b/neo/engine/tools/sound/DialogSoundGroup.h
similarity index 100%
rename from neo/tools/sound/DialogSoundGroup.h
rename to neo/engine/tools/sound/DialogSoundGroup.h
diff --git a/neo/ui/BindWindow.cpp b/neo/engine/ui/BindWindow.cpp
similarity index 100%
rename from neo/ui/BindWindow.cpp
rename to neo/engine/ui/BindWindow.cpp
diff --git a/neo/ui/BindWindow.h b/neo/engine/ui/BindWindow.h
similarity index 100%
rename from neo/ui/BindWindow.h
rename to neo/engine/ui/BindWindow.h
diff --git a/neo/ui/ChoiceWindow.cpp b/neo/engine/ui/ChoiceWindow.cpp
similarity index 100%
rename from neo/ui/ChoiceWindow.cpp
rename to neo/engine/ui/ChoiceWindow.cpp
diff --git a/neo/ui/ChoiceWindow.h b/neo/engine/ui/ChoiceWindow.h
similarity index 100%
rename from neo/ui/ChoiceWindow.h
rename to neo/engine/ui/ChoiceWindow.h
diff --git a/neo/ui/EditWindow.cpp b/neo/engine/ui/EditWindow.cpp
similarity index 100%
rename from neo/ui/EditWindow.cpp
rename to neo/engine/ui/EditWindow.cpp
diff --git a/neo/ui/EditWindow.h b/neo/engine/ui/EditWindow.h
similarity index 100%
rename from neo/ui/EditWindow.h
rename to neo/engine/ui/EditWindow.h
diff --git a/neo/ui/FieldWindow.cpp b/neo/engine/ui/FieldWindow.cpp
similarity index 100%
rename from neo/ui/FieldWindow.cpp
rename to neo/engine/ui/FieldWindow.cpp
diff --git a/neo/ui/FieldWindow.h b/neo/engine/ui/FieldWindow.h
similarity index 100%
rename from neo/ui/FieldWindow.h
rename to neo/engine/ui/FieldWindow.h
diff --git a/neo/ui/GuiScript.cpp b/neo/engine/ui/GuiScript.cpp
similarity index 100%
rename from neo/ui/GuiScript.cpp
rename to neo/engine/ui/GuiScript.cpp
diff --git a/neo/ui/GuiScript.h b/neo/engine/ui/GuiScript.h
similarity index 100%
rename from neo/ui/GuiScript.h
rename to neo/engine/ui/GuiScript.h
diff --git a/neo/ui/ListGUI.cpp b/neo/engine/ui/ListGUI.cpp
similarity index 100%
rename from neo/ui/ListGUI.cpp
rename to neo/engine/ui/ListGUI.cpp
diff --git a/neo/ui/ListGUI.h b/neo/engine/ui/ListGUI.h
similarity index 100%
rename from neo/ui/ListGUI.h
rename to neo/engine/ui/ListGUI.h
diff --git a/neo/ui/ListGUILocal.h b/neo/engine/ui/ListGUILocal.h
similarity index 100%
rename from neo/ui/ListGUILocal.h
rename to neo/engine/ui/ListGUILocal.h
diff --git a/neo/ui/ListWindow.cpp b/neo/engine/ui/ListWindow.cpp
similarity index 100%
rename from neo/ui/ListWindow.cpp
rename to neo/engine/ui/ListWindow.cpp
diff --git a/neo/ui/ListWindow.h b/neo/engine/ui/ListWindow.h
similarity index 100%
rename from neo/ui/ListWindow.h
rename to neo/engine/ui/ListWindow.h
diff --git a/neo/ui/MarkerWindow.cpp b/neo/engine/ui/MarkerWindow.cpp
similarity index 100%
rename from neo/ui/MarkerWindow.cpp
rename to neo/engine/ui/MarkerWindow.cpp
diff --git a/neo/ui/MarkerWindow.h b/neo/engine/ui/MarkerWindow.h
similarity index 100%
rename from neo/ui/MarkerWindow.h
rename to neo/engine/ui/MarkerWindow.h
diff --git a/neo/ui/RegExp.cpp b/neo/engine/ui/RegExp.cpp
similarity index 100%
rename from neo/ui/RegExp.cpp
rename to neo/engine/ui/RegExp.cpp
diff --git a/neo/ui/RegExp.h b/neo/engine/ui/RegExp.h
similarity index 100%
rename from neo/ui/RegExp.h
rename to neo/engine/ui/RegExp.h
diff --git a/neo/ui/RegExp_old.h b/neo/engine/ui/RegExp_old.h
similarity index 100%
rename from neo/ui/RegExp_old.h
rename to neo/engine/ui/RegExp_old.h
diff --git a/neo/ui/RenderWindow.cpp b/neo/engine/ui/RenderWindow.cpp
similarity index 100%
rename from neo/ui/RenderWindow.cpp
rename to neo/engine/ui/RenderWindow.cpp
diff --git a/neo/ui/RenderWindow.h b/neo/engine/ui/RenderWindow.h
similarity index 100%
rename from neo/ui/RenderWindow.h
rename to neo/engine/ui/RenderWindow.h
diff --git a/neo/ui/SimpleWindow.cpp b/neo/engine/ui/SimpleWindow.cpp
similarity index 100%
rename from neo/ui/SimpleWindow.cpp
rename to neo/engine/ui/SimpleWindow.cpp
diff --git a/neo/ui/SimpleWindow.h b/neo/engine/ui/SimpleWindow.h
similarity index 100%
rename from neo/ui/SimpleWindow.h
rename to neo/engine/ui/SimpleWindow.h
diff --git a/neo/ui/SliderWindow.cpp b/neo/engine/ui/SliderWindow.cpp
similarity index 100%
rename from neo/ui/SliderWindow.cpp
rename to neo/engine/ui/SliderWindow.cpp
diff --git a/neo/ui/SliderWindow.h b/neo/engine/ui/SliderWindow.h
similarity index 100%
rename from neo/ui/SliderWindow.h
rename to neo/engine/ui/SliderWindow.h
diff --git a/neo/ui/UserInterface.cpp b/neo/engine/ui/UserInterface.cpp
similarity index 100%
rename from neo/ui/UserInterface.cpp
rename to neo/engine/ui/UserInterface.cpp
diff --git a/neo/ui/UserInterface.h b/neo/engine/ui/UserInterface.h
similarity index 100%
rename from neo/ui/UserInterface.h
rename to neo/engine/ui/UserInterface.h
diff --git a/neo/ui/UserInterfaceLocal.h b/neo/engine/ui/UserInterfaceLocal.h
similarity index 100%
rename from neo/ui/UserInterfaceLocal.h
rename to neo/engine/ui/UserInterfaceLocal.h
diff --git a/neo/ui/Window.cpp b/neo/engine/ui/Window.cpp
similarity index 100%
rename from neo/ui/Window.cpp
rename to neo/engine/ui/Window.cpp
diff --git a/neo/ui/Window.h b/neo/engine/ui/Window.h
similarity index 100%
rename from neo/ui/Window.h
rename to neo/engine/ui/Window.h
diff --git a/neo/ui/Winvar.cpp b/neo/engine/ui/Winvar.cpp
similarity index 100%
rename from neo/ui/Winvar.cpp
rename to neo/engine/ui/Winvar.cpp
diff --git a/neo/ui/Winvar.h b/neo/engine/ui/Winvar.h
similarity index 100%
rename from neo/ui/Winvar.h
rename to neo/engine/ui/Winvar.h
diff --git a/neo/prey/Prey/anim_baseanim.cpp b/neo/prey/Prey/anim_baseanim.cpp
index e8c14918..2d4df4ff 100644
--- a/neo/prey/Prey/anim_baseanim.cpp
+++ b/neo/prey/Prey/anim_baseanim.cpp
@@ -3,7 +3,7 @@
#pragma hdrstop
#include "prey_local.h"
-#include "../../models/Model_local.h" // Hackish. Needed to access certain classes. Imitates game/anim/Blend.cpp
+#include "../../engine/models/Model_local.h" // Hackish. Needed to access certain classes. Imitates game/anim/Blend.cpp
/*
===============
hhMD5Anim::hhMD5Anim
diff --git a/neo/prey/PreyGame.vcxproj b/neo/prey/PreyGame.vcxproj
index 35c54e49..083127a8 100644
--- a/neo/prey/PreyGame.vcxproj
+++ b/neo/prey/PreyGame.vcxproj
@@ -192,7 +192,7 @@
/FIXED:no %(AdditionalOptions)
odbc32.lib;odbccp32.lib;dbghelp.lib;%(AdditionalDependencies)
- ../../preygamex64.dll
+ ../../preybase/preygamex64.dll
true
.\game\game.def
true
@@ -453,7 +453,7 @@
-
+
Create
Create
precompiled.h
@@ -817,7 +817,7 @@
-
+
@@ -1051,6 +1051,9 @@
+
+ {49bec5c6-b964-417a-851e-808886b57400}
+
{49bec5c6-b964-417a-851e-808886b57400}
diff --git a/neo/prey/PreyGame.vcxproj.filters b/neo/prey/PreyGame.vcxproj.filters
index d3d65419..b5b429d0 100644
--- a/neo/prey/PreyGame.vcxproj.filters
+++ b/neo/prey/PreyGame.vcxproj.filters
@@ -729,9 +729,6 @@
Prey\ai
-
- Game
-
idLib\math
@@ -741,6 +738,7 @@
Decls
+
@@ -1409,9 +1407,6 @@
Prey\ai
-
- Game
-
idLib\math
@@ -1430,6 +1425,7 @@
Decls
+