internal void InitMeshDataNativeContainers(GAlbedoToVertexColorMode albedoToVertexColor) { int vertexCount = generationMetadata[0] * 3; vertexNativeArray = new NativeArray <Vector3>(vertexCount, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); GUtilities.EnsureArrayLength(ref vertexArray, vertexCount); uvsNativeArray = new NativeArray <Vector2>(vertexCount, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); GUtilities.EnsureArrayLength(ref uvsArray, vertexCount); trianglesNativeArray = new NativeArray <int>(vertexCount, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); GUtilities.EnsureArrayLength(ref trianglesArray, vertexCount); normalsNativeArray = new NativeArray <Vector3>(vertexCount, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); GUtilities.EnsureArrayLength(ref normalsArray, vertexCount); if (albedoToVertexColor == GAlbedoToVertexColorMode.None) { vertexColorsNativeArray = new NativeArray <Color32>(1, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); } else { vertexColorsNativeArray = new NativeArray <Color32>(vertexCount, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); GUtilities.EnsureArrayLength(ref vertexColorsArray, vertexCount); } }
internal GCreateVertexJob GetCreateVertexJob( int meshBaseResolution, int meshResolution, int lod, int displacementSeed, float displacementStrength, bool smoothNormal, bool useSmoothNormalMask, GTextureNativeDataDescriptor <Color32> maskMap, GAlbedoToVertexColorMode albedoToVertexColor, GTextureNativeDataDescriptor <Color32> albedoMap, GTextureNativeDataDescriptor <Color32>[] hm) { InitMeshDataNativeContainers(albedoToVertexColor); Vector3 terrainSize = Terrain.TerrainData.Geometry.Size; Rect uvRect = GetUvRange(); float texelSize = 1.0f / Terrain.TerrainData.Geometry.HeightMapResolution; GCreateVertexJob job = new GCreateVertexJob() { nodes = subdivNodeNativeArray, creationState = subdivNodeCreationState, hmC = hm[4], hmL = hm[3], hmT = hm[7], hmR = hm[5], hmB = hm[1], hmBL = hm[0], hmTL = hm[6], hmTR = hm[8], hmBR = hm[2], vertices = vertexNativeArray, uvs = uvsNativeArray, normals = normalsNativeArray, triangles = trianglesNativeArray, colors = vertexColorsNativeArray, metadata = generationMetadata, meshBaseResolution = meshBaseResolution, meshResolution = meshResolution, lod = lod, displacementSeed = displacementSeed, displacementStrength = displacementStrength, smoothNormal = smoothNormal, useSmoothNormalMask = useSmoothNormalMask, albedoToVertexColorMode = albedoToVertexColor, albedoMap = albedoMap, maskMap = maskMap, terrainSize = terrainSize, chunkUvRect = uvRect, chunkLocalPosition = transform.localPosition, texelSize = texelSize }; return(job); }
internal void UpdateMesh(int lod, GAlbedoToVertexColorMode albedoToVertexColor) { Mesh m = GetMesh(lod); m.Clear(); int leafCount = generationMetadata[GGeometryJobUtilities.METADATA_LEAF_COUNT]; int removedLeafCount = generationMetadata[GGeometryJobUtilities.METADATA_LEAF_REMOVED]; if (leafCount != removedLeafCount) { vertexNativeArray.CopyTo(vertexArray); uvsNativeArray.CopyTo(uvsArray); normalsNativeArray.CopyTo(normalsArray); trianglesNativeArray.CopyTo(trianglesArray); m.vertices = vertexArray; m.uv = uvsArray; m.triangles = trianglesArray; m.normals = normalsArray; if (albedoToVertexColor != GAlbedoToVertexColorMode.None) { vertexColorsNativeArray.CopyTo(vertexColorsArray); m.colors32 = vertexColorsArray; } m.RecalculateBounds(); RecalculateTangentIfNeeded(m); } if (lod == 0) { MeshFilterComponent.sharedMesh = m; MeshColliderComponent.sharedMesh = m; } else { GTerrainChunkLOD chunkLOD = GetChunkLOD(lod); chunkLOD.MeshFilterComponent.sharedMesh = m; } SetLastUpdatedTimeNow(); }