Browse Source

When failing to import a model, give an error message dialog instead of exiting with error

Josh Engebretson 10 years ago
parent
commit
542ef72945

+ 12 - 0
Script/AtomicEditor/resources/ResourceOps.ts

@@ -2,6 +2,18 @@ import EditorEvents = require("../editor/EditorEvents");
 
 
 class ResourceOps extends Atomic.ScriptObject {
 class ResourceOps extends Atomic.ScriptObject {
 
 
+    constructor() {
+
+        super();
+
+        this.subscribeToEvent("AssetImportError", (ev: ToolCore.AssetImportErrorEvent) => {
+
+            resourceOps.sendEvent(EditorEvents.ModalError, { title: "Asset Import Error", message: ev.error });
+
+        })
+
+    }
+
 
 
 }
 }
 
 

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

@@ -192,6 +192,13 @@ declare module ToolCore {
 
 
     }
     }
 
 
+    export interface AssetImportErrorEvent {
+
+        path:string;
+        guid:string;
+        error: string;
+
+    }
 
 
     export var toolEnvironment: ToolEnvironment;
     export var toolEnvironment: ToolEnvironment;
     export var toolSystem: ToolSystem;
     export var toolSystem: ToolSystem;

+ 3 - 0
Script/TypeScript/ToolCore.d.ts

@@ -215,6 +215,7 @@ declare module ToolCore {
 
 
    export class OpenAssetImporter extends Atomic.AObject {
    export class OpenAssetImporter extends Atomic.AObject {
 
 
+      errorMessage: string;
       importNode: Atomic.Node;
       importNode: Atomic.Node;
       startTime: number;
       startTime: number;
       endTime: number;
       endTime: number;
@@ -225,6 +226,7 @@ declare module ToolCore {
       constructor();
       constructor();
 
 
       load(assetPath: string): boolean;
       load(assetPath: string): boolean;
+      getErrorMessage(): string;
       exportModel(outName: string, animName?: string, animationOnly?: boolean): void;
       exportModel(outName: string, animName?: string, animationOnly?: boolean): void;
       setImportNode(node: Atomic.Node): void;
       setImportNode(node: Atomic.Node): void;
       setStartTime(startTime: number): void;
       setStartTime(startTime: number): void;
@@ -264,6 +266,7 @@ declare module ToolCore {
       getImporterType(): string;
       getImporterType(): string;
       getImporterTypeName(): string;
       getImporterTypeName(): string;
       getImporter(): AssetImporter;
       getImporter(): AssetImporter;
+      postImportError(message: string): void;
       getParent(): Asset;
       getParent(): Asset;
       setDirty(dirty: boolean): void;
       setDirty(dirty: boolean): void;
       isDirty(): boolean;
       isDirty(): boolean;

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

@@ -16,6 +16,7 @@
 #include "PrefabImporter.h"
 #include "PrefabImporter.h"
 #include "JavascriptImporter.h"
 #include "JavascriptImporter.h"
 
 
+#include "AssetEvents.h"
 #include "Asset.h"
 #include "Asset.h"
 
 
 namespace ToolCore
 namespace ToolCore
@@ -105,6 +106,17 @@ bool Asset::Preload()
     //return importer_->Preload();
     //return importer_->Preload();
 }
 }
 
 
+void Asset::PostImportError(const String& message)
+{
+    VariantMap eventData;
+    eventData[AssetImportError::P_PATH] = path_;
+    eventData[AssetImportError::P_GUID] = guid_;
+    eventData[AssetImportError::P_ERROR] = message;
+
+    SendEvent(E_ASSETIMPORTERROR, eventData);
+
+}
+
 // load .asset
 // load .asset
 bool Asset::Load()
 bool Asset::Load()
 {
 {

+ 3 - 0
Source/ToolCore/Assets/Asset.h

@@ -41,6 +41,8 @@ public:
 
 
     AssetImporter* GetImporter() { return importer_; }
     AssetImporter* GetImporter() { return importer_; }
 
 
+    void PostImportError(const String& message);
+
     Asset* GetParent();
     Asset* GetParent();
 
 
     void SetDirty(bool dirty) { dirty_ = dirty; }
     void SetDirty(bool dirty) { dirty_ = dirty; }
@@ -56,6 +58,7 @@ public:
     // save .asset
     // save .asset
     bool Save();
     bool Save();
 
 
+
 private:
 private:
 
 
     bool CreateImporter();
     bool CreateImporter();

+ 8 - 0
Source/ToolCore/Assets/AssetEvents.h

@@ -16,4 +16,12 @@ EVENT(E_RESOURCEREMOVED, ResourceRemoved)
     PARAM(P_GUID, GUID);                  // string
     PARAM(P_GUID, GUID);                  // string
 }
 }
 
 
+EVENT(E_ASSETIMPORTERROR, AssetImportError)
+{
+    PARAM(P_PATH, Path);                  // string
+    PARAM(P_GUID, GUID);                  // string
+    PARAM(P_ERROR, Error);                  // string
+}
+
+
 }
 }

+ 4 - 0
Source/ToolCore/Assets/ModelImporter.cpp

@@ -56,6 +56,10 @@ bool ModelImporter::ImportModel()
 
 
         return true;
         return true;
     }
     }
+    else
+    {
+        asset_->PostImportError(importer->GetErrorMessage());
+    }
 
 
     return false;
     return false;
 }
 }

+ 4 - 1
Source/ToolCore/Import/OpenAssetImporter.cpp

@@ -115,7 +115,10 @@ bool OpenAssetImporter::Load(const String &assetPath)
     scene_ = aiImportFile(GetNativePath(assetPath).CString(), aiCurrentFlags_);
     scene_ = aiImportFile(GetNativePath(assetPath).CString(), aiCurrentFlags_);
 
 
     if (!scene_)
     if (!scene_)
-        ErrorExit("Could not open or parse input file " + assetPath + ": " + String(aiGetErrorString()));
+    {
+        errorMessage_ = "Could not open or parse input file " + assetPath + ": " + String(aiGetErrorString());
+        return false;
+    }
 
 
     if (verboseLog_)
     if (verboseLog_)
         Assimp::DefaultLogger::kill();
         Assimp::DefaultLogger::kill();

+ 4 - 0
Source/ToolCore/Import/OpenAssetImporter.h

@@ -53,6 +53,8 @@ public:
 
 
     bool Load(const String& assetPath);
     bool Load(const String& assetPath);
 
 
+    const String& GetErrorMessage() { return errorMessage_; }
+
     void ExportModel(const String& outName, const String& animName = String::EMPTY, bool animationOnly = false);
     void ExportModel(const String& outName, const String& animName = String::EMPTY, bool animationOnly = false);
 
 
     void SetImportNode(Node* node) { importNode_ = node; }
     void SetImportNode(Node* node) { importNode_ = node; }
@@ -92,6 +94,8 @@ private:
 
 
     void DumpNodes(aiNode* rootNode, unsigned level);
     void DumpNodes(aiNode* rootNode, unsigned level);
 
 
+    String errorMessage_;
+
     const aiScene* scene_;
     const aiScene* scene_;
     aiNode* rootNode_;
     aiNode* rootNode_;