Browse Source

started pbr renderer integration

ncannasse 7 years ago
parent
commit
2b9807da82
4 changed files with 95 additions and 17 deletions
  1. 1 0
      hide/Ide.hx
  2. 41 1
      hide/Renderer.hx
  3. 5 0
      hide/comp/Scene.hx
  4. 48 16
      hide/view/Model.hx

+ 1 - 0
hide/Ide.hx

@@ -375,6 +375,7 @@ class Ide {
 		hxd.res.Loader.currentInstance = new CustomLoader(new hxd.fs.LocalFileSystem(localDir));
 		renderers = [
 			new hide.Renderer.MaterialSetup("Default"),
+			new hide.Renderer.PbrSetup("PBR"),
 		];
 		var path = getPath("Renderer.hx");
 		if( sys.FileSystem.exists(path) ) {

+ 41 - 1
hide/Renderer.hx

@@ -1,5 +1,7 @@
 package hide;
 
+// ----- Default Rendering --------------------------------
+
 class MaterialSetup extends h3d.mat.MaterialSetup {
     override public function createRenderer() {
 	    return new Renderer();
@@ -9,6 +11,7 @@ class MaterialSetup extends h3d.mat.MaterialSetup {
 class Renderer extends h3d.scene.DefaultRenderer {
 
 	override function render() {
+
 		renderPass(defaultPass, getSort("debuggeom", true) );
 		clear(null, 1.0);
 
@@ -29,4 +32,41 @@ class Renderer extends h3d.scene.DefaultRenderer {
 		renderPass(defaultPass, get("additive") );
 		renderPass(defaultPass, getSort("ui", true));
 	}
-}
+}
+
+// ----- PBR Rendering --------------------------------
+
+class PbrSetup extends h3d.mat.MaterialSetup {
+
+	override public function createRenderer() : h3d.scene.Renderer {
+		var envMap = new h3d.mat.Texture(16,16,[Cube]);
+		envMap.clear(0x808080);
+		var irrad = new h3d.scene.pbr.Irradiance(envMap);
+		irrad.compute();
+		return new h3d.scene.pbr.Renderer(irrad);
+	}
+
+	override function createLightSystem() {
+		return new h3d.scene.pbr.LightSystem();
+	}
+
+	override function applyProps( m : h3d.mat.Material ) {
+		m.shadows = false;
+		// default values (if no texture)
+		if( m.mainPass.getShader(h3d.shader.pbr.PropsValues) == null )
+			m.mainPass.addShader(new h3d.shader.pbr.PropsValues());
+		// get values from specular texture
+		var spec = m.mainPass.getShader(h3d.shader.pbr.PropsTexture);
+		if( m.specularTexture != null ) {
+			if( spec == null ) {
+				spec = new h3d.shader.pbr.PropsTexture();
+				m.mainPass.addShader(spec);
+			}
+			spec.texture = m.specularTexture;
+		} else
+			m.mainPass.removeShader(spec);
+		m.castShadows = true;
+	}
+
+}
+

+ 5 - 0
hide/comp/Scene.hx

@@ -150,6 +150,11 @@ class Scene extends Component implements h3d.IDrawable {
 			engine.backgroundColor = Std.parseInt("0x"+props.get("scene.backgroundColor").substr(1)) | 0xFF000000;
 		}
 		initRec(root);
+
+		// make sure the materials are correctly initialized
+		for( m in root.getMaterials() )
+			if( m.props == null )
+				m.props = h3d.mat.MaterialSetup.current.getDefaults("ui");
 	}
 
 	public function setCurrent() {

+ 48 - 16
hide/view/Model.hx

@@ -11,6 +11,7 @@ class Model extends FileView {
 	var properties : hide.comp.PropsEditor;
 	var light : h3d.scene.DirLight;
 	var lightDirection = new h3d.Vector( 1, 2, -4 );
+	var isPbr : Bool;
 
 	var aspeed : hide.comp.Range;
 	var aloop : { function toggle( v : Bool ) : Void; var element : Element; }
@@ -81,7 +82,7 @@ class Model extends FileView {
 
 		var objectCount = 1 + obj.getObjectsCount();
 		var meshes = obj.getMeshes();
-		var vertexCount = 0, triangleCount = 0, materialDraws = 0, materialCount = 0;
+		var vertexCount = 0, triangleCount = 0, materialDraws = 0, materialCount = 0, bonesCount = 0;
 		var uniqueMats = new Map();
 		for( m in obj.getMaterials() ) {
 			if( uniqueMats.exists(m.name) ) continue;
@@ -93,7 +94,16 @@ class Model extends FileView {
 			triangleCount += p.triCount();
 			vertexCount += p.vertexCount();
 			var multi = Std.instance(m, h3d.scene.MultiMaterial);
-			materialDraws += if( multi != null ) multi.materials.length else 1;
+			var skin = Std.instance(m, h3d.scene.Skin);
+			if( skin != null )
+				bonesCount += skin.getSkinData().allJoints.length;
+			var count = if( skin != null && skin.getSkinData().splitJoints != null )
+				skin.getSkinData().splitJoints.length;
+			else if( multi != null )
+				multi.materials.length
+			else
+				1;
+			materialDraws += count;
 		}
 
 		var e = properties.add(new Element('
@@ -112,6 +122,7 @@ class Model extends FileView {
 					<dt>Meshes</dt><dd>${meshes.length}</dd>
 					<dt>Materials</dt><dd>$materialCount</dd>
 					<dt>Draws</dt><dd>$materialDraws</dd>
+					<dt>Bones</dt><dd>$bonesCount</dd>
 					<dt>Vertexes</dt><dd>$vertexCount</dd>
 					<dt>Triangles</dt><dd>$triangleCount</dd>
 				</dl>
@@ -168,6 +179,8 @@ class Model extends FileView {
 
 	function init() {
 
+		isPbr = Std.is(scene.s3d.renderer, h3d.scene.pbr.Renderer);
+
 		undo.onChange = function() {};
 
 		obj = scene.loadModel(state.path, true);
@@ -177,6 +190,7 @@ class Model extends FileView {
 		if( light == null ) {
 			light = new h3d.scene.DirLight(new h3d.Vector(), scene.s3d);
 			light.enableSpecular = true;
+			if( isPbr ) light.color.scale3(2);
 		}
 
 		control = new h3d.scene.CameraController(scene.s3d);
@@ -209,9 +223,6 @@ class Model extends FileView {
 			sel.onSelect = setAnimation;
 		}
 
-		scene.init(props);
-		scene.onUpdate = update;
-
 		tools.saveDisplayKey = "ModelTools";
 
 		tools.addButton("video-camera", "Reset Camera", function() {
@@ -219,17 +230,35 @@ class Model extends FileView {
 			control.loadFromCamera();
 		});
 
-		tools.addToggle("sun-o", "Enable Lights/Shadows", function(v) {
-			if( !v ) {
-				for( m in obj.getMaterials() ) {
-					m.mainPass.enableLights = false;
-					m.shadows = false;
+		if( isPbr ) {
+			tools.addButton("gears", "PBR Renderer", function() {
+				properties.clear();
+				var renderer = Std.instance(scene.s3d.renderer, h3d.scene.pbr.Renderer);
+				var props = {
+					debug : renderer.displayMode == Slides,
+				};
+				properties.add(new Element('
+					<div class="group" name="Renderer">
+						<dl>
+							<dt>Debug</dt><dd><input type="checkbox" field="debug"/></dd>
+						</dl>
+					</div>
+				'),props, function(p) {
+					renderer.displayMode = props.debug ? Slides : Pbr;
+				});
+			});
+		} else
+			tools.addToggle("sun-o", "Enable Lights/Shadows", function(v) {
+				if( !v ) {
+					for( m in obj.getMaterials() ) {
+						m.mainPass.enableLights = false;
+						m.shadows = false;
+					}
+				} else {
+					for( m in obj.getMaterials() )
+						h3d.mat.MaterialSetup.current.initModelMaterial(m);
 				}
-			} else {
-				for( m in obj.getMaterials() )
-					h3d.mat.MaterialSetup.current.initModelMaterial(m);
-			}
-		},true);
+			},true);
 
 		var axis = new h3d.scene.Graphics(scene.s3d);
 		axis.lineStyle(1,0xFF0000);
@@ -242,7 +271,10 @@ class Model extends FileView {
 		axis.lineTo(0,0,1);
 		axis.visible = false;
 
-		tools.addToggle("", "Toggle Axis", function(v) {
+		scene.init(props);
+		scene.onUpdate = update;
+
+		tools.addToggle("location-arrow", "Toggle Axis", function(v) {
 			axis.visible = v;
 		});