package com.uwsoft.editor.renderer.systems;
import java.util.ArrayList;
import java.util.Comparator;
import com.badlogic.ashley.core.ComponentMapper;
import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.Family;
import com.badlogic.ashley.systems.IteratingSystem;
import com.badlogic.gdx.utils.SnapshotArray;
import com.uwsoft.editor.renderer.components.*;
import com.uwsoft.editor.renderer.data.LayerItemVO;
import com.uwsoft.editor.renderer.utils.ComponentRetriever;
public class LayerSystem extends IteratingSystem {
private Comparator<Entity> comparator = new ZComparator();
private ComponentMapper<ZIndexComponent> zIndexMapper;
private ComponentMapper<LayerMapComponent> layerMapper;
private ComponentMapper<NodeComponent> nodeMapper;
public LayerSystem() {
super(Family.all(CompositeTransformComponent.class).get());
zIndexMapper = ComponentMapper.getFor(ZIndexComponent.class);
layerMapper = ComponentMapper.getFor(LayerMapComponent.class);
nodeMapper = ComponentMapper.getFor(NodeComponent.class);
}
@Override
protected void processEntity(Entity entity, float deltaTime) {
NodeComponent nodeComponent = nodeMapper.get(entity);
LayerMapComponent layerMapComponent = layerMapper.get(entity);
updateLayers(nodeComponent.children, layerMapComponent);
sort(nodeComponent.children);
if(layerMapComponent.autoIndexing){
updateZindexes(nodeComponent.children);
}
}
private void updateLayers(SnapshotArray<Entity> children, LayerMapComponent layerMapComponent) {
for (int i = 0; i < children.size; i++) {
Entity entity = children.get(i);
ZIndexComponent zindexComponent = zIndexMapper.get(entity);
MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class);
zindexComponent.layerIndex = getlayerIndexByName(zindexComponent.layerName,layerMapComponent);
if(zindexComponent.needReOrder && layerMapComponent.autoIndexing){
if (zindexComponent.getZIndex() < 0) throw new IllegalArgumentException("ZIndex cannot be < 0.");
if (children.size == 1){
zindexComponent.setZIndex(0);
zindexComponent.needReOrder = false;
return;
}
if (!children.removeValue(entity, true)) return;
if (zindexComponent.getZIndex() >= children.size)
children.add(entity);
else
children.insert(zindexComponent.getZIndex(), entity);
}
}
}
private void updateZindexes(SnapshotArray<Entity> children) {
for (int i = 0; i < children.size; i++) {
Entity entity = children.get(i);
ZIndexComponent zindexComponent = zIndexMapper.get(entity);
zindexComponent.setZIndex(i);
zindexComponent.needReOrder = false;
}
}
private void sort(SnapshotArray<Entity> children) {
children.sort(comparator);
}
private int getlayerIndexByName(String layerName, LayerMapComponent layerMapComponent) {
if(layerMapComponent == null){
return 0;
}
return layerMapComponent.getIndexByName(layerName);
}
private class ZComparator implements Comparator<Entity> {
@Override
public int compare(Entity e1, Entity e2) {
ZIndexComponent zIndexComponent1 = zIndexMapper.get(e1);
ZIndexComponent zIndexComponent2 = zIndexMapper.get(e2);
return zIndexComponent1.layerIndex == zIndexComponent2.layerIndex ? Integer.signum(zIndexComponent1.getZIndex() - zIndexComponent2.getZIndex()) : Integer.signum(zIndexComponent1.layerIndex - zIndexComponent2.layerIndex);
//return (int)Math.signum(pm.get(e1).z - pm.get(e2).z);
}
}
}