Parcourir la source

Adding AtomicPlayer module

Josh Engebretson il y a 10 ans
Parent
commit
ac6520ffd9
34 fichiers modifiés avec 408 ajouts et 221 suppressions
  1. 3 0
      Script/AtomicEditor/editor/Editor.ts
  2. 10 0
      Script/AtomicEditor/editor/EditorEvents.ts
  3. 1 3
      Script/AtomicEditor/ui/MainFrameMenu.ts
  4. 10 1
      Script/AtomicEditor/ui/ResourceFrame.ts
  5. 2 2
      Script/AtomicEditor/ui/inspector/CreateComponentButton.ts
  6. 0 40
      Script/TypeScript/Atomic.d.ts
  7. 26 0
      Script/TypeScript/AtomicPlayer.d.ts
  8. 5 1
      Source/AtomicEditorWork/Application/AEEditorApp.cpp
  9. 15 1
      Source/AtomicEditorWork/Application/AEPlayerApp.cpp
  10. 1 1
      Source/AtomicEditorWork/CMakeLists.txt
  11. 26 12
      Source/AtomicJS/Javascript/JSAtomic.cpp
  12. 0 92
      Source/AtomicJS/Javascript/JSAtomicGame.cpp
  13. 31 0
      Source/AtomicJS/Javascript/JSAtomicPlayer.cpp
  14. 1 1
      Source/AtomicJS/Javascript/JSAtomicPlayer.h
  15. 29 4
      Source/AtomicJS/Javascript/JSVM.cpp
  16. 0 1
      Source/AtomicJS/Javascript/JSVM.h
  17. 1 1
      Source/AtomicJS/Packages/Atomic/Javascript.json
  18. 7 0
      Source/AtomicJS/Packages/AtomicPlayer/Package.json
  19. 5 0
      Source/AtomicJS/Packages/AtomicPlayer/Player.json
  20. 0 2
      Source/AtomicJS/Packages/Editor/Package.json
  21. 0 0
      Source/AtomicPlayer/Application/AtomicPlayer.cpp
  22. 0 0
      Source/AtomicPlayer/Application/AtomicPlayer.h
  23. 55 0
      Source/AtomicPlayer/Application/CMakeLists.txt
  24. 4 52
      Source/AtomicPlayer/CMakeLists.txt
  25. 68 0
      Source/AtomicPlayer/Player.cpp
  26. 34 0
      Source/AtomicPlayer/Player.h
  27. 39 0
      Source/AtomicPlayerJS/AtomicPlayerJS.cpp
  28. 0 0
      Source/AtomicPlayerJS/AtomicPlayerJS.h
  29. 26 0
      Source/AtomicPlayerJS/CMakeLists.txt
  30. 1 0
      Source/AtomicTool/CMakeLists.txt
  31. 1 0
      Source/CMakeLists.txt
  32. 0 2
      Source/ToolCore/CMakeLists.txt
  33. 4 2
      Source/ToolCore/Command/PlayCmd.cpp
  34. 3 3
      Source/ToolCore/ToolEnvironment.cpp

+ 3 - 0
Script/AtomicEditor/editor/Editor.ts

@@ -17,6 +17,9 @@ class Editor extends Atomic.ScriptObject {
 
         super();
 
+        // limit the framerate to limit CPU usage
+        Atomic.getEngine().maxFps = 60;
+
         Editor.instance = this;
 
         this.editorLicense = new EditorLicense();

+ 10 - 0
Script/AtomicEditor/editor/EditorEvents.ts

@@ -24,6 +24,16 @@ export interface LoadProjectEvent {
 
 }
 
+export const SaveResource = "EditorSaveResource";
+export interface SaveResourceEvent {
+
+  // The full path to the resource to save
+  // empty or undefined for current
+  path: string;
+
+}
+
+
 export const EditResource = "EditorEditResource";
 export interface EditResourceEvent {
 

+ 1 - 3
Script/AtomicEditor/ui/MainFrameMenu.ts

@@ -51,9 +51,7 @@ class MainFrameMenu extends Atomic.ScriptObject {
 
             if (refid == "file save file") {
 
-                //TODO: this is horrible
-                //if (this.resourceframe.currentResourceEditor)
-                //    this.resourceframe.currentResourceEditor.save();
+                this.sendEvent(EditorEvents.SaveResource);
 
                 return true;
 

+ 10 - 1
Script/AtomicEditor/ui/ResourceFrame.ts

@@ -28,6 +28,13 @@ class ResourceFrame extends ScriptWidget {
 
     }
 
+    handleSaveResource(Ev: EditorEvents.SaveResourceEvent) {
+
+        if (this.currentResourceEditor)
+            this.currentResourceEditor.save();
+
+    }
+
     handleEditResource(ev: EditorEvents.EditResourceEvent) {
 
         var path = ev.path;
@@ -51,7 +58,7 @@ class ResourceFrame extends ScriptWidget {
             var sceneEditor3D = new Editor.SceneEditor3D(path, this.tabcontainer);
             editor = sceneEditor3D;
 
-            this.sendEvent("EditorActiveSceneChanged", { scene : sceneEditor3D.scene });
+            this.sendEvent("EditorActiveSceneChanged", { scene: sceneEditor3D.scene });
 
         }
 
@@ -179,9 +186,11 @@ class ResourceFrame extends ScriptWidget {
         this.resourceViewContainer.addChild(this);
 
         this.subscribeToEvent(EditorEvents.EditResource, (data) => this.handleEditResource(data));
+        this.subscribeToEvent(EditorEvents.SaveResource, (data) => this.handleSaveResource(data));
         this.subscribeToEvent(UIEvents.CloseResourceEditor, (data) => this.handleCloseResourceEditor(data));
         this.subscribeToEvent(UIEvents.ResourceEditorChanged, (data) => this.handleResourceEditorChanged(data));
 
+
         this.subscribeToEvent("WidgetEvent", (data) => this.handleWidgetEvent(data));
 
     }

+ 2 - 2
Script/AtomicEditor/ui/inspector/CreateComponentButton.ts

@@ -45,8 +45,8 @@ physicsCreateSource.addItem(new Atomic.UIMenuItem("RigidBody", "RigidBody"));
 
 var sceneCreateSource = new Atomic.UIMenuItemSource();
 
-sceneCreateSource.addItem(new Atomic.UIMenuItem("Camera", "create component"));
-sceneCreateSource.addItem(new Atomic.UIMenuItem("Light", "create component"));
+sceneCreateSource.addItem(new Atomic.UIMenuItem("Camera", "Camera"));
+sceneCreateSource.addItem(new Atomic.UIMenuItem("Light", "Light"));
 sceneCreateSource.addItem(new Atomic.UIMenuItem("Zone", "create component"));
 
 var subsystemCreateSource = new Atomic.UIMenuItemSource();

+ 0 - 40
Script/TypeScript/Atomic.d.ts

@@ -8082,18 +8082,6 @@ declare module Atomic {
 
    }
 
-   export class JSMetrics extends AObject {
-
-      // Construct.
-      constructor(vm: JSVM);
-
-      capture(): void;
-      dump(): void;
-      dumpNodes(): void;
-      dumpJSComponents(): void;
-
-   }
-
    export class ScriptObject extends AObject {
 
       // Construct.
@@ -8102,34 +8090,6 @@ declare module Atomic {
 
    }
 
-   export class JSVM extends AObject {
-
-      metrics: JSMetrics;
-      moduleSearchPaths: string[];
-      lastModuleSearchFile: string;
-      errorString: string;
-
-      // Construct.
-      constructor();
-
-      initJSContext(): void;
-      executeFile(file: File): boolean;
-      executeScript(scriptPath: string): boolean;
-      executeMain(): boolean;
-      executeFunction(functionName: string): boolean;
-      gC(): void;
-      getMetrics(): JSMetrics;
-      dumpJavascriptObjects(): void;
-      removeObject(object: RefCounted): void;
-      setModuleSearchPaths(searchPath: string): void;
-      getModuleSearchPaths(): string[];
-      setLastModuleSearchFile(fileName: string): void;
-      getLastModuleSearchFile(): string;
-      getErrorString(): string;
-      sendJSErrorEvent(filename?: string): void;
-
-   }
-
 
 
 //----------------------------------------------------

+ 26 - 0
Script/TypeScript/AtomicPlayer.d.ts

@@ -0,0 +1,26 @@
+//Atomic TypeScript Definitions
+
+
+/// <reference path="Atomic.d.ts" />
+
+declare module AtomicPlayer {
+
+
+//----------------------------------------------------
+// MODULE: Player
+//----------------------------------------------------
+
+
+   export class Player extends Atomic.AObject {
+
+      // Construct.
+      constructor();
+
+      loadScene(filename: string, camera?: Atomic.Camera): Atomic.Scene;
+      sayHi(): void;
+
+   }
+
+
+
+}

+ 5 - 1
Source/AtomicEditorWork/Application/AEEditorApp.cpp

@@ -146,7 +146,11 @@ void AEEditorApp::Setup()
 
 void AEEditorApp::Stop()
 {
-
+    vm_ = 0;
+    context_->RemoveSubsystem<Javascript>();
+    // make sure JSVM is really down and no outstanding refs
+    // as if not, will hold on engine subsystems, which is bad
+    assert(!JSVM::GetJSVM(0));
 }
 
 void AEEditorApp::HandleExitRequested(StringHash eventType, VariantMap& eventData)

+ 15 - 1
Source/AtomicEditorWork/Application/AEPlayerApp.cpp

@@ -39,6 +39,8 @@
 
 #include <AtomicJS/Javascript/Javascript.h>
 
+#include <AtomicPlayer/Player.h>
+
 #include "AEPlayerApp.h"
 
 #include <Atomic/DebugNew.h>
@@ -49,6 +51,12 @@
 #include <unistd.h>
 #endif
 
+
+namespace AtomicPlayer
+{
+    extern void jsapi_init_atomicplayer(JSVM* vm);
+}
+
 namespace AtomicEditor
 {
 
@@ -219,9 +227,12 @@ void AEPlayerApplication::Start()
 
     vm = javascript->InstantiateVM("MainVM");
     vm->InitJSContext();
-
     vm->SetModuleSearchPaths("Modules");
 
+    // Instantiate and register the Player subsystem
+    context_->RegisterSubsystem(new AtomicPlayer::Player(context_));
+    AtomicPlayer::jsapi_init_atomicplayer(vm);
+
     if (!vm->ExecuteMain())
     {
         ErrorExit("Error executing Scripts/main.js");
@@ -233,6 +244,9 @@ void AEPlayerApplication::Start()
 void AEPlayerApplication::Stop()
 {
     context_->RemoveSubsystem<Javascript>();
+    // make sure JSVM is really down and no outstanding refs
+    // as if not, will hold on engine subsystems, which is bad
+    assert(!JSVM::GetJSVM(0));
 }
 
 void AEPlayerApplication::HandleScriptReloadStarted(StringHash eventType, VariantMap& eventData)

+ 1 - 1
Source/AtomicEditorWork/CMakeLists.txt

@@ -49,7 +49,7 @@ endif(APPLE)
 
 add_executable(AtomicEditorWork ${EXE_TYPE} ${SOURCE_FILES} ${ATOMIC_EDITOR_ICON})
 
-target_link_libraries(AtomicEditorWork ToolCore AtomicJS ToolCoreJS Poco nativefiledialog ${ATOMIC_LINK_LIBRARIES})
+target_link_libraries(AtomicEditorWork ToolCore AtomicJS AtomicPlayerJS ToolCoreJS Poco nativefiledialog ${ATOMIC_LINK_LIBRARIES})
 
 if (APPLE)
     set (TARGET_PROPERTIES MACOSX_BUNDLE_INFO_PLIST MacOSXBundleInfo.plist.template)

+ 26 - 12
Source/AtomicJS/Javascript/JSAtomic.cpp

@@ -29,7 +29,7 @@
 #include "JSNetwork.h"
 #endif
 
-#include "JSAtomicGame.h"
+#include "JSAtomicPlayer.h"
 #include "JSAtomic.h"
 
 #include <Atomic/Scene/Scene.h>
@@ -102,14 +102,6 @@ static int js_assert(duk_context* ctx)
     return 0;
 }
 
-static int js_atomic_GetVM(duk_context* ctx)
-{
-    JSVM* vm = JSVM::GetJSVM(ctx);
-    js_push_class_object_instance(ctx, vm);
-    return 1;
-}
-
-
 static int js_atomic_GetEngine(duk_context* ctx)
 {
     JSVM* vm = JSVM::GetJSVM(ctx);
@@ -269,7 +261,7 @@ void jsapi_init_atomic(JSVM* vm)
     jsapi_init_ui(vm);
     jsapi_init_scene(vm);
 
-    jsapi_init_atomicgame(vm);
+    jsapi_init_atomicplayer(vm);
 
     duk_context* ctx = vm->GetJSContext();
 
@@ -317,32 +309,54 @@ void jsapi_init_atomic(JSVM* vm)
     duk_push_c_function(ctx, js_openConsoleWindow, 0);
     duk_put_prop_string(ctx, -2, "openConsoleWindow");
 
-    duk_push_c_function(ctx, js_atomic_GetVM, 0);
-    duk_put_prop_string(ctx, -2, "getVM");
+    // subsystems
 
     duk_push_c_function(ctx, js_atomic_GetEngine, 0);
     duk_put_prop_string(ctx, -2, "getEngine");
 
+    js_push_class_object_instance(ctx, vm->GetSubsystem<Engine>(), "Engine");
+    duk_put_prop_string(ctx, -2, "engine");
+
     duk_push_c_function(ctx, js_atomic_GetGraphics, 0);
     duk_put_prop_string(ctx, -2, "getGraphics");
 
+    js_push_class_object_instance(ctx, vm->GetSubsystem<Graphics>(), "Graphics");
+    duk_put_prop_string(ctx, -2, "graphics");
+
     duk_push_c_function(ctx, js_atomic_GetRenderer, 0);
     duk_put_prop_string(ctx, -2, "getRenderer");
 
+    js_push_class_object_instance(ctx, vm->GetSubsystem<Renderer>(), "Renderer");
+    duk_put_prop_string(ctx, -2, "renderer");
+
     duk_push_c_function(ctx, js_atomic_GetResourceCache, 0);
     duk_put_prop_string(ctx, -2, "getResourceCache");
 
+    js_push_class_object_instance(ctx, vm->GetSubsystem<ResourceCache>(), "ResourceCache");
+    duk_put_prop_string(ctx, -2, "cache");
+
     duk_push_c_function(ctx, js_atomic_GetInput, 0);
     duk_put_prop_string(ctx, -2, "getInput");
 
+    js_push_class_object_instance(ctx, vm->GetSubsystem<Input>(), "Input");
+    duk_put_prop_string(ctx, -2, "input");
+
     duk_push_c_function(ctx, js_atomic_GetFileSystem, 0);
     duk_put_prop_string(ctx, -2, "getFileSystem");
 
+    js_push_class_object_instance(ctx, vm->GetSubsystem<FileSystem>(), "FileSystem");
+    duk_put_prop_string(ctx, -2, "fileSystem");
+
 #ifdef ATOMIC_NETWORK
     duk_push_c_function(ctx, js_atomic_GetNetwork, 0);
     duk_put_prop_string(ctx, -2, "getNetwork");
+
+    js_push_class_object_instance(ctx, vm->GetSubsystem<Network>(), "Network");
+    duk_put_prop_string(ctx, -2, "network");
 #endif
 
+    // end filesystems
+
     duk_push_c_function(ctx, js_atomic_script, 1);
     duk_put_prop_string(ctx, -2, "script");
 

+ 0 - 92
Source/AtomicJS/Javascript/JSAtomicGame.cpp

@@ -1,92 +0,0 @@
-// Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
-// Please see LICENSE.md in repository root for license information
-// https://github.com/AtomicGameEngine/AtomicGameEngine
-
-#include <Atomic/IO/FileSystem.h>
-#include <Atomic/IO/Log.h>
-#include <Atomic/Resource/ResourceCache.h>
-#include <Atomic/Input/Input.h>
-#include <Atomic/Graphics/Renderer.h>
-#include <Atomic/Graphics/Graphics.h>
-#include <Atomic/Engine/Engine.h>
-
-#include "JSEvents.h"
-#include "JSVM.h"
-#include "JSGraphics.h"
-#include "JSScene.h"
-#include "JSAtomicGame.h"
-
-#include <Atomic/Scene/Scene.h>
-#include <Atomic/Environment/ProcSky.h>
-
-namespace Atomic
-{
-
-extern void jsb_modules_init(JSVM* vm);
-
-// TODO: add this properly
-static int get_joystick_state(duk_context* ctx)
-{
-    JSVM* vm = JSVM::GetJSVM(ctx);
-    Input* input = vm->GetSubsystem<Input>();
-
-    JoystickState* state =  (JoystickState*) input->GetJoystickByIndex(duk_to_number(ctx, 0));
-
-    duk_push_object(ctx);
-
-    if (state->GetButtonDown(0))
-        duk_push_true(ctx);
-    else
-        duk_push_false(ctx);
-
-    duk_put_prop_string(ctx, -2, "button0");
-
-    if (state->GetButtonDown(1))
-        duk_push_true(ctx);
-    else
-        duk_push_false(ctx);
-
-    duk_put_prop_string(ctx, -2, "button1");
-
-    if (state->GetButtonDown(2))
-        duk_push_true(ctx);
-    else
-        duk_push_false(ctx);
-
-    duk_put_prop_string(ctx, -2, "button2");
-
-    if (state->GetButtonDown(3))
-        duk_push_true(ctx);
-    else
-        duk_push_false(ctx);
-
-    duk_put_prop_string(ctx, -2, "button3");
-
-
-    duk_push_number(ctx, state->GetAxisPosition(0));
-    duk_put_prop_string(ctx, -2, "axis0");
-
-    duk_push_number(ctx, state->GetAxisPosition(1));
-    duk_put_prop_string(ctx, -2, "axis1");
-
-    duk_push_number(ctx, state->GetAxisPosition(2));
-    duk_put_prop_string(ctx, -2, "axis2");
-
-    duk_push_number(ctx, state->GetAxisPosition(3));
-    duk_put_prop_string(ctx, -2, "axis3");
-
-    return 1;
-
-}
-
-void jsapi_init_atomicgame(JSVM* vm)
-{
-    duk_context* ctx = vm->GetJSContext();
-
-    duk_get_global_string(ctx, "Atomic");
-
-    duk_pop(ctx);
-
-}
-
-}

+ 31 - 0
Source/AtomicJS/Javascript/JSAtomicPlayer.cpp

@@ -0,0 +1,31 @@
+
+#include "JSAtomicPlayer.h"
+
+namespace Atomic
+{
+
+
+static int AtomicPlayer_LoadScene(duk_context* ctx) {
+
+
+    duk_push_boolean(ctx, 1);
+
+    return 1;
+}
+
+void jsapi_init_atomicplayer(JSVM* vm)
+{
+    duk_context* ctx = vm->GetJSContext();
+
+    duk_get_global_string(ctx, "Atomic");
+
+    duk_push_object(ctx);
+    duk_dup_top(ctx);
+    duk_put_prop_string(ctx, -3, "Player");
+
+
+    duk_pop(ctx); // pop Atomic object
+
+}
+
+}

+ 1 - 1
Source/AtomicJS/Javascript/JSAtomicGame.h → Source/AtomicJS/Javascript/JSAtomicPlayer.h

@@ -11,6 +11,6 @@ namespace Atomic
 
 class JSVM;
 
-void jsapi_init_atomicgame(JSVM* vm);
+void jsapi_init_atomicplayer(JSVM* vm);
 
 }

+ 29 - 4
Source/AtomicJS/Javascript/JSVM.cpp

@@ -113,7 +113,7 @@ void JSVM::HandleUpdate(StringHash eventType, VariantMap& eventData)
 
     }
 
-    duk_get_global_string(ctx_, "__js_atomicgame_update");
+    duk_get_global_string(ctx_, "__js_atomic_main_update");
 
     if (duk_is_function(ctx_, -1))
     {
@@ -317,14 +317,39 @@ void JSVM::GC()
 
 bool JSVM::ExecuteMain()
 {
-    SharedPtr<File> file (GetSubsystem<ResourceCache>()->GetFile("Scripts/main.js"));
+    if (!GetSubsystem<ResourceCache>()->Exists("Scripts/main.js"))
+        return true;
 
-    if (file.Null())
+
+    duk_get_global_string(ctx_, "require");
+    duk_push_string(ctx_, "Scripts/main");
+
+    if (duk_pcall(ctx_, 1) != 0)
     {
+        SendJSErrorEvent();
         return false;
     }
 
-    return ExecuteFile(file);
+    if (duk_is_object(ctx_, -1))
+    {
+        duk_get_prop_string(ctx_, -1, "update");
+
+        if (duk_is_function(ctx_, -1))
+        {
+            // store function for main loop
+            duk_put_global_string(ctx_, "__js_atomic_main_update");
+        }
+        else
+        {
+            duk_pop(ctx_);
+        }
+
+    }
+
+    // pop main module
+    duk_pop(ctx_);
+
+    return true;
 
 }
 

+ 0 - 1
Source/AtomicJS/Javascript/JSVM.h

@@ -44,7 +44,6 @@ public:
     bool ExecuteScript(const String& scriptPath);
 
     // Resources/Script/main.js
-    // Catches not requiring AtomicGame, etc
     bool ExecuteMain();
 
     bool ExecuteFunction(const String& functionName);

+ 1 - 1
Source/AtomicJS/Packages/Atomic/Javascript.json

@@ -1,7 +1,7 @@
 {
 	"name" : "Javascript",
 	"sources" : ["Source/AtomicJS/Javascript"],
-	"classes" : ["JSVM", "JSComponent", "JSComponentFile", "JSMetrics", "JSEventHelper", "ScriptObject"],
+	"classes" : ["JSComponent", "JSComponentFile", "JSEventHelper", "ScriptObject"],
 	"typescript_decl" : {
 
 		"JSComponent" : [

+ 7 - 0
Source/AtomicJS/Packages/AtomicPlayer/Package.json

@@ -0,0 +1,7 @@
+
+{
+  "name" : "AtomicPlayer",
+  "namespace" : "AtomicPlayer",
+  "dependencies" : ["Source/AtomicJS/Packages/Atomic"],
+  "modules" : ["Player"]
+}

+ 5 - 0
Source/AtomicJS/Packages/AtomicPlayer/Player.json

@@ -0,0 +1,5 @@
+{
+	"name" : "Player",
+	"sources" : ["Source/AtomicPlayer"],
+	"classes" : ["Player"]
+}

+ 0 - 2
Source/AtomicJS/Packages/Editor/Package.json

@@ -1,9 +1,7 @@
 
 {
-
   "name" : "Editor",
   "namespace" : "AtomicEditor",
   "dependencies" : ["Source/AtomicJS/Packages/Atomic"],
   "modules" : ["Editor"]
-
 }

+ 0 - 0
Source/AtomicPlayer/AtomicPlayer.cpp → Source/AtomicPlayer/Application/AtomicPlayer.cpp


+ 0 - 0
Source/AtomicPlayer/AtomicPlayer.h → Source/AtomicPlayer/Application/AtomicPlayer.h


+ 55 - 0
Source/AtomicPlayer/Application/CMakeLists.txt

@@ -0,0 +1,55 @@
+
+include_directories(${CMAKE_SOURCE_DIR}/Source)
+include_directories(${CMAKE_SOURCE_DIR}/Source/ThirdParty)
+
+# Define source files
+file (GLOB SOURCE_FILES *.cpp *.h )
+
+if (MSVC)
+    set (EXE_TYPE WIN32)
+    set (SOURCE_FILES ${SOURCE_FILES} ${CMAKE_SOURCE_DIR}/CMake/Modules/Atomic.rc)
+elseif(APPLE)
+    #ICNS
+    set(MACOSX_BUNDLE_ICON_FILE Atomic.icns)
+if (NOT IOS)
+    set(ATOMIC_EDITOR_ICON ${CMAKE_SOURCE_DIR}/CMake/Modules/Atomic.icns)
+endif()
+    set_source_files_properties(${ATOMIC_EDITOR_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
+    set (EXE_TYPE MACOSX_BUNDLE)
+endif()
+
+if (ANDROID)
+	include_directories(${CMAKE_SOURCE_DIR}/Source/ThirdParty/SDL/include)
+	add_library(AtomicPlayer SHARED ${SOURCE_FILES} ${CMAKE_SOURCE_DIR}/Source/ThirdParty/SDL/src/main/android/SDL_android_main.c)
+else()
+	add_executable(AtomicPlayer ${EXE_TYPE} ${SOURCE_FILES} ${ATOMIC_EDITOR_ICON})
+endif()
+
+target_link_libraries(AtomicPlayer AtomicJS ${ATOMIC_LINK_LIBRARIES})
+
+if (APPLE)
+
+if (NOT IOS)
+
+    set (TARGET_PROPERTIES MACOSX_BUNDLE_INFO_PLIST MacOSXBundleInfo.plist.template)
+
+else()
+
+    set_target_properties(AtomicPlayer PROPERTIES
+      MACOSX_BUNDLE_GUI_IDENTIFIER "com.atomicgameengine.atomicplayer"
+      XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"
+      XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym"
+      XCODE_ATTRIBUTE_INFOPLIST_PREPROCESS YES
+      XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 7.1
+      XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2" # iPhone/iPad
+      XCODE_ATTRIBUTE_COMBINE_HIDPI_IMAGES NO
+    )
+
+	set (TARGET_PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/CMake/Modules/iOSBundleInfo.plist.template)
+
+endif()
+endif(APPLE)
+
+if (TARGET_PROPERTIES)
+    set_target_properties (AtomicPlayer PROPERTIES ${TARGET_PROPERTIES})
+endif ()

+ 4 - 52
Source/AtomicPlayer/CMakeLists.txt

@@ -1,55 +1,7 @@
+include_directories (${CMAKE_SOURCE_DIR}/Source/ThirdParty/rapidjson/include
+                     ${CMAKE_SOURCE_DIR}/Source/ThirdParty )
 
-include_directories(${CMAKE_SOURCE_DIR}/Source)
-include_directories(${CMAKE_SOURCE_DIR}/Source/ThirdParty)
 
-# Define source files
-file (GLOB SOURCE_FILES *.cpp *.h )
+file (GLOB SOURCE_FILES *.cpp *.h)
 
-if (MSVC)
-    set (EXE_TYPE WIN32)
-    set (SOURCE_FILES ${SOURCE_FILES} ${CMAKE_SOURCE_DIR}/CMake/Modules/Atomic.rc)
-elseif(APPLE)
-    #ICNS
-    set(MACOSX_BUNDLE_ICON_FILE Atomic.icns)
-if (NOT IOS)
-    set(ATOMIC_EDITOR_ICON ${CMAKE_SOURCE_DIR}/CMake/Modules/Atomic.icns)
-endif()
-    set_source_files_properties(${ATOMIC_EDITOR_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
-    set (EXE_TYPE MACOSX_BUNDLE)
-endif()
-
-if (ANDROID)
-	include_directories(${CMAKE_SOURCE_DIR}/Source/ThirdParty/SDL/include)
-	add_library(AtomicPlayer SHARED ${SOURCE_FILES} ${CMAKE_SOURCE_DIR}/Source/ThirdParty/SDL/src/main/android/SDL_android_main.c)
-else()
-	add_executable(AtomicPlayer ${EXE_TYPE} ${SOURCE_FILES} ${ATOMIC_EDITOR_ICON})
-endif()
-
-target_link_libraries(AtomicPlayer AtomicJS ${ATOMIC_LINK_LIBRARIES})
-
-if (APPLE)
-
-if (NOT IOS)
-
-    set (TARGET_PROPERTIES MACOSX_BUNDLE_INFO_PLIST MacOSXBundleInfo.plist.template)
-
-else()
-
-    set_target_properties(AtomicPlayer PROPERTIES
-      MACOSX_BUNDLE_GUI_IDENTIFIER "com.atomicgameengine.atomicplayer"
-      XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"
-      XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym"
-      XCODE_ATTRIBUTE_INFOPLIST_PREPROCESS YES
-      XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 7.1
-      XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2" # iPhone/iPad
-      XCODE_ATTRIBUTE_COMBINE_HIDPI_IMAGES NO
-    )
-
-	set (TARGET_PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/CMake/Modules/iOSBundleInfo.plist.template)
-
-endif()
-endif(APPLE)
-
-if (TARGET_PROPERTIES)
-    set_target_properties (AtomicPlayer PROPERTIES ${TARGET_PROPERTIES})
-endif ()
+add_library(AtomicPlayer ${SOURCE_FILES})

+ 68 - 0
Source/AtomicPlayer/Player.cpp

@@ -0,0 +1,68 @@
+
+#include <Atomic/IO/Log.h>
+#include <Atomic/Resource/ResourceCache.h>
+#include <Atomic/Graphics/Renderer.h>
+#include <Atomic/Graphics/Camera.h>
+
+#include "Player.h"
+
+namespace AtomicPlayer
+{
+
+Player::Player(Context* context) :
+    Object(context)
+{
+    viewport_ = new Viewport(context_);
+    GetSubsystem<Renderer>()->SetViewport(0, viewport_);
+}
+
+Player::~Player()
+{
+
+}
+
+Scene* Player::LoadScene(const String& filename, Camera *camera)
+{
+    ResourceCache* cache = GetSubsystem<ResourceCache>();
+    SharedPtr<File> file = cache->GetFile(filename);
+
+    if (!file->IsOpen())
+    {
+        return 0;
+    }
+
+    Scene* scene = new Scene(context_);
+
+    if (!scene->LoadXML(*file))
+    {
+        scene->ReleaseRef();
+        return 0;
+    }
+
+    if(!camera)
+    {
+        PODVector<Node*> cameraNodes;
+        scene->GetChildrenWithComponent(cameraNodes, Camera::GetTypeStatic(), true);
+        if (cameraNodes.Size())
+        {
+            camera = cameraNodes[0]->GetComponent<Camera>();
+        }
+    }
+
+    viewport_->SetScene(scene);
+
+    if (camera)
+        viewport_->SetCamera(camera);
+
+    return scene;
+}
+
+void Player::SayHi()
+{
+
+    LOGINFO("The Player says Hi!");
+
+}
+
+
+}

+ 34 - 0
Source/AtomicPlayer/Player.h

@@ -0,0 +1,34 @@
+
+#pragma once
+
+#include <Atomic/Core/Object.h>
+#include <Atomic/Graphics/Viewport.h>
+#include <Atomic/Scene/Scene.h>
+
+using namespace Atomic;
+
+namespace AtomicPlayer
+{
+
+/// Player subsystem
+class Player : public Object
+{
+    OBJECT(Player);
+
+public:
+    /// Construct.
+    Player(Context* context);
+    /// Destruct.
+    virtual ~Player();
+
+    Scene* LoadScene(const String& filename, Camera* camera = NULL);
+
+    void SayHi();
+
+private:
+
+    SharedPtr<Viewport> viewport_;
+
+};
+
+}

+ 39 - 0
Source/AtomicPlayerJS/AtomicPlayerJS.cpp

@@ -0,0 +1,39 @@
+
+#include <AtomicJS/Javascript/JSVM.h>
+#include <AtomicPlayer/Player.h>
+
+using namespace Atomic;
+using namespace AtomicPlayer;
+
+namespace Atomic
+{
+
+    extern void jsb_package_atomicplayer_init(JSVM* vm);
+
+}
+
+namespace AtomicPlayer
+{
+
+void jsapi_init_atomicplayer(JSVM* vm)
+{
+    duk_context* ctx = vm->GetJSContext();
+
+    // setup the global AtomicPlayer object
+    duk_push_object(ctx);
+    duk_put_global_string(ctx, "AtomicPlayer");
+
+    jsb_package_atomicplayer_init(vm);
+
+    duk_get_global_string(ctx, "Atomic");
+
+    js_push_class_object_instance(ctx, vm->GetSubsystem<Player>(), "Player");
+    duk_put_prop_string(ctx, -2, "player");
+
+    duk_pop(ctx);
+
+}
+
+}
+
+

+ 0 - 0
Source/AtomicPlayerJS/AtomicPlayerJS.h


+ 26 - 0
Source/AtomicPlayerJS/CMakeLists.txt

@@ -0,0 +1,26 @@
+include_directories (${CMAKE_SOURCE_DIR}/Source/ThirdParty)
+
+file (GLOB_RECURSE SOURCE_FILES *.cpp *.h)
+
+# Create the JSBind files ahead of time, so they are picked up with glob
+set (JSFILES JSPackageAtomicPlayer.cpp;JSModulePlayer.cpp)
+
+foreach(JSFILE ${JSFILES})
+
+  set (JSFILEPATH "${CMAKE_SOURCE_DIR}/Build/Source/Generated/${JAVASCRIPT_BINDINGS_PLATFORM}/Javascript/Packages/AtomicPlayer/${JSFILE}")
+
+  if (NOT EXISTS ${JSFILEPATH})
+    file(WRITE "${JSFILEPATH}" "// will be created by JSBind")
+  endif()
+
+endforeach()
+
+file (GLOB JAVASCRIPT_BINDINGS_SOURCE ${CMAKE_SOURCE_DIR}/Build/Source/Generated/${JAVASCRIPT_BINDINGS_PLATFORM}/Javascript/Packages/AtomicPlayer/*.cpp)
+
+set (SOURCE_FILES ${SOURCE_FILES} ${JAVASCRIPT_BINDINGS_SOURCE} )
+
+add_library(AtomicPlayerJS ${SOURCE_FILES})
+
+target_link_libraries(AtomicPlayerJS AtomicPlayer)
+
+add_dependencies(AtomicPlayerJS AtomicTool)

+ 1 - 0
Source/AtomicTool/CMakeLists.txt

@@ -26,6 +26,7 @@ endif()
 
 add_custom_command(TARGET AtomicTool POST_BUILD
                    COMMAND $<TARGET_FILE:AtomicTool> bind "\"${CMAKE_SOURCE_DIR}\"" "Source/AtomicJS/Packages/Atomic/" "${JAVASCRIPT_BINDINGS_PLATFORM}"
+                   COMMAND $<TARGET_FILE:AtomicTool> bind "\"${CMAKE_SOURCE_DIR}\"" "Source/AtomicJS/Packages/AtomicPlayer/" "${JAVASCRIPT_BINDINGS_PLATFORM}"
                    COMMAND $<TARGET_FILE:AtomicTool> bind "\"${CMAKE_SOURCE_DIR}\"" "Source/AtomicJS/Packages/ToolCore/" "${JAVASCRIPT_BINDINGS_PLATFORM}"
                    COMMAND $<TARGET_FILE:AtomicTool> bind "\"${CMAKE_SOURCE_DIR}\"" "Source/AtomicJS/Packages/Editor/" "${JAVASCRIPT_BINDINGS_PLATFORM}"
                    COMMENT "Generating Javascript Bindings")

+ 1 - 0
Source/CMakeLists.txt

@@ -3,6 +3,7 @@ add_subdirectory(ThirdParty)
 add_subdirectory(Atomic)
 add_subdirectory(AtomicJS)
 add_subdirectory(AtomicPlayer)
+add_subdirectory(AtomicPlayerJS)
 
 if (NOT IOS AND NOT ANDROID AND NOT EMSCRIPTEN)
     add_subdirectory(ToolCore)

+ 0 - 2
Source/ToolCore/CMakeLists.txt

@@ -10,8 +10,6 @@ if (MSVC)
     add_definitions(-DCURL_STATICLIB)
 endif()
 
-file (GLOB_RECURSE SOURCE_FILES Source/*.cpp Source/*.h)
-
 file (GLOB_RECURSE SOURCE_FILES *.cpp *.h)
 
 add_library(ToolCore ${SOURCE_FILES})

+ 4 - 2
Source/ToolCore/Command/PlayCmd.cpp

@@ -88,10 +88,12 @@ void PlayCmd::Run()
 
     Vector<String> vargs;
 
-    String args = ToString("--editor-resource-paths \"%s\"", resourcePaths.CString());
+    //String args = ToString("--editor-resource-paths \"%s\"", resourcePaths.CString());
+
+    String args = ToString("--player --project \"%s\"", AddTrailingSlash(project->GetProjectPath()).CString());
 
     vargs = args.Split(' ');
-    vargs.Insert(0, "--player");
+    //vargs.Insert(0, "--player");
 
     // TODO: use IPC (maybe before this set log location/access the log and output it, we need access to errors)
     LaunchPlayerProcess(editorBinary, vargs, "");

+ 3 - 3
Source/ToolCore/ToolEnvironment.cpp

@@ -120,14 +120,14 @@ void ToolEnvironment::SetRootBuildDir(const String& buildDir, bool setBinaryPath
 
 #ifdef _DEBUG
         playerBinary_ = rootBuildDir_ + "Source/AtomicPlayer/Debug/AtomicPlayer.exe";
-        editorBinary_ = rootBuildDir_ + "Source/AtomicEditor/Debug/AtomicEditor.exe";
+        editorBinary_ = rootBuildDir_ + "Source/AtomicEditorWork/Debug/AtomicEditorWork.exe";
 #else
         playerBinary_ = rootBuildDir_ + "Source/AtomicPlayer/Release/AtomicPlayer.exe";
-        editorBinary_ = rootBuildDir_ + "Source/AtomicEditor/Release/AtomicEditor.exe";
+        editorBinary_ = rootBuildDir_ + "Source/AtomicEditorWork/Release/AtomicEditorWork.exe";
 #endif
 #elif ATOMIC_PLATFORM_OSX
         playerBinary_ = rootBuildDir_ + "Source/AtomicPlayer/AtomicPlayer.app/Contents/MacOS/AtomicPlayer";
-        editorBinary_ = rootBuildDir_ + "Source/AtomicEditor/AtomicEditor.app/Contents/MacOS/AtomicEditor";
+        editorBinary_ = rootBuildDir_ + "Source/AtomicEditorWork/AtomicEditorWork.app/Contents/MacOS/AtomicEditorWork";
 #endif
     }