Implement effect.
This commit is contained in:
59
Assets/Cryville/Crtr/EffectGroup.cs
Normal file
59
Assets/Cryville/Crtr/EffectGroup.cs
Normal file
@@ -0,0 +1,59 @@
|
||||
using Cryville.Common.Buffers;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Cryville.Crtr {
|
||||
public class EffectGroup {
|
||||
public EffectDefinition Definition { get; private set; }
|
||||
readonly EffectPool _pool;
|
||||
class EffectPool : ObjectPool<EffectInstance> {
|
||||
readonly List<EffectInstance> _instances
|
||||
= new List<EffectInstance>();
|
||||
readonly EffectGroup _group;
|
||||
public EffectPool(EffectGroup group) : base(256) {
|
||||
_group = group;
|
||||
}
|
||||
protected override EffectInstance Construct() {
|
||||
var result = new EffectInstance(_group.Definition);
|
||||
_instances.Add(result);
|
||||
return result;
|
||||
}
|
||||
public void DisposeAll() {
|
||||
foreach (var i in _instances) i.Dispose();
|
||||
}
|
||||
}
|
||||
readonly Dictionary<float, EffectInstance> _instances
|
||||
= new Dictionary<float, EffectInstance>();
|
||||
readonly List<EffectInstance> _endQueue
|
||||
= new List<EffectInstance>();
|
||||
public EffectGroup(EffectDefinition def) {
|
||||
Definition = def;
|
||||
_pool = new EffectPool(this);
|
||||
}
|
||||
double _time;
|
||||
public void Tick(double time) {
|
||||
_time = time;
|
||||
while (_endQueue.Count > 0) {
|
||||
var item = _endQueue[0];
|
||||
if (item.EndTime > _time) break;
|
||||
item.OnDone();
|
||||
_instances.Remove(item.Index);
|
||||
_pool.Return(item);
|
||||
_endQueue.RemoveAt(0);
|
||||
}
|
||||
}
|
||||
public void Emit(float index) {
|
||||
EffectInstance instance;
|
||||
if (!_instances.TryGetValue(index, out instance)) {
|
||||
_instances.Add(index, instance = _pool.Rent());
|
||||
}
|
||||
instance.Index = index;
|
||||
instance.OnEmit(_time);
|
||||
var i = _endQueue.BinarySearch(instance);
|
||||
if (i < 0) i = ~i;
|
||||
_endQueue.Insert(i, instance);
|
||||
}
|
||||
public void Dispose() {
|
||||
_pool.DisposeAll();
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user