Skip to content

Commit

Permalink
Fixed ping overlay
Browse files Browse the repository at this point in the history
Offscreen ping is still WIP
  • Loading branch information
GirafiStudios committed Feb 7, 2020
1 parent c904199 commit 076432d
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 68 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
minecraft_version=1.15.2
forge_version=31.0.1
forge_version=31.1.0
mappings=20200127-1.15.1
mod_version=1.6.4

Expand Down
82 changes: 38 additions & 44 deletions src/main/java/dmillerw/ping/client/PingHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.event.EntityViewRenderEvent;
import net.minecraftforge.client.event.RenderBlockOverlayEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.event.TickEvent;
Expand All @@ -46,8 +45,7 @@
public class PingHandler {
public static final PingHandler INSTANCE = new PingHandler();
public static final ResourceLocation TEXTURE = new ResourceLocation(Ping.MOD_ID, "textures/ping.png");
public static final RenderType PING_TYPE = PingRenderType.getPingIcon(TEXTURE);
private static List<PingWrapper> active_pings = new ArrayList<>();
private static List<PingWrapper> activePings = new ArrayList<>();

public void onPingPacket(ServerBroadcastPing packet) {
Minecraft mc = Minecraft.getInstance();
Expand All @@ -56,18 +54,16 @@ public void onPingPacket(ServerBroadcastPing packet) {
mc.getSoundHandler().play(new SimpleSound(PingSounds.BLOOP, SoundCategory.PLAYERS, 0.25F, 1.0F, packet.ping.pos.getX(), packet.ping.pos.getY(), packet.ping.pos.getZ()));
}
packet.ping.timer = Config.GENERAL.pingDuration.get();
active_pings.add(packet.ping);
activePings.add(packet.ping);
}
}

@SubscribeEvent
public static void onRenderWorld(RenderWorldLastEvent event) {
Minecraft mc = Minecraft.getInstance();
Entity renderEntity = mc.getRenderViewEntity();
if (renderEntity == null || active_pings.isEmpty()) return;
double interpX = renderEntity.prevPosX + (renderEntity.getPosX() - renderEntity.prevPosX) * event.getPartialTicks();
double interpY = (renderEntity.prevPosY + (renderEntity.getPosY() - renderEntity.prevPosY) * event.getPartialTicks()) + 1;
double interpZ = renderEntity.prevPosZ + (renderEntity.getPosZ() - renderEntity.prevPosZ) * event.getPartialTicks();
if (renderEntity == null || activePings.isEmpty()) return;
Vec3d staticPos = TileEntityRendererDispatcher.instance.renderInfo.getProjectedView();
ActiveRenderInfo renderInfo = TileEntityRendererDispatcher.instance.renderInfo;

MatrixStack projectionLook = new MatrixStack();
Expand All @@ -81,32 +77,31 @@ public static void onRenderWorld(RenderWorldLastEvent event) {
entityLocation.getLast().getPositionMatrix().multiply(mc.gameRenderer.getProjectionMatrix(renderInfo, event.getPartialTicks(), true));

ClippingHelperImpl clippingHelper = new ClippingHelperImpl(projectionLook.getLast().getPositionMatrix(), entityLocation.getLast().getPositionMatrix());
clippingHelper.setCameraPosition(interpX, interpY, interpZ);
clippingHelper.setCameraPosition(staticPos.getX(), staticPos.getY(), staticPos.getZ());

for (PingWrapper ping : active_pings) {
double px = ping.pos.getX() + 0.5D - interpX;
double py = ping.pos.getY() + 0.5D - interpY + 1 - renderEntity.getEyeHeight();
double pz = ping.pos.getZ() + 0.5D - interpZ;
for (PingWrapper ping : activePings) {
double px = ping.pos.getX() + 0.5D - staticPos.getX();
double py = ping.pos.getY() + 0.5D - staticPos.getY();
double pz = ping.pos.getZ() + 0.5D - staticPos.getZ();

//if (clippingHelper.isBoundingBoxInFrustum(ping.getAABB())) {
if (clippingHelper.isBoundingBoxInFrustum(ping.getAABB())) {
ping.isOffscreen = false;
if (Config.VISUAL.blockOverlay.get()) {
Vec3d staticPos = TileEntityRendererDispatcher.instance.renderInfo.getProjectedView();
renderPingOverlay(ping.pos.getX() - staticPos.getX(), ping.pos.getY() - staticPos.getY(), ping.pos.getZ() - staticPos.getZ(), event.getMatrixStack(), ping);
}
renderPing(px, py, pz, event.getMatrixStack(), renderEntity, ping);
/*} else {
} else {
ping.isOffscreen = true;
translatePingCoordinates(px, py, pz, ping);
}*/
}
}
}

@SubscribeEvent
public static void renderPingOffscreen(RenderGameOverlayEvent.Post event) {
Minecraft mc = Minecraft.getInstance();
if (event.getType() == RenderGameOverlayEvent.ElementType.TEXT) {
for (PingWrapper ping : active_pings) {
for (PingWrapper ping : activePings) {
if (!ping.isOffscreen || mc.currentScreen != null || mc.gameSettings.showDebugInfo) {
continue;
}
Expand Down Expand Up @@ -154,10 +149,9 @@ public static void renderPingOffscreen(RenderGameOverlayEvent.Post event) {
matrixStack.push();
MatrixStack.Entry matrixEntry = matrixStack.getLast();
Matrix4f matrix4f = matrixEntry.getPositionMatrix();
RenderType pingOffset = null; //TODO
RenderType pingType = PingRenderType.getPingIcon(TEXTURE);
IRenderTypeBuffer.Impl buffer = mc.getRenderTypeBuffers().getBufferSource();
IVertexBuilder vertexBuilder = buffer.getBuffer(pingOffset);
Minecraft.getInstance().textureManager.bindTexture(TEXTURE);
IVertexBuilder vertexBuilder = buffer.getBuffer(pingType);

matrixStack.translate(pingX / 2, pingY / 2, 0);

Expand All @@ -168,18 +162,18 @@ public static void renderPingOffscreen(RenderGameOverlayEvent.Post event) {
int r = ping.color >> 16 & 255;
int g = ping.color >> 8 & 255;
int b = ping.color & 255;
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, min, max, PingType.BACKGROUND.minU, PingType.BACKGROUND.maxV, r, g, b, 255);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, max, max, PingType.BACKGROUND.maxU, PingType.BACKGROUND.maxV, r, g, b, 255);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, max, min, PingType.BACKGROUND.maxU, PingType.BACKGROUND.minV, r, g, b, 255);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, min, min, PingType.BACKGROUND.minU, PingType.BACKGROUND.minV, r, g, b, 255);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, min, max, PingType.BACKGROUND.getMinU(), PingType.BACKGROUND.getMaxV(), r, g, b, 255);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, max, max, PingType.BACKGROUND.getMaxU(), PingType.BACKGROUND.getMaxV(), r, g, b, 255);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, max, min, PingType.BACKGROUND.getMaxU(), PingType.BACKGROUND.getMinV(), r, g, b, 255);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, min, min, PingType.BACKGROUND.getMinU(), PingType.BACKGROUND.getMinV(), r, g, b, 255);

// Ping Notice Icon
int alpha = ping.type == PingType.ALERT ? (int) (mc.world != null ? (1.3F + Math.sin(mc.world.getDayTime())) : 173) : 173;
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, min, max, ping.type.minU, ping.type.maxV, 255, 255, 255, alpha);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, max, max, ping.type.maxU, ping.type.maxV, 255, 255, 255, alpha);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, max, min, ping.type.maxU, ping.type.minV, 255, 255, 255, alpha);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, min, min, ping.type.minU, ping.type.minV, 255, 255, 255, alpha);
buffer.finish(pingOffset);
float alpha = ping.type == PingType.ALERT ? mc.world != null ? (float) (1.0F + (0.01D * Math.sin(mc.world.getDayTime()))) : 0.85F : 0.85F;
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, min, max, ping.type.getMinU(), ping.type.getMaxV(), 1.0F, 1.0F, 1.0F, alpha);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, max, max, ping.type.getMaxU(), ping.type.getMaxV(), 1.0F, 1.0F, 1.0F, alpha);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, max, min, ping.type.getMaxU(), ping.type.getMinV(), 1.0F, 1.0F, 1.0F, alpha);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, min, min, ping.type.getMinU(), ping.type.getMinV(), 1.0F, 1.0F, 1.0F, alpha);
buffer.finish(pingType);

matrixStack.translate(0, 0, 0);

Expand All @@ -188,10 +182,9 @@ public static void renderPingOffscreen(RenderGameOverlayEvent.Post event) {
}
}


@SubscribeEvent
public static void onClientTick(TickEvent.ClientTickEvent event) {
Iterator<PingWrapper> iterator = active_pings.iterator();
Iterator<PingWrapper> iterator = activePings.iterator();
while (iterator.hasNext()) {
PingWrapper pingWrapper = iterator.next();
if (pingWrapper.animationTimer > 0) {
Expand All @@ -216,7 +209,8 @@ private static void renderPing(double px, double py, double pz, MatrixStack matr
MatrixStack.Entry matrixEntry = matrixStack.getLast();
Matrix4f matrix4f = matrixEntry.getPositionMatrix();
IRenderTypeBuffer.Impl buffer = mc.getRenderTypeBuffers().getBufferSource();
IVertexBuilder vertexBuilder = buffer.getBuffer(PING_TYPE);
RenderType pingType = PingRenderType.getPingIcon(TEXTURE);
IVertexBuilder vertexBuilder = buffer.getBuffer(pingType);

float min = -0.25F - (0.25F * (float) ping.animationTimer / 20F);
float max = 0.25F + (0.25F * (float) ping.animationTimer / 20F);
Expand All @@ -225,18 +219,18 @@ private static void renderPing(double px, double py, double pz, MatrixStack matr
int r = ping.color >> 16 & 255;
int g = ping.color >> 8 & 255;
int b = ping.color & 255;
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, min, max, PingType.BACKGROUND.minU, PingType.BACKGROUND.maxV, r, g, b, 255);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, max, max, PingType.BACKGROUND.minU, PingType.BACKGROUND.maxV, r, g, b, 255);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, max, min, PingType.BACKGROUND.minU, PingType.BACKGROUND.maxV, r, g, b, 255);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, min, min, PingType.BACKGROUND.minU, PingType.BACKGROUND.maxV, r, g, b, 255);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, min, max, PingType.BACKGROUND.getMinU(), PingType.BACKGROUND.getMaxV(), r, g, b, 255);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, max, max, PingType.BACKGROUND.getMaxU(), PingType.BACKGROUND.getMaxV(), r, g, b, 255);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, max, min, PingType.BACKGROUND.getMaxU(), PingType.BACKGROUND.getMinV(), r, g, b, 255);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, min, min, PingType.BACKGROUND.getMinU(), PingType.BACKGROUND.getMinV(), r, g, b, 255);

// Block Overlay Icon
int alpha = ping.type == PingType.ALERT ? (int) (mc.world != null ? (1.3F + Math.sin(mc.world.getDayTime())) : 173) : 173;
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, min, max, ping.type.minU, ping.type.maxV, 255, 255, 255, alpha);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, max, max, ping.type.minU, ping.type.maxV, 255, 255, 255, alpha);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, max, min, ping.type.minU, ping.type.maxV, 255, 255, 255, alpha);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, min, min, ping.type.minU, ping.type.maxV, 255, 255, 255, alpha);
buffer.finish(PING_TYPE);
float alpha = ping.type == PingType.ALERT ? mc.world != null ? (float) (1.0F + (0.01D * Math.sin(mc.world.getDayTime()))) : 0.85F : 0.85F;
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, min, max, ping.type.getMinU(), ping.type.getMaxV(), 1.0F, 1.0F, 1.0F, alpha);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, max, max, ping.type.getMaxU(), ping.type.getMaxV(), 1.0F, 1.0F, 1.0F, alpha);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, max, min, ping.type.getMaxU(), ping.type.getMinV(), 1.0F, 1.0F, 1.0F, alpha);
VertexHelper.renderPosTexColorNoZ(vertexBuilder, matrix4f, min, min, ping.type.getMinU(), ping.type.getMinV(), 1.0F, 1.0F, 1.0F, alpha);
buffer.finish(pingType);

matrixStack.pop();
}
Expand Down
9 changes: 2 additions & 7 deletions src/main/java/dmillerw/ping/client/PingRenderType.java
Original file line number Diff line number Diff line change
@@ -1,30 +1,25 @@
package dmillerw.ping.client;

import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.renderer.RenderState;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.util.ResourceLocation;

public class PingRenderType extends RenderState {
protected static final RenderState.TransparencyState OVERLAY_TRANSPARENCY = new RenderState.TransparencyState("overlay_transparency", () -> {
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
}, RenderSystem::disableBlend);
protected static final RenderState.LayerState DISABLE_DEPTH = new RenderState.LayerState("disable_depth", GlStateManager::disableDepthTest, GlStateManager::enableDepthTest);

public PingRenderType(String string, Runnable r, Runnable r1) {
super(string, r, r1);
}

public static RenderType getPingOverlay() {
RenderType.State renderTypeState = RenderType.State.builder().transparency(OVERLAY_TRANSPARENCY).texture(BLOCK_SHEET).layer(DISABLE_DEPTH).build(true);
RenderType.State renderTypeState = RenderType.State.builder().transparency(TRANSLUCENT_TRANSPARENCY).texture(BLOCK_SHEET).layer(DISABLE_DEPTH).build(true);
return RenderType.get("ping_overlay", DefaultVertexFormats.POSITION_TEX_COLOR, 7, 262144, true, true, renderTypeState);
}

public static RenderType getPingIcon(ResourceLocation location) {
RenderType.State renderTypeState = RenderType.State.builder().texture(new RenderState.TextureState(location, false, false)).layer(DISABLE_DEPTH).build(true);
RenderType.State renderTypeState = RenderType.State.builder().texture(new RenderState.TextureState(location, false, true)).transparency(TRANSLUCENT_TRANSPARENCY).layer(DISABLE_DEPTH).build(true);
return RenderType.get("ping_icon", DefaultVertexFormats.POSITION_TEX_COLOR, 7, 262144, true, true, renderTypeState);
}
}
16 changes: 8 additions & 8 deletions src/main/java/dmillerw/ping/client/RenderHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -104,18 +104,18 @@ private static void renderGui() {
g = Config.VISUAL.pingG.get();
b = Config.VISUAL.pingB.get();
}
bufferBuilder.pos(drawX + min, drawY + max, 0).tex(PingType.BACKGROUND.minU, PingType.BACKGROUND.maxV).color(r, g, b, 255).endVertex();
bufferBuilder.pos(drawX + max, drawY + max, 0).tex(PingType.BACKGROUND.maxU, PingType.BACKGROUND.maxV).color(r, g, b, 255).endVertex();
bufferBuilder.pos(drawX + max, drawY + min, 0).tex(PingType.BACKGROUND.maxU, PingType.BACKGROUND.minV).color(r, g, b, 255).endVertex();
bufferBuilder.pos(drawX + min, drawY + min, 0).tex(PingType.BACKGROUND.minU, PingType.BACKGROUND.minV).color(r, g, b, 255).endVertex();
bufferBuilder.pos(drawX + min, drawY + max, 0).tex(PingType.BACKGROUND.getMinU(), PingType.BACKGROUND.getMaxV()).color(r, g, b, 255).endVertex();
bufferBuilder.pos(drawX + max, drawY + max, 0).tex(PingType.BACKGROUND.getMaxU(), PingType.BACKGROUND.getMaxV()).color(r, g, b, 255).endVertex();
bufferBuilder.pos(drawX + max, drawY + min, 0).tex(PingType.BACKGROUND.getMaxU(), PingType.BACKGROUND.getMinV()).color(r, g, b, 255).endVertex();
bufferBuilder.pos(drawX + min, drawY + min, 0).tex(PingType.BACKGROUND.getMinU(), PingType.BACKGROUND.getMinV()).color(r, g, b, 255).endVertex();
tessellator.draw();

// Button Icon
bufferBuilder.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
bufferBuilder.pos(drawX + min, drawY + max, 0).tex(type.minU, type.maxV).color(255, 255, 255, 255).endVertex();
bufferBuilder.pos(drawX + max, drawY + max, 0).tex(type.maxU, type.maxV).color(255, 255, 255, 255).endVertex();
bufferBuilder.pos(drawX + max, drawY + min, 0).tex(type.maxU, type.minV).color(255, 255, 255, 255).endVertex();
bufferBuilder.pos(drawX + min, drawY + min, 0).tex(type.minU, type.minV).color(255, 255, 255, 255).endVertex();
bufferBuilder.pos(drawX + min, drawY + max, 0).tex(type.getMinU(), type.getMaxV()).color(255, 255, 255, 255).endVertex();
bufferBuilder.pos(drawX + max, drawY + max, 0).tex(type.getMaxU(), type.getMaxV()).color(255, 255, 255, 255).endVertex();
bufferBuilder.pos(drawX + max, drawY + min, 0).tex(type.getMaxU(), type.getMinV()).color(255, 255, 255, 255).endVertex();
bufferBuilder.pos(drawX + min, drawY + min, 0).tex(type.getMinU(), type.getMinV()).color(255, 255, 255, 255).endVertex();
tessellator.draw();
}
}
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/dmillerw/ping/client/util/PingRenderHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
import com.mojang.blaze3d.vertex.IVertexBuilder;
import dmillerw.ping.client.PingRenderType;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.*;
import net.minecraft.client.renderer.texture.AtlasTexture;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;

public class PingRenderHelper {
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/dmillerw/ping/client/util/VertexHelper.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package dmillerw.ping.client.util;

import com.mojang.blaze3d.vertex.IVertexBuilder;
import net.minecraft.client.renderer.Matrix3f;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.texture.OverlayTexture;

public class VertexHelper {

Expand All @@ -14,4 +12,8 @@ public static void renderPosTexColor(IVertexBuilder builder, Matrix4f matrix4f,
public static void renderPosTexColorNoZ(IVertexBuilder builder, Matrix4f matrix4f, float x, float y, float u, float v, int r, int g, int b, int a) {
builder.pos(matrix4f, x, y, 0).tex(u, v).color(r, g, b, a).endVertex();
}

public static void renderPosTexColorNoZ(IVertexBuilder builder, Matrix4f matrix4f, float x, float y, float u, float v, float r, float g, float b, float a) {
builder.pos(matrix4f, x, y, 0).tex(u, v).color(r, g, b, a).endVertex();
}
}
24 changes: 20 additions & 4 deletions src/main/java/dmillerw/ping/data/PingType.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ public enum PingType {
LOOK,
GOTO;

public final float minU;
public final float minV;
public final float maxU;
public final float maxV;
private final float minU;
private final float minV;
private final float maxU;
private final float maxV;

PingType() {
int x = 32 * ordinal();
Expand All @@ -22,4 +22,20 @@ public enum PingType {
this.minV = (float) y / (float) 256 + f1;
this.maxV = (float) (y + 32) / (float) 256 - f1;
}

public float getMinU() {
return minU;
}

public float getMinV() {
return minV;
}

public float getMaxU() {
return maxU;
}

public float getMaxV() {
return maxV;
}
}

0 comments on commit 076432d

Please sign in to comment.