예제 #1
0
        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;
        }
예제 #2
0
        private float GetRotatedUvOffset(RiverControlPoint controlPoint, RiverControlPoint lastControlPoint, Quaternion direction)
        {
            if (lastControlPoint == null)
            {
                return(0);
            }

            return((GetOffsetPosition(lastControlPoint, direction) - GetOffsetPosition(controlPoint, direction)).magnitude);
        }
예제 #3
0
        private float GetUvOffset(RiverControlPoint controlPoint, RiverControlPoint lastControlPoint)
        {
            if (lastControlPoint == null)
            {
                return(0);
            }

            return((lastControlPoint.Position - controlPoint.Position).magnitude);
        }
예제 #4
0
        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();
        }
예제 #5
0
        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();
        }
예제 #6
0
 public ControlPointPair(RiverControlPoint first, RiverControlPoint second)
 {
     First  = first;
     Second = second;
 }
예제 #7
0
 private Vector3 GetOffsetPosition(RiverControlPoint controlPoint, Quaternion direction)
 {
     return(controlPoint.Position + controlPoint.Direction * direction * Vector3.forward * controlPoint.Width);
 }
예제 #8
0
 public void RemoveControlPoint(RiverControlPoint controlPoint)
 {
     ControlPoints.Remove(controlPoint);
     UpdateRiverMesh();
 }