Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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;
        }
Exemple #3
0
        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);
        }