Skip to content

Commit deba4a9

Browse files
author
cputnam-a11y
committed
Implement methods to convert a RenderPipeline into a Builder and a Snippet
1 parent 5612443 commit deba4a9

File tree

3 files changed

+69
-2
lines changed

3 files changed

+69
-2
lines changed

fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/FabricRenderPipeline.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,12 @@
1717
package net.fabricmc.fabric.api.client.rendering.v1;
1818

1919
import java.util.Optional;
20+
import java.util.function.Consumer;
2021

2122
import com.mojang.blaze3d.pipeline.RenderPipeline;
2223

24+
import net.fabricmc.fabric.impl.client.rendering.FabricRenderPipelineImpl;
25+
2326
/**
2427
* General purpose Fabric extensions to the {@link RenderPipeline} class.
2528
*
@@ -35,6 +38,41 @@ default boolean usePipelineDrawModeForGui() {
3538
throw new AssertionError("Implemented in Mixin");
3639
}
3740

41+
/**
42+
* Creates a builder that when built would create this pipeline.
43+
* Note that the caller must call {@link RenderPipeline.Builder#withLocation(net.minecraft.resources.Identifier)} returned builder before building.
44+
*
45+
* @return a builder that could build this pipeline
46+
*/
47+
default RenderPipeline.Builder toBuilder() {
48+
RenderPipeline $self = (RenderPipeline) this;
49+
RenderPipeline.Builder builder = RenderPipeline.builder()
50+
.withLocation($self.getLocation())
51+
.withVertexShader($self.getVertexShader())
52+
.withFragmentShader($self.getFragmentShader())
53+
.withDepthTestFunction($self.getDepthTestFunction())
54+
.withPolygonMode($self.getPolygonMode())
55+
.withCull($self.isCull())
56+
.withColorLogic($self.getColorLogic())
57+
.withColorWrite($self.isWriteColor(), $self.isWriteAlpha())
58+
.withDepthWrite($self.isWriteDepth())
59+
.withVertexFormat($self.getVertexFormat(), $self.getVertexFormatMode())
60+
.withDepthBias($self.getDepthBiasScaleFactor(), $self.getDepthBiasConstant())
61+
.withUsePipelineDrawModeForGui($self.usePipelineDrawModeForGui());
62+
$self.getShaderDefines().values().forEach((v1, v2) -> ((FabricRenderPipelineImpl.BuilderImpl) builder).fabric$getShaderDefines().define(v1, v2));
63+
$self.getShaderDefines().flags().forEach(flag -> ((FabricRenderPipelineImpl.BuilderImpl) builder).fabric$getShaderDefines().define(flag));
64+
return builder;
65+
}
66+
67+
/**
68+
* Creates a snippet that describes this pipeline.
69+
*
70+
* @return a snippet that describes this pipeline
71+
*/
72+
default RenderPipeline.Snippet toSnippet() {
73+
return toBuilder().buildSnippet();
74+
}
75+
3876
/**
3977
* General purpose Fabric extensions to the {@link RenderPipeline.Builder} class.
4078
*
@@ -76,6 +114,18 @@ default Optional<Boolean> usePipelineDrawModeForGui() {
76114
throw new AssertionError("Implemented in Mixin");
77115
}
78116

117+
/**
118+
* Creates a new snippet that is identical to this one aside from the changes induced by {@code mutator}.
119+
*
120+
* @param mutator the changes to make to this snippet
121+
* @return a new snippet identical to this one aside from the changes applied by mutator
122+
*/
123+
default RenderPipeline.Snippet with(Consumer<RenderPipeline.Builder> mutator) {
124+
RenderPipeline.Builder builder = RenderPipeline.builder((RenderPipeline.Snippet) this);
125+
mutator.accept(builder);
126+
return builder.buildSnippet();
127+
}
128+
79129
/**
80130
* Creates a new snippet with the specified pipeline draw mode for GUI rendering.
81131
*

fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/FabricRenderPipelineImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,14 @@
1616

1717
package net.fabricmc.fabric.impl.client.rendering;
1818

19+
import net.minecraft.client.renderer.ShaderDefines;
20+
1921
import net.fabricmc.fabric.api.client.rendering.v1.FabricRenderPipeline;
2022

2123
public interface FabricRenderPipelineImpl extends FabricRenderPipeline {
2224
void fabric$setUsePipelineDrawModeForGuiSetter(boolean usePipelineDrawModeForGui);
25+
26+
interface BuilderImpl extends FabricRenderPipeline.Builder {
27+
ShaderDefines.Builder fabric$getShaderDefines();
28+
}
2329
}

fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/RenderPipelineBuilderMixin.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.mojang.blaze3d.platform.PolygonMode;
3030
import com.mojang.blaze3d.vertex.VertexFormat;
3131
import org.spongepowered.asm.mixin.Mixin;
32+
import org.spongepowered.asm.mixin.Shadow;
3233
import org.spongepowered.asm.mixin.Unique;
3334
import org.spongepowered.asm.mixin.injection.At;
3435
import org.spongepowered.asm.mixin.injection.Inject;
@@ -37,12 +38,13 @@
3738
import net.minecraft.client.renderer.ShaderDefines;
3839
import net.minecraft.resources.Identifier;
3940

40-
import net.fabricmc.fabric.api.client.rendering.v1.FabricRenderPipeline;
4141
import net.fabricmc.fabric.impl.client.rendering.FabricRenderPipelineImpl;
4242
import net.fabricmc.fabric.impl.client.rendering.FabricRenderPipelineInternals;
4343

4444
@Mixin(RenderPipeline.Builder.class)
45-
class RenderPipelineBuilderMixin implements FabricRenderPipeline.Builder {
45+
class RenderPipelineBuilderMixin implements FabricRenderPipelineImpl.BuilderImpl {
46+
@Shadow
47+
private Optional<ShaderDefines.Builder> definesBuilder;
4648
@Unique
4749
private Optional<Boolean> usePipelineDrawModeForGui = Optional.empty();
4850

@@ -102,4 +104,13 @@ private RenderPipeline copyUsePipelineDrawModeForGuiToPipeline(RenderPipeline or
102104
((FabricRenderPipelineImpl) original).fabric$setUsePipelineDrawModeForGuiSetter(this.usePipelineDrawModeForGui.orElse(false));
103105
return original;
104106
}
107+
108+
@Override
109+
public ShaderDefines.Builder fabric$getShaderDefines() {
110+
if (this.definesBuilder.isEmpty()) {
111+
this.definesBuilder = Optional.of(ShaderDefines.builder());
112+
}
113+
114+
return definesBuilder.orElseThrow();
115+
}
105116
}

0 commit comments

Comments
 (0)