Browse Source

Merge pull request #251 from AtomicGameEngine/JME-ATOMIC-BUTTERFLIES

Tweaks from porting Atomic Butterflies
JoshEngebretson 10 years ago
parent
commit
d82097e08f

+ 26 - 7
Script/AtomicEditor/ui/frames/HierarchyFrame.ts

@@ -188,6 +188,7 @@ class HierarchyFrame extends Atomic.UIWidget {
 
 
         if (data.type == Atomic.UI_EVENT_TYPE_KEY_UP) {
         if (data.type == Atomic.UI_EVENT_TYPE_KEY_UP) {
 
 
+            // node deletion
             if (data.key == Atomic.KEY_DELETE || data.key == Atomic.KEY_BACKSPACE) {
             if (data.key == Atomic.KEY_DELETE || data.key == Atomic.KEY_BACKSPACE) {
 
 
                 var selectedId = Number(this.hierList.rootList.selectedItemID);
                 var selectedId = Number(this.hierList.rootList.selectedItemID);
@@ -202,9 +203,7 @@ class HierarchyFrame extends Atomic.UIWidget {
 
 
             }
             }
 
 
-        }
-
-        if (data.type == Atomic.UI_EVENT_TYPE_POINTER_DOWN) {
+        } else if (data.type == Atomic.UI_EVENT_TYPE_POINTER_DOWN) {
 
 
             if (data.target == this.hierList.rootList) {
             if (data.target == this.hierList.rootList) {
 
 
@@ -254,9 +253,11 @@ class HierarchyFrame extends Atomic.UIWidget {
 
 
             }
             }
 
 
-        }
+        } else if (data.type == Atomic.UI_EVENT_TYPE_CLICK) {
 
 
-        if (data.type == Atomic.UI_EVENT_TYPE_CLICK) {
+            if (this.menu.handleNodeContextMenu(data.target, data.refid)) {
+                return true;
+            }
 
 
             var id = data.target.id;
             var id = data.target.id;
 
 
@@ -264,7 +265,6 @@ class HierarchyFrame extends Atomic.UIWidget {
 
 
                 var selectedId = Number(this.hierList.rootList.selectedItemID);
                 var selectedId = Number(this.hierList.rootList.selectedItemID);
                 var node = this.scene.getNode(selectedId);
                 var node = this.scene.getNode(selectedId);
-
                 if (this.menu.handlePopupMenu(data.target, data.refid, node))
                 if (this.menu.handlePopupMenu(data.target, data.refid, node))
                     return true;
                     return true;
 
 
@@ -290,7 +290,6 @@ class HierarchyFrame extends Atomic.UIWidget {
 
 
                 if (node) {
                 if (node) {
 
 
-
                     this.sendEvent("EditorActiveNodeChange", { node: node });
                     this.sendEvent("EditorActiveNodeChange", { node: node });
 
 
                 }
                 }
@@ -298,6 +297,26 @@ class HierarchyFrame extends Atomic.UIWidget {
                 return false;
                 return false;
 
 
             }
             }
+        } else if (data.type == Atomic.UI_EVENT_TYPE_RIGHT_POINTER_UP) {
+
+            var id = data.target.id;
+            var db = ToolCore.getAssetDatabase();
+            var node: Atomic.Node;
+
+            if (id == "hierList_")
+                node = this.scene.getNode(Number(this.hierList.hoverItemID));
+            else
+                node = this.scene.getNode(Number(id));
+
+            if (node) {
+
+                this.menu.createNodeContextMenu(this, node, data.x, data.y);
+
+            }
+
+
+
+
         }
         }
 
 
         return false;
         return false;

+ 4 - 1
Script/AtomicEditor/ui/frames/ProjectFrame.ts

@@ -11,6 +11,7 @@ class ProjectFrame extends ScriptWidget {
     folderList: Atomic.UIListView;
     folderList: Atomic.UIListView;
     menu: ProjectFrameMenu;
     menu: ProjectFrameMenu;
     currentFolder: ToolCore.Asset;
     currentFolder: ToolCore.Asset;
+    resourceFolder: ToolCore.Asset;
     assetGUIDToItemID = {};
     assetGUIDToItemID = {};
     resourcesID: number = -1;
     resourcesID: number = -1;
 
 
@@ -90,6 +91,7 @@ class ProjectFrame extends ScriptWidget {
                 var id = folderList.addRootItem(asset.name, "Folder.icon", asset.guid);
                 var id = folderList.addRootItem(asset.name, "Folder.icon", asset.guid);
                 this.resourcesID = id;
                 this.resourcesID = id;
                 this.assetGUIDToItemID[asset.guid] = id;
                 this.assetGUIDToItemID[asset.guid] = id;
+                this.resourceFolder = asset;
 
 
             } else {
             } else {
                 var parentItemID = this.assetGUIDToItemID[parent.guid];
                 var parentItemID = this.assetGUIDToItemID[parent.guid];
@@ -308,13 +310,14 @@ class ProjectFrame extends ScriptWidget {
 
 
         this.folderList.rootList.value = 0;
         this.folderList.rootList.value = 0;
         this.folderList.setExpanded(this.resourcesID, true);
         this.folderList.setExpanded(this.resourcesID, true);
-        this.sendEvent(EditorEvents.ContentFolderChanged, { path: ToolCore.toolSystem.project.resourcePath });
+        this.refreshContent(this.resourceFolder);
 
 
     }
     }
 
 
     handleProjectUnloaded(data) {
     handleProjectUnloaded(data) {
 
 
         this.folderList.deleteAllItems();
         this.folderList.deleteAllItems();
+        this.resourceFolder = null;
 
 
         var container: Atomic.UILayout = <Atomic.UILayout> this.getWidget("contentcontainer");
         var container: Atomic.UILayout = <Atomic.UILayout> this.getWidget("contentcontainer");
         container.deleteAllChildren();
         container.deleteAllChildren();

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

@@ -59,7 +59,7 @@ class ResourceFrame extends ScriptWidget {
 
 
         var editor: Editor.ResourceEditor = null;
         var editor: Editor.ResourceEditor = null;
 
 
-        if (ext == ".js") {
+        if (ext == ".js" || ext == ".txt") {
 
 
             editor = new Editor.JSResourceEditor(path, this.tabcontainer);
             editor = new Editor.JSResourceEditor(path, this.tabcontainer);
 
 

+ 14 - 0
Script/AtomicEditor/ui/frames/inspector/InspectorFrame.ts

@@ -26,6 +26,7 @@ class InspectorFrame extends ScriptWidget {
         this.subscribeToEvent(EditorEvents.EditResource, (data) => this.handleEditResource(data));
         this.subscribeToEvent(EditorEvents.EditResource, (data) => this.handleEditResource(data));
         this.subscribeToEvent(EditorEvents.ActiveNodeChange, (data) => this.handleActiveNodeChange(data));
         this.subscribeToEvent(EditorEvents.ActiveNodeChange, (data) => this.handleActiveNodeChange(data));
         this.subscribeToEvent("ProjectUnloaded", (data) => this.handleProjectUnloaded(data));
         this.subscribeToEvent("ProjectUnloaded", (data) => this.handleProjectUnloaded(data));
+        this.subscribeToEvent("NodeRemoved", (ev: Atomic.NodeRemovedEvent) => this.handleNodeRemoved(ev));
 
 
 
 
     }
     }
@@ -111,6 +112,19 @@ class InspectorFrame extends ScriptWidget {
 
 
     }
     }
 
 
+    handleNodeRemoved(ev: Atomic.NodeRemovedEvent) {
+
+        if (this.inspectingNode != ev.node)
+            return;
+
+        this.inspectNode = null;
+
+        var container = this.getWidget("inspectorcontainer");
+        container.deleteAllChildren();
+
+    }
+
+
     inspectNode(node: Atomic.Node) {
     inspectNode(node: Atomic.Node) {
 
 
         if (!node) return;
         if (!node) return;

+ 1 - 1
Script/AtomicEditor/ui/frames/inspector/NodeInspector.ts

@@ -12,7 +12,7 @@ class NodeInspector extends ScriptWidget {
 
 
         this.subscribeToEvent(this, "WidgetEvent", (ev) => this.handleWidgetEvent(ev));
         this.subscribeToEvent(this, "WidgetEvent", (ev) => this.handleWidgetEvent(ev));
         this.subscribeToEvent("GizmoMoved", (ev) => this.handleGizmoModed(ev));
         this.subscribeToEvent("GizmoMoved", (ev) => this.handleGizmoModed(ev));
-        this.subscribeToEvent("Update", (ev) => this.handleUpdate(ev));
+        this.subscribeToEvent("Update", (ev) => this.handleUpdate(ev));        
 
 
     }
     }
 
 

+ 55 - 3
Script/AtomicEditor/ui/frames/menus/HierarchyFrameMenu.ts

@@ -11,6 +11,7 @@ class HierarchyFrameMenus extends Atomic.ScriptObject {
         super();
         super();
 
 
         MenuItemSources.createMenuItemSource("hierarchy create items", createItems);
         MenuItemSources.createMenuItemSource("hierarchy create items", createItems);
+        MenuItemSources.createMenuItemSource("node context general", nodeGeneralContextItems);
 
 
         this.subscribeToEvent(EditorEvents.ContentFolderChanged, (ev: EditorEvents.ContentFolderChangedEvent) => {
         this.subscribeToEvent(EditorEvents.ContentFolderChanged, (ev: EditorEvents.ContentFolderChangedEvent) => {
             this.contentFolder = ev.path;
             this.contentFolder = ev.path;
@@ -20,11 +21,11 @@ class HierarchyFrameMenus extends Atomic.ScriptObject {
 
 
     handlePopupMenu(target: Atomic.UIWidget, refid: string, node: Atomic.Node): boolean {
     handlePopupMenu(target: Atomic.UIWidget, refid: string, node: Atomic.Node): boolean {
 
 
-        if (!target || !refid) return;
+        if (!target || !refid) return false;
 
 
         if (target.id == "create popup") {
         if (target.id == "create popup") {
 
 
-            var child:Atomic.Node;
+            var child: Atomic.Node;
 
 
             if (refid == "create_node") {
             if (refid == "create_node") {
 
 
@@ -49,7 +50,7 @@ class HierarchyFrameMenus extends Atomic.ScriptObject {
 
 
             if (child) {
             if (child) {
 
 
-              this.sendEvent(EditorEvents.ActiveNodeChange, { node: child });
+                this.sendEvent(EditorEvents.ActiveNodeChange, { node: child });
 
 
             }
             }
 
 
@@ -61,6 +62,51 @@ class HierarchyFrameMenus extends Atomic.ScriptObject {
 
 
     }
     }
 
 
+    handleNodeContextMenu(target: Atomic.UIWidget, refid: string): boolean {
+
+        if (target.id == "node context menu") {
+
+            var node = <Atomic.Node> target['node'];
+
+            if (!node) {
+                return false;
+            }
+
+            if (refid == "delete_node") {
+
+              node.removeAllComponents();
+              node.remove();
+
+            } else if (refid == "duplicate_node") {
+
+                var newnode = node.clone();
+                this.sendEvent(EditorEvents.ActiveNodeChange, { node: newnode });
+
+            }
+
+            return true;
+        }
+
+        return false;
+
+    }
+
+
+    createNodeContextMenu(parent: Atomic.UIWidget, node: Atomic.Node, x: number, y: number) {
+
+
+        var menu = new Atomic.UIMenuWindow(parent, "node context menu");
+
+        menu['node'] = node;
+
+        var srcName: string = "node context general";
+
+        var src = MenuItemSources.getMenuItemSource(srcName);
+        menu.show(src, x, y);
+
+
+    }
+
     contentFolder: string;
     contentFolder: string;
 
 
 }
 }
@@ -77,3 +123,9 @@ var createItems = {
         Light: ["create_light", undefined, "JavascriptBitmap"]
         Light: ["create_light", undefined, "JavascriptBitmap"]
     }
     }
 };
 };
+
+var nodeGeneralContextItems = {
+    "Duplicate": ["duplicate_node", undefined, ""],
+    "-1": null,
+    "Delete": ["delete_node", undefined, ""]
+};

+ 3 - 1
Script/AtomicEditor/ui/frames/menus/ProjectFrameMenu.ts

@@ -20,7 +20,7 @@ class ProjectFrameMenus extends Atomic.ScriptObject {
 
 
     }
     }
 
 
-    handleAssetContextMenu(target: Atomic.UIWidget, refid: string) {
+    handleAssetContextMenu(target: Atomic.UIWidget, refid: string):boolean {
 
 
         if (target.id == "asset context menu" || target.id == "create popup") {
         if (target.id == "asset context menu" || target.id == "create popup") {
 
 
@@ -70,6 +70,8 @@ class ProjectFrameMenus extends Atomic.ScriptObject {
             }
             }
         }
         }
 
 
+        return false;
+
     }
     }
 
 
     createFolderContextMenu(parent: Atomic.UIWidget, id: string, folder: ToolCore.Asset, x: number, y: number) {
     createFolderContextMenu(parent: Atomic.UIWidget, id: string, folder: ToolCore.Asset, x: number, y: number) {

+ 1 - 1
Script/Packages/Atomic/Audio.json

@@ -1,7 +1,7 @@
 {
 {
 	"name" : "Audio",
 	"name" : "Audio",
 	"sources" : ["Source/Atomic/Audio"],
 	"sources" : ["Source/Atomic/Audio"],
-	"classes" : ["Sound", "SoundSource"],
+	"classes" : ["Sound", "SoundSource", "SoundSource3D", "SoundListener"],
 	"overloads" : {
 	"overloads" : {
 		"SoundSource" : {
 		"SoundSource" : {
 			"Play" : ["Sound"]
 			"Play" : ["Sound"]

+ 20 - 2
Source/Atomic/Atomic2D/ParticleEmitter2D.cpp

@@ -362,8 +362,26 @@ bool ParticleEmitter2D::EmitParticle(const Vector3& worldPosition, float worldAn
     particle.size_ = startSize;
     particle.size_ = startSize;
     particle.sizeDelta_ = (finishSize - startSize) * invLifespan;
     particle.sizeDelta_ = (finishSize - startSize) * invLifespan;
 
 
-    particle.color_ = effect_->GetStartColor() + effect_->GetStartColorVariance() * Random(-1.0f, 1.0f);
-    Color endColor = effect_->GetFinishColor() + effect_->GetFinishColorVariance() * Random(-1.0f, 1.0f);
+    // ATOMIC BEGIN
+
+    const Color& startColor = effect_->GetStartColor();
+    const Color& startColorVariance = effect_->GetStartColorVariance();
+    const Color& finishColor = effect_->GetFinishColor();
+    const Color& finishColorVariance = effect_->GetFinishColorVariance();
+
+    particle.color_.r_  = startColor.r_ + startColorVariance.r_ * Random(-1.0f, 1.0f);
+    particle.color_.g_  = startColor.g_ + startColorVariance.g_ * Random(-1.0f, 1.0f);
+    particle.color_.b_  = startColor.b_ + startColorVariance.b_ * Random(-1.0f, 1.0f);
+    particle.color_.a_  = startColor.a_ + startColorVariance.a_ * Random(-1.0f, 1.0f);
+
+    Color endColor;
+    endColor.r_ = finishColor.r_ + finishColorVariance.r_ * Random(-1.0f, 1.0f);
+    endColor.g_ = finishColor.g_ + finishColorVariance.g_ * Random(-1.0f, 1.0f);
+    endColor.b_ = finishColor.b_ + finishColorVariance.b_ * Random(-1.0f, 1.0f);
+    endColor.a_ = finishColor.a_ + finishColorVariance.a_ * Random(-1.0f, 1.0f);
+
+    // ATOMIC END
+
     particle.colorDelta_ = (endColor - particle.color_) * invLifespan;
     particle.colorDelta_ = (endColor - particle.color_) * invLifespan;
 
 
     particle.rotation_ = worldAngle + effect_->GetRotationStart() + effect_->GetRotationStartVariance() * Random(-1.0f, 1.0f);
     particle.rotation_ = worldAngle + effect_->GetRotationStart() + effect_->GetRotationStartVariance() * Random(-1.0f, 1.0f);

+ 39 - 4
Source/Atomic/UI/UIEditField.cpp

@@ -38,6 +38,17 @@ void UIEditField::SetReadOnly(bool readonly)
 
 
 }
 }
 
 
+void UIEditField::SetMultiline(bool multiline)
+{
+    if (!widget_)
+        return;
+
+    TBEditField* w = (TBEditField*) widget_;
+
+    w->SetMultiline(multiline);
+
+}
+
 void UIEditField::SetWrapping(bool wrap)
 void UIEditField::SetWrapping(bool wrap)
 {
 {
     if (!widget_)
     if (!widget_)
@@ -95,7 +106,31 @@ void UIEditField::AppendText(const String& text)
 
 
 }
 }
 
 
-void UIEditField::SetTextAlign(TEXT_ALIGN align)
+void UIEditField::SetAdaptToContentSize(bool adapt)
+{
+    if (!widget_)
+        return;
+
+    TBEditField* w = (TBEditField*) widget_;
+
+    w->SetAdaptToContentSize(adapt);
+
+}
+
+bool UIEditField::GetAdaptToContentSize() const
+{
+    if (!widget_)
+        return false;
+
+    // safe cast?
+    TBEditField* w = (TBEditField*) widget_;
+
+    return w->GetAdaptToContentSize();
+
+}
+
+
+void UIEditField::SetTextAlign(UI_TEXT_ALIGN align)
 {
 {
     if (!widget_)
     if (!widget_)
         return;
         return;
@@ -105,13 +140,13 @@ void UIEditField::SetTextAlign(TEXT_ALIGN align)
 
 
     switch (align)
     switch (align)
     {
     {
-        case TEXT_ALIGN_CENTER:
+        case UI_TEXT_ALIGN_CENTER:
             w->SetTextAlign(TB_TEXT_ALIGN_CENTER);
             w->SetTextAlign(TB_TEXT_ALIGN_CENTER);
             break;
             break;
-        case TEXT_ALIGN_LEFT:
+        case UI_TEXT_ALIGN_LEFT:
             w->SetTextAlign(TB_TEXT_ALIGN_LEFT);
             w->SetTextAlign(TB_TEXT_ALIGN_LEFT);
             break;
             break;
-        case TEXT_ALIGN_RIGHT:
+        case UI_TEXT_ALIGN_RIGHT:
             w->SetTextAlign(TB_TEXT_ALIGN_RIGHT);
             w->SetTextAlign(TB_TEXT_ALIGN_RIGHT);
             break;
             break;
     }
     }

+ 5 - 8
Source/Atomic/UI/UIEditField.h

@@ -8,13 +8,6 @@
 namespace Atomic
 namespace Atomic
 {
 {
 
 
-enum TEXT_ALIGN
-{
-    TEXT_ALIGN_LEFT,		///< Aligned left
-    TEXT_ALIGN_RIGHT,	///< Aligned right
-    TEXT_ALIGN_CENTER	///< Aligned center
-};
-
 enum UI_EDIT_TYPE {
 enum UI_EDIT_TYPE {
     UI_EDIT_TYPE_TEXT = tb::EDIT_TYPE_TEXT,
     UI_EDIT_TYPE_TEXT = tb::EDIT_TYPE_TEXT,
     UI_EDIT_TYPE_SEARCH = tb::EDIT_TYPE_SEARCH,
     UI_EDIT_TYPE_SEARCH = tb::EDIT_TYPE_SEARCH,
@@ -36,11 +29,15 @@ public:
 
 
     void AppendText(const String& text);
     void AppendText(const String& text);
 
 
-    void SetTextAlign(TEXT_ALIGN align);
+    void SetTextAlign(UI_TEXT_ALIGN align);
+
+    void SetAdaptToContentSize(bool adapt);
+    bool GetAdaptToContentSize() const;
 
 
     void SetEditType(UI_EDIT_TYPE type);
     void SetEditType(UI_EDIT_TYPE type);
 
 
     void SetReadOnly(bool readonly);
     void SetReadOnly(bool readonly);
+    void SetMultiline(bool multiline);
 
 
     void ScrollTo(int x, int y);
     void ScrollTo(int x, int y);
 
 

+ 0 - 8
Source/Atomic/UI/UITextField.h

@@ -6,14 +6,6 @@
 namespace Atomic
 namespace Atomic
 {
 {
 
 
-/// TB_TEXT_ALIGN specifies horizontal text alignment
-enum UI_TEXT_ALIGN
-{
-    UI_TEXT_ALIGN_LEFT = tb::TB_TEXT_ALIGN_LEFT,
-    UI_TEXT_ALIGN_RIGHT = tb::TB_TEXT_ALIGN_RIGHT,
-    UI_TEXT_ALIGN_CENTER = tb::TB_TEXT_ALIGN_CENTER
-};
-
 class UITextField : public UIWidget
 class UITextField : public UIWidget
 {
 {
     OBJECT(UITextField)
     OBJECT(UITextField)

+ 8 - 0
Source/Atomic/UI/UIWidget.h

@@ -101,6 +101,14 @@ enum UI_WIDGET_Z_REL {
     UI_WIDGET_Z_REL_AFTER = tb::WIDGET_Z_REL_AFTER			///< After the reference widget (visually above reference).
     UI_WIDGET_Z_REL_AFTER = tb::WIDGET_Z_REL_AFTER			///< After the reference widget (visually above reference).
 };
 };
 
 
+/// TB_TEXT_ALIGN specifies horizontal text alignment
+enum UI_TEXT_ALIGN
+{
+    UI_TEXT_ALIGN_LEFT = tb::TB_TEXT_ALIGN_LEFT,
+    UI_TEXT_ALIGN_RIGHT = tb::TB_TEXT_ALIGN_RIGHT,
+    UI_TEXT_ALIGN_CENTER = tb::TB_TEXT_ALIGN_CENTER
+};
+
 class UIView;
 class UIView;
 class UILayoutParams;
 class UILayoutParams;
 class UIFontDescription;
 class UIFontDescription;

+ 5 - 0
Source/ToolCore/Assets/Asset.cpp

@@ -18,6 +18,7 @@
 #include "SpriterImporter.h"
 #include "SpriterImporter.h"
 #include "TMXImporter.h"
 #include "TMXImporter.h"
 #include "PEXImporter.h"
 #include "PEXImporter.h"
+#include "TextImporter.h"
 
 
 #include "AssetEvents.h"
 #include "AssetEvents.h"
 #include "Asset.h"
 #include "Asset.h"
@@ -280,6 +281,10 @@ bool Asset::CreateImporter()
         {
         {
             importer_ = new PEXImporter(context_, this);
             importer_ = new PEXImporter(context_, this);
         }
         }
+        else if (ext == ".txt")
+        {
+            importer_ = new TextImporter(context_, this);
+        }
         else if (textureFormats.Contains(ext))
         else if (textureFormats.Contains(ext))
         {
         {
             importer_ = new TextureImporter(context_, this);
             importer_ = new TextureImporter(context_, this);

+ 54 - 0
Source/ToolCore/Assets/TextImporter.cpp

@@ -0,0 +1,54 @@
+
+#include <Atomic/Resource/ResourceCache.h>
+#include <Atomic/Audio/Sound.h>
+
+#include "Asset.h"
+#include "AssetDatabase.h"
+#include "TextImporter.h"
+
+namespace ToolCore
+{
+
+TextImporter::TextImporter(Context* context, Asset *asset) : AssetImporter(context, asset)
+{
+
+}
+
+TextImporter::~TextImporter()
+{
+
+}
+
+void TextImporter::SetDefaults()
+{
+    AssetImporter::SetDefaults();
+}
+
+bool TextImporter::Import()
+{
+    return true;
+}
+
+bool TextImporter::LoadSettingsInternal()
+{
+    if (!AssetImporter::LoadSettingsInternal())
+        return false;
+
+    JSONValue import = jsonRoot_.GetChild("TextImporter", JSON_OBJECT);
+
+    return true;
+}
+
+bool TextImporter::SaveSettingsInternal()
+{
+    if (!AssetImporter::SaveSettingsInternal())
+        return false;
+
+    JSONValue import = jsonRoot_.CreateChild("TextImporter");
+
+    return true;
+}
+
+
+
+}

+ 29 - 0
Source/ToolCore/Assets/TextImporter.h

@@ -0,0 +1,29 @@
+
+#pragma once
+
+#include "AssetImporter.h"
+
+namespace ToolCore
+{
+
+class TextImporter : public AssetImporter
+{
+    OBJECT(TextImporter);
+
+public:
+    /// Construct.
+    TextImporter(Context* context, Asset* asset);
+    virtual ~TextImporter();
+
+    virtual void SetDefaults();
+
+protected:
+
+    bool Import();
+
+    virtual bool LoadSettingsInternal();
+    virtual bool SaveSettingsInternal();
+
+};
+
+}