Browse Source

Working on 3D view

Josh Engebretson 10 years ago
parent
commit
ed2ced0bbf

+ 2 - 2
Source/Atomic/Engine/Engine.cpp

@@ -649,9 +649,9 @@ void Engine::Render()
 
     GetSubsystem<Renderer>()->Render();
 
-    #ifdef ATOMIC_TBUI
+#ifdef ATOMIC_TBUI
     GetSubsystem<TBUI>()->Render();
-    #endif
+#endif
 
     GetSubsystem<UI>()->Render();
     graphics->EndFrame();

+ 3 - 21
Source/AtomicEditor/Source/Editors/SceneEditor3D/SceneEditor3D.cpp

@@ -28,7 +28,6 @@
 #include <Atomic/UI/View3D.h>
 
 #include "SceneEditor3D.h"
-#include "View3DWidget.h"
 
 namespace AtomicEditor
 {
@@ -57,28 +56,11 @@ SceneEditor3D ::SceneEditor3D(Context* context, const String &fullpath, TBTabCon
 
     scene_->SetUpdateEnabled(false);
 
-    debugRenderer_ = scene_->GetComponent<DebugRenderer>();
-
-    if (debugRenderer_.Null())
-    {
-        debugRenderer_ = scene_->CreateComponent<DebugRenderer>();
-    }
-
-    octree_ = scene_->GetComponent<Octree>();
-
-    if (octree_.Null())
-    {
-        LOGWARNING("Scene without an octree loaded");
-        octree_ = scene_->CreateComponent<Octree>();
-    }
-
-    // once octree/debugrenderer exist
     sceneView_ = new SceneView3D(context_, this);
 
-    View3DWidget* widget = sceneView_->GetWidget();
-    widget->SetGravity(WIDGET_GRAVITY_ALL);
-
-    view3DContainer_->AddChild(widget);
+    TBWidgetDelegate* delegate = sceneView_->GetWidgetDelegate();
+    delegate->SetGravity(WIDGET_GRAVITY_ALL);
+    view3DContainer_->AddChild(delegate);
 
     layout_->AddChild(view3DContainer_);
 

+ 0 - 2
Source/AtomicEditor/Source/Editors/SceneEditor3D/SceneEditor3D.h

@@ -55,8 +55,6 @@ private:
     TBLayout* layout_;
     TBContainer* view3DContainer_;
 
-    WeakPtr<DebugRenderer> debugRenderer_;
-    WeakPtr<Octree> octree_;
     WeakPtr<Node> selectedNode_;
 
 };

+ 31 - 19
Source/AtomicEditor/Source/Editors/SceneEditor3D/SceneView3D.cpp

@@ -26,17 +26,14 @@
 #include "SceneView3D.h"
 #include "SceneEditor3D.h"
 
-#include <Atomic/UI/TBUI.h>
 #include <Atomic/UI/UI.h>
-#include <Atomic/UI/View3D.h>
-
-#include "View3DWidget.h"
+#include <Atomic/UI/TBUI.h>
 
 namespace AtomicEditor
 {
 
 SceneView3D ::SceneView3D(Context* context, SceneEditor3D *sceneEditor) :
-    Object(context),
+    View3D(context),
     yaw_(0.0f),
     pitch_(0.0f)
 {
@@ -47,6 +44,21 @@ SceneView3D ::SceneView3D(Context* context, SceneEditor3D *sceneEditor) :
 
     scene_ = sceneEditor->GetScene();
 
+    debugRenderer_ = scene_->GetComponent<DebugRenderer>();
+
+    if (debugRenderer_.Null())
+    {
+        debugRenderer_ = scene_->CreateComponent<DebugRenderer>();
+    }
+
+    octree_ = scene_->GetComponent<Octree>();
+
+    if (octree_.Null())
+    {
+        LOGWARNING("Scene without an octree loaded");
+        octree_ = scene_->CreateComponent<Octree>();
+    }
+
     cameraNode_ = scene_->CreateChild("Camera");
     camera_ = cameraNode_->CreateComponent<Camera>();
 
@@ -57,13 +69,8 @@ SceneView3D ::SceneView3D(Context* context, SceneEditor3D *sceneEditor) :
 
     cameraNode_->SetPosition(Vector3(0, 0, -10));
 
-    view3D_ = new View3D(context_);
-    view3D_->SetView(scene_, camera_);
-    view3D_->SetAutoUpdate(false);
-
-    TBUI* tbui = GetSubsystem<TBUI>();
-    widget_ = new View3DWidget();
-    widget_->SetView3D(tbui, view3D_);
+    SetView(scene_, camera_);
+    SetAutoUpdate(false);
 
     SubscribeToEvent(E_UPDATE, HANDLER(SceneView3D, HandleUpdate));
     SubscribeToEvent(E_EDITORACTIVENODECHANGE, HANDLER(SceneView3D, HandleEditorActiveNodeChange));
@@ -120,17 +127,21 @@ void SceneView3D::MoveCamera(float timeStep)
 
 void SceneView3D::HandlePostRenderUpdate(StringHash eventType, VariantMap& eventData)
 {
-    if (!view3D_->IsVisible())
-        return;
 
+    /*
     UI* ui = GetSubsystem<UI>();
-    Viewport* viewport = view3D_->GetViewport();
-    IntRect view = viewport->GetRect();
 
     IntVector2 cpos = ui->GetCursorPosition();
 
-    Ray camRay = camera_->GetScreenRay(float(cpos.x_ - view3D_->GetPosition().x_) / view3D_->GetSize().x_,
-                          float(cpos.y_ - view3D_->GetPosition().y_) / view3D_->GetSize().y_);
+    TBRect rect = widget_->GetRect();
+
+    if (!rect.w || !rect.h)
+        return;
+
+    widget_->ConvertToRoot(rect.x, rect.y);
+
+    Ray camRay = camera_->GetScreenRay(float(cpos.x_ - rect.x) / rect.w,
+                          float(cpos.y_ - rect.y) /rect.h);
 
     PODVector<RayQueryResult> result;
     RayOctreeQuery query(result, camRay, RAY_TRIANGLE, camera_->GetFarClip(), DRAWABLE_ANY, DEFAULT_VIEWMASK);
@@ -147,6 +158,7 @@ void SceneView3D::HandlePostRenderUpdate(StringHash eventType, VariantMap& event
         }
 
     }
+    */
 
 }
 
@@ -163,7 +175,7 @@ void SceneView3D::HandleUpdate(StringHash eventType, VariantMap& eventData)
 
     MoveCamera(timeStep);
 
-    view3D_->QueueUpdate();
+    QueueUpdate();
 }
 
 void SceneView3D::HandleEditorActiveNodeChange(StringHash eventType, VariantMap& eventData)

+ 7 - 19
Source/AtomicEditor/Source/Editors/SceneEditor3D/SceneView3D.h

@@ -6,13 +6,14 @@
 
 #include <Atomic/Core/Object.h>
 
+#include "UI/UIView3D.h"
+
 using namespace Atomic;
 
 namespace Atomic
 {
 class Scene;
 class Node;
-class View3D;
 class Camera;
 class DebugRenderer;
 class Octree;
@@ -22,22 +23,17 @@ namespace AtomicEditor
 {
 
 class SceneEditor3D;
-class View3DWidget;
 
-class SceneView3D: public Object
+class SceneView3D: public View3D
 {
     OBJECT(SceneView3D);
 
 public:
 
     SceneView3D(Context* context, SceneEditor3D* sceneEditor);
-
     virtual ~SceneView3D();
-
     void SelectNode(Node* node);
 
-    View3DWidget* GetWidget() { return widget_; }
-
 private:
 
     void HandleUpdate(StringHash eventType, VariantMap& eventData);
@@ -47,22 +43,14 @@ private:
     void MoveCamera(float timeStep);
 
     WeakPtr<SceneEditor3D> sceneEditor_;
-    WeakPtr<Scene> scene_;
-
-    // Camera
-    WeakPtr<Node> cameraNode_;
-    WeakPtr<Camera> camera_;
 
     float yaw_;
     float pitch_;
 
-    SharedPtr<View3D> view3D_;
-
-    View3DWidget* widget_;
-
-    WeakPtr<DebugRenderer> debugRenderer_;
-    WeakPtr<Octree> octree_;
-    WeakPtr<Node> selectedNode_;
+    SharedPtr<Camera> camera_;
+    SharedPtr<DebugRenderer> debugRenderer_;
+    SharedPtr<Octree> octree_;
+    SharedPtr<Node> selectedNode_;
 
 };
 

+ 0 - 69
Source/AtomicEditor/Source/Editors/SceneEditor3D/View3DWidget.cpp

@@ -1,69 +0,0 @@
-
-#include "AtomicEditor.h"
-
-#include <Atomic/UI/TBUI.h>
-#include "View3DWidget.h"
-
-namespace AtomicEditor
-{
-
-View3DWidget::View3DWidget()
-{
-    vertexData_.Resize(6 * UI_VERTEX_SIZE);
-    float color;
-    ((unsigned&)color) = 0xFFFFFFFF;
-
-    float* data = &vertexData_[0];
-
-    data[2] = 0; data[3] = color; data[4] = 0; data[5] = 0;
-    data[8] = 0; data[9] = color; data[10] = 1; data[11] = 0;
-    data[14] = 0; data[15] = color; data[16] = 1; data[17] = 1;
-    data[20] = 0; data[21] = color; data[22] = 0; data[23] = 0;
-    data[26] = 0; data[27] = color; data[28] = 1; data[29] = 1;
-    data[32] = 0; data[33] = color; data[34] = 0; data[35] = 1;
-}
-
-void View3DWidget::OnPaint(const PaintProps &paint_props)
-{
-    if (view3D_.Null())
-        return;
-
-    TBRect rect = GetRect();
-
-    ConvertToRoot(rect.x, rect.y);
-
-    IntVector2 size = view3D_->GetSize();
-
-    if (size.x_ != rect.w || size.y_ != rect.h)
-    {
-        size.x_ = rect.w;
-        size.y_ = rect.h;
-
-        view3D_->SetSize(size);
-    }
-
-    float* data = &vertexData_[0];
-
-    data[0] = rect.x;
-    data[1] = rect.y;
-
-    data[6] = rect.x + rect.w;
-    data[7] =  rect.y;
-
-    data[12] = rect.x + rect.w;
-    data[13] = rect.y + rect.h;
-
-    data[18] = rect.x;
-    data[19] = rect.y;
-
-    data[24] = rect.x + rect.w;
-    data[25] = rect.y + rect.h;
-
-    data[30] = rect.x;
-    data[31] = rect.y + rect.h;
-
-    tbui_->SubmitBatchVertexData(view3D_->GetRenderTexture(), vertexData_);
-
-}
-
-}

+ 0 - 37
Source/AtomicEditor/Source/Editors/SceneEditor3D/View3DWidget.h

@@ -1,37 +0,0 @@
-
-#pragma once
-
-#include <TurboBadger/tb_widgets.h>
-#include <Atomic/Graphics/Texture2D.h>
-#include <Atomic/UI/View3D.h>
-#include <Atomic/UI/TBUI.h>
-
-using namespace tb;
-using namespace Atomic;
-
-namespace  AtomicEditor
-{
-
-class View3DWidget : public TBWidget
-{
-public:
-    // For safe typecasting
-    TBOBJECT_SUBCLASS(View3DWidget, TBWidget);
-
-    View3DWidget();
-
-    void SetView3D(TBUI* tbui, View3D* view3D) { tbui_ = tbui, view3D_ = view3D; }
-
-    virtual void OnPaint(const PaintProps &paint_props);
-
-private:
-
-    WeakPtr<TBUI> tbui_;
-    SharedPtr<View3D> view3D_;
-
-    PODVector<float> vertexData_;
-
-};
-
-
-}

+ 200 - 0
Source/AtomicEditor/Source/UI/UIView3D.cpp

@@ -0,0 +1,200 @@
+// Portions Copyright (c) 2008-2015 the Urho3D project.
+
+// 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 <Atomic/UI/TBUI.h>
+#include <Atomic/IO/Log.h>
+#include <Atomic/Graphics/Graphics.h>
+#include <Atomic/Graphics/Camera.h>
+
+#include "UIView3D.h"
+
+#include "AEEvents.h"
+#include "AETypes.h"
+#include "AEEditor.h"
+
+using namespace tb;
+
+namespace AtomicEditor
+{
+
+
+View3D::View3D(Context* context) :
+    AEWidget(context),
+    rttFormat_(Graphics::GetRGBFormat()),
+    autoUpdate_(true),
+    size_(-1, -1)
+{
+    renderTexture_ = new Texture2D(context_);
+    depthTexture_ = new Texture2D(context_);
+    viewport_ = new Viewport(context_);
+
+    view3DWidget_ = new View3DWidget();
+    view3DWidget_->SetGravity(WIDGET_GRAVITY_ALL);
+    view3DWidget_->view3D_ = this;
+    delegate_->AddChild(view3DWidget_);
+}
+
+View3D::~View3D()
+{
+
+}
+
+bool View3D::OnEvent(const TBWidgetEvent &ev)
+{
+    return false;
+}
+
+
+void View3D::OnResize(const IntVector2 &newSize)
+{
+    if (newSize.x_ == size_.x_ && newSize.y_ == size_.y_)
+        return;
+
+    size_ = newSize;
+    int width = newSize.x_;
+    int height = newSize.y_;
+
+    if (width > 0 && height > 0)
+    {
+        renderTexture_->SetSize(width, height, rttFormat_, TEXTURE_RENDERTARGET);
+        depthTexture_->SetSize(width, height, Graphics::GetDepthStencilFormat(), TEXTURE_DEPTHSTENCIL);
+        RenderSurface* surface = renderTexture_->GetRenderSurface();
+        surface->SetViewport(0, viewport_);
+        surface->SetUpdateMode(autoUpdate_ ? SURFACE_UPDATEALWAYS : SURFACE_MANUALUPDATE);
+        surface->SetLinkedDepthStencil(depthTexture_->GetRenderSurface());
+
+        if (!autoUpdate_)
+            surface->QueueUpdate();
+    }
+}
+
+
+void View3D::SetView(Scene* scene, Camera* camera, bool ownScene)
+{
+    scene_ = scene;
+    cameraNode_ = camera ? camera->GetNode() : 0;
+
+    viewport_->SetScene(scene_);
+    viewport_->SetCamera(camera);
+    QueueUpdate();
+}
+
+void View3D::SetFormat(unsigned format)
+{
+    if (format != rttFormat_)
+    {
+        rttFormat_ = format;
+    }
+}
+
+void View3D::SetAutoUpdate(bool enable)
+{
+    if (enable != autoUpdate_)
+    {
+        autoUpdate_ = enable;
+        RenderSurface* surface = renderTexture_->GetRenderSurface();
+        if (surface)
+            surface->SetUpdateMode(autoUpdate_ ? SURFACE_UPDATEALWAYS : SURFACE_MANUALUPDATE);
+    }
+}
+
+void View3D::QueueUpdate()
+{
+    if (!autoUpdate_)
+    {
+        RenderSurface* surface = renderTexture_->GetRenderSurface();
+        if (surface)
+            surface->QueueUpdate();
+    }
+}
+
+Scene* View3D::GetScene() const
+{
+    return scene_;
+}
+
+Node* View3D::GetCameraNode() const
+{
+    return cameraNode_;
+}
+
+Texture2D* View3D::GetRenderTexture() const
+{
+    return renderTexture_;
+}
+
+Texture2D* View3D::GetDepthTexture() const
+{
+    return depthTexture_;
+}
+
+Viewport* View3D::GetViewport() const
+{
+    return viewport_;
+}
+
+View3DWidget::View3DWidget()
+{
+    vertexData_.Resize(6 * UI_VERTEX_SIZE);
+    float color;
+    ((unsigned&)color) = 0xFFFFFFFF;
+
+    float* data = &vertexData_[0];
+
+    data[2] = 0; data[3] = color; data[4] = 0; data[5] = 0;
+    data[8] = 0; data[9] = color; data[10] = 1; data[11] = 0;
+    data[14] = 0; data[15] = color; data[16] = 1; data[17] = 1;
+    data[20] = 0; data[21] = color; data[22] = 0; data[23] = 0;
+    data[26] = 0; data[27] = color; data[28] = 1; data[29] = 1;
+    data[32] = 0; data[33] = color; data[34] = 0; data[35] = 1;
+}
+
+void View3DWidget::OnPaint(const PaintProps &paint_props)
+{
+    if (view3D_.Null())
+        return;
+
+    TBRect rect = GetRect();
+
+    ConvertToRoot(rect.x, rect.y);
+
+    IntVector2 size = view3D_->GetSize();
+
+    if (size.x_ != rect.w || size.y_ != rect.h)
+    {
+        size.x_ = rect.w;
+        size.y_ = rect.h;
+        view3D_->OnResize(size);
+    }
+
+    float* data = &vertexData_[0];
+
+    data[0] = rect.x;
+    data[1] = rect.y;
+
+    data[6] = rect.x + rect.w;
+    data[7] =  rect.y;
+
+    data[12] = rect.x + rect.w;
+    data[13] = rect.y + rect.h;
+
+    data[18] = rect.x;
+    data[19] = rect.y;
+
+    data[24] = rect.x + rect.w;
+    data[25] = rect.y + rect.h;
+
+    data[30] = rect.x;
+    data[31] = rect.y + rect.h;
+
+    view3D_->GetSubsystem<TBUI>()->SubmitBatchVertexData(view3D_->GetRenderTexture(), vertexData_);
+
+}
+
+}
+

+ 107 - 0
Source/AtomicEditor/Source/UI/UIView3D.h

@@ -0,0 +1,107 @@
+// Portions Copyright (c) 2008-2015 the Urho3D project.
+
+// 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 <Atomic/Graphics/Texture2D.h>
+#include <Atomic/Graphics/Viewport.h>
+#include <Atomic/Scene/Scene.h>
+
+#include "AEWidget.h"
+
+using namespace Atomic;
+
+namespace AtomicEditor
+{
+
+class View3D;
+
+class View3DWidget : public TBWidget
+{
+    friend class View3D;
+
+public:
+    // For safe typecasting
+    TBOBJECT_SUBCLASS(View3DWidget, TBWidget);
+
+    View3DWidget();
+
+    virtual void OnPaint(const PaintProps &paint_props);
+
+private:
+
+    WeakPtr<View3D> view3D_;
+    PODVector<float> vertexData_;
+
+};
+
+
+class View3D : public AEWidget
+{
+    OBJECT(View3D);
+
+public:
+    /// Construct.
+    View3D(Context* context);
+    /// Destruct.
+    virtual ~View3D();
+
+    /// React to resize.
+    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);
+    /// Set render texture pixel format. Default is RGB.
+    void SetFormat(unsigned format);
+    /// Set render target auto update mode. Default is true.
+    void SetAutoUpdate(bool enable);
+    /// Queue manual update on the render texture.
+    void QueueUpdate();
+
+    /// Return render texture pixel format.
+    unsigned GetFormat() const { return rttFormat_; }
+    /// Return whether render target updates automatically.
+    bool GetAutoUpdate() const { return autoUpdate_; }
+    /// Return scene.
+    Scene* GetScene() const;
+    /// Return camera scene node.
+    Node* GetCameraNode() const;
+    /// Return render texture.
+    Texture2D* GetRenderTexture() const;
+    /// Return depth stencil texture.
+    Texture2D* GetDepthTexture() const;
+    /// Return viewport.
+    Viewport* GetViewport() const;
+
+    const IntVector2& GetSize() const { return size_; }
+
+    bool OnEvent(const TBWidgetEvent &ev);
+
+protected:
+
+    /// Renderable texture.
+    SharedPtr<Texture2D> renderTexture_;
+    /// Depth stencil texture.
+    SharedPtr<Texture2D> depthTexture_;
+    /// Viewport.
+    SharedPtr<Viewport> viewport_;
+    /// Scene.
+    SharedPtr<Scene> scene_;
+    /// Camera scene node.
+    SharedPtr<Node> cameraNode_;
+    /// Render texture format.
+    unsigned rttFormat_;
+    /// Render texture auto update mode.
+    bool autoUpdate_;
+
+    IntVector2 size_;
+
+    View3DWidget* view3DWidget_;
+
+
+};
+
+}