VulkanShader_1.21.10-0.0.4-alpha.jar
Download file
package net.vulkanmod.render.chunk.build.task;
import net.minecraft.class_11954;
import net.minecraft.class_2338;
import net.minecraft.class_243;
import net.minecraft.class_2464;
import net.minecraft.class_2586;
import net.minecraft.class_2680;
import net.minecraft.class_310;
import net.minecraft.class_3610;
import net.minecraft.class_827;
import net.minecraft.class_852;
import net.vulkanmod.Initializer;
import net.vulkanmod.render.chunk.RenderSection;
import net.vulkanmod.render.chunk.WorldRenderer;
import net.vulkanmod.render.chunk.build.RenderRegion;
import net.vulkanmod.render.chunk.build.UploadBuffer;
import net.vulkanmod.render.chunk.build.renderer.BlockRenderer;
import net.vulkanmod.render.chunk.build.renderer.FluidRenderer;
import net.vulkanmod.render.chunk.build.thread.BuilderResources;
import net.vulkanmod.render.chunk.build.thread.ThreadBuilderPack;
import net.vulkanmod.render.chunk.cull.QuadFacing;
import net.vulkanmod.render.vertex.TerrainBuilder;
import net.vulkanmod.render.vertex.TerrainRenderType;
import org.jetbrains.annotations.Nullable;
import org.joml.Vector3f;
public class BuildTask extends ChunkTask {
protected @Nullable RenderRegion region;
public BuildTask(RenderSection renderSection, RenderRegion renderRegion, boolean highPriority) {
super(renderSection);
this.region = renderRegion;
this.highPriority = highPriority;
}
public String name() {
return "rend_chk_rebuild";
}
public ChunkTask.Result runTask(BuilderResources builderResources) {
long startTime = System.nanoTime();
if (this.cancelled.get()) {
return ChunkTask.Result.CANCELLED;
} else {
class_243 vec3 = WorldRenderer.getCameraPos();
float x = (float)vec3.field_1352;
float y = (float)vec3.field_1351;
float z = (float)vec3.field_1350;
CompileResult compileResult = this.compile(x, y, z, builderResources);
CompiledSection compiledSection = new CompiledSection();
compiledSection.blockEntities.addAll(compileResult.blockEntities);
compiledSection.transparencyState = compileResult.transparencyState;
compiledSection.isCompletelyEmpty = compileResult.renderedLayers.isEmpty();
compileResult.compiledSection = compiledSection;
if (this.cancelled.get()) {
compileResult.renderedLayers.values().forEach(UploadBuffer::release);
return ChunkTask.Result.CANCELLED;
} else {
taskDispatcher.scheduleSectionUpdate(compileResult);
float buildTime = (float)(System.nanoTime() - startTime) * 1.0E-6F;
builderResources.updateBuildStats((int)buildTime);
return ChunkTask.Result.SUCCESSFUL;
}
}
}
private CompileResult compile(float camX, float camY, float camZ, BuilderResources builderResources) {
CompileResult compileResult = new CompileResult(this.section, true);
class_2338 startBlockPos = (new class_2338(this.section.xOffset(), this.section.yOffset(), this.section.zOffset())).method_10062();
class_852 visGraph = new class_852();
if (this.region == null) {
compileResult.visibilitySet = visGraph.method_3679();
return compileResult;
} else {
Vector3f pos = new Vector3f();
ThreadBuilderPack bufferBuilders = builderResources.builderPack;
this.setupBufferBuilders(bufferBuilders);
this.region.loadBlockStates();
this.region.initTintCache(builderResources.tintCache);
builderResources.update(this.region, this.section);
BlockRenderer blockRenderer = builderResources.blockRenderer;
FluidRenderer fluidRenderer = builderResources.fluidRenderer;
class_2338.class_2339 blockPos = new class_2338.class_2339();
for(int y = 0; y < 16; ++y) {
for(int z = 0; z < 16; ++z) {
for(int x = 0; x < 16; ++x) {
blockPos.method_10103(this.section.xOffset() + x, this.section.yOffset() + y, this.section.zOffset() + z);
class_2680 blockState = this.region.method_8320(blockPos);
if (blockState.method_26216()) {
visGraph.method_3682(blockPos);
}
if (blockState.method_31709()) {
class_2586 blockEntity = this.region.method_8321(blockPos);
if (blockEntity != null) {
this.handleBlockEntity(compileResult, blockEntity);
}
}
class_3610 fluidState = blockState.method_26227();
if (!fluidState.method_15769()) {
fluidRenderer.renderLiquid(blockState, fluidState, blockPos);
}
if (blockState.method_26217() == class_2464.field_11458) {
pos.set((float)(blockPos.method_10263() & 15), (float)(blockPos.method_10264() & 15), (float)(blockPos.method_10260() & 15));
blockRenderer.renderBlock(blockState, blockPos, pos);
}
}
}
}
TerrainBuilder trasnlucentTerrainBuilder = bufferBuilders.builder(TerrainRenderType.TRANSLUCENT);
if (trasnlucentTerrainBuilder.getBufferBuilder(QuadFacing.UNDEFINED.ordinal()).getVertices() > 0) {
trasnlucentTerrainBuilder.setupQuadSortingPoints();
trasnlucentTerrainBuilder.setupQuadSorting(camX - (float)startBlockPos.method_10263(), camY - (float)startBlockPos.method_10264(), camZ - (float)startBlockPos.method_10260());
compileResult.transparencyState = trasnlucentTerrainBuilder.getSortState();
}
for(TerrainRenderType renderType : TerrainRenderType.VALUES) {
TerrainBuilder builder = bufferBuilders.builder(renderType);
TerrainBuilder.DrawState drawState = builder.endDrawing();
UploadBuffer uploadBuffer = new UploadBuffer(builder, drawState);
compileResult.renderedLayers.put(renderType, uploadBuffer);
builder.clear();
}
compileResult.visibilitySet = visGraph.method_3679();
this.region = null;
return compileResult;
}
}
private void setupBufferBuilders(ThreadBuilderPack builderPack) {
for(TerrainRenderType renderType : TerrainRenderType.VALUES) {
TerrainBuilder bufferBuilder = builderPack.builder(renderType);
bufferBuilder.begin();
}
}
private TerrainBuilder getTerrainBuilder(ThreadBuilderPack bufferBuilders, TerrainRenderType renderType) {
renderType = this.compactRenderTypes(renderType);
return bufferBuilders.builder(renderType);
}
private TerrainRenderType compactRenderTypes(TerrainRenderType renderType) {
if (Initializer.CONFIG.uniqueOpaqueLayer) {
TerrainRenderType var10000;
switch (renderType) {
case SOLID:
case CUTOUT:
case CUTOUT_MIPPED:
var10000 = TerrainRenderType.CUTOUT_MIPPED;
break;
case TRANSLUCENT:
case TRIPWIRE:
var10000 = TerrainRenderType.TRANSLUCENT;
break;
default:
throw new MatchException((String)null, (Throwable)null);
}
renderType = var10000;
} else {
TerrainRenderType var3;
switch (renderType) {
case SOLID:
case CUTOUT_MIPPED:
var3 = TerrainRenderType.CUTOUT_MIPPED;
break;
case CUTOUT:
var3 = TerrainRenderType.CUTOUT;
break;
case TRANSLUCENT:
case TRIPWIRE:
var3 = TerrainRenderType.TRANSLUCENT;
break;
default:
throw new MatchException((String)null, (Throwable)null);
}
renderType = var3;
}
return renderType;
}
private <E extends class_2586> void handleBlockEntity(CompileResult compileResult, E blockEntity) {
class_827<E, class_11954> blockEntityRenderer = class_310.method_1551().method_31975().method_3550(blockEntity);
if (blockEntityRenderer != null) {
compileResult.blockEntities.add(blockEntity);
if (blockEntityRenderer.method_3563()) {
compileResult.globalBlockEntities.add(blockEntity);
}
}
}
}
Download file