|
@@ -76,6 +76,7 @@ class Renderer extends h3d.scene.Renderer {
|
|
|
var currentStep : h3d.impl.RendererFX.Step;
|
|
|
var performance = new h3d.pass.ScreenFx(new h3d.shader.pbr.PerformanceViewer());
|
|
|
var indirectEnv = true;
|
|
|
+ var cullingDistanceFactor : Float = 0.0;
|
|
|
|
|
|
var textures = {
|
|
|
albedo : (null:h3d.mat.Texture),
|
|
@@ -209,15 +210,41 @@ class Renderer extends h3d.scene.Renderer {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ inline function cullPassesWithDistance( passes : h3d.pass.PassList, f : h3d.col.Collider -> Bool ) {
|
|
|
+ var prevCollider = null;
|
|
|
+ var prevResult = true;
|
|
|
+ passes.filter(function(p) {
|
|
|
+ var col = p.obj.cullingCollider;
|
|
|
+ if( col == null )
|
|
|
+ return true;
|
|
|
+ if( col != prevCollider ) {
|
|
|
+ prevCollider = col;
|
|
|
+ prevResult = f(col);
|
|
|
+ if ( prevResult ) {
|
|
|
+ var dim = col.dimension() * cullingDistanceFactor;
|
|
|
+ dim = dim * dim;
|
|
|
+ prevResult = dim > ctx.camera.pos.distanceSq(p.obj.getAbsPos().getPosition());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return prevResult;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
override function draw( name : String ) {
|
|
|
var passes = get(name);
|
|
|
- cullPasses(passes, function(col) return col.inFrustum(ctx.camera.frustum));
|
|
|
+ if ( cullingDistanceFactor > 0.0 )
|
|
|
+ cullPassesWithDistance(passes, function(col) return col.inFrustum(ctx.camera.frustum));
|
|
|
+ else
|
|
|
+ cullPasses(passes, function(col) return col.inFrustum(ctx.camera.frustum));
|
|
|
defaultPass.draw(passes);
|
|
|
passes.reset();
|
|
|
}
|
|
|
|
|
|
function renderPass(p:h3d.pass.Output, passes, ?sort) {
|
|
|
- cullPasses(passes, function(col) return col.inFrustum(ctx.camera.frustum));
|
|
|
+ if ( cullingDistanceFactor > 0.0 )
|
|
|
+ cullPassesWithDistance(passes, function(col) return col.inFrustum(ctx.camera.frustum));
|
|
|
+ else
|
|
|
+ cullPasses(passes, function(col) return col.inFrustum(ctx.camera.frustum));
|
|
|
p.draw(passes, sort);
|
|
|
passes.reset();
|
|
|
}
|