|
@@ -1,28 +1,32 @@
|
|
|
import hxd.Math;
|
|
|
+import h3d.pass.ScalableAO;
|
|
|
+import hxd.Key in K;
|
|
|
|
|
|
class CustomRenderer extends h3d.scene.Renderer {
|
|
|
|
|
|
var sao : h3d.pass.ScalableAO;
|
|
|
- var saoBlur : h3d.pass.Blur;
|
|
|
+ public var saoBlur : h3d.pass.Blur;
|
|
|
var out : h3d.mat.Texture;
|
|
|
+ public var mode = 0;
|
|
|
|
|
|
public function new() {
|
|
|
super();
|
|
|
sao = new h3d.pass.ScalableAO();
|
|
|
// TODO : use a special Blur that prevents bluring across depths
|
|
|
- saoBlur = new h3d.pass.Blur(3,5);
|
|
|
- saoBlur.passes = 3;
|
|
|
+ saoBlur = new h3d.pass.Blur(2, 3, 2);
|
|
|
}
|
|
|
|
|
|
override function process( ctx, passes ) {
|
|
|
super.process(ctx, passes);
|
|
|
|
|
|
- var saoTarget = allocTarget("sao",0,false);
|
|
|
- setTarget(saoTarget);
|
|
|
- sao.apply(depth.getTexture(), normal.getTexture(), ctx.camera);
|
|
|
- saoBlur.apply(saoTarget, allocTarget("saoBlurTmp", 0, false));
|
|
|
+ if(mode != 1) {
|
|
|
+ var saoTarget = allocTarget("sao",0,false);
|
|
|
+ setTarget(saoTarget);
|
|
|
+ sao.apply(depth.getTexture(), normal.getTexture(), ctx.camera);
|
|
|
+ saoBlur.apply(saoTarget, allocTarget("saoBlurTmp", 1, false));
|
|
|
|
|
|
- h3d.pass.Copy.run(saoTarget, null, Multiply);
|
|
|
+ h3d.pass.Copy.run(saoTarget, null, mode == 0 ? Multiply : null);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -30,6 +34,9 @@ class CustomRenderer extends h3d.scene.Renderer {
|
|
|
class Main extends hxd.App {
|
|
|
|
|
|
var time : Float = 0.;
|
|
|
+ var wscale = 1.;
|
|
|
+ var camdist = 6.;
|
|
|
+ var paused = false;
|
|
|
|
|
|
function initMaterial( m : h3d.mat.MeshMaterial ) {
|
|
|
m.mainPass.enableLights = true;
|
|
@@ -38,6 +45,7 @@ class Main extends hxd.App {
|
|
|
}
|
|
|
|
|
|
override function init() {
|
|
|
+ var r = new hxd.Rand(Std.random(0xFFFFFF));
|
|
|
|
|
|
var floor = new h3d.prim.Grid(40,40,0.25,0.25);
|
|
|
floor.addNormals();
|
|
@@ -45,30 +53,59 @@ class Main extends hxd.App {
|
|
|
var m = new h3d.scene.Mesh(floor, s3d);
|
|
|
initMaterial(m.material);
|
|
|
m.material.color.makeColor(0.35, 0.5, 0.5);
|
|
|
+ m.setScale(wscale);
|
|
|
|
|
|
for( i in 0...100 ) {
|
|
|
- var box : h3d.prim.Polygon = new h3d.prim.Cube(Math.random(),Math.random(), 0.7 + Math.random() * 0.8);
|
|
|
+ var box : h3d.prim.Polygon = new h3d.prim.Cube(0.3 + r.rand() * 0.5, 0.3 + r.rand() * 0.5, 0.2 + r.rand());
|
|
|
box.unindex();
|
|
|
box.addNormals();
|
|
|
var p = new h3d.scene.Mesh(box, s3d);
|
|
|
- p.x = Math.srand(3);
|
|
|
- p.y = Math.srand(3);
|
|
|
+ p.setScale(wscale);
|
|
|
+ p.x = r.srand(3) * wscale;
|
|
|
+ p.y = r.srand(3) * wscale;
|
|
|
initMaterial(p.material);
|
|
|
- p.material.color.makeColor(Math.random() * 0.3, 0.5, 0.5);
|
|
|
+ p.material.color.makeColor(r.rand() * 0.3, 0.5, 0.5);
|
|
|
}
|
|
|
- s3d.camera.zNear = 0.5;
|
|
|
- s3d.camera.zFar = 15;
|
|
|
+ s3d.camera.zNear = 0.1 * wscale;
|
|
|
+ s3d.camera.zFar = 150 * wscale;
|
|
|
|
|
|
s3d.lightSystem.ambientLight.set(0.5, 0.5, 0.5);
|
|
|
var dir = new h3d.scene.DirLight(new h3d.Vector( -0.3, -0.2, -1), s3d);
|
|
|
dir.color.set(0.5, 0.5, 0.5);
|
|
|
|
|
|
s3d.renderer = new CustomRenderer();
|
|
|
+ time = Math.PI * 0.25;
|
|
|
+ camdist = 6 * wscale;
|
|
|
+ }
|
|
|
+
|
|
|
+ function reset() {
|
|
|
+ s3d = new h3d.scene.Scene();
|
|
|
+ init();
|
|
|
}
|
|
|
|
|
|
override function update( dt : Float ) {
|
|
|
- time += dt * 0.001;
|
|
|
- s3d.camera.pos.set(6 * Math.cos(time), 6 * Math.sin(time), 3);
|
|
|
+
|
|
|
+ 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;
|
|
|
+ if(K.isPressed(K.NUMBER_2))
|
|
|
+ r.mode = 1;
|
|
|
+ if(K.isPressed(K.NUMBER_3))
|
|
|
+ r.mode = 2;
|
|
|
+ if(K.isPressed("B".code))
|
|
|
+ r.saoBlur.passes = r.saoBlur.passes == 0 ? 3 : 0;
|
|
|
+
|
|
|
+ if(!paused)
|
|
|
+ time += dt * 0.001;
|
|
|
+ s3d.camera.pos.set(camdist * Math.cos(time), camdist * Math.sin(time), camdist * 0.5);
|
|
|
}
|
|
|
|
|
|
public static var inst : Main;
|