Example #1
0
        public IDisposable Subscribe(IFoamShpere observer)
        {
            if (foamObservers.Count >= DefaultSphereMaxCount)
            {
                throw new InvalidOperationException(string.Format("Unable to subscribe because it exceeds the defined size ({0})", DefaultSphereMaxCount));
            }

            foamObservers.Add(observer);
            return(new ListUnsubscriber <IFoamShpere>(foamObservers, observer));
        }
Example #2
0
        public void SetValueToShader(OceanCameraTask oceanCamera, FoamCameraData data, int count, int countQuarter)
        {
            int visibleCount = data.CullingGroup.QueryIndices(true, cullingGroupResult, 0);

            if (visibleCount == 0)
            {
                ClearArray(data0);
                ClearArray(data1);
            }
            else if (visibleCount <= count)
            {
                int index;
                for (index = 0; index < visibleCount; index++)
                {
                    int         observerIndex = cullingGroupResult[index];
                    IFoamShpere observer      = effectiveShperes[observerIndex];
                    data0[index] = VectorHelper.Create(observer.Position, observer.Radius);
                }
                for (; index < count; index++)
                {
                    data0[index] = default(Vector4);
                }

                for (index = 0; index < countQuarter; index++)
                {
                    Vector4 value = Vector4.zero;
                    for (int j = 0, newIndex = index * 4; newIndex < visibleCount && j < 4; j++, newIndex++)
                    {
                        int         observerIndex = cullingGroupResult[newIndex];
                        IFoamShpere observer      = effectiveShperes[observerIndex];
                        value[j] = observer.Intensity;
                    }
                    data1[index] = value;
                }
            }
            else
            {
                int index;
                for (index = 0; index < visibleCount; index++)
                {
                    int         observerIndex = cullingGroupResult[index];
                    IFoamShpere observer      = effectiveShperes[observerIndex];
                    sortedArray.Add(new ComparableItem(observer, oceanCamera.transform.position));
                }

                for (index = 0; index < Mathf.Min(visibleCount, count); index++)
                {
                    IFoamShpere observer = sortedArray[index].Foam;
                    data0[index] = VectorHelper.Create(observer.Position, observer.Radius);
                }
                for (; index < count; index++)
                {
                    data0[index] = default(Vector4);
                }

                for (index = 0; index < countQuarter; index++)
                {
                    Vector4 value = Vector4.zero;
                    for (int j = 0, newIndex = index * 4; newIndex < visibleCount && j < 4; j++, newIndex++)
                    {
                        IFoamShpere observer = sortedArray[newIndex].Foam;
                        value[j] = observer.Intensity;
                    }
                    data1[index] = value;
                }

                sortedArray.Clear();
            }

            Shader.SetGlobalVectorArray(FoamOptions.ShpereData0Name, data0);
            Shader.SetGlobalVectorArray(FoamOptions.ShpereData1Name, data1);
        }
Example #3
0
 public ComparableItem(IFoamShpere foam, Vector3 pos)
 {
     Foam     = foam;
     Distance = Vector3.Distance(foam.Position, pos);
 }