public override object parser(GameObject _object, Component component, UnityScene unityScene)
        {
            UnityVertexData skeletonData = null;

            SkinnedMeshRenderer renderer = component as SkinnedMeshRenderer;

            skeletonData = parserSkeleton(renderer, unityScene);

            UnityMeshData meshData = base.parser(_object, component, unityScene) as UnityMeshData;

            meshData.skeleton = skeletonData;

            return(meshData);
        }
Esempio n. 2
0
    static async Task SetFromSystemMeshDataAsync(this Mesh mesh, Func <SystemMeshData> getMeshData)
    {
        var meshData = await UnityMeshData.FromSystemDataAsync(getMeshData);

        mesh.Clear();

        mesh.vertices = meshData.Vertices;
        if (mesh.vertices.Length > ushort.MaxValue)
        {
            mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
        }

        mesh.SetIndices(meshData.Indices, meshData.Topology, 0);
        mesh.normals = meshData.Normals;
        mesh.RecalculateBounds();
    }
Esempio n. 3
0
        private async void LoadMesh(string meshPath)
        {
            _gameObject.transform.localScale = new Vector3(-1, 1, 1);
            var  meshFilter = _gameObject.AddComponent <MeshFilter>();
            Mesh mesh;

            while (_loadingInProgress && !_meshCache.ContainsKey(meshPath))
            {
                await new WaitForSecondsRealtime(0.1f).WaitAsync();
            }
            if (_loadingInProgress && !_meshCache.ContainsKey(meshPath))
            {
                throw new Exception("WaitWhile failed");
            }
            if (!_meshCache.ContainsKey(meshPath))
            {
                Debug.Log($"LoadMesh({meshPath})");
                _loadingInProgress = true;
                var startTime = DateTime.Now;
                var objDef    = await Resources.LoadText(meshPath);

                var objMesh = await ObjMesh.Load(objDef);

                var unityMeshData = await UnityMeshData.Load(objMesh);

                mesh = unityMeshData.ToUnityMesh();
                var time = (DateTime.Now - startTime).TotalSeconds;
                _meshCache[meshPath] = mesh;
                _loadingInProgress   = false;
                Debug.Log($"LoadMesh({meshPath}): finished after {time}s ({objDef.Length} bytes, " +
                          $"{unityMeshData.TriangleCount / 3} tris, {unityMeshData.VertexCount} verts)");
            }
            else
            {
                mesh = _meshCache[meshPath];
            }
            meshFilter.sharedMesh = mesh;
        }
Esempio n. 4
0
        public override object parser(GameObject _object, Component component, UnityScene unityScene)
        {
            Renderer renderer = component as Renderer;
            Mesh     mesh     = getMesh(renderer);

            if (null == mesh)
            {
                return(null);
            }

            UnityMeshData   meshData   = new UnityMeshData();
            UnityVertexData vertexData = new UnityVertexData();

            meshData.vertex = vertexData;

            /*pos*/
            Vector3[] vectors = mesh.vertices;
            /*normal*/
            Vector3[] normals = mesh.normals;
            /*uv*/
            Vector2[] uvs      = mesh.uv;
            Vector4[] tangnets = null;//mesh.tangents;
            Color[]   colors   = mesh.colors;



            int numVertices = vectors.Length;

            meshData.numVertices = numVertices;

            int offset = 0;
            Dictionary <string, Variable> variables = new Dictionary <string, Variable>();

            if (null != vectors && numVertices == vectors.Length)
            {
                variables.Add("pos", new Variable(3, offset));
                offset += 3;
            }

            if (null != normals && numVertices == normals.Length)
            {
                variables.Add("normal", new Variable(3, offset));
                offset += 3;
            }

            if (null != tangnets && 0 != tangnets.Length)
            {
                variables.Add("tangnet", new Variable(4, offset));
                offset += 4;
            }

            if (null != uvs && numVertices == uvs.Length)
            {
                variables.Add("uv", new Variable(2, offset));
                offset += 2;
            }


            if (null != colors && numVertices == colors.Length)
            {
                variables.Add("color", new Variable(4, offset));
                offset += 4;
            }

            variables.Add("data32PerVertex", new Variable(offset, offset));


            vertexData.vertex = Export.vector3toByte(vectors, normals, uvs, tangnets, colors);

            vertexData.data32PerVertex = offset;
            vertexData.variables       = variables;



            meshData.index = Export.ToUnit16(mesh.triangles);

            meshData.numTriangles = mesh.triangles.Length / 3;

            meshData.bounds = Export.toUntiyBounds(mesh.bounds, new Matrix4x4());

            // meshData.skeleton = skeletonData;


            meshData.material = Export.ExportMaterial(renderer.material);

            meshData.node = renderer.gameObject.name;

            if ("" == meshData.node)
            {
                Debug.LogError("error node name");
            }



            return(meshData);
        }
    private IEnumerator GetUnityMeshData(List <Vector3> vertices, List <Vector2> uvs, List <Vector3> normals, List <MeshFaceData> faceData)
    {
        int meshCount = 1;

        if (triangleIndiciesCount > MAX_VERTICES_PER_MESH)
        {
            meshCount = triangleIndiciesCount / MAX_VERTICES_PER_MESH;

            if (triangleIndiciesCount % MAX_VERTICES_PER_MESH > 0)
            {
                meshCount++;
            }
        }

        unityMeshData = new UnityMeshData[meshCount];

        for (int meshIndex = 0; meshIndex < meshCount; meshIndex++)
        {
            int meshFaceDataIndexOffset = 0;
            for (int i = 0; i < meshIndex; i++)
            {
                meshFaceDataIndexOffset += MAX_VERTICES_PER_MESH;
            }

            int meshFaceDataCount = 0;

            if (meshIndex == meshCount - 1)
            {
                meshFaceDataCount = triangleIndiciesCount % MAX_VERTICES_PER_MESH;
            }
            else
            {
                meshFaceDataCount = MAX_VERTICES_PER_MESH;
            }

            Vector3[] newVerts     = new Vector3[meshFaceDataCount];
            Vector2[] newUVs       = new Vector2[meshFaceDataCount];
            Vector3[] newNormals   = new Vector3[meshFaceDataCount];
            Color32[] colors       = new Color32[meshFaceDataCount];
            int[]     newTriangles = new int[meshFaceDataCount];

            for (int i = 0; i < meshFaceDataCount; i++)
            {
                newVerts[i]   = vertices[faceData[i + meshFaceDataIndexOffset].verticeIndexX - 1];
                newUVs[i]     = uvs[faceData[i + meshFaceDataIndexOffset].verticeIndexZ - 1];
                newNormals[i] = normals[faceData[i + meshFaceDataIndexOffset].verticeIndexZ - 1];
                if (matDic.ContainsKey(faceData[i + meshFaceDataIndexOffset].materialName))
                {
                    colors[i] = matDic[faceData[i + meshFaceDataIndexOffset].materialName].color;
                }
                else
                {
                    colors[i] = Color.gray;
                }

                newTriangles[i] = i;
            }

            unityMeshData[meshIndex] = new UnityMeshData(newVerts, newUVs, newNormals, newTriangles, colors);
        }

        yield return(null);
    }
Esempio n. 6
0
        protected UnityMeshData toMeshData(Renderer renderer, UnityScene unityScene)
        {
            Mesh            mesh         = null;
            UnityVertexData skeletonData = null;

            if (renderer is MeshRenderer)
            {
                mesh = renderer.GetComponent <MeshFilter>().mesh;
            }
            else if (renderer is SkinnedMeshRenderer)
            {
                mesh         = (renderer as SkinnedMeshRenderer).sharedMesh;
                skeletonData = parserSkeleton(renderer as SkinnedMeshRenderer, unityScene);
            }

            if (null == mesh)
            {
                return(null);
            }

            UnityMeshData   meshData   = new UnityMeshData();
            UnityVertexData vertexData = new UnityVertexData();

            meshData.vertex = vertexData;


            /*pos*/
            Vector3[] vectors = mesh.vertices;
            /*normal*/
            Vector3[] normals = mesh.normals;
            /*uv*/
            Vector2[] uvs      = mesh.uv;
            Vector4[] tangnets = null;//mesh.tangents;
            Color[]   colors   = mesh.colors;



            int numVertices = vectors.Length;

            meshData.numVertices = numVertices;

            int offset = 0;
            Dictionary <string, Variable> variables = new Dictionary <string, Variable>();

            if (null != vectors && numVertices == vectors.Length)
            {
                variables.Add("pos", new Variable(3, offset));
                offset += 3;
            }

            if (null != normals && numVertices == normals.Length)
            {
                variables.Add("normal", new Variable(3, offset));
                offset += 3;
            }

            if (null != tangnets && 0 != tangnets.Length)
            {
                variables.Add("tangnet", new Variable(4, offset));
                offset += 4;
            }

            if (null != uvs && numVertices == uvs.Length)
            {
                variables.Add("uv", new Variable(2, offset));
                offset += 2;
            }


            if (null != colors && numVertices == colors.Length)
            {
                variables.Add("color", new Variable(4, offset));
                offset += 4;
            }

            variables.Add("data32PerVertex", new Variable(offset, offset));


            vertexData.vertex = Export.vector3toByte(vectors, normals, uvs, tangnets, colors);

            vertexData.data32PerVertex = offset;
            vertexData.variables       = variables;



            meshData.index = Export.ToUnit16(mesh.triangles);

            meshData.numTriangles = mesh.triangles.Length / 3;

            meshData.bounds = Export.toUntiyBounds(mesh.bounds, Export.newMatrix4x4());

            meshData.skeleton = skeletonData;


            meshData.material = Export.ExportMaterial(renderer.material, unityScene);

            meshData.node = renderer.gameObject.name;

            if ("" == meshData.node)
            {
                Debug.LogError("error node name");
            }



            return(meshData);
        }