Browse Source

Adding new Player window

Josh Engebretson 10 years ago
parent
commit
c46f146fb3

+ 1 - 2
Data/AtomicEditor/Resources/EditorData/AtomicEditor/editor/ui/playerwidget.tb.txt

@@ -1,2 +1 @@
-TBLayout: distribution: gravity, size: available, axis: y, id: playerlayout
-	TBContainer: gravity: all, id: playercontainer
+TBLayout: distribution: gravity, size: available, axis: y, id: playerlayout

+ 11 - 26
Data/AtomicPlayer/Resources/CoreData/AtomicModules/AtomicGame.js

@@ -71,21 +71,15 @@ Game.prototype.createScene2D = function() {
     camera.orthographic = true;
     camera.orthoSize = this.graphics.height * Atomic.PIXEL_SIZE;
 
-    var viewport = new Atomic.Viewport(scene, camera);
-
+    var viewport = null;
+    
     if (Atomic.editor) {
-        var _viewport = Atomic.editor.viewport;
-        viewport.rect = [_viewport.left, _viewport.top, _viewport.right, _viewport.bottom];
-
-        var width = (_viewport.right - 8) - _viewport.left;
-        var height = _viewport.bottom - _viewport.top;
-
-        this.ui.getRoot().position = [_viewport.left, _viewport.top];
-        this.ui.getRoot().setSize(width, height);        
+        Atomic.editor.setView(scene, camera);
+    } else {
+        var viewport = new Atomic.Viewport(scene, camera);
+        this.renderer.setViewport(0, viewport);
     }
 
-    this.renderer.setViewport(0, viewport);
-
     this.scene = scene;
     this.cameraNode = cameraNode;
     this.camera = camera;
@@ -105,23 +99,14 @@ Game.prototype.createScene3D = function() {
 
     var camera = cameraNode.createComponent("Camera");    
 
-    var viewport = new Atomic.Viewport(scene, camera);
-
+    var viewport = null;
     if (Atomic.editor) {
-
-        var _viewport = Atomic.editor.viewport;
-        viewport.rect = [_viewport.left, _viewport.top, _viewport.right - 8, _viewport.bottom];
-
-        var width = (_viewport.right - 8) - _viewport.left;
-        var height = _viewport.bottom - _viewport.top;
-
-        this.ui.getRoot().position = [_viewport.left, _viewport.top];
-        this.ui.getRoot().setSize(width, height);        
-
+        Atomic.editor.setView(scene, camera);
+    } else {
+        var viewport = new Atomic.Viewport(scene, camera);
+        this.renderer.setViewport(0, viewport);
     }
 
-    this.renderer.setViewport(0, viewport);
-
     this.scene = scene;
     this.cameraNode = cameraNode;
     this.camera = camera;

+ 14 - 5
Source/Atomic/Atomic2D/Light2D.cpp

@@ -27,6 +27,13 @@
 namespace Atomic
 {
 
+
+static Viewport* __fixmeViewport = NULL;
+void FixMeSetLight2DGroupViewport(Viewport *viewport)
+{
+    __fixmeViewport = viewport;
+}
+
 extern const char* ATOMIC2D_CATEGORY;
 
 Light2D::Light2D(Context* context) : Component(context),
@@ -479,21 +486,23 @@ Light2DGroup::Light2DGroup(Context* context) : Drawable2D(context),
 }
 
 Light2DGroup::~Light2DGroup()
-{
+{   
     Renderer* renderer = GetSubsystem<Renderer>();
+
     if (renderer)
     {
-        Viewport* viewport = renderer->GetViewport(0);
+        Viewport* viewport = __fixmeViewport ? __fixmeViewport :  renderer->GetViewport(0);
         if (viewport)
         {
             RenderPath* renderpath = viewport->GetRenderPath();
             if (renderpath)
                 renderpath->RemoveCommands("Light2D");
-
         }
 
     }
 
+    __fixmeViewport = NULL;
+
 }
 
 void Light2DGroup::HandleBeginViewUpdate(StringHash eventType, VariantMap& eventData)
@@ -576,7 +585,7 @@ void Light2DGroup::SetAmbientColor(const Color& color)
     // only on main viewport atm and viewport must first be set
     if (renderer)
     {
-        Viewport* viewport = renderer->GetViewport(0);
+        Viewport* viewport = __fixmeViewport ? __fixmeViewport :  renderer->GetViewport(0);
         if (viewport)
         {
             RenderPath* renderpath = viewport->GetRenderPath();
@@ -590,7 +599,7 @@ void Light2DGroup::CreateLight2DMaterial()
 {
     Renderer* renderer = GetSubsystem<Renderer>();
     // only on main viewport atm and viewport must first be set
-    Viewport* viewport = renderer->GetViewport(0);
+    Viewport* viewport = __fixmeViewport ? __fixmeViewport :  renderer->GetViewport(0);
     RenderPath* renderpath = viewport->GetRenderPath();
 
     RenderTargetInfo ntarget;

+ 0 - 2
Source/Atomic/Atomic2D/Light2D.h

@@ -210,6 +210,4 @@ private:
 
 };
 
-
-
 }

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

@@ -91,8 +91,7 @@ void SceneEditor3D::SelectNode(Node* node)
 }
 
 void SceneEditor3D::HandleUpdate(StringHash eventType, VariantMap& eventData)
-{
-    // view3D_->QueueUpdate();
+{    
 }
 
 void SceneEditor3D::HandleEditorActiveNodeChange(StringHash eventType, VariantMap& eventData)

+ 32 - 8
Source/AtomicEditor/Source/Player/AEPlayer.cpp

@@ -19,12 +19,29 @@
 #include "AEEditor.h"
 #include "Project/AEProject.h"
 
+#include "UIPlayer.h"
+#include "UI/Modal/UIModalOps.h"
+
 // TODO: Remove dependency
 #include <Duktape/duktape.h>
 
 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);
+
+    player->GetUIPlayer()->SetView(scene, camera);
+
+    return 0;
+}
+
+
 AEPlayer::AEPlayer(Context* context) :
     Object(context),
     mode_(AE_PLAYERMODE_WIDGET)
@@ -49,7 +66,6 @@ AEPlayer::AEPlayer(Context* context) :
 
     duk_eval_string_noresult(vm_->GetJSContext(), "require(\"AtomicGame\"); require (\"AtomicEditor\");");
 
-
 }
 
 AEPlayer::~AEPlayer()
@@ -67,6 +83,8 @@ AEPlayer::~AEPlayer()
 
 void AEPlayer::Invalidate()
 {
+    UIModalOps* ops = GetSubsystem<UIModalOps>();
+    ops->Hide();
     context_->RemoveSubsystem<AEPlayer>();
     GetSubsystem<UI>()->GetRoot()->RemoveAllChildren();
 }
@@ -96,16 +114,17 @@ bool AEPlayer::Play(AEPlayerMode mode, const IntRect &rect)
 
     mode_ = mode;
 
-    duk_context* ctx = vm_->GetJSContext();
+    UIModalOps* ops = GetSubsystem<UIModalOps>();
 
-    String init;
-    init.AppendWithFormat("Atomic.editor.setViewport(%i, %i, %i, %i);",
-                          rect.left_, rect.top_, rect.right_, rect.bottom_);
+    ops->ShowPlayer();
 
-    duk_eval_string_noresult(vm_->GetJSContext(),init.CString());
+    duk_context* ctx = vm_->GetJSContext();
 
-    Editor* editor = GetSubsystem<Editor>();
-    Project* project = editor->GetProject();
+    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();
 
@@ -117,6 +136,11 @@ bool AEPlayer::Play(AEPlayerMode mode, const IntRect &rect)
     return ok;
 }
 
+void AEPlayer::SetUIPlayer(UIPlayer* uiPlayer)
+{
+    uiPlayer_ = uiPlayer;
+}
+
 void AEPlayer::HandleEditorShutdown(StringHash eventType, VariantMap& eventData)
 {
     context_->RemoveSubsystem(GetType());

+ 8 - 0
Source/AtomicEditor/Source/Player/AEPlayer.h

@@ -20,6 +20,8 @@ class JSVM;
 namespace AtomicEditor
 {
 
+class UIPlayer;
+
 struct AEPlayerError
 {
     String name_;
@@ -46,8 +48,12 @@ public:
     void Invalidate();
 
     bool HasErrors() { return errors_.Size() != 0; }
+
     const Vector<AEPlayerError>& GetErrors() { return errors_; }
 
+    UIPlayer* GetUIPlayer() { return uiPlayer_; }
+    void SetUIPlayer(UIPlayer* uiPlayer);
+
 private:
 
     AEPlayerMode mode_;
@@ -57,6 +63,8 @@ private:
     void HandleJSError(StringHash eventType, VariantMap& eventData);
     void HandleEditorShutdown(StringHash eventType, VariantMap& eventData);
 
+    WeakPtr<UIPlayer> uiPlayer_;
+
     SharedPtr<JSVM> vm_;
 
 };

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

@@ -0,0 +1,111 @@
+// 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 "AtomicEditor.h"
+
+#include <TurboBadger/tb_window.h>
+#include <TurboBadger/tb_select.h>
+#include <TurboBadger/tb_editfield.h>
+
+#include <Atomic/Core/Context.h>
+#include <Atomic/Core/CoreEvents.h>
+#include <Atomic/IO/Log.h>
+#include <Atomic/UI/UI.h>
+#include <Atomic/UI/TBUI.h>
+
+#include <Atomic/Graphics/Graphics.h>
+#include <Atomic/Graphics/Viewport.h>
+
+#include "AEEditor.h"
+#include "AEEvents.h"
+
+#include "UIPlayer.h"
+
+namespace Atomic
+{
+    void FixMeSetLight2DGroupViewport(Viewport *viewport);
+}
+
+namespace AtomicEditor
+{
+
+// UIBuildSettings------------------------------------------------
+
+UIPlayer::UIPlayer(Context* context):
+    UIModalOpWindow(context)
+{
+
+    aePlayer_ = GetSubsystem<AEPlayer>();
+    aePlayer_->SetUIPlayer(this);
+
+    TBUI* tbui = GetSubsystem<TBUI>();
+    window_->SetText("Atomic Player");
+    tbui->LoadResourceFile(window_->GetContentRoot(), "AtomicEditor/editor/ui/playerwidget.tb.txt");
+
+    Graphics* graphics = GetSubsystem<Graphics>();
+
+    view3D_ = new View3D(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;
+
+    LayoutParams lp;
+    lp.SetWidth(gwidth);
+    lp.SetHeight(gwidth * aspect);
+    view3DDelegate->SetLayoutParams(lp);
+
+    TBLayout* playercontainer = window_->GetWidgetByIDAndType<TBLayout>(TBIDC("playerlayout"));
+    assert(playercontainer);
+
+    playercontainer->AddChild(view3DDelegate);
+
+    window_->ResizeToFitContent();
+
+    Center();
+
+    SubscribeToEvent(E_UPDATE, HANDLER(UIPlayer, HandleUpdate));
+}
+
+void UIPlayer::SetView(Scene* scene, Camera* camera)
+{
+    view3D_->SetView(scene, camera);
+}
+
+UIPlayer::~UIPlayer()
+{
+
+}
+
+void UIPlayer::HandleUpdate(StringHash eventType, VariantMap& eventData)
+{
+
+    view3D_->QueueUpdate();
+    UI* ui = GetSubsystem<UI>();
+
+    TBWidgetDelegate* view3DDelegate = view3D_->GetWidgetDelegate();
+    TBRect rect = view3DDelegate->GetRect();
+    view3DDelegate->ConvertToRoot(rect.x, rect.y);
+
+    ui->GetRoot()->SetPosition(rect.x, rect.y);
+    ui->GetRoot()->SetSize(rect.w, rect.h);
+}
+
+
+bool UIPlayer::OnEvent(const TBWidgetEvent &ev)
+{
+    return false;
+}
+
+
+
+}
+
+

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

@@ -0,0 +1,45 @@
+// 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
+
+
+#pragma once
+
+#include "UI/Modal/UIModalOps.h"
+#include "UI/UIView3D.h"
+
+#include "AEPlayer.h"
+
+namespace Atomic
+{
+class Scene;
+class Camera;
+}
+
+namespace AtomicEditor
+{
+
+/// Player modal
+
+class UIPlayer: public UIModalOpWindow
+{
+    OBJECT(UIPlayer);
+
+public:
+
+    UIPlayer(Context* context);
+    virtual ~UIPlayer();
+
+    void SetView(Scene* scene, Camera* camera);
+
+    bool OnEvent(const TBWidgetEvent &ev);
+
+private:
+
+    void HandleUpdate(StringHash eventType, VariantMap& eventData);
+    SharedPtr<View3D> view3D_;
+    WeakPtr<AEPlayer> aePlayer_;
+
+};
+
+}

+ 10 - 0
Source/AtomicEditor/Source/UI/Modal/UIModalOps.cpp

@@ -35,6 +35,8 @@
 #include "License/AELicenseSystem.h"
 #include "License/UIEulaAgreement.h"
 
+#include "Player/UIPlayer.h"
+
 namespace AtomicEditor
 {
 
@@ -282,6 +284,14 @@ void UIModalOps::ShowEulaAgreement()
 
 }
 
+void UIModalOps::ShowPlayer()
+{
+    assert(opWindow_.Null());
+
+    Show();
+    opWindow_ = new UIPlayer(context_);
+}
+
 void UIModalOps::OnWidgetDelete(TBWidget *widget)
 {
     if (isHiding_)

+ 2 - 0
Source/AtomicEditor/Source/UI/Modal/UIModalOps.h

@@ -62,6 +62,8 @@ class UIModalOps: public AEWidget, private TBWidgetListener
     void ShowPlatformsInfo();
     void ShowEulaAgreement();
 
+    void ShowPlayer();
+
     // Whether there is a modal window currently showing
     bool ModalActive() { return opWindow_.NotNull(); }
 

+ 4 - 4
Source/AtomicEditor/Source/UI/UIResourceFrame.cpp

@@ -414,17 +414,17 @@ void ResourceFrame::CloseResourceEditor(ResourceEditor* editor, bool navigateToA
 
 void ResourceFrame::HandlePlayStarted(StringHash eventType, VariantMap& eventData)
 {
-    delegate_->SetVisibilility(WIDGET_VISIBILITY_INVISIBLE);
+    //delegate_->SetVisibilility(WIDGET_VISIBILITY_INVISIBLE);
     delegate_->SetIgnoreInput(true);
-    delegate_->SetState(WIDGET_STATE_DISABLED, true);
+    //delegate_->SetState(WIDGET_STATE_DISABLED, true);
 }
 
 
 void ResourceFrame::HandlePlayStopped(StringHash eventType, VariantMap& eventData)
 {
-    delegate_->SetVisibilility(WIDGET_VISIBILITY_VISIBLE);
+    //delegate_->SetVisibilility(WIDGET_VISIBILITY_VISIBLE);
     delegate_->SetIgnoreInput(false);
-    delegate_->SetState(WIDGET_STATE_DISABLED, false);
+    //delegate_->SetState(WIDGET_STATE_DISABLED, false);
 }
 
 void ResourceFrame::CloseAllResourceEditors()

+ 11 - 2
Source/AtomicEditor/Source/UI/UIView3D.cpp

@@ -10,6 +10,7 @@
 #include <Atomic/IO/Log.h>
 #include <Atomic/Graphics/Graphics.h>
 #include <Atomic/Graphics/Camera.h>
+#include <Atomic/Graphics/RenderPath.h>
 
 #include "UIView3D.h"
 
@@ -26,7 +27,7 @@ namespace AtomicEditor
 View3D::View3D(Context* context) :
     AEWidget(context),
     rttFormat_(Graphics::GetRGBFormat()),
-    autoUpdate_(true),
+    autoUpdate_(false),
     size_(-1, -1)
 {
     renderTexture_ = new Texture2D(context_);
@@ -35,12 +36,20 @@ View3D::View3D(Context* context) :
 
     view3DWidget_ = new View3DWidget();
     view3DWidget_->SetGravity(WIDGET_GRAVITY_ALL);
+
     view3DWidget_->view3D_ = this;
     delegate_->AddChild(view3DWidget_);
 }
 
 View3D::~View3D()
 {
+    // FIXME: need to refactor Light2D viewport handling
+    if (viewport_.NotNull())
+    {
+        RenderPath* renderpath = viewport_->GetRenderPath();
+        if (renderpath)
+            renderpath->RemoveCommands("Light2D");
+    }
 
 }
 
@@ -74,7 +83,7 @@ void View3D::OnResize(const IntVector2 &newSize)
 }
 
 
-void View3D::SetView(Scene* scene, Camera* camera, bool ownScene)
+void View3D::SetView(Scene* scene, Camera* camera)
 {
     scene_ = scene;
     cameraNode_ = camera ? camera->GetNode() : 0;

+ 1 - 1
Source/AtomicEditor/Source/UI/UIView3D.h

@@ -53,7 +53,7 @@ public:
     void OnResize(const IntVector2& newSize);
 
     /// Define the scene and camera to use in rendering. When ownScene is true the View3D will take ownership of them with shared pointers.
-    void SetView(Scene* scene, Camera* camera, bool ownScene = true);
+    void SetView(Scene* scene, Camera* camera);
     /// Set render texture pixel format. Default is RGB.
     void SetFormat(unsigned format);
     /// Set render target auto update mode. Default is true.