Browse Source

optimize normals lookup

Nicolas Cannasse 4 months ago
parent
commit
dc1b7df43b
1 changed files with 16 additions and 4 deletions
  1. 16 4
      hxd/fmt/fbx/HMDOut.hx

+ 16 - 4
hxd/fmt/fbx/HMDOut.hx

@@ -157,22 +157,34 @@ class HMDOut extends BaseLibrary {
 		}
 		}
 
 
 		var points : Array<h3d.col.Point> = [];
 		var points : Array<h3d.col.Point> = [];
+		var psearch = new haxe.ds.Vector(1024);
+		inline function getPID(x:Float,y:Float,z:Float) {
+			return Std.int(((x + y + z) * 100) % 1024) & 1023;
+		}
 		var pmap = [];
 		var pmap = [];
 		for( vid in 0...g.vertexCount ) {
 		for( vid in 0...g.vertexCount ) {
 			var x = vbuf[vid * stride];
 			var x = vbuf[vid * stride];
 			var y = vbuf[vid * stride + 1];
 			var y = vbuf[vid * stride + 1];
 			var z = vbuf[vid * stride + 2];
 			var z = vbuf[vid * stride + 2];
+			var pid = getPID(x,y,z);
+			var indexes = psearch[pid];
 			var found = false;
 			var found = false;
-			for( i in 0...points.length ) {
-				var p = points[i];
+			if( indexes == null ) {
+				indexes = [];
+				psearch[pid] = indexes;
+			}
+			for( idx in indexes ) {
+				var p = points[idx];
 				if( p.x == x && p.y == y && p.z == z ) {
 				if( p.x == x && p.y == y && p.z == z ) {
-					pmap[vid] = i;
+					pmap[vid] = idx;
 					found = true;
 					found = true;
 					break;
 					break;
 				}
 				}
 			}
 			}
 			if( !found ) {
 			if( !found ) {
-				pmap[vid] = points.length;
+				var idx = points.length;
+				pmap[vid] = idx;
+				indexes.push(idx);
 				points.push(new h3d.col.Point(x,y,z));
 				points.push(new h3d.col.Point(x,y,z));
 			}
 			}
 		}
 		}