|
@@ -14,7 +14,7 @@ class CustomRenderer extends h3d.scene.Renderer {
|
|
|
super();
|
|
|
sao = new h3d.pass.ScalableAO();
|
|
|
// TODO : use a special Blur that prevents bluring across depths
|
|
|
- saoBlur = new h3d.pass.Blur(2, 3, 2);
|
|
|
+ saoBlur = new h3d.pass.Blur(3, 3, 2);
|
|
|
sao.shader.sampleRadius = 0.2;
|
|
|
hasMRT = h3d.Engine.getCurrent().driver.hasFeature(MultipleRenderTargets);
|
|
|
if( hasMRT )
|
|
@@ -25,13 +25,13 @@ class CustomRenderer extends h3d.scene.Renderer {
|
|
|
super.render();
|
|
|
if(mode != 1) {
|
|
|
var saoTarget = allocTarget("sao",0,false);
|
|
|
- pushTarget(saoTarget);
|
|
|
+ setTarget(saoTarget);
|
|
|
if( hasMRT )
|
|
|
sao.apply(def.getTexture(1), def.getTexture(2), ctx.camera);
|
|
|
else
|
|
|
sao.apply(depth.getTexture(), normal.getTexture(), ctx.camera);
|
|
|
- popTarget();
|
|
|
- saoBlur.apply(saoTarget, allocTarget("saoBlurTmp", 1, false));
|
|
|
+ resetTarget();
|
|
|
+ saoBlur.apply(saoTarget, allocTarget("saoBlurTmp", 0, false));
|
|
|
if( hasMRT ) h3d.pass.Copy.run(def.getTexture(0), null);
|
|
|
h3d.pass.Copy.run(saoTarget, null, mode == 0 ? Multiply : null);
|
|
|
}
|
|
@@ -41,10 +41,8 @@ class CustomRenderer extends h3d.scene.Renderer {
|
|
|
|
|
|
class Sao extends hxd.App {
|
|
|
|
|
|
- var time : Float = 0.;
|
|
|
var wscale = 1.;
|
|
|
- var camdist = 6.;
|
|
|
- var paused = false;
|
|
|
+ var fui : h2d.Flow;
|
|
|
|
|
|
function initMaterial( m : h3d.mat.MeshMaterial ) {
|
|
|
m.mainPass.enableLights = true;
|
|
@@ -55,9 +53,15 @@ class Sao extends hxd.App {
|
|
|
}
|
|
|
|
|
|
override function init() {
|
|
|
+
|
|
|
+ fui = new h2d.Flow(s2d);
|
|
|
+ fui.isVertical = true;
|
|
|
+ fui.verticalSpacing = 5;
|
|
|
+
|
|
|
var r = new hxd.Rand(Std.random(0xFFFFFF));
|
|
|
|
|
|
- s3d.renderer = new CustomRenderer();
|
|
|
+ var c = new CustomRenderer();
|
|
|
+ s3d.renderer = c;
|
|
|
|
|
|
var floor = new h3d.prim.Grid(40,40,0.25,0.25);
|
|
|
floor.addNormals();
|
|
@@ -85,12 +89,53 @@ class Sao extends hxd.App {
|
|
|
var dir = new h3d.scene.DirLight(new h3d.Vector( -0.3, -0.2, -1), s3d);
|
|
|
dir.color.set(0.5, 0.5, 0.5);
|
|
|
|
|
|
- time = Math.PI * 0.25;
|
|
|
- camdist = 6 * wscale;
|
|
|
+ var time = Math.PI * 0.25;
|
|
|
+ var camdist = 6 * wscale;
|
|
|
+ s3d.camera.pos.set(camdist * Math.cos(time), camdist * Math.sin(time), camdist * 0.5);
|
|
|
+ new h3d.scene.CameraController(s3d).loadFromCamera();
|
|
|
+
|
|
|
+ addSlider("Bias", 0, 0.3, function() return c.sao.shader.bias, function(v) c.sao.shader.bias = v);
|
|
|
+ addSlider("Intensity", 0, 10, function() return c.sao.shader.intensity, function(v) c.sao.shader.intensity = v);
|
|
|
+ addSlider("Radius", 0, 1, function() return c.sao.shader.sampleRadius, function(v) c.sao.shader.sampleRadius = v);
|
|
|
+ addSlider("Blur", 0, 3, function() return c.saoBlur.sigma, function(v) c.saoBlur.sigma = v);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ function addSlider( text, min : Float, max : Float, get : Void -> Float, set : Float -> Void ) {
|
|
|
+ var f = new h2d.Flow(fui);
|
|
|
+
|
|
|
+ f.horizontalSpacing = 5;
|
|
|
+
|
|
|
+ var font = hxd.res.DefaultFont.get();
|
|
|
+ var tf = new h2d.Text(font, f);
|
|
|
+ tf.text = text;
|
|
|
+ tf.maxWidth = 70;
|
|
|
+ tf.textAlign = Right;
|
|
|
+
|
|
|
+ var sli = new h2d.Slider(100, 10, f);
|
|
|
+ sli.minValue = min;
|
|
|
+ sli.maxValue = max;
|
|
|
+ sli.value = get();
|
|
|
+
|
|
|
+ var tf = new h2d.TextInput(font, f);
|
|
|
+ tf.text = "" + hxd.Math.fmt(sli.value);
|
|
|
+ sli.onChange = function() {
|
|
|
+ set(sli.value);
|
|
|
+ tf.text = "" + hxd.Math.fmt(sli.value);
|
|
|
+ f.needReflow = true;
|
|
|
+ };
|
|
|
+ tf.onChange = function() {
|
|
|
+ var v = Std.parseFloat(tf.text);
|
|
|
+ if( Math.isNaN(v) ) return;
|
|
|
+ sli.value = v;
|
|
|
+ set(v);
|
|
|
+ };
|
|
|
}
|
|
|
|
|
|
function reset() {
|
|
|
- s3d = new h3d.scene.Scene();
|
|
|
+ while( s3d.numChildren > 0 )
|
|
|
+ s3d.getChildAt(0).remove();
|
|
|
+ s3d.dispose();
|
|
|
init();
|
|
|
}
|
|
|
|
|
@@ -99,11 +144,6 @@ class Sao extends hxd.App {
|
|
|
if(K.isPressed(K.BACKSPACE))
|
|
|
reset();
|
|
|
|
|
|
- if(K.isDown(K.SHIFT))
|
|
|
- dt *= 10;
|
|
|
- if(K.isPressed("P".code) || K.isPressed(K.SPACE))
|
|
|
- paused = !paused;
|
|
|
-
|
|
|
var r = Std.instance(s3d.renderer, CustomRenderer);
|
|
|
if(K.isPressed(K.NUMBER_1))
|
|
|
r.mode = 0;
|
|
@@ -113,32 +153,6 @@ class Sao extends hxd.App {
|
|
|
r.mode = 2;
|
|
|
if(K.isPressed("B".code))
|
|
|
r.saoBlur.passes = r.saoBlur.passes == 0 ? 3 : 0;
|
|
|
-
|
|
|
- if( K.isDown(K.CTRL) && K.isDown(K.SHIFT) ) {
|
|
|
- if(K.isDown(K.NUMPAD_ADD))
|
|
|
- r.sao.shader.bias *= 1.02;
|
|
|
- if(K.isDown(K.NUMPAD_SUB))
|
|
|
- r.sao.shader.bias /= 1.02;
|
|
|
- } else if( K.isDown(K.SHIFT) ) {
|
|
|
- if(K.isDown(K.NUMPAD_ADD))
|
|
|
- s3d.camera.fovY *= 1.02;
|
|
|
- if(K.isDown(K.NUMPAD_SUB))
|
|
|
- s3d.camera.fovY /= 1.02;
|
|
|
- } else if( K.isDown(K.CTRL) ) {
|
|
|
- if(K.isDown(K.NUMPAD_ADD))
|
|
|
- r.sao.shader.intensity *= 1.02;
|
|
|
- if(K.isDown(K.NUMPAD_SUB))
|
|
|
- r.sao.shader.intensity /= 1.02;
|
|
|
- } else {
|
|
|
- if(K.isDown(K.NUMPAD_ADD))
|
|
|
- r.sao.shader.sampleRadius *= 1.02;
|
|
|
- if(K.isDown(K.NUMPAD_SUB))
|
|
|
- r.sao.shader.sampleRadius /= 1.02;
|
|
|
- }
|
|
|
-
|
|
|
- if(!paused)
|
|
|
- time += dt * 0.001;
|
|
|
- s3d.camera.pos.set(camdist * Math.cos(time), camdist * Math.sin(time), camdist * 0.5);
|
|
|
}
|
|
|
|
|
|
static function main() {
|