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); }
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); }
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); }
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)); }