예제 #1
0
        public IDisposable Subscribe(IFoamArea observer)
        {
            if (observer == null)
            {
                throw new ArgumentNullException(nameof(observer));
            }

            observers.Add(observer);
            return(new ListUnsubscriber <IFoamArea>(observers, observer));
        }
예제 #2
0
        public void SetValueToShader(OceanCameraTask oceanCamera, PreparedContent preparedContent)
        {
            if ((preparedContent & PreparedContent.FoamArea1) != 0)
            {
                if (observers.Count == 0)
                {
                    ResetShader();
                    return;
                }
                else if (observers.Count == 1)
                {
                    SetValueToShader(observers[0]);
                }
                else
                {
                    Vector3 cameraPos = oceanCamera.transform.position;

                    IFoamArea min    = observers[0];
                    float     minDis = Vector3.Distance(cameraPos, min.Position);

                    for (int i = 1; i < observers.Count; i++)
                    {
                        var current    = observers[i];
                        var currentDis = Vector3.Distance(cameraPos, current.Position);

                        if (currentDis < minDis)
                        {
                            min    = current;
                            minDis = currentDis;
                        }
                    }

                    SetValueToShader(min);
                }
            }
        }
예제 #3
0
 public void SetValueToShader(IFoamArea area)
 {
     Shader.SetGlobalTexture(FoamOptions.AreaTexture0Name, area.Texture);
     Shader.SetGlobalVector(FoamOptions.AreaRect0Name, area.Rect);
     Shader.SetGlobalVector(FoamOptions.AreaPosition0Name, VectorHelper.Create(area.Position, area.Intensity));
 }