Skip to content

Commit

Permalink
render refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
KrLite committed Mar 9, 2024
1 parent 5418e51 commit c0a1db0
Show file tree
Hide file tree
Showing 11 changed files with 161 additions and 85 deletions.
16 changes: 7 additions & 9 deletions src/main/java/net/krlite/knowledges/KnowledgesClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@
import me.shedaniel.autoconfig.serializer.PartitioningSerializer;
import me.shedaniel.autoconfig.serializer.Toml4jConfigSerializer;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer;
import net.krlite.knowledges.api.entrypoint.ComponentProvider;
import net.krlite.knowledges.api.entrypoint.DataProvider;
import net.krlite.knowledges.api.representable.Representable;
import net.krlite.knowledges.impl.component.AbstractInfoComponent;
import net.krlite.knowledges.config.KnowledgesConfig;
import net.krlite.knowledges.manager.KnowledgesComponentManager;
Expand All @@ -33,6 +35,7 @@ public class KnowledgesClient implements ClientModInitializer {

public static final KnowledgesComponentManager COMPONENTS = new KnowledgesComponentManager();
public static final KnowledgesDataManager DATA = new KnowledgesDataManager();
public static final KnowledgesHud HUD = new KnowledgesHud();

static {
AutoConfig.register(KnowledgesConfig.class, PartitioningSerializer.wrap(Toml4jConfigSerializer::new));
Expand All @@ -48,15 +51,6 @@ public static MutableText localize(String category, String... paths) {
return Text.translatable(localizationKey(category, paths));
}

public static void render(
@NotNull DrawContext context, @NotNull MinecraftClient client,
@NotNull PlayerEntity player, @NotNull ClientWorld world
) {
COMPONENTS.asList().forEach(knowledge -> {
if (COMPONENTS.isEnabled(knowledge)) knowledge.render(context, client, player, world);
});
}

@Override
public void onInitializeClient() {
AbstractInfoComponent.Animation.registerEvents();
Expand Down Expand Up @@ -140,5 +134,9 @@ public void onInitializeClient() {
COMPONENTS.asList().size() + DATA.asList().size() <= 1 ? "It makes" : "They make"
));
}

HudRenderCallback.EVENT.register(((context, tickDelta) -> {
HUD.render(context, COMPONENTS::render);
}));
}
}
67 changes: 67 additions & 0 deletions src/main/java/net/krlite/knowledges/KnowledgesHud.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package net.krlite.knowledges;

import com.mojang.blaze3d.systems.RenderSystem;
import net.krlite.equator.render.frame.FrameInfo;
import net.krlite.knowledges.api.component.Knowledge;
import net.krlite.knowledges.api.representable.Representable;
import net.krlite.knowledges.mixin.client.InGameHudInvoker;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.GameRenderer;
import net.minecraft.world.GameMode;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Optional;
import java.util.function.Consumer;

public class KnowledgesHud {
@Nullable
private Representable<?> representable;

public void setRepresentable(@NotNull Representable<?> representable) {
this.representable = representable;
}

public void clearRepresentable() {
this.representable = null;
}

public Optional<Representable<?>> getRepresentable() {
return Optional.ofNullable(representable);
}

public void render(DrawContext context, Consumer<Representable<?>> renderConsumer) {
getRepresentable().ifPresent(rep -> {

RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
RenderSystem.setShader(GameRenderer::getPositionTexProgram);
RenderSystem.enableBlend();

context.getMatrices().push();
context.getMatrices().translate(FrameInfo.scaled().w() / 2, FrameInfo.scaled().h() / 2, 0);

render: {
MinecraftClient client = MinecraftClient.getInstance();
if (client.world == null || client.player == null) break render;

boolean isFirstPerson = client.options.getPerspective().isFirstPerson();
boolean isSpectator = client.interactionManager != null && client.interactionManager.getCurrentGameMode() == GameMode.SPECTATOR;
boolean shouldRenderSpectatorCrosshair = ((InGameHudInvoker) client.inGameHud).invokeShouldRenderSpectatorCrosshair(rep.hitResult());
boolean isInDebugHud = client.getDebugHud().shouldShowDebugHud()
&& !client.options.hudHidden
&& !client.player.hasReducedDebugInfo()
&& !client.options.getReducedDebugInfo().getValue();

if (isFirstPerson
&& (!isSpectator || shouldRenderSpectatorCrosshair)
&& (KnowledgesClient.CONFIG.global.visibleInDebugHud || !isInDebugHud)
) {
renderConsumer.accept(rep);
}
}

context.getMatrices().pop();
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import net.krlite.knowledges.api.core.config.WithIndependentConfigPage;
import net.krlite.knowledges.api.core.localization.Localizable;
import net.krlite.knowledges.api.core.path.WithPath;
import net.krlite.knowledges.api.representable.Representable;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.enums.Instrument;
Expand Down Expand Up @@ -43,6 +44,8 @@
import java.util.Optional;

public interface Knowledge extends WithPath, Localizable.WithName, WithIndependentConfigPage {
void render(@NotNull Representable<?> representable);

@Deprecated
void render(@NotNull DrawContext context, @NotNull MinecraftClient client, @NotNull PlayerEntity player, @NotNull ClientWorld world);

Expand Down
18 changes: 8 additions & 10 deletions src/main/java/net/krlite/knowledges/api/proxy/RenderProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,34 +11,32 @@

public class RenderProxy {
public static class LayoutProxy {
public double scalar() {
public static double scalar() {
return 0.5 + 0.5 * KnowledgesClient.CONFIG.global.mainScalar / 1000.0;
}

public Box crosshairSafeArea() {
public static Box crosshairSafeArea() {
double size = 16 + 8 * KnowledgesClient.CONFIG.global.crosshairSafeAreaScalar / 1000.0;
return Box.UNIT.scale(size)
.scale(scalar())
.center(Vector.ZERO)
.shift(0, -1);
}

public Box screen() {
public static Box screen() {
return FrameInfo.scaled();
}
}

public final LayoutProxy layout = new LayoutProxy();

public void draw(Supplier<Renderable> renderableSupplier) {
public static void draw(Supplier<Renderable> renderableSupplier) {
renderableSupplier.get().render();
}

public void drawAroundCursor(Function<Box, Renderable> renderableFunction) {
draw(() -> renderableFunction.apply(layout.crosshairSafeArea()));
public static void drawAroundCursor(Function<Box, Renderable> renderableFunction) {
draw(() -> renderableFunction.apply(LayoutProxy.crosshairSafeArea()));
}

public void drawInScreen(Function<Box, Renderable> renderableFunction) {
draw(() -> renderableFunction.apply(layout.screen()));
public static void drawInScreen(Function<Box, Renderable> renderableFunction) {
draw(() -> renderableFunction.apply(LayoutProxy.screen()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ public interface BlockRepresentable extends Representable<BlockHitResult> {
Direction side();

@Override
default Class<? extends Representable<BlockHitResult>> type() {
return BlockRepresentable.class;
default HitResult.Type type() {
return HitResult.Type.BLOCK;
}

interface Builder extends Representable.Builder<BlockHitResult, BlockRepresentable, Builder> {
Expand All @@ -35,9 +35,6 @@ default Builder blockEntity(BlockEntity blockEntity) {

Builder blockEntitySupplier(Supplier<BlockEntity> blockEntitySupplier);

@Override
BlockRepresentable build();

static Builder append(Builder builder, BlockRepresentable representable) {
return Representable.Builder.append(builder, representable)
.blockState(representable.blockState())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@

import net.minecraft.entity.Entity;
import net.minecraft.util.hit.EntityHitResult;
import net.minecraft.util.hit.HitResult;

import java.util.function.Supplier;

public interface EntityRepresentable extends Representable<EntityHitResult> {
Entity entity();

@Override
default Class<? extends Representable<EntityHitResult>> type() {
return EntityRepresentable.class;
default HitResult.Type type() {
return HitResult.Type.ENTITY;
}

interface Builder extends Representable.Builder<EntityHitResult, EntityRepresentable, Builder> {
Expand All @@ -20,9 +21,6 @@ default Builder entity(Entity entity) {

Builder entitySupplier(Supplier<Entity> entitySupplier);

@Override
EntityRepresentable build();

static Builder append(Builder builder, EntityRepresentable representable) {
return Representable.Builder.append(builder, representable)
.entity(representable.entity());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public interface Representable<H extends HitResult> {
*/
boolean hasServer();

Class<? extends Representable<H>> type();
HitResult.Type type();

interface Builder<H extends HitResult, R extends Representable<H>, B extends Builder<H, R, B>> {
B hitResult(H hitResult);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package net.krlite.knowledges.impl.representable;

import net.krlite.knowledges.api.representable.Representable;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.util.hit.HitResult;
import net.minecraft.world.World;

public class EmptyRepresentable extends KnowledgesRepresentable<HitResult> implements Representable<HitResult> {
public EmptyRepresentable(Builder builder) {
super(builder);
}

@Override
public HitResult.Type type() {
return HitResult.Type.MISS;
}

public static class Builder extends KnowledgesRepresentable.Builder<HitResult> implements Representable.Builder<HitResult, EmptyRepresentable, Builder> {
@Override
public Builder hitResult(HitResult hitResult) {
this.hitResult = hitResult;
return this;
}

@Override
public Builder world(World world) {
this.world = world;
return this;
}

@Override
public Builder player(PlayerEntity player) {
this.player = player;
return this;
}

@Override
public Builder data(NbtCompound data) {
this.data = data;
return this;
}

@Override
public Builder hasServer(boolean hasServer) {
this.hasServer = hasServer;
return this;
}

@Override
public EmptyRepresentable build() {
return new EmptyRepresentable(this);
}

public static Builder create() {
return new Builder();
}

public static Builder from(EmptyRepresentable representable) {
return Representable.Builder.append(create(), representable);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,19 @@

import net.krlite.knowledges.KnowledgesClient;
import net.krlite.knowledges.api.component.Knowledge;
import net.krlite.knowledges.api.representable.Representable;

public class KnowledgesComponentManager extends KnowledgesManager<Knowledge> {
public KnowledgesComponentManager() {
super(() -> KnowledgesClient.CONFIG.components.disabled);
}

public void render(Representable<?> representable) {
asList().stream()
.filter(this::isEnabled)
.forEach(knowledge -> knowledge.render(representable));
}

@Override
protected String localizationPrefix() {
return "knowledge";
Expand Down

This file was deleted.

1 change: 0 additions & 1 deletion src/main/resources/knowledges.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
"client": [
"client.ClientPlayerInteractionManagerMixin",
"client.InGameHudInvoker",
"client.KnowledgesHud",
"client.MinecraftClientMixin",
"client.clothconfig.BooleanListEntryAccessor",
"client.clothconfig.BooleanListEntryMixin",
Expand Down

0 comments on commit c0a1db0

Please sign in to comment.