public override void SetMeshData(RawMesh mesh, int[] vertexGroup, int groupCount, TriangleGroup triangleGroup)
        {
            //Calculate average for bias.
            var sum   = new Vector3[groupCount];
            var count = new int[groupCount];

            for (int i = 0; i < mesh.Vertices.Length; ++i)
            {
                var g = vertexGroup[i];
                sum[g]   += mesh.Vertices[i];
                count[g] += 1;
            }

            //Run qf solver
            _results = new Vector3[groupCount];
            var c = new QFCoefficient();

            for (int i = 0; i < groupCount; ++i)
            {
                c.Reset();
                var nFaces   = 0;
                var vertices = Enumerable.Range(0, vertexGroup.Length).Where(ii => vertexGroup[ii] == i).ToArray();
                foreach (var tt in triangleGroup.GetExternalTriangles(i))
                {
                    var v1 = mesh.Vertices[mesh.Triangles[tt].Va];
                    var v2 = mesh.Vertices[mesh.Triangles[tt].Vb];
                    var v3 = mesh.Vertices[mesh.Triangles[tt].Vc];
                    var n  = Vector3.Normalize(Vector3.Cross(v2 - v1, v3 - v1));
                    c.AddPlane(v1, n);
                    nFaces += 1;
                }
                c.AddBias(sum[i] / count[i], nFaces * 0.01f + 0.01f);
                _results[i] = QFSolver.Solve(c);
            }
        }
Example #2
0
        public void RegenerateMesh()
        {
            // Stopwatch sw = new Stopwatch();
            // sw.Start();
            RawMesh rawMesh = MeshGenerator.GenerateMesh(Chunk);
            // sw.Stop();

            // UnityEngine.Debug.LogFormat(
            //    "{5} Generation took: {0}us for {1} verts and {2} triangles and {3} objects, taking avg {4}us per obj.",
            //    sw.ElapsedTicks / 10d,
            //    rawMesh.Vertices.Length,
            //    rawMesh.Triangles.Length,
            //    Chunk.Blocks.Length,
            //    (sw.ElapsedTicks / 10d) / Chunk.Blocks.Length,
            //    name
            // );
            Mesh localmesh = meshFilter.mesh;

            localmesh.Clear();
            localmesh.vertices  = rawMesh.Vertices;
            localmesh.uv        = rawMesh.Uv;
            localmesh.triangles = rawMesh.Triangles;
            localmesh.RecalculateNormals();
            MeshCollider.sharedMesh = localmesh;
        }
Example #3
0
        private void AppendFace(RawMesh mesh, BaseBlock block, Face face, int xPos, int yPos, int zPos)
        {
            if (!block.CanBeRendered)
            {
                return;
            }
            int faceOrder = face.GetHashCode();

            RawMesh tMesh            = block.GetDrawData();
            int     sideCount        = block.Sides;
            int     faceVertexCount  = block.VertexCount / sideCount;
            int     faceIndicesCount = block.Indices / sideCount;
            int     faceUvCount      = block.UvCount / sideCount;

            //vertex
            for (int offset = 0; offset < faceVertexCount; offset++)
            {
                mesh.Vertices[mesh.vertexCount + offset] = tMesh.Vertices[faceOrder * 4 + offset] + new Vector3(xPos, yPos, zPos);
            }
            //triangle
            for (int offset = 0; offset < faceIndicesCount; offset++)
            {
                mesh.Triangles[mesh.trianglesCount + offset] = tMesh.Triangles[faceOrder * 6 + offset] + mesh.vertexCount - faceOrder * 4;
            }
            //uvs
            //todo doesnt support multiple face textures
            for (int offset = 0; offset < faceUvCount; offset++)
            {
                mesh.Uv[mesh.uvCount + offset] = tMesh.Uv[faceOrder * 4 + offset];
            }
            mesh.vertexCount    += 4;
            mesh.trianglesCount += 6;
            mesh.uvCount        += 4;
        }
Example #4
0
        //Warning: not thread safe!
        public static float GetSampleAverage(RawMesh mesh, float ratio = 2f, int sample = 3)
        {
            var total = 0f;

            for (int s = 0; s < sample; ++s)
            {
                var tt = _rand.Next(mesh.Triangles.Length);
                total += MinDistance(mesh, tt);
            }
            return(total / sample * ratio);
        }
Example #5
0
        private static float MinDistance(RawMesh mesh, int t)
        {
            var va = mesh.Vertices[mesh.Triangles[t].Va];
            var vb = mesh.Vertices[mesh.Triangles[t].Vb];
            var vc = mesh.Vertices[mesh.Triangles[t].Vc];
            var da = (vb - vc).LengthSquared();
            var db = (vc - va).LengthSquared();
            var dc = (va - vb).LengthSquared();

            return((float)Math.Sqrt(Math.Min(da, Math.Min(db, dc))));
        }
        public override void SetMeshData(RawMesh mesh, int[] vertexGroup, int groupCount, TriangleGroup triangleGroup)
        {
            _sum   = new Vector3[groupCount];
            _count = new int[groupCount];

            for (int i = 0; i < mesh.Vertices.Length; ++i)
            {
                var g = vertexGroup[i];
                _sum[g]   += mesh.Vertices[i];
                _count[g] += 1;
            }
        }
Example #7
0
        public override void Load()
        {
            Entity cam = EntityFactory.CreateEntity();

            cam.name = "cam";
            cam.AddComponent(new Camera());

            Entity ent = EntityFactory.CreateEntity();

            ent.AddComponent(new Move());
            ent.AddComponent(new MeshRenderer());
            MeshTexture texture = MeshTexture.LoadTexture("Res/Images/bobross.png");

            ent.GetComponent <MeshRenderer>().texturedMesh = new TexturedMesh(RawMesh.LoadToVao(v1, textureCoords, indices), texture);
            base.Load();
        }
Example #8
0
        public RawMesh Generate()
        {
            var ret = new RawMesh
            {
                Vertices  = _vertices.ToArray(),
                Triangles = new RawMesh.Triangle[_indices.Count / 3],
            };

            for (var i = 0; i < ret.Triangles.Length; ++i)
            {
                ret.Triangles[i] = new RawMesh.Triangle
                {
                    Va = _indices[i * 3 + 0],
                    Vb = _indices[i * 3 + 1],
                    Vc = _indices[i * 3 + 2],
                };
            }
            return(ret);
        }
    static int Main(string [] args)
    {
        bool error = false;

        foreach (var s in args)
        {
            switch (s)
            {
            case "--dump":
                Quickhull.dump_faces = true;
                break;

            default:
                BinaryReader bw;
                if (s.Substring(s.Length - 3) == ".gz")
                {
                    bw = new BinaryReader(new GZipStream(File.Open(s, FileMode.Open, FileAccess.Read), CompressionMode.Decompress));
                }
                else
                {
                    bw = new BinaryReader(File.Open(s, FileMode.Open, FileAccess.Read));
                }
                var mesh = new RawMesh(0);
                mesh.Read(bw);
                Debug.Log($"{s} - {mesh.verts.Length} points");
                bw.Close();
                var qh    = new Quickhull(mesh);
                var timer = System.Diagnostics.Stopwatch.StartNew();
                var hull  = qh.GetHull();
                error |= qh.error;
                timer.Stop();
                Debug.Log($"    - {hull.Count} faces {timer.ElapsedMilliseconds}ms");
                break;
            }
        }
        return(error ? 1 : 0);
    }
Example #10
0
        public TriangleGroup(RawMesh mesh, int[] vertexGroup, int groupCount)
        {
            _mesh = mesh;
            _vertexGroup = vertexGroup;

            _internalTriangles = Enumerable.Repeat(-1, groupCount).ToArray();
            _externalTriangles = Enumerable.Repeat(-1, groupCount).ToArray();

            for (int i = 0; i < _mesh.Triangles.Length; ++i)
            {
                var tt = _mesh.Triangles[i];
                var ia = vertexGroup[tt.Va];
                var ib = vertexGroup[tt.Vb];
                var ic = vertexGroup[tt.Vc];
                if (ia == ib && ia == ic)
                {
                    Append(i, ref _internalTriangles[ia]);
                }
                else
                {
                    Append(i, ref _externalTriangles[ia]);
                    if (ib != ia)
                    {
                        Append(i, ref _externalTriangles[ib]);
                    }
                    if (ic != ia && ic != ib)
                    {
                        Append(i, ref _externalTriangles[ic]);
                        if (ib != ia)
                        {
                            Append(i, ref _allExternalTriangles);
                        }
                    }
                }
            }
        }
Example #11
0
 public TexturedMesh(RawMesh _mesh, MeshTexture _texture)
 {
     this.rawMesh = _mesh;
     this.texture = _texture;
 }
Example #12
0
 public MeshSimplifier(RawMesh mesh, float clusterSize)
 {
     _mesh        = mesh;
     _clusterSize = clusterSize;
 }
Example #13
0
 public abstract void SetMeshData(RawMesh mesh, int[] vertexGroup, int groupCount, TriangleGroup triangleGroup);