Guest User

CustomRenderLayer

a guest
Jan 19th, 2025
18
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.39 KB | Source Code | 0 0
  1. package at.tobiazsh.myworld.traffic_addition.components.Rendering;
  2.  
  3. import com.mojang.blaze3d.systems.RenderSystem;
  4. import net.minecraft.client.render.RenderPhase;
  5. import net.minecraft.client.render.VertexFormat;
  6. import net.minecraft.client.render.VertexFormats;
  7. import net.minecraft.util.Identifier;
  8. import net.minecraft.util.TriState;
  9. import net.minecraft.util.Util;
  10. import net.minecraft.client.render.RenderLayer;
  11. import org.joml.Matrix4fStack;
  12.  
  13. import java.util.HashMap;
  14. import java.util.Map;
  15. import java.util.function.Function;
  16.  
  17. import static net.minecraft.client.render.RenderPhase.*;
  18.  
  19. public class CustomRenderLayer {
  20.  
  21.     private static final Map<Identifier, RenderLayer> BUILT_TEXT_RENDER_LAYERS = new HashMap<>(); // Stores all the built text render layers of all fonts
  22.  
  23.     public static RenderLayer getTextRenderLayer(Identifier key) {
  24. //        Identifier newKey = Identifier.of(key.getNamespace(), key.getPath().substring(0, key.getPath().lastIndexOf("/") - 1)); // Cutting the font id short for simplicity
  25.         return BUILT_TEXT_RENDER_LAYERS.get(key);
  26.     }
  27.  
  28.     public static void queryTextRenderLayer(Identifier key, RenderLayer renderLayer) {
  29. //        Identifier newKey = Identifier.of(key.getNamespace(), key.getPath().substring(0, key.getPath().lastIndexOf("/") - 1)); // Cutting the font id short for simplicity
  30.         BUILT_TEXT_RENDER_LAYERS.put(key, renderLayer);
  31.     }
  32.  
  33.     // ------------------ GENERAL Layering -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
  34.  
  35.     public static class Layering {
  36.         public static RenderPhase.Layering getRenderPhaseZLayeringBackward(float zOffset) {
  37.             return new RenderPhase.Layering("view_offset_z_layering_backward", () -> {
  38.                 Matrix4fStack matrix4fStack = RenderSystem.getModelViewStack();
  39.                 matrix4fStack.pushMatrix();
  40.                 RenderSystem.getProjectionType().apply(matrix4fStack, zOffset);
  41.             },
  42.                     () -> {
  43.                         Matrix4fStack matrix4fStack = RenderSystem.getModelViewStack();
  44.                         matrix4fStack.popMatrix();
  45.                     }
  46.             );
  47.         }
  48.     }
  49.  
  50.     // ------------------ Image Layering -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
  51.    
  52.     public static class ImageLayering {
  53.        
  54.         private float zOffset;
  55.        
  56.         public ImageLayering(float zOffset) {
  57.             this.zOffset = zOffset;
  58.         }
  59.  
  60.         private final Function<Identifier, RenderLayer> ENTITY_SOLID_Z_OFFSET_BACKWARD = Util.memoize(
  61.                 texture -> {
  62.                     RenderLayer.MultiPhaseParameters multiPhaseParameters = RenderLayer.MultiPhaseParameters.builder()
  63.                             .program(RenderPhase.ENTITY_SOLID_PROGRAM)
  64.                             .texture(new RenderPhase.Texture(texture, TriState.FALSE, false))
  65.                             .transparency(RenderLayer.NO_TRANSPARENCY)
  66.                             .lightmap(ENABLE_LIGHTMAP)
  67.                             .overlay(RenderPhase.ENABLE_OVERLAY_COLOR)
  68.                             .layering(CustomRenderLayer.Layering.getRenderPhaseZLayeringBackward(zOffset))
  69.                             .build(true);
  70.  
  71.                     return RenderLayer.of(
  72.                             "entity_solid_z_offset_backward",
  73.                             VertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL,
  74.                             VertexFormat.DrawMode.QUADS,
  75.                             1536,
  76.                             true,
  77.                             false,
  78.                             multiPhaseParameters
  79.                     );
  80.                 }
  81.         );
  82.        
  83.         public static RenderLayer build(LayeringType layeringType, Identifier texture, float zOffset) {
  84.             ImageLayering layering = new ImageLayering(zOffset);
  85.            
  86.             return switch (layeringType) {
  87.                 case VIEW_OFFSET_Z_LAYERING_BACKWARD -> layering.ENTITY_SOLID_Z_OFFSET_BACKWARD.apply(texture);
  88.             };
  89.         }
  90.        
  91.         public enum LayeringType {
  92.             VIEW_OFFSET_Z_LAYERING_BACKWARD
  93.         }
  94.     }
  95.  
  96.     // ------------------ Text Layering -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
  97.  
  98.     public static class TextLayering {
  99.  
  100.         private float zOffset;
  101.         RenderLayer renderLayer;
  102.  
  103.         public TextLayering(float zOffset) {
  104.             this.zOffset = zOffset;
  105.         }
  106.  
  107.         private final Function<Identifier, RenderLayer> TEXT_Z_OFFSET_BACKWARD = Util.memoize(
  108.                 texture -> RenderLayer.of(
  109.                         "text_z_offset_backward",
  110.                         VertexFormats.POSITION_COLOR_TEXTURE_LIGHT,
  111.                         VertexFormat.DrawMode.QUADS,
  112.                         786432,
  113.                         false,
  114.                         false,
  115.                         RenderLayer.MultiPhaseParameters.builder()
  116.                                 .program(TEXT_PROGRAM)
  117.                                 .texture(new RenderPhase.Texture(texture, TriState.FALSE, false))
  118.                                 .transparency(TRANSLUCENT_TRANSPARENCY)
  119.                                 .lightmap(ENABLE_LIGHTMAP)
  120.                                 .layering(CustomRenderLayer.Layering.getRenderPhaseZLayeringBackward(zOffset))
  121.                                 .build(false)
  122.                 )
  123.         );
  124.  
  125.         public RenderLayer build(LayeringType layeringType, Identifier texture, float zOffset) {
  126.             this.zOffset = zOffset;
  127.             this.renderLayer =  switch (layeringType) {
  128.                 case VIEW_OFFSET_Z_LAYERING_BACKWARD -> TEXT_Z_OFFSET_BACKWARD.apply(texture);
  129.             };
  130.  
  131.             queryTextRenderLayer(texture, renderLayer);
  132.  
  133.             return this.renderLayer;
  134.         }
  135.  
  136.         public RenderLayer getRenderLayer() {
  137.             return renderLayer;
  138.         }
  139.  
  140.         public enum LayeringType {
  141.             VIEW_OFFSET_Z_LAYERING_BACKWARD
  142.         }
  143.  
  144.         public static final Function<Identifier, RenderLayer> TEST_TEXT_RENDER_LAYER = Util.memoize(
  145.                 texture -> RenderLayer.of(
  146.                         "text_z_offset_backward",
  147.                         VertexFormats.POSITION_COLOR_TEXTURE_LIGHT,
  148.                         VertexFormat.DrawMode.QUADS,
  149.                         786432,
  150.                         false,
  151.                         false,
  152.                         RenderLayer.MultiPhaseParameters.builder()
  153.                                 .program(TEXT_PROGRAM)
  154.                                 .texture(new RenderPhase.Texture(texture, TriState.FALSE, false))
  155.                                 .transparency(TRANSLUCENT_TRANSPARENCY)
  156.                                 .lightmap(ENABLE_LIGHTMAP)
  157.                                 .layering(CustomRenderLayer.Layering.getRenderPhaseZLayeringBackward(2.0f))
  158.                                 .build(false)
  159.                 )
  160.         );
  161.        
  162.         // Just for testing purposes
  163.         public static RenderLayer getTextRenderLayer(Identifier id) {
  164.             return TEST_TEXT_RENDER_LAYER.apply(id);
  165.         }
  166.     }
  167. }
Advertisement
Add Comment
Please, Sign In to add comment