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