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