Sfoglia il codice sorgente

RFX: remove volume from heaps

lviguier 2 settimane fa
parent
commit
20a56b4391
3 ha cambiato i file con 0 aggiunte e 145 eliminazioni
  1. 0 57
      h3d/impl/RendererFXVolume.hx
  2. 0 82
      h3d/scene/Renderer.hx
  3. 0 6
      h3d/scene/pbr/Renderer.hx

+ 0 - 57
h3d/impl/RendererFXVolume.hx

@@ -1,57 +0,0 @@
-package h3d.impl;
-
-enum Shape {
-	Sphere(radius : Float);
-	Box(width : Float, height: Float);
-}
-
-class RendererFXVolume extends h3d.scene.Object {
-	public var priority : Int;
-	public var innerShape : Shape;
-	public var outerShape : Shape;
-	public var effects : Array<h3d.impl.RendererFX> = [];
-
-	var factor : Float = 0.;
-	var cam : h3d.Camera;
-
-	public function new(?parent : h3d.scene.Object) {
-		super(parent);
-		this.innerShape = Sphere(1);
-		this.outerShape = Sphere(1);
-	}
-
-	override function sync(ctx : h3d.scene.RenderContext) {
-		super.sync(ctx);
-
-		#if !editor
-		if (effects == null) return;
-		factor = getFactor(ctx.camera.pos);
-		var renderer = ctx.scene.renderer;
-		if (factor > 0 && !renderer.volumeEffects.contains(this))
-			renderer.volumeEffects.push(this);
-
-		if (factor <= 0 && renderer.volumeEffects.contains(this))
-			renderer.volumeEffects.remove(this);
-		#end
-	}
-
-	override function onRemove() {
-		super.onRemove();
-		var renderer = getScene().renderer;
-		if (renderer == null) return;
-		renderer.volumeEffects.remove(this);
-	}
-
-	public function getFactor(pos : h3d.col.Point) : Float {
-		var distance = (getAbsPos().getPosition() - pos).length();
-
-		switch ([innerShape, outerShape]) {
-			case [Sphere(r1), Sphere(r2)]:
-				if (distance < r1) return 1;
-				if (distance > r2) return 0;
-				return 1 - hxd.Math.clamp((distance - r1) / (r2 - r1), 0, 1);
-			default:
-				return 0.;
-		}
-	}
-}

+ 0 - 82
h3d/scene/Renderer.hx

@@ -34,8 +34,6 @@ class Renderer extends hxd.impl.AnyProps {
 	#end
 
 	public var effects : Array<h3d.impl.RendererFX> = [];
-	public var volumeEffects : Array<h3d.impl.RendererFXVolume> = [];
-	var toRemove : Array<h3d.impl.RendererFX> = [];
 
 	public var renderMode : RenderMode = Default;
 
@@ -63,9 +61,6 @@ class Renderer extends hxd.impl.AnyProps {
 			p.dispose();
 		for( f in effects )
 			f.dispose();
-		for( v in volumeEffects )
-			for (e in v.effects)
-				e.dispose();
 		if ( ctx.lightSystem != null )
 			ctx.lightSystem.dispose();
 		passObjects = new Map();
@@ -230,81 +225,4 @@ class Renderer extends hxd.impl.AnyProps {
 	public function computeDispatch( shader, x = 1, y = 1, z = 1 ) {
 		ctx.computeDispatch(shader, x, y, z);
 	}
-
-	public function processVolumetricEffects() {
-		if (volumeEffects.length == 1) {
-			for (e in volumeEffects[0].effects) {
-				var newEffect = e.modulate(volumeEffects[0].getFactor(ctx.camera.pos));
-				if (newEffect == null)
-					continue;
-				toRemove.push(newEffect);
-				this.effects.push(newEffect);
-			}
-		}
-		else if (volumeEffects.length >= 2) {
-			// When there is more than 2 active volume effects, we take the top 2 prios and closer distance and
-			// blend them
-			volumeEffects.sort((a, b) -> {
-				if (a.priority != b.priority)
-					return a.priority > b.priority ? -1 : 1;
-
-				var pos = ctx.camera.pos;
-				var aDist = (a.getAbsPos().getPosition() - pos).length();
-				var bDist = (b.getAbsPos().getPosition() - pos).length();
-				return aDist < bDist ? -1 : 1;
-			});
-
-			var r1 = volumeEffects[0];
-			var r2 = volumeEffects[1];
-
-			function containsEffectType(volume : h3d.impl.RendererFXVolume, e : h3d.impl.RendererFX) {
-				var cl = Type.getClass(e);
-				for (effect in volume.effects)
-					if (Std.isOfType(effect, cl))
-						return true;
-				return false;
-			}
-
-			// Push unique renderer FX from volume 1 and volume 2
-			for (e in r1.effects) {
-				if (!containsEffectType(r2, e)) {
-					this.toRemove.push(e);
-					this.effects.push(e);
-				}
-			}
-			for (e in r2.effects) {
-				if (!containsEffectType(r1, e)) {
-					this.toRemove.push(e);
-					this.effects.push(e);
-				}
-			}
-
-			// Manage blending of renderer FX that are in volume 1 and volume 2
-			// Look for which direction the blend should be (r1 -> r2 or r2 -> r1)
-			var isR1toR2 = r1.priority < r2.priority;
-			var volume1 = isR1toR2 ? r1 : r2;
-			var volume2 = isR1toR2 ? r2 : r1;
-			for (e1 in volume1.effects) {
-				if (!containsEffectType(volume2, e1))
-					continue;
-
-				for (e2 in volume2.effects) {
-					var transition = e1.transition(e1, e2);
-					transition.setFactor(volume2.getFactor(ctx.camera.pos));
-					if (transition != null) {
-						this.toRemove.push(transition.effect);
-						this.effects.push(transition.effect);
-					}
-				}
-			}
-		}
-	}
-
-	public function removeVolumetricEffects() {
-		for (e in toRemove) {
-			effects.remove(e);
-			toRemove.remove(e);
-			e.dispose();
-		}
-	}
 }

+ 0 - 6
h3d/scene/pbr/Renderer.hx

@@ -181,11 +181,6 @@ class Renderer extends h3d.scene.Renderer {
 		return super.getPassByName(name);
 	}
 
-	override function startEffects() {
-		processVolumetricEffects();
-		super.startEffects();
-	}
-
 	override function start() {
 		if( pbrLightPass == null ) {
 			pbrLightPass = new h3d.mat.Pass("lights");
@@ -754,7 +749,6 @@ class Renderer extends h3d.scene.Renderer {
 			hxd.Window.getInstance().removeEventTarget(onEvent);
 		}
 		mark("vsync");
-		removeVolumetricEffects();
 		#if render_graph
 		h3d.impl.RenderGraph.end();
 		#end