private void AddControlPointToMesh(RiverControlPoint controlPoint, RiverControlPoint lastControlPoint, MeshData meshData) { var leftRotation = Quaternion.LookRotation(Vector3.left); var rightRotation = Quaternion.LookRotation(Vector3.right); meshData.CurrentUvOffset += GetUvOffset(controlPoint, lastControlPoint); meshData.CurrentLeftUvOffset += GetRotatedUvOffset(controlPoint, lastControlPoint, leftRotation); meshData.CurrentRightUvOffset += GetRotatedUvOffset(controlPoint, lastControlPoint, rightRotation); meshData.Vertices.Add(GetVectorPosition(controlPoint.Position, controlPoint.Direction, Vector3.left, controlPoint.Width)); meshData.Vertices.Add(GetVectorPosition(controlPoint.Position, controlPoint.Direction, Vector3.right, controlPoint.Width)); // All river segments points up regardless of actual orientation meshData.Normals.Add(Vector3.up); meshData.Normals.Add(Vector3.up); // Make the X axis a continous point along the edge and the y axis continous along the middle. Makes it looks smoother meshData.Uvs.Add(new Vector2(meshData.CurrentLeftUvOffset, -controlPoint.Width) * UvScale); meshData.Uvs.Add(new Vector2(meshData.CurrentRightUvOffset, controlPoint.Width) * UvScale); if (lastControlPoint != null) { meshData.Triangles.AddRange(new int[] { meshData.CurrentIndex - 2, meshData.CurrentIndex, meshData.CurrentIndex - 1, meshData.CurrentIndex, meshData.CurrentIndex + 1, meshData.CurrentIndex - 1 }); } meshData.CurrentIndex += 2; }
private float GetRotatedUvOffset(RiverControlPoint controlPoint, RiverControlPoint lastControlPoint, Quaternion direction) { if (lastControlPoint == null) { return(0); } return((GetOffsetPosition(lastControlPoint, direction) - GetOffsetPosition(controlPoint, direction)).magnitude); }
private float GetUvOffset(RiverControlPoint controlPoint, RiverControlPoint lastControlPoint) { if (lastControlPoint == null) { return(0); } return((lastControlPoint.Position - controlPoint.Position).magnitude); }
public void InsertControlPoint(ControlPointPair controlPoints, Vector3 position) { var targetPosition = position - transform.position; var direction = Quaternion.Lerp(controlPoints.First.Direction, controlPoints.Second.Direction, 0.5f); var width = Mathf.Lerp(controlPoints.First.Width, controlPoints.Second.Width, 0.5f); var controlPoint = new RiverControlPoint { Position = targetPosition, Direction = direction, Width = width }; var insertIndex = Mathf.Max(ControlPoints.IndexOf(controlPoints.First), ControlPoints.IndexOf(controlPoints.Second)); ControlPoints.Insert(insertIndex, controlPoint); UpdateRiverMesh(); }
public void AddControlPoint(Vector3 position) { var lastControlPoint = ControlPoints.Last(); var directionOffset = position - (transform.position + lastControlPoint.Position); directionOffset.y = 0; var direction = Quaternion.LookRotation(directionOffset); var targetPosition = position - transform.position; targetPosition.y = lastControlPoint.Position.y; var controlPoint = new RiverControlPoint { Position = targetPosition, Direction = direction, Width = lastControlPoint.Width }; ControlPoints.Add(controlPoint); UpdateRiverMesh(); }
public ControlPointPair(RiverControlPoint first, RiverControlPoint second) { First = first; Second = second; }
private Vector3 GetOffsetPosition(RiverControlPoint controlPoint, Quaternion direction) { return(controlPoint.Position + controlPoint.Direction * direction * Vector3.forward * controlPoint.Width); }
public void RemoveControlPoint(RiverControlPoint controlPoint) { ControlPoints.Remove(controlPoint); UpdateRiverMesh(); }