public void RenderMountain() { List <EPMPoint> mountainPoints = m_terrain.ExtractPoints_ByTypes(null, EPMPoint.GenerateTypesInt(false, EPMPoint.PointType.Mountain)); List <EPMTriangle> mountainTriangles = m_terrain.ExtractTriangles_ByVertex(mountainPoints); for (int i = 0; i < mountainTriangles.Count; i++) { mountainTriangles[i].SetType(EPMPoint.PointType.Mountain); } for (int k = 0; k < g_customData.mountainLists.Count; k++) { List <Vector2d> mountain = g_customData.mountainLists[k]; for (int i = 0; i < mountain.Count; i++) { EPMHeightSampler.DistanceToPoint(m_terrain.RandomDouble(m_defaultMountainHeight / 2, m_defaultMountainHeight * 1.5f), mountain[i], m_mountainRadius * 1.5f, mountainPoints, EPMHeightSampler.CurveMode.ReverseLinear); } } for (int i = 0; i < mountainPoints.Count; i++) { mountainPoints[i].ApplyHeight(); } //find summit, the summit is the point that all its neighbors height is lower than it. List <EPMPoint> summitPoints = new List <EPMPoint>(); for (int i = 0; i < mountainPoints.Count; i++) { EPMPoint p = mountainPoints[i]; if (p.g_neighbors.Count <= 2) { continue; } bool summit = true; for (int j = 0; j < p.g_neighbors.Count; j++) { if (p.posY <= p.g_neighbors[j].posY) { summit = false; break; } } if (summit) { summitPoints.Add(p); } } for (int i = 0; i < summitPoints.Count; i++) { List <EPMTriangle> l = m_terrain.ExtractTriangles_PointsInCircle(summitPoints[i].pos2d, m_mountainRadius * m_terrain.RandomDouble(0.2f, 0.4f), 1, mountainTriangles); for (int j = 0; j < l.Count; j++) { l[j].SetType(EPMPoint.PointType.MountainSummit); } } }
public static void SampleHeightByPoint(EPMBaseTerrain terrain, int pointNum, Vector2d radiusRange, EPMHeightSampler.CurveMode curve, EPMHeightSampler.CombineMode combine, double limitation) { List <EPMPoint> pointList = terrain.ExtractPoints_ByTypes(null, EPMPoint.GenerateTypesInt(true, EPMPoint.PointType.Ocean)); EPMPoint.HighestHeight = EPMPoint.LowestHeight = 0; for (int i = 0; i < pointNum; i++) { double radius = (double)terrain.RandomDouble(radiusRange.x, radiusRange.y); double height = (double)terrain.RandomDouble(-1f, 1f); Vector2d point = new Vector2d(terrain.RandomDouble(0, terrain.getXLength()), terrain.RandomDouble(0f, terrain.getZlength())); EPMHeightSampler.DistanceToPoint(height, point, radius, pointList, curve, combine, limitation); } }
public void SmoothRiver() { List <EPMPoint> plist = m_terrain.ExtractPoints_ByTypes(null, EPMPoint.GenerateTypesInt(false, EPMPoint.PointType.River)); for (int i = 0; i < plist.Count; i++) { plist[i].posY = -3; } for (int i = 0; i < g_customData.riverLists.Count; i++) { List <Vector2d> river = g_customData.riverLists[i]; for (int j = 1; j < river.Count; j++) { EPMHeightSampler.DirectionalDistance(0.5f, river[j] - river[j - 1], 100, plist, -1f); } } for (int i = 0; i < plist.Count; i++) { plist[i].ApplyHeight(); } }
public void RenderRiver() { List <EPMPoint> riverPoints = m_terrain.ExtractPoints_ByTypes(null, EPMPoint.GenerateTypesInt(false, EPMPoint.PointType.RiverSide, EPMPoint.PointType.River)); for (int k = 0; k < g_customData.riverLists.Count; k++) { List <Vector2d> river = g_customData.riverLists[k]; for (int i = 1; i < river.Count; i++) { EPMHeightSampler.DistanceToLine(5, river[i - 1], river[i], m_riverHalfWidth, riverPoints, EPMHeightSampler.CurveMode.CosineQuarter, EPMHeightSampler.CombineMode.SubtractWithLimitation, -3); if (i != river.Count - 1) { EPMHeightSampler.DistanceToPoint(5, river[i], m_riverHalfWidth, riverPoints, EPMHeightSampler.CurveMode.CosineQuarter, EPMHeightSampler.CombineMode.SubtractWithLimitation, -3); } } } for (int i = 0; i < riverPoints.Count; i++) { riverPoints[i].ApplyHeight(); } }
public void RenderHill() { List <EPMPoint> hillPoints = m_terrain.ExtractPoints_ByTypes(null, EPMPoint.GenerateTypesInt(false, EPMPoint.PointType.Hill)); for (int k = 0; k < g_customData.hillLists.Count; k++) { List <Vector2d> hill = g_customData.hillLists[k]; for (int i = 1; i < hill.Count; i++) { EPMHeightSampler.DistanceToLine(m_defaultHillHeight, hill[i - 1], hill[i], m_hillHalfWidth * 1.2f, hillPoints, EPMHeightSampler.CurveMode.CosineHalf); } } for (int i = 0; i < hillPoints.Count; i++) { hillPoints[i].ApplyHeight(); } for (int k = 0; k < g_customData.hillLists.Count; k++) { List <Vector2d> hill = g_customData.hillLists[k]; for (int i = 1; i < hill.Count; i++) { EPMHeightSampler.DirectionalDistance(m_terrain.RandomDouble(2f, 5f), hill[i] - hill[i - 1], 50f, hillPoints, m_defaultHillHeight * 1.5f, 2); } } List <EPMTriangle> hillTriangles = m_terrain.ExtractTriangles_ByVertex(hillPoints); for (int i = 0; i < hillTriangles.Count; i++) { if (hillTriangles[i].HasShapeType(EPMPoint.GetGroundEnums())) { hillTriangles[i].SetType(EPMPoint.PointType.Hill); } } }