package org.archstudio.bna.logics.background;
import java.util.List;
import org.archstudio.bna.IBNAWorld;
import org.archstudio.bna.IThingLogicManager;
import org.archstudio.bna.facets.IHasMutableRotatingOffset;
import org.archstudio.bna.logics.AbstractThingLogic;
import org.archstudio.bna.logics.tracking.ThingTypeTrackingLogic;
import org.archstudio.bna.utils.BNAUtils;
import org.archstudio.sysutils.Finally;
import com.google.common.collect.Lists;
public final class RotatingOffsetLogic extends AbstractThingLogic {
private static List<RotatingOffsetLogic> instances = Lists.newCopyOnWriteArrayList();
private static Thread updater;
static {
updater = new Thread(new Runnable() {
@Override
public void run() {
int ticks = 0;
while (true) {
try {
Thread.sleep(1000 / 60);
}
catch (InterruptedException e) {
}
try (Finally lock = BNAUtils.lock()) {
if (++ticks < 0) {
ticks = 0;
}
for (RotatingOffsetLogic instance : instances) {
if (instance.DEBUG) {
continue;
}
IBNAWorld world = instance.world;
IThingLogicManager logics = world.getThingLogicManager();
ThingTypeTrackingLogic typesLogic = logics.addThingLogic(ThingTypeTrackingLogic.class);
for (IHasMutableRotatingOffset t : typesLogic.getThings(IHasMutableRotatingOffset.class)) {
if (t.shouldIncrementRotatingOffset()) {
t.setRotatingOffset(ticks / t.getTicksPerIncrement());
}
}
}
}
}
}
});
updater.setName(RotatingOffsetLogic.class.getName());
updater.setDaemon(true);
updater.start();
}
public boolean DEBUG = false;
public RotatingOffsetLogic(IBNAWorld world) {
super(world);
instances.add(this);
}
@Override
public void dispose() {
BNAUtils.checkLock();
instances.remove(this);
super.dispose();
}
}