private Mesh CreateCombinedMesh(CombinedMeshData combinedMeshData) { Mesh combinedMesh = new Mesh(); combinedMesh.name = _combineSettings.CombinedMeshName; combinedMesh.vertices = combinedMeshData.VertPositions.ToArray(); if (combinedMeshData.VertTangents.Count != 0) { combinedMesh.tangents = combinedMeshData.VertTangents.ToArray(); } if (combinedMeshData.VertNormals.Count != 0) { combinedMesh.normals = combinedMeshData.VertNormals.ToArray(); } if (combinedMeshData.VertUV1.Count != 0) { combinedMesh.uv = combinedMeshData.VertUV1.ToArray(); } if (combinedMeshData.VertUV3.Count != 0) { combinedMesh.uv3 = combinedMeshData.VertUV3.ToArray(); } if (combinedMeshData.VertUV4.Count != 0) { combinedMesh.uv4 = combinedMeshData.VertUV4.ToArray(); } if (combinedMeshData.VertColors.Count != 0) { combinedMesh.colors = combinedMeshData.VertColors.ToArray(); } combinedMesh.SetIndices(combinedMeshData.VertIndices.ToArray(), MeshTopology.Triangles, 0); if (_combineSettings.GenerateLightmapUVs) { Unwrapping.GenerateSecondaryUVSet(combinedMesh); } else if (combinedMeshData.VertUV2.Count != 0) { combinedMesh.uv2 = combinedMeshData.VertUV2.ToArray(); } combinedMesh.UploadMeshData(_combineSettings.MarkNoLongerReadable); SaveCombinedMeshAsAsset(combinedMesh); return(combinedMesh); }
private GameObject CreateCombinedMeshObject(CombinedMeshData combinedMeshData, Material meshMaterial, GameObject combinedMeshesParent) { Mesh combinedMesh = CreateCombinedMesh(combinedMeshData); GameObject combinedMeshObject = new GameObject(_combineSettings.CombinedObjectName); UndoEx.RegisterCreatedGameObject(combinedMeshObject); combinedMeshObject.transform.parent = combinedMeshesParent.transform; combinedMeshObject.isStatic = _combineSettings.MakeCombinedMeshesStatic ? true : false; MeshFilter meshFilter = combinedMeshObject.AddComponent <MeshFilter>(); meshFilter.sharedMesh = combinedMesh; MeshRenderer meshRenderer = combinedMeshObject.AddComponent <MeshRenderer>(); meshRenderer.sharedMaterial = meshMaterial; if (_combineSettings.CollHandling == MeshCombineSettings.ColliderHandling.CreateNew) { if (_combineSettings.NewCollidersType == MeshCombineSettings.ColliderType.Mesh) { MeshCollider meshCollider = combinedMeshObject.AddComponent <MeshCollider>(); if (_combineSettings.UseConvexMeshColliders) { meshCollider.convex = true; } else { meshCollider.convex = false; } if (_combineSettings.NewCollidersAreTriggers) { meshCollider.isTrigger = true; } else { meshCollider.isTrigger = false; } } else if (_combineSettings.NewCollidersType == MeshCombineSettings.ColliderType.Box) { BoxCollider boxCollider = combinedMeshObject.AddComponent <BoxCollider>(); if (_combineSettings.NewCollidersAreTriggers) { boxCollider.isTrigger = true; } else { boxCollider.isTrigger = false; } } } Vector3 meshPivotPt = MeshCombineSettings.MeshPivotToWorldPoint(combinedMeshObject, _combineSettings.CombinedMeshesPivot); combinedMeshObject.SetMeshPivotPoint(meshPivotPt); return(combinedMeshObject); }
private List <GameObject> Combine(MeshCombineMaterial meshCombineMaterial, GameObject combinedMeshesParent) { List <MeshInstance> meshInstances = meshCombineMaterial.MeshInstances; if (meshInstances.Count == 0) { return(new List <GameObject>()); } int maxNumMeshVerts = GetMaxNumberOfMeshVerts(); const int numVertsPerMeshGuess = 500; int totalNumVertsGuess = meshCombineMaterial.MeshInstances.Count * numVertsPerMeshGuess; var combinedMeshData = new CombinedMeshData(totalNumVertsGuess); List <GameObject> combinedMeshObjects = new List <GameObject>(100); for (int meshInstanceIndex = 0; meshInstanceIndex < meshInstances.Count; ++meshInstanceIndex) { MeshInstance meshInstance = meshInstances[meshInstanceIndex]; Mesh mesh = meshInstance.SourceMesh; if (mesh.vertexCount == 0) { continue; } EditorUtility.DisplayProgressBar("Combining Meshes", "Processing material: " + meshCombineMaterial.Material.name, (float)meshInstanceIndex / meshInstances.Count); Matrix4x4 worldMatrix = meshInstance.MeshTransform.localToWorldMatrix; Matrix4x4 worldInverseTranspose = worldMatrix.inverse.transpose; int numNegativeScaleComps = 0; Vector3 worldScale = meshInstance.MeshTransform.lossyScale; if (worldScale[0] < 0.0f) { ++numNegativeScaleComps; } if (worldScale[1] < 0.0f) { ++numNegativeScaleComps; } if (worldScale[2] < 0.0f) { ++numNegativeScaleComps; } bool reverseVertexWindingOrder = (numNegativeScaleComps % 2 != 0); int[] submeshVertIndices = mesh.GetTriangles(meshInstance.SubmeshIndex); if (submeshVertIndices.Length == 0) { continue; } Vector4[] vertTangents = mesh.tangents; Vector3[] vertPositions = mesh.vertices; Vector3[] vertNormals = mesh.normals; Vector2[] vertUV1 = mesh.uv; Vector2[] vertUV2 = mesh.uv2; Vector2[] vertUV3 = mesh.uv3; Vector2[] vertUV4 = mesh.uv4; Color[] vertColors = mesh.colors; foreach (var vertIndex in submeshVertIndices) { if (vertTangents.Length != 0) { Vector3 transformedTangent = new Vector3(vertTangents[vertIndex].x, vertTangents[vertIndex].y, vertTangents[vertIndex].z); transformedTangent = worldInverseTranspose.MultiplyVector(transformedTangent); transformedTangent.Normalize(); combinedMeshData.VertTangents.Add(new Vector4(transformedTangent.x, transformedTangent.y, transformedTangent.z, vertTangents[vertIndex].w)); } if (vertNormals.Length != 0) { Vector3 transformedNormal = worldInverseTranspose.MultiplyVector(vertNormals[vertIndex]); transformedNormal.Normalize(); combinedMeshData.VertNormals.Add(transformedNormal); } if (vertPositions.Length != 0) { combinedMeshData.VertPositions.Add(worldMatrix.MultiplyPoint(vertPositions[vertIndex])); } if (vertColors.Length != 0) { combinedMeshData.VertColors.Add(vertColors[vertIndex]); } if (vertUV1.Length != 0) { combinedMeshData.VertUV1.Add(vertUV1[vertIndex]); } if (vertUV3.Length != 0) { combinedMeshData.VertUV2.Add(vertUV3[vertIndex]); } if (vertUV4.Length != 0) { combinedMeshData.VertUV3.Add(vertUV4[vertIndex]); } if (vertUV2.Length != 0 && !_combineSettings.GenerateLightmapUVs) { combinedMeshData.VertUV2.Add(vertUV2[vertIndex]); } combinedMeshData.AddCurrentVertIndex(); int numIndices = combinedMeshData.VertIndices.Count; if (reverseVertexWindingOrder && numIndices % 3 == 0) { combinedMeshData.ReverseWindingOrderForLastTriangle(); } int numMeshVerts = combinedMeshData.VertPositions.Count; if (combinedMeshData.VertIndices.Count % 3 == 0 && (maxNumMeshVerts - numMeshVerts) < 3) { combinedMeshObjects.Add(CreateCombinedMeshObject(combinedMeshData, meshCombineMaterial.Material, combinedMeshesParent)); combinedMeshData.Reset(); } } } combinedMeshObjects.Add(CreateCombinedMeshObject(combinedMeshData, meshCombineMaterial.Material, combinedMeshesParent)); EditorUtility.ClearProgressBar(); return(combinedMeshObjects); }