Răsfoiți Sursa

added camera control to most 3d samples

Nicolas Cannasse 8 ani în urmă
părinte
comite
d07632454e
5 a modificat fișierele cu 69 adăugiri și 83 ștergeri
  1. 2 3
      samples/Lights.hx
  2. 56 42
      samples/Sao.hx
  3. 3 2
      samples/Shadows.hx
  4. 5 2
      samples/Skin.hx
  5. 3 34
      samples/World.hx

+ 2 - 3
samples/Lights.hx

@@ -47,11 +47,11 @@ class Lights extends hxd.App {
 
 		s3d.lightSystem.ambientLight.set(0, 0, 0);
 
-		engine.render(s3d);
+		s3d.camera.pos.set(5, 1, 3);
+		new h3d.scene.CameraController(s3d).loadFromCamera();
 	}
 
 	override function update( dt : Float ) {
-		var dist = 5;
 		time += 0.002 * dt;
 
 		var a = [0.4, 0.2, 0.5, 0.8, 1.2, 0.5, 0.7];
@@ -65,7 +65,6 @@ class Lights extends hxd.App {
 
 		dir.direction.set(Math.cos(time * 0.3) * 0.2, Math.sin(time * 0.35) * 0.3 + 0.3, -1);
 
-		s3d.camera.pos.set(Math.cos(time) * dist, Math.sin(time) * dist, 3);
 	}
 
 	static function main() {

+ 56 - 42
samples/Sao.hx

@@ -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() {

+ 3 - 2
samples/Shadows.hx

@@ -35,14 +35,15 @@ class Shadows extends hxd.App {
 
 		dir = new h3d.scene.DirLight(new h3d.Vector(-0.3, -0.2, -1), s3d);
 		dir.enableSpecular = true;
-		s3d.lightSystem.shadowLight = dir;
 
 		shadow = cast(s3d.renderer.getPass("shadow"), h3d.pass.ShadowMap);
 		shadow.blur.passes = 3;
+
+		s3d.camera.pos.set(12, 12, 6);
+		new h3d.scene.CameraController(s3d).loadFromCamera();
 	}
 
 	override function update( dt : Float ) {
-		s3d.camera.pos.set(12, 12, 6);
 		time += dt * 0.01;
 		dir.direction.set(Math.cos(time), Math.sin(time) * 2, -1);
 	}

+ 5 - 2
samples/Skin.hx

@@ -27,12 +27,15 @@ class Skin extends hxd.App {
 
 		var shadow = cast(s3d.renderer.getPass("shadow"), h3d.pass.ShadowMap);
 		shadow.power = 20;
+		shadow.color.setColor(0x301030);
 		dir.enableSpecular = true;
 
-		#if castle
+		new h3d.scene.CameraController(s3d).loadFromCamera();
+
+		#if hxbit
 		// this is an example for connecting to scene inspector
 		// and enable extra properties
-		// this requires to compile with -lib castle and run CDB
+		// this requires to compile with -lib hxbit and run http://castledb.org
 		var i = new hxd.inspect.Inspector(s3d);
 
 		var delta = s3d.camera.pos.sub(s3d.camera.target);

+ 3 - 34
samples/World.hx

@@ -4,10 +4,6 @@ class World extends hxd.App {
 
 	var world : h3d.scene.World;
 	var shadow :h3d.pass.ShadowMap;
-	var mx = 0.;
-	var my = 0.;
-	var cdist : Float;
-	var tdist : Float;
 
 	override function init() {
 
@@ -33,9 +29,6 @@ class World extends hxd.App {
 		shadow.blur.passes = 0;
 		shadow.bias *= 0.1;
 		shadow.color.set(0.7, 0.7, 0.7);
-		shadow.calcShadowBounds = function(cam) {
-			cam.orthoBounds = h3d.col.Bounds.fromValues( -128, -128, -64, 256, 256, 128);
-		};
 
 		#if castle
 		new hxd.inspect.Inspector(s3d);
@@ -51,35 +44,11 @@ class World extends hxd.App {
 		g.emitMode = CameraBounds;
 		parts.volumeBounds = h3d.col.Bounds.fromValues( -20, -20, 15, 40, 40, 40);
 
-		tdist = cdist = s3d.camera.pos.sub(s3d.camera.target).length();
+		s3d.camera.zNear = 1;
+		s3d.camera.zFar = 100;
+		new h3d.scene.CameraController(s3d).loadFromCamera();
 	}
 
-	override function update(dt:Float) {
-		var dx = 0, dy = 0;
-		if( K.isDown(K.LEFT) ) dx = -1;
-		if( K.isDown(K.RIGHT) ) dx = 1;
-		if( K.isDown(K.UP) ) dy = -1;
-		if( K.isDown(K.DOWN) ) dy = 1;
-		if( K.isPressed(K.MOUSE_WHEEL_UP) ) tdist *= 0.9;
-		if( K.isPressed(K.MOUSE_WHEEL_DOWN) ) tdist *= 1.1;
-
-		mx *= Math.pow(0.9, dt);
-		my *= Math.pow(0.9, dt);
-
-		mx += (dx + dy) * dt * 0.1;
-		my += (-dx + dy) * dt * 0.1;
-		s3d.camera.pos.x += mx * dt;
-		s3d.camera.pos.y += my * dt;
-		s3d.camera.target.x += mx * dt;
-		s3d.camera.target.y += my * dt;
-
-		var p = Math.pow(0.9, dt);
-		cdist = cdist * p + (1 - p) * tdist;
-		var d = s3d.camera.pos.sub(s3d.camera.target);
-		d.normalize();
-		d.scale3(cdist);
-		s3d.camera.pos = s3d.camera.target.add(d);
-	}
 
 	static function main() {
 		hxd.Res.initEmbed();