public void SetSurfaceItem(int z, int x, TerrainModify.Surface surface, bool overrideExisting)
        {
            x = Mathf.Min(x, SurfaceManager.GRID_SIZE - 1);
            z = Mathf.Min(z, SurfaceManager.GRID_SIZE - 1);

            var item = new SurfaceItem
            {
                surface          = surface,
                overrideExisting = overrideExisting
            };

            if (isEightyOneEnabled)
            {
                Surfaces[z * GRID_SIZE + x] = item;
                return;
            }
            if (x < GRID_PER_AREA * 2 || x >= GRID_PER_AREA * 7 || z < GRID_PER_AREA * 2 || z >= GRID_PER_AREA * 7)
            {
                return;
            }
            Surfaces[(z - 2 * GRID_PER_AREA) * (GRID_SIZE - GRID_PER_AREA * 4) + x - 2 * GRID_PER_AREA] = item;
        }
        private static byte GetSurfaceCode(TerrainModify.Surface surface)
        {
            byte surfaceType;

            switch (surface)
            {
            case TerrainModify.Surface.PavementA:
                surfaceType = 1;
                break;

            case TerrainModify.Surface.PavementB:
                surfaceType = 2;
                break;

            case TerrainModify.Surface.Ruined:
                surfaceType = 3;
                break;

            case TerrainModify.Surface.Gravel:
                surfaceType = 4;
                break;

            case TerrainModify.Surface.Field:
                surfaceType = 5;
                break;

            case TerrainModify.Surface.Clip:
                surfaceType = 6;
                break;

            default:
                surfaceType = 0;
                break;
            }
            return(surfaceType);
        }
Beispiel #3
0
        static bool ModifyMask(ProfileSection[] profile, Vector3 startPos, Vector3 endPos, Vector3 startLeftPos, Vector3 startRightPos, Vector3 endLeftPos, Vector3 endRightPos, float halfWidth, bool invert, int index, ref TerrainModify.Surface surface, ref TerrainModify.Heights heights, ref TerrainModify.Edges edges, ref float leftT, ref float rightT, ref float leftStartY, ref float rightStartY, ref float leftEndY, ref float rightEndY, ref bool __result)
        {
            if (index >= profile.Length)
            {
                __result = false;
                return(false);
            }

            TerrainManager terrainManager = Singleton <TerrainManager> .instance;
            ProfileSection section        = profile[index];

            if (invert)
            {
                section = section.Inverse();
            }

            if (section.Heights.HasValue)
            {
                heights = section.Heights.Value;
            }
            if (section.Surface.HasValue)
            {
                surface = section.Surface.Value;
            }
            if (section.EdgeFlags.HasValue)
            {
                edges = section.EdgeFlags.Value;
            }
            leftT       = section.PosRel[0] + section.PosAbs[0] / (2f * halfWidth);
            rightT      = section.PosRel[1] + section.PosAbs[1] / (2f * halfWidth);
            leftStartY  = section.HeightOffset[0];
            leftEndY    = section.HeightOffset[1];
            rightStartY = section.HeightOffset[2];
            rightEndY   = section.HeightOffset[3];
            if (section.HeightTerrain[0] != 0)
            {
                Vector3 sectionStartLeftPos = Vector3.Lerp(startLeftPos, startRightPos, leftT);
                leftStartY += section.HeightTerrain[0] * (terrainManager.SampleOriginalRawHeightSmooth(sectionStartLeftPos) - startPos.y);
            }
            if (section.HeightTerrain[1] != 0)
            {
                Vector3 sectionEndLeftPos = Vector3.Lerp(endLeftPos, endRightPos, leftT);
                leftEndY += section.HeightTerrain[0] * (terrainManager.SampleOriginalRawHeightSmooth(sectionEndLeftPos) - endPos.y);
            }
            if (section.HeightTerrain[2] != 0)
            {
                Vector3 sectionStartRightPos = Vector3.Lerp(startLeftPos, startRightPos, rightT);
                rightStartY += section.HeightTerrain[0] * (terrainManager.SampleOriginalRawHeightSmooth(sectionStartRightPos) - startPos.y);
            }
            if (section.HeightTerrain[3] != 0)
            {
                Vector3 sectionEndRightPos = Vector3.Lerp(endLeftPos, endRightPos, rightT);
                rightEndY += section.HeightTerrain[0] * (terrainManager.SampleOriginalRawHeightSmooth(sectionEndRightPos) - endPos.y);
            }

            __result = true;
            return(false);
        }
Beispiel #4
0
        static bool NodeModifyMaskPrefix(ushort nodeID, ref NetNode data, ushort segment1, ushort segment2, int index, ref TerrainModify.Surface surface, ref TerrainModify.Heights heights, ref TerrainModify.Edges edges, ref float left, ref float right, ref float leftY, ref float rightY, ref bool __result, ref RoadAI __instance)
        {
            return(true);

            if ((data.m_flags & NetNode.Flags.Bend) == 0)
            {
                //return true; //this is not a bend node, no patch needed
            }
            __result = false;
            return(false);
        }
Beispiel #5
0
        static bool SegmentModifyMaskPrefix(ushort segmentID, ref NetSegment data, int index, ref TerrainModify.Surface surface, ref TerrainModify.Heights heights, ref TerrainModify.Edges edges, ref float left, ref float right, ref float leftStartY, ref float rightStartY, ref float leftEndY, ref float rightEndY, ref bool __result, ref RoadAI __instance)
        {
            //Debug.Log(segmentID);
            bool   invert      = (data.m_flags & NetSegment.Flags.Invert) != 0;
            ushort startNodeId = data.m_startNode;
            ushort endNodeId   = data.m_endNode;
            float  halfWidth   = __instance.m_info.m_halfWidth;    //TODO: respect bridge etc.

            ProfileSection[] profile    = Profiles.PainterProfile; //TODO: different profiles by mesh type
            NetManager       netManager = Singleton <NetManager> .instance;
            Vector3          startPos   = netManager.m_nodes.m_buffer[startNodeId].m_position;
            Vector3          endPos     = netManager.m_nodes.m_buffer[endNodeId].m_position;
            Vector3          startLeftPos;
            Vector3          startRightPos;
            Vector3          endLeftPos;
            Vector3          endRightPos;

            data.CalculateCorner(segmentID, heightOffset: false, start: true, leftSide: true, out startLeftPos, out Vector3 dir1, out bool smooth1);
            data.CalculateCorner(segmentID, heightOffset: false, start: true, leftSide: false, out startRightPos, out Vector3 dir2, out bool smooth2);
            data.CalculateCorner(segmentID, heightOffset: false, start: false, leftSide: true, out endLeftPos, out Vector3 dir3, out bool smooth3);
            data.CalculateCorner(segmentID, heightOffset: false, start: false, leftSide: false, out endRightPos, out Vector3 dir4, out bool smooth4);
            return(ModifyMask(profile, startPos, endPos, startLeftPos, startRightPos, endLeftPos, endRightPos, halfWidth, invert, index, ref surface, ref heights, ref edges, ref left, ref right, ref leftStartY, ref rightStartY, ref leftEndY, ref rightEndY, ref __result));
        }
        internal static bool Prefix(ushort nodeID, ref NetNode data, ushort segment1, ushort segment2, int index, ref TerrainModify.Surface surface, ref TerrainModify.Heights heights, ref TerrainModify.Edges edges, ref float left, ref float right, ref float leftY, ref float rightY, ref bool __result, NetAI __instance)
        {
            var net = __instance.m_info.GetMetaData();

            if (net is null)
            {
                return(true);
            }

            ProfileSection[] profile = net.QuayRoadsProfile;
            if (profile is null)
            {
                return(true);
            }

            Log.Debug("modifying mask for node " + nodeID.ToString() + ", section " + index);
            NetManager netManager    = Singleton <NetManager> .instance;
            bool       isStartNode   = netManager.m_segments.m_buffer[segment1].m_startNode == nodeID;
            bool       segmentInvert = (netManager.m_segments.m_buffer[segment1].m_flags & NetSegment.Flags.Invert) != NetSegment.Flags.None;
            bool       invert        = isStartNode ^ segmentInvert;
            float      leftStartY    = leftY;
            float      rightStartY   = rightY;
            float      leftEndY      = leftY;
            float      rightEndY     = rightY;
            bool       result        = ModifyMaskCommon.ModifyMask(profile, invert, index, ref surface, ref heights, ref edges, ref left, ref right, ref leftStartY, ref rightStartY, ref leftEndY, ref rightEndY, ref __result);

            if (isStartNode)
            {
                leftY  = leftStartY;
                rightY = rightStartY;
            }
            else
            {
                leftY  = leftEndY;
                rightY = rightEndY;
            }
            return(result);
        }
 //some overrides use rightT and leftT as argument name instead of right and left
 static bool Prefix(ushort segmentID, ref NetSegment data, int index, ref TerrainModify.Surface surface, ref TerrainModify.Heights heights, ref TerrainModify.Edges edges, ref float leftT, ref float rightT, ref float leftStartY, ref float rightStartY, ref float leftEndY, ref float rightEndY, ref bool __result, CanalAI __instance)
 {
     return(SegmentModifyMaskPatch.Prefix(segmentID, ref data, index, ref surface, ref heights, ref edges, ref leftT, ref rightT, ref leftStartY, ref rightStartY, ref leftEndY, ref rightEndY, ref __result, __instance));
 }
        internal static bool Prefix(ushort segmentID, ref NetSegment data, int index, ref TerrainModify.Surface surface, ref TerrainModify.Heights heights, ref TerrainModify.Edges edges, ref float left, ref float right, ref float leftStartY, ref float rightStartY, ref float leftEndY, ref float rightEndY, ref bool __result, NetAI __instance)
        {
            var net = __instance.m_info.GetMetaData();

            if (net is null)
            {
#if DEBUGQUAYROADS
                Log.Debug("No AR data found for: \n segmentId: " + segmentID + "name: " + data.Info.name);
#endif
                return(true);
            }

            ProfileSection[] profile = net.QuayRoadsProfile;
            if (profile is null)
            {
                return(true);
            }
            Log.Debug("modifying mask for segment " + segmentID.ToString() + ", section " + index);
            bool invert = (data.m_flags & NetSegment.Flags.Invert) != 0;
            return(ModifyMaskCommon.ModifyMask(profile, invert, index, ref surface, ref heights, ref edges, ref left, ref right, ref leftStartY, ref rightStartY, ref leftEndY, ref rightEndY, ref __result));
        }
        internal static bool ModifyMask(ProfileSection[] profile, bool invert, int index, ref TerrainModify.Surface surface, ref TerrainModify.Heights heights, ref TerrainModify.Edges edges, ref float leftT, ref float rightT, ref float leftStartY, ref float rightStartY, ref float leftEndY, ref float rightEndY, ref bool __result)
        {
            if (index >= profile.Length)
            {
                __result = false;
                return(false);
            }

            ProfileSection section = profile[index];

            if (invert)
            {
                section = section.Inverse();
            }


            heights = section.Heights;
            surface = section.Surface;
            edges   = section.Edges;


            leftT       = section.LeftX;
            rightT      = section.RightX;
            leftStartY  = section.LeftStartY;
            leftEndY    = section.LeftEndY;
            rightStartY = section.RightStartY;
            rightEndY   = section.RightEndY;

            __result = true;
            return(false);
        }
 static bool Prefix(ushort nodeID, ref NetNode data, ushort segment1, ushort segment2, int index, ref TerrainModify.Surface surface, ref TerrainModify.Heights heights, ref TerrainModify.Edges edges, ref float leftT, ref float rightT, ref float leftY, ref float rightY, ref bool __result, CableCarPathAI __instance)
 {
     return(NodeModifyMaskPatch.Prefix(nodeID, ref data, segment1, segment2, index, ref surface, ref heights, ref edges, ref leftT, ref rightT, ref leftY, ref rightY, ref __result, __instance));
 }