public JobHandle SchedulePaintRoadsJob(ref MapPixelData mapData, ref NativeArray <byte> tileData, JobHandle dependencies)
        {
            // Assign tile data to terrain, painting paths in the process
            int  pathsIndex   = mapData.mapPixelX + (mapData.mapPixelY * MapsFile.MaxMapPixelX);
            byte roadDataPt   = pathsData[roads][pathsIndex];
            byte roadCorners  = (byte)(InRange(pathsIndex) ? (pathsData[roads][pathsIndex + 1] & 0x5) | (pathsData[roads][pathsIndex - 1] & 0x50) : 0);
            byte trackDataPt  = pathsData[tracks][pathsIndex];
            byte trackCorners = (byte)(InRange(pathsIndex) ? (pathsData[tracks][pathsIndex + 1] & 0x5) | (pathsData[tracks][pathsIndex - 1] & 0x50) : 0);

            if (editorEnabled)
            {
                roadDataPt   = BasicRoadsPathEditor.pathsData[roads][pathsIndex];
                roadCorners  = (byte)(InRange(pathsIndex) ? (BasicRoadsPathEditor.pathsData[roads][pathsIndex + 1] & 0x5) | (BasicRoadsPathEditor.pathsData[roads][pathsIndex - 1] & 0x50) : 0);
                trackDataPt  = BasicRoadsPathEditor.pathsData[tracks][pathsIndex];
                trackCorners = (byte)(InRange(pathsIndex) ? (BasicRoadsPathEditor.pathsData[tracks][pathsIndex + 1] & 0x5) | (BasicRoadsPathEditor.pathsData[tracks][pathsIndex - 1] & 0x50) : 0);
            }

            PaintRoadsJob paintRoadsJob = new PaintRoadsJob
            {
                tileData     = tileData,
                tilemapData  = mapData.tilemapData,
                tdDim        = tileDataDim,
                tDim         = assignTilesDim,
                locationRect = mapData.locationRect,
                midLo        = (assignTilesDim / 2) - 1,
                midHi        = assignTilesDim / 2,
                roadDataPt   = roadDataPt,
                roadCorners  = roadCorners,
                trackDataPt  = trackDataPt,
                trackCorners = trackCorners,
            };
            JobHandle paintRoadsHandle = paintRoadsJob.Schedule(assignTilesDim * assignTilesDim, 64, dependencies);

            JobHandle returnHandle = paintRoadsHandle;

            if (smoothPaths)
            {
                SmoothRoadsTerrainJob smoothRoadTerrainJob = new SmoothRoadsTerrainJob()
                {
                    heightmapData = mapData.heightmapData,
                    tilemapData   = mapData.tilemapData,
                    hDim          = DaggerfallUnity.Instance.TerrainSampler.HeightmapDimension,
                    tDim          = assignTilesDim,
                    locationRect  = mapData.locationRect,
                };
                JobHandle smoothRoadHandle = smoothRoadTerrainJob.Schedule(paintRoadsHandle);
                returnHandle = smoothRoadHandle;
            }

            return(returnHandle);
        }
Beispiel #2
0
        public override JobHandle ScheduleAssignTilesJob(ITerrainSampler terrainSampler, ref MapPixelData mapData, JobHandle dependencies, bool march = true)
        {
            // Cache tile data to minimise noise sampling during march.
            NativeArray <byte>  tileData    = new NativeArray <byte>(tileDataDim * tileDataDim, Allocator.TempJob);
            GenerateTileDataJob tileDataJob = new GenerateTileDataJob
            {
                heightmapData    = mapData.heightmapData,
                tileData         = tileData,
                tdDim            = tileDataDim,
                hDim             = terrainSampler.HeightmapDimension,
                maxTerrainHeight = terrainSampler.MaxTerrainHeight,
                oceanElevation   = terrainSampler.OceanElevation,
                beachElevation   = terrainSampler.BeachElevation,
                mapPixelX        = mapData.mapPixelX,
                mapPixelY        = mapData.mapPixelY,
            };
            JobHandle tileDataHandle = tileDataJob.Schedule(tileDataDim * tileDataDim, 64, dependencies);

            // Assign tile data to terrain, painting paths in the process
            int  pathsIndex   = mapData.mapPixelX + (mapData.mapPixelY * MapsFile.MaxMapPixelX);
            byte roadDataPt   = pathsData[roads][pathsIndex];
            byte roadCorners  = (byte)(InRange(pathsIndex) ? (pathsData[roads][pathsIndex + 1] & 0x5) | (pathsData[roads][pathsIndex - 1] & 0x50) : 0);
            byte trackDataPt  = pathsData[tracks][pathsIndex];
            byte trackCorners = (byte)(InRange(pathsIndex) ? (pathsData[tracks][pathsIndex + 1] & 0x5) | (pathsData[tracks][pathsIndex - 1] & 0x50) : 0);

            if (editorEnabled)
            {
                roadDataPt   = BasicRoadsPathEditor.pathsData[roads][pathsIndex];
                roadCorners  = (byte)(InRange(pathsIndex) ? (BasicRoadsPathEditor.pathsData[roads][pathsIndex + 1] & 0x5) | (BasicRoadsPathEditor.pathsData[roads][pathsIndex - 1] & 0x50) : 0);
                trackDataPt  = BasicRoadsPathEditor.pathsData[tracks][pathsIndex];
                trackCorners = (byte)(InRange(pathsIndex) ? (BasicRoadsPathEditor.pathsData[tracks][pathsIndex + 1] & 0x5) | (BasicRoadsPathEditor.pathsData[tracks][pathsIndex - 1] & 0x50) : 0);
            }

            NativeArray <byte>      lookupData     = new NativeArray <byte>(lookupTable, Allocator.TempJob);
            AssignTilesWithRoadsJob assignTilesJob = new AssignTilesWithRoadsJob
            {
                lookupTable  = lookupData,
                tileData     = tileData,
                tilemapData  = mapData.tilemapData,
                tdDim        = tileDataDim,
                tDim         = assignTilesDim,
                hDim         = terrainSampler.HeightmapDimension,
                march        = march,
                locationRect = mapData.locationRect,
                midLo        = (assignTilesDim / 2) - 1,
                midHi        = assignTilesDim / 2,
                roadDataPt   = roadDataPt,
                roadCorners  = roadCorners,
                trackDataPt  = trackDataPt,
                trackCorners = trackCorners,
            };
            JobHandle assignTilesHandle = assignTilesJob.Schedule(assignTilesDim * assignTilesDim, 64, tileDataHandle);

            JobHandle returnHandle = assignTilesHandle;

            if (smoothPaths)
            {
                SmoothRoadsTerrainJob smoothRoadTerrainJob = new SmoothRoadsTerrainJob()
                {
                    heightmapData = mapData.heightmapData,
                    tilemapData   = mapData.tilemapData,
                    hDim          = DaggerfallUnity.Instance.TerrainSampler.HeightmapDimension,
                    tDim          = assignTilesDim,
                    locationRect  = mapData.locationRect,
                };
                JobHandle smoothRoadHandle = smoothRoadTerrainJob.Schedule(assignTilesHandle);
                returnHandle = smoothRoadHandle;
            }

            // Add both working native arrays to disposal list.
            mapData.nativeArrayList.Add(tileData);
            mapData.nativeArrayList.Add(lookupData);

            return(returnHandle);
        }