mirror of
https://github.com/Jozufozu/Flywheel.git
synced 2025-02-05 09:44:58 +01:00
Material refactor pt 4
- Begin reworking layer rendering
This commit is contained in:
parent
671ac33dda
commit
7cf653eda5
9 changed files with 126 additions and 84 deletions
|
@ -14,6 +14,7 @@ import com.jozufozu.flywheel.util.WorldAttached;
|
||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.multiplayer.ClientLevel;
|
import net.minecraft.client.multiplayer.ClientLevel;
|
||||||
|
import net.minecraft.client.renderer.Sheets;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.level.LevelAccessor;
|
import net.minecraft.world.level.LevelAccessor;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
|
@ -101,7 +102,7 @@ public class InstancedRenderDispatcher {
|
||||||
ClientLevel world = event.getWorld();
|
ClientLevel world = event.getWorld();
|
||||||
if (!Backend.canUseInstancing(world)) return;
|
if (!Backend.canUseInstancing(world)) return;
|
||||||
|
|
||||||
instanceWorlds.get(world).renderLayer(event.context);
|
instanceWorlds.get(world).renderLayer(event.context);//.withRenderType(Sheets.chestSheet()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
|
|
|
@ -84,4 +84,13 @@ public class InstancedMaterial<D extends InstanceData> implements Material<D> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean anythingToRender(RenderType type) {
|
||||||
|
for (GPUInstancer<?> instancer : models.values()) {
|
||||||
|
if (instancer.shouldRenderIn(type)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,6 +87,8 @@ public class InstancingEngine<P extends WorldProgram> implements Engine {
|
||||||
|
|
||||||
for (Map.Entry<Instanced<? extends InstanceData>, InstancedMaterial<?>> entry : materials.entrySet()) {
|
for (Map.Entry<Instanced<? extends InstanceData>, InstancedMaterial<?>> entry : materials.entrySet()) {
|
||||||
InstancedMaterial<?> material = entry.getValue();
|
InstancedMaterial<?> material = entry.getValue();
|
||||||
|
|
||||||
|
//if (material.anythingToRender(type)) {
|
||||||
Instanced<? extends InstanceData> instanceType = entry.getKey();
|
Instanced<? extends InstanceData> instanceType = entry.getKey();
|
||||||
|
|
||||||
setup(type, camX, camY, camZ, viewProjection, instanceType.getProgramSpec());
|
setup(type, camX, camY, camZ, viewProjection, instanceType.getProgramSpec());
|
||||||
|
@ -95,6 +97,7 @@ public class InstancingEngine<P extends WorldProgram> implements Engine {
|
||||||
vertexCount += material.getVertexCount();
|
vertexCount += material.getVertexCount();
|
||||||
|
|
||||||
material.renderIn(type);
|
material.renderIn(type);
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
type.clearRenderState();
|
type.clearRenderState();
|
||||||
|
|
|
@ -13,6 +13,12 @@ import net.minecraft.client.renderer.RenderType;
|
||||||
public record RenderContext(ClientLevel level, RenderType type, PoseStack stack, Matrix4f viewProjection, RenderBuffers buffers,
|
public record RenderContext(ClientLevel level, RenderType type, PoseStack stack, Matrix4f viewProjection, RenderBuffers buffers,
|
||||||
double camX, double camY, double camZ) implements TransformStack {
|
double camX, double camY, double camZ) implements TransformStack {
|
||||||
|
|
||||||
|
public static RenderContext CURRENT;
|
||||||
|
|
||||||
|
public RenderContext withRenderType(RenderType renderType) {
|
||||||
|
return new RenderContext(level, renderType, stack, viewProjection, buffers, camX, camY, camZ);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TransformStack multiply(Quaternion quaternion) {
|
public TransformStack multiply(Quaternion quaternion) {
|
||||||
return TransformStack.cast(stack).multiply(quaternion);
|
return TransformStack.cast(stack).multiply(quaternion);
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package com.jozufozu.flywheel.event;
|
package com.jozufozu.flywheel.event;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.core.RenderContext;
|
import com.jozufozu.flywheel.core.RenderContext;
|
||||||
import com.mojang.blaze3d.systems.RenderSystem;
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
|
@ -13,13 +15,22 @@ import net.minecraftforge.eventbus.api.Event;
|
||||||
public class RenderLayerEvent extends Event {
|
public class RenderLayerEvent extends Event {
|
||||||
public final RenderContext context;
|
public final RenderContext context;
|
||||||
|
|
||||||
|
public RenderLayerEvent(RenderContext context) {
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
public RenderLayerEvent(ClientLevel world, RenderType type, PoseStack stack, RenderBuffers buffers, double camX, double camY, double camZ) {
|
public RenderLayerEvent(ClientLevel world, RenderType type, PoseStack stack, RenderBuffers buffers, double camX, double camY, double camZ) {
|
||||||
var viewProjection = stack.last()
|
|
||||||
|
context = new RenderContext(world, type, stack, createViewProjection(stack), buffers, camX, camY, camZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public static Matrix4f createViewProjection(PoseStack view) {
|
||||||
|
var viewProjection = view.last()
|
||||||
.pose()
|
.pose()
|
||||||
.copy();
|
.copy();
|
||||||
viewProjection.multiplyBackward(RenderSystem.getProjectionMatrix());
|
viewProjection.multiplyBackward(RenderSystem.getProjectionMatrix());
|
||||||
|
return viewProjection;
|
||||||
context = new RenderContext(world, type, stack, viewProjection, buffers, camX, camY, camZ);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -12,6 +12,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
import com.jozufozu.flywheel.backend.Backend;
|
import com.jozufozu.flywheel.backend.Backend;
|
||||||
import com.jozufozu.flywheel.backend.gl.GlStateTracker;
|
import com.jozufozu.flywheel.backend.gl.GlStateTracker;
|
||||||
import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher;
|
import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher;
|
||||||
|
import com.jozufozu.flywheel.core.RenderContext;
|
||||||
import com.jozufozu.flywheel.core.crumbling.CrumblingRenderer;
|
import com.jozufozu.flywheel.core.crumbling.CrumblingRenderer;
|
||||||
import com.jozufozu.flywheel.event.BeginFrameEvent;
|
import com.jozufozu.flywheel.event.BeginFrameEvent;
|
||||||
import com.jozufozu.flywheel.event.ReloadRenderersEvent;
|
import com.jozufozu.flywheel.event.ReloadRenderersEvent;
|
||||||
|
@ -46,49 +47,28 @@ public class LevelRendererMixin {
|
||||||
@Shadow
|
@Shadow
|
||||||
@Final
|
@Final
|
||||||
private RenderBuffers renderBuffers;
|
private RenderBuffers renderBuffers;
|
||||||
|
//
|
||||||
|
// @Inject(at = @At("HEAD"), method = "setupRender")
|
||||||
|
// private void setupRender(Camera camera, Frustum frustum, boolean queue, boolean isSpectator, CallbackInfo ci) {
|
||||||
|
//
|
||||||
|
// GlStateTracker.State restoreState = GlStateTracker.getRestoreState();
|
||||||
|
// MinecraftForge.EVENT_BUS.post(new BeginFrameEvent(level, camera, frustum));
|
||||||
|
// restoreState.restore();
|
||||||
|
// }
|
||||||
|
|
||||||
|
@Inject(at = @At("HEAD"), method = "renderLevel")
|
||||||
|
private void beginRender(PoseStack pPoseStack, float pPartialTick, long pFinishNanoTime, boolean pRenderBlockOutline, Camera pCamera, GameRenderer pGameRenderer, LightTexture pLightTexture, Matrix4f pProjectionMatrix, CallbackInfo ci) {
|
||||||
|
Vec3 position = pCamera.getPosition();
|
||||||
|
RenderContext.CURRENT = new RenderContext(level, null, pPoseStack, RenderLayerEvent.createViewProjection(pPoseStack), renderBuffers, position.x, position.y, position.z);
|
||||||
|
|
||||||
@Inject(at = @At("HEAD"), method = "setupRender")
|
|
||||||
private void setupRender(Camera camera, Frustum frustum, boolean queue, boolean isSpectator, CallbackInfo ci) {
|
|
||||||
GlStateTracker.State restoreState = GlStateTracker.getRestoreState();
|
GlStateTracker.State restoreState = GlStateTracker.getRestoreState();
|
||||||
MinecraftForge.EVENT_BUS.post(new BeginFrameEvent(level, camera, frustum));
|
MinecraftForge.EVENT_BUS.post(new BeginFrameEvent(level, pCamera, null));
|
||||||
restoreState.restore();
|
restoreState.restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Unique
|
@Inject(at = @At("TAIL"), method = "renderLevel")
|
||||||
private boolean flywheel$LayerRendered;
|
private void endRender(PoseStack pPoseStack, float pPartialTick, long pFinishNanoTime, boolean pRenderBlockOutline, Camera pCamera, GameRenderer pGameRenderer, LightTexture pLightTexture, Matrix4f pProjectionMatrix, CallbackInfo ci) {
|
||||||
|
RenderContext.CURRENT = null;
|
||||||
/**
|
|
||||||
* This only gets injected if renderChunkLayer is not Overwritten
|
|
||||||
*/
|
|
||||||
@Group(name = "flywheel$renderLayer", min = 1, max = 2)
|
|
||||||
@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ShaderInstance;clear()V"), method = "renderChunkLayer")
|
|
||||||
private void renderLayer(RenderType type, PoseStack stack, double camX, double camY, double camZ, Matrix4f p_172999_, CallbackInfo ci) {
|
|
||||||
flywheel$renderLayer(type, stack, camX, camY, camZ);
|
|
||||||
flywheel$LayerRendered = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This always gets injected.
|
|
||||||
*/
|
|
||||||
@Group(name = "flywheel$renderLayer")
|
|
||||||
@Inject(at = @At("TAIL"), method = "renderChunkLayer")
|
|
||||||
private void renderLayerSodium(RenderType type, PoseStack stack, double camX, double camY, double camZ, Matrix4f p_172999_, CallbackInfo ci) {
|
|
||||||
if (!flywheel$LayerRendered) {
|
|
||||||
flywheel$renderLayer(type, stack, camX, camY, camZ);
|
|
||||||
}
|
|
||||||
flywheel$LayerRendered = false;
|
|
||||||
BufferUploader.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Unique
|
|
||||||
private void flywheel$renderLayer(RenderType type, PoseStack stack, double camX, double camY, double camZ) {
|
|
||||||
RenderBuffers renderBuffers = this.renderBuffers;
|
|
||||||
|
|
||||||
GlStateTracker.State restoreState = GlStateTracker.getRestoreState();
|
|
||||||
|
|
||||||
MinecraftForge.EVENT_BUS.post(new RenderLayerEvent(level, type, stack, renderBuffers, camX, camY, camZ));
|
|
||||||
|
|
||||||
restoreState.restore();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(at = @At("TAIL"), method = "allChanged")
|
@Inject(at = @At("TAIL"), method = "allChanged")
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.jozufozu.flywheel.mixin;
|
||||||
|
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
import com.jozufozu.flywheel.backend.Backend;
|
||||||
|
import com.jozufozu.flywheel.backend.gl.GlStateTracker;
|
||||||
|
import com.jozufozu.flywheel.core.RenderContext;
|
||||||
|
import com.jozufozu.flywheel.event.RenderLayerEvent;
|
||||||
|
|
||||||
|
import net.minecraft.client.renderer.MultiBufferSource;
|
||||||
|
import net.minecraft.client.renderer.RenderBuffers;
|
||||||
|
import net.minecraft.client.renderer.RenderType;
|
||||||
|
import net.minecraftforge.common.MinecraftForge;
|
||||||
|
|
||||||
|
@Mixin(MultiBufferSource.BufferSource.class)
|
||||||
|
public class MultiBufferSourceMixin {
|
||||||
|
|
||||||
|
@Inject(method = "endBatch(Lnet/minecraft/client/renderer/RenderType;)V", at = @At("TAIL"))
|
||||||
|
private void renderLayer(RenderType renderType, CallbackInfo ci) {
|
||||||
|
if (RenderContext.CURRENT != null && Backend.isGameActive() && Backend.isOn()) {
|
||||||
|
GlStateTracker.State restoreState = GlStateTracker.getRestoreState();
|
||||||
|
|
||||||
|
MinecraftForge.EVENT_BUS.post(new RenderLayerEvent(RenderContext.CURRENT.withRenderType(renderType)));
|
||||||
|
|
||||||
|
restoreState.restore();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -34,8 +34,8 @@ import net.minecraft.world.level.block.state.properties.ChestType;
|
||||||
|
|
||||||
public class ChestInstance<T extends BlockEntity & LidBlockEntity> extends BlockEntityInstance<T> implements DynamicInstance {
|
public class ChestInstance<T extends BlockEntity & LidBlockEntity> extends BlockEntityInstance<T> implements DynamicInstance {
|
||||||
|
|
||||||
private static final BiFunction<ChestType, Material, ModelSupplier> LID = Util.memoize((type, mat) -> new ModelSupplier(() -> createLidModel(type, mat.sprite()), RenderType.entitySolid(mat.atlasLocation())));
|
private static final BiFunction<ChestType, Material, ModelSupplier> LID = Util.memoize((type, mat) -> new ModelSupplier(() -> createLidModel(type, mat.sprite()), Sheets.chestSheet()));
|
||||||
private static final BiFunction<ChestType, Material, ModelSupplier> BASE = Util.memoize((type, mat) -> new ModelSupplier(() -> createBaseModel(type, mat.sprite()), RenderType.entitySolid(mat.atlasLocation())));
|
private static final BiFunction<ChestType, Material, ModelSupplier> BASE = Util.memoize((type, mat) -> new ModelSupplier(() -> createBaseModel(type, mat.sprite()), Sheets.chestSheet()));
|
||||||
|
|
||||||
private final OrientedData body;
|
private final OrientedData body;
|
||||||
private final ModelData lid;
|
private final ModelData lid;
|
||||||
|
|
|
@ -10,8 +10,8 @@
|
||||||
"BufferBuilderMixin",
|
"BufferBuilderMixin",
|
||||||
"BufferUploaderMixin",
|
"BufferUploaderMixin",
|
||||||
"CameraMixin",
|
"CameraMixin",
|
||||||
"ClientLevelMixin",
|
|
||||||
"ChunkRebuildHooksMixin",
|
"ChunkRebuildHooksMixin",
|
||||||
|
"ClientLevelMixin",
|
||||||
"EntityTypeMixin",
|
"EntityTypeMixin",
|
||||||
"FixFabulousDepthMixin",
|
"FixFabulousDepthMixin",
|
||||||
"FrustumMixin",
|
"FrustumMixin",
|
||||||
|
@ -20,6 +20,7 @@
|
||||||
"InstanceRemoveMixin",
|
"InstanceRemoveMixin",
|
||||||
"LevelRendererAccessor",
|
"LevelRendererAccessor",
|
||||||
"LevelRendererMixin",
|
"LevelRendererMixin",
|
||||||
|
"MultiBufferSourceMixin",
|
||||||
"PausedPartialTickAccessor",
|
"PausedPartialTickAccessor",
|
||||||
"RenderTexturesMixin",
|
"RenderTexturesMixin",
|
||||||
"RenderTypeMixin",
|
"RenderTypeMixin",
|
||||||
|
|
Loading…
Reference in a new issue