فهرست منبع

added recomputeNormals()

bstouls 9 سال پیش
والد
کامیت
9a25d5e918
2فایلهای تغییر یافته به همراه49 افزوده شده و 0 حذف شده
  1. 43 0
      h3d/prim/HMDModel.hx
  2. 6 0
      h3d/prim/MeshPrimitive.hx

+ 43 - 0
h3d/prim/HMDModel.hx

@@ -69,6 +69,49 @@ class HMDModel extends MeshPrimitive {
 		}
 	}
 
+	public function recomputeNormals( ?name : String ) {
+
+		if( name == null ) name = "normal";
+
+		var pos = lib.getBuffers(data, [new hxd.fmt.hmd.Data.GeometryFormat("position", DVec3)]);
+		var ids = new Array();
+		var pts : Array<h3d.col.Point> = [];
+
+		for( i in 0...data.vertexCount ) {
+			var added = false;
+			var pt = new h3d.col.Point(pos.vertexes[i * 3], pos.vertexes[i * 3 + 1], pos.vertexes[i * 3 + 2]);
+			for(i in 0...pts.length) {
+				var p = pts[i];
+				if(p.x == pt.x && p.y == pt.y && p.z == pt.z) {
+					ids.push(i);
+					added = true;
+					break;
+				}
+			}
+			if( !added ) {
+				ids.push(pts.length);
+				pts.push(pt);
+			}
+		}
+
+		var idx = new hxd.IndexBuffer();
+		for( i in pos.indexes )
+			idx.push(ids[i]);
+
+		var pol = new Polygon(pts, idx);
+		pol.addNormals();
+
+		var v = new hxd.FloatBuffer();
+		for( i in 0...data.vertexCount ) {
+			var n = pol.normals[ids[i]];
+			v.push(n.x);
+			v.push(n.y);
+			v.push(n.z);
+		}
+		var buf = h3d.Buffer.ofFloats(v, 3);
+		addBuffer(name, buf, 0);
+	}
+
 	override function render( engine : h3d.Engine ) {
 		if( curMaterial < 0 ) {
 			super.render(engine);

+ 6 - 0
h3d/prim/MeshPrimitive.hx

@@ -10,6 +10,12 @@ class MeshPrimitive extends Primitive {
 		return null;
 	}
 
+	public function hasBuffer( name : String ) {
+		if( bufferCache == null )
+			return false;
+		return bufferCache.exists(hxsl.Globals.allocID(name));
+	}
+
 	function addBuffer( name : String, buf, offset = 0 ) {
 		if( bufferCache == null )
 			bufferCache = new Map();