Allow fluid variant colors to depend on the position ()

* Allow fluid variant colors to depend on the position

Also add a smarter FluidVariantRendering#getTooltip.

* Add fluid variant rendering testmod

* 255/256 is not 1

* Actually it's in the top left
This commit is contained in:
Technici4n 2021-08-24 18:43:59 +02:00 committed by GitHub
parent 0d6db0fc9d
commit 96bf6a7e71
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 139 additions and 5 deletions
fabric-transfer-api-v1
build.gradle
src
main/java/net/fabricmc/fabric/api/transfer/v1/client/fluid
testmod
java/net/fabricmc/fabric/test/transfer/ingame/client
resources

View file

@ -11,6 +11,7 @@ moduleDependencies(project, [
dependencies {
testmodImplementation project(path: ':fabric-object-builder-api-v1', configuration: 'dev')
testmodImplementation project(path: ':fabric-rendering-v1', configuration: 'dev')
testmodImplementation project(path: ':fabric-resource-loader-v0', configuration: 'dev')
testmodImplementation project(path: ':fabric-tag-extensions-v0', configuration: 'dev')
testmodImplementation project(path: ':fabric-tool-attribute-api-v1', configuration: 'dev')

View file

@ -24,6 +24,8 @@ import org.jetbrains.annotations.Nullable;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.client.texture.Sprite;
import net.minecraft.text.Text;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.BlockRenderView;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@ -76,14 +78,29 @@ public interface FluidVariantRenderHandler {
}
/**
* Return the color to use when rendering {@linkplain #getSprite the sprite} of this fluid variant.
* @deprecated Use and implement {@linkplain #getColor(FluidVariant, BlockRenderView, BlockPos) the other more general overload}.
* This one will be removed in a future iteration of the API.
*/
@Deprecated(forRemoval = true)
default int getColor(FluidVariant fluidVariant) {
return getColor(fluidVariant, null, null);
}
/**
* Return the color to use when rendering {@linkplain #getSprite the sprite} of this fluid variant.
* Transparency (alpha) will generally be taken into account and should be specified as well.
*
* <p>The world and position are optional context parameters and may be {@code null}.
* If they are null, this method must return a location-independent color.
* If they are provided, this method may return a color that depends on the location.
* For example, water returns the biome-dependent color if the context parameters are specified, or its default color if one of them is null.
*/
default int getColor(FluidVariant fluidVariant, @Nullable BlockRenderView view, @Nullable BlockPos pos) {
// Use the fluid render handler by default.
FluidRenderHandler fluidRenderHandler = FluidRenderHandlerRegistry.INSTANCE.get(fluidVariant.getFluid());
if (fluidRenderHandler != null) {
return fluidRenderHandler.getFluidColor(null, null, fluidVariant.getFluid().getDefaultState());
return fluidRenderHandler.getFluidColor(view, pos, fluidVariant.getFluid().getDefaultState()) | 255 << 24;
} else {
return -1;
}

View file

@ -22,13 +22,16 @@ import java.util.List;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.client.texture.Sprite;
import net.minecraft.fluid.Fluid;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.BlockRenderView;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@ -81,7 +84,17 @@ public class FluidVariantRendering {
}
/**
* Return the tooltip for the passed fluid variant, including the name and additional lines if available
* Return a mutable list: the tooltip for the passed fluid variant, including the name and additional lines if available
* and the id of the fluid if advanced tooltips are enabled.
*
* <p>Compared to {@linkplain #getTooltip(FluidVariant, TooltipContext) the other overload}, the current tooltip context is automatically used.
*/
public static List<Text> getTooltip(FluidVariant fluidVariant) {
return getTooltip(fluidVariant, MinecraftClient.getInstance().options.advancedItemTooltips ? TooltipContext.Default.ADVANCED : TooltipContext.Default.NORMAL);
}
/**
* Return a mutable list: the tooltip for the passed fluid variant, including the name and additional lines if available
* and the id of the fluid if advanced tooltips are enabled.
*/
public static List<Text> getTooltip(FluidVariant fluidVariant, TooltipContext context) {
@ -113,10 +126,21 @@ public class FluidVariantRendering {
}
/**
* Return the color that should be used to render {@linkplain #getSprite the sprite} of the passed fluid variant.
* Return the position-independent color that should be used to render {@linkplain #getSprite the sprite} of the passed fluid variant.
*/
public static int getColor(FluidVariant fluidVariant) {
return getHandlerOrDefault(fluidVariant.getFluid()).getColor(fluidVariant);
return getColor(fluidVariant, null, null);
}
/**
* Return the color that should be used when rendering {@linkplain #getSprite the sprite} of the passed fluid variant.
*
* <p>If the world and the position parameters are null, a position-independent color is returned.
* If the world and position parameters are not null, the color may depend on the position.
* For example, if world and position are passed, water will use them to return a biome-dependent color.
*/
public static int getColor(FluidVariant fluidVariant, @Nullable BlockRenderView view, @Nullable BlockPos pos) {
return getHandlerOrDefault(fluidVariant.getFluid()).getColor(fluidVariant, view, pos);
}
/**

View file

@ -0,0 +1,89 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.test.transfer.ingame.client;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.BufferBuilder;
import net.minecraft.client.render.BufferRenderer;
import net.minecraft.client.render.GameRenderer;
import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.texture.Sprite;
import net.minecraft.client.texture.SpriteAtlasTexture;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.fluid.Fluids;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Matrix4f;
import net.minecraft.world.World;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
import net.fabricmc.fabric.api.transfer.v1.client.fluid.FluidVariantRendering;
import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant;
/**
* Renders the water sprite in the top left of the screen, to make sure that it correctly depends on the position.
*/
public class FluidVariantRenderTest implements ClientModInitializer {
@Override
public void onInitializeClient() {
HudRenderCallback.EVENT.register((matrices, tickDelta) -> {
PlayerEntity player = MinecraftClient.getInstance().player;
if (player == null) return;
drawFluidInGui(matrices, FluidVariant.of(Fluids.WATER), player.world, player.getBlockPos(), 0, 0);
});
}
private static void drawFluidInGui(MatrixStack ms, FluidVariant fluid, World world, BlockPos pos, int i, int j) {
RenderSystem.setShaderTexture(0, SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE);
Sprite sprite = FluidVariantRendering.getSprite(fluid);
int color = FluidVariantRendering.getColor(fluid, world, pos);
if (sprite == null) return;
float r = ((color >> 16) & 255) / 255f;
float g = ((color >> 8) & 255) / 255f;
float b = (color & 255) / 255f;
RenderSystem.disableDepthTest();
RenderSystem.setShader(GameRenderer::getPositionColorTexShader);
BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer();
bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR_TEXTURE);
float x0 = (float) i;
float y0 = (float) j;
float x1 = x0 + 16;
float y1 = y0 + 16;
float z = 0.5f;
float u0 = sprite.getMinU();
float v0 = sprite.getMinV();
float u1 = sprite.getMaxU();
float v1 = sprite.getMaxV();
Matrix4f model = ms.peek().getModel();
bufferBuilder.vertex(model, x0, y1, z).color(r, g, b, 1).texture(u0, v1).next();
bufferBuilder.vertex(model, x1, y1, z).color(r, g, b, 1).texture(u1, v1).next();
bufferBuilder.vertex(model, x1, y0, z).color(r, g, b, 1).texture(u1, v0).next();
bufferBuilder.vertex(model, x0, y0, z).color(r, g, b, 1).texture(u0, v0).next();
bufferBuilder.end();
BufferRenderer.draw(bufferBuilder);
RenderSystem.enableDepthTest();
}
}

View file

@ -12,6 +12,9 @@
"main": [
"net.fabricmc.fabric.test.transfer.ingame.TransferTestInitializer",
"net.fabricmc.fabric.test.transfer.unittests.UnitTestsInitializer"
],
"client": [
"net.fabricmc.fabric.test.transfer.ingame.client.FluidVariantRenderTest"
]
}
}