Ejemplo n.º 1
0
        public void Collect_1MeshSupplierWith1Mesh_1MeshIsFound()
        {
            var scene         = new OperatorPart(Guid.NewGuid(), new Utilities.ValueFunction());
            var mesh1Supplier = new OperatorPart(Guid.NewGuid(), new MeshSupplier1Mesh());

            scene.Connections.Add(mesh1Supplier);

            var meshCollector = new MeshCollector(_parentFunc);

            meshCollector.Collect(scene);

            Assert.AreEqual(1, meshCollector.NumberOfCollectedMeshes);
        }
Ejemplo n.º 2
0
        public void Collect_1MeshSupplier_TransformEntryIsIdentity()
        {
            var scene         = new OperatorPart(Guid.NewGuid(), new Utilities.ValueFunction());
            var mesh1Supplier = new OperatorPart(Guid.NewGuid(), new MeshSupplier1Mesh());

            scene.Connections.Add(mesh1Supplier);

            var meshCollector = new MeshCollector(_parentFunc);

            meshCollector.Collect(scene);

            Assert.AreEqual(Matrix.Identity, meshCollector.CollectedMeshes.First().Key);
        }
Ejemplo n.º 3
0
        public void Collect_1MeshSupplierWithTransformX100Before_TransformEntryIsX100()
        {
            var scene         = new OperatorPart(Guid.NewGuid(), new Utilities.ValueFunction());
            var mesh1Supplier = new OperatorPart(Guid.NewGuid(), new MeshSupplier1Mesh());
            var transformX100 = new OperatorPart(Guid.NewGuid(), new TransformX100());

            scene.Connections.Add(transformX100);
            transformX100.Connections.Add(mesh1Supplier);

            var meshCollector = new MeshCollector(_parentFunc);

            meshCollector.Collect(scene);

            Assert.AreEqual(Matrix.Translation(100, 0, 0), meshCollector.CollectedMeshes.First().Key);
        }
Ejemplo n.º 4
0
        public void Collect_2MeshSupplierFirstWith1MeshSecondWith2Meshes_3MeshesAreFound()
        {
            var scene         = new OperatorPart(Guid.NewGuid(), new Utilities.ValueFunction());
            var mesh1Supplier = new OperatorPart(Guid.NewGuid(), new MeshSupplier1Mesh());
            var mesh2Supplier = new OperatorPart(Guid.NewGuid(), new MeshSupplier2Meshes());

            scene.Connections.Add(mesh1Supplier);
            scene.Connections.Add(mesh2Supplier);

            var meshCollector = new MeshCollector(_parentFunc);

            meshCollector.Collect(scene);

            Assert.AreEqual(3, meshCollector.NumberOfCollectedMeshes);
        }
Ejemplo n.º 5
0
        public void Collect_2MeshSupplierWith3MeshesOneWithTransformBefore_2TransformEntriesAreFound()
        {
            var scene         = new OperatorPart(Guid.NewGuid(), new Utilities.ValueFunction());
            var mesh1Supplier = new OperatorPart(Guid.NewGuid(), new MeshSupplier1Mesh());
            var mesh2Supplier = new OperatorPart(Guid.NewGuid(), new MeshSupplier2Meshes());
            var transformX100 = new OperatorPart(Guid.NewGuid(), new TransformX100());

            scene.Connections.Add(mesh2Supplier);
            scene.Connections.Add(transformX100);
            transformX100.Connections.Add(mesh1Supplier);

            var meshCollector = new MeshCollector(_parentFunc);

            meshCollector.Collect(scene);

            Assert.AreEqual(2, meshCollector.CollectedMeshes.Count);
        }
Ejemplo n.º 6
0
                public void Append(MeshCollector o)
                {
                    var baseVertex = VertexCount;

                    for (int i = 0; i < o.VertexCount; ++i)
                    {
                        PushPosition(o.m_positions[i], Matrix4x4.identity);
                        if (o.m_normals.Count > i)
                        {
                            PushNormal(o.m_normals[i], Matrix4x4.identity);
                        }
                        if (o.m_tangents.Count > i)
                        {
                            PushTangent(o.m_tangents[i], Matrix4x4.identity);
                        }
                        if (o.m_colors.Count > i)
                        {
                            PushColor(o.m_colors[i]);
                        }
                        if (o.m_uv0s.Count > i)
                        {
                            PushUV0(o.m_uv0s[i]);
                        }
                        if (o.m_uv1s.Count > i)
                        {
                            PushUV1(o.m_uv1s[i]);
                        }
                        if (o.m_uv2s.Count > i)
                        {
                            PushUV2(o.m_uv2s[i]);
                        }
                        if (o.m_uv3s.Count > i)
                        {
                            PushUV3(o.m_uv3s[i]);
                        }
                    }

                    for (int i = 0; i < o.m_indices.Count; ++i)
                    {
                        PushIndex(o.m_indices[i], baseVertex);
                    }
                }
Ejemplo n.º 7
0
            static void Bake(TE3ScatterArea target, GameObject root)
            {
                var bakedSources = new List <GameObject>();
                var bakedOutputs = new List <GameObject>();

                var mat2mesh = new Dictionary <Material, MeshCollector>();

                foreach (Transform child in root.transform)
                {
                    var childProxy = child.GetComponent <TE3ScatterProxy>();
                    if (!childProxy.bakeMesh)
                    {
                        continue;
                    }

                    var           childMR  = child.GetComponent <MeshRenderer>();
                    var           childMF  = child.GetComponent <MeshFilter>();
                    var           childMat = childMR.sharedMaterial;
                    MeshCollector childCol = null;
                    if (!mat2mesh.TryGetValue(childMat, out childCol))
                    {
                        childCol           = new MeshCollector();
                        mat2mesh[childMat] = childCol;
                    }

                    if (childProxy.wrapEnvironment == 0f)
                    {
                        childCol.PushMesh(childMF.sharedMesh, Matrix4x4.TRS(child.transform.localPosition, child.transform.localRotation, child.transform.localScale), -1);
                    }
                    else
                    {
                        Debug.Log("wrap: " + childProxy.wrapEnvironment);
                        var vtxColStart = childCol.VertexCount;
                        var vtxCount    = childMF.sharedMesh.vertexCount;
                        childCol.PushMesh(childMF.sharedMesh, Matrix4x4.TRS(child.transform.localPosition, child.transform.localRotation, child.transform.localScale), -1);

                        var indices = childMF.sharedMesh.triangles;
                        for (int i = 0, n = indices.Length; i < n; i += 3)
                        {
                            var p0 = childCol.GetPosition(vtxColStart + i + 0);
                            var p1 = childCol.GetPosition(vtxColStart + i + 1);
                            var p2 = childCol.GetPosition(vtxColStart + i + 2);
                            var n0 = childCol.GetNormal(vtxColStart + i + 0);
                            var n1 = childCol.GetNormal(vtxColStart + i + 1);
                            var n2 = childCol.GetNormal(vtxColStart + i + 2);

                            RaycastHit rhiPC0;
                            if (!Physics.Raycast(p0 - n0 * 0.01f, -n0, out rhiPC0, 1f))
                            {
                                rhiPC0.point = p0;
                            }
                            RaycastHit rhiPC1;
                            if (!Physics.Raycast(p1 - n1 * 0.01f, -n1, out rhiPC1, 1f))
                            {
                                rhiPC1.point = p1;
                            }
                            RaycastHit rhiPC2;
                            if (!Physics.Raycast(p2 - n2 * 0.01f, -n2, out rhiPC2, 1f))
                            {
                                rhiPC2.point = p2;
                            }

                            childCol.SetPosition(vtxColStart + i + 0, rhiPC0.point);
                            childCol.SetPosition(vtxColStart + i + 1, rhiPC1.point);
                            childCol.SetPosition(vtxColStart + i + 2, rhiPC2.point);
                        }
                    }

                    bakedSources.Add(child.gameObject);
                }

                foreach (var kvp in mat2mesh)
                {
                    var go = new GameObject("Baked_" + kvp.Key.name);
                    bakedOutputs.Add(go);

                    var mr = go.AddComponent <MeshRenderer>();
                    mr.sharedMaterial = kvp.Key;

                    var mf = go.AddComponent <MeshFilter>();
                    mf.sharedMesh = new Mesh();
                    kvp.Value.WriteMesh(mf.sharedMesh, 2);

                    mf.sharedMesh.RecalculateBounds();
                }

                target.SetBakedData(bakedSources, bakedOutputs);
            }