Created
July 19, 2022 12:39
-
-
Save Lanse505/c21fe2b44a1f37237121281aa213ee8a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.hrznstudio.matteroverdrive.client.renderer.tile; | |
import com.hrznstudio.matteroverdrive.block.tile.BaseStationTile; | |
import com.hrznstudio.matteroverdrive.client.MOShaders; | |
import com.mojang.blaze3d.platform.GlStateManager; | |
import com.mojang.blaze3d.systems.RenderSystem; | |
import com.mojang.blaze3d.vertex.DefaultVertexFormat; | |
import com.mojang.blaze3d.vertex.PoseStack; | |
import com.mojang.blaze3d.vertex.VertexConsumer; | |
import com.mojang.blaze3d.vertex.VertexFormat; | |
import com.mojang.math.Matrix4f; | |
import com.mojang.math.Vector3f; | |
import net.minecraft.client.Minecraft; | |
import net.minecraft.client.player.LocalPlayer; | |
import net.minecraft.client.renderer.MultiBufferSource; | |
import net.minecraft.client.renderer.RenderStateShard; | |
import net.minecraft.client.renderer.RenderType; | |
import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; | |
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; | |
import net.minecraft.resources.ResourceLocation; | |
import net.minecraft.util.Mth; | |
import java.awt.*; | |
import java.util.Random; | |
import static com.hrznstudio.matteroverdrive.util.MOColorUtil.HOLO_COLOR; | |
import static com.hrznstudio.matteroverdrive.util.MOColorUtil.INVALID_HOLO_COLOR; | |
import static org.lwjgl.opengl.GL11.GL_ONE; | |
public class RenderStation<T extends BaseStationTile<T>> implements BlockEntityRenderer<T> { | |
private static final ResourceLocation glowTexture = new ResourceLocation("matteroverdrive:textures/fx/hologram_beam.png"); | |
private final Random random = new Random(); | |
public static RenderType TYPE = createRenderType(); | |
public static RenderType createRenderType() { | |
RenderType.CompositeState state = RenderType.CompositeState.builder() | |
.setTextureState(new RenderStateShard.TextureStateShard(glowTexture, false, false)) | |
.setTransparencyState(new RenderStateShard.TransparencyStateShard("translucent_transparency", () -> { | |
RenderSystem.enableBlend(); | |
RenderSystem.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE); | |
}, () -> { | |
RenderSystem.disableBlend(); | |
RenderSystem.defaultBlendFunc(); | |
})).setShaderState(new RenderStateShard.ShaderStateShard(() -> MOShaders.renderStationShader)).createCompositeState(false); | |
return RenderType.create("render_station", DefaultVertexFormat.POSITION_TEX_COLOR, VertexFormat.Mode.QUADS, 256, false, true, state); | |
} | |
public RenderStation(BlockEntityRenderDispatcher rendererDispatcherIn) { | |
super(); | |
} | |
private void drawHoloLights(PoseStack stack, MultiBufferSource bufferIn, T tile, double x, double y, double z) { | |
//float lastLightMapX = OpenGlHelper.lastBrightnessX; | |
//float lastLightMapY = OpenGlHelper.lastBrightnessY; | |
//OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240f, 240f); | |
RenderSystem.disableCull(); | |
RenderSystem.depthMask(false); | |
float height = 5.5f * (1f / 16f); | |
float hologramHeight = 1; | |
float offset = 2f * (1f / 16f); | |
float size = 14f * (1f / 16f); | |
float topSize = 2 - 1; | |
stack.pushPose(); | |
stack.translate(0, height, 0); | |
VertexConsumer consumer = bufferIn.getBuffer(TYPE); | |
Color color; | |
if (tile.isUsableByPlayer(Minecraft.getInstance().player)) { | |
color = HOLO_COLOR; | |
} else { | |
color = INVALID_HOLO_COLOR; | |
} | |
float multiply = 0.5f + (tile.getLevel().getGameTime() % (random.nextInt(70) + 1) == 0 ? (0.05f * random.nextFloat()) : 0.05f); | |
Matrix4f matrix = stack.last().pose(); | |
consumer.vertex(matrix, offset, 0, offset).uv(1, 1).color(color.getRed() * multiply / 255f, color.getGreen() * multiply / 255f, color.getBlue() * multiply / 255f, 1.0f).endVertex(); | |
consumer.vertex(matrix,-topSize, height + hologramHeight, -topSize).uv(1, 0).color(color.getRed() * multiply / 255f, color.getGreen() * multiply / 255f, color.getBlue() * multiply / 255f, 1.0f).endVertex(); | |
consumer.vertex(matrix,size + topSize, height + hologramHeight, -topSize).uv(0, 0).color(color.getRed() * multiply / 255f, color.getGreen() * multiply / 255f, color.getBlue() * multiply / 255f, 1.0f).endVertex(); | |
consumer.vertex(matrix,size, 0, offset).uv(0, 1).color(color.getRed() * multiply / 255f, color.getGreen() * multiply / 255f, color.getBlue() * multiply / 255f, 1.0f).endVertex(); | |
consumer.vertex(matrix,size, 0, offset).uv(1, 1).color(color.getRed() * multiply / 255f, color.getGreen() * multiply / 255f, color.getBlue() * multiply / 255f, 1.0f).endVertex(); | |
consumer.vertex(matrix,size + topSize, height + hologramHeight, -topSize).uv(1, 0).color(color.getRed() * multiply / 255f, color.getGreen() * multiply / 255f, color.getBlue() * multiply / 255f, 1.0f).endVertex(); | |
consumer.vertex(matrix,size + topSize, height + hologramHeight, 1 + topSize).uv(0, 0).color(color.getRed() * multiply / 255f, color.getGreen() * multiply / 255f, color.getBlue() * multiply / 255f, 1.0f).endVertex(); | |
consumer.vertex(matrix,size, 0, size).uv(0, 1).color(color.getRed() * multiply / 255f, color.getGreen() * multiply / 255f, color.getBlue() * multiply / 255f, 1.0f).endVertex(); | |
consumer.vertex(matrix,size, 0, size).uv(1, 1).color(color.getRed() * multiply / 255f, color.getGreen() * multiply / 255f, color.getBlue() * multiply / 255f, 1.0f).endVertex(); | |
consumer.vertex(matrix,size + topSize, height + hologramHeight, 1 + topSize).uv(1, 0).color(color.getRed() * multiply / 255f, color.getGreen() * multiply / 255f, color.getBlue() * multiply / 255f, 1.0f).endVertex(); | |
consumer.vertex(matrix,-topSize, height + hologramHeight, 1 + topSize).uv(0, 0).color(color.getRed() * multiply / 255f, color.getGreen() * multiply / 255f, color.getBlue() * multiply / 255f, 1.0f).endVertex(); | |
consumer.vertex(matrix,offset, 0, size).uv(0, 1).color(color.getRed() * multiply / 255f, color.getGreen() * multiply / 255f, color.getBlue() * multiply / 255f, 1.0f).endVertex(); | |
consumer.vertex(matrix,offset, 0, size).uv(1, 1).color(color.getRed() * multiply / 255f, color.getGreen() * multiply / 255f, color.getBlue() * multiply / 255f, 1.0f).endVertex(); | |
consumer.vertex(matrix,-topSize, height + hologramHeight, 1 + topSize).uv(1, 0).color(color.getRed() * multiply / 255f, color.getGreen() * multiply / 255f, color.getBlue() * multiply / 255f, 1.0f).endVertex(); | |
consumer.vertex(matrix,-topSize, height + hologramHeight, -topSize).uv(0, 0).color(color.getRed() * multiply / 255f, color.getGreen() * multiply / 255f, color.getBlue() * multiply / 255f, 1.0f).endVertex(); | |
consumer.vertex(matrix,offset, 0, offset).uv(0, 1).color(color.getRed() * multiply / 255f, color.getGreen() * multiply / 255f, color.getBlue() * multiply / 255f, 1.0f).endVertex(); | |
RenderSystem.enableCull(); | |
RenderSystem.depthMask(false); | |
stack.popPose(); | |
} | |
public void drawHoloText(PoseStack stack, T tile, double x, double y, double z, float partialTicks) { | |
LocalPlayer player = Minecraft.getInstance().player; | |
if (!tile.isUsableByPlayer(player)) { | |
stack.pushPose(); | |
RenderSystem.enableBlend(); | |
RenderSystem.blendFunc(GL_ONE, GL_ONE); | |
stack.translate( 0.5, 0.5, 0.5); | |
stack.mulPose(Vector3f.YP.rotationDegrees(180)); | |
// float playerPosX = (float) Mth.clampedLerp((float) player.xo, (float) player.getX(), partialTicks); | |
// float playerPosZ = (float) Mth.clampedLerp((float) player.zo, (float) player.getZ(), partialTicks); | |
// float angle = (float) Math.toDegrees(Math.atan2(playerPosX - (tile.getBlockPos().getX() + 0.5), playerPosZ - (tile.getBlockPos().getZ() + 0.5)) + Math.PI); | |
stack.mulPose(Vector3f.YP.rotationDegrees(tile.getLevel().getGameTime() % 360)); | |
RenderSystem.disableCull(); | |
stack.mulPose(Vector3f.XP.rotationDegrees(180)); | |
stack.scale(0.02f, 0.02f, 0.02f); | |
String[] info = "Access Denied".split(" "); //TODO Translate | |
for (int i = 0; i < info.length; i++) { | |
int width = Minecraft.getInstance().font.width(info[i]); | |
stack.pushPose(); | |
stack.translate(-width / 2, -32, 0); | |
Minecraft.getInstance().font.draw(stack, info[i], 0, i * 10, INVALID_HOLO_COLOR.getRGB()); | |
stack.popPose(); | |
} | |
RenderSystem.disableBlend(); | |
RenderSystem.enableCull(); | |
stack.popPose(); | |
} | |
} | |
public void drawAdditional(PoseStack stack, MultiBufferSource bufferIn, T tile, double x, double y, double z, float partialTicks) { | |
} | |
@Override | |
public void render(T tile, float partialTicks, PoseStack poseStack, MultiBufferSource buffer, int combinedLightIn, int combinedOverlayIn) { | |
poseStack.pushPose(); | |
drawHoloLights(poseStack, buffer, tile, tile.getBlockPos().getX(), tile.getBlockPos().getY(), tile.getBlockPos().getZ()); | |
drawHoloText(poseStack, tile, tile.getBlockPos().getX(), tile.getBlockPos().getY(), tile.getBlockPos().getZ(), partialTicks); | |
drawAdditional(poseStack, buffer, tile, tile.getBlockPos().getX(), tile.getBlockPos().getY(), tile.getBlockPos().getZ(), partialTicks); | |
poseStack.popPose(); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.hrznstudio.matteroverdrive.client.renderer.tile; | |
import com.hrznstudio.matteroverdrive.MatterOverdrive; | |
import com.hrznstudio.matteroverdrive.block.tile.AndroidStationTile; | |
import com.hrznstudio.matteroverdrive.client.MOShaders; | |
import com.mojang.blaze3d.platform.GlStateManager; | |
import com.mojang.blaze3d.systems.RenderSystem; | |
import com.mojang.blaze3d.vertex.DefaultVertexFormat; | |
import com.mojang.blaze3d.vertex.PoseStack; | |
import com.mojang.blaze3d.vertex.VertexConsumer; | |
import com.mojang.blaze3d.vertex.VertexFormat; | |
import com.mojang.math.Vector3f; | |
import net.minecraft.client.Minecraft; | |
import net.minecraft.client.model.PlayerModel; | |
import net.minecraft.client.model.geom.ModelLayers; | |
import net.minecraft.client.player.LocalPlayer; | |
import net.minecraft.client.renderer.MultiBufferSource; | |
import net.minecraft.client.renderer.RenderStateShard; | |
import net.minecraft.client.renderer.RenderType; | |
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; | |
import net.minecraft.resources.ResourceLocation; | |
public class RenderAndroidStation extends RenderStation<AndroidStationTile> { | |
private static final ResourceLocation location = new ResourceLocation(MatterOverdrive.MOD_ID, "textures/entity/android_colorless.png"); | |
public static RenderType ANDROID = createRenderAndroidType(); | |
public static RenderType createRenderAndroidType() { | |
RenderType.CompositeState state = RenderType.CompositeState.builder().setTextureState(new RenderStateShard.TextureStateShard(location, false, false)).setTransparencyState(new RenderStateShard.TransparencyStateShard("translucent_transparency", () -> { | |
RenderSystem.enableBlend(); | |
RenderSystem.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE); | |
}, () -> { | |
RenderSystem.disableBlend(); | |
RenderSystem.defaultBlendFunc(); | |
})) | |
.setShaderState(new RenderStateShard.ShaderStateShard(() -> MOShaders.androidShader)).createCompositeState(true); | |
return RenderType.create("android_station", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, true, state); | |
} | |
public PlayerModel playerModel; | |
public RenderAndroidStation(BlockEntityRendererProvider.Context rendererContext) { | |
super(rendererContext.getBlockEntityRenderDispatcher()); | |
playerModel = new PlayerModel(rendererContext.bakeLayer(ModelLayers.PLAYER), false); | |
playerModel.young = false; | |
} | |
@Override | |
public void drawAdditional(PoseStack stack, MultiBufferSource bufferIn, AndroidStationTile tile, double x, double y, double z, float partialTicks) { | |
LocalPlayer player = Minecraft.getInstance().player; | |
if (player != null && tile.isUsableByPlayer(player)) { | |
stack.pushPose(); | |
stack.translate(0.5, 2, 0.5); | |
stack.mulPose(Vector3f.XP.rotationDegrees(180)); | |
RenderSystem.disableCull(); | |
RenderSystem.depthMask(false); | |
// RenderSystem.setShaderColor(ReferenceClient.Colors.HOLO.getRed(), ReferenceClient.Colors.HOLO.getGreen(), ReferenceClient.Colors.HOLO.getBlue(), 1.0f); | |
// float playerPosX = (float) Mth.clampedLerp((float) player.xo, (float) player.position().x, partialTicks); | |
// float playerPosZ = (float) Mth.clampedLerp((float) player.zo, (float) player.position().z, partialTicks); | |
// float angle = (float) Math.toDegrees(Math.atan2(playerPosX - (tile.getBlockPos().getX() + 0.5), playerPosZ - (tile.getBlockPos().getZ() + 0.5)) + Math.PI); | |
stack.mulPose(Vector3f.YP.rotationDegrees(180)); | |
stack.mulPose(Vector3f.YN.rotationDegrees(tile.getLevel().getGameTime() % 360)); | |
VertexConsumer consumer = bufferIn.getBuffer(ANDROID); | |
float multiply = 0.35f + (tile.getLevel().getGameTime() % (tile.getLevel().random.nextInt(70) + 1) == 0 ? (0.05f * tile.getLevel().random.nextFloat()) : 0.05f); | |
playerModel.renderToBuffer(stack, consumer ,0, 0, multiply, multiply, multiply, 0.003921569F); | |
RenderSystem.enableCull(); | |
RenderSystem.depthMask(false); | |
stack.popPose(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment