private static void SetDataToMesh(UnityEngine.Mesh mesh, MyMeshData meshData, NativeArray <TurtleMeshAllocationCounter> submeshSizes) { UnityEngine.Profiling.Profiler.BeginSample("applying mesh data"); int vertexCount = meshData.vertexData.Length; int indexCount = meshData.indices.Length; mesh.Clear(); mesh.SetVertexBufferParams(vertexCount, GetVertexLayout()); mesh.SetVertexBufferData(meshData.vertexData, 0, 0, vertexCount, 0, MeshUpdateFlags.DontRecalculateBounds | MeshUpdateFlags.DontResetBoneBounds | MeshUpdateFlags.DontValidateIndices); mesh.SetIndexBufferParams(indexCount, IndexFormat.UInt32); mesh.SetIndexBufferData(meshData.indices, 0, 0, indexCount, MeshUpdateFlags.DontRecalculateBounds | MeshUpdateFlags.DontResetBoneBounds | MeshUpdateFlags.DontValidateIndices); mesh.subMeshCount = submeshSizes.Length; for (int i = 0; i < submeshSizes.Length; i++) { var submeshSize = submeshSizes[i]; var descriptor = new SubMeshDescriptor() { baseVertex = 0, topology = MeshTopology.Triangles, indexCount = submeshSize.totalTriangleIndexes, indexStart = submeshSize.indexInTriangles, }; mesh.SetSubMesh(i, descriptor, MeshUpdateFlags.DontRecalculateBounds | MeshUpdateFlags.DontResetBoneBounds | MeshUpdateFlags.DontValidateIndices); } mesh.bounds = meshData.meshBounds[0]; UnityEngine.Profiling.Profiler.EndSample(); }
public TurtleMeshBuildingCompletable( Mesh targetMesh, NativeArray <TurtleMeshAllocationCounter> resultMeshSizeBySubmesh, DependencyTracker <NativeTurtleData> nativeData, NativeList <TurtleOrganInstance> organInstances) { if (nativeData.IsDisposed) { throw new InvalidOperationException("turtle data has been disposed before completable could finish."); } this.targetMesh = targetMesh; targetMesh.MarkDynamic(); this.resultMeshSizeBySubmesh = resultMeshSizeBySubmesh; UnityEngine.Profiling.Profiler.BeginSample("mesh data building job"); UnityEngine.Profiling.Profiler.BeginSample("allocating"); var lastSubmeshSize = resultMeshSizeBySubmesh[resultMeshSizeBySubmesh.Length - 1]; meshData = new MyMeshData { indices = new NativeArray <uint>(lastSubmeshSize.indexInTriangles + lastSubmeshSize.totalTriangleIndexes, Allocator.TempJob), // TODO: does this have to be persistent? or can it be tempjob since it'll be handed to the mesh? vertexData = new NativeArray <MeshVertexLayout>(lastSubmeshSize.indexInVertexes + lastSubmeshSize.totalVertexes, Allocator.TempJob), meshBounds = new NativeArray <Bounds>(1, Allocator.TempJob) }; var turtleEntitySpawnJob = new TurtleMeshBuildingJob { templateVertexData = nativeData.Data.vertexData, templateTriangleData = nativeData.Data.triangleData, templateOrganData = nativeData.Data.allOrganData, submeshSizes = resultMeshSizeBySubmesh, organInstances = organInstances, targetMesh = meshData }; UnityEngine.Profiling.Profiler.EndSample(); UnityEngine.Profiling.Profiler.BeginSample("scheduling"); currentJobHandle = turtleEntitySpawnJob.Schedule(); nativeData.RegisterDependencyOnData(currentJobHandle); currentJobHandle = organInstances.Dispose(currentJobHandle); UnityEngine.Profiling.Profiler.EndSample(); UnityEngine.Profiling.Profiler.EndSample(); }