Browse Source

Prepping for external process player

Josh Engebretson 10 years ago
parent
commit
aee119cd94

+ 3 - 1
CMake/Modules/AtomicDesktop.cmake

@@ -1,4 +1,6 @@
 
-add_definitions( -DATOMIC_TBUI -DATOMIC_FILEWATCHER )
+include_directories(${CMAKE_SOURCE_DIR}/Source/ThirdParty/Poco/Foundation/include)
+
+add_definitions( -DATOMIC_TBUI -DATOMIC_FILEWATCHER -DPOCO_NO_AUTOMATIC_LIBS)
 
 set (ATOMIC_LINK_LIBRARIES ${ATOMIC_LINK_LIBRARIES} LibCpuId SQLite TurboBadger)

+ 6 - 8
Data/AtomicPlayer/Resources/CoreData/AtomicModules/AtomicGame.js

@@ -4,11 +4,10 @@ Atomic.editor = null;
 function Game() {
 
 	this.engine = Atomic.getEngine();
-	this.cache = Atomic.getResourceCache();	
+	this.cache = Atomic.getResourceCache();
 	this.renderer = Atomic.getRenderer();
 	this.graphics = Atomic.getGraphics();
 	this.input = Atomic.getInput();
-    this.ui = Atomic.getUI();
 
     this.input.setMouseVisible(true);
 
@@ -69,12 +68,12 @@ Game.prototype.createScene2D = function() {
     var cameraNode = scene.createChild("Camera");
     cameraNode.position = [0.0, 0.0, -10.0];
 
-    var camera = cameraNode.createComponent("Camera");    
+    var camera = cameraNode.createComponent("Camera");
     camera.orthographic = true;
     camera.orthoSize = this.graphics.height * Atomic.PIXEL_SIZE;
 
     var viewport = null;
-    
+
     if (Atomic.editor) {
         viewport = Atomic.editor.setView(scene, camera);
     } else {
@@ -85,7 +84,7 @@ Game.prototype.createScene2D = function() {
     this.scene = scene;
     this.cameraNode = cameraNode;
     this.camera = camera;
-    this.viewport = viewport;    
+    this.viewport = viewport;
 
     return scene;
 
@@ -103,7 +102,7 @@ Game.prototype.createScene3D = function(filename) {
     var cameraNode = scene.createChild("Camera");
     cameraNode.position = [0.0, 0.0, -10.0];
 
-    var camera = cameraNode.createComponent("Camera");    
+    var camera = cameraNode.createComponent("Camera");
 
     var viewport = null;
     if (Atomic.editor) {
@@ -116,7 +115,7 @@ Game.prototype.createScene3D = function(filename) {
     this.scene = scene;
     this.cameraNode = cameraNode;
     this.camera = camera;
-    this.viewport = viewport;    
+    this.viewport = viewport;
 
     return scene;
 
@@ -124,4 +123,3 @@ Game.prototype.createScene3D = function(filename) {
 
 
 Atomic.game = exports.game = new Game();
-

+ 2 - 1
Source/Atomic/CMakeLists.txt

@@ -15,6 +15,7 @@ file (GLOB IO_SOURCE IO/*.cpp IO/*.h)
 file (GLOB RESOURCE_SOURCE Resource/*.cpp Resource/*.h)
 file (GLOB AUDIO_SOURCE Audio/*.cpp Audio/*.h)
 file (GLOB NETWORK_SOURCE Network/*.cpp Network/*.h)
+file (GLOB INTERPROCESS_SOURCE Interprocess/*.cpp Interprocess/*.h)
 
 file (GLOB ATOMIC2D_SOURCE Atomic2D/*.cpp Atomic2D/*.h)
 file (GLOB SCENE_SOURCE Scene/*.cpp Scene/*.h)
@@ -55,7 +56,7 @@ endif()
 
 set (SOURCE_FILES ${CONTAINER_SOURCE} ${CORE_SOURCE} ${ENGINE_SOURCE} ${INPUT_SOURCE}
                   ${AUDIO_SOURCE} ${IO_SOURCE} ${MATH_SOURCE} 
-                  ${RESOURCE_SOURCE} ${PHYSICS_SOURCE}
+                  ${RESOURCE_SOURCE} ${PHYSICS_SOURCE} ${INTERPROCESS_SOURCE}
                   ${GRAPHICS_SOURCE} ${GRAPHICS_IMPL_SOURCE}
                   ${ATOMIC3D_SOURCE}
                   ${ATOMIC2D_SOURCE} ${ENVIRONMENT_SOURCE}

+ 0 - 0
Source/Atomic/Interprocess/Interprocess.cpp


+ 0 - 0
Source/Atomic/Interprocess/Interprocess.h


+ 18 - 0
Source/Atomic/Interprocess/ProcessBase.cpp

@@ -0,0 +1,18 @@
+
+#include "ProcessChannel.h"
+#include "ProcessBase.h"
+
+namespace Atomic
+{
+
+ProcessBase::ProcessBase(Context* context) : Object(context)
+{
+
+}
+
+ProcessBase::~ProcessBase()
+{
+
+}
+
+}

+ 28 - 0
Source/Atomic/Interprocess/ProcessBase.h

@@ -0,0 +1,28 @@
+#pragma once
+
+#include "../Core/Object.h"
+
+namespace Atomic
+{
+
+class ProcessChannel;
+
+class ProcessBase : public Object
+{
+
+    OBJECT(ProcessBase)
+
+public:
+
+    ProcessBase(Context* context);
+    virtual ~ProcessBase();
+
+protected:
+
+    SharedPtr<ProcessChannel> inputChannel_;
+    SharedPtr<ProcessChannel> outputChannel_;
+
+};
+
+
+}

+ 22 - 0
Source/Atomic/Interprocess/ProcessChannel.cpp

@@ -0,0 +1,22 @@
+
+#include "ProcessChannel.h"
+
+namespace Atomic
+{
+
+ProcessChannel::ProcessChannel(Context *context, Mode mode, const String& name, unsigned size, bool server) :
+    Object(context),
+    size_(size),
+    mode_(mode)
+{
+    shared_ = new Poco::SharedMemory(name.CString(), size, mode == WRITE ? Poco::SharedMemory::AM_WRITE : Poco::SharedMemory::AM_READ, 0, server);
+    buffer_ = new MemoryBuffer(shared_->begin(), size);
+}
+
+ProcessChannel::~ProcessChannel()
+{
+    delete buffer_;
+    delete shared_;
+}
+
+}

+ 35 - 0
Source/Atomic/Interprocess/ProcessChannel.h

@@ -0,0 +1,35 @@
+#pragma once
+
+#include <Poco/SharedMemory.h>
+#include "../Core/Object.h"
+#include "../IO/MemoryBuffer.h"
+
+namespace Atomic
+{
+
+/// read/write variant map
+/// reserve some space at from end for mouse/etc state
+class ProcessChannel : public Object
+{
+    OBJECT(ProcessChannel)
+
+public:
+
+    enum Mode
+    {
+        READ = 0,
+        WRITE
+    };
+
+    ProcessChannel(Context* context, Mode mode, const String& name, unsigned size, bool server = true);
+    virtual ~ProcessChannel();
+
+private:
+    Poco::SharedMemory* shared_;
+    MemoryBuffer* buffer_;
+    unsigned size_;
+    Mode mode_;
+};
+
+
+}

+ 18 - 0
Source/Atomic/Interprocess/ProcessClient.cpp

@@ -0,0 +1,18 @@
+
+#include "ProcessClient.h"
+
+namespace Atomic
+{
+
+ProcessClient::ProcessClient(Context* context) : ProcessBase(context)
+{
+
+}
+
+ProcessClient::~ProcessClient()
+{
+
+}
+
+
+}

+ 24 - 0
Source/Atomic/Interprocess/ProcessClient.h

@@ -0,0 +1,24 @@
+
+#pragma once
+
+#include "ProcessBase.h"
+
+namespace Atomic
+{
+
+class ProcessChannel;
+
+class ProcessClient : public ProcessBase
+{
+    OBJECT(ProcessClient)
+
+public:
+
+    ProcessClient(Context* context);
+    virtual ~ProcessClient();
+
+private:
+
+};
+
+}

+ 21 - 0
Source/Atomic/Interprocess/ProcessServer.cpp

@@ -0,0 +1,21 @@
+
+#include "ProcessChannel.h"
+#include "ProcessServer.h"
+#include "ProcessClient.h"
+
+namespace Atomic
+{
+
+ProcessServer::ProcessServer(Context* context) : ProcessBase(context)
+{
+    unsigned size = 1024 * 1024 * 4;
+    outputChannel_ = new ProcessChannel(context, ProcessChannel::WRITE, "ATOMIC_SERVER_WRITE", size, true);
+    inputChannel_ = new ProcessChannel(context, ProcessChannel::WRITE, "ATOMIC_SERVER_READ", size, true);
+}
+
+ProcessServer::~ProcessServer()
+{
+
+}
+
+}

+ 32 - 0
Source/Atomic/Interprocess/ProcessServer.h

@@ -0,0 +1,32 @@
+
+#pragma once
+
+#include "ProcessBase.h"
+
+namespace Atomic
+{
+
+class ProcessChannel;
+class ProcessClient;
+
+class ProcessServer : public ProcessBase
+{
+    OBJECT(ProcessServer)
+
+public:
+
+    struct ClientData
+    {
+
+    };
+
+    ProcessServer(Context* context);
+    virtual ~ProcessServer();
+
+private:
+
+    SharedPtr<ProcessClient> client_;
+
+};
+
+}

+ 0 - 3
Source/AtomicEditor/CMakeLists.txt

@@ -1,13 +1,10 @@
 include_directories (${CMAKE_SOURCE_DIR}/Source/ThirdParty/rapidjson/include
                      ${CMAKE_SOURCE_DIR}/Source/ThirdParty
-                     ${CMAKE_SOURCE_DIR}/Source/ThirdParty/Poco/Foundation/include
                      ${CMAKE_SOURCE_DIR}/Source/ThirdParty/nativefiledialog)
 
 
 file (GLOB_RECURSE SOURCE_FILES Source/*.cpp Source/*.h)
 
-add_definitions(-DPOCO_NO_AUTOMATIC_LIBS)
-
 if (APPLE)
     set (EXE_TYPE MACOSX_BUNDLE)
     set (SOURCE_FILES ${SOURCE_FILES} Source/Build/BuildIOSUtils.mm)

+ 6 - 4
Source/AtomicEditor/Source/AEEditor.cpp

@@ -269,9 +269,6 @@ void Editor::HandlePlayRequest(StringHash eventType, VariantMap& eventData)
 
     AEPlayerMode mode = (AEPlayerMode) eventData[EditorPlayStarted::P_MODE].GetUInt();
 
-    UI* tbui = GetSubsystem<UI>();
-    //tbui->SetKeyboardDisabled(true);
-
     if (mode != AE_PLAYERMODE_WIDGET)
     {
         //tbui->SetInputDisabled(true);
@@ -283,7 +280,12 @@ void Editor::HandlePlayRequest(StringHash eventType, VariantMap& eventData)
     TBRect rect = tb->GetRect();
     tb->ConvertToRoot(rect.x, rect.y);
 
-    player_->Play(mode, IntRect(rect.x, rect.y, rect.x + rect.w, rect.y + rect.h));
+    if (!player_->Play(mode, IntRect(rect.x, rect.y, rect.x + rect.w, rect.y + rect.h)))
+    {
+        player_->Invalidate();
+        player_ = 0;
+        return;
+    }
 
     SendEvent(E_EDITORPLAYSTARTED, eventData);
 

+ 10 - 83
Source/AtomicEditor/Source/Player/AEPlayer.cpp

@@ -4,6 +4,8 @@
 
 #include "AtomicEditor.h"
 
+#include "../Subprocess/AESubprocessSystem.h"
+
 #include <Atomic/Core/Context.h>
 #include <Atomic/IO/FileSystem.h>
 #include <Atomic/Input/Input.h>
@@ -28,25 +30,6 @@
 namespace AtomicEditor
 {
 
-static int js_atomiceditor_SetView(duk_context* ctx)
-{
-    JSVM* vm = JSVM::GetJSVM(ctx);
-    AEPlayer* player = vm->GetSubsystem<AEPlayer>();
-
-    Scene* scene = js_to_class_instance<Scene>(ctx, 0, 0);
-    Camera* camera = js_to_class_instance<Camera>(ctx, 1, 0);
-
-    UIPlayer* uiPlayer = player->GetUIPlayer();
-    Viewport* viewport = uiPlayer->SetView(scene, camera);
-
-    IntVector2 size = uiPlayer->GetPlayerSize();
-    viewport->SetRect(IntRect(0, 0, size.x_, size.y_));
-
-    js_push_class_object_instance(ctx, viewport, "Viewport");
-
-    return 1;
-}
-
 
 AEPlayer::AEPlayer(Context* context) :
     Object(context),
@@ -57,33 +40,10 @@ AEPlayer::AEPlayer(Context* context) :
     assert(!context->GetSubsystem<AEPlayer>());
     context->RegisterSubsystem(this);
 
-    Javascript* javascript = context->GetSubsystem<Javascript>();
-    vm_ = javascript->InstantiateVM("AEPlayerVM");
-
-    // only subscribe to errors on our VM
-    SubscribeToEvent(vm_, E_JSERROR, HANDLER(AEPlayer, HandleJSError));
-
-    vm_->InitJSContext();
-
-    if (errors_.Size())
-        return;
-
-    vm_->SetModuleSearchPath("Modules");
-
-    duk_eval_string_noresult(vm_->GetJSContext(), "require(\"AtomicGame\"); require (\"AtomicEditor\");");
-
 }
 
 AEPlayer::~AEPlayer()
 {
-    UnsubscribeFromEvent(E_JSERROR);
-    Javascript* javascript = context_->GetSubsystem<Javascript>();
-    // this can be NULL when exiting during play mode
-    if (javascript)
-        javascript->ShutdownVM("AEPlayerVM");
-    vm_ = NULL;
-
-    GetSubsystem<Input>()->SetTouchEmulation(false);
 
 }
 
@@ -92,59 +52,26 @@ void AEPlayer::Invalidate()
     UIModalOps* ops = GetSubsystem<UIModalOps>();
     ops->Hide();
     context_->RemoveSubsystem<AEPlayer>();
-
-// BEGIN LICENSE MANAGEMENT
-    if (uiPlayer_.NotNull() && uiPlayer_->Show3DInfo())
-        ops->ShowInfoModule3D();
-// END LICENSE MANAGEMENT
-
 }
 
 void AEPlayer::HandleJSError(StringHash eventType, VariantMap& eventData)
 {
-    SendEvent(E_PLAYERERROR);
-
-    AEPlayerError err;
-
-    using namespace JSError;
-    err.name_ = eventData[P_ERRORNAME].GetString();
-    err.message_ = eventData[P_ERRORMESSAGE].GetString();
-    err.filename_ = eventData[P_ERRORFILENAME].GetString();
-    err.stack_ = eventData[P_ERRORSTACK].GetString();
-    err.lineNumber_ = eventData[P_ERRORLINENUMBER].GetInt();
-
-    errors_.Push(err);
 
 }
 
 bool AEPlayer::Play(AEPlayerMode mode, const IntRect &rect)
 {
+    SubprocessSystem* system = GetSubsystem<SubprocessSystem>();
 
-    if (errors_.Size())
-        return false;
-
-    mode_ = mode;
-
-    UIModalOps* ops = GetSubsystem<UIModalOps>();
-
-    ops->ShowPlayer();
-
-    duk_context* ctx = vm_->GetJSContext();
-
-    duk_get_global_string(ctx, "Atomic");
-    duk_get_prop_string(ctx, -1, "editor");
-    duk_push_c_function(ctx, js_atomiceditor_SetView, 2);
-    duk_put_prop_string(ctx, -2, "setView");
-    duk_pop_2(ctx);
-
-    bool ok = vm_->ExecuteMain();
+    Vector<String> vargs;
+    String args = \
+    "--editor-resource-paths \"/Users/josh/Dev/atomic/AtomicGameEngine/Data/AtomicPlayer/Resources/CoreData!/Users/josh/Dev/atomic/AtomicExamples/Basic2D/Resources\"";
+    if (args.Length())
+        vargs = args.Split(' ');
 
-    if (!ok)
-    {
-        SendEvent(E_PLAYERERROR);
-    }
+    system->Launch("/Users/josh/Dev/atomic/AtomicGameEngine-build/Source/AtomicPlayer/AtomicPlayer.app/Contents/MacOS/AtomicPlayer", vargs);
 
-    return ok;
+    return false;
 }
 
 void AEPlayer::SetUIPlayer(UIPlayer* uiPlayer)

+ 0 - 41
Source/AtomicEditor/Source/Player/UIPlayer.cpp

@@ -39,12 +39,6 @@ UIPlayer::UIPlayer(Context* context):
     UIModalOpWindow(context)
 {
 
-// BEGIN LICENSE MANAGEMENT
-    LicenseSystem* license = GetSubsystem<LicenseSystem>();
-    standardLicense_ = license->IsStandardLicense();
-    show3DInfo_ = false;
-// END LICENSE MANAGEMENT
-
     aePlayer_ = GetSubsystem<AEPlayer>();
     aePlayer_->SetUIPlayer(this);
 
@@ -58,14 +52,6 @@ UIPlayer::UIPlayer(Context* context):
 
     Graphics* graphics = GetSubsystem<Graphics>();
 
-    view3D_ = new UIView3D(context_);
-
-    // horrible hack
-    Viewport* viewport = view3D_->GetViewport();
-    FixMeSetLight2DGroupViewport(viewport);
-
-    TBWidgetDelegate* view3DDelegate = view3D_->GetWidgetDelegate();
-
     float gwidth = graphics->GetWidth();
     float aspect = float(graphics->GetHeight())/ gwidth;
     gwidth -= 150;
@@ -73,16 +59,9 @@ UIPlayer::UIPlayer(Context* context):
     playerSize_.x_ = gwidth;
     playerSize_.y_ = gwidth * aspect;
 
-    LayoutParams lp;
-    lp.SetWidth(playerSize_.x_);
-    lp.SetHeight(playerSize_.y_);
-    view3DDelegate->SetLayoutParams(lp);
-
     TBLayout* playercontainer = window_->GetWidgetByIDAndType<TBLayout>(TBIDC("playerlayout"));
     assert(playercontainer);
 
-    playercontainer->AddChild(view3DDelegate);
-
     window_->ResizeToFitContent();
 
     Center();    
@@ -91,11 +70,6 @@ UIPlayer::UIPlayer(Context* context):
 
 }
 
-Viewport *UIPlayer::SetView(Scene* scene, Camera* camera)
-{
-    view3D_->SetView(scene, camera);
-    return view3D_->GetViewport();
-}
 
 UIPlayer::~UIPlayer()
 {
@@ -104,22 +78,7 @@ UIPlayer::~UIPlayer()
 
 void UIPlayer::HandleUpdate(StringHash eventType, VariantMap& eventData)
 {
-    view3D_->QueueUpdate();
-
-    // BEGIN LICENSE MANAGEMENT
-    if (standardLicense_)
-    {
-        Camera* camera = view3D_->GetViewport()->GetCamera();
-        if (camera && !camera->IsOrthographic())
-        {
-            show3DInfo_ = true;
-        }
-    }
-    // END LICENSE MANAGEMENT
 
-    TBWidgetDelegate* view3DDelegate = view3D_->GetWidgetDelegate();
-    TBRect rect = view3DDelegate->GetRect();
-    view3DDelegate->ConvertToRoot(rect.x, rect.y);
 }
 
 

+ 0 - 9
Source/AtomicEditor/Source/Player/UIPlayer.h

@@ -30,23 +30,14 @@ public:
     UIPlayer(Context* context);
     virtual ~UIPlayer();
 
-    Viewport* SetView(Scene* scene, Camera* camera);
-
     bool OnEvent(const TBWidgetEvent &ev);
-    bool Show3DInfo() { return show3DInfo_; }
-
     const IntVector2& GetPlayerSize() { return playerSize_; }
 
 private:
 
     void HandleUpdate(StringHash eventType, VariantMap& eventData);
-    SharedPtr<UIView3D> view3D_;
     WeakPtr<AEPlayer> aePlayer_;
-
     IntVector2 playerSize_;
-
-    bool standardLicense_;
-    bool show3DInfo_;
 };
 
 }

+ 18 - 0
Source/AtomicPlayer/AtomicPlayer.cpp

@@ -87,6 +87,24 @@ void AtomicPlayer::Setup()
     engineParameters_["ResourcePrefixPath"] = "../Resources";
 #endif
 
+    const Vector<String>& arguments = GetArguments();
+
+    for (unsigned i = 0; i < arguments.Size(); ++i)
+    {
+        if (arguments[i].Length() > 1)
+        {
+            String argument = arguments[i].ToLower();
+            String value = i + 1 < arguments.Size() ? arguments[i + 1] : String::EMPTY;
+
+            if (argument == "--editor-resource-paths" && value.Length())
+            {
+                engineParameters_["ResourcePrefixPath"] = "";
+                value.Replace("!", ";");
+                engineParameters_["ResourcePaths"] = value;
+            }
+        }
+    }
+
     // Use the script file name as the base name for the log file
     engineParameters_["LogName"] = filesystem->GetAppPreferencesDir("AtomicPlayer", "Logs") + "AtomicPlayer.log";
 }

+ 2 - 4
Source/ThirdParty/Poco/CMakeLists.txt

@@ -1,7 +1,5 @@
 
-add_definitions(-DHAVE_STDINT_H -DPOCO_STATIC -DPOCO_NO_AUTOMATIC_LIBS)
-
-include_directories (${CMAKE_CURRENT_SOURCE_DIR}/Foundation/include)
+add_definitions(-DHAVE_STDINT_H -DPOCO_STATIC)
 
 set (SOURCE_FILES
     Foundation/src/Pipe.cpp
@@ -180,4 +178,4 @@ set (SOURCE_FILES
     Foundation/src/trees.c
     Foundation/src/zutil.c )
 
-add_library(Poco ${SOURCE_FILES})
+add_library(Poco ${SOURCE_FILES})

+ 0 - 3
Source/ToolCore/CMakeLists.txt

@@ -1,6 +1,5 @@
 include_directories (${CMAKE_SOURCE_DIR}/Source/ThirdParty/rapidjson/include
                      ${CMAKE_SOURCE_DIR}/Source/ThirdParty
-                     ${CMAKE_SOURCE_DIR}/Source/ThirdParty/Poco/Foundation/include
                      ${CMAKE_SOURCE_DIR}/Source/ThirdParty/nativefiledialog)
 
 
@@ -11,8 +10,6 @@ endif()
 
 file (GLOB_RECURSE SOURCE_FILES Source/*.cpp Source/*.h)
 
-add_definitions(-DPOCO_NO_AUTOMATIC_LIBS)
-
 file (GLOB_RECURSE SOURCE_FILES *.cpp *.h)
 
 add_library(ToolCore ${SOURCE_FILES})