Browse Source

Merge pull request #928 from LumaDigital/JS-TextureImporterSettings

Added Max Size setting to Texture Importer
JoshEngebretson 9 years ago
parent
commit
a15650a738

+ 60 - 1
Script/AtomicEditor/ui/frames/inspector/TextureInspector.ts

@@ -24,10 +24,12 @@ import ScriptWidget = require("ui/ScriptWidget");
 import UIEvents = require("ui/UIEvents");
 import EditorUI = require("ui/EditorUI");
 import EditorEvents = require("editor/EditorEvents");
+import InspectorWidget = require("./InspectorWidget");
+import InspectorUtils = require("./InspectorUtils");
 
 import TextureSelector = require("./TextureSelector");
 
-class TextureInspector extends ScriptWidget {
+class TextureInspector extends InspectorWidget {
 
     constructor() {
 
@@ -38,6 +40,12 @@ class TextureInspector extends ScriptWidget {
 
     }
 
+    handleWidgetEvent(ev: Atomic.UIWidgetEvent): boolean {
+
+        return false;
+
+    }
+
     getTextureThumbnail(texture: Atomic.Texture2D): Atomic.Texture {
 
         if (!texture) return null;
@@ -103,6 +111,7 @@ class TextureInspector extends ScriptWidget {
 
         this.texture = texture;
         this.asset = asset;
+        this.importer = <ToolCore.TextureImporter>asset.importer;
 
         var mlp = new Atomic.UILayoutParams();
         mlp.width = 310;
@@ -153,6 +162,19 @@ class TextureInspector extends ScriptWidget {
 
         attrsVerticalLayout.addChild(nameLayout);
 
+        var maxSizeLayout = new Atomic.UILayout();
+        maxSizeLayout.layoutDistribution = Atomic.UI_LAYOUT_DISTRIBUTION_GRAVITY;
+
+        //COMPRESSION SIZE
+        var maxSize = InspectorUtils.createAttrName("Max Size");
+        this.populateCompressionSizeList();
+
+        maxSizeLayout.addChild(maxSize);
+        maxSizeLayout.addChild(this.compressionSize);
+
+        attrsVerticalLayout.addChild(maxSizeLayout);
+        attrsVerticalLayout.addChild(this.createApplyButton());
+
         textureSection.contentRoot.addChild(attrsVerticalLayout);
 
         textureLayout.addChild(this.createTextureSection());
@@ -161,13 +183,50 @@ class TextureInspector extends ScriptWidget {
 
     }
 
+    onApply()
+    {
+
+        this.importer.setCompressedImageSize(Number(this.compressionSize.text));
+        this.asset.import();
+        this.asset.save();
+
+    }
+
+    populateCompressionSizeList()
+    {
+        this.compressionSize = new Atomic.UISelectDropdown();
+        this.compressionSizeSource = new Atomic.UISelectItemSource();
+
+        for (var i = 0; i < this.compressionSizes.length; i ++)
+        {
+            var size = new Atomic.UISelectItem();
+            size.setString(this.compressionSizes[i].toString());           
+            this.compressionSizeSource.addItem(size);
+        }
+
+        this.compressionSize.setSource(this.compressionSizeSource);
+
+        if (this.importer.getCompressedImageSize() != 0)
+        {
+            this.compressionSize.setText(this.importer.getCompressedImageSize().toString());
+        }
+        else
+        {
+            this.compressionSize.setText("NONE");
+        }
+    }
+
     texture: Atomic.Texture2D;
 
     techniqueButton: Atomic.UIButton;
     material: Atomic.Material;
     asset: ToolCore.Asset;
     nameTextField: Atomic.UITextField;
+    compressionSize: Atomic.UISelectDropdown;
+    compressionSizeSource: Atomic.UISelectItemSource;
     fd: Atomic.UIFontDescription = new Atomic.UIFontDescription();
+    importer: ToolCore.TextureImporter;
+    compressionSizes: number[] = [32, 64, 128, 256, 512, 1024, 2048, 4096, 8192];
 
 }
 

+ 2 - 2
Source/Atomic/Graphics/Renderer.h

@@ -206,6 +206,8 @@ public:
     void SetMobileShadowBiasAdd(float add);
     /// Force reload of shaders.
     void ReloadShaders();
+	/// Reload textures.
+	void ReloadTextures();
 
     /// Return number of backbuffer viewports.
     unsigned GetNumViewports() const { return viewports_.Size(); }
@@ -369,8 +371,6 @@ private:
     void LoadPassShaders(Pass* pass);
     /// Release shaders used in materials.
     void ReleaseMaterialShaders();
-    /// Reload textures.
-    void ReloadTextures();
     /// Create light volume geometries.
     void CreateGeometries();
     /// Create instancing vertex buffer.

+ 27 - 2
Source/Atomic/Resource/ResourceCache.cpp

@@ -371,8 +371,33 @@ bool ResourceCache::ReloadResource(Resource* resource)
 
     bool success = false;
     SharedPtr<File> file = GetFile(resource->GetName());
-    if (file)
-        success = resource->Load(*(file.Get()));
+	
+
+	if (file) 
+	{
+#ifdef ATOMIC_PLATFORM_DESKTOP
+		String ext = GetExtension(resource->GetName());
+		if (ext == ".jpg" || ext == ".png" || ext == ".tga")
+		{
+			String ddsName = "DDS/" + resource->GetName() + ".dds";
+			file = GetFile(ddsName, false);
+			if (file != NULL)
+				success = resource->Load(*(file.Get()));
+			else
+			{
+				file = GetFile(resource->GetName());
+				success = resource->Load(*(file.Get()));
+			}
+		}
+		else
+		{
+			success = resource->Load(*(file.Get()));
+		}
+#else
+		success = resource->Load(*(file.Get()));
+#endif
+	}
+
 
     if (success)
     {

+ 37 - 3
Source/ToolCore/Assets/TextureImporter.cpp

@@ -27,6 +27,7 @@
 #include <Atomic/IO/FileSystem.h>
 
 #include <ToolCore/Import/ImportConfig.h>
+#include <Atomic/Graphics/Renderer.h>
 
 #include "Asset.h"
 #include "AssetDatabase.h"
@@ -35,8 +36,8 @@
 namespace ToolCore
 {
 
-TextureImporter::TextureImporter(Context* context, Asset *asset) : AssetImporter(context, asset),
-compressTextures_(false)
+	TextureImporter::TextureImporter(Context* context, Asset *asset) : AssetImporter(context, asset),
+		compressTextures_(false), compressedSize_(0)
 {
     ApplyProjectImportConfig();
 }
@@ -49,6 +50,9 @@ TextureImporter::~TextureImporter()
 void TextureImporter::SetDefaults()
 {
     AssetImporter::SetDefaults();
+
+	compressedSize_ = 0;
+
 }
 
 bool TextureImporter::Import()
@@ -71,7 +75,30 @@ bool TextureImporter::Import()
         !image->IsCompressed())
     {
         fileSystem->CreateDirs(cachePath, "DDS/" + Atomic::GetPath(asset_->GetRelativePath()));
-        image->SaveDDS(compressedPath);
+
+		float resizefactor;
+		float width = image->GetWidth();
+		float height = image->GetHeight();
+
+		if (width > compressedSize_ || height > compressedSize_)
+		{
+			if (width >= height)
+			{
+				resizefactor = compressedSize_ / width;
+			}
+			else
+			{
+				resizefactor = compressedSize_ / height;
+			}
+
+			image->Resize(width*resizefactor, height*resizefactor);
+		}
+
+		if (image->SaveDDS(compressedPath))
+		{			
+			Renderer * renderer = GetSubsystem<Renderer>();
+			renderer->ReloadTextures();
+		}
     }
 
     // todo, proper proportions
@@ -110,6 +137,11 @@ bool TextureImporter::LoadSettingsInternal(JSONValue& jsonRoot)
 
     JSONValue import = jsonRoot.Get("TextureImporter");
 
+	SetDefaults();
+
+	if (import.Get("compressionSize").IsNumber())
+		compressedSize_ = (CompressedFormat)import.Get("compressionSize").GetInt();
+
     return true;
 }
 
@@ -119,6 +151,8 @@ bool TextureImporter::SaveSettingsInternal(JSONValue& jsonRoot)
         return false;
 
     JSONValue import(JSONValue::emptyObject);
+	import.Set("compressionSize", compressedSize_);
+
     jsonRoot.Set("TextureImporter", import);
 
     return true;

+ 5 - 0
Source/ToolCore/Assets/TextureImporter.h

@@ -41,6 +41,9 @@ public:
     Resource* GetResource(const String& typeName = String::EMPTY);
     Node* InstantiateNode(Node* parent, const String& name);
 
+	void SetCompressedImageSize(unsigned int compressedSize) { compressedSize_ = compressedSize; }
+	unsigned int GetCompressedImageSize() { return compressedSize_; }
+
 protected:
 
     bool Import();
@@ -50,6 +53,8 @@ protected:
     virtual bool SaveSettingsInternal(JSONValue& jsonRoot);
 
     bool compressTextures_;
+
+	unsigned int compressedSize_;
 };
 
 }