It renders stuff

- The lightmap moved
 - Begin to move away from access transformers
 - .textureManager -> .getTextureManager()
 - RIP cutout, saw that coming
This commit is contained in:
Jozufozu 2021-09-16 20:03:45 -07:00
parent 5784cb975d
commit d53c9b0a32
14 changed files with 71 additions and 144 deletions

View file

@ -41,6 +41,7 @@ minecraft {
property 'forge.logging.markers', ''
property 'forge.logging.console.level', 'debug'
property 'fml.earlyprogresswindow', 'false'
property 'mixin.debug.export', 'true'
arg "-mixin.config=flywheel.mixins.json"
@ -100,7 +101,7 @@ dependencies {
//implementation "org.joml:joml:1.10.1"
//annotationProcessor 'org.spongepowered:mixin:0.8.4:processor'
annotationProcessor 'org.spongepowered:mixin:0.8.4:processor'
}
// Example for how to get properties into the manifest for reading by the runtime..

View file

@ -8,9 +8,11 @@ import com.jozufozu.flywheel.core.Contexts;
import com.jozufozu.flywheel.core.shader.WorldProgram;
import com.jozufozu.flywheel.event.BeginFrameEvent;
import com.jozufozu.flywheel.event.RenderLayerEvent;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.ShaderInstance;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.block.entity.BlockEntity;
@ -99,6 +101,10 @@ public class InstanceWorld {
public void renderLayer(RenderLayerEvent event) {
event.type.setupRenderState();
ShaderInstance shader = RenderSystem.getShader();
if (shader != null)
shader.apply();
materialManager.render(event.layer, event.viewProjection, event.camX, event.camY, event.camZ);
event.type.clearRenderState();

View file

@ -34,7 +34,7 @@ public class TextureRenderState implements IRenderState {
@Override
public void bind() {
unit.makeActive();
Minecraft.getInstance().textureManager.bindForSetup(location);
Minecraft.getInstance().getTextureManager().bindForSetup(location);
}
@Override

View file

@ -16,7 +16,7 @@ public class AtlasInfo {
private static final Map<ResourceLocation, SheetData> sheetData = new HashMap<>();
public static TextureAtlas getAtlas(ResourceLocation name) {
AbstractTexture texture = Minecraft.getInstance().textureManager.getTexture(name);
AbstractTexture texture = Minecraft.getInstance().getTextureManager().getTexture(name);
if (texture instanceof TextureAtlas)
return (TextureAtlas) texture;

View file

@ -14,6 +14,7 @@ import com.jozufozu.flywheel.backend.material.MaterialManagerImpl;
import com.jozufozu.flywheel.backend.state.RenderLayer;
import com.jozufozu.flywheel.core.Contexts;
import com.jozufozu.flywheel.event.ReloadRenderersEvent;
import com.jozufozu.flywheel.mixin.LevelRendererAccessor;
import com.jozufozu.flywheel.util.Lazy;
import com.jozufozu.flywheel.util.Pair;
@ -66,7 +67,7 @@ public class CrumblingRenderer {
InstanceManager<BlockEntity> renderer = state.instanceManager;
TextureManager textureManager = Minecraft.getInstance().textureManager;
TextureManager textureManager = Minecraft.getInstance().getTextureManager();
Camera info = Minecraft.getInstance().gameRenderer.getMainCamera();
MaterialManagerImpl<CrumblingProgram> materials = state.materialManager;
@ -102,11 +103,11 @@ public class CrumblingRenderer {
* Associate each breaking stage with a list of all tile entities at that stage.
*/
private static Int2ObjectMap<List<BlockEntity>> getActiveStageTiles(ClientLevel world) {
Long2ObjectMap<SortedSet<BlockDestructionProgress>> breakingProgressions = Minecraft.getInstance().levelRenderer.destructionProgress;
Int2ObjectMap<List<BlockEntity>> breakingEntities = new Int2ObjectArrayMap<>();
for (Long2ObjectMap.Entry<SortedSet<BlockDestructionProgress>> entry : breakingProgressions.long2ObjectEntrySet()) {
for (Long2ObjectMap.Entry<SortedSet<BlockDestructionProgress>> entry : ((LevelRendererAccessor) Minecraft.getInstance().levelRenderer).getDestructionProgress()
.long2ObjectEntrySet()) {
BlockPos breakingPos = BlockPos.of(entry.getLongKey());
SortedSet<BlockDestructionProgress> progresses = entry.getValue();

View file

@ -33,7 +33,7 @@ public class WorldProgram extends ExtensibleGlProgram {
protected void registerSamplers() {
uBlockAtlas = setSamplerBinding("uBlockAtlas", 0);
uLightMap = setSamplerBinding("uLightMap", 2);
uLightMap = setSamplerBinding("uLightMap", 1);
}
public void uploadViewProjection(Matrix4f viewProjection) {

View file

@ -20,6 +20,7 @@ import net.minecraft.util.ClassInstanceMultiMap;
@Mixin(LevelRenderer.class)
public class CancelEntityRenderMixin {
// TODO: Don't use redirect
@Group(name = "entityFilter", min = 1, max = 1)
@Redirect(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/ClientLevel;entitiesForRendering()Ljava/lang/Iterable;"))
private Iterable<Entity> filterEntities(ClientLevel world) {
@ -37,19 +38,19 @@ public class CancelEntityRenderMixin {
return entities;
}
@Group(name = "entityFilter")
@Redirect(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/ClassInstanceMultiMap;iterator()Ljava/util/Iterator;"))
private Iterator<Entity> filterEntitiesOF(ClassInstanceMultiMap<Entity> classInheritanceMultiMap) {
if (Backend.getInstance()
.canUseInstancing()) {
ArrayList<Entity> filtered = Lists.newArrayList(classInheritanceMultiMap);
InstancedRenderRegistry r = InstancedRenderRegistry.getInstance();
filtered.removeIf(r::shouldSkipRender);
return filtered.iterator();
}
return classInheritanceMultiMap.iterator();
}
// @Group(name = "entityFilter")
// @Redirect(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/ClassInstanceMultiMap;iterator()Ljava/util/Iterator;"))
// private Iterator<Entity> filterEntitiesOF(ClassInstanceMultiMap<Entity> classInheritanceMultiMap) {
// if (Backend.getInstance()
// .canUseInstancing()) {
//
// ArrayList<Entity> filtered = Lists.newArrayList(classInheritanceMultiMap);
//
// InstancedRenderRegistry r = InstancedRenderRegistry.getInstance();
// filtered.removeIf(r::shouldSkipRender);
//
// return filtered.iterator();
// }
// return classInheritanceMultiMap.iterator();
// }
}

View file

@ -12,10 +12,7 @@ import com.jozufozu.flywheel.backend.instancing.InstancedRenderRegistry;
import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
@Mixin(ChunkRenderDispatcher.CompiledChunk.class)
public class CancelTileEntityRenderMixin {

View file

@ -1,94 +0,0 @@
package com.jozufozu.flywheel.mixin;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import com.jozufozu.flywheel.backend.Backend;
import net.minecraft.client.multiplayer.ClientChunkCache;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.level.chunk.ChunkBiomeContainer;
import net.minecraft.world.level.chunk.ChunkSource;
import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraft.world.level.chunk.ChunkStatus;
import net.minecraft.world.level.chunk.ChunkAccess;
import java.util.BitSet;
@Mixin(ClientChunkCache.class)
public abstract class FastChunkProviderMixin extends ChunkSource {
@Shadow
@Final
private ClientLevel level;
@Unique
private int lastX;
@Unique
private int lastZ;
@Unique
private ChunkAccess lastChunk;
@Inject(method = "getChunk",
at = @At("HEAD"),
cancellable = true)
public void returnCachedChunk(int x, int z, ChunkStatus status, boolean create, CallbackInfoReturnable<ChunkAccess> cir) {
if (Backend.getInstance().chunkCachingEnabled && status.isOrAfter(ChunkStatus.FULL)) {
synchronized (level) {
if (lastChunk != null && x == lastX && z == lastZ) {
cir.setReturnValue(lastChunk);
}
}
}
}
@Inject(method = "getChunk",
at = @At("RETURN"))
public void cacheChunk(int x, int z, ChunkStatus status, boolean create, CallbackInfoReturnable<ChunkAccess> cir) {
if (Backend.getInstance().chunkCachingEnabled && status.isOrAfter(ChunkStatus.FULL)) {
synchronized (level) {
lastChunk = cir.getReturnValue();
lastX = x;
lastZ = z;
}
}
}
@Inject(method = "drop", at = @At("HEAD"))
public void invalidateOnDrop(int x, int z, CallbackInfo ci) {
if (Backend.getInstance().chunkCachingEnabled) {
synchronized (level) {
if (x == lastX && z == lastZ) lastChunk = null;
}
}
}
@Inject(method = "replaceWithPacketData", at = @At("HEAD"))
public void invalidateOnPacket(int x, int z, ChunkBiomeContainer p_171618_, FriendlyByteBuf p_171619_, CompoundTag p_171620_, BitSet p_171621_, CallbackInfoReturnable<LevelChunk> cir) {
if (Backend.getInstance().chunkCachingEnabled) {
synchronized (level) {
if (x == lastX && z == lastZ) lastChunk = null;
}
}
}
@Redirect(method = "isTickingChunk", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/ClientChunkProvider;hasChunk(II)Z"))
public boolean redirectTicking(ClientChunkCache clientChunkProvider, int x, int z) {
if (Backend.getInstance().chunkCachingEnabled) {
synchronized (level) {
if (lastChunk != null && x == lastX && z == lastZ) return true;
}
}
return clientChunkProvider.hasChunk(x, z);
}
}

View file

@ -9,26 +9,24 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
@Mixin(value = LevelChunk.class, priority = 1100) // this and create.mixins.json have high priority to load after Performant
public class TileWorldHookMixin {
@Mixin(LevelChunk.class)
public class InstanceAddMixin {
@Shadow
@Final
Level level;
@Inject(at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/world/level/block/entity/BlockEntity;clearRemoved()V"),
method = "setBlockEntity")
private void onAddTile(BlockEntity te, CallbackInfo ci) {
if (level.isClientSide) {
InstancedRenderDispatcher.getTiles(level)
.queueAdd(te);
}
@Inject(method = "setBlockEntity",
at = @At(value = "INVOKE_ASSIGN", target = "Ljava/util/Map;put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"))
private void tileAdded(BlockEntity be, CallbackInfo ci) {
if (level.isClientSide) InstancedRenderDispatcher.getTiles(this.level)
.add(be);
}
}

View file

@ -15,15 +15,25 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.Level;
@Mixin(BlockEntity.class)
public class TileRemoveMixin {
public class InstanceRemoveMixin {
@Shadow
@Nullable
protected Level level;
@Inject(at = @At("TAIL"), method = "setRemoved")
private void onRemove(CallbackInfo ci) {
private void removeInstance(CallbackInfo ci) {
if (level instanceof ClientLevel) InstancedRenderDispatcher.getTiles(this.level)
.remove((BlockEntity) (Object) this);
}
// /**
// * Don't do this.
// * It can cause infinite loops if an instance class tries to access another tile entity in its constructor.
// */
// @Inject(at = @At("TAIL"), method = "clearRemoved")
// private void addInstance(CallbackInfo ci) {
// if (level.isClientSide) InstancedRenderDispatcher.getTiles(this.level)
// .add((BlockEntity) (Object) this);
// }
}

View file

@ -0,0 +1,16 @@
package com.jozufozu.flywheel.mixin;
import java.util.SortedSet;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.server.level.BlockDestructionProgress;
@Mixin(LevelRenderer.class)
public interface LevelRendererAccessor {
@Accessor
Long2ObjectMap<SortedSet<BlockDestructionProgress>> getDestructionProgress();
}

View file

@ -2,12 +2,6 @@
# Don't jitter when game is paused
public net.minecraft.client.Minecraft f_91013_ #renderPartialTicksPaused
# Expose fog state for use in flywheel shaders
public com.mojang.blaze3d.platform.GlStateManager$FogState
public com.mojang.blaze3d.platform.GlStateManager f_84068_ #FOG
public com.mojang.blaze3d.platform.GlStateManager$BooleanState
public com.mojang.blaze3d.platform.GlStateManager$BooleanState f_84586_ #field_179201_b
# For uploading matrices as vertex attributes.
public com.mojang.math.Matrix3f f_8134_ #a00
public com.mojang.math.Matrix3f f_8135_ #a01
@ -35,6 +29,3 @@ public com.mojang.math.Matrix4f f_27615_ #a30
public com.mojang.math.Matrix4f f_27616_ #a31
public com.mojang.math.Matrix4f f_27617_ #a32
public com.mojang.math.Matrix4f f_27618_ #a33
# For fancy breaking overlay rendering
public net.minecraft.client.renderer.LevelRenderer f_109409_ #blockBreakingProgressions

View file

@ -10,15 +10,15 @@
"FixFabulousDepthMixin",
"RenderHooksMixin",
"ShaderCloseMixin",
"TileRemoveMixin",
"TileWorldHookMixin",
"atlas.AtlasDataMixin",
"atlas.SheetDataAccessor",
"light.LightUpdateMixin",
"light.NetworkLightUpdateMixin",
"FastChunkProviderMixin"
"LevelRendererAccessor",
"InstanceAddMixin",
"InstanceRemoveMixin"
],
"injectors": {
"defaultRequire": 0
"defaultRequire": 1
}
}