Browse Source

Material shader parameters editing and saving,

Josh Engebretson 10 years ago
parent
commit
9c8f84e993

+ 1 - 1
Script/AtomicEditor/ui/inspector/InspectorFrame.ts

@@ -85,7 +85,7 @@ class InspectorFrame extends ScriptWidget {
           var inspector = new MaterialInspector();
           container.addChild(inspector);
 
-          inspector.inspect(material);
+          inspector.inspect(asset, material);
 
         }
 

+ 61 - 29
Script/AtomicEditor/ui/inspector/MaterialInspector.ts

@@ -48,7 +48,7 @@ var techniqueReverseLookup = {};
 
 for (var key in techniqueLookup) {
 
-  techniqueReverseLookup[techniqueLookup[key]] = key;
+    techniqueReverseLookup[techniqueLookup[key]] = key;
 
 }
 
@@ -83,34 +83,45 @@ class MaterialInspector extends ScriptWidget {
 
         for (var i in params) {
 
+            var attrLayout = new Atomic.UILayout();
+            attrLayout.layoutDistribution = Atomic.UI_LAYOUT_DISTRIBUTION_GRAVITY;
 
-          var attrLayout = new Atomic.UILayout();
-          attrLayout.layoutDistribution = Atomic.UI_LAYOUT_DISTRIBUTION_GRAVITY;
+            var name = new Atomic.UITextField();
+            name.textAlign = Atomic.UI_TEXT_ALIGN_LEFT;
+            name.skinBg = "InspectorTextAttrName";
 
-          var name = new Atomic.UITextField();
-          name.textAlign = Atomic.UI_TEXT_ALIGN_LEFT;
-          name.skinBg = "InspectorTextAttrName";
+            name.text = params[i].name;
+            name.fontDescription = this.fd;
 
-          name.text = params[i].name;
-          name.fontDescription = this.fd;
+            attrLayout.addChild(name);
 
-          attrLayout.addChild(name);
+            var field = new Atomic.UIEditField();
+            field.textAlign = Atomic.UI_TEXT_ALIGN_LEFT;
+            field.skinBg = "TBAttrEditorField";;
+            field.fontDescription = this.fd;
+            var lp = new Atomic.UILayoutParams();
+            lp.width = 140;
+            field.layoutParams = lp;
 
-          var field = new Atomic.UIEditField();
-          field.textAlign = Atomic.UI_TEXT_ALIGN_LEFT;
-          field.skinBg = "TBAttrEditorField";;
-          field.fontDescription = this.fd;
-          var lp = new Atomic.UILayoutParams();
-          lp.width = 140;
-          field.layoutParams = lp;
+            field.id = params[i].name;
+            field.text = params[i].valueString;
 
-          field.text = params[i].value;
+            field.subscribeToEvent(field, "WidgetEvent", function(ev: Atomic.UIWidgetEvent) {
+
+                if (ev.type == Atomic.UI_EVENT_TYPE_CHANGED) {
+
+                    var field = <Atomic.UIEditField> ev.target;
+                    this.material.setShaderParameter(field.id, field.text);
+
+                }
+
+            }.bind(this));
 
-          attrLayout.addChild(field);
+            attrLayout.addChild(field);
 
-          attrsVerticalLayout.addChild(attrLayout);
+            attrsVerticalLayout.addChild(attrLayout);
 
-          // print(params[i].name, " : ", params[i].value, " : ", params[i].type);
+            // print(params[i].name, " : ", params[i].value, " : ", params[i].type);
 
         }
 
@@ -141,13 +152,13 @@ class MaterialInspector extends ScriptWidget {
 
     }
 
-    onTechniqueSet(techniqueName:string) {
+    onTechniqueSet(techniqueName: string) {
 
-      this.techniqueButton.text = techniqueName;
+        this.techniqueButton.text = techniqueName;
 
-      var cache = Atomic.getResourceCache();
-      var technique = <Atomic.Technique> cache.getResource("Technique", techniqueReverseLookup[techniqueName]);
-      this.material.setTechnique(0, technique);
+        var cache = Atomic.getResourceCache();
+        var technique = <Atomic.Technique> cache.getResource("Technique", techniqueReverseLookup[techniqueName]);
+        this.material.setTechnique(0, technique);
 
     }
 
@@ -206,7 +217,7 @@ class MaterialInspector extends ScriptWidget {
 
         // TODO: Filter on technique
         var textureUnits = [Atomic.TU_DIFFUSE, Atomic.TU_NORMAL, Atomic.TU_SPECULAR];// ,Atomic.TU_EMISSIVE, Atomic.TU_ENVIRONMENT,
-            //Atomic.TU_CUSTOM1, Atomic.TU_CUSTOM2];
+        //Atomic.TU_CUSTOM1, Atomic.TU_CUSTOM2];
 
         for (var i in textureUnits) {
 
@@ -256,8 +267,11 @@ class MaterialInspector extends ScriptWidget {
 
     }
 
-    inspect(material: Atomic.Material) {
 
+
+    inspect(asset:ToolCore.Asset, material: Atomic.Material) {
+
+        this.asset = asset;
         this.material = material;
 
         var mlp = new Atomic.UILayoutParams();
@@ -305,7 +319,10 @@ class MaterialInspector extends ScriptWidget {
         lp.width = 140;
         field.layoutParams = lp;
 
-        field.text = material.getTexture(Atomic.TU_DIFFUSE).name;
+        var texture = material.getTexture(Atomic.TU_DIFFUSE);
+
+        if (texture)
+            field.text = texture.name;
 
         nameLayout.addChild(field);
 
@@ -337,12 +354,27 @@ class MaterialInspector extends ScriptWidget {
         materialLayout.addChild(this.createTextureSection());
         materialLayout.addChild(this.createShaderParametersSection());
 
+        var button = new Atomic.UIButton();
+        button.fontDescription = this.fd;
+        button.gravity = Atomic.UI_GRAVITY_RIGHT;
+        button.text = "Save";
+
+        button.onClick = function() {
+
+          var importer = <ToolCore.MaterialImporter> this.asset.getImporter();
+          importer.saveMaterial();
+
+        }.bind(this);
+
+        materialLayout.addChild(button);
+
         this.addChild(materialLayout);
 
     }
 
-    techniqueButton:Atomic.UIButton;
+    techniqueButton: Atomic.UIButton;
     material: Atomic.Material;
+    asset: ToolCore.Asset;
     nameTextField: Atomic.UITextField;
     fd: Atomic.UIFontDescription = new Atomic.UIFontDescription();
 

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

@@ -293,6 +293,17 @@ declare module ToolCore {
 
    }
 
+   export class MaterialImporter extends AssetImporter {
+
+      // Construct.
+      constructor(asset: Asset);
+
+      setDefaults(): void;
+      import(guid: string): boolean;
+      saveMaterial(): void;
+
+   }
+
    export class AnimationImportInfo extends Atomic.AObject {
 
       name: string;
@@ -304,6 +315,7 @@ declare module ToolCore {
       getName(): string;
       getStartTime(): number;
       getEndTime(): number;
+      setName(name: string): void;
       setStartTime(time: number): void;
       setEndTime(time: number): void;
 

+ 24 - 0
Source/AtomicJS/Javascript/JSGraphics.cpp

@@ -54,6 +54,28 @@ static int Light_SetShadowBias(duk_context* ctx)
 
 // Material
 
+static int Material_SetShaderParameter(duk_context* ctx)
+{
+    duk_push_this(ctx);
+    Material* material = js_to_class_instance<Material>(ctx, -1, 0);
+
+    const char* name = duk_require_string(ctx, 0);
+    String value = duk_require_string(ctx, 1);
+
+    const Variant& v = material->GetShaderParameter(name);
+
+    if (v == Variant::EMPTY)
+        return 0;
+
+    Variant vset;
+    vset.FromString(v.GetType(), value);
+
+    material->SetShaderParameter(name, vset);
+
+    return 0;
+
+}
+
 static int Material_GetShaderParameters(duk_context* ctx)
 {
     duk_push_this(ctx);
@@ -110,6 +132,8 @@ void jsapi_init_graphics(JSVM* vm)
     js_class_get_prototype(ctx, "Atomic", "Material");
     duk_push_c_function(ctx, Material_GetShaderParameters, 0);
     duk_put_prop_string(ctx, -2, "getShaderParameters");
+    duk_push_c_function(ctx, Material_SetShaderParameter, 2);
+    duk_put_prop_string(ctx, -2, "setShaderParameter");
     duk_pop(ctx);
 
     // static methods

+ 1 - 1
Source/AtomicJS/Packages/ToolCore/ToolCore.json

@@ -4,7 +4,7 @@
 							 "Source/ToolCore/Import", "Source/ToolCore/Assets"],
 	"classes" : ["ToolEnvironment", "ToolSystem", "Project", "ProjectFile", "Platform", "PlatformMac", "PlatformWeb",
 							 "PlatformWindows", "Command", "PlayCmd", "OpenAssetImporter",
-							 "Asset", "AssetDatabase", "AssetImporter", "ModelImporter", "AnimationImportInfo",
+							 "Asset", "AssetDatabase", "AssetImporter", "ModelImporter", "MaterialImporter", "AnimationImportInfo",
 							 "PrefabImporter"],
 	"typescript_decl" : {
 

+ 16 - 5
Source/ToolCore/Assets/MaterialImporter.cpp

@@ -1,4 +1,8 @@
 
+#include <Atomic/IO/File.h>
+#include <Atomic/Resource/ResourceCache.h>
+#include <Atomic/Graphics/Material.h>
+
 #include "Asset.h"
 #include "AssetDatabase.h"
 #include "MaterialImporter.h"
@@ -23,13 +27,20 @@ void MaterialImporter::SetDefaults()
 
 bool MaterialImporter::Import(const String& guid)
 {
-    AssetDatabase* db = GetSubsystem<AssetDatabase>();
-    Asset* asset = db->GetAssetByGUID(guid);
+    return true;
+}
 
-    if (!asset)
-        return false;
+void MaterialImporter::SaveMaterial()
+{
+    ResourceCache* cache = GetSubsystem<ResourceCache>();
+    Material* material = cache->GetResource<Material>(asset_->GetPath());
+
+    if (material)
+    {
+        SharedPtr<File> file(new File(context_, asset_->GetPath(), FILE_WRITE));
+        material->Save(*file);
+    }
 
-    return true;
 }
 
 bool MaterialImporter::LoadSettingsInternal()

+ 2 - 0
Source/ToolCore/Assets/MaterialImporter.h

@@ -19,6 +19,8 @@ public:
 
     bool Import(const String& guid);
 
+    void SaveMaterial();
+
 protected:
 
     virtual bool LoadSettingsInternal();

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

@@ -30,6 +30,7 @@ public:
     float GetStartTime() const { return startTime_; }
     float GetEndTime() const { return endTime_; }
 
+    void SetName(const String& name) { name_ = name; }
     void SetStartTime(float time) { startTime_ = time; }
     void SetEndTime(float time) { endTime_ = time; }