diff --git a/src/main/java/com/jozufozu/flywheel/api/instance/InstancerProvider.java b/src/main/java/com/jozufozu/flywheel/api/instance/InstancerProvider.java index cc3cbcc9a..5c064355f 100644 --- a/src/main/java/com/jozufozu/flywheel/api/instance/InstancerProvider.java +++ b/src/main/java/com/jozufozu/flywheel/api/instance/InstancerProvider.java @@ -1,7 +1,10 @@ package com.jozufozu.flywheel.api.instance; +import org.jetbrains.annotations.ApiStatus; + import com.jozufozu.flywheel.api.model.Model; +@ApiStatus.NonExtendable public interface InstancerProvider { /** * Get an instancer for the given instance type rendering the given model. diff --git a/src/main/java/com/jozufozu/flywheel/api/visualization/VisualizationContext.java b/src/main/java/com/jozufozu/flywheel/api/visualization/VisualizationContext.java index b03b7609a..b813c25e7 100644 --- a/src/main/java/com/jozufozu/flywheel/api/visualization/VisualizationContext.java +++ b/src/main/java/com/jozufozu/flywheel/api/visualization/VisualizationContext.java @@ -2,6 +2,7 @@ package com.jozufozu.flywheel.api.visualization; import org.jetbrains.annotations.ApiStatus; +import com.jozufozu.flywheel.api.context.Context; import com.jozufozu.flywheel.api.instance.InstancerProvider; import net.minecraft.core.Vec3i; @@ -22,4 +23,14 @@ public interface VisualizationContext { * @return The origin of the renderer as a world position. */ Vec3i renderOrigin(); + + /** + * Create a new {@link VisualizationContext} with the given {@link Context} and render origin. + * + * @param context The new context. + * @param renderOrigin The new render origin. + * @return A new {@link VisualizationContext} for use with child visuals. + */ + @ApiStatus.Experimental + VisualizationContext withContext(Context context, Vec3i renderOrigin); } diff --git a/src/main/java/com/jozufozu/flywheel/impl/visualization/InstancerProviderImpl.java b/src/main/java/com/jozufozu/flywheel/impl/visualization/InstancerProviderImpl.java index c354427a1..ad09ff409 100644 --- a/src/main/java/com/jozufozu/flywheel/impl/visualization/InstancerProviderImpl.java +++ b/src/main/java/com/jozufozu/flywheel/impl/visualization/InstancerProviderImpl.java @@ -3,6 +3,7 @@ package com.jozufozu.flywheel.impl.visualization; import java.util.function.Supplier; import com.jozufozu.flywheel.api.backend.Engine; +import com.jozufozu.flywheel.api.context.Context; import com.jozufozu.flywheel.api.event.RenderStage; import com.jozufozu.flywheel.api.instance.Instance; import com.jozufozu.flywheel.api.instance.InstanceType; @@ -10,13 +11,13 @@ import com.jozufozu.flywheel.api.instance.Instancer; import com.jozufozu.flywheel.api.instance.InstancerProvider; import com.jozufozu.flywheel.api.model.Model; import com.jozufozu.flywheel.api.visualization.VisualizationContext; -import com.jozufozu.flywheel.lib.context.Contexts; public record InstancerProviderImpl(Engine engine, + Context context, RenderStage renderStage) implements InstancerProvider, Supplier { @Override public Instancer instancer(InstanceType type, Model model) { - return engine.instancer(type, Contexts.DEFAULT, model, renderStage); + return engine.instancer(type, context, model, renderStage); } @Override diff --git a/src/main/java/com/jozufozu/flywheel/impl/visualization/VisualizationContextImpl.java b/src/main/java/com/jozufozu/flywheel/impl/visualization/VisualizationContextImpl.java index eaf888a82..26809f528 100644 --- a/src/main/java/com/jozufozu/flywheel/impl/visualization/VisualizationContextImpl.java +++ b/src/main/java/com/jozufozu/flywheel/impl/visualization/VisualizationContextImpl.java @@ -1,5 +1,6 @@ package com.jozufozu.flywheel.impl.visualization; +import com.jozufozu.flywheel.api.context.Context; import com.jozufozu.flywheel.api.instance.InstancerProvider; import com.jozufozu.flywheel.api.visualization.VisualizationContext; @@ -12,6 +13,10 @@ import net.minecraft.core.Vec3i; * @param renderOrigin The origin of the renderer as a world position. * All models render as if this position is (0, 0, 0). */ -public record VisualizationContextImpl(InstancerProvider instancerProvider, - Vec3i renderOrigin) implements VisualizationContext { +public record VisualizationContextImpl(InstancerProviderImpl instancerProvider, Vec3i renderOrigin) implements VisualizationContext { + @Override + public VisualizationContext withContext(Context context, Vec3i renderOrigin) { + var provider = new InstancerProviderImpl(instancerProvider.engine(), context, instancerProvider.renderStage()); + return new VisualizationContextImpl(provider, renderOrigin); + } } diff --git a/src/main/java/com/jozufozu/flywheel/impl/visualization/VisualizationManagerImpl.java b/src/main/java/com/jozufozu/flywheel/impl/visualization/VisualizationManagerImpl.java index e06ec0f8f..14949c236 100644 --- a/src/main/java/com/jozufozu/flywheel/impl/visualization/VisualizationManagerImpl.java +++ b/src/main/java/com/jozufozu/flywheel/impl/visualization/VisualizationManagerImpl.java @@ -36,6 +36,7 @@ import com.jozufozu.flywheel.impl.visualization.manager.VisualManagerImpl; import com.jozufozu.flywheel.impl.visualization.ratelimit.BandedPrimeLimiter; import com.jozufozu.flywheel.impl.visualization.ratelimit.DistanceUpdateLimiterImpl; import com.jozufozu.flywheel.impl.visualization.ratelimit.NonLimiter; +import com.jozufozu.flywheel.lib.context.Contexts; import com.jozufozu.flywheel.lib.task.Flag; import com.jozufozu.flywheel.lib.task.IfElsePlan; import com.jozufozu.flywheel.lib.task.MapContextPlan; @@ -84,9 +85,9 @@ public class VisualizationManagerImpl implements VisualizationManager { .createEngine(level); taskExecutor = FlwTaskExecutor.get(); - var blockEntitiesStorage = new BlockEntityStorage(new InstancerProviderImpl(engine, RenderStage.AFTER_BLOCK_ENTITIES)); - var entitiesStorage = new EntityStorage(new InstancerProviderImpl(engine, RenderStage.AFTER_ENTITIES)); - var effectsStorage = new EffectStorage(new InstancerProviderImpl(engine, RenderStage.AFTER_PARTICLES)); + var blockEntitiesStorage = new BlockEntityStorage(new InstancerProviderImpl(engine, Contexts.DEFAULT, RenderStage.AFTER_BLOCK_ENTITIES)); + var entitiesStorage = new EntityStorage(new InstancerProviderImpl(engine, Contexts.DEFAULT, RenderStage.AFTER_ENTITIES)); + var effectsStorage = new EffectStorage(new InstancerProviderImpl(engine, Contexts.DEFAULT, RenderStage.AFTER_PARTICLES)); blockEntities = new VisualManagerImpl<>(blockEntitiesStorage); entities = new VisualManagerImpl<>(entitiesStorage);