Преглед изворни кода

single geometry per model (todo : per material indexes)

Nicolas Cannasse пре 11 година
родитељ
комит
3cb75dd1e5
6 измењених фајлова са 20 додато и 78 уклоњено
  1. 0 54
      h3d/prim/MultiPrimitive.hx
  2. 7 6
      hxd/fmt/fbx/HMDOut.hx
  3. 1 1
      hxd/fmt/hmd/Data.hx
  4. 4 4
      hxd/fmt/hmd/Library.hx
  5. 4 7
      hxd/fmt/hmd/Reader.hx
  6. 4 6
      hxd/fmt/hmd/Writer.hx

+ 0 - 54
h3d/prim/MultiPrimitive.hx

@@ -1,54 +0,0 @@
-package h3d.prim;
-
-class MultiPrimitive extends Primitive {
-
-	var primitives : Array<Primitive>;
-	var bounds : h3d.col.Bounds;
-	var current : Int = -1;
-
-	public function new(primitives) {
-		this.primitives = primitives;
-	}
-
-	override function triCount() {
-		var t = 0;
-		for( p in primitives )
-			t += p.triCount();
-		return t;
-	}
-
-	override function getBounds() : h3d.col.Bounds {
-		if( bounds != null ) return bounds;
-		bounds = new h3d.col.Bounds();
-		for( p in primitives )
-			bounds.add(p.getBounds());
-		return bounds;
-	}
-
-	override function alloc( engine : h3d.Engine ) {
-		for( p in primitives )
-			p.alloc(engine);
-	}
-
-	override function selectMaterial( material : Int ) {
-		current = material;
-	}
-
-	override function buildNormalsDisplay() : Primitive {
-		return new MultiPrimitive([for( p in primitives ) p.buildNormalsDisplay()]);
-	}
-
-	override function render( engine : h3d.Engine ) {
-		if( current < 0 )
-			for( p in primitives )
-				p.render(engine);
-		else
-			primitives[current].render(engine);
-	}
-
-	override function dispose() {
-		for( p in primitives )
-			p.dispose();
-	}
-
-}

+ 7 - 6
hxd/fmt/fbx/HMDOut.hx

@@ -250,18 +250,18 @@ class HMDOut extends BaseLibrary {
 		}
 
 		objects = [];
-		if( root.childs.length == 1 && root.model == null ) {
+		if( root.childs.length <= 1 && root.model == null ) {
 			root = root.childs[0];
 			root.parent = null;
 		}
-		indexRec(root); // reorder after we have changed hierarchy
+		if( root != null ) indexRec(root); // reorder after we have changed hierarchy
 
 		var hskins = new Map(), tmpGeom = new Map();
 		// prepare things for skinning
 		for( g in this.root.getAll("Objects.Geometry") )
 			tmpGeom.set(g.getId(), { setSkin : function(_) { }, getVerticesCount : function() return Std.int(new hxd.fmt.fbx.Geometry(this, g).getVertices().length/3) } );
 
-		var hgeom = new Map<Int,{ gids : Array<Int>, mindexes : Array<Int> }>();
+		var hgeom = new Map<Int,{ gid : Int, mindexes : Array<Int> }>();
 		var hmat = new Map<Int,Int>();
 		var index = 0;
 		for( o in objects ) {
@@ -272,7 +272,7 @@ class HMDOut extends BaseLibrary {
 			var ref = o.skin == null ? o : o.skin;
 
 			model.name = o.model == null ? null : o.model.getName();
-			model.parent = o.parent == null || o.parent.isJoint ? 0 : o.parent.index;
+			model.parent = o.parent == null || o.parent.isJoint ? -1 : o.parent.index;
 			model.follow = o.parent != null && o.parent.isJoint ? o.parent.model.getName() : null;
 			var m = ref.model == null ? new hxd.fmt.fbx.BaseLibrary.DefaultMatrixes() : getDefaultMatrixes(ref.model);
 			var p = new Position();
@@ -295,6 +295,7 @@ class HMDOut extends BaseLibrary {
 			p.qy = q.y;
 			p.qz = q.z;
 			model.position = p;
+			model.geometry = -1;
 			d.models.push(model);
 
 			if( !o.isMesh ) continue;
@@ -377,12 +378,12 @@ class HMDOut extends BaseLibrary {
 				var gid = d.geometries.length;
 				d.geometries.push(geom);
 				gdata = {
-					gids : [gid],
+					gid : gid,
 					mindexes : [0],
 				};
 				hgeom.set(g.getId(), gdata);
 			}
-			model.geometries = gdata.gids.copy();
+			model.geometry = gdata.gid;
 			model.materials = [];
 			for( i in gdata.mindexes ) {
 				if( mids[i] == null ) throw "assert"; // TODO : create a null material color

+ 1 - 1
hxd/fmt/hmd/Data.hx

@@ -100,7 +100,7 @@ class Model {
 	public var parent : Index<Model>;
 	public var follow : Null<String>;
 	public var position : Position;
-	public var geometries : Null<Array<Index<Geometry>>>;
+	public var geometry : Index<Geometry>;
 	public var materials : Null<Array<Index<Material>>>;
 	public var skin : Null<Skin>;
 	public function new() {

+ 4 - 4
hxd/fmt/hmd/Library.hx

@@ -84,10 +84,10 @@ class Library {
 		var objs = [];
 		for( m in header.models ) {
 			var obj : h3d.scene.Object;
-			if( m.geometries == null ) {
+			if( m.geometry < 0 ) {
 				obj = new h3d.scene.Object();
 			} else {
-				var prim = m.geometries.length == 1 ? makePrimitive(m.geometries[0]) : new h3d.prim.MultiPrimitive([for( g in m.geometries ) makePrimitive(g)]);
+				var prim = makePrimitive(m.geometry);
 				if( m.skin != null ) {
 					var sk = new h3d.scene.Skin(makeSkin(m.skin), [for( m in m.materials ) makeMaterial(m, loadTexture)]);
 					sk.primitive = prim;
@@ -100,8 +100,8 @@ class Library {
 			obj.name = m.name;
 			obj.defaultTransform = m.position.toMatrix();
 			objs.push(obj);
-			if( objs.length > 1 )
-				objs[m.parent].addChild(obj);
+			var p = objs[m.parent];
+			if( p != null ) p.addChild(obj);
 		}
 		return objs[0];
 	}

+ 4 - 7
hxd/fmt/hmd/Reader.hx

@@ -92,17 +92,14 @@ class Reader {
 		for( k in 0...i.readInt32() ) {
 			var m = new Model();
 			m.name = readName();
-			m.parent = i.readInt32();
+			m.parent = i.readInt32() - 1;
 			m.follow = readName();
 			m.position = readPosition();
+			m.geometry = i.readInt32() - 1;
 			d.models.push(m);
-			var count = i.readByte();
-			if( count == 0 ) continue;
-			m.geometries = [];
+			if( m.geometry < 0 ) continue;
 			m.materials = [];
-			for( k in 0...count )
-				m.geometries.push(i.readInt32());
-			for( k in 0...count )
+			for( k in 0...i.readByte() )
 				m.materials.push(i.readInt32());
 			var name = readName();
 			if( name != null ) {

+ 4 - 6
hxd/fmt/hmd/Writer.hx

@@ -77,14 +77,12 @@ class Writer {
 		out.writeInt32(d.models.length);
 		for( m in d.models ) {
 			writeName(m.name);
-			out.writeInt32(m.parent);
+			out.writeInt32(m.parent + 1);
 			writeName(m.follow);
 			writePosition(m.position);
-			out.writeByte(m.geometries == null ? 0 : m.geometries.length);
-			if( m.geometries == null ) continue;
-			if( m.materials == null || m.materials.length != m.geometries.length ) throw "assert";
-			for( g in m.geometries )
-				out.writeInt32(g);
+			out.writeInt32(m.geometry + 1);
+			if( m.geometry < 0 ) continue;
+			out.writeByte(m.materials.length);
 			for( m in m.materials )
 				out.writeInt32(m);
 			if( m.skin == null )