A ticking time bomb

- Add context object back to SimpleTickableVisual#tick
- Document base *Visual plan methods
This commit is contained in:
Jozufozu 2024-05-18 17:34:45 -07:00
parent 7ef9ce3907
commit e19cc337fe
4 changed files with 27 additions and 2 deletions

View file

@ -3,6 +3,8 @@ package com.jozufozu.flywheel.api.visual;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.joml.FrustumIntersection; import org.joml.FrustumIntersection;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.instance.Instancer;
import com.jozufozu.flywheel.api.task.Plan; import com.jozufozu.flywheel.api.task.Plan;
import net.minecraft.client.Camera; import net.minecraft.client.Camera;
@ -14,6 +16,16 @@ import net.minecraft.client.Camera;
* parameterization. * parameterization.
*/ */
public interface DynamicVisual extends Visual { public interface DynamicVisual extends Visual {
/**
* Invoked every frame.
* <br>
* The implementation is free to parallelize the invocation of this plan.
* You must ensure proper synchronization if you need to mutate anything outside this visual.
* <br>
* This plan and the one returned by {@link TickableVisual#planTick} will never be invoked simultaneously.
* <br>
* {@link Instancer}/{@link Instance} creation/acquisition is safe here.
*/
Plan<Context> planFrame(); Plan<Context> planFrame();
/** /**

View file

@ -2,6 +2,8 @@ package com.jozufozu.flywheel.api.visual;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.instance.Instancer;
import com.jozufozu.flywheel.api.task.Plan; import com.jozufozu.flywheel.api.task.Plan;
/** /**
@ -9,6 +11,16 @@ import com.jozufozu.flywheel.api.task.Plan;
* the end of every tick. * the end of every tick.
*/ */
public interface TickableVisual extends Visual { public interface TickableVisual extends Visual {
/**
* Invoked every tick.
* <br>
* The implementation is free to parallelize the invocation of this plan.
* You must ensure proper synchronization if you need to mutate anything outside this visual.
* <br>
* This plan and the one returned by {@link DynamicVisual#planFrame} will never be invoked simultaneously.
* <br>
* {@link Instancer}/{@link Instance} creation/acquisition is safe here.
*/
Plan<Context> planTick(); Plan<Context> planTick();
/** /**

View file

@ -18,7 +18,7 @@ public interface SimpleTickableVisual extends TickableVisual {
* <br> * <br>
* {@link Instancer}/{@link Instance} creation/acquisition is safe here. * {@link Instancer}/{@link Instance} creation/acquisition is safe here.
*/ */
void tick(); void tick(Context context);
@Override @Override
default Plan<Context> planTick() { default Plan<Context> planTick() {

View file

@ -3,6 +3,7 @@ package com.jozufozu.flywheel.vanilla;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import com.jozufozu.flywheel.api.visual.DynamicVisual; import com.jozufozu.flywheel.api.visual.DynamicVisual;
import com.jozufozu.flywheel.api.visual.TickableVisual;
import com.jozufozu.flywheel.api.visualization.VisualizationContext; import com.jozufozu.flywheel.api.visualization.VisualizationContext;
import com.jozufozu.flywheel.lib.instance.InstanceTypes; import com.jozufozu.flywheel.lib.instance.InstanceTypes;
import com.jozufozu.flywheel.lib.instance.TransformedInstance; import com.jozufozu.flywheel.lib.instance.TransformedInstance;
@ -99,7 +100,7 @@ public class MinecartVisual<T extends AbstractMinecart> extends SimpleEntityVisu
} }
@Override @Override
public void tick() { public void tick(TickableVisual.Context context) {
BlockState displayBlockState = entity.getDisplayBlockState(); BlockState displayBlockState = entity.getDisplayBlockState();
if (displayBlockState != blockState) { if (displayBlockState != blockState) {