Skip to content

Commit

Permalink
Merge pull request #1408 from ZhuRuoLing/releases/1.21
Browse files Browse the repository at this point in the history
添加可缓存的BER渲染管线api
  • Loading branch information
Gu-ZT authored Dec 28, 2024
2 parents bffc7c8 + fa4e87d commit 0c54999
Show file tree
Hide file tree
Showing 12 changed files with 433 additions and 367 deletions.
18 changes: 0 additions & 18 deletions src/main/java/dev/dubhe/anvilcraft/api/LaserStateAccess.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package dev.dubhe.anvilcraft.api.rendering;

import dev.dubhe.anvilcraft.client.init.ModRenderTypes;
import lombok.Getter;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.world.level.ChunkPos;
import org.joml.Matrix4f;

import java.util.ArrayDeque;
import java.util.HashMap;
import java.util.Map;
import java.util.Queue;

public class CacheableBERenderingPipeline {
public static final RenderType[] SUPPORTED_RENDERTYPES = new RenderType[]{
RenderType.solid(),
ModRenderTypes.LASER
};

public static final RenderType[] BLOOM_RENDERTYPES = new RenderType[]{
ModRenderTypes.LASER
};

@Getter
private static CacheableBERenderingPipeline instance;
private final ClientLevel level;
private final Queue<Runnable> pendingCompiles = new ArrayDeque<>();
private final Queue<Runnable> pendingUploads = new ArrayDeque<>();
private final Map<ChunkPos, RenderRegion> renderRegions = new HashMap<>();
private boolean valid = true;

public RenderRegion getRenderRegion(ChunkPos chunkPos) {
if (renderRegions.containsKey(chunkPos)) {
return renderRegions.get(chunkPos);
}
RenderRegion renderRegion = new RenderRegion(chunkPos, this);
renderRegions.put(chunkPos, renderRegion);
return renderRegion;
}

public CacheableBERenderingPipeline(ClientLevel level) {
this.level = level;
}

public void runTasks() {
while (!pendingCompiles.isEmpty() && valid) {
pendingCompiles.poll().run();
}
while (!pendingUploads.isEmpty() && valid) {
pendingUploads.poll().run();
}
}

public static void updateLevel(ClientLevel level) {
if (instance != null) {
instance.releaseBuffers();
}
instance = new CacheableBERenderingPipeline(level);
}

public void blockRemoved(CacheableBlockEntity be){
ChunkPos chunkPos = new ChunkPos(be.getBlockPos());
getRenderRegion(chunkPos).blockRemoved(be);
}

public void update(CacheableBlockEntity be){
ChunkPos chunkPos = new ChunkPos(be.getBlockPos());
getRenderRegion(chunkPos).update(be);
}

public void submitUploadTask(Runnable task) {
pendingUploads.add(task);
}

public void submitCompileTask(Runnable task) {
pendingCompiles.add(task);
}

public void releaseBuffers() {
renderRegions.values().forEach(RenderRegion::releaseBuffers);
valid = false;
}

public void renderBloomed(Matrix4f frustumMatrix, Matrix4f projectionMatrix) {
renderRegions.values().forEach(it -> it.renderBloomed(frustumMatrix, projectionMatrix));
}

public void render(Matrix4f frustumMatrix, Matrix4f projectionMatrix) {
renderRegions.values().forEach(it -> it.render(frustumMatrix, projectionMatrix));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package dev.dubhe.anvilcraft.api.rendering;

import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn;

public abstract class CacheableBlockEntity extends BlockEntity {
public CacheableBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState blockState) {
super(type, pos, blockState);
}

@OnlyIn(Dist.CLIENT)
public abstract CacheableBlockEntityRenderer<? extends CacheableBlockEntity> getRenderer();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package dev.dubhe.anvilcraft.api.rendering;

import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.renderer.RenderType;

public interface CacheableBlockEntityRenderer<T extends CacheableBlockEntity> {
void compileRenderType(
T cacheableBlockEntity,
RenderType renderType,
BufferBuilder bufferBuilder,
PoseStack poseStack
);
}
Loading

0 comments on commit 0c54999

Please sign in to comment.