public Model(VertexModel vmodel)// : this(Utilities.Convert(vmodel)) { Tree = construct(vmodel, 0, Vector3.Zero, vmodel.All()); Octree construct(VertexModel vm, int depth, Vector3 pos, List <int> possible) { float scale = (float)Math.Pow(0.5, depth); float[] verts = new float[8]; Vector3 center = pos + Vector3.One * 0.5f * scale; float centerValue = vm.DistanceAt(center, possible); //possible = vm.GetPossible(center, HalfSqrt3 * scale, possible); possible = vm.GetPossiblePrecomp(center, Math.Abs(centerValue) + HalfSqrt3 * scale, possible); for (int i = 0; i < 8; i++) { verts[i] = vm.DistanceAt(pos + SdfMath.split(i).Vector *scale, possible); } Octree build = new Octree(verts); if (Math.Abs(centerValue) < scale * 2 && depth < MaxDepth) // error(centerValue, build.Vertices, pos) > precision { Octree[] children = new Octree[8]; for (int i = 0; i < 8; i++) { children[i] = construct(vm, depth + 1, pos + SdfMath.split(i).Vector *scale / 2, possible); } build.Children = children; } return(build); } }
public static OctData MakeData(string filename) { OctData data; filename = AutocompleteFile(filename); string basename = Path.ChangeExtension(filename, null); FileFormat format = FormatOf(filename); if (format == FileFormat.ASDF) { Trace.WriteLine("Loading from " + filename); } var raw = OctData.NativeOctData.Generate(filename, format); data = new OctData(raw); OctData.NativeOctData.Free(raw); //else // throw new ArgumentException("Invalid " + Path.GetExtension(filename) + "; can only read .obj or .asdf files."); State.buffer_size = (uint)data.Length; return(data); OctData Sample() { var children = new Octree[8]; for (int i = 0; i < 8; i++) { var vals = new float[8]; for (int j = 0; j < 8; j++) { vals[j] = dist(SdfMath.split(j) + SdfMath.split(i)); } children[i] = new Octree(vals); } var mainvals = new float[8]; for (int i = 0; i < 8; i++) { mainvals[i] = dist(SdfMath.split(i) * 2); } var t = new Octree(children, mainvals); return(new Model(t).Cast()); } float dist(Int3 p) => ((p.Vector - Vector3.One).Length() - 0.6f) * 0.5f; }
private void Cast(List <OctLean> octs, List <Byte8> values, float scale, Vector3 pos, int parent, int at) { int childstart = -1; if (Children != null) { childstart = octs.Count; for (int i = 0; i < 8; i++) { octs.Add(new OctLean()); values.Add(new Byte8()); } for (int i = 0; i < 8; i++) { Children[i].Cast(octs, values, scale / 2, pos + SdfMath.split(i).Vector *scale / 2, at, childstart + i); } } octs[at] = new OctLean(parent, childstart); values[at] = new Byte8(Vertices, scale); }