Browse Source

Merge pull request #54 from AtomicGameEngine/atomic_cli

Atomic CLI
JoshEngebretson 10 years ago
parent
commit
498f43df81
100 changed files with 1447 additions and 193 deletions
  1. 3 1
      .gitignore
  2. 3 0
      CLI/.gitignore
  3. 2 0
      CLI/atomic-cli-mac-data/.gitignore
  4. 0 0
      CLI/atomic-cli-mac-data/.npmignore
  5. 10 0
      CLI/atomic-cli-mac-data/data/index.js
  6. 12 0
      CLI/atomic-cli-mac-data/package.json
  7. 5 0
      CLI/atomic-cli-mac/README.md
  8. 12 0
      CLI/atomic-cli-mac/index.js
  9. 28 0
      CLI/atomic-cli-mac/package.json
  10. 3 0
      CLI/atomic-cli-windows-data/.gitignore
  11. 0 0
      CLI/atomic-cli-windows-data/.npmignore
  12. 10 0
      CLI/atomic-cli-windows-data/data/index.js
  13. 13 0
      CLI/atomic-cli-windows-data/package.json
  14. 1 0
      CLI/atomic-cli-windows/.gitignore
  15. 0 0
      CLI/atomic-cli-windows/.npmignore
  16. 5 0
      CLI/atomic-cli-windows/README.md
  17. 9 0
      CLI/atomic-cli-windows/index.js
  18. 28 0
      CLI/atomic-cli-windows/package.json
  19. 1 0
      CLI/atomic-cli/.gitignore
  20. 4 0
      CLI/atomic-cli/Notes.txt
  21. 53 0
      CLI/atomic-cli/README.md
  22. 145 0
      CLI/atomic-cli/bin/atomic-cli.js
  23. 0 0
      CLI/atomic-cli/lib/atomicdata.js
  24. 23 0
      CLI/atomic-cli/lib/atomiceditor.js
  25. 123 0
      CLI/atomic-cli/lib/atomictool.js
  26. 19 0
      CLI/atomic-cli/lib/main.js
  27. 40 0
      CLI/atomic-cli/package.json
  28. 1 0
      CLI/attic/atomic-cli-mac/.gitignore
  29. 0 0
      CLI/attic/atomic-cli-mac/.npmignore
  30. 10 0
      CLI/attic/atomic-cli-mac/index.js
  31. 28 0
      CLI/attic/atomic-cli-mac/package.json
  32. 1 0
      CLI/attic/atomic-cli/.gitignore
  33. 5 0
      CLI/attic/atomic-cli/README.md
  34. 126 0
      CLI/attic/atomic-cli/cli.js
  35. 19 0
      CLI/attic/atomic-cli/data/cdn.json
  36. 264 0
      CLI/attic/atomic-cli/index.js
  37. 25 0
      CLI/attic/atomic-cli/lib/cdn.js
  38. 45 0
      CLI/attic/atomic-cli/package.json
  39. 0 0
      CLI/attic/atomic-cli/scripts/atomiccdn.js
  40. 1 0
      CLI/attic/atomic-cli/scripts/atomiceditor.js
  41. 65 0
      CLI/attic/atomic-cli/scripts/postinstall.js
  42. 8 3
      CMakeLists.txt
  43. 89 63
      Rakefile
  44. 3 3
      Source/Atomic/Atomic3D/AnimatedModel.cpp
  45. 3 3
      Source/Atomic/Atomic3D/AnimatedModel.h
  46. 1 1
      Source/Atomic/Atomic3D/Animation.cpp
  47. 0 0
      Source/Atomic/Atomic3D/Animation.h
  48. 4 4
      Source/Atomic/Atomic3D/AnimationController.cpp
  49. 0 0
      Source/Atomic/Atomic3D/AnimationController.h
  50. 3 3
      Source/Atomic/Atomic3D/AnimationState.cpp
  51. 0 0
      Source/Atomic/Atomic3D/AnimationState.h
  52. 40 0
      Source/Atomic/Atomic3D/Atomic3D.cpp
  53. 9 0
      Source/Atomic/Atomic3D/Atomic3D.h
  54. 1 1
      Source/Atomic/Atomic3D/BillboardSet.cpp
  55. 0 0
      Source/Atomic/Atomic3D/BillboardSet.h
  56. 1 1
      Source/Atomic/Atomic3D/CustomGeometry.cpp
  57. 0 0
      Source/Atomic/Atomic3D/CustomGeometry.h
  58. 2 2
      Source/Atomic/Atomic3D/DecalSet.cpp
  59. 1 1
      Source/Atomic/Atomic3D/DecalSet.h
  60. 1 1
      Source/Atomic/Atomic3D/LMStaticModel.cpp
  61. 1 1
      Source/Atomic/Atomic3D/LMStaticModel.h
  62. 1 1
      Source/Atomic/Atomic3D/Model.cpp
  63. 1 1
      Source/Atomic/Atomic3D/Model.h
  64. 1 1
      Source/Atomic/Atomic3D/ParticleEffect.cpp
  65. 0 0
      Source/Atomic/Atomic3D/ParticleEffect.h
  66. 2 2
      Source/Atomic/Atomic3D/ParticleEmitter.cpp
  67. 1 1
      Source/Atomic/Atomic3D/ParticleEmitter.h
  68. 1 1
      Source/Atomic/Atomic3D/Skeleton.cpp
  69. 0 0
      Source/Atomic/Atomic3D/Skeleton.h
  70. 1 1
      Source/Atomic/Atomic3D/Skybox.cpp
  71. 1 1
      Source/Atomic/Atomic3D/Skybox.h
  72. 2 2
      Source/Atomic/Atomic3D/StaticModel.cpp
  73. 0 0
      Source/Atomic/Atomic3D/StaticModel.h
  74. 1 1
      Source/Atomic/Atomic3D/StaticModelGroup.cpp
  75. 1 1
      Source/Atomic/Atomic3D/StaticModelGroup.h
  76. 2 2
      Source/Atomic/Atomic3D/Terrain.cpp
  77. 0 0
      Source/Atomic/Atomic3D/Terrain.h
  78. 2 2
      Source/Atomic/Atomic3D/TerrainPatch.cpp
  79. 0 0
      Source/Atomic/Atomic3D/TerrainPatch.h
  80. 10 5
      Source/Atomic/CMakeLists.txt
  81. 14 0
      Source/Atomic/Engine/Application.cpp
  82. 1 1
      Source/Atomic/Engine/Application.h
  83. 9 0
      Source/Atomic/Engine/Engine.cpp
  84. 1 1
      Source/Atomic/Environment/Environment.cpp
  85. 1 1
      Source/Atomic/Environment/Environment.h
  86. 8 1
      Source/Atomic/Graphics/DebugRenderer.cpp
  87. 0 25
      Source/Atomic/Graphics/Direct3D9/D3D9Graphics.cpp
  88. 0 26
      Source/Atomic/Graphics/OpenGL/OGLGraphics.cpp
  89. 8 2
      Source/Atomic/Graphics/View.cpp
  90. 3 3
      Source/Atomic/Navigation/NavigationMesh.cpp
  91. 3 3
      Source/Atomic/Physics/CollisionShape.cpp
  92. 1 1
      Source/Atomic/Physics/PhysicsWorld.cpp
  93. 4 0
      Source/Atomic/UI/Text3D.cpp
  94. 5 0
      Source/Atomic/UI/Text3D.h
  95. 2 0
      Source/Atomic/UI/UI.cpp
  96. 8 12
      Source/AtomicEditor/CMakeLists.txt
  97. 36 2
      Source/AtomicEditor/Source/AEApplication.cpp
  98. 2 0
      Source/AtomicEditor/Source/AEApplication.h
  99. 4 4
      Source/AtomicEditor/Source/Editors/ModelResourceEditor.cpp
  100. 1 1
      Source/AtomicEditor/Source/Editors/SceneEditor3D/Gizmo3D.cpp

+ 3 - 1
.gitignore

@@ -1,5 +1,6 @@
 
 
 *.user
 *.user
+*.log
 Bin/Atomic.d.ts
 Bin/Atomic.d.ts
 Bin/Atomic.js
 Bin/Atomic.js
 Bin/*.pak
 Bin/*.pak
@@ -9,4 +10,5 @@ Build/*
 Docs/out/*
 Docs/out/*
 Docs/node_modules/*
 Docs/node_modules/*
 Data/AtomicEditor/Deployment/Web/AtomicPlayer.js
 Data/AtomicEditor/Deployment/Web/AtomicPlayer.js
-Data/AtomicEditor/Deployment/IOS/AtomicPlayer.app/AtomicPlayer
+Data/AtomicEditor/Deployment/IOS/AtomicPlayer.app/AtomicPlayer
+node_modules/*

+ 3 - 0
CLI/.gitignore

@@ -0,0 +1,3 @@
+data/bin/*
+data/Atomic/*
+node_modules/*

+ 2 - 0
CLI/atomic-cli-mac-data/.gitignore

@@ -0,0 +1,2 @@
+data/editor/*
+*.tgz

+ 0 - 0
CLI/atomic-cli-mac-data/.npmignore


+ 10 - 0
CLI/atomic-cli-mac-data/data/index.js

@@ -0,0 +1,10 @@
+
+var ATOMICTOOL_BIN = __dirname  + "/editor/AtomicEditor.app/Contents/Applications/CommandLine/AtomicTool";
+var ATOMICEDITOR_DATADIR = __dirname  + "/editor/AtomicEditor.app/Contents/Resources";
+var ATOMICEDITOR_APP = __dirname  + "/editor/AtomicEditor.app/Contents/MacOS/AtomicEditor";
+
+module.exports = {
+  "ATOMICTOOL_BIN" : ATOMICTOOL_BIN,
+  "ATOMICEDITOR_APP" : ATOMICEDITOR_APP,
+  "ATOMICEDITOR_DATADIR" : ATOMICEDITOR_DATADIR
+}

+ 12 - 0
CLI/atomic-cli-mac-data/package.json

@@ -0,0 +1,12 @@
+{
+  "description": "Mac data for atomic-cli-mac package",
+  "engines": {
+    "node": ">=0.8.0"
+  },
+  "homepage": "http://www.AtomicGameEngine.com",
+  "files" : ["data"],
+  "main": "./data/index.js",
+  "name": "atomic-cli-mac-data",
+  "version": "0.0.3",
+  "os" : ["darwin"]
+}

+ 5 - 0
CLI/atomic-cli-mac/README.md

@@ -0,0 +1,5 @@
+# Atomic Game Engine - Mac Dependencies
+
+Mac dependencies for the atomic-cli package
+
+![A screenshot of your package](https://f.cloud.github.com/assets/69169/2290250/c35d867a-a017-11e3-86be-cd7c5bf3ff9b.gif)

+ 12 - 0
CLI/atomic-cli-mac/index.js

@@ -0,0 +1,12 @@
+
+
+// ln -sf /Users/josh/Dev/atomic/AtomicGameEngine/Artifacts/MacOSX_Package/AtomicEditor.app ./AtomicEditor.app
+
+atomic_data = require('atomic-cli-mac-data');
+
+module.exports = {
+  "ATOMICTOOL_BIN" : atomic_data.ATOMICTOOL_BIN,
+  "ATOMICEDITOR_APP" : atomic_data.ATOMICEDITOR_APP,
+  "ATOMICEDITOR_DATADIR" : atomic_data.ATOMICEDITOR_DATADIR
+
+}

+ 28 - 0
CLI/atomic-cli-mac/package.json

@@ -0,0 +1,28 @@
+{
+  "author": {
+    "email": "[email protected]",
+    "name": "Atomic Game Engine",
+    "url": "http://www.AtomicGameEngine.com"
+  },
+  "bugs": {
+    "url": "https://github.com/AtomicGameEngine/AtomicGameEngine/issues"
+  },
+  "dependencies": {
+    "atomic-cli-mac-data" : "http://docs.atomicgameengine.com/npm/atomic-cli-mac-data-0.0.3.tgz"
+  },
+  "description": "Mac dependencies for atomic-cli package",
+  "engines": {
+    "node": ">=0.8.0"
+  },
+  "homepage": "http://www.AtomicGameEngine.com",
+   "licenses": [{
+    "type": "Atomic Game Engine",
+    "url": "https://github.com/AtomicGameEngine/AtomicGameEngine/blob/master/LICENSE.md"
+  }],
+  "main": "./index.js",
+  "name": "atomic-cli-mac",
+  "preferGlobal": true,
+  "repository": "https://github.com/AtomicGameEngine/AtomicGameEngine",
+  "version": "0.0.5",
+  "os" : ["darwin"]
+}

+ 3 - 0
CLI/atomic-cli-windows-data/.gitignore

@@ -0,0 +1,3 @@
+node_modules/*
+data/editor/*
+*.tgz

+ 0 - 0
CLI/atomic-cli-windows-data/.npmignore


+ 10 - 0
CLI/atomic-cli-windows-data/data/index.js

@@ -0,0 +1,10 @@
+
+var ATOMICTOOL_BIN = __dirname  + "/editor/AtomicEditor/Applications/CommandLine/AtomicTool.exe";
+var ATOMICEDITOR_DATADIR = __dirname  + "/editor/AtomicEditor";
+var ATOMICEDITOR_APP = __dirname  + "/editor/AtomicEditor/AtomicEditor.exe";
+
+module.exports = {
+  "ATOMICTOOL_BIN" : ATOMICTOOL_BIN,
+  "ATOMICEDITOR_APP" : ATOMICEDITOR_APP,
+  "ATOMICEDITOR_DATADIR" : ATOMICEDITOR_DATADIR
+}

+ 13 - 0
CLI/atomic-cli-windows-data/package.json

@@ -0,0 +1,13 @@
+{
+  "description": "Windows data for atomic-cli-windows package",
+  "engines": {
+    "node": ">=0.8.0"
+  },
+  "homepage": "http://www.AtomicGameEngine.com",
+  "files" : ["data"],
+  "main": "./data/index.js",
+  "name": "atomic-cli-windows-data",
+  "version": "0.0.2",
+  "os" : ["win32"]
+
+}

+ 1 - 0
CLI/atomic-cli-windows/.gitignore

@@ -0,0 +1 @@
+node_modules/*

+ 0 - 0
CLI/atomic-cli-windows/.npmignore


+ 5 - 0
CLI/atomic-cli-windows/README.md

@@ -0,0 +1,5 @@
+# Atomic Game Engine - Windows Dependencies
+
+Windows dependencies for the atomic-cli package
+
+![A screenshot of your package](https://f.cloud.github.com/assets/69169/2290250/c35d867a-a017-11e3-86be-cd7c5bf3ff9b.gif)

+ 9 - 0
CLI/atomic-cli-windows/index.js

@@ -0,0 +1,9 @@
+
+atomic_data = require('atomic-cli-windows-data');
+
+module.exports = {
+  "ATOMICTOOL_BIN" : atomic_data.ATOMICTOOL_BIN,
+  "ATOMICEDITOR_APP" : atomic_data.ATOMICEDITOR_APP,
+  "ATOMICEDITOR_DATADIR" : atomic_data.ATOMICEDITOR_DATADIR
+
+}

+ 28 - 0
CLI/atomic-cli-windows/package.json

@@ -0,0 +1,28 @@
+{
+  "author": {
+    "email": "[email protected]",
+    "name": "Atomic Game Engine",
+    "url": "http://www.AtomicGameEngine.com"
+  },
+  "bugs": {
+    "url": "https://github.com/AtomicGameEngine/AtomicGameEngine/issues"
+  },
+  "dependencies": {
+    "atomic-cli-windows-data" : "http://docs.atomicgameengine.com/npm/atomic-cli-windows-data-0.0.2.tgz"
+  },
+  "description": "Windows dependencies for atomic-cli package",
+  "engines": {
+    "node": ">=0.8.0"
+  },
+  "homepage": "http://www.AtomicGameEngine.com",
+   "licenses": [{
+    "type": "Atomic Game Engine",
+    "url": "https://github.com/AtomicGameEngine/AtomicGameEngine/blob/master/LICENSE.md"
+  }],
+  "main": "./index.js",
+  "name": "atomic-cli-windows",
+  "preferGlobal": true,
+  "repository": "https://github.com/AtomicGameEngine/AtomicGameEngine",
+  "os" : ["win32"],
+  "version": "0.0.5"
+}

+ 1 - 0
CLI/atomic-cli/.gitignore

@@ -0,0 +1 @@
+node_modules/*

+ 4 - 0
CLI/atomic-cli/Notes.txt

@@ -0,0 +1,4 @@
+
+atomic-cli
+  optional os specific package
+    tarball data package

+ 53 - 0
CLI/atomic-cli/README.md

@@ -0,0 +1,53 @@
+# atomic-cli
+
+Command line tools for the [Atomic Game Engine](http://www.atomicgameengine.com)
+
+##### Website
+
+<a href="http://atomicgameengine.com">http://www.AtomicGameEngine.com</a>
+
+##### Chat
+
+[![Join the chat at https://gitter.im/AtomicGameEngine/AtomicGameEngine](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/AtomicGameEngine/AtomicGameEngine?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+##### Forums
+
+<a href="http://atomicgameengine.com/forum">Atomic Game Engine Forums</a>
+
+##### Twitter
+
+<a href="https://twitter.com/AtomicGEngine">Follow @AtomicGEngine</a>
+
+[WelcomeScreen]: https://github.com/AtomicGameEngine/AtomicExamples/wiki/images/WelcomeScreen.png
+
+![alt text][WelcomeScreen]
+
+# Install
+
+atomic-cli must be installed and activated
+
+```
+npm install atomic-cli -g
+atomic-cli activate
+```
+
+# usage
+
+```
+Usage: atomic-cli
+
+  Commands:
+
+    activate                  activate
+    deactivate                deactivates
+    new <folder>              creates project in the specified folder
+    add <platform>            adds a platform to the project
+                              (mac|windows|ios|android|web)
+    run [options] <platform>  builds and runs the project on a specified platform
+    edit [path_to_project]    opens the Atomic Editor loading specified project
+
+  Options:
+
+    -h, --help     output usage information
+    -V, --version  output the version number
+```

+ 145 - 0
CLI/atomic-cli/bin/atomic-cli.js

@@ -0,0 +1,145 @@
+#!/usr/bin/env node
+"use strict";
+
+// https://github.com/yeoman/update-notifier
+
+// https://github.com/tj/commander.js
+var path = require("path");
+var fs = require("fs");
+var program = require('commander');
+var cli = require("atomic-cli")
+var open = require("open");
+var prompt = require('prompt');
+var osenv = require('osenv')
+
+prompt.message = "";
+prompt.delimiter = "";
+
+var saveAtomicConfig = function(activated) {
+
+  var directory = osenv.home() + "/.atomicgameengine";
+
+  if (!fs.existsSync(directory)) {
+    fs.mkdir(directory);
+  }
+
+  var config = {
+    "nodePath" : process.execPath,
+    "cliScript" : __filename,
+    "activated" : activated
+  }
+
+  fs.writeFile(directory + "/config.json", JSON.stringify(config, null, 4), function(err) {
+      if(err) {
+        console.log(err);
+      } else {
+        //console.log("config saved to " + directory + "/config.json");
+      }
+  });
+
+}
+
+program
+  .version('0.0.1')
+
+// activation command
+program
+  .command('activate')
+  .description('activate')
+  .action(function(folder){
+
+    prompt.start();
+
+    prompt.get([ { description: 'Please confirm EULA agreement (Y)es, (N)o, or (V)iew', default: "Y", name: "eulaconfirm" }], function (err, result) {
+        var eulaconfirm = result.eulaconfirm.toLowerCase();
+        if (eulaconfirm == 'y') {
+          prompt.get([ { description: 'Please enter Product Key or (G)et free key: ', name: "productkey" }], function (err, result) {
+            var productkey = result.productkey.toLowerCase();
+            if (productkey == 'g') {
+              console.log ("Opening Atomic Store in default browser window");
+              open("https://store.atomicgameengine.com/site");
+            } else {
+              cli.activate(productkey)
+              .then(function () {
+                saveAtomicConfig(true);
+              })
+            }
+          });
+        } else if (eulaconfirm == 'v') {
+          console.log ("Opening EULA in default browser window");
+          open("https://github.com/AtomicGameEngine/AtomicGameEngine/blob/master/LICENSE.md");
+        }
+    });
+  });
+
+// deactivation
+program
+  .command('deactivate')
+  .description('deactivates and returns a product activation to the server')
+  .action(function(){
+    cli.deactivate().
+    then(function() {
+      saveAtomicConfig(false);
+    })
+  });
+
+
+// new project command
+program
+  .command('new <folder>')
+  .description('creates a new project in the specified folder')
+  .action(function(folder){
+    cli.newProject(folder)
+    .then(function () {
+        console.log("New Atomic project created in " + path.resolve(folder));
+    })
+    .catch(function (error) {
+        console.error("Error: Could not create " + path.resolve(folder));
+        process.exit(1);
+    });
+
+  });
+
+program
+  .command('add <platform>')
+  .description('adds a platform to the project')
+  .action(function(platform){
+    cli.addPlatform(platform)
+    .then(function () {
+    })
+    .catch(function (error) {
+        process.exit(1);
+    });
+
+  });
+
+
+program
+  .command('run <platform>')
+  .option('--project <path>')
+  .description('runs the project on a specified platform')
+  .action(function(platform, options) {
+    if(options.project) {
+      process.chdir(options.project)
+    }
+    cli.run(platform)
+    .then(function () {
+    })
+    .catch(function (error) {
+        process.exit(1);
+    });
+
+  });
+
+program
+  .command('edit [path_to_project]')
+  .description('edits the project in the cwd or on at a specified path')
+  .action(function(path_to_project, options){
+
+    var path = path_to_project || process.cwd();
+    cli.atomiceditor(["-project", path], {output:true});
+  });
+
+  program.parse(process.argv);
+
+  if (!program.args.length) program.help();

+ 0 - 0
CLI/atomic-cli/lib/atomicdata.js


+ 23 - 0
CLI/atomic-cli/lib/atomiceditor.js

@@ -0,0 +1,23 @@
+
+var spawn = require("child_process").spawn;
+
+try {
+  var platform_cli = require('atomic-cli-mac');
+}
+catch (e) {
+}
+try {
+  var platform_cli = require('atomic-cli-windows');
+}
+catch (e) {
+}
+
+var atomiceditor = function (flags, opts) {
+  opts = opts || {};
+  opts.detached = true;
+  opts.stdio = ["ignore", "ignore", "ignore"];
+  var child = spawn(platform_cli.ATOMICEDITOR_APP, flags, opts);
+  child.unref();
+};
+
+module.exports = atomiceditor;

+ 123 - 0
CLI/atomic-cli/lib/atomictool.js

@@ -0,0 +1,123 @@
+
+var Q = require("q");
+var fs = require("fs");
+var os = require("os");
+var path = require("path");
+var spawn = require("child_process").spawn;
+
+try {
+  var platform_cli = require('atomic-cli-mac');
+}
+catch (e) {
+}
+try {
+  var platform_cli = require('atomic-cli-windows');
+}
+catch (e) {
+}
+
+var mode = process.env.ATOMIC_GAME_ENGINE_ENV || 'production';
+if (mode == 'dev') {
+  if (process.platform == 'darwin')
+    platform_cli.ATOMICTOOL_BIN = "/Users/josh/Dev/atomic/AtomicGameEngine-build/Source/AtomicTool/AtomicTool";
+  else
+    platform_cli.ATOMICTOOL_BIN = "C:/Dev/atomic/AtomicGameEngine-build/Source/AtomicTool/AtomicTool.exe";
+}
+// Commands ----------------------
+
+var newProject = function(folder) {
+  return atomictool(["new", folder], {output:true});
+}
+
+var addPlatform = function (platform) {
+  return atomictool(["platform-add", platform], {output:true});
+};
+
+var build = function (platform) {
+
+  console.log("building");
+  return atomictool(["build", platform], {output:true});
+};
+
+var activate = function (productkey) {
+  return atomictool(["--activate", productkey.toUpperCase().trim()], {output:true});
+};
+
+var deactivate = function () {
+  return atomictool(["--deactivate"], {output:true});
+};
+
+var run = function (platform, opts) {
+
+    opts = opts || {};
+    var debug = opts.debug;
+
+    var run = function () {
+
+        switch (platform) {
+
+        case "web":
+            var url = "http://localhost:" + HTTP_PORT + "/AtomicPlayer.html";
+            console.log("Launching: " + url);
+
+            var open = require("open");
+            open(url);
+            break;
+
+          case "mac":
+              var open = require("open");
+              open(path.resolve("Build/Mac-Build/AtomicPlayer.app"));
+              break;
+
+          case "windows":
+              var open = require("open");
+              open(path.resolve("Build/Windows-Build/AtomicPlayer.exe"));
+              break;
+        }
+    };
+
+    return opts.noBuild ? run(platform) : build([platform], opts).then(function () {
+        return run();
+    });
+};
+
+
+// Utils --------------
+
+var exec = function (command, flags, opts) {
+    opts = opts || {};
+    if (opts.verbose !== false) {
+        //console.log([command].concat(flags).join(" "));
+    }
+
+    var deferred = Q.defer();
+    var child = spawn(command, flags, {stdio: (opts.output === false) ? "ignore" : "inherit"});
+    child.on("close", function (code) {
+        if (code && opts.check !== false) {
+            deferred.reject();
+        }
+        deferred.resolve(code);
+    });
+    child.on("error", function (error) {
+        deferred.reject(error);
+    });
+    return deferred.promise;
+};
+
+
+var atomictool = function (flags, opts) {
+    opts = opts || {};
+    flags.unshift(platform_cli.ATOMICEDITOR_DATADIR);
+    flags.unshift("--cli-data-path");
+    return exec(platform_cli.ATOMICTOOL_BIN, flags, opts);
+};
+
+module.exports = {
+  "atomictool" : atomictool,
+  "newProject" : newProject,
+  "addPlatform" : addPlatform,
+  "build" : build,
+  "run" : run,
+  "activate" : activate,
+  "deactivate" : deactivate
+}

+ 19 - 0
CLI/atomic-cli/lib/main.js

@@ -0,0 +1,19 @@
+
+
+var mode = process.env.ATOMIC_GAME_ENGINE_ENV || 'production';
+
+var atomictool = require ("./atomictool.js");
+var atomiceditor = require ("./atomiceditor.js");
+
+module.exports = {
+
+  "mode" : mode,
+  "newProject" : atomictool.newProject,
+  "addPlatform" : atomictool.addPlatform,
+  "build" : atomictool.build,
+  "run" : atomictool.run,
+  "activate" : atomictool.activate,
+  "deactivate" : atomictool.deactivate,
+  "atomiceditor" : atomiceditor
+
+}

+ 40 - 0
CLI/atomic-cli/package.json

@@ -0,0 +1,40 @@
+{
+  "author": {
+    "email": "[email protected]",
+    "name": "Atomic Game Engine",
+    "url": "http://www.AtomicGameEngine.com"
+  },
+  "bugs": {
+    "url": "https://github.com/AtomicGameEngine/AtomicGameEngine/issues"
+  },
+  "dependencies": {
+    "q": "latest",
+    "commander" : "latest",
+    "update-notifier" : "latest",
+    "open": "latest",
+    "prompt": "latest",
+    "osenv" : "latest"
+  },
+  "devDependencies" : {
+  },
+  "optionalDependencies" : {
+    "atomic-cli-mac" : "latest",
+    "atomic-cli-windows" : "latest"
+  },
+  "description": "CLI for the Atomic Game Engine",
+  "keywords": ["game engine", "webgl", "android", "ios", "html5"],
+  "engines": {
+    "node": ">=0.8.0"
+  },
+  "homepage": "http://www.AtomicGameEngine.com",
+   "licenses": [{
+    "type": "Atomic Game Engine",
+    "url": "https://github.com/AtomicGameEngine/AtomicGameEngine/blob/master/LICENSE.md"
+  }],
+  "bin": { "atomic-cli" : "./bin/atomic-cli.js" },
+  "main": "./lib/main.js",
+  "name": "atomic-cli",
+  "preferGlobal": true,
+  "repository": "https://github.com/AtomicGameEngine/AtomicGameEngine",
+  "version": "0.3.4"
+}

+ 1 - 0
CLI/attic/atomic-cli-mac/.gitignore

@@ -0,0 +1 @@
+bin/*

+ 0 - 0
CLI/attic/atomic-cli-mac/.npmignore


+ 10 - 0
CLI/attic/atomic-cli-mac/index.js

@@ -0,0 +1,10 @@
+
+var PLATFORM_DATA_DIR = __dirname + "/data";
+var ATOMICTOOL_BIN = __dirname + "/bin/AtomicTool";
+var EDITOR_APPLICATION = __dirname + "/bin/editor/AtomicEditor.app/Contents/MacOS/AtomicEditor";
+var EDITOR_DATA_DIR = __dirname + "/bin/editor/AtomicEditor.app/Contents/Resources";
+
+exports.PLATFORM_DATA_DIR = PLATFORM_DATA_DIR;
+exports.EDITOR_APPLICATION = EDITOR_APPLICATION;
+exports.EDITOR_DATA_DIR = EDITOR_DATA_DIR;
+exports.ATOMICTOOL_BIN = ATOMICTOOL_BIN;

+ 28 - 0
CLI/attic/atomic-cli-mac/package.json

@@ -0,0 +1,28 @@
+{
+  "author": {
+    "email": "[email protected]",
+    "name": "Atomic Game Engine",
+    "url": "http://www.AtomicGameEngine.com"
+  },
+  "bugs": {
+    "url": "https://github.com/AtomicGameEngine/AtomicGameEngine/issues"
+  },
+  "dependencies": {
+  },
+  "description": "Mac dependencies for atomic-cli package",
+  "engines": {
+    "node": ">=0.8.0"
+  },
+  "homepage": "http://www.AtomicGameEngine.com",
+   "licenses": [{
+    "type": "Atomic Game Engine",
+    "url": "https://github.com/AtomicGameEngine/AtomicGameEngine/blob/master/LICENSE.md"
+  }],
+  "files" : ["bin"],
+  "main": "./index.js",
+  "name": "atomic-cli-mac",
+  "preferGlobal": true,
+  "repository": "https://github.com/AtomicGameEngine/AtomicGameEngine",
+  "version": "0.0.1",
+  "os" : ["darwin"]
+}

+ 1 - 0
CLI/attic/atomic-cli/.gitignore

@@ -0,0 +1 @@
+node_modules/*

+ 5 - 0
CLI/attic/atomic-cli/README.md

@@ -0,0 +1,5 @@
+# Atomic CLI
+
+The Atomic Game Engine command-line tool. Visit [AtomicGameEngine.com] for more information.
+
+[AtomicGameEngine.com]: http://AtomicGameEngine.com

+ 126 - 0
CLI/attic/atomic-cli/cli.js

@@ -0,0 +1,126 @@
+#!/usr/bin/env node
+"use strict";
+
+var argparse = require("argparse");
+var fs = require("fs");
+var path = require("path");
+var util = require("util");
+var httpreq = require("httpreq");
+var cli = require("atomic-cli");
+
+var AtomicHelpFormatter = function (opts) {
+    argparse.HelpFormatter.call(this, opts);
+};
+util.inherits(AtomicHelpFormatter, argparse.HelpFormatter);
+
+// http://stackoverflow.com/questions/13423540/argparse-subparser-hide-metavar-in-command-listing
+AtomicHelpFormatter.prototype._formatAction = function (action) {
+    var parts = argparse.HelpFormatter.prototype._formatAction.call(this, action);
+    if (action.nargs == argparse.Const.PARSER) {
+        var lines = parts.split("\n");
+        lines.shift();
+        parts = lines.join("\n");
+    }
+    return parts;
+};
+
+var catchErrors = function (promise) {
+    promise.catch(function (error) {
+        if (Array.isArray(error)) error = error[0]; // NCP throws an array of errors...?
+        if (error) console.error(error.message || error);
+        process.exit(1);
+    });
+};
+
+var parser = new argparse.ArgumentParser({prog: "atomic-cli", formatterClass: AtomicHelpFormatter,
+    description: "Atomic Game Engine CLI"});
+parser.addArgument(["-v", "--version"], {action: "version", help: "Print version and exit.",
+    version: cli.VERSION});
+
+var commands = parser.addSubparsers({title: "Commands", metavar: "<command>"});
+
+var cmd = commands.addParser("new", {help: "Create a new project.",
+    description: "Creates a new project at the given path.",
+    aliases: ["create"]});
+cmd.addArgument(["path"], {help: "The new project directory to create."});
+cmd.setDefaults({action: function (args) {
+    cli.newProject(args.path)
+    .then(function () {
+        console.log("New Atomic project created in " + path.resolve(args.path));
+    })
+    .catch(function (error) {
+        console.error("Error: Could not create " + path.resolve(args.path));
+        process.exit(1);
+    });
+}});
+
+var cmd = commands.addParser("build", {help: "Builds the project",
+    description: "Builds the platform"});
+cmd.addArgument(["platform"], {help: "The platform to build (windows|mac|ios|android|ios)"});
+cmd.setDefaults({action: function (args) {
+    cli.build(args.platform)
+    .then(function () {
+        console.log("Project built " + path.resolve(args.path));
+    })
+    .catch(function (error) {
+        console.error("Error: Could not build " + path.resolve(args.path));
+        process.exit(1);
+    });
+}});
+
+var addCommonArguments = function (parser) {
+    parser.addArgument(["--debug"], {action: "storeTrue", help: "Build in debug mode."});
+};
+
+var cmd = commands.addParser("run", {help: "Build and run on a given platform.",
+    description: "Builds and runs the game on a single given platform."});
+cmd.addArgument(["platform"], {metavar: "platform", nargs: "?",
+    help: "A platform to target. Choose from " + cli.PLATFORMS.join(", ") + ". If omitted, 'default_platform' will be used."});
+addCommonArguments(cmd);
+cmd.addArgument(["--no-build"], {action: "storeTrue", help: "Don't rebuild before running."});
+
+cmd.setDefaults({action: function (args) {
+  cli.run(args.platform, {
+      debug: args.debug,
+      noBuild: args.no_build,
+  });
+}});
+
+
+var cmd = commands.addParser("platform-add", {help: "Adds a platform to the project",
+    description: "Adds a platform to the project"});
+cmd.addArgument(["platform"], {help: "The platform to add (windows|mac|ios|android|ios)"});
+cmd.setDefaults({action: function (args) {
+    cli.addPlatform(args.platform)
+    .then(function () {
+        console.log("Platform added " + path.resolve(args.path));
+    })
+    .catch(function (error) {
+        console.error("Error: Platform Could not be added " + path.resolve(args.path));
+        process.exit(1);
+    });
+}});
+
+var cmd = commands.addParser("serve", {help: "Start a development server.",
+    description: "Starts a development web server for testing.",
+    aliases: ["server"]});
+cmd.setDefaults({action: function (args) {
+            var server = new cli.Server();
+            server.start();
+}});
+
+var cmd = commands.addParser("editor", {help: "Starts the Atomic Editor and loads current project",
+    description: "Starts the Atomic Editor and loads current project.",
+    aliases: ["edit"]});
+cmd.setDefaults({action: function (args) {
+            cli.editor()
+}});
+
+
+// GO!
+if (process.argv.length > 2) {
+    var args = parser.parseArgs();
+    args.action(args);
+} else {
+    parser.printHelp();
+}

+ 19 - 0
CLI/attic/atomic-cli/data/cdn.json

@@ -0,0 +1,19 @@
+{
+  "local" : {
+    "server" : "http://127.0.0.1",
+    "editor" : {
+      "version" : "0.2.1",
+      "mac" : "/cli-cdn/mac/atomic-editor"
+    },
+    "atomictool" : {
+      "version" : "0.2.1",
+      "mac" : "/cli-cdn/mac/atomic-tool"
+    }
+  },
+  "testing" : {
+
+  },
+  "production" : {
+
+  }
+}

+ 264 - 0
CLI/attic/atomic-cli/index.js

@@ -0,0 +1,264 @@
+
+var Q = require("q");
+var fs = require("fs");
+var ncp = require("ncp").ncp;
+var os = require("os");
+var path = require("path");
+var spawn = require("child_process").spawn;
+var wrench = require("wrench");
+
+try {
+  var platform_cli = require('atomic-cli-mac');
+}
+catch (e) {
+}
+
+var DATA_DIR = platform_cli.EDITOR_DATA_DIR;
+var ATOMIC_TOOL_BIN = platform_cli.ATOMICTOOL_BIN;
+var EDITOR_APPLICATION = platform_cli.EDITOR_APPLICATION;
+
+var HTTP_PORT = 4000;
+var SOCKET_PORT = HTTP_PORT+1;
+
+exports.PLATFORMS = ["windows", "mac", "android", "ios", "web"];
+
+exports.VERSION = JSON.parse(fs.readFileSync(__dirname + "/package.json")).version;
+
+var exec = function (command, flags, opts) {
+    opts = opts || {};
+    if (opts.verbose !== false) {
+        console.log([command].concat(flags).join(" "));
+    }
+
+    // Run everything through cmd.exe on Windows to be able to find .bat files
+    if (process.platform == "win32" && opts.windowsCmd !== false) {
+        flags.unshift("/c", command);
+        command = "cmd";
+    }
+
+    var deferred = Q.defer();
+    var child = spawn(command, flags, {stdio: (opts.output === false) ? "ignore" : "inherit"});
+    child.on("close", function (code) {
+        if (code && opts.check !== false) {
+            deferred.reject();
+        }
+        deferred.resolve(code);
+    });
+    child.on("error", function (error) {
+        deferred.reject(error);
+    });
+    return deferred.promise;
+};
+exports.exec = exec;
+
+var atomictool = function (flags, opts) {
+    opts = opts || {};
+    opts.windowsCmd = false;
+
+    flags.unshift(DATA_DIR);
+    flags.unshift("--cli-data-path");
+    return exec(ATOMIC_TOOL_BIN, flags, opts);
+};
+exports.atomictool = atomictool
+
+var atomiceditor = function (flags, opts) {
+    opts = opts || {};
+    opts.detached = true;
+    opts.stdio = ["ignore", "ignore", "ignore"];
+    var child = spawn(EDITOR_APPLICATION, flags, opts);
+    child.unref();
+};
+exports.atomiceditor = atomiceditor
+
+exports.newProject = function (output) {
+  return atomictool(["new", output], {output:true});
+};
+
+exports.build = function (platform) {
+  return atomictool(["build", platform], {output:true});
+};
+
+exports.addPlatform = function (platform) {
+  return atomictool(["platform-add", platform], {output:true});
+};
+
+exports.editor = function () {
+  return atomiceditor(["-project", process.cwd()], {output:true});
+};
+
+exports.run = function (platform, opts) {
+  
+    opts = opts || {};
+    var debug = opts.debug;
+
+    if (platform == null) {
+        // platform = get(config, "default_platform", "flash");
+    }
+
+    //checkPlatforms([platform]);
+
+    var run = function () {
+        switch (platform) {
+        case "web":
+            var url = "http://localhost:" + HTTP_PORT + "/AtomicPlayer.html";
+            console.log("Launching: " + url);
+
+            var open = require("open");
+            open(url);
+            break;
+
+          case "mac":
+              var open = require("open");
+              open("Build/Mac-Build/AtomicPlayer.app");
+              break;
+
+        }
+    };
+
+    return opts.noBuild ? run() : exports.build([platform], opts).then(function () {
+        console.log();
+        return run();
+    });
+};
+
+// Web Server (from flambe: https://raw.githubusercontent.com/aduros/flambe/master/command/index.js)
+var Server = function () {
+};
+exports.Server = Server;
+
+Server.prototype.start = function () {
+    var self = this;
+    var connect = require("connect");
+    var url = require("url");
+    var websocket = require("websocket");
+
+    // Fire up a Haxe compiler server, ignoring all output. It's fine if this command fails, the
+    // build will fallback to not using a compiler server
+    // spawn("haxe", ["--wait", HAXE_COMPILER_PORT], {stdio: "ignore"});
+
+    // Start a static HTTP server
+    var host = "0.0.0.0";
+    var staticServer = connect()
+        .use(function (req, res, next) {
+            var parsed = url.parse(req.url, true);
+            if (parsed.pathname == "/_api") {
+                // Handle API requests
+                req.setEncoding("utf8");
+                req.on("data", function (chunk) {
+                    self._onAPIMessage(chunk)
+                    .then(function (result) {
+                        res.end(JSON.stringify({result: result}));
+                    })
+                    .catch(function (error) {
+                        res.end(JSON.stringify({error: error}));
+                    });
+                });
+
+            } else {
+                if (parsed.query.v) {
+                    // Forever-cache assets
+                    var expires = new Date(Date.now() + 1000*60*60*24*365*25);
+                    res.setHeader("Expires", expires.toUTCString());
+                    res.setHeader("Cache-Control", "max-age=315360000");
+                }
+                next();
+            }
+        })
+        .use(connect.logger("tiny"))
+        .use(connect.compress())
+        .use(connect.static("Build/Web-Build"))
+        .listen(HTTP_PORT, host);
+    console.log("Serving on http://localhost:%s", HTTP_PORT);
+
+    this._wsServer = new websocket.server({
+        httpServer: staticServer,
+        autoAcceptConnections: true,
+    });
+
+    this._wsServer.on("connect", function (connection) {
+        connection.on("message", function (message) {
+            if (message.type == "utf8") {
+                self._onMessage(message.utf8Data);
+            }
+        });
+    });
+
+    var net = require("net");
+    this._connections = [];
+    this._socketServer = net.createServer(function (connection) {
+        self._connections.push(connection);
+        connection.on("end", function () {
+            self._connections.splice(self._connections.indexOf(connection, 1));
+        });
+        connection.on("data", function (data) {
+            data = data.toString();
+            self._onMessage(data);
+        });
+    });
+    this._socketServer.listen(SOCKET_PORT, host);
+
+    var watch = require("watch");
+    var crypto = require("crypto");
+    watch.createMonitor("Resources", {interval: 200}, function (monitor) {
+        monitor.on("changed", function (file) {
+            console.log("Asset changed: " + file);
+            var output = "build/web/"+file;
+            if (fs.existsSync(output)) {
+                var contents = fs.readFileSync(file);
+                fs.writeFileSync(output, contents);
+                self.broadcast("file_changed", {
+                    name: path.relative("Resources", file),
+                    md5: crypto.createHash("md5").update(contents).digest("hex"),
+                });
+            }
+        });
+    });
+};
+
+/** Broadcast an event to all clients. */
+Server.prototype.broadcast = function (type, params) {
+    var event = {type: type};
+    if (params) {
+        for (var k in params) {
+            event[k] = params[k];
+        }
+    }
+    var message = JSON.stringify(event);
+    this._wsServer.broadcast(message);
+    this._connections.forEach(function (connection) {
+        connection.write(message);
+    });
+};
+
+/** Handle messages from connected game clients. */
+Server.prototype._onMessage = function (message) {
+    try {
+        var event = JSON.parse(message);
+        // switch (event.type) {
+        // case "restart":
+        //     this.broadcast("restart");
+        // }
+    } catch (error) {
+        console.warn("Received badly formed message", error);
+    }
+};
+
+/** Handle web API messages. */
+Server.prototype._onAPIMessage = function (message) {
+    try {
+        message = JSON.parse(message);
+    } catch (error) {
+        return Q.reject("Badly formed JSON");
+    }
+
+    switch (message.method) {
+    case "restart":
+        this.broadcast("restart");
+        return Q.resolve({
+            htmlClients: this._wsServer.connections.length,
+            flashClients: this._connections.length,
+        });
+    default:
+        return Q.reject("Unknown method: " + message.method);
+    }
+};

+ 25 - 0
CLI/attic/atomic-cli/lib/cdn.js

@@ -0,0 +1,25 @@
+
+
+// CDN
+var cdnroot = JSON.parse(fs.readFileSync(__dirname + "/../data/cdn.json"))
+var branch;
+
+// TODO: otherwise we need to use the package data
+if (process.env.ATOMIC_DEV_LOCAL) {
+  branch = "local";
+}
+
+var cdn = cdnroot[branch]
+var cdnServer = cdn["server"];
+var cdnEditorVersion = cdn["editor"]["version"];
+var cdnAtomicToolVersion = cdn["atomictool"]["version"];
+
+var home = osenv.home();
+var atomicRootDir = home + "/.atomicgameengine/" + branch;
+
+// CDN url for editor
+var cdnEditorURL;
+
+if (process.platform == "darwin") {
+  cdnEditorURL = cdnServer + cdn["editor"] + "-" + cdnEditorVersion + ".zip";
+}

+ 45 - 0
CLI/attic/atomic-cli/package.json

@@ -0,0 +1,45 @@
+{
+  "author": {
+    "email": "[email protected]",
+    "name": "Atomic Game Engine",
+    "url": "http://www.AtomicGameEngine.com"
+  },
+  "bin": { "atomic-cli" : "./cli.js" },
+  "bugs": {
+    "url": "https://github.com/AtomicGameEngine/AtomicGameEngine/issues"
+  },
+  "dependencies": {
+    "adm-zip": "~0.4.3",
+    "argparse": "~0.1.15",
+    "connect": "~2.8.3",
+    "js-yaml": "~2.1.0",
+    "ncp": "~0.4.2",
+    "open": "~0.0.3",
+    "q": "~0.9.6",
+    "watch": "~0.8.0",
+    "websocket": "~1.0.8",
+    "wrench": "~1.5.1",
+    "xmldom": "~0.1.16",
+    "osenv" : "*",
+    "httpreq": "*",
+    "semver" : "*",
+    "mkdirp" : "*"
+  },
+  "description": "CLI for the Atomic Game Engine",
+  "engines": {
+    "node": ">=0.8.0"
+  },
+  "homepage": "http://www.AtomicGameEngine.com",
+   "licenses": [{
+    "type": "Atomic Game Engine",
+    "url": "https://github.com/AtomicGameEngine/AtomicGameEngine/blob/master/LICENSE.md"
+  }],
+  "files" : [
+    "data"
+  ],
+  "main": "index.js",
+  "name": "atomic-cli",
+  "preferGlobal": true,
+  "repository": "https://github.com/AtomicGameEngine/AtomicGameEngine",
+  "version": "0.2.4"
+}

+ 0 - 0
CLI/attic/atomic-cli/scripts/atomiccdn.js


+ 1 - 0
CLI/attic/atomic-cli/scripts/atomiceditor.js

@@ -0,0 +1 @@
+"use strict";

+ 65 - 0
CLI/attic/atomic-cli/scripts/postinstall.js

@@ -0,0 +1,65 @@
+"use strict";
+
+var fs = require("fs");
+var path = require('path');
+var osenv = require("osenv");
+var semver = require("semver")
+var mkdirp = require("mkdirp")
+var atomiceditor = require("./atomiceditor");
+var exists = fs.exists || path.exists;
+
+var mkdirSync = function (path) {
+
+  if (exists(path))
+    return;
+
+  mkdirp.sync(path);
+
+}
+
+var updateEditor = function() {
+
+}
+
+var editorUpdateRequired = function(path) {
+
+  if (!exists(path))
+    return true;
+
+  // JSON.parse(fs.readFileSync(path))
+  // console.log ( semver.major(semver.valid("2.0.0")));
+}
+
+// CDN
+var cdnroot = JSON.parse(fs.readFileSync(__dirname + "/../data/cdn.json"))
+var branch;
+
+// TODO: otherwise we need to use the package data
+if (process.env.ATOMIC_DEV_LOCAL) {
+  branch = "local";
+}
+
+var cdn = cdnroot[branch]
+var cdnServer = cdn["server"];
+var cdnEditorVersion = cdn["editor"]["version"];
+var cdnAtomicToolVersion = cdn["atomictool"]["version"];
+
+var home = osenv.home();
+var atomicRootDir = home + "/.atomicgameengine/" + branch;
+
+// CDN url for editor
+var cdnEditorURL;
+
+if (process.platform == "darwin") {
+  cdnEditorURL = cdnServer + cdn["editor"] + "-" + cdnEditorVersion + ".zip";
+}
+
+// ensure atomic's home exists
+mkdirSync(atomicRootDir);
+
+var editorUpdate = false;
+
+if (editorUpdateRequired(atomicRootDir)) {
+  editorUpdate = true;
+  console.log("Editor Update Required");
+}

+ 8 - 3
CMakeLists.txt

@@ -5,15 +5,20 @@ cmake_minimum_required (VERSION 3.0.2)
 
 
 set (CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMake/Modules)
 set (CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMake/Modules)
 
 
-add_definitions( -DATOMIC_API= -DATOMIC_STATIC_DEFINE -DATOMIC_LOGGING -DATOMIC_PHYSICS -DATOMIC_ATOMIC2D )
+add_definitions( -DATOMIC_API= -DATOMIC_STATIC_DEFINE -DATOMIC_ATOMIC2D -DATOMIC_LOGGING)
 
 
 # this is here as QtCreator is having trouble picking up #include <Atomic/*> without it
 # this is here as QtCreator is having trouble picking up #include <Atomic/*> without it
 include_directories(${CMAKE_SOURCE_DIR}/Source ${CMAKE_SOURCE_DIR}/Source/AtomicEditor/Source)
 include_directories(${CMAKE_SOURCE_DIR}/Source ${CMAKE_SOURCE_DIR}/Source/AtomicEditor/Source)
 
 
-set (ATOMIC_LINK_LIBRARIES Atomic Box2D Bullet Duktape FreeType JO LZ4 PugiXml StanHull STB )
+set (ATOMIC_LINK_LIBRARIES Atomic Box2D Duktape FreeType JO LZ4 PugiXml  STB)
+
+if (NOT ATOMIC_BUILD_2D)
+    add_definitions( -DATOMIC_PHYSICS -DATOMIC_3D)
+    set (ATOMIC_LINK_LIBRARIES ${ATOMIC_LINK_LIBRARIES} Bullet StanHull)
+endif()
 
 
 if (NOT EMSCRIPTEN)
 if (NOT EMSCRIPTEN)
-    add_definitions( -DATOMIC_NETWORK )
+    add_definitions( -DATOMIC_NETWORK)
     set (ATOMIC_LINK_LIBRARIES ${ATOMIC_LINK_LIBRARIES} SDL Civetweb Recast Detour kNet )
     set (ATOMIC_LINK_LIBRARIES ${ATOMIC_LINK_LIBRARIES} SDL Civetweb Recast Detour kNet )
 endif()
 endif()
 
 

+ 89 - 63
Rakefile

@@ -23,8 +23,8 @@ if $HOST_OS == "darwin"
   $QT_BIN_DIR = "#{ENV["QT_SDK"]}/bin"
   $QT_BIN_DIR = "#{ENV["QT_SDK"]}/bin"
 else
 else
   $QT_BIN_DIR = "C:\\Qt\\5.4\\msvc2013_64\\bin"
   $QT_BIN_DIR = "C:\\Qt\\5.4\\msvc2013_64\\bin"
-  QT_CREATOR_BIN_DIR = "C:\\Qt\\Tools\\QtCreator\\bin"  
-  ENV['PATH'] = "#{QT_CREATOR_BIN_DIR};" + ENV['PATH']    
+  QT_CREATOR_BIN_DIR = "C:\\Qt\\Tools\\QtCreator\\bin"
+  ENV['PATH'] = "#{QT_CREATOR_BIN_DIR};" + ENV['PATH']
 end
 end
 
 
 
 
@@ -43,11 +43,11 @@ namespace :android  do
       sh "#{BUILD_FOLDER}/JSBind #{$RAKE_ROOT} ANDROID"
       sh "#{BUILD_FOLDER}/JSBind #{$RAKE_ROOT} ANDROID"
       sh "cmake -DCMAKE_TOOLCHAIN_FILE=#{$RAKE_ROOT}/CMake/Toolchains/android.toolchain.cmake -DCMAKE_BUILD_TYPE=Release ../../"
       sh "cmake -DCMAKE_TOOLCHAIN_FILE=#{$RAKE_ROOT}/CMake/Toolchains/android.toolchain.cmake -DCMAKE_BUILD_TYPE=Release ../../"
       sh "make -j8"
       sh "make -j8"
-    end 
-    
+    end
+
   end
   end
 
 
-end  
+end
 
 
 namespace :ios do
 namespace :ios do
 
 
@@ -63,11 +63,11 @@ namespace :ios do
       sh "#{BUILD_FOLDER}/JSBind #{$RAKE_ROOT} IOS"
       sh "#{BUILD_FOLDER}/JSBind #{$RAKE_ROOT} IOS"
       sh "cmake -DIOS=1 -DCMAKE_BUILD_TYPE=Release -G Xcode ../../"
       sh "cmake -DIOS=1 -DCMAKE_BUILD_TYPE=Release -G Xcode ../../"
       sh "xcodebuild -configuration Release"
       sh "xcodebuild -configuration Release"
-    end 
-    
+    end
+
   end
   end
 
 
-end  
+end
 
 
 
 
 namespace :web do
 namespace :web do
@@ -82,35 +82,35 @@ namespace :web do
 
 
     Dir.chdir(CMAKE_WEB_BUILD_FOLDER) do
     Dir.chdir(CMAKE_WEB_BUILD_FOLDER) do
       sh "#{BUILD_FOLDER}/JSBind #{$RAKE_ROOT} WEB"
       sh "#{BUILD_FOLDER}/JSBind #{$RAKE_ROOT} WEB"
-      sh "cmake -DEMSCRIPTEN=1 -DCMAKE_TOOLCHAIN_FILE=#{$RAKE_ROOT}/CMake/Toolchains/emscripten.toolchain.cmake -DCMAKE_BUILD_TYPE=Release ../../"
+      sh "cmake -DEMSCRIPTEN=1 -DATOMIC_BUILD_2D=1 -DCMAKE_TOOLCHAIN_FILE=#{$RAKE_ROOT}/CMake/Toolchains/emscripten.toolchain.cmake -DCMAKE_BUILD_TYPE=Release ../../"
       sh "make -j8"
       sh "make -j8"
-    end 
+    end
 
 
     Dir.chdir("#{CMAKE_WEB_BUILD_FOLDER}/Source/AtomicPlayer") do
     Dir.chdir("#{CMAKE_WEB_BUILD_FOLDER}/Source/AtomicPlayer") do
       sh "mv AtomicPlayer AtomicPlayer.bc"
       sh "mv AtomicPlayer AtomicPlayer.bc"
-      sh "emcc -O3 --llvm-lto 1 --memory-init-file 0 -s VERBOSE=0 -s USE_SDL=2 -s ASM_JS=1 -s ASSERTIONS=1 -s OUTLINING_LIMIT=20000 -s TOTAL_MEMORY=520093696 --closure 0 ./AtomicPlayer.bc -o  ./AtomicPlayer.html"
+      sh "emcc -O3 -s VERBOSE=0 -s USE_SDL=2 -s TOTAL_MEMORY=268435456 -s AGGRESSIVE_VARIABLE_ELIMINATION=1 -s ERROR_ON_UNDEFINED_SYMBOLS=1 -s NO_EXIT_RUNTIME=1 ./AtomicPlayer.bc -o  ./AtomicPlayer.html"
     end
     end
 
 
   end
   end
 
 
-end  
+end
 
 
 
 
 namespace :macosx do
 namespace :macosx do
 
 
-  
+
   CMAKE_MACOSX_BUILD_FOLDER = "#{ARTIFACTS_FOLDER}/MacOSX_Build"
   CMAKE_MACOSX_BUILD_FOLDER = "#{ARTIFACTS_FOLDER}/MacOSX_Build"
   MACOSX_PACKAGE_FOLDER = "#{ARTIFACTS_FOLDER}/MacOSX_Package"
   MACOSX_PACKAGE_FOLDER = "#{ARTIFACTS_FOLDER}/MacOSX_Package"
 
 
   task :clean do
   task :clean do
 
 
     folders = ["#{CMAKE_MACOSX_BUILD_FOLDER}", "#{MACOSX_PACKAGE_FOLDER}",
     folders = ["#{CMAKE_MACOSX_BUILD_FOLDER}", "#{MACOSX_PACKAGE_FOLDER}",
-               "#{ARTIFACTS_FOLDER}/Android_Build", "#{ARTIFACTS_FOLDER}/Web_Build",  
+               "#{ARTIFACTS_FOLDER}/Android_Build", "#{ARTIFACTS_FOLDER}/Web_Build",
                "#{ARTIFACTS_FOLDER}/AtomicExamples", "#{ARTIFACTS_FOLDER}/Docs",
                "#{ARTIFACTS_FOLDER}/AtomicExamples", "#{ARTIFACTS_FOLDER}/Docs",
                "#{ARTIFACTS_FOLDER}/Examples",  "#{ARTIFACTS_FOLDER}/AtomicTiled_Build",
                "#{ARTIFACTS_FOLDER}/Examples",  "#{ARTIFACTS_FOLDER}/AtomicTiled_Build",
                "#{ARTIFACTS_FOLDER}/IOS_Build", "#{ARTIFACTS_FOLDER}/IOSDeploy_Build"]
                "#{ARTIFACTS_FOLDER}/IOS_Build", "#{ARTIFACTS_FOLDER}/IOSDeploy_Build"]
 
 
-    for index in 0 ... folders.size    
+    for index in 0 ... folders.size
 
 
         if Dir.exists?(folders[index])
         if Dir.exists?(folders[index])
             puts "rm -rf #{folders[index]}"
             puts "rm -rf #{folders[index]}"
@@ -120,8 +120,8 @@ namespace :macosx do
         if Dir.exists?(folders[index])
         if Dir.exists?(folders[index])
             abort("Unable to clean #{folders[index]}")
             abort("Unable to clean #{folders[index]}")
         end
         end
-    
-    end           
+
+    end
 
 
   end
   end
 
 
@@ -131,7 +131,7 @@ namespace :macosx do
 
 
     Dir.chdir(CMAKE_MACOSX_BUILD_FOLDER) do
     Dir.chdir(CMAKE_MACOSX_BUILD_FOLDER) do
       sh "cmake ../../ -DCMAKE_BUILD_TYPE=Release"
       sh "cmake ../../ -DCMAKE_BUILD_TYPE=Release"
-    end 
+    end
 
 
 	end
 	end
 
 
@@ -142,7 +142,7 @@ namespace :macosx do
       sh "cp ./Source/AtomicJS/JSBind/JSBind #{BUILD_FOLDER}/JSBind"
       sh "cp ./Source/AtomicJS/JSBind/JSBind #{BUILD_FOLDER}/JSBind"
     end
     end
 
 
-  end 
+  end
 
 
 	task :generate_javascript_bindings => "macosx:jsbind" do
 	task :generate_javascript_bindings => "macosx:jsbind" do
 
 
@@ -165,7 +165,7 @@ namespace :macosx do
       sh "cp -r out #{ARTIFACTS_FOLDER}/Docs"
       sh "cp -r out #{ARTIFACTS_FOLDER}/Docs"
     end
     end
 
 
-  end  
+  end
 
 
   task :generate_examples do
   task :generate_examples do
 
 
@@ -182,14 +182,14 @@ namespace :macosx do
       sh "mkdir Examples"
       sh "mkdir Examples"
 
 
       sh "git clone https://github.com/AtomicGameEngine/AtomicExamples"
       sh "git clone https://github.com/AtomicGameEngine/AtomicExamples"
-      
+
       Dir.chdir("AtomicExamples") do
       Dir.chdir("AtomicExamples") do
         sh "git archive master | tar -x -C #{ARTIFACTS_FOLDER}/Examples"
         sh "git archive master | tar -x -C #{ARTIFACTS_FOLDER}/Examples"
       end
       end
 
 
     end
     end
 
 
-  end  
+  end
 
 
 	task :player => "macosx:generate_javascript_bindings" do
 	task :player => "macosx:generate_javascript_bindings" do
 
 
@@ -204,8 +204,18 @@ namespace :macosx do
   task :editor => ["macosx:player"] do
   task :editor => ["macosx:player"] do
 
 
     Dir.chdir(CMAKE_MACOSX_BUILD_FOLDER) do
     Dir.chdir(CMAKE_MACOSX_BUILD_FOLDER) do
-      
-      sh "make -j8 AtomicEditor"
+
+      sh "make -j8 BuildEditorFiles"
+
+    end
+
+  end
+
+  task :atomictool => ["macosx:player", "macosx:editor"] do
+
+    Dir.chdir(CMAKE_MACOSX_BUILD_FOLDER) do
+
+      sh "make -j8 AtomicTool"
 
 
     end
     end
 
 
@@ -222,17 +232,17 @@ namespace :package do
                           'ios:player',
                           'ios:player',
                           "atomictiled:osx",
                           "atomictiled:osx",
                           'macosx:editor',
                           'macosx:editor',
-                          'macosx:generate_examples', 
+                          'macosx:atomictool',
+                          'macosx:generate_examples',
                           'macosx:generate_docs'] do
                           'macosx:generate_docs'] do
 
 
-      FileUtils.mkdir_p(MACOSX_PACKAGE_FOLDER)                    
+      FileUtils.mkdir_p(MACOSX_PACKAGE_FOLDER)
 
 
       MAC_PLAYER_APP_FOLDER_SRC = "#{CMAKE_MACOSX_BUILD_FOLDER}/Source/AtomicPlayer/AtomicPlayer.app"
       MAC_PLAYER_APP_FOLDER_SRC = "#{CMAKE_MACOSX_BUILD_FOLDER}/Source/AtomicPlayer/AtomicPlayer.app"
       MAC_EDITOR_APP_FOLDER_SRC = "#{CMAKE_MACOSX_BUILD_FOLDER}/Source/AtomicEditor/AtomicEditor.app"
       MAC_EDITOR_APP_FOLDER_SRC = "#{CMAKE_MACOSX_BUILD_FOLDER}/Source/AtomicEditor/AtomicEditor.app"
 
 
       # Resources
       # Resources
-      COREDATA_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicPlayer/Resources/CoreData"    
-      EDITORRESOURCES_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicEditor/Resources/EditorData"
+      COREDATA_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicPlayer/Resources/CoreData"
       EDITORAPPLICATIONDATA_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicEditor"
       EDITORAPPLICATIONDATA_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicEditor"
 
 
       # Project Templates
       # Project Templates
@@ -247,7 +257,7 @@ namespace :package do
       DOCS_FOLDER_SRC = "#{ARTIFACTS_FOLDER}/Docs"
       DOCS_FOLDER_SRC = "#{ARTIFACTS_FOLDER}/Docs"
 
 
       MAC_EDITOR_APP_FOLDER_DST = "#{MACOSX_PACKAGE_FOLDER}/AtomicEditor.app"
       MAC_EDITOR_APP_FOLDER_DST = "#{MACOSX_PACKAGE_FOLDER}/AtomicEditor.app"
-      MAC_EDITOR_APP_RESOURCE_FOLDER_DST = "#{MACOSX_PACKAGE_FOLDER}/AtomicEditor.app/Contents/Resources"      
+      MAC_EDITOR_APP_RESOURCE_FOLDER_DST = "#{MACOSX_PACKAGE_FOLDER}/AtomicEditor.app/Contents/Resources"
 
 
       # Copy the Editor application
       # Copy the Editor application
       sh "cp -r #{MAC_EDITOR_APP_FOLDER_SRC} #{MACOSX_PACKAGE_FOLDER}/AtomicEditor.app"
       sh "cp -r #{MAC_EDITOR_APP_FOLDER_SRC} #{MACOSX_PACKAGE_FOLDER}/AtomicEditor.app"
@@ -259,7 +269,6 @@ namespace :package do
 
 
       # Copy Resources
       # Copy Resources
       sh "cp -r #{COREDATA_FOLDER_SRC} #{MAC_EDITOR_APP_RESOURCE_FOLDER_DST}/CoreData"
       sh "cp -r #{COREDATA_FOLDER_SRC} #{MAC_EDITOR_APP_RESOURCE_FOLDER_DST}/CoreData"
-      sh "cp -r #{EDITORRESOURCES_FOLDER_SRC} #{MAC_EDITOR_APP_RESOURCE_FOLDER_DST}/EditorData"
 
 
       # Copy Deployment
       # Copy Deployment
 
 
@@ -302,11 +311,13 @@ namespace :package do
 
 
       FileUtils.cp("#{CMAKE_IOSDEPLOY_BUILD_FOLDER}/ios-deploy", "#{APPLICATIONS_FOLDER_DST}/CommandLine/ios-deploy")
       FileUtils.cp("#{CMAKE_IOSDEPLOY_BUILD_FOLDER}/ios-deploy", "#{APPLICATIONS_FOLDER_DST}/CommandLine/ios-deploy")
 
 
+      FileUtils.cp("#{CMAKE_MACOSX_BUILD_FOLDER}/Source/AtomicTool/AtomicTool", "#{APPLICATIONS_FOLDER_DST}/CommandLine/AtomicTool")
+
   end
   end
 
 
   task :macosx_editor do
   task :macosx_editor do
 
 
-    EDITOR_APP_FOLDER = "#{MACOSX_PACKAGE_FOLDER}/AtomicEditor.app" 
+    EDITOR_APP_FOLDER = "#{MACOSX_PACKAGE_FOLDER}/AtomicEditor.app"
     if (!File.file?("#{EDITOR_APP_FOLDER}/Contents/Resources/Deployment/Win64/AtomicPlayer.exe"))
     if (!File.file?("#{EDITOR_APP_FOLDER}/Contents/Resources/Deployment/Win64/AtomicPlayer.exe"))
       abort("Missing Windows player, please run rake package:windows_editor from Windows")
       abort("Missing Windows player, please run rake package:windows_editor from Windows")
     end
     end
@@ -315,30 +326,29 @@ namespace :package do
 
 
       if (File.file?("AtomicEditor_MacOSX.zip"))
       if (File.file?("AtomicEditor_MacOSX.zip"))
         sh "rm AtomicEditor_MacOSX.zip"
         sh "rm AtomicEditor_MacOSX.zip"
-      end 
+      end
 
 
       if (File.file?("AtomicEditor_MacOSX.zip"))
       if (File.file?("AtomicEditor_MacOSX.zip"))
         abort ("Couldn't remove editor")
         abort ("Couldn't remove editor")
-      end       
+      end
 
 
       sh "zip -r AtomicEditor_MacOSX.zip ./AtomicEditor.app"
       sh "zip -r AtomicEditor_MacOSX.zip ./AtomicEditor.app"
       sh "zip -T AtomicEditor_MacOSX.zip"
       sh "zip -T AtomicEditor_MacOSX.zip"
 
 
     end
     end
 
 
-
-
   end
   end
 
 
 
 
-  task :windows_preflight => ['windows:clean', 
-                              'windows:editor', 
+  task :windows_preflight => ['windows:clean',
+                              'windows:editor',
+                              'windows:atomictool',
                               'atomictiled:windows' ] do
                               'atomictiled:windows' ] do
-                          
+
 
 
     ATOMICBUILDBOX_SOURCE_DIR =  "#{$RAKE_ROOT}/../AtomicBuildBox/Windows/x64"
     ATOMICBUILDBOX_SOURCE_DIR =  "#{$RAKE_ROOT}/../AtomicBuildBox/Windows/x64"
-    EDITOR_APP_FOLDER_DST = "#{WINDOWS_PACKAGE_FOLDER}/AtomicEditor" 
-    
+    EDITOR_APP_FOLDER_DST = "#{WINDOWS_PACKAGE_FOLDER}/AtomicEditor"
+
     FileUtils.mkdir_p(EDITOR_APP_FOLDER_DST)
     FileUtils.mkdir_p(EDITOR_APP_FOLDER_DST)
 
 
     PLAYER_APP_EXE_SRC = "#{CMAKE_WINDOWS_BUILD_FOLDER}/Source/AtomicPlayer/AtomicPlayer.exe"
     PLAYER_APP_EXE_SRC = "#{CMAKE_WINDOWS_BUILD_FOLDER}/Source/AtomicPlayer/AtomicPlayer.exe"
@@ -347,8 +357,7 @@ namespace :package do
     DEPLOYMENT_FOLDER = "#{EDITOR_APP_FOLDER_DST}/Deployment/Win64"
     DEPLOYMENT_FOLDER = "#{EDITOR_APP_FOLDER_DST}/Deployment/Win64"
 
 
     # Resources
     # Resources
-    COREDATA_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicPlayer/Resources/CoreData"    
-    EDITORRESOURCES_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicEditor/Resources/EditorData"
+    COREDATA_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicPlayer/Resources/CoreData"
     EDITORAPPLICATIONDATA_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicEditor"
     EDITORAPPLICATIONDATA_FOLDER_SRC = "#{$RAKE_ROOT}/Data/AtomicEditor"
 
 
     # Project Templates
     # Project Templates
@@ -356,14 +365,17 @@ namespace :package do
 
 
     #Examples
     #Examples
     #Example info could possibly go in the AtomicExamples repo
     #Example info could possibly go in the AtomicExamples repo
-    EXAMPLEINFO_FOLDER_SRC = "#{EDITORAPPLICATIONDATA_FOLDER_SRC}/ExampleInfo"    
-    
+    EXAMPLEINFO_FOLDER_SRC = "#{EDITORAPPLICATIONDATA_FOLDER_SRC}/ExampleInfo"
+
+    # This shouldn't ne in root, used for deployment atm, however the editor can use coredata from pak
     FileUtils.cp_r("#{COREDATA_FOLDER_SRC}", "#{EDITOR_APP_FOLDER_DST}/CoreData")
     FileUtils.cp_r("#{COREDATA_FOLDER_SRC}", "#{EDITOR_APP_FOLDER_DST}/CoreData")
-    FileUtils.cp_r("#{EDITORRESOURCES_FOLDER_SRC}", "#{EDITOR_APP_FOLDER_DST}/EditorData")
+
+    FileUtils.cp("#{CMAKE_WINDOWS_BUILD_FOLDER}/Source/AtomicEditor/EditorData.pak", "#{EDITOR_APP_FOLDER_DST}/EditorData.pak")
+    FileUtils.cp("#{CMAKE_WINDOWS_BUILD_FOLDER}/Source/AtomicEditor/CoreData.pak", "#{EDITOR_APP_FOLDER_DST}/CoreData.pak")
 
 
     FileUtils.cp_r("#{PROJECTTEMPLATES_FOLDER_SRC}", "#{EDITOR_APP_FOLDER_DST}/ProjectTemplates")
     FileUtils.cp_r("#{PROJECTTEMPLATES_FOLDER_SRC}", "#{EDITOR_APP_FOLDER_DST}/ProjectTemplates")
     FileUtils.cp_r("#{EXAMPLEINFO_FOLDER_SRC}", "#{EDITOR_APP_FOLDER_DST}/ExampleInfo")
     FileUtils.cp_r("#{EXAMPLEINFO_FOLDER_SRC}", "#{EDITOR_APP_FOLDER_DST}/ExampleInfo")
-    
+
     FileUtils.mkdir_p("#{DEPLOYMENT_FOLDER}")
     FileUtils.mkdir_p("#{DEPLOYMENT_FOLDER}")
     FileUtils.cp("#{ATOMICBUILDBOX_SOURCE_DIR}/D3DCompiler_47.dll", "#{DEPLOYMENT_FOLDER}/D3DCompiler_47.dll")
     FileUtils.cp("#{ATOMICBUILDBOX_SOURCE_DIR}/D3DCompiler_47.dll", "#{DEPLOYMENT_FOLDER}/D3DCompiler_47.dll")
     FileUtils.cp("#{PLAYER_APP_EXE_SRC}", "#{DEPLOYMENT_FOLDER}/AtomicPlayer.exe")
     FileUtils.cp("#{PLAYER_APP_EXE_SRC}", "#{DEPLOYMENT_FOLDER}/AtomicPlayer.exe")
@@ -378,7 +390,7 @@ namespace :package do
     FileUtils.cp("#{ATOMICTILED_BUILD_DIR}/tiled.exe", "#{ATOMICTILED_DEPLOYED_DIR}")
     FileUtils.cp("#{ATOMICTILED_BUILD_DIR}/tiled.exe", "#{ATOMICTILED_DEPLOYED_DIR}")
     FileUtils.cp("#{ATOMICTILED_BUILD_DIR}/tiled.dll", "#{ATOMICTILED_DEPLOYED_DIR}")
     FileUtils.cp("#{ATOMICTILED_BUILD_DIR}/tiled.dll", "#{ATOMICTILED_DEPLOYED_DIR}")
 
 
-    ENV['PATH'] = "#{$QT_BIN_DIR};" + ENV['PATH'] 
+    ENV['PATH'] = "#{$QT_BIN_DIR};" + ENV['PATH']
     Dir.chdir(ATOMICTILED_DEPLOYED_DIR) do
     Dir.chdir(ATOMICTILED_DEPLOYED_DIR) do
       sh "windeployqt.exe --release #{ATOMICTILED_DEPLOYED_DIR}/tiled.exe"
       sh "windeployqt.exe --release #{ATOMICTILED_DEPLOYED_DIR}/tiled.exe"
       FileUtils.cp("#{ATOMICBUILDBOX_SOURCE_DIR}/msvcp120.dll", "#{ATOMICTILED_DEPLOYED_DIR}/msvcp120.dll")
       FileUtils.cp("#{ATOMICBUILDBOX_SOURCE_DIR}/msvcp120.dll", "#{ATOMICTILED_DEPLOYED_DIR}/msvcp120.dll")
@@ -386,6 +398,9 @@ namespace :package do
       FileUtils.cp("#{ATOMICBUILDBOX_SOURCE_DIR}/vccorlib120.dll", "#{ATOMICTILED_DEPLOYED_DIR}/vccorlib120.dll")
       FileUtils.cp("#{ATOMICBUILDBOX_SOURCE_DIR}/vccorlib120.dll", "#{ATOMICTILED_DEPLOYED_DIR}/vccorlib120.dll")
     end
     end
 
 
+    FileUtils.mkdir_p("#{EDITOR_APP_FOLDER_DST}/Applications/CommandLine")
+    FileUtils.cp("#{CMAKE_WINDOWS_BUILD_FOLDER}/Source/AtomicTool/AtomicTool.exe", "#{EDITOR_APP_FOLDER_DST}/Applications/CommandLine/AtomicTool.exe")
+
   end
   end
 
 
   task :windows_editor do
   task :windows_editor do
@@ -397,13 +412,13 @@ namespace :package do
 
 
       if (File.exists?("AtomicEditor_Windows.zip"))
       if (File.exists?("AtomicEditor_Windows.zip"))
         FileUtils.rm("AtomicEditor_Windows.zip")
         FileUtils.rm("AtomicEditor_Windows.zip")
-      end 
+      end
 
 
       if (File.exists?("AtomicEditor_Windows.zip"))
       if (File.exists?("AtomicEditor_Windows.zip"))
         abort("Unable to remove AtomicEditor_Windows.zip")
         abort("Unable to remove AtomicEditor_Windows.zip")
-      end 
- 
-    end  
+      end
+
+    end
 
 
     DEPLOYMENT_FOLDER = "#{EDITOR_APP_FOLDER_DST}/Deployment"
     DEPLOYMENT_FOLDER = "#{EDITOR_APP_FOLDER_DST}/Deployment"
     FileUtils.cp_r("#{MAC_ARTIFACTS_SRC}/Deployment/Android", "#{EDITOR_APP_FOLDER_DST}/Deployment/Android")
     FileUtils.cp_r("#{MAC_ARTIFACTS_SRC}/Deployment/Android", "#{EDITOR_APP_FOLDER_DST}/Deployment/Android")
@@ -425,7 +440,7 @@ namespace :package do
       sh "\"C:\\Program Files\\7-Zip\\7z.exe\" a -tzip AtomicEditor_Windows.zip AtomicEditor"
       sh "\"C:\\Program Files\\7-Zip\\7z.exe\" a -tzip AtomicEditor_Windows.zip AtomicEditor"
       sh "\"C:\\Program Files\\7-Zip\\7z.exe\" t AtomicEditor_Windows.zip"
       sh "\"C:\\Program Files\\7-Zip\\7z.exe\" t AtomicEditor_Windows.zip"
 
 
-    end  
+    end
 
 
   end
   end
 
 
@@ -444,17 +459,17 @@ namespace :windows do
                "#{ARTIFACTS_FOLDER}/AtomicExamples", "#{ARTIFACTS_FOLDER}/Docs",
                "#{ARTIFACTS_FOLDER}/AtomicExamples", "#{ARTIFACTS_FOLDER}/Docs",
                "#{ARTIFACTS_FOLDER}/Examples",  "#{ARTIFACTS_FOLDER}/AtomicTiled_Build"]
                "#{ARTIFACTS_FOLDER}/Examples",  "#{ARTIFACTS_FOLDER}/AtomicTiled_Build"]
 
 
-    for index in 0 ... folders.size    
+    for index in 0 ... folders.size
 
 
         if Dir.exists?(folders[index])
         if Dir.exists?(folders[index])
-            FileUtils.rmtree(folders[index])          
+            FileUtils.rmtree(folders[index])
         end
         end
 
 
         if Dir.exists?(folders[index])
         if Dir.exists?(folders[index])
             abort("Unable to clean #{folders[index]}")
             abort("Unable to clean #{folders[index]}")
         end
         end
-    
-    end           
+
+    end
 
 
   end
   end
 
 
@@ -464,7 +479,7 @@ namespace :windows do
 
 
     Dir.chdir(CMAKE_WINDOWS_BUILD_FOLDER) do
     Dir.chdir(CMAKE_WINDOWS_BUILD_FOLDER) do
       sh "cmake ../../ -G\"NMake Makefiles JOM\" -DCMAKE_BUILD_TYPE=Release"
       sh "cmake ../../ -G\"NMake Makefiles JOM\" -DCMAKE_BUILD_TYPE=Release"
-    end 
+    end
 
 
 	end
 	end
 
 
@@ -490,8 +505,19 @@ namespace :windows do
   task :editor => "windows:player" do
   task :editor => "windows:player" do
 
 
     Dir.chdir(CMAKE_WINDOWS_BUILD_FOLDER) do
     Dir.chdir(CMAKE_WINDOWS_BUILD_FOLDER) do
-      
+
       sh "jom -j4 AtomicEditor"
       sh "jom -j4 AtomicEditor"
+      sh "jom BuildEditorFiles"
+
+    end
+
+  end
+
+  task :atomictool => "windows:editor" do
+
+    Dir.chdir(CMAKE_WINDOWS_BUILD_FOLDER) do
+
+      sh "jom -j4 AtomicTool"
 
 
     end
     end
 
 
@@ -504,26 +530,26 @@ task :iosdeploy do
   CMAKE_IOSDEPLOY_BUILD_FOLDER = "#{ARTIFACTS_FOLDER}/ios-deploy"
   CMAKE_IOSDEPLOY_BUILD_FOLDER = "#{ARTIFACTS_FOLDER}/ios-deploy"
 
 
   if Dir.exists?(CMAKE_IOSDEPLOY_BUILD_FOLDER)
   if Dir.exists?(CMAKE_IOSDEPLOY_BUILD_FOLDER)
-      FileUtils.rmtree(CMAKE_IOSDEPLOY_BUILD_FOLDER)          
+      FileUtils.rmtree(CMAKE_IOSDEPLOY_BUILD_FOLDER)
   end
   end
 
 
   Dir.chdir("#{ARTIFACTS_FOLDER}") do
   Dir.chdir("#{ARTIFACTS_FOLDER}") do
 
 
     sh "git clone https://github.com/AtomicGameEngine/ios-deploy"
     sh "git clone https://github.com/AtomicGameEngine/ios-deploy"
-    
+
     Dir.chdir("ios-deploy") do
     Dir.chdir("ios-deploy") do
       sh "make"
       sh "make"
     end
     end
 
 
   end
   end
 
 
-end  
+end
 
 
 namespace :atomictiled do
 namespace :atomictiled do
 
 
   task :windows do
   task :windows do
 
 
-    ENV['PATH'] = "#{$QT_BIN_DIR};" + ENV['PATH']    
+    ENV['PATH'] = "#{$QT_BIN_DIR};" + ENV['PATH']
 
 
     FileUtils.mkdir_p(ATOMICTILED_BUILD_DIR)
     FileUtils.mkdir_p(ATOMICTILED_BUILD_DIR)
 
 
@@ -546,4 +572,4 @@ namespace :atomictiled do
   end
   end
 
 
 
 
-end
+end

+ 3 - 3
Source/Atomic/Graphics/AnimatedModel.cpp → Source/Atomic/Atomic3D/AnimatedModel.cpp

@@ -21,9 +21,9 @@
 //
 //
 
 
 #include "Precompiled.h"
 #include "Precompiled.h"
-#include "../Graphics/AnimatedModel.h"
-#include "../Graphics/Animation.h"
-#include "../Graphics/AnimationState.h"
+#include "../Atomic3D/AnimatedModel.h"
+#include "../Atomic3D/Animation.h"
+#include "../Atomic3D/AnimationState.h"
 #include "../Graphics/Batch.h"
 #include "../Graphics/Batch.h"
 #include "../Graphics/Camera.h"
 #include "../Graphics/Camera.h"
 #include "../Core/Context.h"
 #include "../Core/Context.h"

+ 3 - 3
Source/Atomic/Graphics/AnimatedModel.h → Source/Atomic/Atomic3D/AnimatedModel.h

@@ -22,9 +22,9 @@
 
 
 #pragma once
 #pragma once
 
 
-#include "../Graphics/Model.h"
-#include "../Graphics/Skeleton.h"
-#include "../Graphics/StaticModel.h"
+#include "../Atomic3D/Model.h"
+#include "../Atomic3D/Skeleton.h"
+#include "../Atomic3D/StaticModel.h"
 
 
 namespace Atomic
 namespace Atomic
 {
 {

+ 1 - 1
Source/Atomic/Graphics/Animation.cpp → Source/Atomic/Atomic3D/Animation.cpp

@@ -21,7 +21,7 @@
 //
 //
 
 
 #include "Precompiled.h"
 #include "Precompiled.h"
-#include "../Graphics/Animation.h"
+#include "../Atomic3D/Animation.h"
 #include "../Core/Context.h"
 #include "../Core/Context.h"
 #include "../IO/Deserializer.h"
 #include "../IO/Deserializer.h"
 #include "../IO/FileSystem.h"
 #include "../IO/FileSystem.h"

+ 0 - 0
Source/Atomic/Graphics/Animation.h → Source/Atomic/Atomic3D/Animation.h


+ 4 - 4
Source/Atomic/Graphics/AnimationController.cpp → Source/Atomic/Atomic3D/AnimationController.cpp

@@ -21,10 +21,10 @@
 //
 //
 
 
 #include "Precompiled.h"
 #include "Precompiled.h"
-#include "../Graphics/AnimatedModel.h"
-#include "../Graphics/Animation.h"
-#include "../Graphics/AnimationController.h"
-#include "../Graphics/AnimationState.h"
+#include "../Atomic3D/AnimatedModel.h"
+#include "../Atomic3D/Animation.h"
+#include "../Atomic3D/AnimationController.h"
+#include "../Atomic3D/AnimationState.h"
 #include "../Core/Context.h"
 #include "../Core/Context.h"
 #include "../IO/Log.h"
 #include "../IO/Log.h"
 #include "../IO/MemoryBuffer.h"
 #include "../IO/MemoryBuffer.h"

+ 0 - 0
Source/Atomic/Graphics/AnimationController.h → Source/Atomic/Atomic3D/AnimationController.h


+ 3 - 3
Source/Atomic/Graphics/AnimationState.cpp → Source/Atomic/Atomic3D/AnimationState.cpp

@@ -21,9 +21,9 @@
 //
 //
 
 
 #include "Precompiled.h"
 #include "Precompiled.h"
-#include "../Graphics/AnimatedModel.h"
-#include "../Graphics/Animation.h"
-#include "../Graphics/AnimationState.h"
+#include "../Atomic3D/AnimatedModel.h"
+#include "../Atomic3D/Animation.h"
+#include "../Atomic3D/AnimationState.h"
 #include "../IO/Deserializer.h"
 #include "../IO/Deserializer.h"
 #include "../Graphics/DrawableEvents.h"
 #include "../Graphics/DrawableEvents.h"
 #include "../IO/Log.h"
 #include "../IO/Log.h"

+ 0 - 0
Source/Atomic/Graphics/AnimationState.h → Source/Atomic/Atomic3D/AnimationState.h


+ 40 - 0
Source/Atomic/Atomic3D/Atomic3D.cpp

@@ -0,0 +1,40 @@
+
+#include "StaticModel.h"
+#include "StaticModelGroup.h"
+#include "Skybox.h"
+#include "Animation.h"
+#include "Model.h"
+#include "AnimatedModel.h"
+#include "AnimationController.h"
+#include "BillboardSet.h"
+#include "ParticleEffect.h"
+#include "ParticleEmitter.h"
+#include "CustomGeometry.h"
+#include "DecalSet.h"
+#include "Terrain.h"
+#include "TerrainPatch.h"
+
+
+namespace Atomic
+{
+
+
+void RegisterAtomic3DLibrary(Context* context)
+{
+    Animation::RegisterObject(context);
+    Model::RegisterObject(context);
+    StaticModel::RegisterObject(context);
+    StaticModelGroup::RegisterObject(context);
+    Skybox::RegisterObject(context);
+    AnimatedModel::RegisterObject(context);
+    AnimationController::RegisterObject(context);
+    BillboardSet::RegisterObject(context);
+    ParticleEffect::RegisterObject(context);
+    ParticleEmitter::RegisterObject(context);
+    CustomGeometry::RegisterObject(context);
+    DecalSet::RegisterObject(context);
+    Terrain::RegisterObject(context);
+    TerrainPatch::RegisterObject(context);
+}
+
+}

+ 9 - 0
Source/Atomic/Atomic3D/Atomic3D.h

@@ -0,0 +1,9 @@
+
+#pragma once
+
+namespace Atomic
+{
+
+void RegisterAtomic3DLibrary(Context* context);
+
+}

+ 1 - 1
Source/Atomic/Graphics/BillboardSet.cpp → Source/Atomic/Atomic3D/BillboardSet.cpp

@@ -22,7 +22,7 @@
 
 
 #include "Precompiled.h"
 #include "Precompiled.h"
 #include "../Graphics/Batch.h"
 #include "../Graphics/Batch.h"
-#include "../Graphics/BillboardSet.h"
+#include "../Atomic3D/BillboardSet.h"
 #include "../Graphics/Camera.h"
 #include "../Graphics/Camera.h"
 #include "../Core/Context.h"
 #include "../Core/Context.h"
 #include "../Graphics/Geometry.h"
 #include "../Graphics/Geometry.h"

+ 0 - 0
Source/Atomic/Graphics/BillboardSet.h → Source/Atomic/Atomic3D/BillboardSet.h


+ 1 - 1
Source/Atomic/Graphics/CustomGeometry.cpp → Source/Atomic/Atomic3D/CustomGeometry.cpp

@@ -24,7 +24,7 @@
 #include "../Graphics/Batch.h"
 #include "../Graphics/Batch.h"
 #include "../Graphics/Camera.h"
 #include "../Graphics/Camera.h"
 #include "../Core/Context.h"
 #include "../Core/Context.h"
-#include "../Graphics/CustomGeometry.h"
+#include "../Atomic3D/CustomGeometry.h"
 #include "../Graphics/Geometry.h"
 #include "../Graphics/Geometry.h"
 #include "../IO/Log.h"
 #include "../IO/Log.h"
 #include "../Graphics/Material.h"
 #include "../Graphics/Material.h"

+ 0 - 0
Source/Atomic/Graphics/CustomGeometry.h → Source/Atomic/Atomic3D/CustomGeometry.h


+ 2 - 2
Source/Atomic/Graphics/DecalSet.cpp → Source/Atomic/Atomic3D/DecalSet.cpp

@@ -21,11 +21,11 @@
 //
 //
 
 
 #include "Precompiled.h"
 #include "Precompiled.h"
-#include "../Graphics/AnimatedModel.h"
+#include "../Atomic3D/AnimatedModel.h"
 #include "../Graphics/Batch.h"
 #include "../Graphics/Batch.h"
 #include "../Graphics/Camera.h"
 #include "../Graphics/Camera.h"
 #include "../Core/Context.h"
 #include "../Core/Context.h"
-#include "../Graphics/DecalSet.h"
+#include "../Atomic3D/DecalSet.h"
 #include "../Graphics/Geometry.h"
 #include "../Graphics/Geometry.h"
 #include "../Graphics/Graphics.h"
 #include "../Graphics/Graphics.h"
 #include "../Graphics/IndexBuffer.h"
 #include "../Graphics/IndexBuffer.h"

+ 1 - 1
Source/Atomic/Graphics/DecalSet.h → Source/Atomic/Atomic3D/DecalSet.h

@@ -25,7 +25,7 @@
 #include "../Graphics/Drawable.h"
 #include "../Graphics/Drawable.h"
 #include "../Math/Frustum.h"
 #include "../Math/Frustum.h"
 #include "../Container/List.h"
 #include "../Container/List.h"
-#include "../Graphics/Skeleton.h"
+#include "../Atomic3D/Skeleton.h"
 
 
 namespace Atomic
 namespace Atomic
 {
 {

+ 1 - 1
Source/Atomic/Graphics/LMStaticModel.cpp → Source/Atomic/Atomic3D/LMStaticModel.cpp

@@ -6,7 +6,7 @@
 #include "../Core/Context.h"
 #include "../Core/Context.h"
 #include "../Resource/ResourceCache.h"
 #include "../Resource/ResourceCache.h"
 #include "../Graphics/Technique.h"
 #include "../Graphics/Technique.h"
-#include "../Graphics/LMStaticModel.h"
+#include "../Atomic3D/LMStaticModel.h"
 
 
 namespace Atomic
 namespace Atomic
 {
 {

+ 1 - 1
Source/Atomic/Graphics/LMStaticModel.h → Source/Atomic/Atomic3D/LMStaticModel.h

@@ -4,7 +4,7 @@
 
 
 #pragma once
 #pragma once
 
 
-#include "../Graphics/StaticModel.h"
+#include "../Atomic3D/StaticModel.h"
 #include "../Graphics/Texture2D.h"
 #include "../Graphics/Texture2D.h"
 #include "../Graphics/Material.h"
 #include "../Graphics/Material.h"
 
 

+ 1 - 1
Source/Atomic/Graphics/Model.cpp → Source/Atomic/Atomic3D/Model.cpp

@@ -26,7 +26,7 @@
 #include "../Graphics/Geometry.h"
 #include "../Graphics/Geometry.h"
 #include "../Graphics/IndexBuffer.h"
 #include "../Graphics/IndexBuffer.h"
 #include "../IO/Log.h"
 #include "../IO/Log.h"
-#include "../Graphics/Model.h"
+#include "../Atomic3D/Model.h"
 #include "../Core/Profiler.h"
 #include "../Core/Profiler.h"
 #include "../Graphics/Graphics.h"
 #include "../Graphics/Graphics.h"
 #include "../IO/Serializer.h"
 #include "../IO/Serializer.h"

+ 1 - 1
Source/Atomic/Graphics/Model.h → Source/Atomic/Atomic3D/Model.h

@@ -25,7 +25,7 @@
 #include "../Container/ArrayPtr.h"
 #include "../Container/ArrayPtr.h"
 #include "../Math/BoundingBox.h"
 #include "../Math/BoundingBox.h"
 #include "../Graphics/GraphicsDefs.h"
 #include "../Graphics/GraphicsDefs.h"
-#include "../Graphics/Skeleton.h"
+#include "../Atomic3D/Skeleton.h"
 #include "../Resource/Resource.h"
 #include "../Resource/Resource.h"
 #include "../Container/Ptr.h"
 #include "../Container/Ptr.h"
 
 

+ 1 - 1
Source/Atomic/Graphics/ParticleEffect.cpp → Source/Atomic/Atomic3D/ParticleEffect.cpp

@@ -24,7 +24,7 @@
 #include "../Core/Context.h"
 #include "../Core/Context.h"
 #include "../IO/Log.h"
 #include "../IO/Log.h"
 #include "../Graphics/Material.h"
 #include "../Graphics/Material.h"
-#include "../Graphics/ParticleEffect.h"
+#include "../Atomic3D/ParticleEffect.h"
 #include "../Resource/ResourceCache.h"
 #include "../Resource/ResourceCache.h"
 #include "../Resource/XMLFile.h"
 #include "../Resource/XMLFile.h"
 
 

+ 0 - 0
Source/Atomic/Graphics/ParticleEffect.h → Source/Atomic/Atomic3D/ParticleEffect.h


+ 2 - 2
Source/Atomic/Graphics/ParticleEmitter.cpp → Source/Atomic/Atomic3D/ParticleEmitter.cpp

@@ -22,8 +22,8 @@
 
 
 #include "Precompiled.h"
 #include "Precompiled.h"
 #include "../Core/Context.h"
 #include "../Core/Context.h"
-#include "../Graphics/ParticleEffect.h"
-#include "../Graphics/ParticleEmitter.h"
+#include "../Atomic3D/ParticleEffect.h"
+#include "../Atomic3D/ParticleEmitter.h"
 #include "../Core/Profiler.h"
 #include "../Core/Profiler.h"
 #include "../Resource/ResourceCache.h"
 #include "../Resource/ResourceCache.h"
 #include "../Resource/ResourceEvents.h"
 #include "../Resource/ResourceEvents.h"

+ 1 - 1
Source/Atomic/Graphics/ParticleEmitter.h → Source/Atomic/Atomic3D/ParticleEmitter.h

@@ -22,7 +22,7 @@
 
 
 #pragma once
 #pragma once
 
 
-#include "../Graphics/BillboardSet.h"
+#include "../Atomic3D/BillboardSet.h"
 
 
 namespace Atomic
 namespace Atomic
 {
 {

+ 1 - 1
Source/Atomic/Graphics/Skeleton.cpp → Source/Atomic/Atomic3D/Skeleton.cpp

@@ -24,7 +24,7 @@
 #include "../IO/Deserializer.h"
 #include "../IO/Deserializer.h"
 #include "../IO/Log.h"
 #include "../IO/Log.h"
 #include "../IO/Serializer.h"
 #include "../IO/Serializer.h"
-#include "../Graphics/Skeleton.h"
+#include "../Atomic3D/Skeleton.h"
 
 
 #include "../DebugNew.h"
 #include "../DebugNew.h"
 
 

+ 0 - 0
Source/Atomic/Graphics/Skeleton.h → Source/Atomic/Atomic3D/Skeleton.h


+ 1 - 1
Source/Atomic/Graphics/Skybox.cpp → Source/Atomic/Atomic3D/Skybox.cpp

@@ -25,7 +25,7 @@
 #include "../Graphics/Camera.h"
 #include "../Graphics/Camera.h"
 #include "../Core/Context.h"
 #include "../Core/Context.h"
 #include "../Scene/Node.h"
 #include "../Scene/Node.h"
-#include "../Graphics/Skybox.h"
+#include "../Atomic3D/Skybox.h"
 
 
 #include "../DebugNew.h"
 #include "../DebugNew.h"
 
 

+ 1 - 1
Source/Atomic/Graphics/Skybox.h → Source/Atomic/Atomic3D/Skybox.h

@@ -22,7 +22,7 @@
 
 
 #pragma once
 #pragma once
 
 
-#include "../Graphics/StaticModel.h"
+#include "../Atomic3D/StaticModel.h"
 
 
 namespace Atomic
 namespace Atomic
 {
 {

+ 2 - 2
Source/Atomic/Graphics/StaticModel.cpp → Source/Atomic/Atomic3D/StaticModel.cpp

@@ -21,7 +21,7 @@
 //
 //
 
 
 #include "Precompiled.h"
 #include "Precompiled.h"
-#include "../Graphics/AnimatedModel.h"
+#include "../Atomic3D/AnimatedModel.h"
 #include "../Graphics/Batch.h"
 #include "../Graphics/Batch.h"
 #include "../Graphics/Camera.h"
 #include "../Graphics/Camera.h"
 #include "../Core/Context.h"
 #include "../Core/Context.h"
@@ -29,7 +29,7 @@
 #include "../Graphics/Geometry.h"
 #include "../Graphics/Geometry.h"
 #include "../IO/Log.h"
 #include "../IO/Log.h"
 #include "../Graphics/Material.h"
 #include "../Graphics/Material.h"
-#include "../Graphics/Model.h"
+#include "../Atomic3D/Model.h"
 #include "../Graphics/OcclusionBuffer.h"
 #include "../Graphics/OcclusionBuffer.h"
 #include "../Graphics/OctreeQuery.h"
 #include "../Graphics/OctreeQuery.h"
 #include "../Core/Profiler.h"
 #include "../Core/Profiler.h"

+ 0 - 0
Source/Atomic/Graphics/StaticModel.h → Source/Atomic/Atomic3D/StaticModel.h


+ 1 - 1
Source/Atomic/Graphics/StaticModelGroup.cpp → Source/Atomic/Atomic3D/StaticModelGroup.cpp

@@ -29,7 +29,7 @@
 #include "../Graphics/OcclusionBuffer.h"
 #include "../Graphics/OcclusionBuffer.h"
 #include "../Graphics/OctreeQuery.h"
 #include "../Graphics/OctreeQuery.h"
 #include "../Scene/Scene.h"
 #include "../Scene/Scene.h"
-#include "../Graphics/StaticModelGroup.h"
+#include "../Atomic3D/StaticModelGroup.h"
 
 
 #include "../DebugNew.h"
 #include "../DebugNew.h"
 
 

+ 1 - 1
Source/Atomic/Graphics/StaticModelGroup.h → Source/Atomic/Atomic3D/StaticModelGroup.h

@@ -22,7 +22,7 @@
 
 
 #pragma once
 #pragma once
 
 
-#include "../Graphics/StaticModel.h"
+#include "../Atomic3D/StaticModel.h"
 
 
 namespace Atomic
 namespace Atomic
 {
 {

+ 2 - 2
Source/Atomic/Graphics/Terrain.cpp → Source/Atomic/Atomic3D/Terrain.cpp

@@ -33,8 +33,8 @@
 #include "../Resource/ResourceCache.h"
 #include "../Resource/ResourceCache.h"
 #include "../Resource/ResourceEvents.h"
 #include "../Resource/ResourceEvents.h"
 #include "../Scene/Scene.h"
 #include "../Scene/Scene.h"
-#include "../Graphics/Terrain.h"
-#include "../Graphics/TerrainPatch.h"
+#include "../Atomic3D/Terrain.h"
+#include "../Atomic3D/TerrainPatch.h"
 #include "../Graphics/VertexBuffer.h"
 #include "../Graphics/VertexBuffer.h"
 
 
 #include "../DebugNew.h"
 #include "../DebugNew.h"

+ 0 - 0
Source/Atomic/Graphics/Terrain.h → Source/Atomic/Atomic3D/Terrain.h


+ 2 - 2
Source/Atomic/Graphics/TerrainPatch.cpp → Source/Atomic/Atomic3D/TerrainPatch.cpp

@@ -30,8 +30,8 @@
 #include "../Graphics/OcclusionBuffer.h"
 #include "../Graphics/OcclusionBuffer.h"
 #include "../Graphics/OctreeQuery.h"
 #include "../Graphics/OctreeQuery.h"
 #include "../Core/Profiler.h"
 #include "../Core/Profiler.h"
-#include "../Graphics/Terrain.h"
-#include "../Graphics/TerrainPatch.h"
+#include "../Atomic3D/Terrain.h"
+#include "../Atomic3D/TerrainPatch.h"
 #include "../Graphics/VertexBuffer.h"
 #include "../Graphics/VertexBuffer.h"
 
 
 #include "../DebugNew.h"
 #include "../DebugNew.h"

+ 0 - 0
Source/Atomic/Graphics/TerrainPatch.h → Source/Atomic/Atomic3D/TerrainPatch.h


+ 10 - 5
Source/Atomic/CMakeLists.txt

@@ -14,14 +14,19 @@ file (GLOB INPUT_SOURCE Input/*.cpp Input/*.h)
 file (GLOB IO_SOURCE IO/*.cpp IO/*.h)
 file (GLOB IO_SOURCE IO/*.cpp IO/*.h)
 file (GLOB RESOURCE_SOURCE Resource/*.cpp Resource/*.h)
 file (GLOB RESOURCE_SOURCE Resource/*.cpp Resource/*.h)
 file (GLOB AUDIO_SOURCE Audio/*.cpp Audio/*.h)
 file (GLOB AUDIO_SOURCE Audio/*.cpp Audio/*.h)
-file (GLOB PHYSICS_SOURCE Physics/*.cpp Physics/*.h)
-file (GLOB NAVIGATION_SOURCE Navigation/*.cpp Navigation/*.h)
 file (GLOB NETWORK_SOURCE Network/*.cpp Network/*.h)
 file (GLOB NETWORK_SOURCE Network/*.cpp Network/*.h)
-file (GLOB ENVIRONMENT_SOURCE Environment/*.cpp Environment/*.h)
+
 file (GLOB ATOMIC2D_SOURCE Atomic2D/*.cpp Atomic2D/*.h)
 file (GLOB ATOMIC2D_SOURCE Atomic2D/*.cpp Atomic2D/*.h)
 file (GLOB SCENE_SOURCE Scene/*.cpp Scene/*.h)
 file (GLOB SCENE_SOURCE Scene/*.cpp Scene/*.h)
 file (GLOB UI_SOURCE UI/*.cpp UI/*.h)
 file (GLOB UI_SOURCE UI/*.cpp UI/*.h)
 
 
+if (NOT ATOMIC_BUILD_2D)
+  file (GLOB ATOMIC3D_SOURCE Atomic3D/*.cpp Atomic3D/*.h)
+  file (GLOB PHYSICS_SOURCE Physics/*.cpp Physics/*.h)
+  file (GLOB NAVIGATION_SOURCE Navigation/*.cpp Navigation/*.h)
+  file (GLOB ENVIRONMENT_SOURCE Environment/*.cpp Environment/*.h)
+endif()
+
 file (GLOB GRAPHICS_SOURCE Graphics/*.cpp Graphics/*.h)
 file (GLOB GRAPHICS_SOURCE Graphics/*.cpp Graphics/*.h)
 
 
 if (MSVC)
 if (MSVC)
@@ -31,7 +36,6 @@ else()
 # for kNet
 # for kNet
     add_definitions (-DUNIX)
     add_definitions (-DUNIX)
     file (GLOB GRAPHICS_IMPL_SOURCE Graphics/OpenGL/*.cpp Graphics/OpenGL/*.h)
     file (GLOB GRAPHICS_IMPL_SOURCE Graphics/OpenGL/*.cpp Graphics/OpenGL/*.h)
-
 endif()
 endif()
 
 
 if (ANDROID)
 if (ANDROID)
@@ -52,7 +56,8 @@ endif()
 set (SOURCE_FILES ${CONTAINER_SOURCE} ${CORE_SOURCE} ${ENGINE_SOURCE} ${INPUT_SOURCE}
 set (SOURCE_FILES ${CONTAINER_SOURCE} ${CORE_SOURCE} ${ENGINE_SOURCE} ${INPUT_SOURCE}
                   ${AUDIO_SOURCE} ${IO_SOURCE} ${MATH_SOURCE} 
                   ${AUDIO_SOURCE} ${IO_SOURCE} ${MATH_SOURCE} 
                   ${RESOURCE_SOURCE} ${PHYSICS_SOURCE}
                   ${RESOURCE_SOURCE} ${PHYSICS_SOURCE}
-                  ${GRAPHICS_SOURCE} ${GRAPHICS_IMPL_SOURCE}                  
+                  ${GRAPHICS_SOURCE} ${GRAPHICS_IMPL_SOURCE}
+                  ${ATOMIC3D_SOURCE}
                   ${ATOMIC2D_SOURCE} ${ENVIRONMENT_SOURCE}
                   ${ATOMIC2D_SOURCE} ${ENVIRONMENT_SOURCE}
                   ${SCENE_SOURCE} ${UI_SOURCE}
                   ${SCENE_SOURCE} ${UI_SOURCE}
                   ${PLATFORM_SOURCE})
                   ${PLATFORM_SOURCE})

+ 14 - 0
Source/Atomic/Engine/Application.cpp

@@ -43,6 +43,13 @@ namespace Atomic
 #if defined(EMSCRIPTEN)
 #if defined(EMSCRIPTEN)
 #include <emscripten.h>
 #include <emscripten.h>
 #endif
 #endif
+// SDL2 needs a main loop to be running during initialization
+// otherwise EGL will error, so this is the main loop used during init
+// and is canceled once everything is initialized
+void InitializationMainLoop()
+{
+
+}
 void RunFrame(void* data)
 void RunFrame(void* data)
 {
 {
     static_cast<Engine*>(data)->RunFrame();
     static_cast<Engine*>(data)->RunFrame();
@@ -69,6 +76,10 @@ int Application::Run()
     // Thus, the try-catch block below should be optimised out except in Debug build configuration
     // Thus, the try-catch block below should be optimised out except in Debug build configuration
     try
     try
     {
     {
+  #if defined(EMSCRIPTEN)
+        emscripten_set_main_loop(InitializationMainLoop, 0, 0);
+  #endif
+
         Setup();
         Setup();
         if (exitCode_)
         if (exitCode_)
             return exitCode_;
             return exitCode_;
@@ -95,6 +106,9 @@ int Application::Run()
         #if defined(IOS)
         #if defined(IOS)
         SDL_iPhoneSetAnimationCallback(GetSubsystem<Graphics>()->GetImpl()->GetWindow(), 1, &RunFrame, engine_);
         SDL_iPhoneSetAnimationCallback(GetSubsystem<Graphics>()->GetImpl()->GetWindow(), 1, &RunFrame, engine_);
         #elif defined(EMSCRIPTEN)
         #elif defined(EMSCRIPTEN)
+        // cancel the initialization loop
+        emscripten_cancel_main_loop();
+        // and run the engine loop
         emscripten_set_main_loop_arg(RunFrame, engine_, 0, 1);
         emscripten_set_main_loop_arg(RunFrame, engine_, 0, 1);
         #endif
         #endif
         #endif
         #endif

+ 1 - 1
Source/Atomic/Engine/Application.h

@@ -50,7 +50,7 @@ public:
     /// Initialize the engine and run the main loop, then return the application exit code. Catch out-of-memory exceptions while running.
     /// Initialize the engine and run the main loop, then return the application exit code. Catch out-of-memory exceptions while running.
     int Run();
     int Run();
     /// Show an error message (last log message if empty), terminate the main loop, and set failure exit code.
     /// Show an error message (last log message if empty), terminate the main loop, and set failure exit code.
-    void ErrorExit(const String& message = String::EMPTY);
+    virtual void ErrorExit(const String& message = String::EMPTY);
 
 
 protected:
 protected:
     /// Handle log message.
     /// Handle log message.

+ 9 - 0
Source/Atomic/Engine/Engine.cpp

@@ -52,6 +52,9 @@
 #ifdef ATOMIC_ATOMIC2D
 #ifdef ATOMIC_ATOMIC2D
 #include "../Atomic2D/Atomic2D.h"
 #include "../Atomic2D/Atomic2D.h"
 #endif
 #endif
+#ifdef ATOMIC_3D
+#include "../Atomic3D/Atomic3D.h"
+#endif
 
 
 #ifdef ATOMIC_TBUI
 #ifdef ATOMIC_TBUI
 #include "../UI/TBUI.h"
 #include "../UI/TBUI.h"
@@ -166,12 +169,18 @@ bool Engine::Initialize(const VariantMap& parameters)
     if (!headless_)
     if (!headless_)
     {
     {
         context_->RegisterSubsystem(new Graphics(context_));
         context_->RegisterSubsystem(new Graphics(context_));
+#ifdef ATOMIC_3D
+        RegisterAtomic3DLibrary(context_);
+#endif
         context_->RegisterSubsystem(new Renderer(context_));
         context_->RegisterSubsystem(new Renderer(context_));
     }
     }
     else
     else
     {
     {
         // Register graphics library objects explicitly in headless mode to allow them to work without using actual GPU resources
         // Register graphics library objects explicitly in headless mode to allow them to work without using actual GPU resources
         RegisterGraphicsLibrary(context_);
         RegisterGraphicsLibrary(context_);
+#ifdef ATOMIC_3D
+        RegisterAtomic3DLibrary(context_);
+#endif
     }
     }
 
 
 #ifdef ATOMIC_ATOMIC2D
 #ifdef ATOMIC_ATOMIC2D

+ 1 - 1
Source/Atomic/Environment/Environment.cpp

@@ -10,7 +10,7 @@
 namespace Atomic
 namespace Atomic
 {
 {
 
 
-void RegisterEnvironmenttLibrary(Context* context)
+void RegisterEnvironmentLibrary(Context* context)
 {
 {
     ProcSky::RegisterObject(context);
     ProcSky::RegisterObject(context);
     TimeOfDay::RegisterObject(context);
     TimeOfDay::RegisterObject(context);

+ 1 - 1
Source/Atomic/Environment/Environment.h

@@ -9,6 +9,6 @@
 namespace Atomic
 namespace Atomic
 {
 {
 
 
-void RegisterEnvironmenttLibrary(Context* context);
+void RegisterEnvironmentLibrary(Context* context);
 
 
 }
 }

+ 8 - 1
Source/Atomic/Graphics/DebugRenderer.cpp

@@ -22,7 +22,6 @@
 
 
 #include "Precompiled.h"
 #include "Precompiled.h"
 
 
-#include "../Graphics/AnimatedModel.h"
 #include "../Graphics/Camera.h"
 #include "../Graphics/Camera.h"
 #include "../Core/Context.h"
 #include "../Core/Context.h"
 #include "../Core/CoreEvents.h"
 #include "../Core/CoreEvents.h"
@@ -37,6 +36,11 @@
 
 
 #include "../DebugNew.h"
 #include "../DebugNew.h"
 
 
+#include "../Scene/Node.h"
+#ifdef ATOMIC_3D
+#include "../Atomic3D/AnimatedModel.h"
+#endif
+
 namespace Atomic
 namespace Atomic
 {
 {
 
 
@@ -242,6 +246,7 @@ void DebugRenderer::AddSphere(const Sphere& sphere, const Color& color, bool dep
     }
     }
 }
 }
 
 
+#ifdef ATOMIC_3D
 void DebugRenderer::AddSkeleton(const Skeleton& skeleton, const Color& color, bool depthTest)
 void DebugRenderer::AddSkeleton(const Skeleton& skeleton, const Color& color, bool depthTest)
 {
 {
     const Vector<Bone>& bones = skeleton.GetBones();
     const Vector<Bone>& bones = skeleton.GetBones();
@@ -276,6 +281,8 @@ void DebugRenderer::AddSkeleton(const Skeleton& skeleton, const Color& color, bo
     }
     }
 }
 }
 
 
+#endif
+
 void DebugRenderer::AddTriangleMesh(const void* vertexData, unsigned vertexSize, const void* indexData, unsigned indexSize,
 void DebugRenderer::AddTriangleMesh(const void* vertexData, unsigned vertexSize, const void* indexData, unsigned indexSize,
     unsigned indexStart, unsigned indexCount, const Matrix3x4& transform, const Color& color, bool depthTest)
     unsigned indexStart, unsigned indexCount, const Matrix3x4& transform, const Color& color, bool depthTest)
 {
 {

+ 0 - 25
Source/Atomic/Graphics/Direct3D9/D3D9Graphics.cpp

@@ -21,14 +21,9 @@
 //
 //
 
 
 #include "Precompiled.h"
 #include "Precompiled.h"
-#include "../../Graphics/AnimatedModel.h"
-#include "../../Graphics/Animation.h"
-#include "../../Graphics/AnimationController.h"
 #include "../../Graphics/Camera.h"
 #include "../../Graphics/Camera.h"
 #include "../../Core/Context.h"
 #include "../../Core/Context.h"
-#include "../../Graphics/CustomGeometry.h"
 #include "../../Graphics/DebugRenderer.h"
 #include "../../Graphics/DebugRenderer.h"
-#include "../../Graphics/DecalSet.h"
 #include "../../IO/File.h"
 #include "../../IO/File.h"
 #include "../../Graphics/Graphics.h"
 #include "../../Graphics/Graphics.h"
 #include "../../Graphics/GraphicsEvents.h"
 #include "../../Graphics/GraphicsEvents.h"
@@ -37,19 +32,13 @@
 #include "../../IO/Log.h"
 #include "../../IO/Log.h"
 #include "../../Graphics/Material.h"
 #include "../../Graphics/Material.h"
 #include "../../Graphics/Octree.h"
 #include "../../Graphics/Octree.h"
-#include "../../Graphics/ParticleEffect.h"
-#include "../../Graphics/ParticleEmitter.h"
 #include "../../Core/ProcessUtils.h"
 #include "../../Core/ProcessUtils.h"
 #include "../../Core/Profiler.h"
 #include "../../Core/Profiler.h"
 #include "../../Resource/ResourceCache.h"
 #include "../../Resource/ResourceCache.h"
 #include "../../Graphics/Shader.h"
 #include "../../Graphics/Shader.h"
 #include "../../Graphics/ShaderPrecache.h"
 #include "../../Graphics/ShaderPrecache.h"
 #include "../../Graphics/ShaderVariation.h"
 #include "../../Graphics/ShaderVariation.h"
-#include "../../Graphics/Skybox.h"
-#include "../../Graphics/StaticModelGroup.h"
 #include "../../Graphics/Technique.h"
 #include "../../Graphics/Technique.h"
-#include "../../Graphics/Terrain.h"
-#include "../../Graphics/TerrainPatch.h"
 #include "../../Graphics/Texture2D.h"
 #include "../../Graphics/Texture2D.h"
 #include "../../Graphics/Texture3D.h"
 #include "../../Graphics/Texture3D.h"
 #include "../../Graphics/TextureCube.h"
 #include "../../Graphics/TextureCube.h"
@@ -2876,9 +2865,7 @@ void Graphics::SetTextureUnitMappings()
 
 
 void RegisterGraphicsLibrary(Context* context)
 void RegisterGraphicsLibrary(Context* context)
 {
 {
-    Animation::RegisterObject(context);
     Material::RegisterObject(context);
     Material::RegisterObject(context);
-    Model::RegisterObject(context);
     Shader::RegisterObject(context);
     Shader::RegisterObject(context);
     Technique::RegisterObject(context);
     Technique::RegisterObject(context);
     Texture2D::RegisterObject(context);
     Texture2D::RegisterObject(context);
@@ -2887,18 +2874,6 @@ void RegisterGraphicsLibrary(Context* context)
     Camera::RegisterObject(context);
     Camera::RegisterObject(context);
     Drawable::RegisterObject(context);
     Drawable::RegisterObject(context);
     Light::RegisterObject(context);
     Light::RegisterObject(context);
-    StaticModel::RegisterObject(context);
-    StaticModelGroup::RegisterObject(context);
-    Skybox::RegisterObject(context);
-    AnimatedModel::RegisterObject(context);
-    AnimationController::RegisterObject(context);
-    BillboardSet::RegisterObject(context);
-    ParticleEffect::RegisterObject(context);
-    ParticleEmitter::RegisterObject(context);
-    CustomGeometry::RegisterObject(context);
-    DecalSet::RegisterObject(context);
-    Terrain::RegisterObject(context);
-    TerrainPatch::RegisterObject(context);
     DebugRenderer::RegisterObject(context);
     DebugRenderer::RegisterObject(context);
     Octree::RegisterObject(context);
     Octree::RegisterObject(context);
     Zone::RegisterObject(context);
     Zone::RegisterObject(context);

+ 0 - 26
Source/Atomic/Graphics/OpenGL/OGLGraphics.cpp

@@ -20,15 +20,9 @@
 // THE SOFTWARE.
 // THE SOFTWARE.
 //
 //
 
 
-#include "../../Graphics/AnimatedModel.h"
-#include "../../Graphics/Animation.h"
-#include "../../Graphics/AnimationController.h"
-#include "../../Graphics/BillboardSet.h"
 #include "../../Graphics/Camera.h"
 #include "../../Graphics/Camera.h"
 #include "../../Core/Context.h"
 #include "../../Core/Context.h"
-#include "../../Graphics/CustomGeometry.h"
 #include "../../Graphics/DebugRenderer.h"
 #include "../../Graphics/DebugRenderer.h"
-#include "../../Graphics/DecalSet.h"
 #include "../../IO/File.h"
 #include "../../IO/File.h"
 #include "../../Graphics/Graphics.h"
 #include "../../Graphics/Graphics.h"
 #include "../../Graphics/GraphicsEvents.h"
 #include "../../Graphics/GraphicsEvents.h"
@@ -38,8 +32,6 @@
 #include "../../Graphics/Material.h"
 #include "../../Graphics/Material.h"
 #include "../../Core/Mutex.h"
 #include "../../Core/Mutex.h"
 #include "../../Graphics/Octree.h"
 #include "../../Graphics/Octree.h"
-#include "../../Graphics/ParticleEffect.h"
-#include "../../Graphics/ParticleEmitter.h"
 #include "../../Core/ProcessUtils.h"
 #include "../../Core/ProcessUtils.h"
 #include "../../Core/Profiler.h"
 #include "../../Core/Profiler.h"
 #include "../../Graphics/RenderSurface.h"
 #include "../../Graphics/RenderSurface.h"
@@ -48,11 +40,7 @@
 #include "../../Graphics/ShaderPrecache.h"
 #include "../../Graphics/ShaderPrecache.h"
 #include "../../Graphics/ShaderProgram.h"
 #include "../../Graphics/ShaderProgram.h"
 #include "../../Graphics/ShaderVariation.h"
 #include "../../Graphics/ShaderVariation.h"
-#include "../../Graphics/Skybox.h"
-#include "../../Graphics/StaticModelGroup.h"
 #include "../../Graphics/Technique.h"
 #include "../../Graphics/Technique.h"
-#include "../../Graphics/Terrain.h"
-#include "../../Graphics/TerrainPatch.h"
 #include "../../Graphics/Texture2D.h"
 #include "../../Graphics/Texture2D.h"
 #include "../../Graphics/Texture3D.h"
 #include "../../Graphics/Texture3D.h"
 #include "../../Graphics/TextureCube.h"
 #include "../../Graphics/TextureCube.h"
@@ -3086,9 +3074,7 @@ void Graphics::SetTextureUnitMappings()
 
 
 void RegisterGraphicsLibrary(Context* context)
 void RegisterGraphicsLibrary(Context* context)
 {
 {
-    Animation::RegisterObject(context);
     Material::RegisterObject(context);
     Material::RegisterObject(context);
-    Model::RegisterObject(context);
     Shader::RegisterObject(context);
     Shader::RegisterObject(context);
     Technique::RegisterObject(context);
     Technique::RegisterObject(context);
     Texture2D::RegisterObject(context);
     Texture2D::RegisterObject(context);
@@ -3097,18 +3083,6 @@ void RegisterGraphicsLibrary(Context* context)
     Camera::RegisterObject(context);
     Camera::RegisterObject(context);
     Drawable::RegisterObject(context);
     Drawable::RegisterObject(context);
     Light::RegisterObject(context);
     Light::RegisterObject(context);
-    StaticModel::RegisterObject(context);
-    StaticModelGroup::RegisterObject(context);
-    Skybox::RegisterObject(context);
-    AnimatedModel::RegisterObject(context);
-    AnimationController::RegisterObject(context);
-    BillboardSet::RegisterObject(context);
-    ParticleEffect::RegisterObject(context);
-    ParticleEmitter::RegisterObject(context);
-    CustomGeometry::RegisterObject(context);
-    DecalSet::RegisterObject(context);
-    Terrain::RegisterObject(context);
-    TerrainPatch::RegisterObject(context);
     DebugRenderer::RegisterObject(context);
     DebugRenderer::RegisterObject(context);
     Octree::RegisterObject(context);
     Octree::RegisterObject(context);
     Zone::RegisterObject(context);
     Zone::RegisterObject(context);

+ 8 - 2
Source/Atomic/Graphics/View.cpp

@@ -37,7 +37,9 @@
 #include "../Core/Profiler.h"
 #include "../Core/Profiler.h"
 #include "../Scene/Scene.h"
 #include "../Scene/Scene.h"
 #include "../Graphics/ShaderVariation.h"
 #include "../Graphics/ShaderVariation.h"
-#include "../Graphics/Skybox.h"
+#ifdef ATOMIC_3D
+#include "../Atomic3D/Skybox.h"
+#endif
 #include "../Graphics/Technique.h"
 #include "../Graphics/Technique.h"
 #include "../Graphics/Texture2D.h"
 #include "../Graphics/Texture2D.h"
 #include "../Graphics/Texture3D.h"
 #include "../Graphics/Texture3D.h"
@@ -218,7 +220,9 @@ void CheckVisibilityWork(const WorkItem* item, unsigned threadIndex)
                 drawable->ClearLights();
                 drawable->ClearLights();
                 
                 
                 // Expand the scene bounding box and Z range (skybox not included because of infinite size) and store the drawawble
                 // Expand the scene bounding box and Z range (skybox not included because of infinite size) and store the drawawble
+#ifdef ATOMIC_3D
                 if (drawable->GetType() != Skybox::GetTypeStatic())
                 if (drawable->GetType() != Skybox::GetTypeStatic())
+#endif
                 {
                 {
                     result.minZ_ = Min(result.minZ_, minZ);
                     result.minZ_ = Min(result.minZ_, minZ);
                     result.maxZ_ = Max(result.maxZ_, maxZ);
                     result.maxZ_ = Max(result.maxZ_, maxZ);
@@ -2534,9 +2538,11 @@ void View::SetupDirLightShadowCamera(Camera* shadowCamera, Light* light, float n
         {
         {
             Drawable* drawable = geometries_[i];
             Drawable* drawable = geometries_[i];
             
             
-            // Skip skyboxes as they have undefinedly large bounding box size
+#ifdef ATOMIC_3D
+            // Skip skyboxes as they have undefinedly large bounding box size            
             if (drawable->GetType() == Skybox::GetTypeStatic())
             if (drawable->GetType() == Skybox::GetTypeStatic())
                 continue;
                 continue;
+#endif
             
             
             if (drawable->GetMinZ() <= farSplit && drawable->GetMaxZ() >= nearSplit &&
             if (drawable->GetMinZ() <= farSplit && drawable->GetMaxZ() >= nearSplit &&
                 (GetLightMask(drawable) & light->GetLightMask()))
                 (GetLightMask(drawable) & light->GetLightMask()))

+ 3 - 3
Source/Atomic/Navigation/NavigationMesh.cpp

@@ -30,14 +30,14 @@
 #include "../Graphics/Geometry.h"
 #include "../Graphics/Geometry.h"
 #include "../IO/Log.h"
 #include "../IO/Log.h"
 #include "../IO/MemoryBuffer.h"
 #include "../IO/MemoryBuffer.h"
-#include "../Graphics/Model.h"
+#include "../Atomic3D/Model.h"
 #include "../Navigation/Navigable.h"
 #include "../Navigation/Navigable.h"
 #include "../Navigation/NavigationMesh.h"
 #include "../Navigation/NavigationMesh.h"
 #include "../Navigation/OffMeshConnection.h"
 #include "../Navigation/OffMeshConnection.h"
 #include "../Core/Profiler.h"
 #include "../Core/Profiler.h"
 #include "../Scene/Scene.h"
 #include "../Scene/Scene.h"
-#include "../Graphics/StaticModel.h"
-#include "../Graphics/TerrainPatch.h"
+#include "../Atomic3D/StaticModel.h"
+#include "../Atomic3D/TerrainPatch.h"
 #include "../IO/VectorBuffer.h"
 #include "../IO/VectorBuffer.h"
 
 
 #include <cfloat>
 #include <cfloat>

+ 3 - 3
Source/Atomic/Physics/CollisionShape.cpp

@@ -23,13 +23,13 @@
 #include "Precompiled.h"
 #include "Precompiled.h"
 #include "../Physics/CollisionShape.h"
 #include "../Physics/CollisionShape.h"
 #include "../Core/Context.h"
 #include "../Core/Context.h"
-#include "../Graphics/CustomGeometry.h"
+#include "../Atomic3D/CustomGeometry.h"
 #include "../Graphics/DebugRenderer.h"
 #include "../Graphics/DebugRenderer.h"
 #include "../Graphics/DrawableEvents.h"
 #include "../Graphics/DrawableEvents.h"
 #include "../Graphics/Geometry.h"
 #include "../Graphics/Geometry.h"
 #include "../Graphics/IndexBuffer.h"
 #include "../Graphics/IndexBuffer.h"
 #include "../IO/Log.h"
 #include "../IO/Log.h"
-#include "../Graphics/Model.h"
+#include "../Atomic3D/Model.h"
 #include "../Physics/PhysicsUtils.h"
 #include "../Physics/PhysicsUtils.h"
 #include "../Physics/PhysicsWorld.h"
 #include "../Physics/PhysicsWorld.h"
 #include "../Core/Profiler.h"
 #include "../Core/Profiler.h"
@@ -37,7 +37,7 @@
 #include "../Resource/ResourceEvents.h"
 #include "../Resource/ResourceEvents.h"
 #include "../Physics/RigidBody.h"
 #include "../Physics/RigidBody.h"
 #include "../Scene/Scene.h"
 #include "../Scene/Scene.h"
-#include "../Graphics/Terrain.h"
+#include "../Atomic3D/Terrain.h"
 #include "../Graphics/VertexBuffer.h"
 #include "../Graphics/VertexBuffer.h"
 
 
 #include <Bullet/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h>
 #include <Bullet/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h>

+ 1 - 1
Source/Atomic/Physics/PhysicsWorld.cpp

@@ -26,7 +26,7 @@
 #include "../Core/Context.h"
 #include "../Core/Context.h"
 #include "../Graphics/DebugRenderer.h"
 #include "../Graphics/DebugRenderer.h"
 #include "../IO/Log.h"
 #include "../IO/Log.h"
-#include "../Graphics/Model.h"
+#include "../Atomic3D/Model.h"
 #include "../Core/Mutex.h"
 #include "../Core/Mutex.h"
 #include "../Physics/PhysicsEvents.h"
 #include "../Physics/PhysicsEvents.h"
 #include "../Physics/PhysicsUtils.h"
 #include "../Physics/PhysicsUtils.h"

+ 4 - 0
Source/Atomic/UI/Text3D.cpp

@@ -20,6 +20,8 @@
 // THE SOFTWARE.
 // THE SOFTWARE.
 //
 //
 
 
+#ifdef ATOMIC_3D
+
 #include "Precompiled.h"
 #include "Precompiled.h"
 #include "../Graphics/Camera.h"
 #include "../Graphics/Camera.h"
 #include "../Core/Context.h"
 #include "../Core/Context.h"
@@ -584,3 +586,5 @@ void Text3D::UpdateTextMaterials(bool forceUpdate)
 }
 }
 
 
 }
 }
+
+#endif

+ 5 - 0
Source/Atomic/UI/Text3D.h

@@ -22,6 +22,9 @@
 
 
 #pragma once
 #pragma once
 
 
+
+#ifdef ATOMIC_3D
+
 #include "../Graphics/Drawable.h"
 #include "../Graphics/Drawable.h"
 #include "../Math/Matrix3x4.h"
 #include "../Math/Matrix3x4.h"
 #include "../UI/Text.h"
 #include "../UI/Text.h"
@@ -187,3 +190,5 @@ private:
 
 
 }
 }
 
 
+#endif
+

+ 2 - 0
Source/Atomic/UI/UI.cpp

@@ -1767,7 +1767,9 @@ void RegisterUILibrary(Context* context)
     CheckBox::RegisterObject(context);
     CheckBox::RegisterObject(context);
     Cursor::RegisterObject(context);
     Cursor::RegisterObject(context);
     Text::RegisterObject(context);
     Text::RegisterObject(context);
+#ifdef ATOMIC_3D
     Text3D::RegisterObject(context);
     Text3D::RegisterObject(context);
+#endif
     Window::RegisterObject(context);
     Window::RegisterObject(context);
     View3D::RegisterObject(context);
     View3D::RegisterObject(context);
     LineEdit::RegisterObject(context);
     LineEdit::RegisterObject(context);

+ 8 - 12
Source/AtomicEditor/CMakeLists.txt

@@ -1,37 +1,33 @@
 include_directories (${CMAKE_SOURCE_DIR}/Source/ThirdParty/rapidjson/include
 include_directories (${CMAKE_SOURCE_DIR}/Source/ThirdParty/rapidjson/include
                      ${CMAKE_SOURCE_DIR}/Source/ThirdParty
                      ${CMAKE_SOURCE_DIR}/Source/ThirdParty
-                     ${CMAKE_CURRENT_SOURCE_DIR}/Vendor/nativefiledialog
-                     ${CMAKE_CURRENT_SOURCE_DIR}/Vendor/Poco/Foundation/include)
+                     ${CMAKE_SOURCE_DIR}/Source/ThirdParty/Poco/Foundation/include
+                     ${CMAKE_SOURCE_DIR}/Source/ThirdParty/nativefiledialog)
+
 
 
 file (GLOB_RECURSE SOURCE_FILES Source/*.cpp Source/*.h)
 file (GLOB_RECURSE SOURCE_FILES Source/*.cpp Source/*.h)
 
 
 add_definitions(-DPOCO_NO_AUTOMATIC_LIBS)
 add_definitions(-DPOCO_NO_AUTOMATIC_LIBS)
 
 
-set (SOURCE_FILES ${SOURCE_FILES} Vendor/nativefiledialog/nfd_common.c)
-
 if (APPLE)
 if (APPLE)
     set (EXE_TYPE MACOSX_BUNDLE)
     set (EXE_TYPE MACOSX_BUNDLE)
-    set (SOURCE_FILES ${SOURCE_FILES} Source/Build/BuildIOSUtils.mm Vendor/nativefiledialog/nfd_cocoa.mm Vendor/nativefiledialog/nfd.h)
+    set (SOURCE_FILES ${SOURCE_FILES} Source/Build/BuildIOSUtils.mm)
 
 
     #ICNS
     #ICNS
     set(MACOSX_BUNDLE_ICON_FILE Atomic.icns)
     set(MACOSX_BUNDLE_ICON_FILE Atomic.icns)
     set(ATOMIC_EDITOR_ICON ${CMAKE_SOURCE_DIR}/CMake/Modules/Atomic.icns)
     set(ATOMIC_EDITOR_ICON ${CMAKE_SOURCE_DIR}/CMake/Modules/Atomic.icns)
-    set_source_files_properties(${ATOMIC_EDITOR_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")    
+    set_source_files_properties(${ATOMIC_EDITOR_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
 else()
 else()
-    include_directories (${CMAKE_CURRENT_SOURCE_DIR}/Vendor/libcurl/include)
+    include_directories (${CMAKE_SOURCE_DIR}/Source/ThirdParty/libcurl/include)
     add_definitions(-DCURL_STATICLIB)
     add_definitions(-DCURL_STATICLIB)
     set (EXE_TYPE WIN32)
     set (EXE_TYPE WIN32)
-    set (SOURCE_FILES ${SOURCE_FILES} Vendor/nativefiledialog/nfd_win.cpp Vendor/nativefiledialog/nfd.h)
     set (SOURCE_FILES ${SOURCE_FILES} ${CMAKE_SOURCE_DIR}/CMake/Modules/Atomic.rc)
     set (SOURCE_FILES ${SOURCE_FILES} ${CMAKE_SOURCE_DIR}/CMake/Modules/Atomic.rc)
 endif(APPLE)
 endif(APPLE)
 
 
-add_subdirectory(Vendor)
-
 add_executable(AtomicEditor ${EXE_TYPE} ${SOURCE_FILES} ${ATOMIC_EDITOR_ICON})
 add_executable(AtomicEditor ${EXE_TYPE} ${SOURCE_FILES} ${ATOMIC_EDITOR_ICON})
 
 
-target_link_libraries(AtomicEditor ${ATOMIC_LINK_LIBRARIES} AtomicJS Poco)
+target_link_libraries(AtomicEditor ${ATOMIC_LINK_LIBRARIES} AtomicJS Poco nativefiledialog)
 
 
-if (APPLE)    
+if (APPLE)
     set (TARGET_PROPERTIES MACOSX_BUNDLE_INFO_PLIST MacOSXBundleInfo.plist.template)
     set (TARGET_PROPERTIES MACOSX_BUNDLE_INFO_PLIST MacOSXBundleInfo.plist.template)
     target_link_libraries(AtomicEditor curl)
     target_link_libraries(AtomicEditor curl)
 else()
 else()

+ 36 - 2
Source/AtomicEditor/Source/AEApplication.cpp

@@ -58,7 +58,7 @@ AEApplication::AEApplication(Context* context) :
 void AEApplication::Start()
 void AEApplication::Start()
 {
 {
     // refactor this
     // refactor this
-    RegisterEnvironmenttLibrary(context_);
+    RegisterEnvironmentLibrary(context_);
 
 
     Engine* engine = GetSubsystem<Engine>();
     Engine* engine = GetSubsystem<Engine>();
     engine->SetAutoExit(false);
     engine->SetAutoExit(false);
@@ -141,12 +141,47 @@ void AEApplication::Start()
         sceneProcess->Process();
         sceneProcess->Process();
         sceneProcess->Write();
         sceneProcess->Write();
     }
     }
+
+    if (cmdLineProjectFile_.Length())
+    {
+        editor->LoadProject(cmdLineProjectFile_);
+    }
 }
 }
 
 
 void AEApplication::Setup()
 void AEApplication::Setup()
 {
 {
     FileSystem* filesystem = GetSubsystem<FileSystem>();
     FileSystem* filesystem = GetSubsystem<FileSystem>();
 
 
+    const Vector<String>& arguments = GetArguments();
+
+    for (unsigned i = 0; i < arguments.Size(); ++i)
+    {
+        if (arguments[i].Length() > 1 && arguments[i][0] == '-')
+        {
+            String argument = arguments[i].Substring(1).ToLower();
+            String value = i + 1 < arguments.Size() ? arguments[i + 1] : String::EMPTY;
+
+            if (argument == "project" && value.Length())
+            {
+                Vector<String> projectFiles;
+                filesystem->ScanDir(projectFiles, value, "*.atomic", SCAN_FILES, false);
+                if (!projectFiles.Size())
+                {
+                    ErrorExit(ToString("No .atomic project file in %s", value.CString()));
+                    return;
+                }
+                else if (projectFiles.Size() > 1)
+                {
+                    ErrorExit(ToString("Multiple .atomic project files found in %s", value.CString()));
+                    return;
+                }
+
+                cmdLineProjectFile_ = value + "/" + projectFiles[0];
+
+            }
+        }
+    }
+
     engineParameters_["WindowTitle"] = "AtomicEditor";
     engineParameters_["WindowTitle"] = "AtomicEditor";
     engineParameters_["WindowResizable"] = true;
     engineParameters_["WindowResizable"] = true;
     engineParameters_["FullScreen"] = false;
     engineParameters_["FullScreen"] = false;
@@ -158,7 +193,6 @@ void AEApplication::Setup()
         engineParameters_["WindowHeight"] = prefs.windowHeight;
         engineParameters_["WindowHeight"] = prefs.windowHeight;
     }
     }
 
 
-
 #ifdef __APPLE__
 #ifdef __APPLE__
     engineParameters_["ResourcePrefixPath"] = "../Resources";
     engineParameters_["ResourcePrefixPath"] = "../Resources";
 #else
 #else

+ 2 - 0
Source/AtomicEditor/Source/AEApplication.h

@@ -28,6 +28,8 @@ public:
     virtual void Stop();
     virtual void Stop();
 
 
 private:
 private:
+
+    String cmdLineProjectFile_;
     
     
 };
 };
 
 

+ 4 - 4
Source/AtomicEditor/Source/Editors/ModelResourceEditor.cpp

@@ -8,10 +8,10 @@
 #include <Atomic/Graphics/Octree.h>
 #include <Atomic/Graphics/Octree.h>
 #include <Atomic/Graphics/Camera.h>
 #include <Atomic/Graphics/Camera.h>
 #include <Atomic/Graphics/Zone.h>
 #include <Atomic/Graphics/Zone.h>
-#include <Atomic/Graphics/AnimatedModel.h>
-#include <Atomic/Graphics/Animation.h>
-#include <Atomic/Graphics/AnimationState.h>
-#include <Atomic/Graphics/AnimationController.h>
+#include <Atomic/Atomic3D/AnimatedModel.h>
+#include <Atomic/Atomic3D/Animation.h>
+#include <Atomic/Atomic3D/AnimationState.h>
+#include <Atomic/Atomic3D/AnimationController.h>
 #include <Atomic/Graphics/Material.h>
 #include <Atomic/Graphics/Material.h>
 #include <Atomic/Graphics/DebugRenderer.h>
 #include <Atomic/Graphics/DebugRenderer.h>
 
 

+ 1 - 1
Source/AtomicEditor/Source/Editors/SceneEditor3D/Gizmo3D.cpp

@@ -6,7 +6,7 @@
 
 
 #include "AtomicEditor.h"
 #include "AtomicEditor.h"
 
 
-#include <Atomic/Graphics/Model.h>
+#include <Atomic/Atomic3D/Model.h>
 #include <Atomic/Graphics/Material.h>
 #include <Atomic/Graphics/Material.h>
 #include <Atomic/Graphics/Octree.h>
 #include <Atomic/Graphics/Octree.h>
 #include <Atomic/Resource/ResourceCache.h>
 #include <Atomic/Resource/ResourceCache.h>

Some files were not shown because too many files changed in this diff