mirror of
https://github.com/GTNewHorizons/Angelica.git
synced 2026-11-12 00:17:54 +00:00
187 lines
6.3 KiB
Java
187 lines
6.3 KiB
Java
package net.coderbot.iris.pipeline;
|
|
|
|
import com.gtnewhorizons.angelica.compat.mojang.Camera;
|
|
import com.gtnewhorizons.angelica.compat.mojang.GameModeUtil;
|
|
import com.gtnewhorizons.angelica.compat.mojang.InteractionHand;
|
|
import com.gtnewhorizons.angelica.glsm.GLStateManager;
|
|
import com.gtnewhorizons.angelica.rendering.RenderingState;
|
|
import com.gtnewhorizons.angelica.rendering.celeritas.BlockRenderLayer;
|
|
import net.coderbot.iris.block_rendering.BlockRenderingSettings;
|
|
import net.coderbot.iris.layer.GbufferPrograms;
|
|
import net.irisshaders.iris.api.v0.IrisApi;
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.renderer.RenderGlobal;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemBlock;
|
|
import net.minecraft.item.ItemStack;
|
|
import org.lwjgl.opengl.GL11;
|
|
import org.lwjgl.util.glu.Project;
|
|
|
|
import java.util.Map;
|
|
|
|
public class HandRenderer {
|
|
public static final HandRenderer INSTANCE = new HandRenderer();
|
|
|
|
private boolean ACTIVE;
|
|
private boolean renderingSolid;
|
|
public static final float DEPTH = 0.125F;
|
|
|
|
private void setupGlState(RenderGlobal gameRenderer, Camera camera, float tickDelta) {
|
|
final Minecraft mc = Minecraft.getMinecraft();
|
|
|
|
GL11.glMatrixMode(GL11.GL_PROJECTION);
|
|
GL11.glLoadIdentity();
|
|
// We need to scale the matrix by 0.125 so the hand doesn't clip through blocks.
|
|
GL11.glScalef(1.0F, 1.0F, DEPTH);
|
|
|
|
// TODO: Anaglyph
|
|
/*if (this.mc.gameSettings.anaglyph) {
|
|
GL11.glTranslatef((float) (-(anaglyphChannel * 2 - 1)) * 0.07F, 0.0F, 0.0F);
|
|
}*/
|
|
|
|
if (mc.entityRenderer.cameraZoom != 1.0D) {
|
|
GL11.glTranslatef((float) mc.entityRenderer.cameraYaw, (float) (-mc.entityRenderer.cameraPitch), 0.0F);
|
|
GL11.glScaled(mc.entityRenderer.cameraZoom, mc.entityRenderer.cameraZoom, 1.0D);
|
|
}
|
|
|
|
Project.gluPerspective(mc.entityRenderer.getFOVModifier(tickDelta, false), (float) mc.displayWidth / (float) mc.displayHeight, 0.05F, mc.entityRenderer.farPlaneDistance * 2.0F);
|
|
|
|
|
|
if (mc.playerController.enableEverythingIsScrewedUpMode()) {
|
|
GL11.glScalef(1.0F, 2 / 3f, 1.0F);
|
|
}
|
|
|
|
GL11.glMatrixMode(GL11.GL_MODELVIEW);
|
|
GL11.glLoadIdentity();
|
|
|
|
// TODO: Anaglyph
|
|
/*if (mc.gameSettings.anaglyph) {
|
|
GL11.glTranslatef((float) (anaglyphChannel * 2 - 1) * 0.1F, 0.0F, 0.0F);
|
|
}*/
|
|
|
|
mc.entityRenderer.hurtCameraEffect(tickDelta);
|
|
|
|
if (mc.gameSettings.viewBobbing) {
|
|
mc.entityRenderer.setupViewBobbing(tickDelta);
|
|
}
|
|
}
|
|
|
|
private boolean canRender(Camera camera, RenderGlobal gameRenderer) {
|
|
Minecraft mc = Minecraft.getMinecraft();
|
|
|
|
return mc.entityRenderer.debugViewDirection <= 0 &&
|
|
mc.gameSettings.thirdPersonView == 0 &&
|
|
!camera.getEntity().isPlayerSleeping() &&
|
|
!mc.gameSettings.hideGUI &&
|
|
!GameModeUtil.isSpectator() &&
|
|
!mc.playerController.enableEverythingIsScrewedUpMode();
|
|
}
|
|
|
|
public boolean isHandTranslucent(InteractionHand hand) {
|
|
ItemStack heldItem = hand.getItemInHand(Minecraft.getMinecraft().thePlayer);
|
|
|
|
if (heldItem == null) return false;
|
|
final Item item = heldItem.getItem();
|
|
|
|
if (item instanceof ItemBlock itemBlock) {
|
|
final Map<Block, BlockRenderLayer> blockTypeIds = BlockRenderingSettings.INSTANCE.getBlockTypeIds();
|
|
return blockTypeIds != null && blockTypeIds.get(itemBlock.field_150939_a) == BlockRenderLayer.TRANSLUCENT;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public boolean isAnyHandTranslucent() {
|
|
return isHandTranslucent(InteractionHand.MAIN_HAND) || isHandTranslucent(InteractionHand.OFF_HAND);
|
|
}
|
|
|
|
public void renderSolid(float tickDelta, Camera camera, RenderGlobal gameRenderer, WorldRenderingPipeline pipeline) {
|
|
if (!canRender(camera, gameRenderer) || !IrisApi.getInstance().isShaderPackInUse()) {
|
|
return;
|
|
}
|
|
Minecraft mc = Minecraft.getMinecraft();
|
|
|
|
ACTIVE = true;
|
|
|
|
pipeline.setPhase(WorldRenderingPhase.HAND_SOLID);
|
|
|
|
GL11.glPushMatrix();
|
|
GL11.glDepthMask(true); // actually write to the depth buffer, it's normally disabled at this point
|
|
|
|
mc.mcProfiler.startSection("iris_hand");
|
|
|
|
setupGlState(gameRenderer, camera, tickDelta);
|
|
|
|
GbufferPrograms.setBlockEntityDefaults();
|
|
|
|
renderingSolid = true;
|
|
mc.entityRenderer.enableLightmap(tickDelta);
|
|
mc.entityRenderer.itemRenderer.renderItemInFirstPerson(tickDelta);
|
|
mc.entityRenderer.disableLightmap(tickDelta);
|
|
|
|
GLStateManager.defaultBlendFunc();
|
|
GL11.glDepthMask(false);
|
|
GL11.glPopMatrix();
|
|
|
|
mc.mcProfiler.endSection();
|
|
|
|
resetProjectionMatrix();
|
|
|
|
renderingSolid = false;
|
|
|
|
pipeline.setPhase(WorldRenderingPhase.NONE);
|
|
|
|
ACTIVE = false;
|
|
}
|
|
|
|
// TODO: RenderType
|
|
public void renderTranslucent(float tickDelta, Camera camera, RenderGlobal gameRenderer, WorldRenderingPipeline pipeline) {
|
|
if (!canRender(camera, gameRenderer) || !isAnyHandTranslucent() || !IrisApi.getInstance().isShaderPackInUse()) {
|
|
return;
|
|
}
|
|
Minecraft mc = Minecraft.getMinecraft();
|
|
|
|
ACTIVE = true;
|
|
|
|
pipeline.setPhase(WorldRenderingPhase.HAND_TRANSLUCENT);
|
|
|
|
GL11.glPushMatrix();
|
|
|
|
mc.mcProfiler.startSection("iris_hand_translucent");
|
|
|
|
setupGlState(gameRenderer, camera, tickDelta);
|
|
|
|
GbufferPrograms.setBlockEntityDefaults();
|
|
|
|
mc.entityRenderer.enableLightmap(tickDelta);
|
|
mc.entityRenderer.itemRenderer.renderItemInFirstPerson(tickDelta);
|
|
mc.entityRenderer.disableLightmap(tickDelta);
|
|
|
|
GL11.glPopMatrix();
|
|
|
|
resetProjectionMatrix();
|
|
|
|
Minecraft.getMinecraft().mcProfiler.endSection();
|
|
|
|
pipeline.setPhase(WorldRenderingPhase.NONE);
|
|
|
|
ACTIVE = false;
|
|
}
|
|
|
|
private void resetProjectionMatrix() {
|
|
GL11.glMatrixMode(GL11.GL_PROJECTION);
|
|
GL11.glLoadIdentity();
|
|
GL11.glMultMatrix(RenderingState.INSTANCE.getProjectionBuffer());
|
|
GL11.glMatrixMode(GL11.GL_MODELVIEW);
|
|
}
|
|
|
|
public boolean isActive() {
|
|
return ACTIVE;
|
|
}
|
|
|
|
public boolean isRenderingSolid() {
|
|
return renderingSolid;
|
|
}
|
|
}
|