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)); }
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); }
public ComparableItem(IFoamShpere foam, Vector3 pos) { Foam = foam; Distance = Vector3.Distance(foam.Position, pos); }