Browse Source

Closing the loop...

Josh Engebretson 8 years ago
parent
commit
c439cb548c

+ 5 - 1
Build/Scripts/BuildLinux.js

@@ -67,6 +67,10 @@ function copyAtomicEditor() {
 
     copyAtomicNET();
 
+    // copy AtomicGlow
+    fs.copySync(atomicRoot + "Artifacts/Build/AtomicGlow/AtomicGlow",
+    editorAppFolder + "Resources/ToolData/AtomicGlow/AtomicGlow");
+
 }
 
 namespace('build', function() {
@@ -77,7 +81,7 @@ namespace('build', function() {
 
         process.chdir(buildDir);
 
-        var cmds = ["make AtomicEditor AtomicPlayer -j2"];
+        var cmds = ["make AtomicGlow AtomicEditor AtomicPlayer -j2"];
 
         jake.exec(cmds, function() {
 

+ 5 - 1
Build/Scripts/BuildMac.js

@@ -46,6 +46,10 @@ function copyAtomicEditor() {
 
     fs.copySync(playerBinary, resourceDest + "ToolData/Deployment/MacOS/AtomicPlayer.app/Contents/MacOS/AtomicPlayer");
 
+    // copy AtomicGlow
+    fs.copySync(atomicRoot + "Artifacts/Build/AtomicGlow/AtomicGlow",
+    resourceDest + "ToolData/AtomicGlow/AtomicGlow");
+
     copyAtomicNET();
 
 }
@@ -59,7 +63,7 @@ namespace('build', function() {
         process.chdir(buildDir);
 
         var cmds = [];
-        cmds.push("xcodebuild -target AtomicEditor -target AtomicPlayer -configuration " + config["config"] + " -parallelizeTargets -jobs 4")
+        cmds.push("xcodebuild -target AtomicGlow -target AtomicEditor -target AtomicPlayer -configuration " + config["config"] + " -parallelizeTargets -jobs 4")
 
         jake.exec(cmds, function() {
 

+ 5 - 0
Build/Scripts/BuildWindows.js

@@ -53,6 +53,11 @@ function copyAtomicEditor() {
     fs.copySync(buildDir +  "Source/AtomicPlayer/Application/" + config["config"] + "/D3DCompiler_47.dll",
     editorAppFolder + "Resources/ToolData/Deployment/Windows/x64/D3DCompiler_47.dll");
 
+    // copy AtomicGlow
+    // TODO: make sure Glow isn't dependent on D3DCompiler_47.dll
+    fs.copySync(atomicRoot + "Artifacts/Build/AtomicGlow/AtomicGlow.exe",
+    editorAppFolder + "Resources/ToolData/AtomicGlow/AtomicGlow.exe");
+
     copyAtomicNET();
 
 }

+ 1 - 1
Build/Scripts/Windows/CompileAtomicEditorPhase2.bat

@@ -7,4 +7,4 @@ if not defined ATOMIC_CMAKE_GENERATOR (
   exit /b 1
 )
 
-msbuild /m Atomic.sln /t:AtomicEditor /t:AtomicPlayer /p:Configuration=%1 /p:Platform=x64
+msbuild /m Atomic.sln /t: AtomicGlow /t:AtomicEditor /t:AtomicPlayer /p:Configuration=%1 /p:Platform=x64

+ 8 - 2
Script/AtomicEditor/ui/frames/inspector/ModelInspector.ts

@@ -43,9 +43,11 @@ class ModelInspector extends InspectorWidget {
     onApply() {
 
         this.importer.scale = Number(this.scaleEdit.text);
+        this.importer.generateLightmapUV = this.genLightmapUVBox.value ? true : false;
 
         this.importer.importAnimations = this.importAnimationBox.value ? true : false;
         this.importer.setImportMaterials(this.importMaterials.value ? true : false);
+        
 
         for (var i = 0; i < this.importer.animationCount; i++) {
 
@@ -101,17 +103,20 @@ class ModelInspector extends InspectorWidget {
         }));
 
         this.scaleEdit = InspectorUtils.createAttrEditField("Scale", modelLayout);
-        this.scaleEdit.text = this.importer.scale.toString();
+        this.scaleEdit.text = this.importer.scale.toString();        
 
         this.importMaterials = this.createAttrCheckBox("Import Materials", modelLayout);
         this.importMaterials.value = this.importer.getImportMaterials() ? 1 : 0;
 
+        this.genLightmapUVBox = this.createAttrCheckBox("Generate Lightmap UV", modelLayout);
+        this.genLightmapUVBox.value = this.importer.generateLightmapUV ? 1 : 0;
+
         // Animations Section
         var animationLayout = this.createSection(rootLayout, "Animation", 1);
 
         this.importAnimationBox = this.createAttrCheckBox("Import Animations", animationLayout);
         this.importAnimationBox.value = this.importer.importAnimations ? 1 : 0;
-
+        
         this.importAnimationArray = new ArrayEditWidget("Animation Count");
         animationLayout.addChild(this.importAnimationArray);
 
@@ -193,6 +198,7 @@ class ModelInspector extends InspectorWidget {
 
     // model
     scaleEdit: Atomic.UIEditField;
+    genLightmapUVBox: Atomic.UICheckBox;
 
     // animation
     importAnimationBox: Atomic.UICheckBox;

+ 1 - 7
Source/AtomicGlow/Atlas/MeshLightmapUVGen.cpp

@@ -11,9 +11,8 @@ namespace AtomicGlow
 {
 
 
-MeshLightmapUVGen::MeshLightmapUVGen(Context* context, Model* model, const String& modelName, const Settings& settings) : Object(context),
+MeshLightmapUVGen::MeshLightmapUVGen(Context* context, Model* model, const Settings& settings) : Object(context),
     model_(model),
-    modelName_(modelName),
     modelPacker_(new ModelPacker(context)),
     settings_(settings),
     tOutputMesh_(0),
@@ -47,11 +46,6 @@ inline void MeshLightmapUVGen::EmitVertex(PODVector<MPVertex>& vertices, unsigne
 
 void MeshLightmapUVGen::WriteLightmapUVCoords()
 {
-    String modelName = modelName_;
-
-    if (!modelName.Length())
-        modelName = "AnonymousModel";
-
     
     //Thekla::atlas_write_debug_textures(tOutputMesh_, tInputMesh_, ToString("/Users/jenge/Desktop/%s_lmWorldSpaceTexture.png", modelName.CString()).CString() ,
     //                                                              ToString("/Users/jenge/Desktop/%s_lmNormalTexture.png", modelName.CString()).CString() );

+ 1 - 2
Source/AtomicGlow/Atlas/MeshLightmapUVGen.h

@@ -35,7 +35,7 @@ public:
 
     };
 
-    MeshLightmapUVGen(Context* context, Model* model, const String& modelName, const Settings& settings);
+    MeshLightmapUVGen(Context* context, Model* model, const Settings& settings);
     virtual ~MeshLightmapUVGen();
 
     bool Generate();
@@ -54,7 +54,6 @@ private:
     };
 
     SharedPtr<Model> model_;
-    String modelName_;
     SharedPtr<ModelPacker> modelPacker_;
 
     SharedPtr<MPLODLevel> curLOD_;

+ 9 - 0
Source/AtomicGlow/CMakeLists.txt

@@ -30,3 +30,12 @@ if (WIN32)
     target_link_libraries(AtomicGlow Iphlpapi Wldap32)
 endif()
 
+
+# Copy AtomicGlow to Artifacts
+add_custom_command( TARGET AtomicGlow POST_BUILD
+                    COMMAND "${CMAKE_COMMAND}"
+                    ARGS -E make_directory \"${ATOMIC_SOURCE_DIR}/Artifacts/Build/AtomicGlow\"
+                    COMMAND "${CMAKE_COMMAND}"
+                    ARGS -E copy_if_different \"$<TARGET_FILE:AtomicGlow>\" \"${ATOMIC_SOURCE_DIR}/Artifacts/Build/AtomicGlow/\"
+                    COMMENT "Copying AtomicGlow to Build Artifacts" )
+

+ 70 - 13
Source/AtomicGlow/GlowService/GlowService.cpp

@@ -21,10 +21,10 @@
 //
 
 #include <Atomic/IO/Log.h>
+#include <Atomic/IO/FileSystem.h>
 #include <Atomic/IPC/IPCEvents.h>
 #include <Atomic/Graphics/StaticModel.h>
 
-
 #include "GlowProcess.h"
 #include "GlowServiceEvents.h"
 #include "GlowService.h"
@@ -183,6 +183,13 @@ bool GlowService::Bake(const String& projectPath, Scene* scene, const GlowSettin
         return false;
     }
 
+    if (!glowBinaryPath_.Length())
+    {
+        ATOMIC_LOGERROR("GlowService::Bake() - Called with empty glowBinaryPath_");
+        return false;
+    }
+
+
     bakeCanceled_ = false;
     result_.Clear();
 
@@ -197,7 +204,7 @@ bool GlowService::Bake(const String& projectPath, Scene* scene, const GlowSettin
 
     if (!glowProcess_->Start(glowBinaryPath_, args))
     {
-        ATOMIC_LOGERROR("GlowService::Bake() - Glow process failed to start");
+        ATOMIC_LOGERRORF("GlowService::Bake() - Glow process failed to start: %s", glowBinaryPath_.CString());
         return false;
     }
 
@@ -234,25 +241,75 @@ void GlowService::CancelBake()
 
 }
 
+bool GlowService::LocateServiceExecutable()
+{
 
-bool GlowService::Start()
+    glowBinaryPath_ = String::EMPTY;
+    glowBaseArgs_.Clear();
+
+    FileSystem* fileSystem = GetSubsystem<FileSystem>();
+
+#ifdef ATOMIC_DEV_BUILD
+
+    String rootSourceDir = ATOMIC_ROOT_SOURCE_DIR;
+    rootSourceDir = AddTrailingSlash(rootSourceDir);
+
+    glowBinaryPath_ = rootSourceDir + "Artifacts/Build/AtomicGlow/AtomicGlow";
+
+#else
+
+#ifdef ATOMIC_PLATFORM_OSX
+    String resourcesDir = GetPath(RemoveTrailingSlash(fileSystem->GetProgramDir())) + "Resources/";
+#else
+    String resourcesDir = fileSystem->GetProgramDir() + "Resources/";
+#endif
+
+    glowBinaryPath_ = resourcesDir + "ToolData/AtomicGlow/AtomicGlow";
+
+#endif
+
+#ifdef ATOMIC_PLATFORM_WINDOWS
+
+    glowBinaryPath_ += ".exe";
+
+#endif
+
+    if (!fileSystem->FileExists(glowBinaryPath_))
+    {
+        ATOMIC_LOGERRORF("AtomicGlow binary not found: %s", glowBinaryPath_.CString());
+
+        glowBinaryPath_.Clear();
+        glowBaseArgs_.Clear();
+
+        return false;
+    }
+
+    return true;
+}
+
+bool GlowService::GetServiceExecutable(String& execPath, Vector<String>& baseArgs) const
 {
-    bool failed = false;
+    execPath.Clear();
+    baseArgs.Clear();
 
-    if (failed)
+    if (!glowBinaryPath_.Length())
     {
-        ATOMIC_LOGERROR("GlowService::Start() - Unable to start AtomicGlow service");
         return false;
     }
 
-    glowBinaryPath_ = String::EMPTY;
-    glowBaseArgs_.Clear();
+    execPath = glowBinaryPath_;
+    baseArgs = glowBaseArgs_;
 
-#ifdef ATOMIC_DEBUG
-    glowBinaryPath_ = "/Users/jenge/Dev/atomic/build-AtomicGameEngine-Desktop-Debug/Source/AtomicGlow/AtomicGlow";
-#else
-    glowBinaryPath_ = "/Users/jenge/Dev/atomic/build-AtomicGameEngine-Desktop-Release/Source/AtomicGlow/AtomicGlow";
-#endif
+    return true;
+}
+
+bool GlowService::Start()
+{
+    if (!LocateServiceExecutable())
+    {
+        ATOMIC_LOGERROR("GlowService::Start() - Unable to start AtomicGlow service");
+        return false;
+    }
 
     return true;
 

+ 4 - 0
Source/AtomicGlow/GlowService/GlowService.h

@@ -52,8 +52,12 @@ public:
 
     void CancelBake();
 
+    bool GetServiceExecutable(String& execPath, Vector<String>& baseArgs) const;
+
 private:
 
+    bool LocateServiceExecutable();
+
     void OnBakeError(const String& result);
     void OnBakeSuccess();
 

+ 28 - 36
Source/ToolCore/Assets/ModelImporter.cpp

@@ -41,13 +41,6 @@
 #include "AssetDatabase.h"
 #include "ModelImporter.h"
 
-// BEGIN GLOW FIXME
-// This is just here to generate UV2 on mdl's being imported
-#include <AtomicGlow/Atlas/MeshLightmapUVGen.h>
-using namespace AtomicGlow;
-// END GLOW FIXME
-
-
 namespace ToolCore
 {
 
@@ -74,6 +67,7 @@ void ModelImporter::SetDefaults()
     importMaterials_ = importer->GetImportMaterialsDefault();
     includeNonSkinningBones_ = importer->GetIncludeNonSkinningBones();
     animationInfo_.Clear();
+    genLightmapUV_ = false;
 
 }
 
@@ -243,16 +237,11 @@ bool ModelImporter::Import()
 
     if (ext == ".mdl")
     {
-        // BEGIN GLOW FIXME
-
-        // Have a look into mdl copy logic, also this is hacked to generate uv2 for mdl files in project
-        // and needs to be fixed up
-
         FileSystem* fs = GetSubsystem<FileSystem>();
         ResourceCache* cache = GetSubsystem<ResourceCache>();
 
         // mdl files are native file format that doesn't need to be converted
-        // doesn't allow scale, animations legacy primarily for ToonTown
+        // doesn't allow scale, animations
 
         String cacheFilename = asset_->GetCachePath() + ".mdl";
 
@@ -260,7 +249,7 @@ bool ModelImporter::Import()
         {
             importNode_= 0;
             return false;
-        }        
+        }
 
         Model* mdl = cache->GetResource<Model>(cacheFilename);
 
@@ -270,34 +259,33 @@ bool ModelImporter::Import()
             return false;
         }
 
-        String pathName, fileName, extension;
-        SplitPath(asset_->GetCachePath(), pathName, fileName, extension);
+        if (genLightmapUV_)
+        {
+            if (!OpenAssetImporter::GenerateLightmapUV(mdl))
+            {
+                ATOMIC_LOGERRORF("Failed to generate lightmap UV %s", asset_->GetPath().CString());
+                importNode_= 0;
+                return false;
+            }
+
+            File outFile(context_);
+            if (!outFile.Open(cacheFilename, FILE_WRITE))
+            {
+                ATOMIC_LOGERRORF("Could not open output file %s", asset_->GetPath().CString());
+                importNode_= 0;
+                return false;
+            }
+
+            mdl->Save(outFile);
 
-        MeshLightmapUVGen::Settings uvsettings;
-        MeshLightmapUVGen uvgen(context_, mdl, fileName, uvsettings);
+            outFile.Close();
 
-        if (!uvgen.Generate())
-        {
-            ATOMIC_LOGERRORF("Failed to generate lightmap UV %s", asset_->GetPath().CString());
-            return false;
-        }
+            // Force a reload, though file watchers will catch this delayed and load again
+            cache->ReloadResource(mdl);
 
-        File outFile(context_);
-        if (!outFile.Open(cacheFilename, FILE_WRITE))
-        {
-            ATOMIC_LOGERRORF("Could not open output file %s", asset_->GetPath().CString());
-            return false;
         }
 
-        mdl->Save(outFile);
-        
-        outFile.Close();
-
-        // Force a reload, though file watchers will catch this delayed and load again
-        cache->ReloadResource(mdl);
         importNode_->CreateComponent<StaticModel>()->SetModel(mdl);
-
-        // END GLOW FIXME
     }
     else
     {
@@ -418,6 +406,9 @@ bool ModelImporter::LoadSettingsInternal(JSONValue& jsonRoot)
     if (import.Get("scale").IsNumber())
         scale_ = import.Get("scale").GetDouble();
 
+    if (import.Get("genLightmapUV").IsBool())
+        genLightmapUV_ = import.Get("genLightmapUV").GetBool();
+
     if (import.Get("importAnimations").IsBool())
         importAnimations_ = import.Get("importAnimations").GetBool();
 
@@ -460,6 +451,7 @@ bool ModelImporter::SaveSettingsInternal(JSONValue& jsonRoot)
     save.Set("scale", scale_);
     save.Set("importAnimations", importAnimations_);
     save.Set("importMaterials", importMaterials_);
+    save.Set("genLightmapUV", genLightmapUV_);
 
     JSONArray animInfo;
 

+ 8 - 1
Source/ToolCore/Assets/ModelImporter.h

@@ -82,11 +82,16 @@ public:
     bool GetImportAnimations() { return importAnimations_; }
     void SetImportAnimations(bool importAnimations) { importAnimations_ = importAnimations; }
     bool GetImportMaterials() { return importMaterials_; }
-    void SetImportMaterials(bool importMat) { importMaterials_ = importMat; };
+    void SetImportMaterials(bool importMat) { importMaterials_ = importMat; }
 
     unsigned GetAnimationCount();
     void SetAnimationCount(unsigned count);
 
+    // Lightmap UV
+
+    bool GetGenerateLightmapUV() const { return genLightmapUV_; }
+    void SetGenerateLightmapUV(bool value)  { genLightmapUV_ = value; }
+
     Resource* GetResource(const String& typeName = String::EMPTY);
 
     void GetAnimations(PODVector<Atomic::Animation *>& animations);
@@ -117,6 +122,8 @@ protected:
 
     SharedPtr<Node> importNode_;
 
+    bool genLightmapUV_;
+
 };
 
 }

+ 21 - 8
Source/ToolCore/Import/OpenAssetImporter.cpp

@@ -84,7 +84,8 @@ OpenAssetImporter::OpenAssetImporter(Context* context) : Object(context) ,
     maxBones_(64),
     defaultTicksPerSecond_(4800.0f),
     startTime_(-1),
-    endTime_(-1)
+    endTime_(-1),
+    genLightmapUV_(false)
 {
 
     aiFlagsDefault_ =
@@ -217,6 +218,24 @@ void OpenAssetImporter::ApplyScale()
 
 }
 
+bool OpenAssetImporter::GenerateLightmapUV(Model *model)
+{
+    if (!model)
+    {
+        return false;
+    }
+
+    MeshLightmapUVGen::Settings uvsettings;
+    MeshLightmapUVGen uvgen(model->GetContext(), model, uvsettings);
+
+    if (!uvgen.Generate())
+    {
+        return false;
+    }
+
+    return true;
+}
+
 bool OpenAssetImporter::ExportModel(const String& outName, const String &animName, bool animationOnly)
 {
     if (outName.Empty())
@@ -547,13 +566,7 @@ bool OpenAssetImporter::BuildAndSaveModel(OutModel& model)
             outModel->SetGeometryBoneMappings(allBoneMappings);
     }
 
-    String pathName, fileName, extension;
-    SplitPath(sourceAssetFilename_, pathName, fileName, extension);
-
-    MeshLightmapUVGen::Settings uvsettings;
-    MeshLightmapUVGen uvgen(context_, outModel, fileName, uvsettings);
-
-    if (!uvgen.Generate())
+    if (!GenerateLightmapUV(outModel))
     {
         errorMessage_ = "Failed to generate lightmap UV " + model.outName_;
         return false;

+ 14 - 2
Source/ToolCore/Import/OpenAssetImporter.h

@@ -31,12 +31,17 @@
 
 using namespace Atomic;
 
+namespace Atomic
+{
+class Model;
+}
+
 namespace ToolCore
 {
 
 class OpenAssetImporter : public Object
 {
-    ATOMIC_OBJECT(OpenAssetImporter, Object);
+    ATOMIC_OBJECT(OpenAssetImporter, Object)
 
 public:
 
@@ -70,10 +75,15 @@ public:
 
     const Vector<AnimationInfo>& GetAnimationInfos() { return animationInfos_; }
 
+    bool GetGenerateLightmapUV() const { return genLightmapUV_; }
+    void SetGenerateLightmapUV(bool value) { genLightmapUV_ = value; }
+
+    static bool GenerateLightmapUV(Model* model);
+
 private:
 
     void ApplyScale();
-    void ApplyScale(aiNode* node);
+    void ApplyScale(aiNode* node);    
 
     bool BuildAndSaveModel(OutModel& model);
     bool BuildAndSaveAnimations(OutModel* model = 0, const String& animNameOverride = String::EMPTY);
@@ -154,6 +164,8 @@ private:
     float startTime_;
     float endTime_;
 
+    bool genLightmapUV_;
+
 };
 
 }