|
@@ -1,11 +1,25 @@
|
|
package h3d.mat;
|
|
package h3d.mat;
|
|
|
|
|
|
|
|
+@:enum private abstract DefaultKind(String) {
|
|
|
|
+ var Opaque = "Opaque";
|
|
|
|
+ var Alpha = "Alpha";
|
|
|
|
+ var AlphaKill = "AlphaKill";
|
|
|
|
+ var Add = "Add";
|
|
|
|
+ var SoftAdd = "SoftAdd";
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+private typedef DefaultProps = {
|
|
|
|
+ var kind : DefaultKind;
|
|
|
|
+ var shadows : Bool;
|
|
|
|
+ var culling : Bool;
|
|
|
|
+ var light : Bool;
|
|
|
|
+}
|
|
|
|
+
|
|
class Material extends BaseMaterial {
|
|
class Material extends BaseMaterial {
|
|
|
|
|
|
var mshader : h3d.shader.BaseMesh;
|
|
var mshader : h3d.shader.BaseMesh;
|
|
var normalShader : h3d.shader.NormalMap;
|
|
var normalShader : h3d.shader.NormalMap;
|
|
|
|
|
|
- public var props(default, set) : Any;
|
|
|
|
public var model : hxd.res.Resource;
|
|
public var model : hxd.res.Resource;
|
|
|
|
|
|
public var shadows(get, set) : Bool;
|
|
public var shadows(get, set) : Bool;
|
|
@@ -23,7 +37,7 @@ class Material extends BaseMaterial {
|
|
public var specularPower(get, set) : Float;
|
|
public var specularPower(get, set) : Float;
|
|
public var blendMode(default, set) : BlendMode;
|
|
public var blendMode(default, set) : BlendMode;
|
|
|
|
|
|
- public function new(?texture) {
|
|
|
|
|
|
+ function new(?texture) {
|
|
mshader = new h3d.shader.BaseMesh();
|
|
mshader = new h3d.shader.BaseMesh();
|
|
blendMode = None;
|
|
blendMode = None;
|
|
super(mshader);
|
|
super(mshader);
|
|
@@ -115,19 +129,7 @@ class Material extends BaseMaterial {
|
|
case Alpha:
|
|
case Alpha:
|
|
mainPass.depthWrite = true;
|
|
mainPass.depthWrite = true;
|
|
mainPass.setPassName("alpha");
|
|
mainPass.setPassName("alpha");
|
|
- case Add:
|
|
|
|
- mainPass.depthWrite = false;
|
|
|
|
- mainPass.setPassName("additive");
|
|
|
|
- case SoftAdd:
|
|
|
|
- mainPass.depthWrite = false;
|
|
|
|
- mainPass.setPassName("additive");
|
|
|
|
- case Multiply:
|
|
|
|
- mainPass.depthWrite = false;
|
|
|
|
- mainPass.setPassName("additive");
|
|
|
|
- case Erase:
|
|
|
|
- mainPass.depthWrite = false;
|
|
|
|
- mainPass.setPassName("additive");
|
|
|
|
- case Screen:
|
|
|
|
|
|
+ case Add, SoftAdd, Multiply, Erase, Screen:
|
|
mainPass.depthWrite = false;
|
|
mainPass.depthWrite = false;
|
|
mainPass.setPassName("additive");
|
|
mainPass.setPassName("additive");
|
|
}
|
|
}
|
|
@@ -195,18 +197,115 @@ class Material extends BaseMaterial {
|
|
return t;
|
|
return t;
|
|
}
|
|
}
|
|
|
|
|
|
- function set_props(p) {
|
|
|
|
- this.props = p;
|
|
|
|
- refreshProps();
|
|
|
|
- return p;
|
|
|
|
|
|
+ // -- PROPS
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ This is called after a model has been loaded and the material textures setup.
|
|
|
|
+ It will build the properties for this material, loading them from storage if necessary
|
|
|
|
+ */
|
|
|
|
+ public function getDefaultModelProps() : Any {
|
|
|
|
+ var props : DefaultProps = getDefaultProps();
|
|
|
|
+ switch( blendMode ) {
|
|
|
|
+ case Alpha:
|
|
|
|
+ props.kind = Alpha;
|
|
|
|
+ case Add:
|
|
|
|
+ props.kind = Add;
|
|
|
|
+ props.culling = false;
|
|
|
|
+ props.shadows = false;
|
|
|
|
+ props.light = false;
|
|
|
|
+ case None:
|
|
|
|
+ // default
|
|
|
|
+ default:
|
|
|
|
+ throw "Unsupported HMD material " + blendMode;
|
|
|
|
+ }
|
|
|
|
+ return props;
|
|
}
|
|
}
|
|
|
|
|
|
- public function refreshProps() {
|
|
|
|
- if( props != null && mainPass != null ) MaterialSetup.current.applyProps(this);
|
|
|
|
|
|
+ override function getDefaultProps( ?type : String ) : Any {
|
|
|
|
+ var props : DefaultProps;
|
|
|
|
+ switch( type ) {
|
|
|
|
+ case "particles3D", "trail3D":
|
|
|
|
+ props = {
|
|
|
|
+ kind : Alpha,
|
|
|
|
+ shadows : false,
|
|
|
|
+ culling : false,
|
|
|
|
+ light : true,
|
|
|
|
+ };
|
|
|
|
+ case "ui":
|
|
|
|
+ props = {
|
|
|
|
+ kind : Alpha,
|
|
|
|
+ shadows : false,
|
|
|
|
+ culling : false,
|
|
|
|
+ light : false,
|
|
|
|
+ };
|
|
|
|
+ default:
|
|
|
|
+ props = {
|
|
|
|
+ kind : Opaque,
|
|
|
|
+ shadows : true,
|
|
|
|
+ culling : true,
|
|
|
|
+ light : true,
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ return props;
|
|
}
|
|
}
|
|
|
|
|
|
- #if hxbit
|
|
|
|
|
|
+ override function refreshProps() {
|
|
|
|
+ if( props == null || mainPass == null ) return;
|
|
|
|
+ var props : DefaultProps = props;
|
|
|
|
+ switch( props.kind ) {
|
|
|
|
+ case Opaque, AlphaKill:
|
|
|
|
+ mainPass.setBlendMode(None);
|
|
|
|
+ mainPass.depthWrite = true;
|
|
|
|
+ mainPass.setPassName("default");
|
|
|
|
+ case Alpha:
|
|
|
|
+ mainPass.setBlendMode(Alpha);
|
|
|
|
+ mainPass.depthWrite = true;
|
|
|
|
+ mainPass.setPassName("alpha");
|
|
|
|
+ case Add:
|
|
|
|
+ mainPass.setBlendMode(Add);
|
|
|
|
+ mainPass.depthWrite = false;
|
|
|
|
+ mainPass.setPassName("additive");
|
|
|
|
+ case SoftAdd:
|
|
|
|
+ mainPass.setBlendMode(SoftAdd);
|
|
|
|
+ mainPass.depthWrite = false;
|
|
|
|
+ mainPass.setPassName("additive");
|
|
|
|
+ }
|
|
|
|
+ var tshader = textureShader;
|
|
|
|
+ if( tshader != null ) {
|
|
|
|
+ tshader.killAlpha = props.kind == AlphaKill;
|
|
|
|
+ tshader.killAlphaThreshold = 0.5;
|
|
|
|
+ }
|
|
|
|
+ mainPass.culling = props.culling ? Back : None;
|
|
|
|
+ mainPass.enableLights = props.light;
|
|
|
|
+ shadows = props.shadows;
|
|
|
|
+ if( shadows )
|
|
|
|
+ getPass("shadow").culling = mainPass.culling;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ #if js
|
|
|
|
+ override function editProps() {
|
|
|
|
+ return new js.jquery.JQuery('
|
|
|
|
+ <dl>
|
|
|
|
+ <dt>Kind</dt>
|
|
|
|
+ <dd>
|
|
|
|
+ <select field="kind">
|
|
|
|
+ <option value="Opaque">Opaque</option>
|
|
|
|
+ <option value="Alpha">Alpha</option>
|
|
|
|
+ <option value="AlphaKill">AlphaKill</option>
|
|
|
|
+ <option value="Add">Add</option>
|
|
|
|
+ <option value="SoftAdd">SoftAdd</option>
|
|
|
|
+ </select>
|
|
|
|
+ </dd>
|
|
|
|
+ <dt>Shadows</dt><dd><input type="checkbox" field="shadows"/></dd>
|
|
|
|
+ <dt>Culled</dt><dd><input type="checkbox" field="culled"/></dd>
|
|
|
|
+ <dt>Lighted</dt><dd><input type="checkbox" field="lighted"/></dd>
|
|
|
|
+ </dl>
|
|
|
|
+ ');
|
|
|
|
+ }
|
|
|
|
+ #end
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ #if hxbit
|
|
function customSerialize( ctx : hxbit.Serializer ) {
|
|
function customSerialize( ctx : hxbit.Serializer ) {
|
|
// other props are serialized in BaseMaterial !
|
|
// other props are serialized in BaseMaterial !
|
|
ctx.addInt(blendMode.getIndex());
|
|
ctx.addInt(blendMode.getIndex());
|
|
@@ -230,7 +329,6 @@ class Material extends BaseMaterial {
|
|
props = ctx.getDynamic();
|
|
props = ctx.getDynamic();
|
|
passes = old;
|
|
passes = old;
|
|
}
|
|
}
|
|
-
|
|
|
|
#end
|
|
#end
|
|
|
|
|
|
}
|
|
}
|