浏览代码

refactor :
- remove h3d.pass.Base and h3d.pass.Default (becomes h3d.pass.Output)
- h3d.pass.ShaderManager becomes h3d.pass.OutputShader
- cleanup old debug shader code display

Nicolas Cannasse 1 年之前
父节点
当前提交
6a4a4e0453

+ 0 - 17
h2d/Drawable.hx

@@ -139,23 +139,6 @@ class Drawable extends Object {
 		return m;
 	}
 
-	/**
-		Returns the built shader code, can be used for debugging shader assembly
-		@param toHxsl Whether return an HXSL shader or the native shading language of the backend.
-	**/
-	public function getDebugShaderCode( toHxsl = true ) {
-		var shader = @:privateAccess {
-			var ctx = getScene().ctx;
-			ctx.manager.compileShaders(ctx.globals, new hxsl.ShaderList(ctx.baseShader,shaders));
-		}
-		if( toHxsl ) {
-			var toString = hxsl.Printer.shaderToString.bind(_, true);
-			return "// vertex:\n" + toString(shader.vertex.data) + "\n\nfragment:\n" + toString(shader.fragment.data);
-		} else {
-			return h3d.Engine.getCurrent().driver.getNativeShaderCode(shader);
-		}
-	}
-
 	/**
 		Returns the first shader of the given shader class among the drawable shaders.
 		@param stype The class of the shader to look up.

+ 3 - 3
h2d/RenderContext.hx

@@ -80,7 +80,7 @@ class RenderContext extends h3d.impl.RenderContext {
 	public var tmpBounds = new h2d.col.Bounds();
 	var texture : h3d.mat.Texture;
 	var baseShader : h3d.shader.Base2d;
-	var manager : h3d.pass.ShaderManager;
+	var output : h3d.pass.OutputShader;
 	var compiledShader : hxsl.RuntimeShader;
 	var buffers : h3d.shader.Buffers;
 	var fixedBuffer : h3d.Buffer;
@@ -128,7 +128,7 @@ class RenderContext extends h3d.impl.RenderContext {
 		if( BUFFERING )
 			buffer = new hxd.FloatBuffer();
 		bufPos = 0;
-		manager = new h3d.pass.ShaderManager();
+		output = new h3d.pass.OutputShader();
 		pass = new h3d.mat.Pass("",null);
 		pass.depth(true, Always);
 		pass.culling = None;
@@ -210,7 +210,7 @@ class RenderContext extends h3d.impl.RenderContext {
 
 	function initShaders( shaders ) {
 		currentShaders = shaders;
-		compiledShader = manager.compileShaders(globals, shaders);
+		compiledShader = output.compileShaders(globals, shaders);
 		if( buffers == null )
 			buffers = new h3d.shader.Buffers(compiledShader);
 		else

+ 2 - 2
h2d/Scene.hx

@@ -746,9 +746,9 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I
 		} else if( @:privateAccess ctx.targetFlipY == 0 )
 			ctx.begin(); // ctx was never init, most likely a new scene
 		ctx.pushTargets(texs);
-		if( outputs != null ) @:privateAccess ctx.manager.setOutput(outputs);
+		if( outputs != null ) @:privateAccess ctx.output.setOutput(outputs);
 		s.drawRec(ctx);
-		if( outputs != null ) @:privateAccess ctx.manager.setOutput();
+		if( outputs != null ) @:privateAccess ctx.output.setOutput();
 		ctx.popTarget();
 		ctx.engine.backgroundColor = oldBG;
 		if( !inRender ) {

+ 0 - 12
h3d/mat/Pass.hx

@@ -377,16 +377,4 @@ class Pass {
 		return p;
 	}
 
-	#if !macro
-	public function getDebugShaderCode( scene : h3d.scene.Scene, toHxsl = true ) {
-		var shader = scene.renderer.debugCompileShader(this);
-		if( toHxsl ) {
-			var toString = hxsl.Printer.shaderToString.bind(_, true);
-			return "// vertex:\n" + toString(shader.vertex.data) + "\n\nfragment:\n" + toString(shader.fragment.data);
-		} else {
-			return h3d.Engine.getCurrent().driver.getNativeShaderCode(shader);
-		}
-	}
-	#end
-
 }

+ 0 - 27
h3d/pass/Base.hx

@@ -1,27 +0,0 @@
-package h3d.pass;
-
-class Base {
-
-	var ctx : h3d.scene.RenderContext;
-	public var name(default, null) : String;
-
-	public function new(name) {
-		this.name = name;
-	}
-
-	public function compileShader( p : h3d.mat.Pass ) : hxsl.RuntimeShader {
-		throw "Not implemented for this pass";
-		return null;
-	}
-
-	public function setContext( ctx ) {
-		this.ctx = ctx;
-	}
-
-	public function dispose() {
-	}
-
-	public function draw( passes : PassList, ?sort : h3d.pass.PassList -> Void ) {
-	}
-
-}

+ 0 - 121
h3d/pass/Default.hx

@@ -1,121 +0,0 @@
-package h3d.pass;
-
-@:access(h3d.mat.Pass)
-class Default extends Base {
-
-	var manager : ShaderManager;
-	var globals(get, never) : hxsl.Globals;
-	var defaultSort = new SortByMaterial().sort;
-
-	inline function get_globals() return ctx.globals;
-
-	public function new(name) {
-		super(name);
-		manager = new ShaderManager(getOutputs());
-	}
-
-	function getOutputs() : Array<hxsl.Output> {
-		return [Value("output.color")];
-	}
-
-	override function compileShader( p : h3d.mat.Pass ) {
-		var o = @:privateAccess new h3d.pass.PassObject();
-		o.pass = p;
-		setupShaders(new h3d.pass.PassList(o));
-		return manager.compileShaders(ctx.globals, o.shaders, p.batchMode ? Batch : Default);
-	}
-
-	function processShaders( p : h3d.pass.PassObject, shaders : hxsl.ShaderList ) {
-		var p = ctx.extraShaders;
-		while( p != null ) {
-			shaders = ctx.allocShaderList(p.s, shaders);
-			p = p.next;
-		}
-		return shaders;
-	}
-
-	@:access(h3d.scene)
-	function setupShaders( passes : h3d.pass.PassList ) {
-		var lightInit = false;
-		for( p in passes ) {
-			var shaders = p.pass.getShadersRec();
-			shaders = processShaders(p, shaders);
-			if( p.pass.enableLights && ctx.lightSystem != null ) {
-				if( !lightInit ) {
-					ctx.lightSystem.initGlobals(globals);
-					lightInit = true;
-				}
-				shaders = ctx.lightSystem.computeLight(p.obj, shaders);
-			}
-			p.shader = manager.compileShaders(ctx.globals, shaders, p.pass.batchMode ? Batch : Default);
-			p.shaders = shaders;
-			var t = p.shader.fragment.textures;
-			if( t == null || t.type.match(TArray(_)) )
-				p.texture = 0;
-			else {
-				var t : h3d.mat.Texture = ctx.getParamValue(t, shaders, true);
-				p.texture = t == null ? 0 : t.id;
-			}
-		}
-	}
-
-	inline function log( str : String ) {
-		ctx.engine.driver.log(str);
-	}
-
-	function drawObject( p : h3d.pass.PassObject ) {
-		ctx.drawPass = p;
-		ctx.engine.selectMaterial(p.pass);
-		@:privateAccess p.obj.draw(ctx);
-	}
-
-	public static var onShaderError : Dynamic -> PassObject -> Void;
-
-	@:access(h3d.scene)
-	override function draw( passes : h3d.pass.PassList, ?sort : h3d.pass.PassList -> Void ) {
-		if( passes.isEmpty() )
-			return;
-		#if sceneprof h3d.impl.SceneProf.begin("draw", ctx.frame); #end
-		ctx.setupTarget();
-		setupShaders(passes);
-		if( sort == null )
-			defaultSort(passes);
-		else
-			sort(passes);
-		var buf = ctx.shaderBuffers, prevShader = null;
-		for( p in passes ) {
-			#if sceneprof h3d.impl.SceneProf.mark(p.obj); #end
-			ctx.globalModelView = p.obj.absPos;
-			if( p.shader.hasGlobal(ctx.globalModelViewInverse_id.toInt()) )
-				ctx.globalModelViewInverse = p.obj.getInvPos();
-			if( prevShader != p.shader ) {
-				prevShader = p.shader;
-				if( onShaderError != null ) {
-					try {
-						ctx.engine.selectShader(p.shader);
-					} catch(e : Dynamic) {
-						onShaderError(e, p);
-						continue;
-					}
-				} else {
-					ctx.engine.selectShader(p.shader);
-				}
-				if( buf == null )
-					buf = ctx.shaderBuffers = new h3d.shader.Buffers(p.shader);
-				else
-					buf.grow(p.shader);
-				ctx.fillGlobals(buf, p.shader);
-				ctx.engine.uploadShaderBuffers(buf, Globals);
-			}
-			if( !p.pass.dynamicParameters ) {
-				ctx.fillParams(buf, p.shader, p.shaders);
-				ctx.engine.uploadShaderBuffers(buf, Params);
-				ctx.engine.uploadShaderBuffers(buf, Textures);
-				ctx.engine.uploadShaderBuffers(buf, Buffers);
-			}
-			drawObject(p);
-		}
-		#if sceneprof h3d.impl.SceneProf.end(); #end
-		ctx.nextPass();
-	}
-}

+ 110 - 7
h3d/pass/Output.hx

@@ -1,16 +1,119 @@
 package h3d.pass;
 
-class Output extends Default {
+@:access(h3d.mat.Pass)
+class Output {
 
-	var outputs : Array<hxsl.Output>;
+	public var name(default, null) : String;
+	var ctx : h3d.scene.RenderContext;
+	var output : OutputShader;
+	var globals(get, never) : hxsl.Globals;
+	var defaultSort = new SortByMaterial().sort;
 
-	public function new( name, outputs ) {
-		this.outputs = outputs;
-		super(name);
+	inline function get_globals() return ctx.globals;
+
+	public function new(name, ?output) {
+		this.name = name;
+		this.output = new OutputShader(output);
+	}
+
+	public function setContext( ctx ) {
+		this.ctx = ctx;
+	}
+
+	public function dispose() {
+	}
+
+	function processShaders( p : h3d.pass.PassObject, shaders : hxsl.ShaderList ) {
+		var p = ctx.extraShaders;
+		while( p != null ) {
+			shaders = ctx.allocShaderList(p.s, shaders);
+			p = p.next;
+		}
+		return shaders;
 	}
 
-	override function getOutputs() {
-		return outputs;
+	@:access(h3d.scene)
+	function setupShaders( passes : h3d.pass.PassList ) {
+		var lightInit = false;
+		for( p in passes ) {
+			var shaders = p.pass.getShadersRec();
+			shaders = processShaders(p, shaders);
+			if( p.pass.enableLights && ctx.lightSystem != null ) {
+				if( !lightInit ) {
+					ctx.lightSystem.initGlobals(globals);
+					lightInit = true;
+				}
+				shaders = ctx.lightSystem.computeLight(p.obj, shaders);
+			}
+			p.shader = output.compileShaders(ctx.globals, shaders, p.pass.batchMode ? Batch : Default);
+			p.shaders = shaders;
+			var t = p.shader.fragment.textures;
+			if( t == null || t.type.match(TArray(_)) )
+				p.texture = 0;
+			else {
+				var t : h3d.mat.Texture = ctx.getParamValue(t, shaders, true);
+				p.texture = t == null ? 0 : t.id;
+			}
+		}
 	}
 
+	inline function log( str : String ) {
+		ctx.engine.driver.log(str);
+	}
+
+	function drawObject( p : h3d.pass.PassObject ) {
+		ctx.drawPass = p;
+		ctx.engine.selectMaterial(p.pass);
+		@:privateAccess p.obj.draw(ctx);
+	}
+
+	public static var onShaderError : Dynamic -> PassObject -> Void;
+
+	@:access(h3d.scene)
+	public function draw( passes : h3d.pass.PassList, ?sort : h3d.pass.PassList -> Void ) {
+		if( passes.isEmpty() )
+			return;
+		#if sceneprof h3d.impl.SceneProf.begin("draw", ctx.frame); #end
+		ctx.setupTarget();
+		setupShaders(passes);
+		if( sort == null )
+			defaultSort(passes);
+		else
+			sort(passes);
+		var buf = ctx.shaderBuffers, prevShader = null;
+		for( p in passes ) {
+			#if sceneprof h3d.impl.SceneProf.mark(p.obj); #end
+			ctx.globalModelView = p.obj.absPos;
+			if( p.shader.hasGlobal(ctx.globalModelViewInverse_id.toInt()) )
+				ctx.globalModelViewInverse = p.obj.getInvPos();
+			if( prevShader != p.shader ) {
+				prevShader = p.shader;
+				if( onShaderError != null ) {
+					try {
+						ctx.engine.selectShader(p.shader);
+					} catch(e : Dynamic) {
+						onShaderError(e, p);
+						continue;
+					}
+				} else {
+					ctx.engine.selectShader(p.shader);
+				}
+				if( buf == null )
+					buf = ctx.shaderBuffers = new h3d.shader.Buffers(p.shader);
+				else
+					buf.grow(p.shader);
+				ctx.fillGlobals(buf, p.shader);
+				ctx.engine.uploadShaderBuffers(buf, Globals);
+			}
+			if( !p.pass.dynamicParameters ) {
+				ctx.fillParams(buf, p.shader, p.shaders);
+				ctx.engine.uploadShaderBuffers(buf, Params);
+				ctx.engine.uploadShaderBuffers(buf, Textures);
+				ctx.engine.uploadShaderBuffers(buf, Buffers);
+			}
+			drawObject(p);
+		}
+		#if sceneprof h3d.impl.SceneProf.end(); #end
+		ctx.nextPass();
+	}
 }

+ 1 - 1
h3d/pass/ShaderManager.hx → h3d/pass/OutputShader.hx

@@ -1,6 +1,6 @@
 package h3d.pass;
 
-class ShaderManager {
+class OutputShader {
 
 	var shaderCache : hxsl.Cache;
 	var currentOutput : hxsl.ShaderList;

+ 3 - 3
h3d/pass/ScreenFx.hx

@@ -5,14 +5,14 @@ class ScreenFx<T:h3d.shader.ScreenShader> {
 	public var shader : T;
 	public var pass : h3d.mat.Pass;
 	public var primitive : h3d.prim.Primitive;
-	var manager : ShaderManager;
+	var output : OutputShader;
 	var _engine : h3d.Engine;
 	var engine(get,never) : h3d.Engine;
 	var buffers : h3d.shader.Buffers;
 
 	public function new(shader, ?output) {
 		this.shader = shader;
-		manager = new ShaderManager(output);
+		this.output = new OutputShader(output);
 		pass = new h3d.mat.Pass("screenfx", new hxsl.ShaderList(shader));
 		pass.culling = None;
 		pass.depth(false, Always);
@@ -51,7 +51,7 @@ class ScreenFx<T:h3d.shader.ScreenShader> {
 			ctx = @:privateAccess new h3d.impl.RenderContext();
 			ctx.setCurrent();
 		}
-		var rts = manager.compileShaders(ctx.globals, shaders);
+		var rts = output.compileShaders(ctx.globals, shaders);
 		engine.selectMaterial(pass);
 		engine.selectShader(rts);
 		if( buffers == null )

+ 3 - 3
h3d/pass/Shadows.hx

@@ -13,7 +13,7 @@ enum ShadowSamplingKind {
 		ESM;
 	}
 
-class Shadows extends Default {
+class Shadows extends Output {
 
 	var lightCamera : h3d.Camera;
 	var format : hxd.PixelFormat;
@@ -34,7 +34,7 @@ class Shadows extends Default {
 	public function new(light) {
 		if( format == null ) format = R16F;
 		if( !h3d.Engine.getCurrent().driver.isSupportedFormat(format) ) format = h3d.mat.Texture.nativeFormat;
-		super("shadow");
+		super("shadow", getOutputs());
 		this.light = light;
 		blur = new Blur(5);
 		blur.quality = 0.5;
@@ -77,7 +77,7 @@ class Shadows extends Default {
 		return false;
 	}
 
-	override function getOutputs() : Array<hxsl.Output> {
+	function getOutputs() : Array<hxsl.Output> {
 		if(isUsingWorldDist())
 			return [Swiz(Value("output.worldDist",1),[X,X,X,X])];
 

+ 3 - 3
h3d/scene/MeshBatch.hx

@@ -119,10 +119,10 @@ class MeshBatch extends MultiMaterial {
 				var ctx = scene.renderer.getPassByName(p.name);
 				if( ctx == null ) throw "Could't find renderer pass "+p.name;
 
-				var manager = cast(ctx,h3d.pass.Default).manager;
+				var output = ctx.output;
 				var shaders = p.getShadersRec();
-				var rt = manager.compileShaders(scene.ctx.globals, shaders, Default);
-				var shader = manager.shaderCache.makeBatchShader(rt, shaders, instancedParams);
+				var rt = output.compileShaders(scene.ctx.globals, shaders, Default);
+				var shader = output.shaderCache.makeBatchShader(rt, shaders, instancedParams);
 
 				var b = new BatchData();
 				b.indexCount = matInfo.count;

+ 3 - 10
h3d/scene/Renderer.hx

@@ -18,9 +18,9 @@ enum RenderMode{
 @:allow(h3d.pass.Shadows)
 class Renderer extends hxd.impl.AnyProps {
 
-	var defaultPass : h3d.pass.Base;
+	var defaultPass : h3d.pass.Output;
 	var passObjects : Map<String,PassObjects>;
-	var allPasses : Array<h3d.pass.Base>;
+	var allPasses : Array<h3d.pass.Output>;
 	var emptyPasses = new h3d.pass.PassList();
 	var ctx : RenderContext;
 	var hasSetTarget = false;
@@ -70,7 +70,7 @@ class Renderer extends hxd.impl.AnyProps {
 	public function addShader( s : hxsl.Shader ) {
 	}
 
-	public function getPass<T:h3d.pass.Base>( c : Class<T> ) : T {
+	public function getPass<T:h3d.pass.Output>( c : Class<T> ) : T {
 		for( p in allPasses )
 			if( Std.isOfType(p, c) )
 				return cast p;
@@ -84,13 +84,6 @@ class Renderer extends hxd.impl.AnyProps {
 		return null;
 	}
 
-	public function debugCompileShader( pass : h3d.mat.Pass ) {
-		var p = getPassByName(pass.name);
-		if( p == null ) p = defaultPass;
-		p.setContext(ctx);
-		return p.compileShader(pass);
-	}
-
 	function hasFeature(f) {
 		return h3d.Engine.getCurrent().driver.hasFeature(f);
 	}

+ 10 - 18
h3d/scene/fwd/Renderer.hx

@@ -1,19 +1,15 @@
 package h3d.scene.fwd;
 
-class DepthPass extends h3d.pass.Default {
+class DepthPass extends h3d.pass.Output {
 
 	var depthMapId : Int;
 	public var enableSky : Bool = false;
 
 	public function new() {
-		super("depth");
+		super("depth",  [PackFloat(Value("output.depth"))]);
 		depthMapId = hxsl.Globals.allocID("depthMap");
 	}
 
-	override function getOutputs() : Array<hxsl.Output> {
-		return [PackFloat(Value("output.depth"))];
-	}
-
 	override function draw( passes, ?sort ) {
 		var texture = ctx.textures.allocTarget("depthMap", ctx.engine.width, ctx.engine.height, true);
 		ctx.engine.pushTarget(texture);
@@ -25,19 +21,15 @@ class DepthPass extends h3d.pass.Default {
 
 }
 
-class NormalPass extends h3d.pass.Default {
+class NormalPass extends h3d.pass.Output {
 
 	var normalMapId : Int;
 
 	public function new() {
-		super("normal");
+		super("normal", [PackNormal(Value("output.normal"))]);
 		normalMapId = hxsl.Globals.allocID("normalMap");
 	}
 
-	override function getOutputs() : Array<hxsl.Output> {
-		return [PackNormal(Value("output.normal"))];
-	}
-
 	override function draw( passes, ?sort ) {
 		var texture = ctx.textures.allocTarget("normalMap", ctx.engine.width, ctx.engine.height);
 		ctx.engine.pushTarget(texture);
@@ -51,25 +43,25 @@ class NormalPass extends h3d.pass.Default {
 
 class Renderer extends h3d.scene.Renderer {
 
-	var def(get, never) : h3d.pass.Base;
-	public var depth : h3d.pass.Base = new DepthPass();
-	public var normal : h3d.pass.Base = new NormalPass();
+	var def(get, never) : h3d.pass.Output;
+	public var depth : h3d.pass.Output = new DepthPass();
+	public var normal : h3d.pass.Output = new NormalPass();
 	public var shadow = new h3d.pass.DefaultShadowMap(1024);
 
 	public function new() {
 		super();
-		defaultPass = new h3d.pass.Default("default");
+		defaultPass = new h3d.pass.Output("default");
 		allPasses = [defaultPass, depth, normal, shadow];
 	}
 
 	inline function get_def() return defaultPass;
 
 	// can be overriden for benchmark purposes
-	function renderPass(p:h3d.pass.Base, passes, ?sort) {
+	function renderPass(p:h3d.pass.Output, passes, ?sort) {
 		p.draw(passes, sort);
 	}
 
-	override function getPassByName(name:String):h3d.pass.Base {
+	override function getPassByName(name:String):h3d.pass.Output {
 		if( name == "alpha" || name == "additive" )
 			return defaultPass;
 		return super.getPassByName(name);

+ 3 - 8
h3d/scene/pbr/Renderer.hx

@@ -135,7 +135,7 @@ class Renderer extends h3d.scene.Renderer {
 	public function new(?env) {
 		super();
 		this.env = env;
-		defaultPass = new h3d.pass.Default("color");
+		defaultPass = new h3d.pass.Output("color");
 		slides.addShader(pbrProps);
 		pbrOut.addShader(pbrIndirect);
 		pbrOut.addShader(pbrProps);
@@ -163,12 +163,7 @@ class Renderer extends h3d.scene.Renderer {
 	inline function get_exposure() return tonemap.shader.exposure;
 	inline function set_exposure(v:Float) return tonemap.shader.exposure = v;
 
-	override function debugCompileShader(pass:h3d.mat.Pass) {
-		output.setContext(this.ctx);
-		return output.compileShader(pass);
-	}
-
-	override function getPassByName(name:String):h3d.pass.Base {
+	override function getPassByName(name:String):h3d.pass.Output {
 		switch( name ) {
 		case "overlay", "beforeTonemapping", "beforeTonemappingAlpha", "albedo", "afterTonemapping", "forward", "forwardAlpha", "distortion":
 			return defaultPass;
@@ -221,7 +216,7 @@ class Renderer extends h3d.scene.Renderer {
 		passes.reset();
 	}
 
-	function renderPass(p:h3d.pass.Base, passes, ?sort) {
+	function renderPass(p:h3d.pass.Output, passes, ?sort) {
 		cullPasses(passes, function(col) return col.inFrustum(ctx.camera.frustum));
 		p.draw(passes, sort);
 		passes.reset();