private static void LoadStandartMesh(OBJECTINFO objMainInfo, string uniqueMeshName) { if (BinaryReader.ReadUInt16() == 0) { numLODs = BinaryReader.ReadByte(); for (int i = 0; i < numLODs; i++) { float relativeDistance = BinaryReader.ReadSingle(); int numVertices = BinaryReader.ReadUInt16(); List <Vector3> positionOfPoint = new List <Vector3>(); List <Vector3> normalVector = new List <Vector3>(); List <Vector2> textureCoordinate = new List <Vector2>(); List <int[]> meshTriangles = new List <int[]>(); List <int> materialsId = new List <int>(); for (int l = 0; l < numVertices; l++) { positionOfPoint.Add(CustomReader.ReadType <Vector3>()); normalVector.Add(CustomReader.ReadType <Vector3>()); textureCoordinate.Add(CustomReader.ReadType <Vector2>()); } int numFaceGroups = BinaryReader.ReadByte(); for (int l = 0; l < numFaceGroups; l++) { List <int> faceTriangles = new List <int>(); int numTriangles = BinaryReader.ReadUInt16(); for (int n = 0; n < numTriangles * 3; n++) { faceTriangles.Add(BinaryReader.ReadUInt16()); } int materialId = BinaryReader.ReadUInt16(); meshTriangles.Add(faceTriangles.ToArray()); materialsId.Add(materialId); } if (i == rootLod) { SMeshInfo sMeshInfo = new SMeshInfo(); sMeshInfo.name = uniqueMeshName; sMeshInfo.texs = materialsId.ToArray(); sMeshInfo.triangles = meshTriangles.ToArray(); sMeshInfo.vertices = positionOfPoint.ToArray(); sMeshInfo.normals = normalVector.ToArray(); sMeshInfo.uv = textureCoordinate.ToArray(); CreateMesh(sMeshInfo, objMainInfo); } } } }
private static void CreateMesh(SMeshInfo sMeshInfo, OBJECTINFO objMainInfo) { UniqueMesh.transform.position = objMainInfo.positionMesh * WorldController.WorldScale; UniqueMesh.transform.localScale = objMainInfo.scaleMesh; Quaternion fixedRotation = new Quaternion(objMainInfo.rotationMesh.y, objMainInfo.rotationMesh.z, objMainInfo.rotationMesh.w, -objMainInfo.rotationMesh.x); UniqueMesh.transform.rotation = fixedRotation; MeshRenderer meshRenderer = UniqueMesh.AddComponent <MeshRenderer>(); meshRenderer.materials = new Material[sMeshInfo.triangles.Length]; MeshFilter meshFilter = UniqueMesh.AddComponent <MeshFilter>(); meshFilter.sharedMesh = new Mesh(); for (int i = 0; i < sMeshInfo.vertices.Length; i++) { sMeshInfo.vertices[i] = sMeshInfo.vertices[i] * WorldController.WorldScale; } meshFilter.sharedMesh.subMeshCount = sMeshInfo.triangles.Length; meshFilter.sharedMesh.vertices = sMeshInfo.vertices; meshFilter.sharedMesh.normals = sMeshInfo.normals; meshFilter.sharedMesh.uv = sMeshInfo.uv; for (int i = 0; i < sMeshInfo.triangles.Length; i++) { meshRenderer.materials[i].shader = Shader.Find("Mobile/Diffuse"); meshRenderer.materials[i].mainTexture = TextureLoader.LoadTexture(_4DSTextures[sMeshInfo.texs[i] - 1]); meshFilter.sharedMesh.SetTriangles(sMeshInfo.triangles[i], i); } meshFilter.sharedMesh.Optimize(); }