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); }
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); }
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); }
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); }
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); }
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); } }
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); }