Browse Source

added second outline to distinguish between visible/masked object parts

Nicolas Cannasse 4 years ago
parent
commit
7b05e2d65a
2 changed files with 16 additions and 5 deletions
  1. 8 5
      hide/Renderer.hx
  2. 8 0
      hrt/prefab/Object3D.hx

+ 8 - 5
hide/Renderer.hx

@@ -71,9 +71,10 @@ class Renderer extends h3d.scene.fwd.Renderer {
 
 		var outlineTex = allocTarget("outlineBlur", false);
 		{
-			var outlineSrcTex = allocTarget("outline", false);
+			var outlineSrcTex = allocTarget("outline", true);
 			setTarget(outlineSrcTex);
 			clear(0);
+			draw("highlightBack");
 			draw("highlight");
 			resetTarget();
 			outlineBlur.apply(ctx, outlineSrcTex, outlineTex);
@@ -127,7 +128,7 @@ class ScreenOutline extends h3d.shader.ScreenShader {
 		function fragment() {
 			var outval = texture.get(calculatedUV).rgb;
 			pixelColor.a = outval.r > 0.1 && outval.r < 0.5 ? 1.0 : 0.0;
-			pixelColor.rgb = vec3(1,1,1);
+			pixelColor.rgb = (outval.r > outval.g ? 0.5 : 1.0).xxx;
 		}
 	};
 }
@@ -144,7 +145,7 @@ class PbrRenderer extends h3d.scene.pbr.Renderer {
 
 	override function getPassByName(name:String):h3d.pass.Base {
 		switch( name ) {
-		case "highlight":
+		case "highlight", "hightlightBack":
 			return defaultPass;
 		}
 		return super.getPassByName(name);
@@ -159,15 +160,17 @@ class PbrRenderer extends h3d.scene.pbr.Renderer {
 	override function end() {
 		switch( currentStep ) {
 		case MainDraw:
-		case AfterTonemapping:
-			var outlineTex = allocTarget("outline", false);
+		case BeforeTonemapping:
+			var outlineTex = allocTarget("outline", true);
 			ctx.engine.pushTarget(outlineTex);
 			clear(0);
+			draw("highlightBack");
 			draw("highlight");
 			ctx.engine.popTarget();
 			var outlineBlurTex = allocTarget("outlineBlur", false);
 			outlineBlur.apply(ctx, outlineTex, outlineBlurTex);
 			outline.shader.texture = outlineBlurTex;
+		case AfterTonemapping:
 			outline.render();
 			renderPass(defaultPass, get("debuggeom"), backToFront);
 			renderPass(defaultPass, get("debuggeom_alpha"), backToFront);

+ 8 - 0
hrt/prefab/Object3D.hx

@@ -159,18 +159,26 @@ class Object3D extends Prefab {
 			for( m in materials ) {
 				//m.mainPass.stencil = null;
 				m.removePass(m.getPass("highlight"));
+				m.removePass(m.getPass("highlightBack"));
 			}
 			return true;
 		}
 
 		var shader = new h3d.shader.FixedColor(0xffffff);
+		var shader2 = new h3d.shader.FixedColor(0xff8000);
 		for( m in materials ) {
 			if( m.name != null && StringTools.startsWith(m.name,"$UI.") )
 				continue;
 			var p = m.allocPass("highlight");
 			p.culling = None;
 			p.depthWrite = false;
+			p.depthTest = LessEqual;
 			p.addShader(shader);
+			var p = m.allocPass("highlightBack");
+			p.culling = None;
+			p.depthWrite = false;
+			p.depthTest = Always;
+			p.addShader(shader2);
 		}
 		return true;
 	}