|
@@ -1,4 +1,5 @@
|
|
|
package hide.prefab.terrain;
|
|
|
+import h3d.shader.pbr.AlphaMultiply;
|
|
|
import h3d.shader.FixedColor;
|
|
|
import h3d.mat.Stencil;
|
|
|
import hrt.prefab.l3d.AdvancedDecal;
|
|
@@ -21,16 +22,18 @@ class Brush {
|
|
|
brushMode = new BrushMode();
|
|
|
}
|
|
|
|
|
|
- public function isValid() : Bool{
|
|
|
- return ( brushMode.mode == Delete || (bitmap != null && tex != null && name != null && step > 0.0 && texPath != null));
|
|
|
+ public function isValid() : Bool {
|
|
|
+ return ( brushMode.mode == Delete || (bitmap != null && tex != null && name != null && step > 0.0 && texPath != null) );
|
|
|
}
|
|
|
|
|
|
- public function scaleForTex(tileSize : Float, texResolution : Float){
|
|
|
- var scale = size / ((tileSize / texResolution) * tex.width);
|
|
|
- bitmap.setScale(scale);
|
|
|
+ public function scaleForTex( tileSize : Float, texResolution : Float ) {
|
|
|
+ if( tex != null ) {
|
|
|
+ var scale = size / ((tileSize / texResolution) * tex.width);
|
|
|
+ bitmap.setScale(scale);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- public function drawTo( target : h3d.mat.Texture, pos : h3d.Vector, tileSize : Float, ?offset = 0){
|
|
|
+ public function drawTo( target : h3d.mat.Texture, pos : h3d.Vector, tileSize : Float, ?offset = 0 ) {
|
|
|
var texSize = target.width + offset;
|
|
|
scaleForTex(tileSize, texSize);
|
|
|
bitmap.setPosition(
|
|
@@ -66,55 +69,69 @@ class BrushMode {
|
|
|
public function new(){}
|
|
|
}
|
|
|
|
|
|
-class BrushPreview extends h3d.scene.Object {
|
|
|
+class AlphaMult extends hxsl.Shader {
|
|
|
+ static var SRC = {
|
|
|
+ @param var amount : Float;
|
|
|
+ var pixelColor : Vec4;
|
|
|
+ function fragment() {
|
|
|
+ pixelColor.a *= amount;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class BrushPreview extends h3d.scene.Mesh {
|
|
|
|
|
|
var terrain : hrt.prefab.terrain.TerrainMesh;
|
|
|
- var mesh : h3d.scene.pbr.Decal;
|
|
|
- var shader : h3d.shader.pbr.VolumeDecal.DecalOverlay;
|
|
|
+ var decalShader : h3d.shader.pbr.VolumeDecal.DecalOverlay;
|
|
|
+ public var opacity : Float = 1.0;
|
|
|
|
|
|
public function new( terrain : hrt.prefab.terrain.TerrainMesh ) {
|
|
|
- super(terrain.getScene());
|
|
|
this.terrain = terrain;
|
|
|
- mesh = new h3d.scene.pbr.Decal(h3d.prim.Cube.defaultUnitCube(), this);
|
|
|
- shader = new h3d.shader.pbr.VolumeDecal.DecalOverlay();
|
|
|
- mesh.material.mainPass.addShader(shader);
|
|
|
- mesh.material.mainPass.setPassName("afterTonemappingDecal");
|
|
|
- mesh.material.mainPass.depthWrite = false;
|
|
|
- mesh.material.mainPass.depthTest = GreaterEqual;
|
|
|
- mesh.material.mainPass.culling = Front;
|
|
|
- mesh.material.shadows = false;
|
|
|
- mesh.material.blendMode = Alpha;
|
|
|
- mesh.scaleZ = 1000;
|
|
|
- shader.fadeStart = 1;
|
|
|
- shader.fadeEnd = 0;
|
|
|
- shader.fadePower = 1;
|
|
|
- shader.emissive = 0;
|
|
|
+ var material = h3d.mat.MaterialSetup.current.createMaterial();
|
|
|
+ material.props = material.getDefaultProps();
|
|
|
+ material.mainPass.removeShader(material.mainPass.getShader(h3d.shader.pbr.PropsValues));
|
|
|
+ material.mainPass.setPassName("afterTonemappingDecal");
|
|
|
+ material.mainPass.depthWrite = false;
|
|
|
+ material.mainPass.depthTest = GreaterEqual;
|
|
|
+ material.mainPass.culling = Front;
|
|
|
+ material.blendMode = Alpha;
|
|
|
+ material.shadows = false;
|
|
|
+ super(h3d.prim.Cube.defaultUnitCube(), material, terrain.getScene());
|
|
|
+ decalShader = new h3d.shader.pbr.VolumeDecal.DecalOverlay();
|
|
|
+ decalShader.fadeStart = 1;
|
|
|
+ decalShader.fadeEnd = 0;
|
|
|
+ decalShader.fadePower = 1;
|
|
|
+ decalShader.emissive = 0;
|
|
|
+ decalShader.CENTERED = true;
|
|
|
+ decalShader.GAMMA_CORRECT = false;
|
|
|
+ material.mainPass.addShader(decalShader);
|
|
|
var colorSet = new FixedColor();
|
|
|
colorSet.color.set(1,1,1,1);
|
|
|
colorSet.USE_ALPHA = false;
|
|
|
- mesh.material.mainPass.addShader(colorSet);
|
|
|
- shader.CENTERED = true;
|
|
|
+ material.mainPass.addShader(colorSet);
|
|
|
+ var am = new AlphaMult();
|
|
|
+ am.setPriority(-1);
|
|
|
+ am.amount = opacity;
|
|
|
+ material.mainPass.addShader(am);
|
|
|
|
|
|
// Only draw the preview on terrain
|
|
|
- mesh.material.mainPass.stencil = new h3d.mat.Stencil();
|
|
|
- mesh.material.mainPass.stencil.setFunc(Equal, 0x01, 0x01, 0x01);
|
|
|
- mesh.material.mainPass.stencil.setOp(Keep, Keep, Keep);
|
|
|
- }
|
|
|
-
|
|
|
- public function setBrushTexture( texture : h3d.mat.Texture ) {
|
|
|
- shader.colorTexture = texture;
|
|
|
+ material.mainPass.stencil = new h3d.mat.Stencil();
|
|
|
+ material.mainPass.stencil.setFunc(Equal, 0x01, 0x01, 0x01);
|
|
|
+ material.mainPass.stencil.setOp(Keep, Keep, Keep);
|
|
|
}
|
|
|
|
|
|
public function previewAt( brush : Brush, pos : h3d.Vector ) {
|
|
|
setPosition(pos.x, pos.y, pos.z);
|
|
|
- setBrushTexture( brush.tex );
|
|
|
setScale(brush.size);
|
|
|
+ scaleZ = 1000;
|
|
|
+ decalShader.colorTexture = brush.tex;
|
|
|
+ material.mainPass.getShader(AlphaMult).amount = opacity;
|
|
|
visible = true;
|
|
|
}
|
|
|
|
|
|
public function reset() {
|
|
|
setPosition(0,0,0);
|
|
|
visible = false;
|
|
|
- shader.colorTexture = null;
|
|
|
+ decalShader.colorTexture = null;
|
|
|
}
|
|
|
}
|