* WIP laser pointer

This commit is contained in:
Nicolas BARBOTIN 2018-01-30 02:11:33 +01:00
parent c6d0f4f183
commit 7184286be7
9 changed files with 194 additions and 20 deletions

View File

@ -65,6 +65,7 @@ public class WebDisplays {
public SoundEvent soundTyping;
public SoundEvent soundUpgradeAdd;
public SoundEvent soundUpgradeDel;
public SoundEvent soundScreenCfg;
//Config
public static final double PAD_RATIO = 59.0 / 30.0;
@ -150,7 +151,10 @@ public class WebDisplays {
soundUpgradeDel = new SoundEvent(new ResourceLocation("webdisplays", "upgradeDel"));
soundUpgradeDel.setRegistryName(soundUpgradeDel.getSoundName());
ev.getRegistry().registerAll(soundTyping, soundUpgradeAdd, soundUpgradeDel);
soundScreenCfg = new SoundEvent(new ResourceLocation("webdisplays", "screencfgOpen"));
soundScreenCfg.setRegistryName(soundScreenCfg.getSoundName());
ev.getRegistry().registerAll(soundTyping, soundUpgradeAdd, soundUpgradeDel, soundScreenCfg);
}
@SubscribeEvent

View File

@ -20,11 +20,10 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumHand;
import net.minecraft.util.EnumHandSide;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.event.RenderSpecificHandEvent;
import net.minecraftforge.client.event.TextureStitchEvent;
import net.minecraftforge.client.event.*;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.client.registry.ClientRegistry;
@ -40,15 +39,13 @@ import net.montoyo.wd.client.gui.GuiScreenConfig;
import net.montoyo.wd.client.gui.GuiSetURL2;
import net.montoyo.wd.client.gui.WDScreen;
import net.montoyo.wd.client.gui.loading.GuiLoader;
import net.montoyo.wd.client.renderers.IModelBaker;
import net.montoyo.wd.client.renderers.MinePadRenderer;
import net.montoyo.wd.client.renderers.ScreenBaker;
import net.montoyo.wd.client.renderers.ScreenRenderer;
import net.montoyo.wd.client.renderers.*;
import net.montoyo.wd.core.DefaultUpgrade;
import net.montoyo.wd.data.GuiData;
import net.montoyo.wd.entity.TileEntityScreen;
import net.montoyo.wd.net.SMessagePadCtrl;
import net.montoyo.wd.utilities.*;
import org.lwjgl.input.Mouse;
import scala.tools.nsc.doc.model.Def;
import java.util.ArrayList;
@ -76,6 +73,7 @@ public class ClientProxy extends SharedProxy implements IResourceManagerReloadLi
private ArrayList<ResourceModelPair> modelBakers = new ArrayList<>();
private net.montoyo.mcef.api.API mcef;
private MinePadRenderer minePadRenderer;
private LaserPointerRenderer laserPointerRenderer;
//Tracking
private ArrayList<TileEntityScreen> screenTracking = new ArrayList<>();
@ -102,6 +100,7 @@ public class ClientProxy extends SharedProxy implements IResourceManagerReloadLi
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityScreen.class, new ScreenRenderer());
mcef = MCEFApi.getAPI();
minePadRenderer = new MinePadRenderer();
laserPointerRenderer = new LaserPointerRenderer();
}
@Override
@ -321,13 +320,31 @@ public class ClientProxy extends SharedProxy implements IResourceManagerReloadLi
@SubscribeEvent
public void onRenderPlayerHand(RenderSpecificHandEvent ev) {
if(ev.getItemStack().getItem() == WebDisplays.INSTANCE.itemMinePad) {
EnumHandSide handSide = mc.player.getPrimaryHand();
if(ev.getHand() == EnumHand.OFF_HAND)
handSide = handSide.opposite();
Item item = ev.getItemStack().getItem();
IItemRenderer renderer;
minePadRenderer.render(ev.getItemStack(), (handSide == EnumHandSide.RIGHT) ? 1.0f : -1.0f, ev.getSwingProgress(), ev.getEquipProgress());
ev.setCanceled(true);
if(item == WebDisplays.INSTANCE.itemMinePad)
renderer = minePadRenderer;
else if(item == WebDisplays.INSTANCE.itemLaserPointer)
renderer = laserPointerRenderer;
else
return;
EnumHandSide handSide = mc.player.getPrimaryHand();
if(ev.getHand() == EnumHand.OFF_HAND)
handSide = handSide.opposite();
renderer.render(ev.getItemStack(), (handSide == EnumHandSide.RIGHT) ? 1.0f : -1.0f, ev.getSwingProgress(), ev.getEquipProgress());
ev.setCanceled(true);
}
@SubscribeEvent
public void onMouseButton(MouseEvent ev) {
if(mc.player != null && mc.player.getHeldItem(EnumHand.MAIN_HAND).getItem() == WebDisplays.INSTANCE.itemLaserPointer) {
if(ev.getButton() == 1) {
//Right button
laserPointerRenderer.isOn = ev.isButtonstate();
}
}
}

View File

@ -4,6 +4,7 @@
package net.montoyo.wd.client.gui;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.util.ResourceLocation;
import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.client.gui.controls.*;
@ -142,6 +143,8 @@ public class GuiScreenConfig extends WDScreen {
updateRights(friendRights, friendRights, friendBoxes, true);
updateRights(otherRights, otherRights, otherBoxes, true);
updateMyRights();
mc.getSoundHandler().playSound(PositionedSoundRecord.getRecord(WebDisplays.INSTANCE.soundScreenCfg, 1.0f, 1.0f));
}
private void addFriend(String name) {

View File

@ -0,0 +1,13 @@
/*
* Copyright (C) 2018 BARBOTIN Nicolas
*/
package net.montoyo.wd.client.renderers;
import net.minecraft.item.ItemStack;
public interface IItemRenderer {
void render(ItemStack is, float handSideSign, float swingProgress, float equipProgress);
}

View File

@ -0,0 +1,132 @@
/*
* Copyright (C) 2018 BARBOTIN Nicolas
*/
package net.montoyo.wd.client.renderers;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.*;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import org.lwjgl.BufferUtils;
import java.nio.FloatBuffer;
import static org.lwjgl.opengl.GL11.*;
@SideOnly(Side.CLIENT)
public final class LaserPointerRenderer implements IItemRenderer {
private static final float PI = (float) Math.PI;
private final Tessellator t = Tessellator.getInstance();
private final BufferBuilder bb = t.getBuffer();
private final Minecraft mc = Minecraft.getMinecraft();
private final FloatBuffer matrix1 = BufferUtils.createFloatBuffer(16);
private final FloatBuffer renderBuffer = BufferUtils.createFloatBuffer(8);
public boolean isOn = false;
public LaserPointerRenderer() {
for(int i = 0; i < 8; i++)
renderBuffer.put(0.0f);
renderBuffer.position(0);
}
@Override
public final void render(ItemStack is, float handSideSign, float swingProgress, float equipProgress) {
//This whole method is a fucking hack
float sqrtSwingProg = (float) Math.sqrt((double) swingProgress);
float sinSqrtSwingProg1 = MathHelper.sin(sqrtSwingProg * PI);
GlStateManager.disableCull();
GlStateManager.disableTexture2D();
GlStateManager.enableRescaleNormal();
//Laser pointer
glPushMatrix();
glTranslatef(handSideSign * -0.4f * sinSqrtSwingProg1, 0.2f * MathHelper.sin(sqrtSwingProg * PI * 2.0f), -0.2f * MathHelper.sin(swingProgress * PI));
glTranslatef(handSideSign * 0.56f, -0.52f - equipProgress * 0.6f, -0.72f);
glRotatef(handSideSign * (45.0f - MathHelper.sin(swingProgress * swingProgress * PI) * 20.0f), 0.0f, 1.0f, 0.0f);
glRotatef(handSideSign * sinSqrtSwingProg1 * -20.0f, 0.0f, 0.0f, 1.0f);
glRotatef(sinSqrtSwingProg1 * -80.0f, 1.0f, 0.0f, 0.0f);
glRotatef(handSideSign * -30.0f, 0.0f, 1.0f, 0.0f);
glTranslatef(0.0f, 0.2f, 0.0f);
glRotatef(10.0f, 1.0f, 0.0f, 0.0f);
glScalef(1.0f / 16.0f, 1.0f / 16.0f, 1.0f / 16.0f);
glColor4f(0.5f, 0.5f, 0.5f, 1.0f);
bb.begin(GL_QUADS, DefaultVertexFormats.POSITION_NORMAL);
bb.pos(0.0, 0.0, 0.0).normal(0.0f, 1.0f, 0.0f).endVertex();
bb.pos(1.0, 0.0, 0.0).normal(0.0f, 1.0f, 0.0f).endVertex();
bb.pos(1.0, 0.0, 4.0).normal(0.0f, 1.0f, 0.0f).endVertex();
bb.pos(0.0, 0.0, 4.0).normal(0.0f, 1.0f, 0.0f).endVertex();
bb.pos(0.0, 0.0, 0.0).normal(-1.0f, 0.0f, 0.0f).endVertex();
bb.pos(0.0, -1.0, 0.0).normal(-1.0f, 0.0f, 0.0f).endVertex();
bb.pos(0.0, -1.0, 4.0).normal(-1.0f, 0.0f, 0.0f).endVertex();
bb.pos(0.0, 0.0, 4.0).normal(-1.0f, 0.0f, 0.0f).endVertex();
bb.pos(1.0, 0.0, 0.0).normal(1.0f, 0.0f, 0.0f).endVertex();
bb.pos(1.0, -1.0, 0.0).normal(1.0f, 0.0f, 0.0f).endVertex();
bb.pos(1.0, -1.0, 4.0).normal(1.0f, 0.0f, 0.0f).endVertex();
bb.pos(1.0, 0.0, 4.0).normal(1.0f, 0.0f, 0.0f).endVertex();
bb.pos(0.0, -1.0, 4.0).normal(0.0f, 0.0f, 1.0f).endVertex();
bb.pos(1.0, -1.0, 4.0).normal(0.0f, 0.0f, 1.0f).endVertex();
bb.pos(1.0, 0.0, 4.0).normal(0.0f, 0.0f, 1.0f).endVertex();
bb.pos(0.0, 0.0, 4.0).normal(0.0f, 0.0f, 1.0f).endVertex();
t.draw();
if(isOn) {
glTranslatef(0.5f, -0.5f, 0.0f);
matrix1.position(0);
glGetFloat(GL_MODELVIEW_MATRIX, matrix1); //Hax to get that damn position
}
glPopMatrix();
if(isOn) {
RenderHelper.disableStandardItemLighting();
GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit);
GlStateManager.disableTexture2D();
GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit);
//Actual laser
glPushMatrix();
glLoadIdentity();
GlStateManager.enableBlend();
GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.DST_ALPHA);
glColor4f(1.0f, 0.0f, 0.0f, 0.5f);
GlStateManager.glLineWidth(3.0f);
matrix1.position(12);
renderBuffer.put(matrix1.get());
renderBuffer.put(matrix1.get());
renderBuffer.put(matrix1.get() - 0.02f); //I know this is stupid, but it's the only thing that worked...
renderBuffer.put(matrix1.get());
renderBuffer.position(0);
glVertexPointer(4, 0, renderBuffer);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_LINES, 0, 2);
glDisableClientState(GL_VERTEX_ARRAY);
glPopMatrix();
}
GlStateManager.enableTexture2D(); //Fix for shitty minecraft fire
}
private void raycast(float ptt, double dist) {
Vec3d start = mc.player.getPositionEyes(ptt);
Vec3d lookVec = mc.player.getLook(ptt);
Vec3d end = start.addVector(lookVec.x * dist, lookVec.y * dist, lookVec.z * dist);
RayTraceResult rtr = mc.world.rayTraceBlocks(start, end, true, true, false);
}
}

View File

@ -21,7 +21,7 @@ import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL12.GL_RESCALE_NORMAL;
@SideOnly(Side.CLIENT)
public final class MinePadRenderer {
public final class MinePadRenderer implements IItemRenderer {
private static final float PI = (float) Math.PI;
private final Minecraft mc = Minecraft.getMinecraft();
@ -34,7 +34,7 @@ public final class MinePadRenderer {
private float sinSwingProg1;
private float sinSwingProg2;
private static void drawAxis() {
public static void drawAxis() {
glDisable(GL_TEXTURE_2D);
glBegin(GL_LINES);
glColor4f(1.f, 0.f, 0.f, 1.f); glVertex3d(0.0, 0.0, 0.0);
@ -47,6 +47,7 @@ public final class MinePadRenderer {
glEnable(GL_TEXTURE_2D);
}
@Override
public final void render(ItemStack is, float handSideSign, float swingProgress, float equipProgress) {
//Pre-compute values
float sqrtSwingProg = (float) Math.sqrt((double) swingProgress);

View File

@ -15,6 +15,7 @@ item.webdisplays.upgrade.name=Screen Upgrade
item.webdisplays.upgrade.lasermouse.name=Laser Sensor
item.webdisplays.upgrade.redinput.name=Redstone Input Port
item.webdisplays.upgrade.redoutput.name=Redstone Output Port
item.webdisplays.laserpointer.name=Laser Pointer
webdisplays.message.tooSmall=Too small! Minimum size is 2x2.
webdisplays.message.invalid=Structure is invalid; look at %s.
webdisplays.message.turnOn=You need to turn the screen on first!

View File

@ -1,7 +1,6 @@
{
"keyboardType": {
"category": "block",
"subtitle": "block.webdisplays.keyboard",
"sounds": [
"webdisplays:keyboard1",
"webdisplays:keyboard2",
@ -15,16 +14,20 @@
},
"upgradeAdd": {
"category": "block",
"subtitle": "block.webdisplays.upgradeAdd",
"sounds": [
"webdisplays:upgrade_add"
]
},
"upgradeDel": {
"category": "block",
"subtitle": "block.webdisplays.upgradeDel",
"sounds": [
"webdisplays:upgrade_del"
]
},
"screencfgOpen": {
"category": "master",
"sounds": [
"webdisplays:screencfg_open"
]
}
}