Browse Source

Merge pull request #216 from AtomicGameEngine/JME-ATOMIC-214

ATOMIC-214 (with bonus)
JoshEngebretson 10 years ago
parent
commit
3379d404d0

+ 1 - 1
Resources/EditorData/AtomicEditor/templates/template_component.js

@@ -14,4 +14,4 @@ var component = function (self) {
 
 }
 
-module.exports = component;
+exports.component = component;

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

@@ -23,6 +23,8 @@ class Editor extends Atomic.ScriptObject {
 
         Editor.instance = this;
 
+        this.initUI();
+
         this.editorLicense = new EditorLicense();
 
         Preferences.getInstance().read();
@@ -46,6 +48,16 @@ class Editor extends Atomic.ScriptObject {
         this.parseArguments();
     }
 
+    initUI() {
+
+      var ui = Atomic.ui;
+      ui.loadSkin("AtomicEditor/resources/default_skin/skin.tb.txt", "AtomicEditor/editor/skin/skin.tb.txt");
+      ui.addFont("AtomicEditor/resources/vera.ttf", "Vera");
+      ui.addFont("AtomicEditor/resources/MesloLGS-Regular.ttf", "Monaco");
+      ui.setDefaultFont("Vera", 12);
+
+    }
+
     handleEditorLoadProject(event: EditorEvents.LoadProjectEvent): boolean {
 
         var system = ToolCore.getToolSystem();

+ 1 - 0
Script/AtomicEditor/ui/frames/inspector/CreateComponentButton.ts

@@ -12,6 +12,7 @@ var _2DCreateSource = new Atomic.UIMenuItemSource();
 _2DCreateSource.addItem(new Atomic.UIMenuItem("PhysicsWorld2D", "PhysicsWorld2D"));
 _2DCreateSource.addItem(new Atomic.UIMenuItem("StaticSprite2D", "StaticSprite2D"));
 _2DCreateSource.addItem(new Atomic.UIMenuItem("AnimatedSprite2D", "AnimatedSprite2D"));
+_2DCreateSource.addItem(new Atomic.UIMenuItem("ParticleEmitter2D", "ParticleEmitter2D"));
 _2DCreateSource.addItem(new Atomic.UIMenuItem("PointLight2D", "PointLight2D"));
 _2DCreateSource.addItem(new Atomic.UIMenuItem("DirectionalLight2D", "DirectionalLight2D"));
 _2DCreateSource.addItem(new Atomic.UIMenuItem("RigidBody2D", "RigidBody2D"));

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

@@ -3,7 +3,7 @@
 	"sources" : ["Source/Atomic/UI"],
 	"includes" : ["<Atomic/Graphics/Material.h>", "<Atomic/Scene/Node.h>", "<Atomic/Scene/Scene.h>", "<Atomic/Graphics/Texture2D.h>",
 								"<Atomic/UI/UIBatch.h>"],
-	"classes" : ["UIWidget", "UILayout", "UIView", "UIWindow", "UIButton", "UITextField",
+	"classes" : ["UI", "UIWidget", "UILayout", "UIView", "UIWindow", "UIButton", "UITextField",
 								"UISelectItem", "UISelectItemSource", "UIMenuWindow", "UIEditField",
 								"UIImageWidget", "UIClickLabel", "UICheckBox", "UIMenuItem", "UIMenuItemSource",
 								"UISelectList", "UIListView", "UIMessageWindow", "UILayoutParams", "UIFontDescription",

+ 1 - 1
Script/Packages/ToolCore/ToolCore.json

@@ -5,7 +5,7 @@
 	"classes" : ["ToolEnvironment", "ToolSystem", "Project", "ProjectFile", "Platform", "PlatformMac", "PlatformWeb",
 							 "PlatformWindows", "Command", "PlayCmd", "OpenAssetImporter",
 							 "Asset", "AssetDatabase", "AssetImporter", "AudioImporter", "ModelImporter", "MaterialImporter", "AnimationImportInfo",
-							 "PrefabImporter", "JavascriptImporter", "TextureImporter", "SpriterImporter", "LicenseSystem"],
+							 "PrefabImporter", "JavascriptImporter", "TextureImporter", "SpriterImporter", "PEXImporter", "LicenseSystem"],
 	"typescript_decl" : {
 
 		"AssetDatabase" : [

+ 2 - 0
Script/TypeScript/AtomicWork.d.ts

@@ -18,6 +18,7 @@ declare module Atomic {
     export var input: Input;
     export var fileSystem: FileSystem;
     export var network: Network;
+    export var ui: UI;
 
     export var editorMode: Editor.EditorMode;
 
@@ -182,6 +183,7 @@ declare module Atomic {
     export function getResourceCache(): ResourceCache;
     export function getRenderer(): Atomic.Renderer;
     export function getNetwork(): Atomic.Network;
+    export function getUI(): Atomic.UI;
 
     export function assert();
     export function js_module_read_file(path: string);

+ 11 - 2
Source/Atomic/UI/UI.cpp

@@ -79,7 +79,8 @@ UI::UI(Context* context) :
     rootWidget_(0),
     inputDisabled_(false),
     keyboardDisabled_(false),
-    initialized_(false)
+    initialized_(false),
+    skinLoaded_(false)
 {
 
 }
@@ -163,8 +164,16 @@ void UI::Initialize(const String& languageFile)
 
 void UI::LoadSkin(const String& skin, const String& overrideSkin)
 {
-    // Load the default skin, and override skin
+    // Load the default skin, and override skin (if any)
     tb::g_tb_skin->Load(skin.CString(), overrideSkin.CString());
+    skinLoaded_ = true;
+}
+
+void UI::LoadDefaultPlayerSkin()
+{
+    LoadSkin("DefaultUI/skin/skin.tb.txt");
+    AddFont("DefaultUI/fonts/vera.ttf", "Vera");
+    SetDefaultFont("Vera", 12);
 }
 
 void UI::SetDefaultFont(const String& name, int size)

+ 5 - 0
Source/Atomic/UI/UI.h

@@ -39,6 +39,10 @@ public:
     void Shutdown();
 
     void LoadSkin(const String& skin, const String& overrideSkin = String::EMPTY);
+    bool GetSkinLoaded() { return skinLoaded_; }
+    void LoadDefaultPlayerSkin();
+
+
     void AddFont(const String& fontFile, const String &name);
     void SetDefaultFont(const String& name, int size);
 
@@ -91,6 +95,7 @@ private:
     bool inputDisabled_;
     bool keyboardDisabled_;
     bool initialized_;
+    bool skinLoaded_;
 
     // Events
     void HandleScreenMode(StringHash eventType, VariantMap& eventData);

+ 0 - 4
Source/AtomicEditor/Application/AEEditorApp.cpp

@@ -56,10 +56,6 @@ void AEEditorApp::Start()
     // move UI initialization to JS
     UI* ui = GetSubsystem<UI>();
     ui->Initialize("AtomicEditor/resources/language/lng_en.tb.txt");
-    ui->LoadSkin("AtomicEditor/resources/default_skin/skin.tb.txt", "AtomicEditor/editor/skin/skin.tb.txt");
-    ui->AddFont("AtomicEditor/resources/vera.ttf", "Vera");
-    ui->AddFont("AtomicEditor/resources/MesloLGS-Regular.ttf", "Monaco");
-    ui->SetDefaultFont("Vera", 12);
 
     SubscribeToEvent(E_JSERROR, HANDLER(AEEditorApp, HandleJSError));
     SubscribeToEvent(E_EXITREQUESTED, HANDLER(AEEditorApp, HandleExitRequested));

+ 5 - 0
Source/AtomicEditor/Application/AEPlayerApp.cpp

@@ -30,6 +30,7 @@
 #include <Atomic/Core/ProcessUtils.h>
 #include <Atomic/Resource/ResourceCache.h>
 #include <Atomic/Resource/ResourceEvents.h>
+#include <Atomic/UI/UI.h>
 
 // Move me
 #include <Atomic/Environment/Environment.h>
@@ -150,6 +151,10 @@ void AEPlayerApplication::Start()
 {
     AEEditorCommon::Start();
 
+    UI* ui = GetSubsystem<UI>();
+    ui->Initialize("DefaultUI/language/lng_en.tb.txt");
+    ui->LoadDefaultPlayerSkin();
+
     context_->RegisterSubsystem(new PlayerMode(context_));
     PlayerMode* playerMode = GetSubsystem<PlayerMode>();
     playerMode->ProcessArguments();

+ 16 - 1
Source/AtomicJS/Javascript/JSAtomic.cpp

@@ -10,6 +10,7 @@
 #include <Atomic/Graphics/Renderer.h>
 #include <Atomic/Graphics/Graphics.h>
 #include <Atomic/Engine/Engine.h>
+#include <Atomic/UI/UI.h>
 
 #ifdef ATOMIC_NETWORK
 #include <Atomic/Network/Network.h>
@@ -156,6 +157,14 @@ static int js_atomic_GetNetwork(duk_context* ctx)
 }
 #endif
 
+static int js_atomic_GetUI(duk_context* ctx)
+{
+    JSVM* vm = JSVM::GetJSVM(ctx);
+    js_push_class_object_instance(ctx, vm->GetSubsystem<UI>());
+    return 1;
+}
+
+
 static int js_atomic_script(duk_context* ctx)
 {
     JSVM* vm = JSVM::GetJSVM(ctx);
@@ -361,7 +370,13 @@ void jsapi_init_atomic(JSVM* vm)
     duk_put_prop_string(ctx, -2, "network");
 #endif
 
-    // end filesystems
+    duk_push_c_function(ctx, js_atomic_GetUI, 0);
+    duk_put_prop_string(ctx, -2, "getUI");
+
+    js_push_class_object_instance(ctx, vm->GetSubsystem<UI>(), "UI");
+    duk_put_prop_string(ctx, -2, "ui");
+
+    // end subsystems
 
     duk_push_c_function(ctx, js_atomic_script, 1);
     duk_put_prop_string(ctx, -2, "script");

+ 3 - 151
Source/AtomicJS/Javascript/JSUIAPI.cpp

@@ -147,32 +147,13 @@ int UI_DebugShowSettingsWindow(duk_context* ctx)
     return 0;
 }
 
-int UI_Init(duk_context* ctx)
-{
-    JSVM* vm = JSVM::GetJSVM(ctx);
-    UI* ui = vm->GetSubsystem<UI>();
-
-    // TODO: take a config object
-    ui->Initialize("DefaultUI/language/lng_en.tb.txt");
-    ui->LoadSkin("DefaultUI/skin/skin.tb.txt", "Skin/skin.ui.txt");
-    ui->AddFont("DefaultUI/fonts/vera.ttf", "Vera");
-
-    ui->SetDefaultFont("Vera", 12);
-
-    return 0;
-}
-
 void jsapi_init_ui(JSVM* vm)
 {
     duk_context* ctx = vm->GetJSContext();
 
-    // UI object
+    // UI class object
     duk_get_global_string(ctx, "Atomic");
-
-    duk_push_object(ctx);
-
-    duk_push_c_function(ctx, UI_Init, DUK_VARARGS);
-    duk_put_prop_string(ctx, -2, "__init");
+    duk_get_prop_string(ctx, -1, "UI");
 
     duk_push_c_function(ctx, UI_DebugGetWrappedWidgetCount, 0);
     duk_put_prop_string(ctx, -2, "debugGetWrappedWidgetCount");
@@ -183,136 +164,7 @@ void jsapi_init_ui(JSVM* vm)
     duk_push_c_function(ctx, UI_DebugShowSettingsWindow, 1);
     duk_put_prop_string(ctx, -2, "debugShowSettingsWindow");
 
-
-    // Layout
-
-    duk_push_number(ctx, (double) tb::WIDGET_GRAVITY_NONE);
-    duk_put_prop_string(ctx, -2, "GRAVITY_NONE");
-    duk_push_number(ctx, (double) tb::WIDGET_GRAVITY_LEFT);
-    duk_put_prop_string(ctx, -2, "GRAVITY_LEFT");
-    duk_push_number(ctx, (double) tb::WIDGET_GRAVITY_RIGHT);
-    duk_put_prop_string(ctx, -2, "GRAVITY_RIGHT");
-    duk_push_number(ctx, (double) tb::WIDGET_GRAVITY_TOP);
-    duk_put_prop_string(ctx, -2, "GRAVITY_TOP");
-    duk_push_number(ctx, (double) tb::WIDGET_GRAVITY_BOTTOM);
-    duk_put_prop_string(ctx, -2, "GRAVITY_BOTTOM");
-    duk_push_number(ctx, (double) tb::WIDGET_GRAVITY_LEFT_RIGHT);
-    duk_put_prop_string(ctx, -2, "GRAVITY_LEFT_RIGHT");
-    duk_push_number(ctx, (double) tb::WIDGET_GRAVITY_TOP_BOTTOM);
-    duk_put_prop_string(ctx, -2, "GRAVITY_TOP_BOTTOM");
-    duk_push_number(ctx, (double) tb::WIDGET_GRAVITY_ALL);
-    duk_put_prop_string(ctx, -2, "GRAVITY_ALL");
-    duk_push_number(ctx, (double) tb::WIDGET_GRAVITY_DEFAULT);
-    duk_put_prop_string(ctx, -2, "GRAVITY_DEFAULT");
-
-    duk_push_number(ctx, (double) tb::AXIS_X);
-    duk_put_prop_string(ctx, -2, "AXIS_X");
-    duk_push_number(ctx, (double) tb::AXIS_Y);
-    duk_put_prop_string(ctx, -2, "AXIS_Y");
-
-    duk_push_number(ctx, (double) tb::LAYOUT_SIZE_GRAVITY);
-    duk_put_prop_string(ctx, -2, "LAYOUT_SIZE_GRAVITY");
-    duk_push_number(ctx, (double) tb::LAYOUT_SIZE_PREFERRED);
-    duk_put_prop_string(ctx, -2, "LAYOUT_SIZE_PREFERRED");
-    duk_push_number(ctx, (double) tb::LAYOUT_SIZE_AVAILABLE);
-    duk_put_prop_string(ctx, -2, "LAYOUT_SIZE_AVAILABLE");
-
-    duk_push_number(ctx, (double) tb::LAYOUT_DISTRIBUTION_PREFERRED);
-    duk_put_prop_string(ctx, -2, "LAYOUT_DISTRIBUTION_PREFERRED");
-    duk_push_number(ctx, (double) tb::LAYOUT_DISTRIBUTION_AVAILABLE);
-    duk_put_prop_string(ctx, -2, "LAYOUT_DISTRIBUTION_AVAILABLE");
-    duk_push_number(ctx, (double) tb::LAYOUT_DISTRIBUTION_GRAVITY);
-    duk_put_prop_string(ctx, -2, "LAYOUT_DISTRIBUTION_GRAVITY");
-
-    duk_push_number(ctx, (double) tb::LAYOUT_POSITION_CENTER);
-    duk_put_prop_string(ctx, -2, "LAYOUT_POSITION_CENTER");
-    duk_push_number(ctx, (double) tb::LAYOUT_POSITION_LEFT_TOP);
-    duk_put_prop_string(ctx, -2, "LAYOUT_POSITION_LEFT_TOP");
-    duk_push_number(ctx, (double) tb::LAYOUT_POSITION_RIGHT_BOTTOM);
-    duk_put_prop_string(ctx, -2, "LAYOUT_POSITION_RIGHT_BOTTOM");
-    duk_push_number(ctx, (double) tb::LAYOUT_POSITION_GRAVITY);
-    duk_put_prop_string(ctx, -2, "LAYOUT_POSITION_GRAVITY");
-
-    duk_push_number(ctx, (double) tb::LAYOUT_DISTRIBUTION_POSITION_CENTER);
-    duk_put_prop_string(ctx, -2, "LAYOUT_DISTRIBUTION_POSITION_CENTER");
-    duk_push_number(ctx, (double) tb::LAYOUT_DISTRIBUTION_POSITION_LEFT_TOP);
-    duk_put_prop_string(ctx, -2, "LAYOUT_DISTRIBUTION_POSITION_LEFT_TOP");
-    duk_push_number(ctx, (double) tb::LAYOUT_DISTRIBUTION_POSITION_RIGHT_BOTTOM);
-    duk_put_prop_string(ctx, -2, "LAYOUT_DISTRIBUTION_POSITION_RIGHT_BOTTOM");
-
-    // Window Settings
-    duk_push_number(ctx, (double) tb::WINDOW_SETTINGS_NONE);
-    duk_put_prop_string(ctx, -2, "WINDOW_SETTINGS_NONE");
-    duk_push_number(ctx, (double) tb::WINDOW_SETTINGS_TITLEBAR);
-    duk_put_prop_string(ctx, -2, "WINDOW_SETTINGS_TITLEBAR");
-    duk_push_number(ctx, (double) tb::WINDOW_SETTINGS_RESIZABLE);
-    duk_put_prop_string(ctx, -2, "WINDOW_SETTINGS_RESIZABLE");
-    duk_push_number(ctx, (double) tb::WINDOW_SETTINGS_CLOSE_BUTTON);
-    duk_put_prop_string(ctx, -2, "WINDOW_SETTINGS_CLOSE_BUTTON");
-    duk_push_number(ctx, (double) tb::WINDOW_SETTINGS_CAN_ACTIVATE);
-    duk_put_prop_string(ctx, -2, "WINDOW_SETTINGS_CAN_ACTIVATE");
-    duk_push_number(ctx, (double) tb::WINDOW_SETTINGS_DEFAULT);
-    duk_put_prop_string(ctx, -2, "WINDOW_SETTINGS_DEFAULT");
-
-    duk_push_number(ctx, (double) tb::WIDGET_STATE_NONE);
-    duk_put_prop_string(ctx, -2, "WIDGET_STATE_NONE");
-    duk_push_number(ctx, (double) tb::WIDGET_STATE_DISABLED);
-    duk_put_prop_string(ctx, -2, "WIDGET_STATE_DISABLED");
-    duk_push_number(ctx, (double) tb::WIDGET_STATE_FOCUSED);
-    duk_put_prop_string(ctx, -2, "WIDGET_STATE_FOCUSED");
-    duk_push_number(ctx, (double) tb::WIDGET_STATE_PRESSED);
-    duk_put_prop_string(ctx, -2, "WIDGET_STATE_PRESSED");
-    duk_push_number(ctx, (double) tb::WIDGET_STATE_SELECTED);
-    duk_put_prop_string(ctx, -2, "WIDGET_STATE_SELECTED");
-    duk_push_number(ctx, (double) tb::WIDGET_STATE_HOVERED);
-    duk_put_prop_string(ctx, -2, "WIDGET_STATE_HOVERED");
-    duk_push_number(ctx, (double) tb::WIDGET_STATE_ALL);
-    duk_put_prop_string(ctx, -2, "WIDGET_STATE_ALL");
-
-    // Events
-    duk_push_number(ctx, (double) tb::EVENT_TYPE_CLICK);
-    duk_put_prop_string(ctx, -2, "EVENT_TYPE_CLICK");
-    duk_push_number(ctx, (double) tb::EVENT_TYPE_LONG_CLICK);
-    duk_put_prop_string(ctx, -2, "EVENT_TYPE_LONG_CLICK");
-    duk_push_number(ctx, (double) tb::EVENT_TYPE_POINTER_DOWN);
-    duk_put_prop_string(ctx, -2, "EVENT_TYPE_POINTER_DOWN");
-    duk_push_number(ctx, (double) tb::EVENT_TYPE_POINTER_UP);
-    duk_put_prop_string(ctx, -2, "EVENT_TYPE_POINTER_UP");
-    duk_push_number(ctx, (double) tb::EVENT_TYPE_POINTER_MOVE);
-    duk_put_prop_string(ctx, -2, "EVENT_TYPE_POINTER_MOVE");
-    duk_push_number(ctx, (double) tb::EVENT_TYPE_RIGHT_POINTER_DOWN);
-    duk_put_prop_string(ctx, -2, "EVENT_TYPE_RIGHT_POINTER_DOWN");
-    duk_push_number(ctx, (double) tb::EVENT_TYPE_RIGHT_POINTER_UP);
-    duk_put_prop_string(ctx, -2, "EVENT_TYPE_RIGHT_POINTER_UP");
-    duk_push_number(ctx, (double) tb::EVENT_TYPE_WHEEL);
-    duk_put_prop_string(ctx, -2, "EVENT_TYPE_WHEEL");
-    duk_push_number(ctx, (double) tb::EVENT_TYPE_CHANGED);
-    duk_put_prop_string(ctx, -2, "EVENT_TYPE_CHANGED");
-    duk_push_number(ctx, (double) tb::EVENT_TYPE_KEY_DOWN);
-    duk_put_prop_string(ctx, -2, "EVENT_TYPE_KEY_DOWN");
-    duk_push_number(ctx, (double) tb::EVENT_TYPE_KEY_UP);
-    duk_put_prop_string(ctx, -2, "EVENT_TYPE_KEY_UP");
-    duk_push_number(ctx, (double) tb::EVENT_TYPE_SHORTCUT);
-    duk_put_prop_string(ctx, -2, "EVENT_TYPE_SHORTCUT");
-    duk_push_number(ctx, (double) tb::EVENT_TYPE_CONTEXT_MENU);
-    duk_put_prop_string(ctx, -2, "EVENT_TYPE_CONTEXT_MENU");
-    duk_push_number(ctx, (double) tb::EVENT_TYPE_FILE_DROP);
-    duk_put_prop_string(ctx, -2, "EVENT_TYPE_FILE_DROP");
-    duk_push_number(ctx, (double) tb::EVENT_TYPE_TAB_CHANGED);
-    duk_put_prop_string(ctx, -2, "EVENT_TYPE_TAB_CHANGED");
-    duk_push_number(ctx, (double) tb::EVENT_TYPE_CUSTOM);
-    duk_put_prop_string(ctx, -2, "EVENT_TYPE_CUSTOM");
-
-    duk_push_number(ctx, (double) tb::WIDGET_VISIBILITY_GONE);
-    duk_put_prop_string(ctx, -2, "VISIBILITY_GONE");
-    duk_push_number(ctx, (double) tb::WIDGET_VISIBILITY_INVISIBLE);
-    duk_put_prop_string(ctx, -2, "VISIBILITY_INVISIBLE");
-    duk_push_number(ctx, (double) tb::WIDGET_VISIBILITY_VISIBLE);
-    duk_put_prop_string(ctx, -2, "VISIBILITY_VISIBLE");
-
-    duk_put_prop_string(ctx, -2, "UI");
-
-    duk_pop(ctx);
+    duk_pop_2(ctx);
 
     js_class_get_prototype(ctx, "Atomic", "UIButton");
     duk_push_c_function(ctx, UIButton_Popup, 2);

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

@@ -258,6 +258,8 @@ inline bool js_push_class_object_instance(duk_context* ctx, const RefCounted *in
     duk_get_global_string(ctx, package);
     duk_get_prop_string(ctx, -1, jclassname);
 
+    assert(duk_is_function(ctx, -1));
+
     duk_push_pointer(ctx, (void*) instance);
     duk_new(ctx, 1);
     duk_remove(ctx, -2); // remove Atomic object

+ 17 - 12
Source/AtomicPlayer/Player.cpp

@@ -43,29 +43,34 @@ Scene* Player::LoadScene(const String& filename, Camera *camera)
         return 0;
     }
 
-    SharedPtr<Scene> scene(new Scene(context_));
+    Scene* scene = new Scene(context_);
 
     if (!scene->LoadXML(*file))
     {
+        scene->ReleaseRef();
         return 0;
     }
 
-    currentScene_ = scene;
-
-    if(!camera)
+    if (currentScene_.Null())
     {
-        PODVector<Node*> cameraNodes;
-        scene->GetChildrenWithComponent(cameraNodes, Camera::GetTypeStatic(), true);
-        if (cameraNodes.Size())
+        currentScene_ = scene;
+
+        if(!camera)
         {
-            camera = cameraNodes[0]->GetComponent<Camera>();
+            PODVector<Node*> cameraNodes;
+            scene->GetChildrenWithComponent(cameraNodes, Camera::GetTypeStatic(), true);
+            if (cameraNodes.Size())
+            {
+                camera = cameraNodes[0]->GetComponent<Camera>();
+            }
         }
-    }
 
-    viewport_->SetScene(scene);
+        viewport_->SetScene(scene);
 
-    if (camera)
-        viewport_->SetCamera(camera);
+        if (camera)
+            viewport_->SetCamera(camera);
+
+    }
 
     return scene;
 }

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

@@ -17,6 +17,7 @@
 #include "JavascriptImporter.h"
 #include "SpriterImporter.h"
 #include "TMXImporter.h"
+#include "PEXImporter.h"
 
 #include "AssetEvents.h"
 #include "Asset.h"
@@ -275,6 +276,10 @@ bool Asset::CreateImporter()
         {
             importer_ = new TMXImporter(context_, this);
         }
+        else if (ext == ".pex")
+        {
+            importer_ = new PEXImporter(context_, this);
+        }
         else if (textureFormats.Contains(ext))
         {
             importer_ = new TextureImporter(context_, this);

+ 1 - 0
Source/ToolCore/Assets/AssetDatabase.cpp

@@ -492,6 +492,7 @@ String AssetDatabase::GetResourceImporterName(const String& resourceTypeName)
         resourceTypeToImporterType_["Sprite2D"] = "TextureImporter";
         resourceTypeToImporterType_["AnimatedSprite2D"] = "SpriterImporter";
         resourceTypeToImporterType_["JSComponentFile"] = "JavascriptImporter";
+        resourceTypeToImporterType_["ParticleEffect2D"] = "PEXImporter";
     }
 
     if (!resourceTypeToImporterType_.Contains(resourceTypeName))

+ 63 - 0
Source/ToolCore/Assets/PEXImporter.cpp

@@ -0,0 +1,63 @@
+
+#include <Atomic/Resource/ResourceCache.h>
+#include <Atomic/Resource/Image.h>
+#include <Atomic/Atomic2D/ParticleEffect2D.h>
+
+#include "Asset.h"
+#include "AssetDatabase.h"
+#include "PEXImporter.h"
+
+namespace ToolCore
+{
+
+PEXImporter::PEXImporter(Context* context, Asset *asset) : AssetImporter(context, asset)
+{
+
+}
+
+PEXImporter::~PEXImporter()
+{
+
+}
+
+void PEXImporter::SetDefaults()
+{
+    AssetImporter::SetDefaults();
+}
+
+bool PEXImporter::Import()
+{
+    return true;
+}
+
+bool PEXImporter::LoadSettingsInternal()
+{
+    if (!AssetImporter::LoadSettingsInternal())
+        return false;
+
+    JSONValue import = jsonRoot_.GetChild("PEXImporter", JSON_OBJECT);
+
+    return true;
+}
+
+bool PEXImporter::SaveSettingsInternal()
+{
+    if (!AssetImporter::SaveSettingsInternal())
+        return false;
+
+    JSONValue import = jsonRoot_.CreateChild("PEXImporter");
+
+    return true;
+}
+
+Resource* PEXImporter::GetResource(const String& typeName)
+{
+    ResourceCache* cache = GetSubsystem<ResourceCache>();
+
+    ParticleEffect2D* particleEffect = cache->GetResource<ParticleEffect2D>(asset_->GetPath());
+
+    return particleEffect;
+
+}
+
+}

+ 31 - 0
Source/ToolCore/Assets/PEXImporter.h

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