Browse Source

Working on multi-material setup and assignment

Josh Engebretson 10 years ago
parent
commit
5a5e29e934

+ 61 - 51
Script/AtomicEditor/ui/frames/inspector/ComponentInspector.ts

@@ -207,6 +207,65 @@ class ComponentInspector extends Atomic.UISection {
 
 
     }
     }
 
 
+    createMaterialClosure(layout: Atomic.UILayout, staticModel: Atomic.StaticModel, index: number) {
+
+        var o = InspectorUtils.createAttrEditFieldWithSelectButton("Material " + index, layout);
+        var materialField = o.editField;
+        materialField.readOnly = true;
+
+        var select = o.selectButton;
+
+        select.onClick = () => {
+
+            EditorUI.getModelOps().showResourceSelection("Select Material", "MaterialImporter", function(asset: ToolCore.Asset) {
+
+                staticModel.setMaterialIndex(index, <Atomic.Material> Atomic.cache.getResource("Material", asset.path));
+
+                if (staticModel.getMaterial())
+                    materialField.text = staticModel.getMaterial().name;
+                else
+                    materialField.text = "";
+
+            });
+
+        }
+
+        var material = staticModel.getMaterial();
+
+        if (material) {
+
+            materialField.text = material.name;
+
+        }
+
+        // handle dropping of material on field
+        materialField.subscribeToEvent(materialField, "DragEnded", (ev: Atomic.DragEndedEvent) => {
+
+            if (ev.target == materialField) {
+
+                var importer = this.acceptAssetDrag("MaterialImporter", ev);
+
+                if (importer) {
+
+                    var materialImporter = <ToolCore.MaterialImporter> importer;
+                    var asset = materialImporter.asset;
+
+                    var material = <Atomic.Material> Atomic.cache.getResource("Material", asset.path);
+
+                    if (material) {
+
+                        staticModel.setMaterialIndex(index, material);
+                        ev.target.text = material.name;
+
+                    }
+                }
+            }
+
+        });
+
+
+    }
+
     addModelUI(layout: Atomic.UILayout, typeName: string) {
     addModelUI(layout: Atomic.UILayout, typeName: string) {
 
 
         var staticModel = <Atomic.StaticModel> this.component;
         var staticModel = <Atomic.StaticModel> this.component;
@@ -267,62 +326,13 @@ class ComponentInspector extends Atomic.UISection {
 
 
         });
         });
 
 
-        // MATERIAL FIELD (single material, not multimaterial for now)
-
-        o = InspectorUtils.createAttrEditFieldWithSelectButton("Material", layout);
-        var materialField = o.editField;
-        materialField.readOnly = true;
-
-        select = o.selectButton;
-
-        select.onClick = () => {
-
-            EditorUI.getModelOps().showResourceSelection("Select Material", "MaterialImporter", function(asset: ToolCore.Asset) {
-
-                staticModel.setMaterial(<Atomic.Material> Atomic.cache.getResource("Material", asset.path));
+        for (var x = 0; x < staticModel.numGeometries; x++) {
 
 
-                if (staticModel.getMaterial())
-                    materialField.text = staticModel.getMaterial().name;
-                else
-                    materialField.text = "";
-
-            });
-
-        }
-
-        var material = staticModel.getMaterial();
-
-        if (material) {
+            this.createMaterialClosure(layout, staticModel, x);
 
 
-            materialField.text = material.name;
 
 
         }
         }
 
 
-        // handle dropping of material on field
-        materialField.subscribeToEvent(materialField, "DragEnded", (ev: Atomic.DragEndedEvent) => {
-
-            if (ev.target == materialField) {
-
-                var importer = this.acceptAssetDrag("MaterialImporter", ev);
-
-                if (importer) {
-
-                    var materialImporter = <ToolCore.MaterialImporter> importer;
-                    var asset = materialImporter.asset;
-
-                    var material = <Atomic.Material> Atomic.cache.getResource("Material", asset.path);
-
-                    if (material) {
-
-                        staticModel.material = material;
-                        ev.target.text = material.name;
-
-                    }
-                }
-            }
-
-        });
-
 
 
     }
     }
 
 

+ 4 - 1
Script/AtomicEditor/ui/frames/inspector/MaterialInspector.ts

@@ -42,7 +42,10 @@ var techniqueLookup = {
     "Techniques/Diff.xml": "Diffuse",
     "Techniques/Diff.xml": "Diffuse",
     "Techniques/DiffEmissive.xml": "Diffuse Emissive",
     "Techniques/DiffEmissive.xml": "Diffuse Emissive",
     "Techniques/DiffNormal.xml": "Diffuse Normal",
     "Techniques/DiffNormal.xml": "Diffuse Normal",
-    "Techniques/DiffNormalSpec.xml": "Diffuse Normal Specular"
+    "Techniques/DiffNormalSpec.xml": "Diffuse Normal Specular",
+    "Techniques/DiffAlpha.xml": "Alpha",
+    "Techniques/DiffAlphaMask.xml": "Alpha Mask",
+    "Techniques/DiffAdd.xml": "Additive"
 }
 }
 
 
 var techniqueReverseLookup = {};
 var techniqueReverseLookup = {};

+ 7 - 0
Script/Packages/Atomic/Atomic3D.json

@@ -17,6 +17,13 @@
 			"AnimationState" : ["AnimatedModel", "Animation"]
 			"AnimationState" : ["AnimatedModel", "Animation"]
 		}
 		}
 
 
+	},
+	"typescript_decl" : {
+
+		"StaticModel" : [
+			"setMaterialIndex(index:number, material:Material);"
+		]
 	}
 	}
 
 
+
 }
 }

+ 1 - 0
Script/TypeScript/Atomic.d.ts

@@ -4341,6 +4341,7 @@ declare module Atomic {
       isInside(point: Vector3): boolean;
       isInside(point: Vector3): boolean;
       // Determines if the given local space point is within the model geometry.
       // Determines if the given local space point is within the model geometry.
       isInsideLocal(point: Vector3): boolean;
       isInsideLocal(point: Vector3): boolean;
+      setMaterialIndex(index:number, material:Material);
 
 
    }
    }
 
 

+ 6 - 0
Source/AtomicJS/Javascript/JSAtomic.cpp

@@ -21,6 +21,9 @@
 #include "JSCore.h"
 #include "JSCore.h"
 #include "JSFileSystem.h"
 #include "JSFileSystem.h"
 #include "JSGraphics.h"
 #include "JSGraphics.h"
+#ifdef ATOMIC_3D
+#include "JSAtomic3D.h"
+#endif
 #include "JSIO.h"
 #include "JSIO.h"
 #include "JSUIAPI.h"
 #include "JSUIAPI.h"
 #include "JSScene.h"
 #include "JSScene.h"
@@ -258,6 +261,9 @@ void jsapi_init_atomic(JSVM* vm)
     jsapi_init_network(vm);
     jsapi_init_network(vm);
 #endif
 #endif
     jsapi_init_graphics(vm);
     jsapi_init_graphics(vm);
+#ifdef ATOMIC_3D
+    jsapi_init_atomic3d(vm);
+#endif
     jsapi_init_ui(vm);
     jsapi_init_ui(vm);
     jsapi_init_scene(vm);
     jsapi_init_scene(vm);
 
 

+ 38 - 0
Source/AtomicJS/Javascript/JSAtomic3D.cpp

@@ -0,0 +1,38 @@
+
+#include <Atomic/Atomic3D/StaticModel.h>
+
+#include "JSAtomic3D.h"
+
+namespace Atomic
+{
+
+
+static int StaticModel_SetMaterialIndex(duk_context* ctx) {
+
+    unsigned index = (unsigned) duk_require_number(ctx, 0);
+    Material* material = js_to_class_instance<Material>(ctx, 1, 0);
+
+    duk_push_this(ctx);
+
+    // event receiver
+    StaticModel* model = js_to_class_instance<StaticModel>(ctx, -1, 0);
+
+
+    model->SetMaterial(index, material);
+
+
+    return 0;
+}
+
+void jsapi_init_atomic3d(JSVM* vm)
+{
+    duk_context* ctx = vm->GetJSContext();
+
+    js_class_get_prototype(ctx, "Atomic", "StaticModel");
+    duk_push_c_function(ctx, StaticModel_SetMaterialIndex, 2);
+    duk_put_prop_string(ctx, -2, "setMaterialIndex");
+    duk_pop(ctx); // pop AObject prototype
+
+}
+
+}

+ 16 - 0
Source/AtomicJS/Javascript/JSAtomic3D.h

@@ -0,0 +1,16 @@
+// Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
+// Please see LICENSE.md in repository root for license information
+// https://github.com/AtomicGameEngine/AtomicGameEngine
+
+#pragma once
+
+#include "JSAPI.h"
+
+namespace Atomic
+{
+
+class JSVM;
+
+void jsapi_init_atomic3d(JSVM* vm);
+
+}