예제 #1
0
        void Update()
        {
            Vector3 origin;
            //For each wake pair
            var wCount = _wakes.Count;

            for (int w = 0; w < wCount; w++)
            {
                Wake _wake = _wakes[w];
                int  s     = 0;
                for (int x = -1; x <= 1; x += 2)
                {
                    origin    = _wake.origin;
                    origin.x *= x;
                    origin    = transform.TransformPoint(origin);
                    origin.y  = 0;//flatten origin in world
                    var pointCount = _wake.lines[s].points.Count;
                    //////////////////////////// create points, if needed ///////////////////////////////
                    if (pointCount == 0)
                    {
                        _wake.lines[s].points.Insert(0, CreateWakePoint(origin, x));
                        pointCount++;
                    }
                    else if (Vector3.Distance(_wake.lines[s].points[0].pos, origin) > _genDistance)
                    {
                        _wake.lines[s].points.Insert(0, CreateWakePoint(origin, x));
                        pointCount++;
                    }
                    ///////////////////////////// kill points, if needed ////////////////////////////////
                    for (int i = _wake.lines[s].points.Count - 1; i >= 0; i--)
                    {
                        if (_wake.lines[s].points[i].age > _maxAge)
                        {
                            _wake.lines[s].points.RemoveAt(i);
                            pointCount--;
                        }
                        else
                        {
                            _wake.lines[s].points[i].age += Time.deltaTime;                                    // increment age
                            _wake.lines[s].points[i].pos += _wake.lines[s].points[i].dir * 3 * Time.deltaTime; // move points by dir
                        }
                    }
                    ///////////////////// Create the line renderer points ///////////////////////////////

                    _wake.lines[s]._lineRenderer.positionCount = pointCount + 1;
                    _wake.lines[s]._lineRenderer.SetPosition(0, origin);
                    for (var i = 0; i < pointCount; i++)
                    {
                        _wake.lines[s]._lineRenderer.SetPosition(i + 1, _wake.lines[s].points[i].pos);
                    }
                    s++;
                }
            }
        }
예제 #2
0
    private void BreakTrail()
    {
        List <Wake> newWakes = new List <Wake>();

        for (int i = 0; i < Trails.Count; i++)
        {
            Wake newWake = Instantiate(Trails[i].gameObject).GetComponent <Wake>();
            newWake.transform.position = Trails[i].transform.position;
            newWake.Offset             = Trails[i].Offset;
            newWakes.Add(newWake);
        }
        Trails = newWakes;
    }
예제 #3
0
        private IEnumerator GenerateWake(Wake wake)
        {
            for (var i = 0; i < 2; i++)
            {
                var wl = new WakeLine {
                    points = new List <WakePoint>()
                };
                var wakeLoading = wakePrefab.InstantiateAsync(Vector3.zero, Quaternion.Euler(90f, 0, 0));

                yield return(wakeLoading);

                _lrs.Add(wakeLoading.Result);
                wakeLoading.Result.TryGetComponent(out wl.lineRenderer);
                wakeLoading.Result.hideFlags = HideFlags.HideAndDontSave;

                wake.lines.Add(wl);
            }
        }
예제 #4
0
        private void DoWake(int side, Wake wake, WakeLine wakeLine)
        {
            var origin = wake.origin;

            origin.x *= side;
            origin    = transform.TransformPoint(origin);
            origin.y  = 0;//flatten origin in world
            var pointCount = wakeLine.points.Count;

            //////////////////////////// create points, if needed ///////////////////////////////
            if (pointCount == 0)
            {
                wakeLine.points.Insert(0, CreateWakePoint(origin, side));
                pointCount++;
            }
            else if (Vector3.Distance(wakeLine.points[0].pos, origin) > genDistance)
            {
                wakeLine.points.Insert(0, CreateWakePoint(origin, side));
                pointCount++;
            }
            ///////////////////////////// kill points, if needed ////////////////////////////////
            for (int i = wakeLine.points.Count - 1; i >= 0; i--)
            {
                if (wakeLine.points[i].age > maxAge)
                {
                    wakeLine.points.RemoveAt(i);
                    pointCount--;
                }
                else
                {
                    wakeLine.points[i].age += Time.deltaTime;                              // increment age
                    wakeLine.points[i].pos += Time.deltaTime * 3 * wakeLine.points[i].dir; // move points by dir
                }
            }
            ///////////////////// Create the line renderer points ///////////////////////////////

            wakeLine.lineRenderer.positionCount = pointCount + 1;
            wakeLine.lineRenderer.SetPosition(0, origin);
            for (var i = 0; i < pointCount; i++)
            {
                wakeLine.lineRenderer.SetPosition(i + 1, wakeLine.points[i].pos);
            }
        }
예제 #5
0
        void Update()
        {
            Vector3 origin;
            //For each wake pair
            var wCount = _wakes.Count;

            for (int w = 0; w < wCount; w++)
            {
                Wake _wake = _wakes[w];
                int  s     = 0;
                for (int x = -1; x <= 1; x += 2)
                {
                    origin    = _wake.origin;
                    origin.x *= x;
                    origin    = transform.TransformPoint(origin);
                    origin.y  = 0;//flatten origin in world
                    WakeLine line       = _wake.lines[s];
                    var      pointCount = line.points.Count;
                    //////////////////////////// create points, if needed ///////////////////////////////
                    if (pointCount == 0)
                    {
                        line.points.Insert(0, CreateWakePoint(origin, x));
                        pointCount++;
                    }
                    else if (Vector3.Distance(line.points[0].pos, origin) > _genDistance)
                    {
                        line.points.Insert(0, CreateWakePoint(origin, x));
                        pointCount++;
                    }
                    ///////////////////////////// kill points, if needed ////////////////////////////////
                    for (int i = line.points.Count - 1; i >= 0; i--)
                    {
                        if (line.points[i].age > _maxAge)
                        {
                            line.points.RemoveAt(i);
                            pointCount--;
                        }
                        else
                        {
                            line.points[i].age += Time.deltaTime;                               // increment age
                            line.points[i].pos += line.points[i].dir * _speed * Time.deltaTime; // move points by dir
                        }
                    }
                    ///////////////////// Create the line renderer points ///////////////////////////////

                    line._lineRenderer.positionCount = pointCount + 1;

                    line.poses[0] = origin;
                    for (var i = 0; i < pointCount; i++)
                    {
                        if (i + 1 == line.poses.Length)
                        {
                            break;
                        }

                        line.poses[i + 1] = line.points[i].pos;
                    }

                    GerstnerWavesJobs.UpdateSamplePoints(line.poses, line.guid);
                    GerstnerWavesJobs.GetData(line.guid, ref line.heights);

                    origin.y = NeoOcean.oceanheight + line.heights[0].y;
                    for (var i = 0; i < pointCount; i++)
                    {
                        if (i + 1 == line.poses.Length)
                        {
                            break;
                        }

                        line.points[i].pos.y = NeoOcean.oceanheight + line.heights[i + 1].y;
                    }

                    line._lineRenderer.SetPosition(0, origin);
                    for (var i = 0; i < pointCount; i++)
                    {
                        line._lineRenderer.SetPosition(i + 1, line.points[i].pos);
                    }
                    s++;
                }
            }
        }