// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.component.spatial;

import com.hypixel.hytale.component.CommandBuffer;
import javax.annotation.Nullable;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.component.ArchetypeChunk;
import com.hypixel.hytale.component.Store;
import javax.annotation.Nonnull;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.component.ResourceType;
import com.hypixel.hytale.component.system.QuerySystem;
import com.hypixel.hytale.component.system.tick.TickingSystem;

public abstract class SpatialSystem<ECS_TYPE> extends TickingSystem<ECS_TYPE> implements QuerySystem<ECS_TYPE>
{
    @Nonnull
    private final ResourceType<ECS_TYPE, SpatialResource<Ref<ECS_TYPE>, ECS_TYPE>> resourceType;
    
    public SpatialSystem(@Nonnull final ResourceType<ECS_TYPE, SpatialResource<Ref<ECS_TYPE>, ECS_TYPE>> resourceType) {
        this.resourceType = resourceType;
    }
    
    @Override
    public void tick(final float dt, final int systemIndex, @Nonnull final Store<ECS_TYPE> store) {
        final SpatialResource<Ref<ECS_TYPE>, ECS_TYPE> spatialResource = store.getResource(this.resourceType);
        final SpatialData<Ref<ECS_TYPE>> spatialData = spatialResource.getSpatialData();
        spatialData.clear();
        store.forEachChunk(systemIndex, (archetypeChunk, commandBuffer) -> {
            final int size = archetypeChunk.size();
            spatialData.addCapacity(size);
            for (int index = 0; index < size; ++index) {
                final Vector3d position = this.getPosition(archetypeChunk, index);
                if (position != null) {
                    final Ref<ECS_TYPE> ref = archetypeChunk.getReferenceTo(index);
                    spatialData.append(position, ref);
                }
            }
            return;
        });
        spatialResource.getSpatialStructure().rebuild(spatialData);
    }
    
    @Nullable
    public abstract Vector3d getPosition(@Nonnull final ArchetypeChunk<ECS_TYPE> p0, final int p1);
}
