From 64f1dd6998248f3a6ffcded0e7e98aee67f5deb9 Mon Sep 17 00:00:00 2001 From: Brady Date: Mon, 17 Jul 2017 17:55:06 -0500 Subject: [PATCH 01/26] Event and protocol changes Added Netty decode/encode packet events Repackaged events Protocol has been converted to an enum --- .../handler/listener/ChatCommandListener.java | 2 +- .../event/defaults/filters/PacketFilter.java | 2 +- .../{ => game}/BlockCollisionEvent.java | 2 +- .../defaults/{ => game}/BoundingBoxEvent.java | 2 +- .../event/defaults/{ => game}/ChatEvent.java | 2 +- .../event/defaults/{ => game}/ClickEvent.java | 2 +- .../{ => game}/EntityCollisionEvent.java | 2 +- .../defaults/{ => game}/EntityDeathEvent.java | 2 +- .../{ => game}/EntityRenderEvent.java | 2 +- .../{ => game}/GameShutdownEvent.java | 2 +- .../defaults/{ => game}/GlintEffectEvent.java | 2 +- .../event/defaults/{ => game}/GuiEvent.java | 2 +- .../defaults/{ => game}/ItemRenderEvent.java | 2 +- .../event/defaults/{ => game}/KeyEvent.java | 4 +- .../defaults/{ => game}/LayerRenderEvent.java | 2 +- .../{ => game}/LivingUpdateEvent.java | 2 +- .../event/defaults/{ => game}/LoopEvent.java | 2 +- .../{ => game}/MotionUpdateEvent.java | 2 +- .../event/defaults/{ => game}/MoveEvent.java | 2 +- .../defaults/{ => game}/PacketEvent.java | 38 ++++++++- .../defaults/{ => game}/ProfilerEvent.java | 2 +- .../defaults/{ => game}/Render3DEvent.java | 2 +- .../{ => game}/RenderEntityLabelEvent.java | 2 +- .../defaults/{ => game}/RenderHudEvent.java | 2 +- .../{ => game}/RenderScreenEvent.java | 2 +- .../defaults/{ => game}/TeamColorEvent.java | 2 +- .../event/defaults/{ => game}/TextEvent.java | 2 +- .../event/defaults/{ => game}/TickEvent.java | 2 +- .../defaults/{ => game}/UpdateEvent.java | 2 +- .../event/defaults/{ => game}/WorldEvent.java | 2 +- .../{ => internal}/ModuleStateEvent.java | 2 +- .../api/event/handle/ClientHandler.java | 2 +- .../me/zero/client/api/module/Module.java | 2 +- .../me/zero/client/api/util/PluginFinder.java | 4 +- .../me/zero/client/api/util/Protocol.java | 82 ++++++------------- .../zero/client/api/util/render/GlUtils.java | 2 +- .../me/zero/client/load/mixin/MixinBlock.java | 4 +- .../zero/client/load/mixin/MixinEntity.java | 2 +- .../load/mixin/MixinEntityLivingBase.java | 2 +- .../load/mixin/MixinEntityPlayerSP.java | 8 +- .../load/mixin/MixinEntityRenderer.java | 2 +- .../client/load/mixin/MixinFontRenderer.java | 2 +- .../client/load/mixin/MixinGuiIngame.java | 2 +- .../client/load/mixin/MixinItemRenderer.java | 2 +- .../load/mixin/MixinLayerArmorBase.java | 2 +- .../client/load/mixin/MixinMinecraft.java | 4 +- .../load/mixin/MixinNettyPacketDecoder.java | 65 +++++++++++++++ .../load/mixin/MixinNettyPacketEncoder.java | 59 +++++++++++++ .../load/mixin/MixinNetworkManager.java | 2 +- .../zero/client/load/mixin/MixinProfiler.java | 2 +- .../zero/client/load/mixin/MixinRender.java | 4 +- .../client/load/mixin/MixinRenderItem.java | 2 +- .../load/mixin/MixinRenderLivingBase.java | 2 +- .../client/load/mixin/MixinRenderManager.java | 2 +- .../client/load/mixin/wrapper/IMinecraft.java | 2 +- src/main/resources/mixins.capi.json | 3 + 56 files changed, 246 insertions(+), 119 deletions(-) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/BlockCollisionEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/BoundingBoxEvent.java (97%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/ChatEvent.java (97%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/ClickEvent.java (97%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/EntityCollisionEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/EntityDeathEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/EntityRenderEvent.java (98%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/GameShutdownEvent.java (95%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/GlintEffectEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/GuiEvent.java (97%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/ItemRenderEvent.java (98%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/KeyEvent.java (92%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/LayerRenderEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/LivingUpdateEvent.java (95%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/LoopEvent.java (94%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/MotionUpdateEvent.java (98%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/MoveEvent.java (97%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/PacketEvent.java (65%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/ProfilerEvent.java (95%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/Render3DEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/RenderEntityLabelEvent.java (97%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/RenderHudEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/RenderScreenEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/TeamColorEvent.java (97%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/TextEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/TickEvent.java (94%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/UpdateEvent.java (93%) rename src/main/java/me/zero/client/api/event/defaults/{ => game}/WorldEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/{ => internal}/ModuleStateEvent.java (96%) create mode 100644 src/main/java/me/zero/client/load/mixin/MixinNettyPacketDecoder.java create mode 100644 src/main/java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java diff --git a/src/main/java/me/zero/client/api/command/handler/listener/ChatCommandListener.java b/src/main/java/me/zero/client/api/command/handler/listener/ChatCommandListener.java index f4f5e84e..41c318fa 100644 --- a/src/main/java/me/zero/client/api/command/handler/listener/ChatCommandListener.java +++ b/src/main/java/me/zero/client/api/command/handler/listener/ChatCommandListener.java @@ -22,7 +22,7 @@ import me.zero.client.api.command.Command; import me.zero.client.api.command.handler.CommandHandler; import me.zero.client.api.command.executor.sender.CommandSender; -import me.zero.client.api.event.defaults.ChatEvent; +import me.zero.client.api.event.defaults.game.ChatEvent; import me.zero.client.api.event.defaults.internal.CommandExecutionEvent; import me.zero.client.api.util.interfaces.Helper; import net.minecraft.util.text.TextComponentString; diff --git a/src/main/java/me/zero/client/api/event/defaults/filters/PacketFilter.java b/src/main/java/me/zero/client/api/event/defaults/filters/PacketFilter.java index f059f99b..2225f083 100644 --- a/src/main/java/me/zero/client/api/event/defaults/filters/PacketFilter.java +++ b/src/main/java/me/zero/client/api/event/defaults/filters/PacketFilter.java @@ -16,7 +16,7 @@ package me.zero.client.api.event.defaults.filters; -import me.zero.client.api.event.defaults.PacketEvent; +import me.zero.client.api.event.defaults.game.PacketEvent; import net.minecraft.network.Packet; import java.util.function.Predicate; diff --git a/src/main/java/me/zero/client/api/event/defaults/BlockCollisionEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/BlockCollisionEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/BlockCollisionEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/BlockCollisionEvent.java index dd4322d0..71b1b6af 100644 --- a/src/main/java/me/zero/client/api/event/defaults/BlockCollisionEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/BlockCollisionEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import me.zero.alpine.type.Cancellable; import net.minecraft.block.Block; diff --git a/src/main/java/me/zero/client/api/event/defaults/BoundingBoxEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/BoundingBoxEvent.java similarity index 97% rename from src/main/java/me/zero/client/api/event/defaults/BoundingBoxEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/BoundingBoxEvent.java index f91924df..61869118 100644 --- a/src/main/java/me/zero/client/api/event/defaults/BoundingBoxEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/BoundingBoxEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import me.zero.alpine.type.Cancellable; import net.minecraft.block.Block; diff --git a/src/main/java/me/zero/client/api/event/defaults/ChatEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/ChatEvent.java similarity index 97% rename from src/main/java/me/zero/client/api/event/defaults/ChatEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/ChatEvent.java index 5549b209..199185e9 100644 --- a/src/main/java/me/zero/client/api/event/defaults/ChatEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/ChatEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import me.zero.alpine.type.Cancellable; import net.minecraft.util.text.ITextComponent; diff --git a/src/main/java/me/zero/client/api/event/defaults/ClickEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/ClickEvent.java similarity index 97% rename from src/main/java/me/zero/client/api/event/defaults/ClickEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/ClickEvent.java index a772034c..23e88d62 100644 --- a/src/main/java/me/zero/client/api/event/defaults/ClickEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/ClickEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import net.minecraft.client.Minecraft; diff --git a/src/main/java/me/zero/client/api/event/defaults/EntityCollisionEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/EntityCollisionEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/EntityCollisionEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/EntityCollisionEvent.java index 8f5f34c5..ec252bc0 100644 --- a/src/main/java/me/zero/client/api/event/defaults/EntityCollisionEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/EntityCollisionEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import me.zero.alpine.type.Cancellable; import net.minecraft.entity.Entity; diff --git a/src/main/java/me/zero/client/api/event/defaults/EntityDeathEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/EntityDeathEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/EntityDeathEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/EntityDeathEvent.java index 9a0d371a..f2d59b9a 100644 --- a/src/main/java/me/zero/client/api/event/defaults/EntityDeathEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/EntityDeathEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.DamageSource; diff --git a/src/main/java/me/zero/client/api/event/defaults/EntityRenderEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/EntityRenderEvent.java similarity index 98% rename from src/main/java/me/zero/client/api/event/defaults/EntityRenderEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/EntityRenderEvent.java index 12e48b99..c8598752 100644 --- a/src/main/java/me/zero/client/api/event/defaults/EntityRenderEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/EntityRenderEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import me.zero.alpine.type.Cancellable; import me.zero.alpine.type.EventState; diff --git a/src/main/java/me/zero/client/api/event/defaults/GameShutdownEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/GameShutdownEvent.java similarity index 95% rename from src/main/java/me/zero/client/api/event/defaults/GameShutdownEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/GameShutdownEvent.java index 4250b6ec..172901ec 100644 --- a/src/main/java/me/zero/client/api/event/defaults/GameShutdownEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/GameShutdownEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import me.zero.alpine.type.Cancellable; diff --git a/src/main/java/me/zero/client/api/event/defaults/GlintEffectEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/GlintEffectEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/GlintEffectEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/GlintEffectEvent.java index 2992b5d1..b804c9ab 100644 --- a/src/main/java/me/zero/client/api/event/defaults/GlintEffectEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/GlintEffectEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import me.zero.alpine.type.Cancellable; diff --git a/src/main/java/me/zero/client/api/event/defaults/GuiEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/GuiEvent.java similarity index 97% rename from src/main/java/me/zero/client/api/event/defaults/GuiEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/GuiEvent.java index 6e75d931..66b90b58 100644 --- a/src/main/java/me/zero/client/api/event/defaults/GuiEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/GuiEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import net.minecraft.client.gui.GuiScreen; diff --git a/src/main/java/me/zero/client/api/event/defaults/ItemRenderEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/ItemRenderEvent.java similarity index 98% rename from src/main/java/me/zero/client/api/event/defaults/ItemRenderEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/ItemRenderEvent.java index 4ea98bdd..fd3867e4 100644 --- a/src/main/java/me/zero/client/api/event/defaults/ItemRenderEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/ItemRenderEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import me.zero.alpine.type.Cancellable; import me.zero.client.api.util.interfaces.Helper; diff --git a/src/main/java/me/zero/client/api/event/defaults/KeyEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/KeyEvent.java similarity index 92% rename from src/main/java/me/zero/client/api/event/defaults/KeyEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/KeyEvent.java index 6690f3ff..327f3c4a 100644 --- a/src/main/java/me/zero/client/api/event/defaults/KeyEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/KeyEvent.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; /** * Event called when a Key is pressed outside of a GUI while in-game * - * @see me.zero.client.api.event.defaults.ClickEvent + * @see ClickEvent * * @author Brady * @since 1/20/2017 12:00 PM diff --git a/src/main/java/me/zero/client/api/event/defaults/LayerRenderEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/LayerRenderEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/LayerRenderEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/LayerRenderEvent.java index 1b053225..90446e20 100644 --- a/src/main/java/me/zero/client/api/event/defaults/LayerRenderEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/LayerRenderEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import me.zero.alpine.type.Cancellable; import net.minecraft.client.renderer.entity.layers.LayerRenderer; diff --git a/src/main/java/me/zero/client/api/event/defaults/LivingUpdateEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/LivingUpdateEvent.java similarity index 95% rename from src/main/java/me/zero/client/api/event/defaults/LivingUpdateEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/LivingUpdateEvent.java index d2f9122a..261a6950 100644 --- a/src/main/java/me/zero/client/api/event/defaults/LivingUpdateEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/LivingUpdateEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import me.zero.alpine.type.EventState; diff --git a/src/main/java/me/zero/client/api/event/defaults/LoopEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/LoopEvent.java similarity index 94% rename from src/main/java/me/zero/client/api/event/defaults/LoopEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/LoopEvent.java index eac6097a..fdbde9ff 100644 --- a/src/main/java/me/zero/client/api/event/defaults/LoopEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/LoopEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import net.minecraft.client.Minecraft; diff --git a/src/main/java/me/zero/client/api/event/defaults/MotionUpdateEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/MotionUpdateEvent.java similarity index 98% rename from src/main/java/me/zero/client/api/event/defaults/MotionUpdateEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/MotionUpdateEvent.java index 22687d46..b4274f7f 100644 --- a/src/main/java/me/zero/client/api/event/defaults/MotionUpdateEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/MotionUpdateEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import me.zero.alpine.type.EventState; import me.zero.client.api.util.interfaces.Helper; diff --git a/src/main/java/me/zero/client/api/event/defaults/MoveEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/MoveEvent.java similarity index 97% rename from src/main/java/me/zero/client/api/event/defaults/MoveEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/MoveEvent.java index 9ea7a4e9..b3748b74 100644 --- a/src/main/java/me/zero/client/api/event/defaults/MoveEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/MoveEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import me.zero.alpine.type.Cancellable; import net.minecraft.entity.MoverType; diff --git a/src/main/java/me/zero/client/api/event/defaults/PacketEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/PacketEvent.java similarity index 65% rename from src/main/java/me/zero/client/api/event/defaults/PacketEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/PacketEvent.java index eca1bd0d..cbe9c09c 100644 --- a/src/main/java/me/zero/client/api/event/defaults/PacketEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/PacketEvent.java @@ -14,9 +14,11 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import me.zero.alpine.type.Cancellable; +import net.minecraft.network.EnumConnectionState; +import net.minecraft.network.EnumPacketDirection; import net.minecraft.network.Packet; /** @@ -76,4 +78,38 @@ public Receive(Packet packet) { super(packet); } } + + /** + * Called when outgoing packets are encoded + */ + public static final class Encode extends PacketEvent { + + private final EnumConnectionState state; + + public Encode(Packet packet, EnumConnectionState state) { + super(packet); + this.state = state; + } + + public final EnumConnectionState getDirection() { + return this.state; + } + } + + /** + * Called when incoming packets are decoded + */ + public static final class Decode extends PacketEvent { + + private final EnumConnectionState state; + + public Decode(Packet packet, EnumConnectionState state) { + super(packet); + this.state = state; + } + + public final EnumConnectionState getDirection() { + return this.state; + } + } } diff --git a/src/main/java/me/zero/client/api/event/defaults/ProfilerEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/ProfilerEvent.java similarity index 95% rename from src/main/java/me/zero/client/api/event/defaults/ProfilerEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/ProfilerEvent.java index 5bfa7cf1..b81eae20 100644 --- a/src/main/java/me/zero/client/api/event/defaults/ProfilerEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/ProfilerEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; /** * Called when a section is started in the profiler diff --git a/src/main/java/me/zero/client/api/event/defaults/Render3DEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/Render3DEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/Render3DEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/Render3DEvent.java index 72547be8..91e83ee9 100644 --- a/src/main/java/me/zero/client/api/event/defaults/Render3DEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/Render3DEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import me.zero.client.api.util.interfaces.Helper; diff --git a/src/main/java/me/zero/client/api/event/defaults/RenderEntityLabelEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/RenderEntityLabelEvent.java similarity index 97% rename from src/main/java/me/zero/client/api/event/defaults/RenderEntityLabelEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/RenderEntityLabelEvent.java index d81b03fe..66178e51 100644 --- a/src/main/java/me/zero/client/api/event/defaults/RenderEntityLabelEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/RenderEntityLabelEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import me.zero.alpine.type.Cancellable; import net.minecraft.entity.Entity; diff --git a/src/main/java/me/zero/client/api/event/defaults/RenderHudEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/RenderHudEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/RenderHudEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/RenderHudEvent.java index d759906d..ed54ed31 100644 --- a/src/main/java/me/zero/client/api/event/defaults/RenderHudEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/RenderHudEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import net.minecraft.client.gui.GuiIngame; diff --git a/src/main/java/me/zero/client/api/event/defaults/RenderScreenEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/RenderScreenEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/RenderScreenEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/RenderScreenEvent.java index 4798dc68..340b001c 100644 --- a/src/main/java/me/zero/client/api/event/defaults/RenderScreenEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/RenderScreenEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import net.minecraft.client.renderer.EntityRenderer; diff --git a/src/main/java/me/zero/client/api/event/defaults/TeamColorEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/TeamColorEvent.java similarity index 97% rename from src/main/java/me/zero/client/api/event/defaults/TeamColorEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/TeamColorEvent.java index 1cfea0ab..8c8c6736 100644 --- a/src/main/java/me/zero/client/api/event/defaults/TeamColorEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/TeamColorEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import me.zero.alpine.type.Cancellable; import net.minecraft.entity.Entity; diff --git a/src/main/java/me/zero/client/api/event/defaults/TextEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/TextEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/TextEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/TextEvent.java index cccf1a43..8fd0b703 100644 --- a/src/main/java/me/zero/client/api/event/defaults/TextEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/TextEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; /** * Called in FontRenderer when text is rendered diff --git a/src/main/java/me/zero/client/api/event/defaults/TickEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/TickEvent.java similarity index 94% rename from src/main/java/me/zero/client/api/event/defaults/TickEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/TickEvent.java index 1833349c..a3d39906 100644 --- a/src/main/java/me/zero/client/api/event/defaults/TickEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/TickEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import net.minecraft.client.Minecraft; diff --git a/src/main/java/me/zero/client/api/event/defaults/UpdateEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/UpdateEvent.java similarity index 93% rename from src/main/java/me/zero/client/api/event/defaults/UpdateEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/UpdateEvent.java index b7f560b5..97abfeaf 100644 --- a/src/main/java/me/zero/client/api/event/defaults/UpdateEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/UpdateEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; /** * Called from EntityPlayerSP#onUpdate diff --git a/src/main/java/me/zero/client/api/event/defaults/WorldEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/WorldEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/WorldEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/WorldEvent.java index 81f98846..14a4007f 100644 --- a/src/main/java/me/zero/client/api/event/defaults/WorldEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/WorldEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.game; import net.minecraft.client.multiplayer.WorldClient; diff --git a/src/main/java/me/zero/client/api/event/defaults/ModuleStateEvent.java b/src/main/java/me/zero/client/api/event/defaults/internal/ModuleStateEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/ModuleStateEvent.java rename to src/main/java/me/zero/client/api/event/defaults/internal/ModuleStateEvent.java index 6cfd3466..73bd992e 100644 --- a/src/main/java/me/zero/client/api/event/defaults/ModuleStateEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/internal/ModuleStateEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults; +package me.zero.client.api.event.defaults.internal; import me.zero.alpine.type.Cancellable; import me.zero.client.api.module.Module; diff --git a/src/main/java/me/zero/client/api/event/handle/ClientHandler.java b/src/main/java/me/zero/client/api/event/handle/ClientHandler.java index 5b3bd516..ec055dca 100644 --- a/src/main/java/me/zero/client/api/event/handle/ClientHandler.java +++ b/src/main/java/me/zero/client/api/event/handle/ClientHandler.java @@ -19,9 +19,9 @@ import me.zero.client.api.ClientAPI; import me.zero.alpine.listener.EventHandler; import me.zero.alpine.listener.Listener; -import me.zero.client.api.event.defaults.*; import me.zero.client.api.event.defaults.filters.PacketFilter; import me.zero.alpine.type.EventPriority; +import me.zero.client.api.event.defaults.game.*; import me.zero.client.api.util.interfaces.Helper; import me.zero.client.api.util.keybind.Keybind; import me.zero.client.api.util.render.camera.Camera; diff --git a/src/main/java/me/zero/client/api/module/Module.java b/src/main/java/me/zero/client/api/module/Module.java index 63713b5e..3320c17c 100644 --- a/src/main/java/me/zero/client/api/module/Module.java +++ b/src/main/java/me/zero/client/api/module/Module.java @@ -17,7 +17,7 @@ package me.zero.client.api.module; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.ModuleStateEvent; +import me.zero.client.api.event.defaults.internal.ModuleStateEvent; import me.zero.client.api.exception.ActionNotSupportedException; import me.zero.client.api.manage.Node; import me.zero.client.api.module.exception.ModuleInitException; diff --git a/src/main/java/me/zero/client/api/util/PluginFinder.java b/src/main/java/me/zero/client/api/util/PluginFinder.java index 55f91ce6..1181f633 100644 --- a/src/main/java/me/zero/client/api/util/PluginFinder.java +++ b/src/main/java/me/zero/client/api/util/PluginFinder.java @@ -20,8 +20,8 @@ import me.zero.client.api.ClientAPI; import me.zero.alpine.listener.EventHandler; import me.zero.alpine.listener.Listener; -import me.zero.client.api.event.defaults.PacketEvent; -import me.zero.client.api.event.defaults.TickEvent; +import me.zero.client.api.event.defaults.game.PacketEvent; +import me.zero.client.api.event.defaults.game.TickEvent; import me.zero.client.api.event.defaults.filters.PacketFilter; import me.zero.client.api.exception.InvalidActionException; import me.zero.client.api.util.interfaces.Helper; diff --git a/src/main/java/me/zero/client/api/util/Protocol.java b/src/main/java/me/zero/client/api/util/Protocol.java index 78d4e3e5..99c6e685 100644 --- a/src/main/java/me/zero/client/api/util/Protocol.java +++ b/src/main/java/me/zero/client/api/util/Protocol.java @@ -16,89 +16,53 @@ package me.zero.client.api.util; -import com.google.common.collect.ImmutableList; - -import java.util.List; - /** - * List of protocols + * List of official release version protocols + * after the netty rewrite in 1.7 * * @author Brady * @since 3/6/2017 12:00 PM */ -public final class Protocol { - - private static ImmutableList protocols = new ImmutableList.Builder() - .add(build(316, "1.11.x", "1.11", "1.11.2")) - .add(build(315, "1.11")) - .add(build(210, "1.10.x", "1.10", "1.10.1", "1.10.2")) - .add(build(110, "1.9.3", "1.9.3", "1.9.4")) - .add(build(109, "1.9.2", "1.9.2")) - .add(build(108, "1.9.1")) - .add(build(107, "1.9")) - .add(build(47, "1.8.x", "1.8", "1.8.1", "1.8.2", "1.8.3", "1.8.4", "1.8.5", "1.8.6", "1.8.7", "1.8.8", "1.8.9")) - .add(build(5, "1.7.10", "1.7.6", "1.7.7", "1.7.8", "1.7.9", "1.7.10")) - .add(build(4, "1.7.2", "1.7.2", "1.7.4", "1.7.5")) - .build(); +public enum Protocol { - /** - * Protocol ID - */ - private final int protocol; + ProtocolVersion4(4, "1.7.2", "1.7.4", "1.7.5"), + ProtocolVersion5(5, "1.7.6", "1.7.7", "1.7.8", "1.7.9", "1.7.10"), + ProtocolVersion47(47, "1.8", "1.8.1", "1.8.2", "1.8.3", "1.8.4", "1.8.5", "1.8.6", "1.8.7", "1.8.8", "1.8.9"), + ProtocolVersion107(107, "1.9"), + ProtocolVersion108(108, "1.9.1"), + ProtocolVersion109(109, "1.9.2"), + ProtocolVersion110(110, "1.9.3", "1.9.4"), + ProtocolVersion210(210, "1.10", "1.10.1", "1.10.2"), + ProtocolVersion315(315, "1.11"), + ProtocolVersion316(316, "1.11.1", "1.11.2"), + ProtocolVersion335(335, "1.12"); /** - * Protocol display name + * The Protocol ID */ - private final String name; + private final int id; /** - * Supported versions + * Array of supported game versions for this protocol version */ private final String[] versions; - private Protocol(int protocol, String name, String... versions) { - this.protocol = protocol; - this.name = name; + Protocol(int id, String... versions) { + this.id = id; this.versions = versions; } /** - * @return The protocol ID - */ - public final int getProtocol() { - return this.protocol; - } - - /** - * @return The protocol display name + * @return The Protocol ID */ - public final String getName() { - return this.name; + public final int getId() { + return this.id; } /** - * @return The supported version IDs + * @return Array of supported game versions for this protocol version */ public final String[] getVersions() { return this.versions; } - - /** - * Creates a Protocol object from its required parameters - * - * @param protocol The protocol id - * @param name The name of the protocol - * @param versions An array of supported versions - * @return The built object - */ - private static Protocol build(int protocol, String name, String... versions) { - return new Protocol(protocol, name, versions); - } - - /** - * @return All of the registered protocols - */ - public static List getProtocols() { - return protocols; - } } diff --git a/src/main/java/me/zero/client/api/util/render/GlUtils.java b/src/main/java/me/zero/client/api/util/render/GlUtils.java index 1460830c..aac534c1 100644 --- a/src/main/java/me/zero/client/api/util/render/GlUtils.java +++ b/src/main/java/me/zero/client/api/util/render/GlUtils.java @@ -19,7 +19,7 @@ import me.zero.client.api.ClientAPI; import me.zero.alpine.listener.EventHandler; import me.zero.alpine.listener.Listener; -import me.zero.client.api.event.defaults.Render3DEvent; +import me.zero.client.api.event.defaults.game.Render3DEvent; import me.zero.client.api.util.math.Vec3; import net.minecraft.client.renderer.GlStateManager; import org.lwjgl.BufferUtils; diff --git a/src/main/java/me/zero/client/load/mixin/MixinBlock.java b/src/main/java/me/zero/client/load/mixin/MixinBlock.java index a4a52685..a3800e19 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinBlock.java +++ b/src/main/java/me/zero/client/load/mixin/MixinBlock.java @@ -17,8 +17,8 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.BlockCollisionEvent; -import me.zero.client.api.event.defaults.BoundingBoxEvent; +import me.zero.client.api.event.defaults.game.BlockCollisionEvent; +import me.zero.client.api.event.defaults.game.BoundingBoxEvent; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; diff --git a/src/main/java/me/zero/client/load/mixin/MixinEntity.java b/src/main/java/me/zero/client/load/mixin/MixinEntity.java index 801ffeab..30213a79 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinEntity.java +++ b/src/main/java/me/zero/client/load/mixin/MixinEntity.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.EntityCollisionEvent; +import me.zero.client.api.event.defaults.game.EntityCollisionEvent; import me.zero.client.api.util.math.Vec2; import me.zero.client.api.util.math.Vec3; import me.zero.client.load.mixin.wrapper.IEntity; diff --git a/src/main/java/me/zero/client/load/mixin/MixinEntityLivingBase.java b/src/main/java/me/zero/client/load/mixin/MixinEntityLivingBase.java index 978eec89..fd6e5eaa 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinEntityLivingBase.java +++ b/src/main/java/me/zero/client/load/mixin/MixinEntityLivingBase.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.EntityDeathEvent; +import me.zero.client.api.event.defaults.game.EntityDeathEvent; import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.DamageSource; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/me/zero/client/load/mixin/MixinEntityPlayerSP.java b/src/main/java/me/zero/client/load/mixin/MixinEntityPlayerSP.java index 28fde154..53bbcccb 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinEntityPlayerSP.java +++ b/src/main/java/me/zero/client/load/mixin/MixinEntityPlayerSP.java @@ -17,10 +17,10 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.LivingUpdateEvent; -import me.zero.client.api.event.defaults.MotionUpdateEvent; -import me.zero.client.api.event.defaults.MoveEvent; -import me.zero.client.api.event.defaults.UpdateEvent; +import me.zero.client.api.event.defaults.game.LivingUpdateEvent; +import me.zero.client.api.event.defaults.game.MotionUpdateEvent; +import me.zero.client.api.event.defaults.game.MoveEvent; +import me.zero.client.api.event.defaults.game.UpdateEvent; import me.zero.alpine.type.EventState; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.AbstractClientPlayer; diff --git a/src/main/java/me/zero/client/load/mixin/MixinEntityRenderer.java b/src/main/java/me/zero/client/load/mixin/MixinEntityRenderer.java index b1a11692..7ca95356 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinEntityRenderer.java +++ b/src/main/java/me/zero/client/load/mixin/MixinEntityRenderer.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.RenderScreenEvent; +import me.zero.client.api.event.defaults.game.RenderScreenEvent; import me.zero.client.api.util.render.camera.Camera; import net.minecraft.client.renderer.EntityRenderer; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/me/zero/client/load/mixin/MixinFontRenderer.java b/src/main/java/me/zero/client/load/mixin/MixinFontRenderer.java index 0647550a..50e1c9f0 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinFontRenderer.java +++ b/src/main/java/me/zero/client/load/mixin/MixinFontRenderer.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.TextEvent; +import me.zero.client.api.event.defaults.game.TextEvent; import net.minecraft.client.gui.FontRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/me/zero/client/load/mixin/MixinGuiIngame.java b/src/main/java/me/zero/client/load/mixin/MixinGuiIngame.java index b7fdc648..2907b44e 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinGuiIngame.java +++ b/src/main/java/me/zero/client/load/mixin/MixinGuiIngame.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.RenderHudEvent; +import me.zero.client.api.event.defaults.game.RenderHudEvent; import net.minecraft.client.gui.GuiIngame; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/me/zero/client/load/mixin/MixinItemRenderer.java b/src/main/java/me/zero/client/load/mixin/MixinItemRenderer.java index a64b1bd8..ca82011a 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinItemRenderer.java +++ b/src/main/java/me/zero/client/load/mixin/MixinItemRenderer.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.ItemRenderEvent; +import me.zero.client.api.event.defaults.game.ItemRenderEvent; import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/me/zero/client/load/mixin/MixinLayerArmorBase.java b/src/main/java/me/zero/client/load/mixin/MixinLayerArmorBase.java index 40350998..45b67d67 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinLayerArmorBase.java +++ b/src/main/java/me/zero/client/load/mixin/MixinLayerArmorBase.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.GlintEffectEvent; +import me.zero.client.api.event.defaults.game.GlintEffectEvent; import net.minecraft.client.model.ModelBase; import net.minecraft.client.renderer.entity.RenderLivingBase; import net.minecraft.client.renderer.entity.layers.LayerArmorBase; diff --git a/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java b/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java index 1b187a76..ce7ad1a7 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java +++ b/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java @@ -20,7 +20,7 @@ import me.zero.client.api.Client; import me.zero.client.api.ClientInfo; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.*; +import me.zero.client.api.event.defaults.game.*; import me.zero.client.api.event.handle.ClientHandler; import me.zero.client.api.util.render.GlUtils; import me.zero.client.load.ClientInitException; @@ -43,7 +43,7 @@ import java.io.InputStream; import java.io.InputStreamReader; -import static me.zero.client.api.event.defaults.ClickEvent.MouseButton.*; +import static me.zero.client.api.event.defaults.game.ClickEvent.MouseButton.*; /** * @author Brady diff --git a/src/main/java/me/zero/client/load/mixin/MixinNettyPacketDecoder.java b/src/main/java/me/zero/client/load/mixin/MixinNettyPacketDecoder.java new file mode 100644 index 00000000..a3398327 --- /dev/null +++ b/src/main/java/me/zero/client/load/mixin/MixinNettyPacketDecoder.java @@ -0,0 +1,65 @@ +package me.zero.client.load.mixin; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import me.zero.client.api.ClientAPI; +import me.zero.client.api.event.defaults.game.PacketEvent; +import net.minecraft.network.*; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Marker; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.io.IOException; +import java.util.List; + +/** + * @author Brady + * @since 7/17/2017 2:22 PM + */ +@Mixin(NettyPacketDecoder.class) +public class MixinNettyPacketDecoder { + + @Shadow @Final private static Logger LOGGER; + @Shadow @Final private static Marker RECEIVED_PACKET_MARKER; + @Shadow @Final private EnumPacketDirection direction; + + /** + * @author Brady + */ + @Overwrite + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws IOException, InstantiationException, IllegalAccessException { + if (in.readableBytes() == 0) + return; + + PacketBuffer packetbuffer = new PacketBuffer(in); + int packetId = packetbuffer.readVarInt(); + EnumConnectionState state = ctx.channel().attr(NetworkManager.PROTOCOL_ATTRIBUTE_KEY).get(); + Packet packet = state.getPacket(this.direction, packetId); + + PacketEvent event = new PacketEvent.Decode(packet, state); + ClientAPI.EVENT_BUS.post(event); + packet = event.getPacket(); + if (event.isCancelled()) + return; + + if (packet == null) { + throw new IOException(String.format("Bad packet id %s", packetId)); + } else { + packet.readPacketData(packetbuffer); + + if (packetbuffer.readableBytes() > 0) { + throw new IOException(String.format("Packet %s/%s (%s) was larger than I expected, found %s bytes extra whilst reading packet %s", state.getId(), packetId, packet.getClass().getSimpleName(), packetbuffer.readableBytes(), packetId)); + } else { + out.add(packet); + + if (LOGGER.isDebugEnabled()) { + LOGGER.debug(RECEIVED_PACKET_MARKER, " IN: [{}:{}] {}", state, packetId, packet.getClass().getName()); + } + } + } + } +} diff --git a/src/main/java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java b/src/main/java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java new file mode 100644 index 00000000..23695181 --- /dev/null +++ b/src/main/java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java @@ -0,0 +1,59 @@ +package me.zero.client.load.mixin; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import me.zero.client.api.ClientAPI; +import me.zero.client.api.event.defaults.game.PacketEvent; +import net.minecraft.network.*; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Marker; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import java.io.IOException; + +/** + * @author Brady + * @since 7/16/2017 5:22 PM + */ +@Mixin(NettyPacketEncoder.class) +public class MixinNettyPacketEncoder { + + @Shadow @Final private static Logger LOGGER; + @Shadow @Final private static Marker RECEIVED_PACKET_MARKER; + @Shadow @Final private EnumPacketDirection direction; + + /** + * @author Brady + */ + @Overwrite + protected void encode(ChannelHandlerContext ctx, Packet msg, ByteBuf out) throws IOException { + EnumConnectionState state = ctx.channel().attr(NetworkManager.PROTOCOL_ATTRIBUTE_KEY).get(); + Integer packetId = state.getPacketId(this.direction, msg); + + if (LOGGER.isDebugEnabled()) { + LOGGER.debug(RECEIVED_PACKET_MARKER, "OUT: [{}:{}] {}", state, packetId, msg.getClass().getName()); + } + + PacketEvent event = new PacketEvent.Encode(msg, state); + ClientAPI.EVENT_BUS.post(event); + msg = event.getPacket(); + if (event.isCancelled() || msg == null) + return; + + if (packetId == null) { + throw new IOException("Can\'t serialize unregistered packet"); + } else { + PacketBuffer buffer = new PacketBuffer(out); + buffer.writeVarInt(packetId); + + try { + msg.writePacketData(buffer); + } catch (Throwable throwable) { + LOGGER.error(throwable); + } + } + } +} diff --git a/src/main/java/me/zero/client/load/mixin/MixinNetworkManager.java b/src/main/java/me/zero/client/load/mixin/MixinNetworkManager.java index 66e72220..413dc293 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinNetworkManager.java +++ b/src/main/java/me/zero/client/load/mixin/MixinNetworkManager.java @@ -19,7 +19,7 @@ import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.PacketEvent; +import me.zero.client.api.event.defaults.game.PacketEvent; import net.minecraft.network.INetHandler; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; diff --git a/src/main/java/me/zero/client/load/mixin/MixinProfiler.java b/src/main/java/me/zero/client/load/mixin/MixinProfiler.java index 20dbf109..32c40912 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinProfiler.java +++ b/src/main/java/me/zero/client/load/mixin/MixinProfiler.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.ProfilerEvent; +import me.zero.client.api.event.defaults.game.ProfilerEvent; import net.minecraft.profiler.Profiler; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/me/zero/client/load/mixin/MixinRender.java b/src/main/java/me/zero/client/load/mixin/MixinRender.java index ea245d15..d0bdab4b 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinRender.java +++ b/src/main/java/me/zero/client/load/mixin/MixinRender.java @@ -17,8 +17,8 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.RenderEntityLabelEvent; -import me.zero.client.api.event.defaults.TeamColorEvent; +import me.zero.client.api.event.defaults.game.RenderEntityLabelEvent; +import me.zero.client.api.event.defaults.game.TeamColorEvent; import net.minecraft.client.renderer.entity.Render; import net.minecraft.entity.Entity; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/me/zero/client/load/mixin/MixinRenderItem.java b/src/main/java/me/zero/client/load/mixin/MixinRenderItem.java index c94f62da..ecd4d0e0 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinRenderItem.java +++ b/src/main/java/me/zero/client/load/mixin/MixinRenderItem.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.GlintEffectEvent; +import me.zero.client.api.event.defaults.game.GlintEffectEvent; import net.minecraft.client.renderer.RenderItem; import net.minecraft.client.renderer.block.model.IBakedModel; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/me/zero/client/load/mixin/MixinRenderLivingBase.java b/src/main/java/me/zero/client/load/mixin/MixinRenderLivingBase.java index fb33b623..8a9068d3 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinRenderLivingBase.java +++ b/src/main/java/me/zero/client/load/mixin/MixinRenderLivingBase.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.LayerRenderEvent; +import me.zero.client.api.event.defaults.game.LayerRenderEvent; import net.minecraft.client.renderer.entity.RenderLivingBase; import net.minecraft.client.renderer.entity.layers.LayerRenderer; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/me/zero/client/load/mixin/MixinRenderManager.java b/src/main/java/me/zero/client/load/mixin/MixinRenderManager.java index 4e6f1c0d..8c734178 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinRenderManager.java +++ b/src/main/java/me/zero/client/load/mixin/MixinRenderManager.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.EntityRenderEvent; +import me.zero.client.api.event.defaults.game.EntityRenderEvent; import me.zero.alpine.type.EventState; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; diff --git a/src/main/java/me/zero/client/load/mixin/wrapper/IMinecraft.java b/src/main/java/me/zero/client/load/mixin/wrapper/IMinecraft.java index bfc7b5b2..76a35994 100644 --- a/src/main/java/me/zero/client/load/mixin/wrapper/IMinecraft.java +++ b/src/main/java/me/zero/client/load/mixin/wrapper/IMinecraft.java @@ -16,7 +16,7 @@ package me.zero.client.load.mixin.wrapper; -import me.zero.client.api.event.defaults.ClickEvent; +import me.zero.client.api.event.defaults.game.ClickEvent; import net.minecraft.util.Session; import net.minecraft.util.Timer; diff --git a/src/main/resources/mixins.capi.json b/src/main/resources/mixins.capi.json index 11dfd964..1a395c4c 100644 --- a/src/main/resources/mixins.capi.json +++ b/src/main/resources/mixins.capi.json @@ -14,12 +14,15 @@ "MixinItemRenderer", "MixinLayerArmorBase", "MixinMinecraft", + "MixinNettyPacketDecoder", + "MixinNettyPacketEncoder", "MixinNetworkManager", "MixinProfiler", "MixinRender", "MixinRenderItem", "MixinRenderLivingBase", "MixinRenderManager", + "wrapper.ICPacketPlayer", "wrapper.IEntityPlayer", "wrapper.IGameType", From b48d14ca52f6aec16475b7e592356e2c4e1e7722 Mon Sep 17 00:00:00 2001 From: Brady Date: Tue, 18 Jul 2017 10:18:20 -0500 Subject: [PATCH 02/26] Updated version in build.gradle --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 32d2cadb..52e78d71 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ apply plugin: 'java' apply plugin: 'net.minecraftforge.gradle.tweaker-client' apply plugin: 'org.spongepowered.mixin' -version '2.0' +version '2.1' group 'com.github.ZeroMemes' sourceCompatibility = targetCompatibility = '1.8' // Needed so Eclipse task generates correctly From 71624287c0fd9993c051921bbe77b2314ec66835 Mon Sep 17 00:00:00 2001 From: Brady Date: Thu, 20 Jul 2017 12:58:28 -0500 Subject: [PATCH 03/26] Moved files directly related to OpenGL to a "gl" package in render --- src/main/java/me/zero/client/api/util/math/Vec2.java | 2 +- src/main/java/me/zero/client/api/util/math/Vec3.java | 2 +- .../me/zero/client/api/util/render/RenderUtils.java | 2 ++ .../client/api/util/render/{ => gl}/GlUtils.java | 3 ++- .../util/render/{ => gl/glenum}/GlClientState.java | 2 +- .../render/{shader => gl}/glenum/GlShaderStatus.java | 2 +- .../render/{shader => gl}/glenum/GlShaderType.java | 2 +- .../api/util/render/{ => gl}/shader/Shader.java | 12 ++++++------ .../util/render/{ => gl}/shader/ShaderHelper.java | 8 ++++---- .../api/util/render/{ => gl}/shader/Uniform.java | 2 +- .../{ => gl}/shader/adapter/ARBShaderAdapter.java | 6 +++--- .../{ => gl}/shader/adapter/GL20ShaderAdapter.java | 6 +++--- .../{ => gl}/shader/adapter/ShaderAdapter.java | 6 +++--- .../{ => gl}/shader/adapter/ShaderAdapters.java | 2 +- .../me/zero/client/load/mixin/MixinMinecraft.java | 2 +- 15 files changed, 31 insertions(+), 28 deletions(-) rename src/main/java/me/zero/client/api/util/render/{ => gl}/GlUtils.java (98%) rename src/main/java/me/zero/client/api/util/render/{ => gl/glenum}/GlClientState.java (94%) rename src/main/java/me/zero/client/api/util/render/{shader => gl}/glenum/GlShaderStatus.java (92%) rename src/main/java/me/zero/client/api/util/render/{shader => gl}/glenum/GlShaderType.java (93%) rename src/main/java/me/zero/client/api/util/render/{ => gl}/shader/Shader.java (87%) rename src/main/java/me/zero/client/api/util/render/{ => gl}/shader/ShaderHelper.java (85%) rename src/main/java/me/zero/client/api/util/render/{ => gl}/shader/Uniform.java (98%) rename src/main/java/me/zero/client/api/util/render/{ => gl}/shader/adapter/ARBShaderAdapter.java (94%) rename src/main/java/me/zero/client/api/util/render/{ => gl}/shader/adapter/GL20ShaderAdapter.java (94%) rename src/main/java/me/zero/client/api/util/render/{ => gl}/shader/adapter/ShaderAdapter.java (94%) rename src/main/java/me/zero/client/api/util/render/{ => gl}/shader/adapter/ShaderAdapters.java (96%) diff --git a/src/main/java/me/zero/client/api/util/math/Vec2.java b/src/main/java/me/zero/client/api/util/math/Vec2.java index 5e44bebc..8c278f23 100644 --- a/src/main/java/me/zero/client/api/util/math/Vec2.java +++ b/src/main/java/me/zero/client/api/util/math/Vec2.java @@ -16,7 +16,7 @@ package me.zero.client.api.util.math; -import me.zero.client.api.util.render.GlUtils; +import me.zero.client.api.util.render.gl.GlUtils; /** * A Vec with an X and Y position diff --git a/src/main/java/me/zero/client/api/util/math/Vec3.java b/src/main/java/me/zero/client/api/util/math/Vec3.java index 550be9a9..d19362ae 100644 --- a/src/main/java/me/zero/client/api/util/math/Vec3.java +++ b/src/main/java/me/zero/client/api/util/math/Vec3.java @@ -16,7 +16,7 @@ package me.zero.client.api.util.math; -import me.zero.client.api.util.render.GlUtils; +import me.zero.client.api.util.render.gl.GlUtils; /** * A Vec with a X, Y, and Z position diff --git a/src/main/java/me/zero/client/api/util/render/RenderUtils.java b/src/main/java/me/zero/client/api/util/render/RenderUtils.java index 4eb49f4c..394f6b15 100644 --- a/src/main/java/me/zero/client/api/util/render/RenderUtils.java +++ b/src/main/java/me/zero/client/api/util/render/RenderUtils.java @@ -18,6 +18,8 @@ import me.zero.client.api.util.math.Vec2; import me.zero.client.api.util.math.Vec3; +import me.zero.client.api.util.render.gl.glenum.GlClientState; +import me.zero.client.api.util.render.gl.GlUtils; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.OpenGlHelper; import pw.knx.feather.tessellate.GrowingTess; diff --git a/src/main/java/me/zero/client/api/util/render/GlUtils.java b/src/main/java/me/zero/client/api/util/render/gl/GlUtils.java similarity index 98% rename from src/main/java/me/zero/client/api/util/render/GlUtils.java rename to src/main/java/me/zero/client/api/util/render/gl/GlUtils.java index aac534c1..80f0e916 100644 --- a/src/main/java/me/zero/client/api/util/render/GlUtils.java +++ b/src/main/java/me/zero/client/api/util/render/gl/GlUtils.java @@ -14,13 +14,14 @@ * limitations under the License. */ -package me.zero.client.api.util.render; +package me.zero.client.api.util.render.gl; import me.zero.client.api.ClientAPI; import me.zero.alpine.listener.EventHandler; import me.zero.alpine.listener.Listener; import me.zero.client.api.event.defaults.game.Render3DEvent; import me.zero.client.api.util.math.Vec3; +import me.zero.client.api.util.render.Colors; import net.minecraft.client.renderer.GlStateManager; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.Display; diff --git a/src/main/java/me/zero/client/api/util/render/GlClientState.java b/src/main/java/me/zero/client/api/util/render/gl/glenum/GlClientState.java similarity index 94% rename from src/main/java/me/zero/client/api/util/render/GlClientState.java rename to src/main/java/me/zero/client/api/util/render/gl/glenum/GlClientState.java index b00f6340..23f18eca 100644 --- a/src/main/java/me/zero/client/api/util/render/GlClientState.java +++ b/src/main/java/me/zero/client/api/util/render/gl/glenum/GlClientState.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.util.render; +package me.zero.client.api.util.render.gl.glenum; import static org.lwjgl.opengl.GL11.*; diff --git a/src/main/java/me/zero/client/api/util/render/shader/glenum/GlShaderStatus.java b/src/main/java/me/zero/client/api/util/render/gl/glenum/GlShaderStatus.java similarity index 92% rename from src/main/java/me/zero/client/api/util/render/shader/glenum/GlShaderStatus.java rename to src/main/java/me/zero/client/api/util/render/gl/glenum/GlShaderStatus.java index 925ebe67..b6e4e9ca 100644 --- a/src/main/java/me/zero/client/api/util/render/shader/glenum/GlShaderStatus.java +++ b/src/main/java/me/zero/client/api/util/render/gl/glenum/GlShaderStatus.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.util.render.shader.glenum; +package me.zero.client.api.util.render.gl.glenum; /** * @author Brady diff --git a/src/main/java/me/zero/client/api/util/render/shader/glenum/GlShaderType.java b/src/main/java/me/zero/client/api/util/render/gl/glenum/GlShaderType.java similarity index 93% rename from src/main/java/me/zero/client/api/util/render/shader/glenum/GlShaderType.java rename to src/main/java/me/zero/client/api/util/render/gl/glenum/GlShaderType.java index ea020777..985c114a 100644 --- a/src/main/java/me/zero/client/api/util/render/shader/glenum/GlShaderType.java +++ b/src/main/java/me/zero/client/api/util/render/gl/glenum/GlShaderType.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.util.render.shader.glenum; +package me.zero.client.api.util.render.gl.glenum; /** * Enum to represent different shader types. diff --git a/src/main/java/me/zero/client/api/util/render/shader/Shader.java b/src/main/java/me/zero/client/api/util/render/gl/shader/Shader.java similarity index 87% rename from src/main/java/me/zero/client/api/util/render/shader/Shader.java rename to src/main/java/me/zero/client/api/util/render/gl/shader/Shader.java index a981f6e8..a9a28feb 100644 --- a/src/main/java/me/zero/client/api/util/render/shader/Shader.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/Shader.java @@ -14,18 +14,18 @@ * limitations under the License. */ -package me.zero.client.api.util.render.shader; +package me.zero.client.api.util.render.gl.shader; import me.zero.client.api.util.interfaces.Helper; -import me.zero.client.api.util.render.shader.adapter.ShaderAdapter; -import me.zero.client.api.util.render.shader.adapter.ShaderAdapters; -import me.zero.client.api.util.render.shader.glenum.GlShaderStatus; -import me.zero.client.api.util.render.shader.glenum.GlShaderType; +import me.zero.client.api.util.render.gl.shader.adapter.ShaderAdapter; +import me.zero.client.api.util.render.gl.shader.adapter.ShaderAdapters; +import me.zero.client.api.util.render.gl.glenum.GlShaderStatus; +import me.zero.client.api.util.render.gl.glenum.GlShaderType; import java.util.HashMap; import java.util.Map; -import static me.zero.client.api.util.render.shader.ShaderHelper.*; +import static me.zero.client.api.util.render.gl.shader.ShaderHelper.*; /** * Used to create ARB Shader Programs with OpenGL diff --git a/src/main/java/me/zero/client/api/util/render/shader/ShaderHelper.java b/src/main/java/me/zero/client/api/util/render/gl/shader/ShaderHelper.java similarity index 85% rename from src/main/java/me/zero/client/api/util/render/shader/ShaderHelper.java rename to src/main/java/me/zero/client/api/util/render/gl/shader/ShaderHelper.java index 8a0e6225..3e333844 100644 --- a/src/main/java/me/zero/client/api/util/render/shader/ShaderHelper.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/ShaderHelper.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package me.zero.client.api.util.render.shader; +package me.zero.client.api.util.render.gl.shader; import me.zero.client.api.util.io.StreamReader; -import me.zero.client.api.util.render.shader.adapter.ShaderAdapter; -import me.zero.client.api.util.render.shader.glenum.GlShaderStatus; -import me.zero.client.api.util.render.shader.glenum.GlShaderType; +import me.zero.client.api.util.render.gl.shader.adapter.ShaderAdapter; +import me.zero.client.api.util.render.gl.glenum.GlShaderStatus; +import me.zero.client.api.util.render.gl.glenum.GlShaderType; /** * Utils for Shader Programs diff --git a/src/main/java/me/zero/client/api/util/render/shader/Uniform.java b/src/main/java/me/zero/client/api/util/render/gl/shader/Uniform.java similarity index 98% rename from src/main/java/me/zero/client/api/util/render/shader/Uniform.java rename to src/main/java/me/zero/client/api/util/render/gl/shader/Uniform.java index c56cb5bc..37ec04eb 100644 --- a/src/main/java/me/zero/client/api/util/render/shader/Uniform.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/Uniform.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.util.render.shader; +package me.zero.client.api.util.render.gl.shader; import me.zero.client.api.util.math.Vec2; import me.zero.client.api.util.math.Vec3; diff --git a/src/main/java/me/zero/client/api/util/render/shader/adapter/ARBShaderAdapter.java b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ARBShaderAdapter.java similarity index 94% rename from src/main/java/me/zero/client/api/util/render/shader/adapter/ARBShaderAdapter.java rename to src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ARBShaderAdapter.java index 73853885..2c0e2e9c 100644 --- a/src/main/java/me/zero/client/api/util/render/shader/adapter/ARBShaderAdapter.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ARBShaderAdapter.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package me.zero.client.api.util.render.shader.adapter; +package me.zero.client.api.util.render.gl.shader.adapter; import me.zero.client.api.exception.ShaderException; -import me.zero.client.api.util.render.shader.glenum.GlShaderStatus; -import me.zero.client.api.util.render.shader.glenum.GlShaderType; +import me.zero.client.api.util.render.gl.glenum.GlShaderStatus; +import me.zero.client.api.util.render.gl.glenum.GlShaderType; import java.util.Objects; diff --git a/src/main/java/me/zero/client/api/util/render/shader/adapter/GL20ShaderAdapter.java b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/GL20ShaderAdapter.java similarity index 94% rename from src/main/java/me/zero/client/api/util/render/shader/adapter/GL20ShaderAdapter.java rename to src/main/java/me/zero/client/api/util/render/gl/shader/adapter/GL20ShaderAdapter.java index d99db359..3c43f699 100644 --- a/src/main/java/me/zero/client/api/util/render/shader/adapter/GL20ShaderAdapter.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/GL20ShaderAdapter.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package me.zero.client.api.util.render.shader.adapter; +package me.zero.client.api.util.render.gl.shader.adapter; import me.zero.client.api.exception.ShaderException; -import me.zero.client.api.util.render.shader.glenum.GlShaderStatus; -import me.zero.client.api.util.render.shader.glenum.GlShaderType; +import me.zero.client.api.util.render.gl.glenum.GlShaderStatus; +import me.zero.client.api.util.render.gl.glenum.GlShaderType; import java.util.Objects; diff --git a/src/main/java/me/zero/client/api/util/render/shader/adapter/ShaderAdapter.java b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapter.java similarity index 94% rename from src/main/java/me/zero/client/api/util/render/shader/adapter/ShaderAdapter.java rename to src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapter.java index 22d78a7e..06ffdfd2 100644 --- a/src/main/java/me/zero/client/api/util/render/shader/adapter/ShaderAdapter.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapter.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package me.zero.client.api.util.render.shader.adapter; +package me.zero.client.api.util.render.gl.shader.adapter; -import me.zero.client.api.util.render.shader.glenum.GlShaderStatus; -import me.zero.client.api.util.render.shader.glenum.GlShaderType; +import me.zero.client.api.util.render.gl.glenum.GlShaderStatus; +import me.zero.client.api.util.render.gl.glenum.GlShaderType; /** * The shell for a Shader Adapter. Used as diff --git a/src/main/java/me/zero/client/api/util/render/shader/adapter/ShaderAdapters.java b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapters.java similarity index 96% rename from src/main/java/me/zero/client/api/util/render/shader/adapter/ShaderAdapters.java rename to src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapters.java index 70b87596..306ef6c8 100644 --- a/src/main/java/me/zero/client/api/util/render/shader/adapter/ShaderAdapters.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapters.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.util.render.shader.adapter; +package me.zero.client.api.util.render.gl.shader.adapter; import org.lwjgl.opengl.GLContext; diff --git a/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java b/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java index ce7ad1a7..7b5f3563 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java +++ b/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java @@ -22,7 +22,7 @@ import me.zero.client.api.ClientAPI; import me.zero.client.api.event.defaults.game.*; import me.zero.client.api.event.handle.ClientHandler; -import me.zero.client.api.util.render.GlUtils; +import me.zero.client.api.util.render.gl.GlUtils; import me.zero.client.load.ClientInitException; import me.zero.client.load.mixin.wrapper.IMinecraft; import net.minecraft.client.Minecraft; From 7b50824cb174527fcf3f321330f2bd15a32c5a25 Mon Sep 17 00:00:00 2001 From: Brady Date: Thu, 20 Jul 2017 13:55:04 -0500 Subject: [PATCH 04/26] Vertex and Fragment parameters are the source, not the path --- .../client/api/util/render/gl/shader/ShaderHelper.java | 7 +++---- .../util/render/gl/shader/adapter/GL20ShaderAdapter.java | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/me/zero/client/api/util/render/gl/shader/ShaderHelper.java b/src/main/java/me/zero/client/api/util/render/gl/shader/ShaderHelper.java index 3e333844..7b1cae41 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/shader/ShaderHelper.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/ShaderHelper.java @@ -16,7 +16,6 @@ package me.zero.client.api.util.render.gl.shader; -import me.zero.client.api.util.io.StreamReader; import me.zero.client.api.util.render.gl.shader.adapter.ShaderAdapter; import me.zero.client.api.util.render.gl.glenum.GlShaderStatus; import me.zero.client.api.util.render.gl.glenum.GlShaderType; @@ -34,16 +33,16 @@ private ShaderHelper() {} /** * Loads a shader of the specified type from the specified path * - * @param path Shader path + * @param adapter The shader adapter used by the system + * @param src Shader source code * @param type Shader type * @return The Shader's Object ID */ - static int loadShader(ShaderAdapter adapter, String path, GlShaderType type) { + static int loadShader(ShaderAdapter adapter, String src, GlShaderType type) { int shaderID = adapter.createShader(type); if (shaderID == 0) return 0; - String src = new StreamReader(Shader.class.getResourceAsStream(path)).read(); adapter.shaderSource(shaderID, src); adapter.compileShader(shaderID); adapter.checkStatus(shaderID, GlShaderStatus.COMPILE); diff --git a/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/GL20ShaderAdapter.java b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/GL20ShaderAdapter.java index 3c43f699..eab94ce6 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/GL20ShaderAdapter.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/GL20ShaderAdapter.java @@ -22,7 +22,7 @@ import java.util.Objects; -import static org.lwjgl.opengl.GL11.GL_FALSE; +import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL20.*; /** From 692d70b674f7d6b4907dce40cf01b17522322960 Mon Sep 17 00:00:00 2001 From: Brady Date: Sat, 22 Jul 2017 17:52:28 -0500 Subject: [PATCH 05/26] Removed unused code, Created OpenGL objects Added "GlObject", a way to easily interface with OpenGL objects in memory. Made a "DisplayList" object for OpenGL display lists. Used the new DisplayList in WidgetHandler --- .../client/api/gui/widget/WidgetHandler.java | 12 +-- .../me/zero/client/api/util/Messages.java | 9 +- .../client/api/util/render/gl/GlObject.java | 82 +++++++++++++++++++ .../api/util/render/gl/glenum/GlListMode.java | 42 ++++++++++ .../util/render/gl/object/DisplayList.java | 57 +++++++++++++ 5 files changed, 191 insertions(+), 11 deletions(-) create mode 100644 src/main/java/me/zero/client/api/util/render/gl/GlObject.java create mode 100644 src/main/java/me/zero/client/api/util/render/gl/glenum/GlListMode.java create mode 100644 src/main/java/me/zero/client/api/util/render/gl/object/DisplayList.java diff --git a/src/main/java/me/zero/client/api/gui/widget/WidgetHandler.java b/src/main/java/me/zero/client/api/gui/widget/WidgetHandler.java index a03e8e58..6b6203bc 100644 --- a/src/main/java/me/zero/client/api/gui/widget/WidgetHandler.java +++ b/src/main/java/me/zero/client/api/gui/widget/WidgetHandler.java @@ -19,6 +19,8 @@ import me.zero.client.api.gui.widget.data.WidgetPos; import me.zero.client.api.util.math.Vec2; import me.zero.client.api.util.render.RenderUtils; +import me.zero.client.api.util.render.gl.glenum.GlListMode; +import me.zero.client.api.util.render.gl.object.DisplayList; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.ScaledResolution; @@ -47,7 +49,7 @@ public final class WidgetHandler { /** * The Open GL instruction list used when rendering */ - private final int list; + private final DisplayList list = new DisplayList(1); private float padding, spacing, position; @@ -58,7 +60,7 @@ public final class WidgetHandler { private boolean outlines; public WidgetHandler() { - list = glGenLists(1); + list.gen(); } /** @@ -98,7 +100,7 @@ public final void draw(FontRenderer font, ScaledResolution sr) { // We write to a list so that the height can // be updated and the required vertical adjustment // can be made before we actually render the widgets - glNewList(list, GL_COMPILE); + list.start(GlListMode.COMPILE); widgets.forEach(widget -> { float mP = (widget.getAlignment().getValue() + 0.5F != 0.0F) ? 1.0F : 0.0F; float xP = pos.getPadding().getX() * padding * mP; @@ -115,13 +117,13 @@ public final void draw(FontRenderer font, ScaledResolution sr) { glTranslatef(0.0F, widget.getHeight() + spacing, 0.0F); position += widget.getHeight(); }); - glEndList(); + list.stop(); position += spacing * (widgets.size() - 1); glTranslatef(0.0F, position * pos.getOffset(), 0.0F); // Render all of the widgets - glCallList(list); + list.call(); glPopMatrix(); }); diff --git a/src/main/java/me/zero/client/api/util/Messages.java b/src/main/java/me/zero/client/api/util/Messages.java index ea098b58..a8bf94d6 100644 --- a/src/main/java/me/zero/client/api/util/Messages.java +++ b/src/main/java/me/zero/client/api/util/Messages.java @@ -17,13 +17,15 @@ package me.zero.client.api.util; import me.zero.client.api.util.logger.Level; +import me.zero.client.api.util.logger.ILogger; /** * Storage for all Messages used by the Logger's logf method * as well as some generic messages sent to the client from * the api. * - * @see me.zero.client.api.util.logger.ILogger#logf(Level, String, Object...) + * @see ILogger#log(Level, String) + * @see ILogger#logf(Level, String, Object...) * * @author Brady * @since 1/21/2017 12:00 PM @@ -36,9 +38,4 @@ public interface Messages { String PLUGIN_CANT_CREATE_MODULE = "Unable to create Module, %s"; String PLUGIN_CANT_LOAD_CLASS = "Unable to load Class, %s"; String PLUGIN_CANT_CREATE_INPUTSTREAM = "Unable to create jar InputStream, %s"; - - String MODULE_INSTANTIATION = "Unable to instantiate Module, %s"; - - String COMMAND_MISSING_ARGS = "Missing required argument: %s, with type %s"; - String COMMAND_INVALID = "Invalid Command"; } diff --git a/src/main/java/me/zero/client/api/util/render/gl/GlObject.java b/src/main/java/me/zero/client/api/util/render/gl/GlObject.java new file mode 100644 index 00000000..6d08a507 --- /dev/null +++ b/src/main/java/me/zero/client/api/util/render/gl/GlObject.java @@ -0,0 +1,82 @@ +/* + * Copyright 2017 ZeroMemes + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.zero.client.api.util.render.gl; + +/** + * Representation of an Object in OpenGL + * + * @author Brady + * @since 7/22/2017 4:18 PM + */ +public abstract class GlObject { + + public static final int UNABLE_TO_GENERATE = 0; + public static final int NOT_GENERATED = -1; + + private int id = NOT_GENERATED; + + /** + * Generates this OpenGL Object. Return value reflects + * whether or not the operation was a success or not. + * + * @return Whether or not the operation was a success. + * May return 'false' if + */ + public final boolean gen() { + return !isGen() && (id = nativeGen()) != UNABLE_TO_GENERATE; + } + + /** + * Called by GlObject#gen() to generate this object. + * + * @return The ID of the (possibly) created object + */ + protected abstract int nativeGen(); + + /** + * Deletes this object from memory. + * + * @return Whether or not the operation was a success + */ + public final boolean delete() { + if (!isGen()) + return false; + + id = NOT_GENERATED; + nativeDelete(); + return true; + } + + /** + * Called by GlObject#delete() to delete this object from memory. + */ + protected abstract void nativeDelete(); + + /** + * @return The ID of this object + */ + public final int id() { + return this.id; + } + + /** + * @return Whether or not the object has been successfully generated + */ + public final boolean isGen() { + return id > 0; + } +} diff --git a/src/main/java/me/zero/client/api/util/render/gl/glenum/GlListMode.java b/src/main/java/me/zero/client/api/util/render/gl/glenum/GlListMode.java new file mode 100644 index 00000000..25156b02 --- /dev/null +++ b/src/main/java/me/zero/client/api/util/render/gl/glenum/GlListMode.java @@ -0,0 +1,42 @@ +/* + * Copyright 2017 ZeroMemes + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.zero.client.api.util.render.gl.glenum; + +import static org.lwjgl.opengl.GL11.*; + +/** + * @author Brady + * @since 7/22/2017 4:32 PM + */ +public enum GlListMode { + + /** + * Commands are merely compiled. + */ + COMPILE(GL_COMPILE), + + /** + * Commands are executed as they are compiled into the display list. + */ + COMPILE_AND_EXECUTE(GL_COMPILE_AND_EXECUTE); + + public final int id; + + GlListMode(int id) { + this.id = id; + } +} diff --git a/src/main/java/me/zero/client/api/util/render/gl/object/DisplayList.java b/src/main/java/me/zero/client/api/util/render/gl/object/DisplayList.java new file mode 100644 index 00000000..0514dda9 --- /dev/null +++ b/src/main/java/me/zero/client/api/util/render/gl/object/DisplayList.java @@ -0,0 +1,57 @@ +/* + * Copyright 2017 ZeroMemes + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.zero.client.api.util.render.gl.object; + +import me.zero.client.api.util.render.gl.GlObject; +import me.zero.client.api.util.render.gl.glenum.GlListMode; + +import static org.lwjgl.opengl.GL11.*; + +/** + * @author Brady + * @since 7/22/2017 4:27 PM + */ +public final class DisplayList extends GlObject { + + private final int range; + + public DisplayList(int range) { + this.range = range; + } + + @Override + protected final int nativeGen() { + return glGenLists(range); + } + + @Override + protected final void nativeDelete() { + glDeleteLists(id(), range); + } + + public final void start(GlListMode mode) { + glNewList(id(), mode.id); + } + + public final void stop() { + glEndList(); + } + + public final void call() { + glCallList(id()); + } +} From b8bc1b4c0a984ca3611bcf169547eaf6876747af Mon Sep 17 00:00:00 2001 From: Brady Date: Sun, 23 Jul 2017 16:22:30 -0500 Subject: [PATCH 06/26] More GL Stuff (Read Description) Capitalized "L" in "GL" for multiple classes Created Query object Rewrote Shader system (Shader and ShaderProgram) Added Geometry shader support Removed GlListMode --- .../client/api/gui/widget/WidgetHandler.java | 5 +- .../client/api/util/render/RenderUtils.java | 24 ++-- .../render/gl/{object => }/DisplayList.java | 35 ++++- .../gl/{GlObject.java => GLObject.java} | 6 +- .../zero/client/api/util/render/gl/Query.java | 74 ++++++++++ .../client/api/util/render/gl/Shader.java | 79 ++++++++++ .../api/util/render/gl/ShaderProgram.java | 135 ++++++++++++++++++ ...{GlClientState.java => GLClientState.java} | 4 +- ...lShaderStatus.java => GLShaderStatus.java} | 2 +- .../{GlShaderType.java => GLShaderType.java} | 6 +- .../api/util/render/gl/glenum/GlListMode.java | 42 ------ .../api/util/render/gl/shader/Shader.java | 110 -------------- .../util/render/gl/shader/ShaderHelper.java | 51 ------- .../api/util/render/gl/shader/Uniform.java | 6 +- .../gl/shader/adapter/ARBShaderAdapter.java | 13 +- .../gl/shader/adapter/GL20ShaderAdapter.java | 11 +- .../gl/shader/adapter/ShaderAdapter.java | 8 +- .../gl/shader/adapter/ShaderAdapters.java | 6 +- 18 files changed, 366 insertions(+), 251 deletions(-) rename src/main/java/me/zero/client/api/util/render/gl/{object => }/DisplayList.java (55%) rename src/main/java/me/zero/client/api/util/render/gl/{GlObject.java => GLObject.java} (91%) create mode 100644 src/main/java/me/zero/client/api/util/render/gl/Query.java create mode 100644 src/main/java/me/zero/client/api/util/render/gl/Shader.java create mode 100644 src/main/java/me/zero/client/api/util/render/gl/ShaderProgram.java rename src/main/java/me/zero/client/api/util/render/gl/glenum/{GlClientState.java => GLClientState.java} (93%) rename src/main/java/me/zero/client/api/util/render/gl/glenum/{GlShaderStatus.java => GLShaderStatus.java} (96%) rename src/main/java/me/zero/client/api/util/render/gl/glenum/{GlShaderType.java => GLShaderType.java} (85%) delete mode 100644 src/main/java/me/zero/client/api/util/render/gl/glenum/GlListMode.java delete mode 100644 src/main/java/me/zero/client/api/util/render/gl/shader/Shader.java delete mode 100644 src/main/java/me/zero/client/api/util/render/gl/shader/ShaderHelper.java diff --git a/src/main/java/me/zero/client/api/gui/widget/WidgetHandler.java b/src/main/java/me/zero/client/api/gui/widget/WidgetHandler.java index 6b6203bc..90058aa4 100644 --- a/src/main/java/me/zero/client/api/gui/widget/WidgetHandler.java +++ b/src/main/java/me/zero/client/api/gui/widget/WidgetHandler.java @@ -19,8 +19,7 @@ import me.zero.client.api.gui.widget.data.WidgetPos; import me.zero.client.api.util.math.Vec2; import me.zero.client.api.util.render.RenderUtils; -import me.zero.client.api.util.render.gl.glenum.GlListMode; -import me.zero.client.api.util.render.gl.object.DisplayList; +import me.zero.client.api.util.render.gl.DisplayList; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.ScaledResolution; @@ -100,7 +99,7 @@ public final void draw(FontRenderer font, ScaledResolution sr) { // We write to a list so that the height can // be updated and the required vertical adjustment // can be made before we actually render the widgets - list.start(GlListMode.COMPILE); + list.start(GL_COMPILE); widgets.forEach(widget -> { float mP = (widget.getAlignment().getValue() + 0.5F != 0.0F) ? 1.0F : 0.0F; float xP = pos.getPadding().getX() * padding * mP; diff --git a/src/main/java/me/zero/client/api/util/render/RenderUtils.java b/src/main/java/me/zero/client/api/util/render/RenderUtils.java index 394f6b15..9a597a72 100644 --- a/src/main/java/me/zero/client/api/util/render/RenderUtils.java +++ b/src/main/java/me/zero/client/api/util/render/RenderUtils.java @@ -18,7 +18,7 @@ import me.zero.client.api.util.math.Vec2; import me.zero.client.api.util.math.Vec3; -import me.zero.client.api.util.render.gl.glenum.GlClientState; +import me.zero.client.api.util.render.gl.glenum.GLClientState; import me.zero.client.api.util.render.gl.GlUtils; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.OpenGlHelper; @@ -80,7 +80,7 @@ public static void setupRender(boolean start) { * * @param enabled The new enabled state of {@code GL_VERTEX_ARRAY} */ - public static void setupClientState(GlClientState state, boolean enabled) { + public static void setupClientState(GLClientState state, boolean enabled) { csBuffer.clear(); if (state.ordinal() > 0) csBuffer.add(state.cap); @@ -141,9 +141,9 @@ public static void drawLine(float x, float y, float z, float x1, float y1, float glLineWidth(width); setupRender(true); - setupClientState(GlClientState.VERTEX, true); + setupClientState(GLClientState.VERTEX, true); tessellator.vertex(x, y, z).vertex(x1, y1, z1).draw(GL_LINE_STRIP); - setupClientState(GlClientState.VERTEX, false); + setupClientState(GLClientState.VERTEX, false); setupRender(false); } @@ -156,7 +156,7 @@ public static void drawLine(float x, float y, float z, float x1, float y1, float * @param y2 Bottom corner Y of the rectangle */ public static void drawFlippedTexturedRect(float x1, float y1, float x2, float y2) { - setupClientState(GlClientState.TEXTURE, true); + setupClientState(GLClientState.TEXTURE, true); tessellator .vertex(x1, y2, 0).texture(0, 0) @@ -165,7 +165,7 @@ public static void drawFlippedTexturedRect(float x1, float y1, float x2, float y .vertex(x1, y1, 0).texture(0, 1) .draw(GL_QUADS); - setupClientState(GlClientState.TEXTURE, false); + setupClientState(GLClientState.TEXTURE, false); } /** @@ -177,7 +177,7 @@ public static void drawFlippedTexturedRect(float x1, float y1, float x2, float y * @param y2 Bottom corner Y of the rectangle */ public static void drawReflectedTexturedRect(float x1, float y1, float x2, float y2) { - setupClientState(GlClientState.TEXTURE, true); + setupClientState(GLClientState.TEXTURE, true); tessellator .vertex(x1, y2, 0).texture(1, 0) @@ -186,7 +186,7 @@ public static void drawReflectedTexturedRect(float x1, float y1, float x2, float .vertex(x1, y1, 0).texture(1, 1) .draw(GL_QUADS); - setupClientState(GlClientState.TEXTURE, false); + setupClientState(GLClientState.TEXTURE, false); } /** @@ -202,9 +202,9 @@ public static void rectangle(float x1, float y1, float x2, float y2, int color) GlUtils.glColor(color); setupRender(true); - setupClientState(GlClientState.VERTEX, true); + setupClientState(GLClientState.VERTEX, true); tessellator.vertex(x1, y2, 0).vertex(x2, y2, 0).vertex(x2, y1, 0).vertex(x1, y1, 0).draw(GL_QUADS); - setupClientState(GlClientState.VERTEX, false); + setupClientState(GLClientState.VERTEX, false); setupRender(false); } @@ -261,7 +261,7 @@ private static void rectangleGradient(float x1, float y1, float x2, float y2, in setupRender(true); OpenGlHelper.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 1, 0); GlStateManager.shadeModel(GL_FLAT); - setupClientState(GlClientState.COLOR, true); + setupClientState(GLClientState.COLOR, true); tessellator .color(r[0], g[0], b[0], a[0]).vertex(x1, y2, 0) @@ -270,7 +270,7 @@ private static void rectangleGradient(float x1, float y1, float x2, float y2, in .color(r[3], g[3], b[3], a[3]).vertex(x1, y1, 0) .draw(GL_QUADS); - setupClientState(GlClientState.COLOR, false); + setupClientState(GLClientState.COLOR, false); GlStateManager.shadeModel(GL_FLAT); setupRender(false); } diff --git a/src/main/java/me/zero/client/api/util/render/gl/object/DisplayList.java b/src/main/java/me/zero/client/api/util/render/gl/DisplayList.java similarity index 55% rename from src/main/java/me/zero/client/api/util/render/gl/object/DisplayList.java rename to src/main/java/me/zero/client/api/util/render/gl/DisplayList.java index 0514dda9..3ad2ee41 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/object/DisplayList.java +++ b/src/main/java/me/zero/client/api/util/render/gl/DisplayList.java @@ -14,19 +14,27 @@ * limitations under the License. */ -package me.zero.client.api.util.render.gl.object; +package me.zero.client.api.util.render.gl; -import me.zero.client.api.util.render.gl.GlObject; -import me.zero.client.api.util.render.gl.glenum.GlListMode; +import me.zero.client.api.util.render.gl.GLObject; import static org.lwjgl.opengl.GL11.*; /** + * Display lists are used to capture OpenGL instructions. + * These instructions can then later be called upon. This + * is generally more efficient then repeating the + * instructions multiple times in the code directly. + * * @author Brady * @since 7/22/2017 4:27 PM */ -public final class DisplayList extends GlObject { +public final class DisplayList extends GLObject { + /** + * The number of contiguous empty display lists to be generated. + * In most cases, '1' will suffice. + */ private final int range; public DisplayList(int range) { @@ -43,14 +51,29 @@ protected final void nativeDelete() { glDeleteLists(id(), range); } - public final void start(GlListMode mode) { - glNewList(id(), mode.id); + /** + * Begins capturing all subsequent instructions + * + * @see #stop() + * + * @param mode Instruction capture mode + */ + public final void start(int mode) { + glNewList(id(), mode); } + /** + * Stops capturing all instructions since start + * + * @see #start(int) + */ public final void stop() { glEndList(); } + /** + * Calls all instructions that have been captured by this list + */ public final void call() { glCallList(id()); } diff --git a/src/main/java/me/zero/client/api/util/render/gl/GlObject.java b/src/main/java/me/zero/client/api/util/render/gl/GLObject.java similarity index 91% rename from src/main/java/me/zero/client/api/util/render/gl/GlObject.java rename to src/main/java/me/zero/client/api/util/render/gl/GLObject.java index 6d08a507..3646a37c 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/GlObject.java +++ b/src/main/java/me/zero/client/api/util/render/gl/GLObject.java @@ -22,7 +22,7 @@ * @author Brady * @since 7/22/2017 4:18 PM */ -public abstract class GlObject { +public abstract class GLObject { public static final int UNABLE_TO_GENERATE = 0; public static final int NOT_GENERATED = -1; @@ -48,7 +48,9 @@ public final boolean gen() { protected abstract int nativeGen(); /** - * Deletes this object from memory. + * Deletes this object from memory. This should be called + * when the application is shutting down to efficiently + * garbage collect memory. * * @return Whether or not the operation was a success */ diff --git a/src/main/java/me/zero/client/api/util/render/gl/Query.java b/src/main/java/me/zero/client/api/util/render/gl/Query.java new file mode 100644 index 00000000..d509e2e7 --- /dev/null +++ b/src/main/java/me/zero/client/api/util/render/gl/Query.java @@ -0,0 +1,74 @@ +/* + * Copyright 2017 ZeroMemes + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.zero.client.api.util.render.gl; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL15.*; + +/** + * @author Brady + * @since 7/22/2017 10:16 PM + */ +public final class Query extends GLObject { + + private final int target; + + public Query(int target) { + this.target = target; + } + + @Override + protected int nativeGen() { + return glGenQueries(); + } + + @Override + protected void nativeDelete() { + glDeleteQueries(id()); + } + + /** + * Marks the starting bounds of the query scope + */ + public final void start() { + glBeginQuery(target, id()); + } + + /** + * Marks the stopping bounds of the query scope + */ + public final void stop() { + glEndQuery(target); + } + + /** + * Returns the result of the query, the result + * will vary based on the query target. + * + * @return The result of the query. + */ + public final int getResult() { + return glGetQueryObjecti(target, GL_QUERY_RESULT); + } + + /** + * @return Whether or not the result of the query is available yet + */ + public final boolean isResultAvailable() { + return glGetQueryObjecti(target, GL_QUERY_RESULT_AVAILABLE) == GL_TRUE; + } +} diff --git a/src/main/java/me/zero/client/api/util/render/gl/Shader.java b/src/main/java/me/zero/client/api/util/render/gl/Shader.java new file mode 100644 index 00000000..2dc8aa8e --- /dev/null +++ b/src/main/java/me/zero/client/api/util/render/gl/Shader.java @@ -0,0 +1,79 @@ +/* + * Copyright 2017 ZeroMemes + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.zero.client.api.util.render.gl; + +import me.zero.client.api.exception.ShaderException; +import me.zero.client.api.util.render.gl.glenum.GLShaderStatus; +import me.zero.client.api.util.render.gl.glenum.GLShaderType; +import me.zero.client.api.util.render.gl.shader.adapter.ShaderAdapter; +import me.zero.client.api.util.render.gl.shader.adapter.ShaderAdapters; + +/** + * @author Brady + * @since 7/23/2017 3:24 PM + */ +public final class Shader extends GLObject { + + /** + * Instance of the system supported shader adapter + */ + private static final ShaderAdapter adapter = ShaderAdapters.getSystemAdapter(); + + /** + * Source code of the shader + */ + private final String src; + + /** + * Type of shader + */ + private final GLShaderType type; + + public Shader(GLShaderType type, String src) { + this.type = type; + this.src = src; + } + + @Override + protected int nativeGen() { + int shaderID = adapter.createShader(type); + if (shaderID == 0) + return 0; + + try { + adapter.shaderSource(shaderID, src); + adapter.compileShader(shaderID); + adapter.checkStatus(shaderID, GLShaderStatus.COMPILE); + } catch (ShaderException e) { + return 0; + } + + return shaderID; + } + + @Override + protected void nativeDelete() { + adapter.deleteShader(id()); + } + + /** + * @return The type of shader this object represents + */ + public final GLShaderType getType() { + return this.type; + } +} diff --git a/src/main/java/me/zero/client/api/util/render/gl/ShaderProgram.java b/src/main/java/me/zero/client/api/util/render/gl/ShaderProgram.java new file mode 100644 index 00000000..d3fcaefa --- /dev/null +++ b/src/main/java/me/zero/client/api/util/render/gl/ShaderProgram.java @@ -0,0 +1,135 @@ +/* + * Copyright 2017 ZeroMemes + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.zero.client.api.util.render.gl; + +import me.zero.client.api.exception.ShaderException; +import me.zero.client.api.util.render.gl.glenum.GLShaderStatus; +import me.zero.client.api.util.render.gl.glenum.GLShaderType; +import me.zero.client.api.util.render.gl.shader.Uniform; +import me.zero.client.api.util.render.gl.shader.adapter.ShaderAdapter; +import me.zero.client.api.util.render.gl.shader.adapter.ShaderAdapters; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Brady + * @since 7/23/2017 3:31 PM + */ +public final class ShaderProgram extends GLObject { + + /** + * Instance of the system supported shader adapter + */ + private static final ShaderAdapter adapter = ShaderAdapters.getSystemAdapter(); + + /** + * The uniform variables for this shader program + */ + private final Map uniforms = new HashMap<>(); + + /** + * The shaders attached to this program + */ + private final List shaders = new ArrayList<>(); + + @Override + protected final int nativeGen() { + int id = adapter.createProgram(); + shaders.forEach(shader -> adapter.attachObject(id, shader.id())); + + try { + adapter.linkProgram(id); + adapter.checkStatus(id, GLShaderStatus.LINK); + adapter.validateProgram(id); + adapter.checkStatus(id, GLShaderStatus.VALIDATE); + } catch (ShaderException e) { + e.printStackTrace(); + return 0; + } + + return id; + } + + @Override + protected final void nativeDelete() { + adapter.deleteProgram(id()); + shaders.forEach(GLObject::delete); + } + + /** + * Attaches the shader program. Multiple shader + * programs may not be attached simultaneously. + */ + public final void attach() { + adapter.useProgram(id()); + update(); + } + + /** + * Detaches the shader program + */ + public final void detach() { + adapter.useProgram(0); + } + + /** + * May be overriden by implementations of this class. Used to + * update uniform variable values when the shader is attached. + */ + protected void update() {} + + /** + * Attaches a shader to this shader program. This may only be + * done before the shader has been compiled via the gen() method + * and there isn't already a shader with the same type. + * + * @param shader The shader + * @return Whether or not the operation was a success + */ + public final boolean attachShader(Shader shader) { + if (isGen() || getShader(shader.getType()) != null) + return false; + + shaders.add(shader); + return true; + } + + /** + * Finds and returns a shader attached to this program + * with the specified type, if there is one. Returns 'null' + * if a shader isn't found. + * + * @param type The type of shader + * @return The shader with the specified type + */ + public final Shader getShader(GLShaderType type) { + return shaders.stream().filter(shader -> shader.getType() == type).findFirst().orElse(null); + } + + /** + * Gets a uniform variable from the specified name + * + * @param name The Uniform Name + * @return The Uniform Variable + */ + protected final Uniform getUniform(String name) { + return uniforms.computeIfAbsent(name, n -> Uniform.get(id(), n)); + } +} diff --git a/src/main/java/me/zero/client/api/util/render/gl/glenum/GlClientState.java b/src/main/java/me/zero/client/api/util/render/gl/glenum/GLClientState.java similarity index 93% rename from src/main/java/me/zero/client/api/util/render/gl/glenum/GlClientState.java rename to src/main/java/me/zero/client/api/util/render/gl/glenum/GLClientState.java index 23f18eca..494ed7fb 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/glenum/GlClientState.java +++ b/src/main/java/me/zero/client/api/util/render/gl/glenum/GLClientState.java @@ -18,7 +18,7 @@ import static org.lwjgl.opengl.GL11.*; -public enum GlClientState { +public enum GLClientState { VERTEX(GL_VERTEX_ARRAY), COLOR(GL_COLOR_ARRAY), @@ -26,7 +26,7 @@ public enum GlClientState { public final int cap; - GlClientState(int cap) { + GLClientState(int cap) { this.cap = cap; } } diff --git a/src/main/java/me/zero/client/api/util/render/gl/glenum/GlShaderStatus.java b/src/main/java/me/zero/client/api/util/render/gl/glenum/GLShaderStatus.java similarity index 96% rename from src/main/java/me/zero/client/api/util/render/gl/glenum/GlShaderStatus.java rename to src/main/java/me/zero/client/api/util/render/gl/glenum/GLShaderStatus.java index b6e4e9ca..a121d13d 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/glenum/GlShaderStatus.java +++ b/src/main/java/me/zero/client/api/util/render/gl/glenum/GLShaderStatus.java @@ -20,7 +20,7 @@ * @author Brady * @since 5/21/2017 1:05 PM */ -public enum GlShaderStatus { +public enum GLShaderStatus { COMPILE, LINK, VALIDATE } diff --git a/src/main/java/me/zero/client/api/util/render/gl/glenum/GlShaderType.java b/src/main/java/me/zero/client/api/util/render/gl/glenum/GLShaderType.java similarity index 85% rename from src/main/java/me/zero/client/api/util/render/gl/glenum/GlShaderType.java rename to src/main/java/me/zero/client/api/util/render/gl/glenum/GLShaderType.java index 985c114a..a751af69 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/glenum/GlShaderType.java +++ b/src/main/java/me/zero/client/api/util/render/gl/glenum/GLShaderType.java @@ -18,13 +18,11 @@ /** * Enum to represent different shader types. - * Geometry shaders are excluded, because the - * usage of them is not needed. * * @author Brady * @since 5/21/2017 12:02 PM */ -public enum GlShaderType { +public enum GLShaderType { - VERTEX, FRAGMENT + VERTEX, FRAGMENT, GEOMETRY } diff --git a/src/main/java/me/zero/client/api/util/render/gl/glenum/GlListMode.java b/src/main/java/me/zero/client/api/util/render/gl/glenum/GlListMode.java deleted file mode 100644 index 25156b02..00000000 --- a/src/main/java/me/zero/client/api/util/render/gl/glenum/GlListMode.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2017 ZeroMemes - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package me.zero.client.api.util.render.gl.glenum; - -import static org.lwjgl.opengl.GL11.*; - -/** - * @author Brady - * @since 7/22/2017 4:32 PM - */ -public enum GlListMode { - - /** - * Commands are merely compiled. - */ - COMPILE(GL_COMPILE), - - /** - * Commands are executed as they are compiled into the display list. - */ - COMPILE_AND_EXECUTE(GL_COMPILE_AND_EXECUTE); - - public final int id; - - GlListMode(int id) { - this.id = id; - } -} diff --git a/src/main/java/me/zero/client/api/util/render/gl/shader/Shader.java b/src/main/java/me/zero/client/api/util/render/gl/shader/Shader.java deleted file mode 100644 index a9a28feb..00000000 --- a/src/main/java/me/zero/client/api/util/render/gl/shader/Shader.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2017 ZeroMemes - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package me.zero.client.api.util.render.gl.shader; - -import me.zero.client.api.util.interfaces.Helper; -import me.zero.client.api.util.render.gl.shader.adapter.ShaderAdapter; -import me.zero.client.api.util.render.gl.shader.adapter.ShaderAdapters; -import me.zero.client.api.util.render.gl.glenum.GlShaderStatus; -import me.zero.client.api.util.render.gl.glenum.GlShaderType; - -import java.util.HashMap; -import java.util.Map; - -import static me.zero.client.api.util.render.gl.shader.ShaderHelper.*; - -/** - * Used to create ARB Shader Programs with OpenGL - * - * @author Brady - * @since 2/16/2017 12:00 PM - */ -public abstract class Shader implements Helper { - - /** - * Instance of the system supported shader adapter - */ - private final ShaderAdapter adapter = ShaderAdapters.getSystemAdapter(); - - /** - * The uniform variables for this shader - */ - private final Map uniforms = new HashMap<>(); - - /** - * Various Object IDs - */ - private final int programID, fragmentID, vertexID; - - public Shader(String vertex, String fragment) { - programID = adapter.createProgram(); - vertexID = loadShader(adapter, vertex, GlShaderType.VERTEX); - fragmentID = loadShader(adapter, fragment, GlShaderType.FRAGMENT); - - adapter.attachObject(programID, vertexID); - adapter.attachObject(programID, fragmentID); - - adapter.linkProgram(programID); - adapter.checkStatus(programID, GlShaderStatus.LINK); - - adapter.validateProgram(programID); - adapter.checkStatus(programID, GlShaderStatus.VALIDATE); - } - - /** - * Attaches the shader program - */ - public final void attach() { - adapter.useProgram(programID); - update(); - } - - /** - * Detaches the shader program - */ - public final void detach() { - adapter.useProgram(0); - } - - /** - * Called after the shader program is - * attached to update the uniform vars - */ - public abstract void update(); - - /** - * Deletes this ShaderProgram - */ - public final void delete() { - detach(); - adapter.detachObject(programID, vertexID); - adapter.detachObject(programID, fragmentID); - adapter.deleteShader(vertexID); - adapter.deleteShader(fragmentID); - adapter.deleteProgram(programID); - } - - /** - * Gets a uniform variable from the specified name - * - * @param name The Uniform Name - * @return The Uniform Variable - */ - protected final Uniform getUniform(String name) { - return uniforms.computeIfAbsent(name, n -> Uniform.get(programID, n)); - } -} diff --git a/src/main/java/me/zero/client/api/util/render/gl/shader/ShaderHelper.java b/src/main/java/me/zero/client/api/util/render/gl/shader/ShaderHelper.java deleted file mode 100644 index 7b1cae41..00000000 --- a/src/main/java/me/zero/client/api/util/render/gl/shader/ShaderHelper.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2017 ZeroMemes - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package me.zero.client.api.util.render.gl.shader; - -import me.zero.client.api.util.render.gl.shader.adapter.ShaderAdapter; -import me.zero.client.api.util.render.gl.glenum.GlShaderStatus; -import me.zero.client.api.util.render.gl.glenum.GlShaderType; - -/** - * Utils for Shader Programs - * - * @author Brady - * @since 2/16/2017 12:00 PM - */ -final class ShaderHelper { - - private ShaderHelper() {} - - /** - * Loads a shader of the specified type from the specified path - * - * @param adapter The shader adapter used by the system - * @param src Shader source code - * @param type Shader type - * @return The Shader's Object ID - */ - static int loadShader(ShaderAdapter adapter, String src, GlShaderType type) { - int shaderID = adapter.createShader(type); - if (shaderID == 0) - return 0; - - adapter.shaderSource(shaderID, src); - adapter.compileShader(shaderID); - adapter.checkStatus(shaderID, GlShaderStatus.COMPILE); - return shaderID; - } -} diff --git a/src/main/java/me/zero/client/api/util/render/gl/shader/Uniform.java b/src/main/java/me/zero/client/api/util/render/gl/shader/Uniform.java index 37ec04eb..3b385909 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/shader/Uniform.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/Uniform.java @@ -106,11 +106,11 @@ public final int getLocation() { /** * Creates a uniform variable from the shader object id and the uniform's name * - * @param shaderID Shader object ID + * @param programID Shader program ID * @param uniformName Uniform Name * @return The UniformVariable representation */ - public static Uniform get(int shaderID, String uniformName) { - return new Uniform(uniformName, glGetUniformLocationARB(shaderID, uniformName)); + public static Uniform get(int programID, String uniformName) { + return new Uniform(uniformName, glGetUniformLocationARB(programID, uniformName)); } } diff --git a/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ARBShaderAdapter.java b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ARBShaderAdapter.java index 2c0e2e9c..cf547b12 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ARBShaderAdapter.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ARBShaderAdapter.java @@ -17,15 +17,16 @@ package me.zero.client.api.util.render.gl.shader.adapter; import me.zero.client.api.exception.ShaderException; -import me.zero.client.api.util.render.gl.glenum.GlShaderStatus; -import me.zero.client.api.util.render.gl.glenum.GlShaderType; +import me.zero.client.api.util.render.gl.glenum.GLShaderStatus; +import me.zero.client.api.util.render.gl.glenum.GLShaderType; import java.util.Objects; import static org.lwjgl.opengl.ARBFragmentShader.*; +import static org.lwjgl.opengl.ARBGeometryShader4.*; import static org.lwjgl.opengl.ARBShaderObjects.*; import static org.lwjgl.opengl.ARBVertexShader.*; -import static org.lwjgl.opengl.GL11.GL_FALSE; +import static org.lwjgl.opengl.GL11.*; /** * @author Brady @@ -51,7 +52,7 @@ public void validateProgram(int programObj) { } @Override - public int createShader(GlShaderType type) { + public int createShader(GLShaderType type) { Objects.requireNonNull(type); switch (type) { @@ -59,6 +60,8 @@ public int createShader(GlShaderType type) { return glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); case FRAGMENT: return glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); + case GEOMETRY: + return glCreateShaderObjectARB(GL_GEOMETRY_SHADER_ARB); } return 0; @@ -100,7 +103,7 @@ public void deleteShader(int shader) { } @Override - public void checkStatus(int program, GlShaderStatus status) { + public void checkStatus(int program, GLShaderStatus status) { Objects.requireNonNull(status); int pname = 0; diff --git a/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/GL20ShaderAdapter.java b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/GL20ShaderAdapter.java index eab94ce6..bf05b3fd 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/GL20ShaderAdapter.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/GL20ShaderAdapter.java @@ -17,13 +17,14 @@ package me.zero.client.api.util.render.gl.shader.adapter; import me.zero.client.api.exception.ShaderException; -import me.zero.client.api.util.render.gl.glenum.GlShaderStatus; -import me.zero.client.api.util.render.gl.glenum.GlShaderType; +import me.zero.client.api.util.render.gl.glenum.GLShaderStatus; +import me.zero.client.api.util.render.gl.glenum.GLShaderType; import java.util.Objects; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL20.*; +import static org.lwjgl.opengl.GL32.*; /** * @author Brady @@ -49,7 +50,7 @@ public void validateProgram(int programObj) { } @Override - public int createShader(GlShaderType type) { + public int createShader(GLShaderType type) { Objects.requireNonNull(type); switch (type) { @@ -57,6 +58,8 @@ public int createShader(GlShaderType type) { return glCreateShader(GL_VERTEX_SHADER); case FRAGMENT: return glCreateShader(GL_FRAGMENT_SHADER); + case GEOMETRY: + return glCreateShader(GL_GEOMETRY_SHADER); } return 0; @@ -98,7 +101,7 @@ public void useProgram(int program) { } @Override - public void checkStatus(int program, GlShaderStatus status) { + public void checkStatus(int program, GLShaderStatus status) { Objects.requireNonNull(status); int pname = 0; diff --git a/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapter.java b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapter.java index 06ffdfd2..2fe65dd5 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapter.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapter.java @@ -16,8 +16,8 @@ package me.zero.client.api.util.render.gl.shader.adapter; -import me.zero.client.api.util.render.gl.glenum.GlShaderStatus; -import me.zero.client.api.util.render.gl.glenum.GlShaderType; +import me.zero.client.api.util.render.gl.glenum.GLShaderStatus; +import me.zero.client.api.util.render.gl.glenum.GLShaderType; /** * The shell for a Shader Adapter. Used as @@ -58,7 +58,7 @@ public interface ShaderAdapter { * @param type The type of shader * @return The shader's object id */ - int createShader(GlShaderType type); + int createShader(GLShaderType type); /** * Attaches the shader's source with the shader object. @@ -121,7 +121,7 @@ public interface ShaderAdapter { * @param program The shader program id * @param status The status flag being checked */ - void checkStatus(int program, GlShaderStatus status); + void checkStatus(int program, GLShaderStatus status); /** * Gets a shader program's log info diff --git a/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapters.java b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapters.java index 306ef6c8..727f866a 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapters.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapters.java @@ -34,8 +34,10 @@ public final class ShaderAdapters { private ShaderAdapters() {} static { - // Check if OpenGL 2.0 is supported by the machine - if (GLContext.getCapabilities().OpenGL20) + // Check if OpenGL 2.0 and OpenGL 3.2 are supported by the machine + // If 3.2 is supported, 2.0 should be too, but we have 2 checks here + // just to be safe. + if (GLContext.getCapabilities().OpenGL20 && GLContext.getCapabilities().OpenGL32) systemDefault = new GL20ShaderAdapter(); else systemDefault = new ARBShaderAdapter(); From 96cf7fd5efa00d5b0e165dda3562e7760776c452 Mon Sep 17 00:00:00 2001 From: Brady Date: Sun, 23 Jul 2017 17:57:54 -0500 Subject: [PATCH 07/26] Repackaged events according to category --- .../java/me/zero/client/api/ClientAPI.java | 5 ++++ .../handler/listener/ChatCommandListener.java | 2 +- .../client/api/event/CAPIEventManager.java | 16 ++++++++++++ .../event/defaults/filters/PacketFilter.java | 2 +- .../defaults/game/{ => core}/ClickEvent.java | 2 +- .../game/{ => core}/GameShutdownEvent.java | 2 +- .../defaults/game/{ => core}/KeyEvent.java | 2 +- .../defaults/game/{ => core}/LoopEvent.java | 2 +- .../game/{ => core}/ProfilerEvent.java | 25 ++++++++++++++++--- .../defaults/game/{ => core}/TickEvent.java | 2 +- .../defaults/game/{ => core}/UpdateEvent.java | 2 +- .../{ => entity}/EntityCollisionEvent.java | 2 +- .../game/{ => entity}/EntityDeathEvent.java | 2 +- .../game/{ => entity}/LivingUpdateEvent.java | 2 +- .../game/{ => entity}/MotionUpdateEvent.java | 2 +- .../defaults/game/{ => entity}/MoveEvent.java | 2 +- .../defaults/game/{ => misc}/ChatEvent.java | 2 +- .../game/{ => network}/PacketEvent.java | 5 ++-- .../game/{ => render}/EntityRenderEvent.java | 2 +- .../game/{ => render}/GlintEffectEvent.java | 2 +- .../defaults/game/{ => render}/GuiEvent.java | 2 +- .../game/{ => render}/ItemRenderEvent.java | 5 ++-- .../game/{ => render}/LayerRenderEvent.java | 2 +- .../game/{ => render}/Render3DEvent.java | 2 +- .../{ => render}/RenderEntityLabelEvent.java | 2 +- .../game/{ => render}/RenderHudEvent.java | 2 +- .../game/{ => render}/RenderScreenEvent.java | 2 +- .../game/{ => render}/TeamColorEvent.java | 2 +- .../defaults/game/{ => render}/TextEvent.java | 2 +- .../game/{ => world}/BlockCollisionEvent.java | 2 +- .../game/{ => world}/BoundingBoxEvent.java | 2 +- .../defaults/game/{ => world}/WorldEvent.java | 2 +- .../api/event/handle/ClientHandler.java | 8 +++++- .../me/zero/client/api/util/PluginFinder.java | 4 +-- .../client/api/util/render/gl/GlUtils.java | 2 +- .../me/zero/client/load/mixin/MixinBlock.java | 4 +-- .../zero/client/load/mixin/MixinEntity.java | 2 +- .../load/mixin/MixinEntityLivingBase.java | 2 +- .../load/mixin/MixinEntityPlayerSP.java | 8 +++--- .../load/mixin/MixinEntityRenderer.java | 2 +- .../client/load/mixin/MixinFontRenderer.java | 2 +- .../client/load/mixin/MixinGuiIngame.java | 2 +- .../client/load/mixin/MixinItemRenderer.java | 2 +- .../load/mixin/MixinLayerArmorBase.java | 2 +- .../client/load/mixin/MixinMinecraft.java | 9 +++++-- .../load/mixin/MixinNettyPacketDecoder.java | 3 +-- .../load/mixin/MixinNettyPacketEncoder.java | 2 +- .../load/mixin/MixinNetworkManager.java | 2 +- .../zero/client/load/mixin/MixinProfiler.java | 7 ++++-- .../zero/client/load/mixin/MixinRender.java | 4 +-- .../client/load/mixin/MixinRenderItem.java | 2 +- .../load/mixin/MixinRenderLivingBase.java | 2 +- .../client/load/mixin/MixinRenderManager.java | 2 +- .../client/load/mixin/wrapper/IMinecraft.java | 2 +- 54 files changed, 118 insertions(+), 67 deletions(-) rename src/main/java/me/zero/client/api/event/defaults/game/{ => core}/ClickEvent.java (97%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => core}/GameShutdownEvent.java (95%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => core}/KeyEvent.java (95%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => core}/LoopEvent.java (93%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => core}/ProfilerEvent.java (62%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => core}/TickEvent.java (93%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => core}/UpdateEvent.java (93%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => entity}/EntityCollisionEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => entity}/EntityDeathEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => entity}/LivingUpdateEvent.java (95%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => entity}/MotionUpdateEvent.java (98%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => entity}/MoveEvent.java (97%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => misc}/ChatEvent.java (97%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => network}/PacketEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => render}/EntityRenderEvent.java (98%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => render}/GlintEffectEvent.java (95%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => render}/GuiEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => render}/ItemRenderEvent.java (97%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => render}/LayerRenderEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => render}/Render3DEvent.java (95%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => render}/RenderEntityLabelEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => render}/RenderHudEvent.java (95%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => render}/RenderScreenEvent.java (95%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => render}/TeamColorEvent.java (96%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => render}/TextEvent.java (95%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => world}/BlockCollisionEvent.java (95%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => world}/BoundingBoxEvent.java (97%) rename src/main/java/me/zero/client/api/event/defaults/game/{ => world}/WorldEvent.java (96%) diff --git a/src/main/java/me/zero/client/api/ClientAPI.java b/src/main/java/me/zero/client/api/ClientAPI.java index c2b59e9b..ac01d166 100644 --- a/src/main/java/me/zero/client/api/ClientAPI.java +++ b/src/main/java/me/zero/client/api/ClientAPI.java @@ -32,6 +32,11 @@ public final class ClientAPI { */ private ClientAPI() {} + /** + * Current version of the API + */ + public static final double VERSION = 2.1; + /** * Instance of the API event bus. All default game event are * passed through this event bus. diff --git a/src/main/java/me/zero/client/api/command/handler/listener/ChatCommandListener.java b/src/main/java/me/zero/client/api/command/handler/listener/ChatCommandListener.java index 41c318fa..59b37ed2 100644 --- a/src/main/java/me/zero/client/api/command/handler/listener/ChatCommandListener.java +++ b/src/main/java/me/zero/client/api/command/handler/listener/ChatCommandListener.java @@ -22,7 +22,7 @@ import me.zero.client.api.command.Command; import me.zero.client.api.command.handler.CommandHandler; import me.zero.client.api.command.executor.sender.CommandSender; -import me.zero.client.api.event.defaults.game.ChatEvent; +import me.zero.client.api.event.defaults.game.misc.ChatEvent; import me.zero.client.api.event.defaults.internal.CommandExecutionEvent; import me.zero.client.api.util.interfaces.Helper; import net.minecraft.util.text.TextComponentString; diff --git a/src/main/java/me/zero/client/api/event/CAPIEventManager.java b/src/main/java/me/zero/client/api/event/CAPIEventManager.java index bd052567..dbf93d37 100644 --- a/src/main/java/me/zero/client/api/event/CAPIEventManager.java +++ b/src/main/java/me/zero/client/api/event/CAPIEventManager.java @@ -1,3 +1,19 @@ +/* + * Copyright 2017 ZeroMemes + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package me.zero.client.api.event; import me.zero.alpine.EventManager; diff --git a/src/main/java/me/zero/client/api/event/defaults/filters/PacketFilter.java b/src/main/java/me/zero/client/api/event/defaults/filters/PacketFilter.java index 2225f083..8719ae19 100644 --- a/src/main/java/me/zero/client/api/event/defaults/filters/PacketFilter.java +++ b/src/main/java/me/zero/client/api/event/defaults/filters/PacketFilter.java @@ -16,7 +16,7 @@ package me.zero.client.api.event.defaults.filters; -import me.zero.client.api.event.defaults.game.PacketEvent; +import me.zero.client.api.event.defaults.game.network.PacketEvent; import net.minecraft.network.Packet; import java.util.function.Predicate; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/ClickEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/core/ClickEvent.java similarity index 97% rename from src/main/java/me/zero/client/api/event/defaults/game/ClickEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/core/ClickEvent.java index 23e88d62..52a604f6 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/ClickEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/core/ClickEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.core; import net.minecraft.client.Minecraft; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/GameShutdownEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/core/GameShutdownEvent.java similarity index 95% rename from src/main/java/me/zero/client/api/event/defaults/game/GameShutdownEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/core/GameShutdownEvent.java index 172901ec..9a424355 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/GameShutdownEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/core/GameShutdownEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.core; import me.zero.alpine.type.Cancellable; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/KeyEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/core/KeyEvent.java similarity index 95% rename from src/main/java/me/zero/client/api/event/defaults/game/KeyEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/core/KeyEvent.java index 327f3c4a..6a2453e2 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/KeyEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/core/KeyEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.core; /** * Event called when a Key is pressed outside of a GUI while in-game diff --git a/src/main/java/me/zero/client/api/event/defaults/game/LoopEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/core/LoopEvent.java similarity index 93% rename from src/main/java/me/zero/client/api/event/defaults/game/LoopEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/core/LoopEvent.java index fdbde9ff..0b4ea8de 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/LoopEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/core/LoopEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.core; import net.minecraft.client.Minecraft; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/ProfilerEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/core/ProfilerEvent.java similarity index 62% rename from src/main/java/me/zero/client/api/event/defaults/game/ProfilerEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/core/ProfilerEvent.java index b81eae20..d9dcbf13 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/ProfilerEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/core/ProfilerEvent.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.core; /** - * Called when a section is started in the profiler + * Called when a section is started in the profiler. * * @author Brady * @since 4/8/2017 12:00 PM @@ -25,14 +25,31 @@ public final class ProfilerEvent { /** - * Current profiler section + * Complete current profiler section. + * + * ex) 'root.tick.render' + */ + private final String sectionPath; + + /** + * Current profiler section. + * + * ex) 'render' */ private final String section; - public ProfilerEvent(String section) { + public ProfilerEvent(String sectionPath, String section) { + this.sectionPath = sectionPath; this.section = section; } + /** + * @return The full profiler section + */ + public final String getSectionPath() { + return this.sectionPath; + } + /** * @return The current profiler section */ diff --git a/src/main/java/me/zero/client/api/event/defaults/game/TickEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/core/TickEvent.java similarity index 93% rename from src/main/java/me/zero/client/api/event/defaults/game/TickEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/core/TickEvent.java index a3d39906..dc4298f0 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/TickEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/core/TickEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.core; import net.minecraft.client.Minecraft; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/UpdateEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/core/UpdateEvent.java similarity index 93% rename from src/main/java/me/zero/client/api/event/defaults/game/UpdateEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/core/UpdateEvent.java index 97abfeaf..b942a724 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/UpdateEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/core/UpdateEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.core; /** * Called from EntityPlayerSP#onUpdate diff --git a/src/main/java/me/zero/client/api/event/defaults/game/EntityCollisionEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/entity/EntityCollisionEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/game/EntityCollisionEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/entity/EntityCollisionEvent.java index ec252bc0..cea862eb 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/EntityCollisionEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/entity/EntityCollisionEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.entity; import me.zero.alpine.type.Cancellable; import net.minecraft.entity.Entity; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/EntityDeathEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/entity/EntityDeathEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/game/EntityDeathEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/entity/EntityDeathEvent.java index f2d59b9a..c5f73fdf 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/EntityDeathEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/entity/EntityDeathEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.DamageSource; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/LivingUpdateEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/entity/LivingUpdateEvent.java similarity index 95% rename from src/main/java/me/zero/client/api/event/defaults/game/LivingUpdateEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/entity/LivingUpdateEvent.java index 261a6950..20a862b0 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/LivingUpdateEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/entity/LivingUpdateEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.entity; import me.zero.alpine.type.EventState; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/MotionUpdateEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/entity/MotionUpdateEvent.java similarity index 98% rename from src/main/java/me/zero/client/api/event/defaults/game/MotionUpdateEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/entity/MotionUpdateEvent.java index b4274f7f..6ec3cdbe 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/MotionUpdateEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/entity/MotionUpdateEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.entity; import me.zero.alpine.type.EventState; import me.zero.client.api.util.interfaces.Helper; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/MoveEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/entity/MoveEvent.java similarity index 97% rename from src/main/java/me/zero/client/api/event/defaults/game/MoveEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/entity/MoveEvent.java index b3748b74..9690014d 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/MoveEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/entity/MoveEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.entity; import me.zero.alpine.type.Cancellable; import net.minecraft.entity.MoverType; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/ChatEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/misc/ChatEvent.java similarity index 97% rename from src/main/java/me/zero/client/api/event/defaults/game/ChatEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/misc/ChatEvent.java index 199185e9..af82eeeb 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/ChatEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/misc/ChatEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.misc; import me.zero.alpine.type.Cancellable; import net.minecraft.util.text.ITextComponent; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/PacketEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/network/PacketEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/game/PacketEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/network/PacketEvent.java index cbe9c09c..17fb67b0 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/PacketEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/network/PacketEvent.java @@ -14,11 +14,10 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.network; import me.zero.alpine.type.Cancellable; import net.minecraft.network.EnumConnectionState; -import net.minecraft.network.EnumPacketDirection; import net.minecraft.network.Packet; /** @@ -26,6 +25,8 @@ * * @see Send * @see Receive + * @see Encode + * @see Decode * * @author Brady * @since 2/7/2017 12:00 PM diff --git a/src/main/java/me/zero/client/api/event/defaults/game/EntityRenderEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/render/EntityRenderEvent.java similarity index 98% rename from src/main/java/me/zero/client/api/event/defaults/game/EntityRenderEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/render/EntityRenderEvent.java index c8598752..bc137765 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/EntityRenderEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/render/EntityRenderEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.render; import me.zero.alpine.type.Cancellable; import me.zero.alpine.type.EventState; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/GlintEffectEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/render/GlintEffectEvent.java similarity index 95% rename from src/main/java/me/zero/client/api/event/defaults/game/GlintEffectEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/render/GlintEffectEvent.java index b804c9ab..ef737c16 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/GlintEffectEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/render/GlintEffectEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.render; import me.zero.alpine.type.Cancellable; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/GuiEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/render/GuiEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/game/GuiEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/render/GuiEvent.java index 66b90b58..39b4e94c 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/GuiEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/render/GuiEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.render; import net.minecraft.client.gui.GuiScreen; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/ItemRenderEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/render/ItemRenderEvent.java similarity index 97% rename from src/main/java/me/zero/client/api/event/defaults/game/ItemRenderEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/render/ItemRenderEvent.java index fd3867e4..40930b5e 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/ItemRenderEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/render/ItemRenderEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.render; import me.zero.alpine.type.Cancellable; import me.zero.client.api.util.interfaces.Helper; @@ -25,8 +25,7 @@ /** * Called when ItemRenderer#renderItemInFirstPerson is called. - * If cancelled, the item isn't - * + * If cancelled, the item isn't rendered. * * @author Brady * @since 4/8/2017 12:00 PM diff --git a/src/main/java/me/zero/client/api/event/defaults/game/LayerRenderEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/render/LayerRenderEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/game/LayerRenderEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/render/LayerRenderEvent.java index 90446e20..84502e04 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/LayerRenderEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/render/LayerRenderEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.render; import me.zero.alpine.type.Cancellable; import net.minecraft.client.renderer.entity.layers.LayerRenderer; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/Render3DEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/render/Render3DEvent.java similarity index 95% rename from src/main/java/me/zero/client/api/event/defaults/game/Render3DEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/render/Render3DEvent.java index 91e83ee9..ae914979 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/Render3DEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/render/Render3DEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.render; import me.zero.client.api.util.interfaces.Helper; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/RenderEntityLabelEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/render/RenderEntityLabelEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/game/RenderEntityLabelEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/render/RenderEntityLabelEvent.java index 66178e51..b38c5106 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/RenderEntityLabelEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/render/RenderEntityLabelEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.render; import me.zero.alpine.type.Cancellable; import net.minecraft.entity.Entity; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/RenderHudEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/render/RenderHudEvent.java similarity index 95% rename from src/main/java/me/zero/client/api/event/defaults/game/RenderHudEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/render/RenderHudEvent.java index ed54ed31..af5a8b8f 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/RenderHudEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/render/RenderHudEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.render; import net.minecraft.client.gui.GuiIngame; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/RenderScreenEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/render/RenderScreenEvent.java similarity index 95% rename from src/main/java/me/zero/client/api/event/defaults/game/RenderScreenEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/render/RenderScreenEvent.java index 340b001c..6c42e329 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/RenderScreenEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/render/RenderScreenEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.render; import net.minecraft.client.renderer.EntityRenderer; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/TeamColorEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/render/TeamColorEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/game/TeamColorEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/render/TeamColorEvent.java index 8c8c6736..d7cad99a 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/TeamColorEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/render/TeamColorEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.render; import me.zero.alpine.type.Cancellable; import net.minecraft.entity.Entity; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/TextEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/render/TextEvent.java similarity index 95% rename from src/main/java/me/zero/client/api/event/defaults/game/TextEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/render/TextEvent.java index 8fd0b703..d83bcd79 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/TextEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/render/TextEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.render; /** * Called in FontRenderer when text is rendered diff --git a/src/main/java/me/zero/client/api/event/defaults/game/BlockCollisionEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/world/BlockCollisionEvent.java similarity index 95% rename from src/main/java/me/zero/client/api/event/defaults/game/BlockCollisionEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/world/BlockCollisionEvent.java index 71b1b6af..78cfcff2 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/BlockCollisionEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/world/BlockCollisionEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.world; import me.zero.alpine.type.Cancellable; import net.minecraft.block.Block; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/BoundingBoxEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/world/BoundingBoxEvent.java similarity index 97% rename from src/main/java/me/zero/client/api/event/defaults/game/BoundingBoxEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/world/BoundingBoxEvent.java index 61869118..3ee46824 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/BoundingBoxEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/world/BoundingBoxEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.world; import me.zero.alpine.type.Cancellable; import net.minecraft.block.Block; diff --git a/src/main/java/me/zero/client/api/event/defaults/game/WorldEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/world/WorldEvent.java similarity index 96% rename from src/main/java/me/zero/client/api/event/defaults/game/WorldEvent.java rename to src/main/java/me/zero/client/api/event/defaults/game/world/WorldEvent.java index 14a4007f..a1f9bac1 100644 --- a/src/main/java/me/zero/client/api/event/defaults/game/WorldEvent.java +++ b/src/main/java/me/zero/client/api/event/defaults/game/world/WorldEvent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package me.zero.client.api.event.defaults.game; +package me.zero.client.api.event.defaults.game.world; import net.minecraft.client.multiplayer.WorldClient; diff --git a/src/main/java/me/zero/client/api/event/handle/ClientHandler.java b/src/main/java/me/zero/client/api/event/handle/ClientHandler.java index ec055dca..3e45d923 100644 --- a/src/main/java/me/zero/client/api/event/handle/ClientHandler.java +++ b/src/main/java/me/zero/client/api/event/handle/ClientHandler.java @@ -21,7 +21,13 @@ import me.zero.alpine.listener.Listener; import me.zero.client.api.event.defaults.filters.PacketFilter; import me.zero.alpine.type.EventPriority; -import me.zero.client.api.event.defaults.game.*; +import me.zero.client.api.event.defaults.game.misc.ChatEvent; +import me.zero.client.api.event.defaults.game.network.PacketEvent; +import me.zero.client.api.event.defaults.game.core.KeyEvent; +import me.zero.client.api.event.defaults.game.core.ProfilerEvent; +import me.zero.client.api.event.defaults.game.core.TickEvent; +import me.zero.client.api.event.defaults.game.render.Render3DEvent; +import me.zero.client.api.event.defaults.game.render.RenderHudEvent; import me.zero.client.api.util.interfaces.Helper; import me.zero.client.api.util.keybind.Keybind; import me.zero.client.api.util.render.camera.Camera; diff --git a/src/main/java/me/zero/client/api/util/PluginFinder.java b/src/main/java/me/zero/client/api/util/PluginFinder.java index 1181f633..0a5511e5 100644 --- a/src/main/java/me/zero/client/api/util/PluginFinder.java +++ b/src/main/java/me/zero/client/api/util/PluginFinder.java @@ -20,8 +20,8 @@ import me.zero.client.api.ClientAPI; import me.zero.alpine.listener.EventHandler; import me.zero.alpine.listener.Listener; -import me.zero.client.api.event.defaults.game.PacketEvent; -import me.zero.client.api.event.defaults.game.TickEvent; +import me.zero.client.api.event.defaults.game.network.PacketEvent; +import me.zero.client.api.event.defaults.game.core.TickEvent; import me.zero.client.api.event.defaults.filters.PacketFilter; import me.zero.client.api.exception.InvalidActionException; import me.zero.client.api.util.interfaces.Helper; diff --git a/src/main/java/me/zero/client/api/util/render/gl/GlUtils.java b/src/main/java/me/zero/client/api/util/render/gl/GlUtils.java index 80f0e916..28f6b573 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/GlUtils.java +++ b/src/main/java/me/zero/client/api/util/render/gl/GlUtils.java @@ -19,7 +19,7 @@ import me.zero.client.api.ClientAPI; import me.zero.alpine.listener.EventHandler; import me.zero.alpine.listener.Listener; -import me.zero.client.api.event.defaults.game.Render3DEvent; +import me.zero.client.api.event.defaults.game.render.Render3DEvent; import me.zero.client.api.util.math.Vec3; import me.zero.client.api.util.render.Colors; import net.minecraft.client.renderer.GlStateManager; diff --git a/src/main/java/me/zero/client/load/mixin/MixinBlock.java b/src/main/java/me/zero/client/load/mixin/MixinBlock.java index a3800e19..9cacfcc5 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinBlock.java +++ b/src/main/java/me/zero/client/load/mixin/MixinBlock.java @@ -17,8 +17,8 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.BlockCollisionEvent; -import me.zero.client.api.event.defaults.game.BoundingBoxEvent; +import me.zero.client.api.event.defaults.game.world.BlockCollisionEvent; +import me.zero.client.api.event.defaults.game.world.BoundingBoxEvent; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; diff --git a/src/main/java/me/zero/client/load/mixin/MixinEntity.java b/src/main/java/me/zero/client/load/mixin/MixinEntity.java index 30213a79..b7347670 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinEntity.java +++ b/src/main/java/me/zero/client/load/mixin/MixinEntity.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.EntityCollisionEvent; +import me.zero.client.api.event.defaults.game.entity.EntityCollisionEvent; import me.zero.client.api.util.math.Vec2; import me.zero.client.api.util.math.Vec3; import me.zero.client.load.mixin.wrapper.IEntity; diff --git a/src/main/java/me/zero/client/load/mixin/MixinEntityLivingBase.java b/src/main/java/me/zero/client/load/mixin/MixinEntityLivingBase.java index fd6e5eaa..3e604e51 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinEntityLivingBase.java +++ b/src/main/java/me/zero/client/load/mixin/MixinEntityLivingBase.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.EntityDeathEvent; +import me.zero.client.api.event.defaults.game.entity.EntityDeathEvent; import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.DamageSource; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/me/zero/client/load/mixin/MixinEntityPlayerSP.java b/src/main/java/me/zero/client/load/mixin/MixinEntityPlayerSP.java index 53bbcccb..5cb56d5a 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinEntityPlayerSP.java +++ b/src/main/java/me/zero/client/load/mixin/MixinEntityPlayerSP.java @@ -17,10 +17,10 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.LivingUpdateEvent; -import me.zero.client.api.event.defaults.game.MotionUpdateEvent; -import me.zero.client.api.event.defaults.game.MoveEvent; -import me.zero.client.api.event.defaults.game.UpdateEvent; +import me.zero.client.api.event.defaults.game.entity.LivingUpdateEvent; +import me.zero.client.api.event.defaults.game.entity.MotionUpdateEvent; +import me.zero.client.api.event.defaults.game.entity.MoveEvent; +import me.zero.client.api.event.defaults.game.core.UpdateEvent; import me.zero.alpine.type.EventState; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.AbstractClientPlayer; diff --git a/src/main/java/me/zero/client/load/mixin/MixinEntityRenderer.java b/src/main/java/me/zero/client/load/mixin/MixinEntityRenderer.java index 7ca95356..b4fbbd81 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinEntityRenderer.java +++ b/src/main/java/me/zero/client/load/mixin/MixinEntityRenderer.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.RenderScreenEvent; +import me.zero.client.api.event.defaults.game.render.RenderScreenEvent; import me.zero.client.api.util.render.camera.Camera; import net.minecraft.client.renderer.EntityRenderer; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/me/zero/client/load/mixin/MixinFontRenderer.java b/src/main/java/me/zero/client/load/mixin/MixinFontRenderer.java index 50e1c9f0..ad25a2f9 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinFontRenderer.java +++ b/src/main/java/me/zero/client/load/mixin/MixinFontRenderer.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.TextEvent; +import me.zero.client.api.event.defaults.game.render.TextEvent; import net.minecraft.client.gui.FontRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/me/zero/client/load/mixin/MixinGuiIngame.java b/src/main/java/me/zero/client/load/mixin/MixinGuiIngame.java index 2907b44e..009ab1f8 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinGuiIngame.java +++ b/src/main/java/me/zero/client/load/mixin/MixinGuiIngame.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.RenderHudEvent; +import me.zero.client.api.event.defaults.game.render.RenderHudEvent; import net.minecraft.client.gui.GuiIngame; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/me/zero/client/load/mixin/MixinItemRenderer.java b/src/main/java/me/zero/client/load/mixin/MixinItemRenderer.java index ca82011a..2498123d 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinItemRenderer.java +++ b/src/main/java/me/zero/client/load/mixin/MixinItemRenderer.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.ItemRenderEvent; +import me.zero.client.api.event.defaults.game.render.ItemRenderEvent; import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/me/zero/client/load/mixin/MixinLayerArmorBase.java b/src/main/java/me/zero/client/load/mixin/MixinLayerArmorBase.java index 45b67d67..03fde9c1 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinLayerArmorBase.java +++ b/src/main/java/me/zero/client/load/mixin/MixinLayerArmorBase.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.GlintEffectEvent; +import me.zero.client.api.event.defaults.game.render.GlintEffectEvent; import net.minecraft.client.model.ModelBase; import net.minecraft.client.renderer.entity.RenderLivingBase; import net.minecraft.client.renderer.entity.layers.LayerArmorBase; diff --git a/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java b/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java index 7b5f3563..3c102729 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java +++ b/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java @@ -20,7 +20,12 @@ import me.zero.client.api.Client; import me.zero.client.api.ClientInfo; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.*; +import me.zero.client.api.event.defaults.game.core.ClickEvent; +import me.zero.client.api.event.defaults.game.core.GameShutdownEvent; +import me.zero.client.api.event.defaults.game.core.LoopEvent; +import me.zero.client.api.event.defaults.game.core.TickEvent; +import me.zero.client.api.event.defaults.game.render.GuiEvent; +import me.zero.client.api.event.defaults.game.world.WorldEvent; import me.zero.client.api.event.handle.ClientHandler; import me.zero.client.api.util.render.gl.GlUtils; import me.zero.client.load.ClientInitException; @@ -43,7 +48,7 @@ import java.io.InputStream; import java.io.InputStreamReader; -import static me.zero.client.api.event.defaults.game.ClickEvent.MouseButton.*; +import static me.zero.client.api.event.defaults.game.core.ClickEvent.MouseButton.*; /** * @author Brady diff --git a/src/main/java/me/zero/client/load/mixin/MixinNettyPacketDecoder.java b/src/main/java/me/zero/client/load/mixin/MixinNettyPacketDecoder.java index a3398327..94f0561d 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinNettyPacketDecoder.java +++ b/src/main/java/me/zero/client/load/mixin/MixinNettyPacketDecoder.java @@ -3,7 +3,7 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.PacketEvent; +import me.zero.client.api.event.defaults.game.network.PacketEvent; import net.minecraft.network.*; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; @@ -11,7 +11,6 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.Redirect; import java.io.IOException; import java.util.List; diff --git a/src/main/java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java b/src/main/java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java index 23695181..0effcb5c 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java +++ b/src/main/java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java @@ -3,7 +3,7 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.PacketEvent; +import me.zero.client.api.event.defaults.game.network.PacketEvent; import net.minecraft.network.*; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; diff --git a/src/main/java/me/zero/client/load/mixin/MixinNetworkManager.java b/src/main/java/me/zero/client/load/mixin/MixinNetworkManager.java index 413dc293..2993555b 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinNetworkManager.java +++ b/src/main/java/me/zero/client/load/mixin/MixinNetworkManager.java @@ -19,7 +19,7 @@ import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.PacketEvent; +import me.zero.client.api.event.defaults.game.network.PacketEvent; import net.minecraft.network.INetHandler; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; diff --git a/src/main/java/me/zero/client/load/mixin/MixinProfiler.java b/src/main/java/me/zero/client/load/mixin/MixinProfiler.java index 32c40912..0537f0e4 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinProfiler.java +++ b/src/main/java/me/zero/client/load/mixin/MixinProfiler.java @@ -17,9 +17,10 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.ProfilerEvent; +import me.zero.client.api.event.defaults.game.core.ProfilerEvent; import net.minecraft.profiler.Profiler; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -31,8 +32,10 @@ @Mixin(Profiler.class) public class MixinProfiler { + @Shadow private String profilingSection; + @Inject(method = "startSection", at = @At("HEAD")) public void startSection(String name, CallbackInfo ci) { - ClientAPI.EVENT_BUS.post(new ProfilerEvent(name)); + ClientAPI.EVENT_BUS.post(new ProfilerEvent(profilingSection, name)); } } diff --git a/src/main/java/me/zero/client/load/mixin/MixinRender.java b/src/main/java/me/zero/client/load/mixin/MixinRender.java index d0bdab4b..fa46bb2f 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinRender.java +++ b/src/main/java/me/zero/client/load/mixin/MixinRender.java @@ -17,8 +17,8 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.RenderEntityLabelEvent; -import me.zero.client.api.event.defaults.game.TeamColorEvent; +import me.zero.client.api.event.defaults.game.render.RenderEntityLabelEvent; +import me.zero.client.api.event.defaults.game.render.TeamColorEvent; import net.minecraft.client.renderer.entity.Render; import net.minecraft.entity.Entity; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/me/zero/client/load/mixin/MixinRenderItem.java b/src/main/java/me/zero/client/load/mixin/MixinRenderItem.java index ecd4d0e0..50787fcf 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinRenderItem.java +++ b/src/main/java/me/zero/client/load/mixin/MixinRenderItem.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.GlintEffectEvent; +import me.zero.client.api.event.defaults.game.render.GlintEffectEvent; import net.minecraft.client.renderer.RenderItem; import net.minecraft.client.renderer.block.model.IBakedModel; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/me/zero/client/load/mixin/MixinRenderLivingBase.java b/src/main/java/me/zero/client/load/mixin/MixinRenderLivingBase.java index 8a9068d3..3fb91e7e 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinRenderLivingBase.java +++ b/src/main/java/me/zero/client/load/mixin/MixinRenderLivingBase.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.LayerRenderEvent; +import me.zero.client.api.event.defaults.game.render.LayerRenderEvent; import net.minecraft.client.renderer.entity.RenderLivingBase; import net.minecraft.client.renderer.entity.layers.LayerRenderer; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/me/zero/client/load/mixin/MixinRenderManager.java b/src/main/java/me/zero/client/load/mixin/MixinRenderManager.java index 8c734178..ff8a78d1 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinRenderManager.java +++ b/src/main/java/me/zero/client/load/mixin/MixinRenderManager.java @@ -17,7 +17,7 @@ package me.zero.client.load.mixin; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.EntityRenderEvent; +import me.zero.client.api.event.defaults.game.render.EntityRenderEvent; import me.zero.alpine.type.EventState; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; diff --git a/src/main/java/me/zero/client/load/mixin/wrapper/IMinecraft.java b/src/main/java/me/zero/client/load/mixin/wrapper/IMinecraft.java index 76a35994..3ae386dc 100644 --- a/src/main/java/me/zero/client/load/mixin/wrapper/IMinecraft.java +++ b/src/main/java/me/zero/client/load/mixin/wrapper/IMinecraft.java @@ -16,7 +16,7 @@ package me.zero.client.load.mixin.wrapper; -import me.zero.client.api.event.defaults.game.ClickEvent; +import me.zero.client.api.event.defaults.game.core.ClickEvent; import net.minecraft.util.Session; import net.minecraft.util.Timer; From 0c63f99ef0c4f3478e796d98450df5db7dbb3f22 Mon Sep 17 00:00:00 2001 From: Brady Date: Sun, 23 Jul 2017 21:32:46 -0500 Subject: [PATCH 08/26] Updated Feather, Renamed 'ClientUtils' to 'ClientAPIUtils' --- .../me/zero/client/api/command/Command.java | 4 +- .../me/zero/client/api/module/Module.java | 4 +- .../{ClientUtils.java => ClientAPIUtils.java} | 27 +- .../client/api/util/render/RenderUtils.java | 67 ++--- .../java/me/zero/client/api/value/Values.java | 4 +- .../zero/client/api/value/type/MultiType.java | 4 +- src/main/java/pw/knx/feather/Feather.java | 138 ++++++++++ .../FontRend.java => font/FontCache.java} | 255 +++++------------- .../java/pw/knx/feather/font/FontGlyph.java | 48 ++++ .../java/pw/knx/feather/font/GlyphLayout.java | 26 ++ .../pw/knx/feather/shapes/Dimensions.java | 101 +++++++ .../java/pw/knx/feather/shapes/Rectangle.java | 232 ++++++++++++++++ .../feather/{util => structures}/Color.java | 7 +- .../knx/feather/{util => structures}/VBO.java | 20 +- .../pw/knx/feather/tessellate/BasicTess.java | 28 +- .../{GrowingTess.java => ExpandingTess.java} | 29 +- .../pw/knx/feather/tessellate/OffsetTess.java | 168 ------------ .../tessellate/{base => }/Tessellator.java | 79 +++--- .../pw/knx/feather/texture/BasicTexture.java | 25 +- .../feather/texture/{base => }/Texture.java | 60 ++++- .../java/pw/knx/feather/util/BufferUtils.java | 67 ----- .../pw/knx/feather/util/TextureUtils.java | 101 ------- 22 files changed, 816 insertions(+), 678 deletions(-) rename src/main/java/me/zero/client/api/util/{ClientUtils.java => ClientAPIUtils.java} (81%) create mode 100644 src/main/java/pw/knx/feather/Feather.java rename src/main/java/pw/knx/feather/{render/FontRend.java => font/FontCache.java} (77%) create mode 100644 src/main/java/pw/knx/feather/font/FontGlyph.java create mode 100644 src/main/java/pw/knx/feather/font/GlyphLayout.java create mode 100644 src/main/java/pw/knx/feather/shapes/Dimensions.java create mode 100644 src/main/java/pw/knx/feather/shapes/Rectangle.java rename src/main/java/pw/knx/feather/{util => structures}/Color.java (99%) rename src/main/java/pw/knx/feather/{util => structures}/VBO.java (88%) rename src/main/java/pw/knx/feather/tessellate/{GrowingTess.java => ExpandingTess.java} (70%) delete mode 100644 src/main/java/pw/knx/feather/tessellate/OffsetTess.java rename src/main/java/pw/knx/feather/tessellate/{base => }/Tessellator.java (65%) rename src/main/java/pw/knx/feather/texture/{base => }/Texture.java (50%) delete mode 100644 src/main/java/pw/knx/feather/util/BufferUtils.java delete mode 100644 src/main/java/pw/knx/feather/util/TextureUtils.java diff --git a/src/main/java/me/zero/client/api/command/Command.java b/src/main/java/me/zero/client/api/command/Command.java index 7c96d564..5f50969e 100644 --- a/src/main/java/me/zero/client/api/command/Command.java +++ b/src/main/java/me/zero/client/api/command/Command.java @@ -17,7 +17,7 @@ package me.zero.client.api.command; import me.zero.client.api.command.exception.CommandInitException; -import me.zero.client.api.util.ClientUtils; +import me.zero.client.api.util.ClientAPIUtils; /** * @author Brady @@ -46,7 +46,7 @@ private void setup(String[] headers, String description, String[] syntax) { this.description = description; this.syntax = syntax; - if (ClientUtils.containsNull(headers, description, syntax)) + if (ClientAPIUtils.containsNull(headers, description, syntax)) throw new NullPointerException("One or more Command members were null!"); } diff --git a/src/main/java/me/zero/client/api/module/Module.java b/src/main/java/me/zero/client/api/module/Module.java index 3320c17c..1d10d01c 100644 --- a/src/main/java/me/zero/client/api/module/Module.java +++ b/src/main/java/me/zero/client/api/module/Module.java @@ -21,7 +21,7 @@ import me.zero.client.api.exception.ActionNotSupportedException; import me.zero.client.api.manage.Node; import me.zero.client.api.module.exception.ModuleInitException; -import me.zero.client.api.util.ClientUtils; +import me.zero.client.api.util.ClientAPIUtils; import me.zero.client.api.util.keybind.Keybind; import org.lwjgl.input.Keyboard; @@ -102,7 +102,7 @@ private void setup(String name, String description, int bind) { .filter(clazz -> clazz.isAnnotationPresent(Category.class)) .findFirst().orElse(Category.Default.class); - if (ClientUtils.containsNull(name, description, type)) + if (ClientAPIUtils.containsNull(name, description, type)) throw new NullPointerException("One or more Mod members were null!"); } diff --git a/src/main/java/me/zero/client/api/util/ClientUtils.java b/src/main/java/me/zero/client/api/util/ClientAPIUtils.java similarity index 81% rename from src/main/java/me/zero/client/api/util/ClientUtils.java rename to src/main/java/me/zero/client/api/util/ClientAPIUtils.java index 89032bbf..19bde107 100644 --- a/src/main/java/me/zero/client/api/util/ClientUtils.java +++ b/src/main/java/me/zero/client/api/util/ClientAPIUtils.java @@ -22,14 +22,14 @@ import java.util.Arrays; /** - * Utils that the Client API uses + * Contains methods that ClientAPI uses throughout its code. * * @author Brady * @since 1/20/2017 12:00 PM */ -public final class ClientUtils { +public final class ClientAPIUtils { - private ClientUtils() {} + private ClientAPIUtils() {} /** * Concatenates an array of generic arrays @@ -102,4 +102,25 @@ public static T objectFrom(T object, T[] array) { } } } + + /** + * Determines if the specified array of generics contains + * matching members. + * + * @param objects Objects being checked + * @return Whether or not all members match + */ + @SafeVarargs + public static boolean matchingMembers(T... objects) { + T baseline = null; + boolean set = false; + for (T object : objects) { + if (!set) + baseline = object; + if (object != baseline) + return false; + set = true; + } + return true; + } } diff --git a/src/main/java/me/zero/client/api/util/render/RenderUtils.java b/src/main/java/me/zero/client/api/util/render/RenderUtils.java index 9a597a72..e28c5a73 100644 --- a/src/main/java/me/zero/client/api/util/render/RenderUtils.java +++ b/src/main/java/me/zero/client/api/util/render/RenderUtils.java @@ -22,8 +22,7 @@ import me.zero.client.api.util.render.gl.GlUtils; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.OpenGlHelper; -import pw.knx.feather.tessellate.GrowingTess; -import pw.knx.feather.tessellate.OffsetTess; +import pw.knx.feather.tessellate.Tessellator; import java.util.ArrayList; import java.util.List; @@ -43,7 +42,7 @@ private RenderUtils() {} /** * Instance of the Tessellator */ - public static final OffsetTess tessellator = new OffsetTess(new GrowingTess(4)); + public static final Tessellator tessellator = Tessellator.createExpanding(4, 1, 2); /** * Stores ClientState Gl Caps when setting up @@ -142,7 +141,7 @@ public static void drawLine(float x, float y, float z, float x1, float y1, float setupRender(true); setupClientState(GLClientState.VERTEX, true); - tessellator.vertex(x, y, z).vertex(x1, y1, z1).draw(GL_LINE_STRIP); + tessellator.addVertex(x, y, z).addVertex(x1, y1, z1).draw(GL_LINE_STRIP); setupClientState(GLClientState.VERTEX, false); setupRender(false); } @@ -159,10 +158,10 @@ public static void drawFlippedTexturedRect(float x1, float y1, float x2, float y setupClientState(GLClientState.TEXTURE, true); tessellator - .vertex(x1, y2, 0).texture(0, 0) - .vertex(x2, y2, 0).texture(1, 0) - .vertex(x2, y1, 0).texture(1, 1) - .vertex(x1, y1, 0).texture(0, 1) + .addVertex(x1, y2, 0).setTexture(0, 0) + .addVertex(x2, y2, 0).setTexture(1, 0) + .addVertex(x2, y1, 0).setTexture(1, 1) + .addVertex(x1, y1, 0).setTexture(0, 1) .draw(GL_QUADS); setupClientState(GLClientState.TEXTURE, false); @@ -180,10 +179,10 @@ public static void drawReflectedTexturedRect(float x1, float y1, float x2, float setupClientState(GLClientState.TEXTURE, true); tessellator - .vertex(x1, y2, 0).texture(1, 0) - .vertex(x2, y2, 0).texture(1, 0) - .vertex(x2, y1, 0).texture(0, 1) - .vertex(x1, y1, 0).texture(1, 1) + .addVertex(x1, y2, 0).setTexture(1, 0) + .addVertex(x2, y2, 0).setTexture(1, 0) + .addVertex(x2, y1, 0).setTexture(0, 1) + .addVertex(x1, y1, 0).setTexture(1, 1) .draw(GL_QUADS); setupClientState(GLClientState.TEXTURE, false); @@ -203,7 +202,7 @@ public static void rectangle(float x1, float y1, float x2, float y2, int color) setupRender(true); setupClientState(GLClientState.VERTEX, true); - tessellator.vertex(x1, y2, 0).vertex(x2, y2, 0).vertex(x2, y1, 0).vertex(x1, y1, 0).draw(GL_QUADS); + tessellator.addVertex(x1, y2, 0).addVertex(x2, y2, 0).addVertex(x2, y1, 0).addVertex(x1, y1, 0).draw(GL_QUADS); setupClientState(GLClientState.VERTEX, false); setupRender(false); } @@ -232,30 +231,23 @@ private static void rectangleGradient(float x1, float y1, float x2, float y2, in if (color.length == 0) throw new RuntimeException("At least one set of colors should be supplied"); - float[] r = new float[color.length]; - float[] g = new float[color.length]; - float[] b = new float[color.length]; - float[] a = new float[color.length]; - for (int i = 0; i < color.length; i++) { - float[] c = Colors.getColor(color[i]); - r[i] = c[0]; g[i] = c[1]; b[i] = c[2]; a[i] = c[3]; - } + int c1, c2, c3, c4; if (color.length == 1) { - r = new float[] { r[0], r[0], r[0], r[0] }; - g = new float[] { g[0], g[0], g[0], g[0] }; - b = new float[] { b[0], b[0], b[0], b[0] }; - a = new float[] { a[0], a[0], a[0], a[0] }; + c1 = color[0]; + c2 = color[1]; + c3 = color[2]; + c4 = color[3]; } else if (color.length > 1 && color.length < 4) { - r = new float[] { r[0], r[0], r[1], r[1] }; - g = new float[] { g[0], g[0], g[1], g[1] }; - b = new float[] { b[0], b[0], b[1], b[1] }; - a = new float[] { a[0], a[0], a[1], a[1] }; + c1 = color[0]; + c2 = color[0]; + c3 = color[1]; + c4 = color[2]; } else { - r = new float[] { r[0], r[1], r[2], r[3] }; - g = new float[] { g[0], g[1], g[2], g[3] }; - b = new float[] { b[0], b[1], b[2], b[3] }; - a = new float[] { a[0], a[1], a[2], a[3] }; + c1 = color[0]; + c2 = color[1]; + c3 = color[2]; + c4 = color[3]; } setupRender(true); @@ -264,14 +256,13 @@ private static void rectangleGradient(float x1, float y1, float x2, float y2, in setupClientState(GLClientState.COLOR, true); tessellator - .color(r[0], g[0], b[0], a[0]).vertex(x1, y2, 0) - .color(r[1], g[1], b[1], a[1]).vertex(x2, y2, 0) - .color(r[2], g[2], b[2], a[2]).vertex(x2, y1, 0) - .color(r[3], g[3], b[3], a[3]).vertex(x1, y1, 0) + .setColor(c1).addVertex(x1, y2, 0) + .setColor(c2).addVertex(x2, y2, 0) + .setColor(c3).addVertex(x2, y1, 0) + .setColor(c4).addVertex(x1, y1, 0) .draw(GL_QUADS); setupClientState(GLClientState.COLOR, false); - GlStateManager.shadeModel(GL_FLAT); setupRender(false); } diff --git a/src/main/java/me/zero/client/api/value/Values.java b/src/main/java/me/zero/client/api/value/Values.java index 1e397858..c158e3b8 100644 --- a/src/main/java/me/zero/client/api/value/Values.java +++ b/src/main/java/me/zero/client/api/value/Values.java @@ -17,7 +17,7 @@ package me.zero.client.api.value; import me.zero.client.api.exception.ValueException; -import me.zero.client.api.util.ClientUtils; +import me.zero.client.api.util.ClientAPIUtils; import me.zero.client.api.util.annotation.Label; import me.zero.client.api.value.annotation.*; import me.zero.client.api.value.holder.IValueHolder; @@ -131,7 +131,7 @@ private static Value getValue(Object parent, Field field) { * @param data The resolver data for the annotation */ public static void define(Class type, ResolverData data) { - if (ClientUtils.containsNull(type, data)) + if (ClientAPIUtils.containsNull(type, data)) throw new NullPointerException("One or more parameters were null"); if (RESOLVERS.get(type) != null) diff --git a/src/main/java/me/zero/client/api/value/type/MultiType.java b/src/main/java/me/zero/client/api/value/type/MultiType.java index 28ec9195..dfc72cdf 100644 --- a/src/main/java/me/zero/client/api/value/type/MultiType.java +++ b/src/main/java/me/zero/client/api/value/type/MultiType.java @@ -16,7 +16,7 @@ package me.zero.client.api.value.type; -import me.zero.client.api.util.ClientUtils; +import me.zero.client.api.util.ClientAPIUtils; import me.zero.client.api.value.Value; import org.apache.commons.lang3.ArrayUtils; @@ -43,7 +43,7 @@ public MultiType(String name, String id, String description, Object object, Fiel @Override public final void setValue(String value) { - super.setValue(ClientUtils.objectFrom(value, values)); + super.setValue(ClientAPIUtils.objectFrom(value, values)); } /** diff --git a/src/main/java/pw/knx/feather/Feather.java b/src/main/java/pw/knx/feather/Feather.java new file mode 100644 index 00000000..f8f184d7 --- /dev/null +++ b/src/main/java/pw/knx/feather/Feather.java @@ -0,0 +1,138 @@ +package pw.knx.feather; + +import pw.knx.feather.font.FontCache; +import pw.knx.feather.font.FontGlyph; +import pw.knx.feather.font.GlyphLayout; +import pw.knx.feather.tessellate.Tessellator; +import pw.knx.feather.texture.Texture; + +import java.awt.*; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.HashMap; +import java.util.Map; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL15.*; + +/** + * The central class of the Feather library. + * + * Basically functions as a convenient state manager for OpenGL, + * wrapping the most commonly used functions in intuitive, intelligent, + * chainable methods. In this way, Feather reduces your required knowledge of + * obscure OpenGL constants and compacts otherwise painfully verbose state management code. + * + * Probably going to use the enum singleton pattern for simplicity, thread safety and global access. + * This should not pose an inconvenience since LWJGL only allows once thread to interact + * with OpenGL anyways. + * + * WIP + * + * @author KNOXDEV + * @since 6/7/2017 6:54 PM + */ +public enum Feather { + feather; + + /** + * The simple Feather Tessellator we've designated to render our glyphs. + */ + private final Tessellator tess = Tessellator.createExpanding(4 * 4, 1, 2); + + private final Map fonts = new HashMap<>(); + private FontCache currentFont; + + + /* + * State Management - Most of these return Feather so they can be chained. + */ + + /** + * Binds an existing texture object to the working texture2D buffer + * + * @param id The OpenGL ID of the texture object to be bound + * @return the Feather manager, for additional chaining + */ + public Feather bindTexture(int id) { + glBindTexture(GL_TEXTURE_2D, id); + return this; + } + + /** + * Binds an existing buffer object to the working array buffer + * + * @param id The OpenGL ID of the buffer object to be bound + * @return the Feather manager, for additional chaining + */ + public Feather bindBuffer(int id) { + glBindBuffer(GL_ARRAY_BUFFER, id); + return this; + } + + + /* + * Allocators - Methods that wrap Java's unfortunate Buffer API + */ + + /** + * Allocates a ByteBuffer in the platform's native byte order + * + * @param capacity the size of the Buffer to be allocated in bytes + * @return the allocated ByteBuffer + */ + public synchronized ByteBuffer allocateBuffer(int capacity) { + return ByteBuffer.allocateDirect(capacity).order(ByteOrder.nativeOrder()); + } + + + /* + * Basic Rendering Routines + */ + + public Feather setFont(Font font) { + // holy shit streams + currentFont = fonts.computeIfAbsent(font, FontCache::from); + return this; + } + + public Feather drawString(String str, float x, float y) { + if(currentFont == null) + throw new RuntimeException("You must first set the Font to draw"); + + /* Make sure the entire string is cached before rendering and return its glyph representation */ + final GlyphLayout entry = currentFont.cacheString(str); + + /* Track which texture is currently bound to minimize the number of glBindTexture() and Tessellator.draw() calls needed */ + int boundTex = 0; + + /* Cycle through the Glyphs to be rendered */ + for (FontGlyph glyph : entry.glyphs) { + final Texture texture = glyph.texture; + + /* + * Make sure the OpenGL texture storing this glyph's image is bound (if not already bound). All pending glyphs in the + * Tessellator's vertex array must be drawn before switching textures, otherwise they would erroneously use the new + * texture as well. + */ + if (boundTex != texture.id()) { + if (boundTex != 0) + tess.draw(GL_QUADS); + boundTex = texture.bind().id(); + } + final float x1 = x + glyph.x; + final float x2 = x1 + texture.width(); + final float y1 = y + glyph.y; + final float y2 = y1 + texture.height(); + tess.setTexture(texture.u(), texture.v()).addVertex(x1, y1, 0); + tess.setTexture(texture.u(), texture.v1()).addVertex(x1, y2, 0); + tess.setTexture(texture.u1(), texture.v1()).addVertex(x2, y2, 0); + tess.setTexture(texture.u1(), texture.v()).addVertex(x2, y1, 0); + } + + /* Draw any remaining glyphs in the Tessellator's vertex array (there should be at least one glyph pending) */ + tess.draw(GL_QUADS); + + return this; + } +} diff --git a/src/main/java/pw/knx/feather/render/FontRend.java b/src/main/java/pw/knx/feather/font/FontCache.java similarity index 77% rename from src/main/java/pw/knx/feather/render/FontRend.java rename to src/main/java/pw/knx/feather/font/FontCache.java index 0c9eb4e6..fdae8ea7 100644 --- a/src/main/java/pw/knx/feather/render/FontRend.java +++ b/src/main/java/pw/knx/feather/font/FontCache.java @@ -1,9 +1,8 @@ -package pw.knx.feather.render; +package pw.knx.feather.font; import org.lwjgl.opengl.GL11; -import pw.knx.feather.tessellate.GrowingTess; -import pw.knx.feather.tessellate.base.Tessellator; -import pw.knx.feather.texture.base.Texture; +import pw.knx.feather.tessellate.Tessellator; +import pw.knx.feather.texture.Texture; import java.awt.*; import java.awt.font.FontRenderContext; @@ -18,7 +17,7 @@ import java.util.List; /** - * FontRend is a simple, one-class library for the rendering of all Unicode Strings using OpenType fonts. + * FontCache is a simple, one-class library for the rendering of all Unicode Strings using OpenType fonts. * It is adapted from thvortex's BetterFonts, found here: https://github.com/user/thvortex/BetterFonts *

* There are is one key way in which this implementation differs from thvortex's: @@ -28,7 +27,7 @@ * Regardless of these changes, as much of the model remains the same, plenty of documentation will * be copied directly from thvortex's original repository. *

- * This aforementioned processing model is as follows: FontRend caches the glyph layout of individual strings, + * This aforementioned processing model is as follows: FontCache caches the glyph layout of individual strings, * and it also caches the pre-rendered images for individual glyphs. Once a string and its glyph images are cached, * the critical path in renderString() will draw the glyphs as fast as if using a bitmap font. Strings are cached * using weak references through a two layer string cache. Strings that are no longer in use by LWJGL will be @@ -41,7 +40,7 @@ * @author KNOXDEV, thvortex * @since 1/23/2017 14:40 */ -public class FontRend { +public class FontCache { /* * Constants @@ -72,7 +71,7 @@ public class FontRend { * All font glyphs are packed inside this image and are then loaded from here into an OpenGL texture. */ private final BufferedImage glyphImage = new BufferedImage(TEXTURE_WIDTH, TEXTURE_HEIGHT, - BufferedImage.TYPE_INT_ARGB); + BufferedImage.TYPE_INT_ARGB); /** * The Graphics2D associated with stringImage and used for string drawing to extract the individual glyph shapes. @@ -88,10 +87,14 @@ public class FontRend { * String Graphics */ - /** Temporary image for rendering a string to and then extracting the glyph images from. */ + /** + * Temporary image for rendering a string to and then extracting the glyph images from. + */ private BufferedImage stringImage; - /** The Graphics2D associated with stringImage and used for string drawing to extract the individual glyph shapes. */ + /** + * The Graphics2D associated with stringImage and used for string drawing to extract the individual glyph shapes. + */ private Graphics2D stringGraphics; /** @@ -108,7 +111,9 @@ public class FontRend { */ private int cacheLineHeight = 0; - /** ID of current OpenGL cache texture being used by cacheGlyphs() to store pre-rendered glyph images. */ + /** + * ID of current OpenGL cache texture being used by cacheGlyphs() to store pre-rendered glyph images. + */ private int texture; /* @@ -118,7 +123,7 @@ public class FontRend { /** * List of all available physical fonts on the system. Used by lookupFont() to find alternate fonts. */ - private Font[] allFonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts(); + private final Font[] allFonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts(); /** * A list of all fonts that have been returned so far by lookupFont(), and that will always be searched first for a usable font before @@ -126,7 +131,7 @@ public class FontRend { * have multiple entries for the various styles (i.e. bold, italic, etc.) of a font. This list starts with Java's "SansSerif" logical * font. */ - private List usedFonts = new ArrayList<>(); + private final List usedFonts = new ArrayList<>(); /* * Internal Caches @@ -137,7 +142,7 @@ public class FontRend { * continues to hold a strong reference to the String object (i.e. from TileEntitySign and ChatLine) passed here, the * weakRefCache map will continue to hold a strong reference to the Entry object that said strings all map to. */ - private final Map stringCache = new WeakHashMap<>(); + private final Map stringCache = new WeakHashMap<>(); /** * A cache of all fonts that have at least one glyph pre-rendered in a texture. Each font maps to an integer (monotonically @@ -157,7 +162,9 @@ public class FontRend { * Working Data */ - /** Intermediate data array for use with textureImage.getRgb(). */ + /** + * Intermediate data array for use with textureImage.getRgb(). + */ private final int[] imageData = new int[TEXTURE_WIDTH * TEXTURE_HEIGHT]; /** @@ -166,15 +173,14 @@ public class FontRend { * that the integers holding packed RGBA colors are stored into memory in a predictable order. */ private final IntBuffer imageBuffer = ByteBuffer.allocateDirect(4 * TEXTURE_WIDTH * TEXTURE_HEIGHT) - .order(ByteOrder.BIG_ENDIAN).asIntBuffer(); + .order(ByteOrder.BIG_ENDIAN).asIntBuffer(); - /** The simple Feather Tessellator we've designated to render our glyphs. */ - private final Tessellator tess = new GrowingTess(4 * 4); - - /** A simple list of glyphs we're currently working with */ - private final List glyphs = new ArrayList<>(); + /** + * A simple list of glyphs we're currently working with + */ + private final List glyphs = new ArrayList<>(); - public FontRend(Font font) { + FontCache() { /* Set background color for use with clearRect() */ glyphGraphics.setBackground(CLEAR); @@ -187,88 +193,15 @@ public FontRend(Font font) { /* Use Java's logical font as the default initial font if user does not override it in some configuration file */ GraphicsEnvironment.getLocalGraphicsEnvironment().preferLocaleFonts(); - setFont(font); - } - - /** - * Change the preferred font used to pre-render glyph images. If this method is called at runtime, the existing glyph images will remain cached - * in their respective textures and will remain accessible. - * - * @param font the new font - */ - public void setFont(Font font) { - stringCache.clear(); - usedFonts.clear(); - usedFonts.add(font); } public Font getFont() { return usedFonts.get(0); } - /* - * String Methods - */ - - /** - * Render a single-line string to the screen using the current OpenGL color. The (x,y) coordinates are of the uppet-left - * corner of the string's bounding box, rather than the baseline position as is typical with fonts. This function will also - * add the string to the cache so the next renderString() call with the same string is faster. - * - * @param str the string being rendered - * @param x the x coordinate to draw at - * @param y the y coordinate to draw at - */ - public void renderString(String str, float x, float y) { - /* Make sure the entire string is cached before rendering and return its glyph representation */ - final Entry entry = this.cacheString(str); - - /* Track which texture is currently bound to minimize the number of glBindTexture() and Tessellator.draw() calls needed */ - int boundTex = 0; - - /* Cycle through the Glyphs to be rendered */ - for (Glyph glyph : entry.glyphs) { - final Texture texture = glyph.texture; - - /* - * Make sure the OpenGL texture storing this glyph's image is bound (if not already bound). All pending glyphs in the - * Tessellator's vertex array must be drawn before switching textures, otherwise they would erroneously use the new - * texture as well. - */ - if (boundTex != texture.getID()) { - if (boundTex != 0) { - tess.draw(GL11.GL_QUADS); - } - GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture.getID()); - boundTex = texture.getID(); - } - final float x1 = x + glyph.x; - final float x2 = x1 + texture.getWidth(); - final float y1 = y + glyph.y; - final float y2 = y1 + texture.getHeight(); - tess.texture(texture.getU(), texture.getV()).vertex(x1, y1, 0); - tess.texture(texture.getU(), texture.getV1()).vertex(x1, y2, 0); - tess.texture(texture.getU1(), texture.getV1()).vertex(x2, y2, 0); - tess.texture(texture.getU1(), texture.getV()).vertex(x2, y1, 0); - } - - /* Draw any remaining glyphs in the Tessellator's vertex array (there should be at least one glyph pending) */ - tess.draw(GL11.GL_QUADS); - } - - /** - * Return the width of a string in pixels. - * - * @param str compute the width of this string - * - * @return the width in pixels - */ - public int getStringWidth(String str) { - return this.cacheString(str).width; - } /* - * Caching Methods + * Caching Routines */ /** @@ -277,19 +210,18 @@ public int getStringWidth(String str) { * existing Entry from the cache. * * @param str this String will be laid out and added to the cache (or looked up, if already cached) - * * @return the string's cache entry containing all the glyph positions */ - private Entry cacheString(String str) { + public GlyphLayout cacheString(String str) { /* If this string is already in the cache, simply return the cached Entry object */ - Entry entry = stringCache.get(str); + GlyphLayout entry = stringCache.get(str); /* If string is not cached then layout the string */ if (entry == null) { final int width = layoutBidi(str); - entry = new Entry(glyphs.toArray(new Glyph[glyphs.size()]), width); + entry = new GlyphLayout(glyphs.toArray(new FontGlyph[glyphs.size()]), width); glyphs.clear(); /* Sorts these glyphs by associated TextureID to minimize OpenGL bind calls */ @@ -307,16 +239,14 @@ private Entry cacheString(String str) { * in the fontCache (based on the request style). Failing that, it searches the usedFonts list followed by the allFonts[] array. * * @param ch the character to check against the font - * * @return an OpenType font capable of displaying this character */ private Font cacheFont(char ch) { /* Try using an already known base font; the first font in usedFonts list is the one set with setFont() */ for (Font font : usedFonts) { /* Only use the font if it can layout the character */ - if (font.canDisplay(ch)) { + if (font.canDisplay(ch)) return font; - } } for (Font font : allFonts) { @@ -344,7 +274,6 @@ private Font cacheFont(char ch) { * @param limit the limit (offset + length) which to stop performing the layout * @param directionFlag either Font.LAYOUT_RIGHT_TO_LEFT or Font.LAYOUT_LEFT_TO_RIGHT * @param font the font to use to layout a GlyphVector - * * @return width of the glyphs cached */ private int cacheGlyphs(char[] text, int start, int limit, int directionFlag, Font font) { @@ -388,12 +317,11 @@ private int cacheGlyphs(char[] text, int start, int limit, int directionFlag, Fo * array of glyphcodes (and therefore render only a few glyphs at a time), this produces corrupted * Davengari glyphs under Windows 7. This will draw the string at most one time. */ - if (vectorBounds == null) { + if (vectorBounds == null) vectorBounds = cacheVector(vector); - } /* - * Get the glyph's pixel-aligned bounding box. The JavaDoc claims that the "The outline returned + * Get the glyph's pixel-aligned bounding box. The JavaDoc claims that the "The outline returned * by this method is positioned around the origin of each individual glyph." However, the actual * bounds are all relative to the start of the entire GlyphVector, which is actually more useful * for extracting the glyph's image from the rendered string. @@ -431,7 +359,7 @@ private int cacheGlyphs(char[] text, int start, int limit, int directionFlag, Fo * first because the composite method in the Graphics object is always set to AlphaComposite.Src. */ glyphGraphics.drawImage(stringImage, cacheX, cacheY, cacheX + rect.width, cacheY + rect.height, rect.x, - rect.y, rect.x + rect.width, rect.y + rect.height, null); + rect.y, rect.x + rect.width, rect.y + rect.height, null); /* * Store this glyph's position in texture and its origin offset. Note that "rect" will not be modified after @@ -443,7 +371,7 @@ private int cacheGlyphs(char[] text, int start, int limit, int directionFlag, Fo * Create new cache entry to record both the texture used by the glyph and its position within that texture. * Texture coordinates are normalized to 0.0-1.0 by dividing with TEXTURE_WIDTH and TEXTURE_HEIGHT. */ - tex = Texture.tex.createTexture(texture, rect.x, rect.y, rect.width, rect.height, TEXTURE_WIDTH); + tex = Texture.from(rect.x, rect.y, rect.width, rect.height, TEXTURE_WIDTH).setID(texture); /* * The lower 32 bits of the glyphCache key are the glyph codepoint. The upper 64 bits are the font number @@ -457,18 +385,17 @@ private int cacheGlyphs(char[] text, int start, int limit, int directionFlag, Fo * region than using the add(x, y) method to extend by a single point. Also note that creating the first * dirty rectangle here avoids having to deal with the special rules for empty/non-existent rectangles. */ - if (dirty == null) { + if (dirty == null) dirty = new Rectangle(cacheX, cacheY, rect.width, rect.height); - } else { + else dirty.add(rect); - } /* Advance cachePosX so the next glyph can be stored immediately to the right of this one */ cacheX += rect.width + 1; } final Point point = vector.getGlyphPixelBounds(index, null, 0, 0).getLocation(); - glyphs.add(new Glyph(tex, point.x - 2 * index, point.y)); + glyphs.add(new FontGlyph(tex, point.x - 2 * index, point.y)); } /* Update OpenGL texture if any part of the glyphCacheImage has changed */ @@ -488,10 +415,9 @@ private Rectangle cacheVector(GlyphVector vector) { final Rectangle vectorBounds = vector.getPixelBounds(fontContext, 0, 0); /* Enlage the stringImage if it is too small to store the entire rendered string */ - if (vectorBounds.width > stringImage.getWidth() || vectorBounds.height > stringImage.getHeight()) { + if (vectorBounds.width > stringImage.getWidth() || vectorBounds.height > stringImage.getHeight()) allocateStringImage(Math.max(vectorBounds.width, stringImage.getWidth()), - Math.max(vectorBounds.height, stringImage.getHeight())); - } + Math.max(vectorBounds.height, stringImage.getHeight())); /* Erase the upper-left corner where the string will get drawn*/ stringGraphics.clearRect(0, 0, vectorBounds.width, vectorBounds.height); @@ -502,24 +428,23 @@ private Rectangle cacheVector(GlyphVector vector) { return vectorBounds; } + /* - * Layout Methods + * Layout Routines */ private int layoutBidi(String str) { final char[] text = str.toCharArray(); /* Avoid performing full bidirectional analysis if text has no "strong" right-to-left characters */ - if (!Bidi.requiresBidi(text, 0, text.length)) { + if (!Bidi.requiresBidi(text, 0, text.length)) return layoutFont(text, 0, text.length, Font.LAYOUT_LEFT_TO_RIGHT); - } final Bidi bidi = new Bidi(text, 0, null, 0, text.length, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT); /* If text is entirely right-to-left, then just lay it out */ - if (bidi.isRightToLeft()) { + if (bidi.isRightToLeft()) return layoutFont(text, 0, text.length, Font.LAYOUT_RIGHT_TO_LEFT); - } /* Otherwise text has a mixture of LTR and RLT, and it requires full bidirectional analysis */ final int runCount = bidi.getRunCount(); @@ -554,11 +479,10 @@ private int layoutFont(char[] text, int start, int limit, int directionFlag) { * one unsupported character (which will use the font's "missing glyph code"), then retry the lookup again at the * next character after that. */ - if (next == start) { + if (next == start) next++; - } else if (next == -1) /* canDisplayUpTo returns -1 if the entire string range is supported by this font */ { + else if (next == -1) /* canDisplayUpTo returns -1 if the entire string range is supported by this font */ next = limit; - } width += cacheGlyphs(text, start, next, directionFlag, font); start = next; @@ -574,19 +498,18 @@ private int layoutFont(char[] text, int start, int limit, int directionFlag) { * @param start the offset into text at which to start the layout * @param limit the (offset + length) at which to stop performing the layout * @param layoutFlags either Font.LAYOUT_RIGHT_TO_LEFT or Font.LAYOUT_LEFT_TO_RIGHT - * * @return the newly created GlyphVector */ private GlyphVector layoutVector(Font font, char text[], int start, int limit, int layoutFlags) { /* Ensure this font is already in fontCache so it can be referenced by cacheGlyphs() later on */ - if (!fontCache.containsKey(font)) { + if (!fontCache.containsKey(font)) fontCache.put(font, fontCache.size()); - } return font.layoutGlyphVector(fontContext, text, start, limit, layoutFlags); } + /* - * OpenGL Methods + * OpenGL Routines */ /** @@ -599,7 +522,7 @@ private void updateTexture(Rectangle dirty) { updateBuffer(dirty.x, dirty.y, dirty.width, dirty.height); GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture); GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, dirty.x, dirty.y, dirty.width, dirty.height, GL11.GL_RGBA, - GL11.GL_UNSIGNED_BYTE, imageBuffer); + GL11.GL_UNSIGNED_BYTE, imageBuffer); } } @@ -624,7 +547,7 @@ private void allocateTexture() { */ GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture); GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_ALPHA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL11.GL_RGBA, - GL11.GL_UNSIGNED_BYTE, imageBuffer); + GL11.GL_UNSIGNED_BYTE, imageBuffer); /* Explicitly disable mipmap support because updateTexture() will only update the base level 0 */ GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); @@ -685,71 +608,19 @@ private void setRenderingHints() { .setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF); } - /* - * Inner Classes - */ - /** - * This entry holds the laid-out glyph positions for the cached string along with some relevant metadata. + /* + * Static Construction Methods */ - private class Entry { - - /** - * Array of fully laid-out glyphs for the string. Sorted by logical order of characters (i.e. glyph.stringIndex) - */ - final Glyph[] glyphs; - - /** - * The total horizontal advance (i.e. width) for this string in pixels. - */ - final int width; - - Entry(Glyph[] glyphs, int width) { - this.glyphs = glyphs; - this.width = width; - } - } /** - * Identifies a single glyph in the laid-out string. Includes a reference to a Texture Object with the OpenGL texture ID - * and position of the pre-rendered glyph image, and includes the x/y pixel coordinates of where this glyph occurs within - * the string to which this Glyph object belongs. - */ - private class Glyph implements Comparable { - - /** - * Glyph's horizontal/vertical position (in pixels) relative to the entire string's baseline - */ - final int x, y; - - /** - * Texture ID and position/size of the glyph's pre-rendered image within the cache texture. - */ - final Texture texture; - - /** - * Your standard constructor. See class documentation for details. - * - * @param texture Texture ID and position/size of the glyph's pre-rendered image within the cache texture - * @param x Glyph's horizontal position (in pixels) relative to the entire string's baseline - * @param y Glyph's vertical position (in pixels) relative to the entire string's baseline - */ - Glyph(Texture texture, int x, int y) { - this.texture = texture; - this.x = x; - this.y = y; - } - - /** - * Allows arrays of Glyph objects to be sorted. Performs numeric comparison on texture ID. - * - * @param o the other Glyph object being compared with this one - * - * @return either -1, 0, or 1 if this < other, this == other, or this > other - */ - @Override - public int compareTo(Glyph o) { - return (this.texture.getID() == o.texture.getID()) ? 0 : 1; - } + * Creates a FontCache of the requested Font object + * @param font The Font to cache + * @return the Cache of the font passed + */ + public static FontCache from(Font font) { + FontCache cache = new FontCache(); + cache.usedFonts.add(font); + return cache; } } diff --git a/src/main/java/pw/knx/feather/font/FontGlyph.java b/src/main/java/pw/knx/feather/font/FontGlyph.java new file mode 100644 index 00000000..1fa822c6 --- /dev/null +++ b/src/main/java/pw/knx/feather/font/FontGlyph.java @@ -0,0 +1,48 @@ +package pw.knx.feather.font; + +import pw.knx.feather.texture.Texture; + +/** + * Identifies a single glyph in the laid-out string. Includes a reference to a Texture Object with the OpenGL texture ID + * and position of the pre-rendered glyph image, and includes the x/y pixel coordinates of where this glyph occurs within + * the string to which this Glyph object belongs. + * + * @author KNOXDEV + * @since 6/8/2017 5:35 PM + */ +public class FontGlyph implements Comparable { + + /** + * Glyph's horizontal/vertical position (in pixels) relative to the entire string's baseline + */ + public final int x, y; + + /** + * Texture ID and position/size of the glyph's pre-rendered image within the cache texture. + */ + public final Texture texture; + + /** + * Your standard constructor. See class documentation for details. + * + * @param texture Texture ID and position/size of the glyph's pre-rendered image within the cache texture + * @param x Glyph's horizontal position (in pixels) relative to the entire string's baseline + * @param y Glyph's vertical position (in pixels) relative to the entire string's baseline + */ + FontGlyph(Texture texture, int x, int y) { + this.texture = texture; + this.x = x; + this.y = y; + } + + /** + * Allows arrays of Glyph objects to be sorted. Performs numeric comparison on texture ID. + * + * @param o the other Glyph object being compared with this one + * @return either -1, 0, or 1 if this < other, this == other, or this > other + */ + @Override + public int compareTo(FontGlyph o) { + return (this.texture.id() == o.texture.id()) ? 0 : 1; + } +} diff --git a/src/main/java/pw/knx/feather/font/GlyphLayout.java b/src/main/java/pw/knx/feather/font/GlyphLayout.java new file mode 100644 index 00000000..fc7fd8b7 --- /dev/null +++ b/src/main/java/pw/knx/feather/font/GlyphLayout.java @@ -0,0 +1,26 @@ +package pw.knx.feather.font; + +/** + * + * This entry holds the laid-out glyph positions for the cached string along with some relevant metadata. + * + * @author KNOXDEV + * @since 6/8/2017 5:34 PM + */ +public class GlyphLayout { + + /** + * Array of fully laid-out glyphs for the string. Sorted by logical order of characters (i.e. glyph.stringIndex) + */ + public final FontGlyph[] glyphs; + + /** + * The total horizontal advance (i.e. width) for this string in pixels. + */ + public final int width; + + GlyphLayout(FontGlyph[] glyphs, int width) { + this.glyphs = glyphs; + this.width = width; + } +} diff --git a/src/main/java/pw/knx/feather/shapes/Dimensions.java b/src/main/java/pw/knx/feather/shapes/Dimensions.java new file mode 100644 index 00000000..8308f28e --- /dev/null +++ b/src/main/java/pw/knx/feather/shapes/Dimensions.java @@ -0,0 +1,101 @@ +package pw.knx.feather.shapes; + +/** + * The simplest 2-Dimensional shape, basically a paired width-height vector. + *

+ * We decided to create our own shape structures because LWJGL's and the JDK's + * did not suit the conventions of the Feather library. + *

+ * In standard Feather convention, the setters in this class return itself + * to allow for efficient and readable method chaining. + * + * @author KNOXDEV + * @since 5/25/2017 4:58 AM + */ +public class Dimensions { + // we can keep these private because the methods we have totally expose them + private int width, height; + + + /* + * Getters - For retrieving internal values + */ + + /** + * @return this shape's width + */ + public int width() { + return width; + } + + /** + * @return this shape's height + */ + public int height() { + return height; + } + + + /* + * Setters - For setting internal values + */ + + /** + * Set this shape's width + * + * @param w the width to set + * @return this shape, freshly set + */ + public Dimensions setWidth(int w) { + width = w; + return this; + } + + /** + * Set this shape's height + * + * @param h the height to set + * @return this shape, freshly set + */ + public Dimensions setHeight(int h) { + height = h; + return this; + } + + /** + * Set the width and height of this shape + * + * @param width the width value to use + * @param height the height value to use + * @return this shape, freshly set + */ + public Dimensions setTo(int width, int height) { + return setWidth(width).setHeight(height); + } + + /** + * Set the width and height of this shape to match the Dimension provided + * + * @param size the Dimensions to be set to + * @return this shape, freshly set + */ + public Dimensions setTo(Dimensions size) { + return setTo(size.width, size.height); + } + + + /* + * Modifiers - For now, just an offset shorthand method + */ + + /** + * Offset this shape by the width and height provided + * + * @param dWidth the change in width + * @param dHeight the change in height + * @return this shape, freshly offset + */ + public Dimensions offset(int dWidth, int dHeight) { + return setTo(width + dWidth, height + dHeight); + } +} diff --git a/src/main/java/pw/knx/feather/shapes/Rectangle.java b/src/main/java/pw/knx/feather/shapes/Rectangle.java new file mode 100644 index 00000000..372ebb8b --- /dev/null +++ b/src/main/java/pw/knx/feather/shapes/Rectangle.java @@ -0,0 +1,232 @@ +package pw.knx.feather.shapes; + +/** + * Representation of a geometric Rectangle. + * Four vectors, x position, y position, width, and height. + *

+ * We decided to create our own shape structures because LWJGL's and the JDK's + * did not suit the conventions of the Feather library. + *

+ * In standard Feather convention, the setters in this class return itself + * to allow for efficient and readable method chaining. + * + * @author KNOXDEV + * @since 5/25/2017 5:01 AM + */ +public class Rectangle { + // we can keep these private because the methods we have totally expose them + private int x, y, width, height; + + + /* + * Getters - For retrieving internal values, some literal, some logical (such as x1, etc.) + */ + + /** + * @return this shape's x-position + */ + public int x() { + return x; + } + + /** + * @return this shape's y-position + */ + public int y() { + return y; + } + + /** + * @return this shape's width + */ + public int width() { + return width; + } + + /** + * @return this shape's height + */ + public int height() { + return height; + } + + /** + * @return the calculated x-position of this shape's opposite vertex + */ + public int x1() { + return x + width; + } + + /** + * @return the calculated y-position of this shape's opposite vertex + */ + public int y1() { + return y + height; + } + + + /* + * Setters - For setting internal values, some literal, some logical (such as x1, etc.) + */ + + /** + * Set this shape's x-position + * + * @param x the x-position to set + * @return this shape, freshly set + */ + public Rectangle setX(int x) { + this.x = x; + return this; + } + + /** + * Set this shape's y-position + * + * @param y the y-position to set + * @return this shape, freshly set + */ + public Rectangle setY(int y) { + this.y = y; + return this; + } + + /** + * Set the x-position of this shape's opposite vertex + * + * @param x1 the x-position to set + * @return this shape, freshly set + */ + public Rectangle setX1(int x1) { + return setWidth(x1 - x); + } + + /** + * Set the y-position of this shape's opposite vertex + * + * @param y1 the y-position to set + * @return this shape, freshly set + */ + public Rectangle setY1(int y1) { + return setHeight(y1 - y); + } + + /** + * Set this shape's width + * + * @param w the width to set + * @return this shape, freshly set + */ + public Rectangle setWidth(int w) { + width = w; + return this; + } + + /** + * Set this shape's height + * + * @param h the height to set + * @return this shape, freshly set + */ + public Rectangle setHeight(int h) { + height = h; + return this; + } + + /** + * Set the x-position, y-position, width, and height of this shape + * + * @param x the x-position value to use + * @param y the xy-position value to use + * @param w the width value to use + * @param h the height value to use + * @return this shape, freshly set + */ + public Rectangle setTo(int x, int y, int w, int h) { + return setX(x).setY(y).setWidth(w).setHeight(h); + } + + /** + * Set the x-position, y-position, width, and height of this shape to match the Rectangle provided + * + * @param rect the Rectangle area to be set to + * @return this shape, freshly set + */ + public Rectangle setTo(Rectangle rect) { + return setTo(rect.x, rect.y, rect.width, rect.height); + } + + + /* + * Modifiers - Mostly just short hands for common adjustment operations + */ + + /** + * Offset this shape by the x and y provided + * + * @param dx the change in x-position + * @param dy the change in y-position + * @return this shape, freshly offset + */ + public Rectangle offset(int dx, int dy) { + return offset(dx, dy, 0, 0); + } + + /** + * Offset this shape's x-position, y-position, width, and height by the deltas provided + * + * @param dx the change in x-position + * @param dy the change in y-position + * @param dWidth the change in width + * @param dHeight the change in height + * @return this shape, freshly offset + */ + public Rectangle offset(int dx, int dy, int dWidth, int dHeight) { + return setTo(x + dx, y + dy, width + dWidth, height + dHeight); + } + + /** + * Expand this shape by the x and y provided + * + * @param dx the horizontal change + * @param dy the vertical change + * @return this shape, freshly expanded + */ + public Rectangle expand(int dx, int dy) { + return offset(-dx, -dy, 2*dx, 2*dy); + } + + /** + * Contract this shape by the x and y provided + * + * @param dx the horizontal change + * @param dy the vertical change + * @return this shape, freshly contracted + */ + public Rectangle contract(int dx, int dy) { + return offset(dx, dy, -2*dx, -2*dy); + } + + + /* + * Misc. Functions: + */ + + /** + * Checks if the provided point is inside the bounds of this shape, inclusive + * + * @param i the point's horizontal position + * @param j the point's vertical position + * @return true, if the point lies on the plane described by this shape + */ + public boolean contains(int i, int j) { + return i >= x && j >= y && i <= x1() && j <= y1(); + } + + /** + * @return an exact, dereferenced copy of this Rectangle with the same values + */ + public Rectangle copy() { + return new Rectangle().setTo(this); + } +} diff --git a/src/main/java/pw/knx/feather/util/Color.java b/src/main/java/pw/knx/feather/structures/Color.java similarity index 99% rename from src/main/java/pw/knx/feather/util/Color.java rename to src/main/java/pw/knx/feather/structures/Color.java index a8f841bc..0aee7bac 100644 --- a/src/main/java/pw/knx/feather/util/Color.java +++ b/src/main/java/pw/knx/feather/structures/Color.java @@ -1,4 +1,4 @@ -package pw.knx.feather.util; +package pw.knx.feather.structures; /** * A simple objectual representation of a Color. @@ -22,7 +22,7 @@ * @author KNOXDEV * @since 9/8/2016 21:41 */ -public class Color implements BufferUtils { +public class Color { /** * In this class, we store alpha separately and persistently, @@ -412,9 +412,8 @@ public Color hex(int hex) { */ public Color hex(int hex, HexFormat format) { int alpha = format.getAlphaInt(hex); - if (alpha != 0) { + if (alpha != 0) alpha(alpha); - } return red(format.getRedInt(hex)).green(format.getGreenInt(hex)).blue(format.getBlueInt(hex)); } diff --git a/src/main/java/pw/knx/feather/util/VBO.java b/src/main/java/pw/knx/feather/structures/VBO.java similarity index 88% rename from src/main/java/pw/knx/feather/util/VBO.java rename to src/main/java/pw/knx/feather/structures/VBO.java index 986926dc..e734a59c 100644 --- a/src/main/java/pw/knx/feather/util/VBO.java +++ b/src/main/java/pw/knx/feather/structures/VBO.java @@ -1,4 +1,4 @@ -package pw.knx.feather.util; +package pw.knx.feather.structures; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; @@ -6,6 +6,8 @@ import java.nio.ByteBuffer; import java.nio.FloatBuffer; +import static pw.knx.feather.Feather.feather; + /** * A simple OpenGL VertexBufferObject implementation for rendering shapes that will stay * consistent throughout Runtime and be used often. A key feature of this particular @@ -13,15 +15,15 @@ * with older builds of OpenGL. Please also note that this class is only compatible with * vertices and not factors like textures or colors. *

- * I seem to recall Halalalaboos creating something like this, + * I seem to recall Halalaboos creating something like this, * so credit is given accordingly. *

* The voids in this interface return the VBO object for easy method chaining. * - * @author KNOXDEV, Halalalaboos + * @author KNOXDEV, Halalaboos * @since 8/9/2016 05:58 */ -public class VBO implements BufferUtils { +public class VBO { /** * The VBO's buffer ID, for binding this object to. @@ -30,7 +32,7 @@ public class VBO implements BufferUtils { /** * Quite literally, this object's dimensions. - * No seriously, if you want to render 1-dimensional objects feel free. + * No seriously, if you want to render 1-dimensional objects feel free. That's weird though. */ protected final int dimensions; @@ -75,7 +77,7 @@ public VBO(int dimensions, int id) { */ public VBO compile(float... points) { if (points != null && points.length > 0) { - final FloatBuffer buffer = buff.createDirectBuffer(points.length * 4).asFloatBuffer(); + final FloatBuffer buffer = feather.allocateBuffer(points.length * 4).asFloatBuffer(); buffer.put(points).flip(); return this.compile(buffer); } @@ -90,9 +92,9 @@ public VBO compile(float... points) { */ public VBO compile(FloatBuffer buffer) { this.size = buffer.capacity(); - buff.bindBuffer(this.id); + feather.bindBuffer(this.id); GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); - buff.bindBuffer(0); + feather.bindBuffer(0); return this; } @@ -102,7 +104,7 @@ public VBO compile(FloatBuffer buffer) { * @return The original VBO */ public VBO bind() { - buff.bindBuffer(this.id); + feather.bindBuffer(this.id); GL11.glVertexPointer(this.dimensions, GL11.GL_FLOAT, 0, 0L); GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY); return this; diff --git a/src/main/java/pw/knx/feather/tessellate/BasicTess.java b/src/main/java/pw/knx/feather/tessellate/BasicTess.java index 90cd457e..0fb4f478 100644 --- a/src/main/java/pw/knx/feather/tessellate/BasicTess.java +++ b/src/main/java/pw/knx/feather/tessellate/BasicTess.java @@ -1,52 +1,52 @@ package pw.knx.feather.tessellate; import org.lwjgl.opengl.GL11; -import pw.knx.feather.tessellate.base.Tessellator; -import pw.knx.feather.util.BufferUtils; import java.nio.ByteBuffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; +import static pw.knx.feather.Feather.feather; + /** * A standard implementation of the Tessellator interface. *

* The most noteworthy point to make about this Tessellator is that it *will not grow*. * Its size is final from the moment it's instantiated. If you attempt to add more data * than it can hold, it will throw an error. To create an automatically resizing - * Tessellator, use the GrowingTess implementation, also found in this package. + * Tessellator, use the ExpandingTess implementation, also found in this package. *

* The voids in this interface return the Tessellator object for easy method chaining. * * @author KNOXDEV * @since 8/9/2016 03:00 */ -public class BasicTess implements Tessellator, BufferUtils { +public class BasicTess implements Tessellator { /** * Tracks the current index in the total data buffer that we're on */ - protected int index; + int index; /** * The raw array of integers that stores vertex information */ - protected int[] raw; + int[] raw; /** * A byte buffer mainly utilized as a vehicle for transferring the raw data to OpenGL upon binding */ - protected ByteBuffer buffer; + ByteBuffer buffer; /** * A float buffer view of the main byte buffer */ - protected FloatBuffer fBuffer; + FloatBuffer fBuffer; /** * A integer buffer view of the main byte buffer */ - protected IntBuffer iBuffer; + IntBuffer iBuffer; /** * An integer storing our main color data for this vertex @@ -68,12 +68,12 @@ public class BasicTess implements Tessellator, BufferUtils { * * @param capacity The total capacity, in whole verticies, that this Tessellator will be able to render at once. */ - public BasicTess(int capacity) { + BasicTess(int capacity) { /** Why times 6? Because 6 is how much space (in integers) that each vertex * takes up in the buffer, since each vertex stores color and texture as well. */ capacity *= 6; this.raw = new int[capacity]; - this.buffer = buff.createDirectBuffer(capacity * 4); // 4 bytes in an integer! + this.buffer = feather.allocateBuffer(capacity * 4); // 4 bytes in an integer! this.fBuffer = this.buffer.asFloatBuffer(); this.iBuffer = this.buffer.asIntBuffer(); } @@ -83,7 +83,7 @@ public BasicTess(int capacity) { * @return The original Tessellator Object */ @Override - public Tessellator color(int color) { + public Tessellator setColor(int color) { this.color = true; this.colors = color; return this; @@ -97,7 +97,7 @@ public Tessellator color(int color) { * @return The original Tessellator Object */ @Override - public Tessellator texture(float u, float v) { + public Tessellator setTexture(float u, float v) { this.texture = true; this.texU = u; this.texV = v; @@ -115,7 +115,7 @@ public Tessellator texture(float u, float v) { * @return The original Tessellator Object */ @Override - public Tessellator vertex(float x, float y, float z) { + public Tessellator addVertex(float x, float y, float z) { final int dex = this.index * 6; this.raw[dex] = Float.floatToRawIntBits(x); this.raw[dex + 1] = Float.floatToRawIntBits(y); diff --git a/src/main/java/pw/knx/feather/tessellate/GrowingTess.java b/src/main/java/pw/knx/feather/tessellate/ExpandingTess.java similarity index 70% rename from src/main/java/pw/knx/feather/tessellate/GrowingTess.java rename to src/main/java/pw/knx/feather/tessellate/ExpandingTess.java index 659b69dc..22004e80 100644 --- a/src/main/java/pw/knx/feather/tessellate/GrowingTess.java +++ b/src/main/java/pw/knx/feather/tessellate/ExpandingTess.java @@ -1,6 +1,6 @@ package pw.knx.feather.tessellate; -import pw.knx.feather.tessellate.base.Tessellator; +import static pw.knx.feather.Feather.feather; /** * An automatically resizing implementation of the Tessellator interface. @@ -12,37 +12,26 @@ * @author KNOXDEV * @since 8/9/2016 03:00 */ -public class GrowingTess extends BasicTess { +public class ExpandingTess extends BasicTess { /** * The target ratio, between 0 and 1.0, that this Tessellator must hit before it grows. */ - final float ratio; + private final float ratio; /** * The factor of which this Tessellator will grow when it hits the ratio. */ - final float factor; + private final float factor; /** - * Constructs a Growing Tessellator. See Class Documentation for more information. - * By default, a GrowingTess's capacity will double every time it hits its maximum capacity. - * Use the alternate constructor if you wish to change this behavior. - * - * @param initial The total initial capacity, in whole vertices. - */ - public GrowingTess(int initial) { - this(initial, 1, 2); - } - - /** - * Constructs a Growing Tessellator. See Class Documentation for more information. + * Constructs an Expanding Tessellator. See Class Documentation for more information. * * @param initial The total initial capacity, in whole vertices. * @param ratio The target ratio, between 0 and 1.0, that this Tessellator must hit before it grows. * @param factor The factor of which this Tessellator will grow when it hits the ratio. */ - public GrowingTess(int initial, float ratio, float factor) { + ExpandingTess(int initial, float ratio, float factor) { super(initial); this.ratio = ratio; this.factor = factor; @@ -62,17 +51,17 @@ public GrowingTess(int initial, float ratio, float factor) { * @return The original Tessellator Object */ @Override - public Tessellator vertex(float x, float y, float z) { + public Tessellator addVertex(float x, float y, float z) { int capacity = raw.length; if (index * 6 >= capacity * ratio) { // if we've hit our capacity limit capacity *= factor; // raise our limit by the amount specified final int[] newBuffer = new int[capacity]; // allocate the new data System.arraycopy(raw, 0, newBuffer, 0, raw.length); // transfer the data from the old array to the new array raw = newBuffer; // replace the array - buffer = buff.createDirectBuffer(capacity * 4); // allocate a new corresponding ByteBuffer + buffer = feather.allocateBuffer(capacity * 4); // allocate a new corresponding ByteBuffer iBuffer = buffer.asIntBuffer(); fBuffer = buffer.asFloatBuffer(); } - return super.vertex(x, y, z); + return super.addVertex(x, y, z); } } \ No newline at end of file diff --git a/src/main/java/pw/knx/feather/tessellate/OffsetTess.java b/src/main/java/pw/knx/feather/tessellate/OffsetTess.java deleted file mode 100644 index 72431501..00000000 --- a/src/main/java/pw/knx/feather/tessellate/OffsetTess.java +++ /dev/null @@ -1,168 +0,0 @@ -package pw.knx.feather.tessellate; - -import org.lwjgl.opengl.GL11; -import pw.knx.feather.tessellate.base.Tessellator; - -/** - * An easily translatable implementation of the Tessellator interface. - *

- * This class is an unusual implementation as it does not strictly handle tessellating itself, - * rather, this class is designed to wrap around an existing Tessellator, so developers can be - * flexible about what kind of Tessellator they want to translate. Most methods in this class - * will simply be passed through to the original Tessellator and leaves most of its - * behavior intact. The only difference is a series of methods that allow for simple - * offsetting of the current shape, which is handy for rendering the same shape in multiple - * places without binding completely new data. If the shape is totally consistent throughout - * Runtime, consider using the VBO class instead. - * - * @author KNOXDEV - * @since 8/9/2016 03:55 - */ -public class OffsetTess implements Tessellator { - - /** - * The original Tessellator object that most methods will pass to. - */ - private final Tessellator tess; - - /** - * Floats representing the X, Y, and Z distance that this Tessellator is currently offset by. - */ - public float offsetX, offsetY, offsetZ; - - /** - * Constructs an Offset Tessellator. See Class Documentation for more information. - * Please note that by default, this Tessellator will offset a Basic Tessellator. - * Use the alternate constructor if you wish to change this behavior. - * - * @param capacity The total initial capacity, in whole vertices. - */ - public OffsetTess(int capacity) { - this(new BasicTess(capacity)); - } - - /** - * Constructs an Offset Tessellator. See Class Documentation for more information. - * - * @param tess The Tessellator object you wish to wrap and offset - */ - public OffsetTess(Tessellator tess) { - this.tess = tess; - } - - /** - * Please see implemented Tessellator documentation for specific information. - * - * @param color The color to associate the upcoming vertex data with - * @return The original Tessellator Object - */ - @Override - public Tessellator color(int color) { - tess.color(color); - return this; - } - - /** - * Set the texture coordinates to associate the upcoming vertex data with. - *

- * Please see implemented Tessellator documentation for specific information. - * - * @param u The x starting coordinate - * @param v The y starting coordinate - * @return The original Tessellator Object - */ - @Override - public Tessellator texture(float u, float v) { - tess.texture(u, v); - return this; - } - - /** - * Enters a vertex of the shape to be rendered. - * All data fed to the Tessellator revolves around the vertex data, - * as it is the only information absolutely necessary to render a shape. - *

- * Please see implemented Tessellator documentation for specific information. - * - * @param x The x coordinate of this vertex - * @param y The y coordinate of this vertex - * @param z The z coordinate of this vertex - * @return The original Tessellator Object - */ - @Override - public Tessellator vertex(float x, float y, float z) { - tess.vertex(x, y, z); - return this; - } - - /** - * The first stage of rendering. - * Binds (finalizes) the current rendering data stored in the buffer for drawing. - * This must be executed before you perform a rendering pass. - *

- * Please see implemented Tessellator documentation for specific information. - * - * @return The original Tessellator Object - */ - @Override - public Tessellator bind() { - tess.bind(); - return this; - } - - /** - * The second stage of rendering. - * Performs a rendering pass with the data bound to the buffer. - * If the data is not bound first, this method will fail. - * Otherwise, you can render the data for as many passes as you please. - *

- * Please see implemented Tessellator documentation for specific information. - * - * @param mode The OpenGL mode to render the data with - * @return The original Tessellator Object - */ - @Override - public Tessellator pass(int mode) { - GL11.glTranslatef(offsetX, offsetY, offsetZ); - final Tessellator sup = tess.pass(mode); - GL11.glTranslatef(-offsetX, -offsetY, offsetZ); - return sup; - } - - /** - * The third and final stage of rendering. - * Clears up the buffer and resets the Tessellator so it can - * be used again with new data. Passes can no longer be made - * after this method is executed. - *

- * Please see implemented Tessellator documentation for specific information. - * - * @return The original Tessellator Object - */ - @Override - public Tessellator reset() { - tess.reset(); - return this; - } - - @Override - public Tessellator unbind() { - tess.unbind(); - return this; - } - - /** - * Performs all three rendering stages in one method. - * This method cannot be run more than once without entering new data. - *

- * Please see implemented Tessellator documentation for specific information. - * - * @param mode The OpenGL mode to render the data with - * @return The original Tessellator Object - */ - @Override - public Tessellator draw(int mode) { - tess.draw(mode); - return this; - } -} \ No newline at end of file diff --git a/src/main/java/pw/knx/feather/tessellate/base/Tessellator.java b/src/main/java/pw/knx/feather/tessellate/Tessellator.java similarity index 65% rename from src/main/java/pw/knx/feather/tessellate/base/Tessellator.java rename to src/main/java/pw/knx/feather/tessellate/Tessellator.java index 09389371..561e4d8b 100644 --- a/src/main/java/pw/knx/feather/tessellate/base/Tessellator.java +++ b/src/main/java/pw/knx/feather/tessellate/Tessellator.java @@ -1,6 +1,6 @@ -package pw.knx.feather.tessellate.base; +package pw.knx.feather.tessellate; -import pw.knx.feather.util.Color; +import pw.knx.feather.structures.Color; /** * A standard abstract interface for an OpenGL Tessellator. @@ -12,41 +12,24 @@ */ public interface Tessellator { - /** - * @param color The color to associate the upcoming vertex data with - * NOTE: Must be in ABGR format - * @return The original Tessellator Object - */ - Tessellator color(int color); - /** - * @param color The color to associate the upcoming vertex data with - * @return The original Tessellator Object + /* + * Setters - Setting and adding values to this tessellator */ - default Tessellator color(Color color) { - return color(color.getHex(Color.HexFormat.ABGR)); - } /** - * @param red The red component of the color to bind - * @param green The green component of the color to bind - * @param blue The blue component of the color to bind - * @param alpha The alpha component of the color to bind + * @param color The color to associate the upcoming vertex data with + * NOTE: Must be in ABGR format * @return The original Tessellator Object */ - default Tessellator color(int red, int green, int blue, int alpha) { - return color(Color.HexFormat.ABGR.getHex(red, green, blue, alpha)); - } + Tessellator setColor(int color); /** - * @param red The red component of the color to bind - * @param green The green component of the color to bind - * @param blue The blue component of the color to bind - * @param alpha The alpha component of the color to bind + * @param color The color to associate the upcoming vertex data with * @return The original Tessellator Object */ - default Tessellator color(float red, float green, float blue, float alpha) { - return color((int) (red * 255), (int) (green * 255), (int) (blue * 255), (int) (alpha * 255)); + default Tessellator setColor(Color color) { + return setColor(color.getHex(Color.HexFormat.ABGR)); } /** @@ -56,11 +39,11 @@ default Tessellator color(float red, float green, float blue, float alpha) { * @param v The y starting coordinate * @return The original Tessellator Object */ - Tessellator texture(float u, float v); + Tessellator setTexture(float u, float v); /** * Enters a vertex of the shape to be rendered. - * All data fed to the Tessellator revolves around the vertex data, + * All data fed to the Tessellator relies on the vertex data, * as it is the only information absolutely necessary to render a shape. * * @param x The x coordinate of this vertex @@ -68,7 +51,13 @@ default Tessellator color(float red, float green, float blue, float alpha) { * @param z The z coordinate of this vertex * @return The original Tessellator Object */ - Tessellator vertex(float x, float y, float z); + Tessellator addVertex(float x, float y, float z); + + + /* + * Render Commands - These provide fine-tuned control over the + * three-stage render process, if needed + */ /** * The first stage of rendering. @@ -116,7 +105,8 @@ default Tessellator color(float red, float green, float blue, float alpha) { /** * Performs all three rendering stages in one method. - * This method cannot be run more than once without entering new data. + * This method cannot be run more than once without entering new data, + * due to the fact it resets the buffer. * * @param mode The OpenGL mode to render the data with * @return The original Tessellator Object @@ -124,4 +114,31 @@ default Tessellator color(float red, float green, float blue, float alpha) { default Tessellator draw(int mode) { return this.bind().pass(mode).reset(); } + + + /* + * Static Constructors - allows intuitive initialization of a Tessellator to fit any purpose + */ + + /** + * Creates an immutable Tessellator that will not grow past its initial capacity + * + * @param size the initial (and final) capacity of this Tessellator + * @return the requested Basic Tessellator + */ + static Tessellator createBasic(int size) { + return new BasicTess(size); + } + + /** + * Creates a growing Tessellator that will increase in capacity as its limit is reached + * + * @param size the initial capacity of this Tessellator + * @param ratio The target ratio, between 0 and 1.0, that this Tessellator must hit before it grows. + * @param factor The factor of which this Tessellator will grow when it hits the ratio. + * @return the requested Basic Tessellator + */ + static Tessellator createExpanding(int size, float ratio, float factor) { + return new ExpandingTess(size, ratio, factor); + } } \ No newline at end of file diff --git a/src/main/java/pw/knx/feather/texture/BasicTexture.java b/src/main/java/pw/knx/feather/texture/BasicTexture.java index 77c47bf3..f72d965f 100644 --- a/src/main/java/pw/knx/feather/texture/BasicTexture.java +++ b/src/main/java/pw/knx/feather/texture/BasicTexture.java @@ -1,8 +1,9 @@ package pw.knx.feather.texture; import org.lwjgl.opengl.GL11; -import pw.knx.feather.tessellate.base.Tessellator; -import pw.knx.feather.texture.base.Texture; +import pw.knx.feather.tessellate.Tessellator; + +import static pw.knx.feather.Feather.feather; /** * A simple implementation of our OpenGL Texture interface @@ -30,7 +31,7 @@ public class BasicTexture implements Texture { */ @Override public Texture bind() { - GL11.glBindTexture(GL11.GL_TEXTURE_2D, texID); + feather.bindTexture(texID); return this; } @@ -45,8 +46,8 @@ public Texture bind() { */ @Override public Texture draw(Tessellator tess, int mode, float x, float y) { - tess.texture(u1, v).vertex(x + width, y, 0).texture(u, v).vertex(x, y, 0); - tess.texture(u, v1).vertex(x, y + height, 0).texture(u1, v1).vertex(x + width, y + height, 0); + tess.setTexture(u1, v).addVertex(x + width, y, 0).setTexture(u, v).addVertex(x, y, 0); + tess.setTexture(u, v1).addVertex(x, y + height, 0).setTexture(u1, v1).addVertex(x + width, y + height, 0); tess.draw(mode); return this; } @@ -55,7 +56,7 @@ public Texture draw(Tessellator tess, int mode, float x, float y) { * @return the OpenGL Texture ID */ @Override - public int getID() { + public int id() { return this.texID; } @@ -63,7 +64,7 @@ public int getID() { * @return the x coordinate of the top-left texture point, on a float scale from 0 to 1.0 */ @Override - public float getU() { + public float u() { return this.u; } @@ -71,7 +72,7 @@ public float getU() { * @return the y coordinate of the top-left texture point, on a float scale from 0 to 1.0 */ @Override - public float getV() { + public float v() { return this.v; } @@ -79,7 +80,7 @@ public float getV() { * @return the x coordinate of the bottom-right texture point, on a float scale from 0 to 1.0 */ @Override - public float getU1() { + public float u1() { return this.u1; } @@ -87,7 +88,7 @@ public float getU1() { * @return the y coordinate of the bottom-right texture point, on a float scale from 0 to 1.0 */ @Override - public float getV1() { + public float v1() { return this.v1; } @@ -95,7 +96,7 @@ public float getV1() { * @return the width of the texture rendering in pixels */ @Override - public float getWidth() { + public float width() { return this.width; } @@ -103,7 +104,7 @@ public float getWidth() { * @return the height of the texture rendering in pixels */ @Override - public float getHeight() { + public float height() { return this.height; } diff --git a/src/main/java/pw/knx/feather/texture/base/Texture.java b/src/main/java/pw/knx/feather/texture/Texture.java similarity index 50% rename from src/main/java/pw/knx/feather/texture/base/Texture.java rename to src/main/java/pw/knx/feather/texture/Texture.java index c6b9b44a..720f7234 100644 --- a/src/main/java/pw/knx/feather/texture/base/Texture.java +++ b/src/main/java/pw/knx/feather/texture/Texture.java @@ -1,51 +1,54 @@ -package pw.knx.feather.texture.base; +package pw.knx.feather.texture; -import pw.knx.feather.tessellate.base.Tessellator; -import pw.knx.feather.util.TextureUtils; +import pw.knx.feather.tessellate.Tessellator; /** * A simple OpenGL Texture interface * The voids in this interface return the Texture object for easy method chaining + *

+ * In addition, this interface contains construction methods that can be called intuitively: + * Texture.from(); + * ...rather than needing to know to use 'new ***Texture()' * * @author KNOXDEV * @since 8/8/2016 23:53 */ -public interface Texture extends TextureUtils { +public interface Texture { /** * @return the OpenGL Texture ID */ - int getID(); + int id(); /** * @return the x coordinate of the top-left texture point, on a float scale from 0 to 1.0 */ - float getU(); + float u(); /** * @return the y coordinate of the top-left texture point, on a float scale from 0 to 1.0 */ - float getV(); + float v(); /** * @return the x coordinate of the bottom-right texture point, on a float scale from 0 to 1.0 */ - float getU1(); + float u1(); /** * @return the y coordinate of the bottom-right texture point, on a float scale from 0 to 1.0 */ - float getV1(); + float v1(); /** * @return the width of the texture rendering in pixels */ - float getWidth(); + float width(); /** * @return the height of the texture rendering in pixels */ - float getHeight(); + float height(); /** * @param id The OpenGL Texture object ID @@ -104,4 +107,39 @@ public interface Texture extends TextureUtils { * @return The original Texture object */ Texture draw(Tessellator tess, int mode, float x, float y); + + + /* ##################### + * Static Constructors + * ##################### */ + + /** + * @param u The x coordinate of the top-left texture point, on a float scale from 0 to 1.0 + * @param v The y coordinate of the top-left texture point, on a float scale from 0 to 1.0 + * @param u1 The x coordinate of the bottom-right texture point, on a float scale from 0 to 1.0 + * @param v1 The y coordinate of the bottom-right texture point, on a float scale from 0 to 1.0 + * @param width The width of the texture rendering in pixels + * @param height The height of the texture rendering in pixels + * @return a freshly instantiated BasicTexture object with the parameters provided + */ + static Texture from(float u, float v, float u1, float v1, float width, float height) { + return new BasicTexture().setU(u).setV(v).setU1(u1).setV1(v1).setWidth(width).setHeight(height); + } + + /** + * Like above, creates a new BasicTexture object with the parameters provided. + * The difference is that it allows you to pass pixel-based U&V rather than 0-1 floats. + * In exchange for automatically calculating U, V, U1, and V1, the method requires the texture + * resource's original dimensions. (64, 256, etc.) + * + * @param u Starting x coordinate of section of the origin resource to be rendered in pixels. + * @param v Starting y coordinate of section of the origin resource to be rendered in pixels. + * @param width The width of section of the origin resource to be rendered in pixels. + * @param height The height of section of the origin resource to be rendered in pixels. + * @param dimensions The origin texture resource's original dimensions. (64, 256, etc.) + * @return a freshly instantiated BasicTexture object with the parameters provided + */ + static Texture from(float u, float v, float width, float height, int dimensions) { + return from(u / dimensions, v / dimensions, (u + width) / dimensions, (v + height) / dimensions, width, height); + } } \ No newline at end of file diff --git a/src/main/java/pw/knx/feather/util/BufferUtils.java b/src/main/java/pw/knx/feather/util/BufferUtils.java deleted file mode 100644 index 644a7654..00000000 --- a/src/main/java/pw/knx/feather/util/BufferUtils.java +++ /dev/null @@ -1,67 +0,0 @@ -package pw.knx.feather.util; - -import org.lwjgl.opengl.GL15; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; - -/** - * A utility class currently used to generate, bind, and manage buffers. - *

- * This particular interface-with-inner-class structure is - * implemented as a new form of Singleton model well-suited - * for classes holding utility methods, as it allows a - * developer to simply implement the interface to access the - * methods within via the Singleton object, while also making - * it easily apparent which classes require a given range of - * utilities by it's *implements* clause. - * - * @author KNOXDEV - * @since 8/9/2016 01:34 - */ -public interface BufferUtils { - - /** - * The static Singleton Object containing Buffer Utilities - */ - BufferUtil buff = new BufferUtil(); - - /** - * The Singleton inner-class which contains the utility methods - */ - class BufferUtil { - - /** - * This line exists solely to prevent additional instantiation - */ - private BufferUtil() { - } - - /** - * A ByteOrder object containing the native order of the platform - */ - private final ByteOrder nativeOrder = ByteOrder.nativeOrder(); - - /** - * @param capacity The size of the Buffer to be allocated in Bytes - * @return The ByteBuffer object allocated to the specified capacity - */ - public synchronized ByteBuffer createDirectBuffer(int capacity) { - return ByteBuffer.allocateDirect(capacity).order(nativeOrder); - } - - /** - * @param id The OpenGL ID of the buffer object to be bound - */ - public void bindBuffer(int id) { - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, id); - } - - /** - * @return true if the native order of the platform is Big Endian (Most significant first) - */ - public boolean isBigEndian() { - return nativeOrder == ByteOrder.BIG_ENDIAN; - } - } -} \ No newline at end of file diff --git a/src/main/java/pw/knx/feather/util/TextureUtils.java b/src/main/java/pw/knx/feather/util/TextureUtils.java deleted file mode 100644 index 269e778c..00000000 --- a/src/main/java/pw/knx/feather/util/TextureUtils.java +++ /dev/null @@ -1,101 +0,0 @@ -package pw.knx.feather.util; - -import pw.knx.feather.texture.BasicTexture; -import pw.knx.feather.texture.base.Texture; - -/** - * A utility class currently only used to generate Basic textures. - *

- * This particular interface-with-inner-class structure is - * implemented as a new form of Singleton model well-suited - * for classes holding utility methods, as it allows a - * developer to simply implement the interface to access the - * methods within via the Singleton object, while also making - * it easily apparent which classes require a given range of - * utilities by it's *implements* clause. - * - * @author KNOXDEV - * @since 8/9/2016 00:53 - */ -public interface TextureUtils { - /** - * The static Singleton Object containing TextureUtils - */ - TextureUtil tex = new TextureUtil(); - - /** - * The Singleton inner-class which contains the utility methods - */ - class TextureUtil { - - /** - * This line exists solely to prevent additional instantiation - */ - private TextureUtil() { - } - - /** - * @return a freshly instantiated BasicTexture object - */ - public Texture createTexture() { - return new BasicTexture(); - } - - /** - * @param u The x coordinate of the top-left texture point, on a float scale from 0 to 1.0 - * @param v The y coordinate of the top-left texture point, on a float scale from 0 to 1.0 - * @param u1 The x coordinate of the bottom-right texture point, on a float scale from 0 to 1.0 - * @param v1 The y coordinate of the bottom-right texture point, on a float scale from 0 to 1.0 - * @param width The width of the texture rendering in pixels - * @param height The height of the texture rendering in pixels - * @return a freshly instantiated BasicTexture object with the parameters provided - */ - public Texture createTexture(float u, float v, float u1, float v1, float width, float height) { - final Texture texture = this.createTexture(); - texture.setU(u); - texture.setV(v); - texture.setU1(u1); - texture.setV1(v1); - texture.setWidth(width); - texture.setHeight(height); - return texture; - } - - /** - * Like above, creates a new BasicTexture object with the parameters provided. - * The difference is that it allows you to pass pixel-based U&V rather than 0-1 floats. - * In exchange for automatically calculating U, V, U1, and V1, the method requires the texture - * resource's original dimensions. (64, 256, etc.) - * - * @param u Starting x coordinate of section of the origin resource to be rendered in pixels. - * @param v Starting y coordinate of section of the origin resource to be rendered in pixels. - * @param width The width of section of the origin resource to be rendered in pixels. - * @param height The height of section of the origin resource to be rendered in pixels. - * @param dimensions The origin texture resource's original dimensions. (64, 256, etc.) - * @return a freshly instantiated BasicTexture object with the parameters provided - */ - public Texture createTexture(float u, float v, float width, float height, float dimensions) { - return this.createTexture(u / dimensions, v / dimensions, (u + width) / dimensions, (v + height) / dimensions, width, height); - } - - /** - * Like above, creates a new BasicTexture object with the parameters provided. - * The difference is that it allows you to pass pixel-based U&V rather than 0-1 floats. - * In exchange for automatically calculating U, V, U1, and V1, the method requires the texture - * resource's original dimensions. (64, 256, etc.) - * - * @param id The OpenGL Texture ID you wish to create a Texture for. - * @param u Starting x coordinate of section of the origin resource to be rendered in pixels. - * @param v Starting y coordinate of section of the origin resource to be rendered in pixels. - * @param width The width of section of the origin resource to be rendered in pixels. - * @param height The height of section of the origin resource to be rendered in pixels. - * @param dimensions The origin texture resource's original dimensions. (64, 256, etc.) - * @return a freshly instantiated BasicTexture object with the parameters provided - */ - public Texture createTexture(int id, float u, float v, float width, float height, float dimensions) { - final Texture texture = this.createTexture(u, v, width, height, dimensions); - texture.setID(id); - return texture; - } - } -} \ No newline at end of file From c9f76bf5f1807cf718400b8e8988607767c4fcea Mon Sep 17 00:00:00 2001 From: Brady Date: Thu, 27 Jul 2017 17:51:46 -0500 Subject: [PATCH 09/26] Update README.md --- README.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 848e0fd4..f3acff06 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # ClientAPI -ClientAPI is a modding API just like Forge, Sponge and Liteloader, it is designed to provide a shared base for large client-rewrite style mods. +ClientAPI is a modding API/Framework just like Forge, Sponge and Liteloader, it is designed to provide a shared base for large client-rewrite style mods. -Like other modding APIs it is a tweaker and has the potential to be stacked with other tweakers, so long as they do not both overwrite the same methods. +Like other modding APIs it is a tweaker and has the potential to be stacked with other tweakers, so long as they do not both entirely overwrite the same methods. Unlike most other modding APIs it is designed to be used by a single "client" mod. It is this "client" that is installed, not the ClientAPI, so the "client" mod has full control over all modifications to the vanilla code, unless of course the installation is stacked on top of other modding APIs. @@ -12,21 +12,18 @@ Unlike most other modding APIs it is designed to be used by a single "client" mo ## Credits | Name | Contribution | |---------------------|----------------------| -| Halalaboos | CFont | -| MatthewH & MarcoMC | CapesAPI Integration | | Nerxit | Tab GUI System | ## Development Kit -To use the Client API, you must download [Development Kit](https://github.com/ZeroMemes/ClientAPI-CDK). Instructions on how to set it up will be posted in the README. +To use the Client API, you must download [Development Kit](https://github.com/ZeroMemes/ClientAPI-CDK). Instructions on how to set it up are posted in the README. ## Concept - -* Clients will install into `.minecraft/versions` +* Clients will install into `.minecraft/versions` and `.minecraft/libraries` if they are published to a maven repo * An installer could be used to configure stacking on top of other tweakers (e.g. Forge) * If an installer is used, it could also add a profile to the launcher * The client will inherit from a vanilla minecraft version * This means the client doesn't need to include actual minecraft code -* The client will list ClientAPI as a maven dependancy +* The client will list ClientAPI as a maven dependency * The minecraft launcher will automatically download the ClientAPI lib to the `.minecraft/libraries` folder ## Usage From e384773a82a6faa7c154eb6d8b6f9b38069f21bd Mon Sep 17 00:00:00 2001 From: null Date: Sat, 5 Aug 2017 04:12:16 -0400 Subject: [PATCH 10/26] Change Throws IOException to Exception --- .../java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java b/src/main/java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java index 0effcb5c..e0e9394f 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java +++ b/src/main/java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java @@ -29,7 +29,7 @@ public class MixinNettyPacketEncoder { * @author Brady */ @Overwrite - protected void encode(ChannelHandlerContext ctx, Packet msg, ByteBuf out) throws IOException { + protected void encode(ChannelHandlerContext ctx, Packet msg, ByteBuf out) throws Exception { EnumConnectionState state = ctx.channel().attr(NetworkManager.PROTOCOL_ATTRIBUTE_KEY).get(); Integer packetId = state.getPacketId(this.direction, msg); From 72fe8f101186bed4560b6477b5fe26460384e5a6 Mon Sep 17 00:00:00 2001 From: w-o-a-h Date: Sat, 5 Aug 2017 04:41:27 -0400 Subject: [PATCH 11/26] Fix for Singleplayer Crashing --- build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index 52e78d71..2d55e67e 100644 --- a/build.gradle +++ b/build.gradle @@ -57,6 +57,9 @@ dependencies { compile 'net.jodah:typetools:0.5.0' compile('org.spongepowered:mixin:0.6.10-SNAPSHOT') { exclude module: 'launchwrapper' + exclude module: 'guava' + exclude module: 'gson' + exclude module: 'commons-io' } } From e72d8ce5ac1a387e9a68d4cfcf83a2dcd79e46b9 Mon Sep 17 00:00:00 2001 From: LeafHacker Date: Sun, 6 Aug 2017 01:24:11 +0100 Subject: [PATCH 12/26] Update example code to fadefd6 --- src/test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test b/src/test index 80eff033..fadefd65 160000 --- a/src/test +++ b/src/test @@ -1 +1 @@ -Subproject commit 80eff03351e4891a0e73c942b10ef8421436f1ec +Subproject commit fadefd65ec58fc412514b7ab841186219fd64bb9 From 8fc3d97fcd31e2c3f35a673027918f7098f9a729 Mon Sep 17 00:00:00 2001 From: LeafHacker Date: Sun, 6 Aug 2017 02:06:15 +0100 Subject: [PATCH 13/26] Update to 1.12.1 --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 2d55e67e..83309213 100644 --- a/build.gradle +++ b/build.gradle @@ -30,10 +30,10 @@ compileJava { } minecraft { - version = '1.12' + version = '1.12.1' runDir = 'run' tweakClass = 'me.zero.client.load.ClientTweaker' - mappings = 'snapshot_20170628' + mappings = 'snapshot_20170805' makeObfSourceJar = false } From e5692c32814503e5105254a296a9cda8727611c7 Mon Sep 17 00:00:00 2001 From: Brady Date: Sat, 5 Aug 2017 21:46:08 -0500 Subject: [PATCH 14/26] Added fix for Optifine support. Optifine and ClientAPI pass duplicate launch arguments, causing a crash. This fixes the issue so that duplicate arguments may not be passed. --- src/main/java/me/zero/client/load/ClientTweaker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/zero/client/load/ClientTweaker.java b/src/main/java/me/zero/client/load/ClientTweaker.java index 7aae41c9..733254be 100644 --- a/src/main/java/me/zero/client/load/ClientTweaker.java +++ b/src/main/java/me/zero/client/load/ClientTweaker.java @@ -85,7 +85,7 @@ private void addArg(String label, File file) { } private void addArg(String label, String value) { - if (value != null) { + if (!args.contains("--" + label) && value != null) { this.args.add("--" + label); this.args.add(value); } From 740d713cfd34eee7a523849a64cfc88ffdae4fa0 Mon Sep 17 00:00:00 2001 From: Brady Date: Mon, 7 Aug 2017 15:09:25 -0500 Subject: [PATCH 15/26] Minor Shader/ShaderProgram and GLObject changes --- .../me/zero/client/api/util/render/gl/GLObject.java | 2 +- .../client/api/util/render/gl/ShaderProgram.java | 12 ++++++++++-- .../render/gl/shader/adapter/ARBShaderAdapter.java | 4 ++-- .../render/gl/shader/adapter/GL20ShaderAdapter.java | 4 ++-- .../util/render/gl/shader/adapter/ShaderAdapter.java | 4 ++-- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/main/java/me/zero/client/api/util/render/gl/GLObject.java b/src/main/java/me/zero/client/api/util/render/gl/GLObject.java index 3646a37c..4f45258a 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/GLObject.java +++ b/src/main/java/me/zero/client/api/util/render/gl/GLObject.java @@ -54,7 +54,7 @@ public final boolean gen() { * * @return Whether or not the operation was a success */ - public final boolean delete() { + public boolean delete() { if (!isGen()) return false; diff --git a/src/main/java/me/zero/client/api/util/render/gl/ShaderProgram.java b/src/main/java/me/zero/client/api/util/render/gl/ShaderProgram.java index d3fcaefa..81cb1a2d 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/ShaderProgram.java +++ b/src/main/java/me/zero/client/api/util/render/gl/ShaderProgram.java @@ -52,7 +52,7 @@ public final class ShaderProgram extends GLObject { @Override protected final int nativeGen() { int id = adapter.createProgram(); - shaders.forEach(shader -> adapter.attachObject(id, shader.id())); + shaders.forEach(shader -> adapter.attachShader(id, shader.id())); try { adapter.linkProgram(id); @@ -67,10 +67,18 @@ protected final int nativeGen() { return id; } + @Override + public boolean delete() { + shaders.forEach(shader -> { + adapter.detachShader(this.id(), shader.id()); + shader.delete(); + }); + return super.delete(); + } + @Override protected final void nativeDelete() { adapter.deleteProgram(id()); - shaders.forEach(GLObject::delete); } /** diff --git a/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ARBShaderAdapter.java b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ARBShaderAdapter.java index cf547b12..17e566f7 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ARBShaderAdapter.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ARBShaderAdapter.java @@ -78,12 +78,12 @@ public void compileShader(int shader) { } @Override - public void attachObject(int program, int shader) { + public void attachShader(int program, int shader) { glAttachObjectARB(program, shader); } @Override - public void detachObject(int program, int shader) { + public void detachShader(int program, int shader) { glDetachObjectARB(program, shader); } diff --git a/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/GL20ShaderAdapter.java b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/GL20ShaderAdapter.java index bf05b3fd..207dfd4d 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/GL20ShaderAdapter.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/GL20ShaderAdapter.java @@ -76,12 +76,12 @@ public void compileShader(int shader) { } @Override - public void attachObject(int program, int shader) { + public void attachShader(int program, int shader) { glAttachShader(program, shader); } @Override - public void detachObject(int program, int shader) { + public void detachShader(int program, int shader) { glDetachShader(program, shader); } diff --git a/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapter.java b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapter.java index 2fe65dd5..0d9d6498 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapter.java +++ b/src/main/java/me/zero/client/api/util/render/gl/shader/adapter/ShaderAdapter.java @@ -82,7 +82,7 @@ public interface ShaderAdapter { * @param program The shader program id * @param shader The shader object id */ - void attachObject(int program, int shader); + void attachShader(int program, int shader); /** * Detaches a shader object from a shader program @@ -90,7 +90,7 @@ public interface ShaderAdapter { * @param program The shader program id * @param shader The shader object id */ - void detachObject(int program, int shader); + void detachShader(int program, int shader); /** * Prepares the specified shader program for usage From 515989eeee4777eafdd3785eb420fbfe1a5d0be4 Mon Sep 17 00:00:00 2001 From: Brady Date: Mon, 7 Aug 2017 15:10:43 -0500 Subject: [PATCH 16/26] Fixed Rectangle methods --- .../client/api/util/render/RenderUtils.java | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/main/java/me/zero/client/api/util/render/RenderUtils.java b/src/main/java/me/zero/client/api/util/render/RenderUtils.java index e28c5a73..bca651b5 100644 --- a/src/main/java/me/zero/client/api/util/render/RenderUtils.java +++ b/src/main/java/me/zero/client/api/util/render/RenderUtils.java @@ -200,6 +200,18 @@ public static void drawReflectedTexturedRect(float x1, float y1, float x2, float public static void rectangle(float x1, float y1, float x2, float y2, int color) { GlUtils.glColor(color); + if (x1 > x2) { + float temp = x1; + x1 = x2; + x2 = temp; + } + + if (y1 > y2) { + float temp = y1; + y1 = y2; + y2 = temp; + } + setupRender(true); setupClientState(GLClientState.VERTEX, true); tessellator.addVertex(x1, y2, 0).addVertex(x2, y2, 0).addVertex(x2, y1, 0).addVertex(x1, y1, 0).draw(GL_QUADS); @@ -235,10 +247,10 @@ private static void rectangleGradient(float x1, float y1, float x2, float y2, in if (color.length == 1) { c1 = color[0]; - c2 = color[1]; - c3 = color[2]; - c4 = color[3]; - } else if (color.length > 1 && color.length < 4) { + c2 = color[0]; + c3 = color[0]; + c4 = color[0]; + } else if (color.length < 4) { c1 = color[0]; c2 = color[0]; c3 = color[1]; @@ -250,6 +262,18 @@ private static void rectangleGradient(float x1, float y1, float x2, float y2, in c4 = color[3]; } + if (x1 > x2) { + float temp = x1; + x1 = x2; + x2 = temp; + } + + if (y1 > y2) { + float temp = y1; + y1 = y2; + y2 = temp; + } + setupRender(true); OpenGlHelper.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 1, 0); GlStateManager.shadeModel(GL_FLAT); From 3a1f1fc114926373bfdac5bdf2677c43091380a4 Mon Sep 17 00:00:00 2001 From: LeafHacker Date: Thu, 10 Aug 2017 06:40:25 +0100 Subject: [PATCH 17/26] Hook KeyEvent into Minecraft's runKeyboardTick() Instead of creating our own loop and keeping track of which keys were pressed, we should instead hook into Minecraft's existing Keyboard.next() loop (runKeyboardTick()). This both simplifies our code and allows KeyEvents to take advantage of Keyboard's event methods (e.g. getEventKeyCharacter()). --- .../api/event/handle/ClientHandler.java | 46 +++++-------------- .../client/load/mixin/MixinMinecraft.java | 21 +++++++-- 2 files changed, 29 insertions(+), 38 deletions(-) diff --git a/src/main/java/me/zero/client/api/event/handle/ClientHandler.java b/src/main/java/me/zero/client/api/event/handle/ClientHandler.java index 3e45d923..82f00021 100644 --- a/src/main/java/me/zero/client/api/event/handle/ClientHandler.java +++ b/src/main/java/me/zero/client/api/event/handle/ClientHandler.java @@ -25,7 +25,6 @@ import me.zero.client.api.event.defaults.game.network.PacketEvent; import me.zero.client.api.event.defaults.game.core.KeyEvent; import me.zero.client.api.event.defaults.game.core.ProfilerEvent; -import me.zero.client.api.event.defaults.game.core.TickEvent; import me.zero.client.api.event.defaults.game.render.Render3DEvent; import me.zero.client.api.event.defaults.game.render.RenderHudEvent; import me.zero.client.api.util.interfaces.Helper; @@ -34,12 +33,9 @@ import me.zero.client.api.util.render.camera.CameraManager; import net.minecraft.network.play.client.CPacketChatMessage; import net.minecraft.network.play.server.SPacketChat; -import org.lwjgl.input.Keyboard; import java.util.stream.Stream; -import static org.lwjgl.input.Keyboard.KEYBOARD_SIZE; - /** * Some basic events that the client uses * @@ -48,11 +44,6 @@ */ public final class ClientHandler implements Helper { - /** - * A map of all key states - */ - private final boolean[] keyMap = new boolean[KEYBOARD_SIZE]; - /** * Handles camera updates */ @@ -64,8 +55,18 @@ public final class ClientHandler implements Helper { * Handles keybinds */ @EventHandler - private final Listener keyListener = new Listener<>(event -> - Keybind.getKeybinds().stream().filter(keybind -> keybind.getType() == Keybind.Type.TOGGLE && keybind.getKey() == event.getKey()).forEach(Keybind::onClick)); + private final Listener keyListener = new Listener<>(event -> { + // Get all matching keybinds + Stream keybinds = Keybind.getKeybinds().stream() + .filter(bind -> bind.getKey() == event.getKey()); + + // Run onClick for the toggle keybinds + keybinds.filter(bind -> bind.getType() == Keybind.Type.TOGGLE) + .forEach(Keybind::onClick); + + // Run onPres for all matching keybinds + keybinds.forEach(Keybind::onPress); + }); /** * Handles profiling events @@ -78,29 +79,6 @@ public final class ClientHandler implements Helper { ClientAPI.EVENT_BUS.post(new Render3DEvent()); }); - /** - * Handles key states - */ - @EventHandler - private final Listener tickListener = new Listener<>(event -> { - if (mc.currentScreen != null) return; - - for (int i = 1; i < KEYBOARD_SIZE; i++) { - final int key = i; - boolean currentState = Keyboard.isKeyDown(i); - if (currentState != keyMap[i]) { - if (keyMap[i] = !keyMap[i]) - ClientAPI.EVENT_BUS.post(new KeyEvent(i)); - - Stream keybinds = Keybind.getKeybinds().stream().filter(keybind -> keybind.getKey() == key); - if (currentState) - keybinds.forEach(Keybind::onPress); - else - keybinds.forEach(Keybind::onRelease); - } - } - }); - /** * Handles packet out-flow */ diff --git a/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java b/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java index 3c102729..6329f671 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java +++ b/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java @@ -20,13 +20,11 @@ import me.zero.client.api.Client; import me.zero.client.api.ClientInfo; import me.zero.client.api.ClientAPI; -import me.zero.client.api.event.defaults.game.core.ClickEvent; -import me.zero.client.api.event.defaults.game.core.GameShutdownEvent; -import me.zero.client.api.event.defaults.game.core.LoopEvent; -import me.zero.client.api.event.defaults.game.core.TickEvent; +import me.zero.client.api.event.defaults.game.core.*; import me.zero.client.api.event.defaults.game.render.GuiEvent; import me.zero.client.api.event.defaults.game.world.WorldEvent; import me.zero.client.api.event.handle.ClientHandler; +import me.zero.client.api.util.keybind.Keybind; import me.zero.client.api.util.render.gl.GlUtils; import me.zero.client.load.ClientInitException; import me.zero.client.load.mixin.wrapper.IMinecraft; @@ -35,6 +33,7 @@ import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.util.Session; import net.minecraft.util.Timer; +import org.lwjgl.input.Keyboard; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.gen.Accessor; @@ -86,6 +85,20 @@ public void onLoop(CallbackInfo ci) { ClientAPI.EVENT_BUS.post(new LoopEvent()); } + @Inject(method = "runTickKeyboard", at = @At(value = "INVOKE_ASSIGN", target = "org/lwjgl/input/Keyboard.getEventKeyState()Z", remap = false)) + public void onKeyEvent(CallbackInfo ci) { + boolean down = Keyboard.getEventKeyState(); + int key = Keyboard.getEventKey(); + + if (down) + ClientAPI.EVENT_BUS.post(new KeyEvent(key)); + else + // TODO: split into new KeyUp event + Keybind.getKeybinds().stream() + .filter(bind -> bind.getKey() == key) + .forEach(Keybind::onRelease); + } + @Inject(method = "init", at = @At("RETURN")) public void init(CallbackInfo ci) { // Try and find the "client.json" config From f848425195633a14f1d82cccfdb1e0b79352ddcd Mon Sep 17 00:00:00 2001 From: LeafHacker Date: Thu, 10 Aug 2017 07:51:05 +0100 Subject: [PATCH 18/26] Add KeyUpEvent Add an event for when a key is released, allowing us to move keybind onRelease triggering back to ClientHandler. --- .../event/defaults/game/core/KeyUpEvent.java | 46 +++++++++++++++++++ .../api/event/handle/ClientHandler.java | 9 +++- .../client/load/mixin/MixinMinecraft.java | 9 +--- 3 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 src/main/java/me/zero/client/api/event/defaults/game/core/KeyUpEvent.java diff --git a/src/main/java/me/zero/client/api/event/defaults/game/core/KeyUpEvent.java b/src/main/java/me/zero/client/api/event/defaults/game/core/KeyUpEvent.java new file mode 100644 index 00000000..a81fa55f --- /dev/null +++ b/src/main/java/me/zero/client/api/event/defaults/game/core/KeyUpEvent.java @@ -0,0 +1,46 @@ +/* + * Copyright 2017 ZeroMemes + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.zero.client.api.event.defaults.game.core; + +/** + * Event called when a Key is released outside of a GUI while in-game + * + * @see ClickEvent + * + * @author Leaf + * @since 2.1 + */ +public final class KeyUpEvent { + + private final int key; + + /** + * Creates a new instance of KeyUpEvent. + * + * @param key - The key code for the key that was released + */ + public KeyUpEvent(int key) { + this.key = key; + } + + /** + * @return The key code that corresponds to the released key + */ + public final int getKey() { + return this.key; + } +} diff --git a/src/main/java/me/zero/client/api/event/handle/ClientHandler.java b/src/main/java/me/zero/client/api/event/handle/ClientHandler.java index 82f00021..0614f061 100644 --- a/src/main/java/me/zero/client/api/event/handle/ClientHandler.java +++ b/src/main/java/me/zero/client/api/event/handle/ClientHandler.java @@ -21,10 +21,9 @@ import me.zero.alpine.listener.Listener; import me.zero.client.api.event.defaults.filters.PacketFilter; import me.zero.alpine.type.EventPriority; +import me.zero.client.api.event.defaults.game.core.*; import me.zero.client.api.event.defaults.game.misc.ChatEvent; import me.zero.client.api.event.defaults.game.network.PacketEvent; -import me.zero.client.api.event.defaults.game.core.KeyEvent; -import me.zero.client.api.event.defaults.game.core.ProfilerEvent; import me.zero.client.api.event.defaults.game.render.Render3DEvent; import me.zero.client.api.event.defaults.game.render.RenderHudEvent; import me.zero.client.api.util.interfaces.Helper; @@ -68,6 +67,12 @@ public final class ClientHandler implements Helper { keybinds.forEach(Keybind::onPress); }); + @EventHandler + private final Listener keyUpListener = new Listener<>(event -> + Keybind.getKeybinds().stream() + .filter(bind -> bind.getKey() == event.getKey()) + .forEach(Keybind::onRelease)); + /** * Handles profiling events */ diff --git a/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java b/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java index 6329f671..d9042166 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java +++ b/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java @@ -24,7 +24,6 @@ import me.zero.client.api.event.defaults.game.render.GuiEvent; import me.zero.client.api.event.defaults.game.world.WorldEvent; import me.zero.client.api.event.handle.ClientHandler; -import me.zero.client.api.util.keybind.Keybind; import me.zero.client.api.util.render.gl.GlUtils; import me.zero.client.load.ClientInitException; import me.zero.client.load.mixin.wrapper.IMinecraft; @@ -90,13 +89,7 @@ public void onKeyEvent(CallbackInfo ci) { boolean down = Keyboard.getEventKeyState(); int key = Keyboard.getEventKey(); - if (down) - ClientAPI.EVENT_BUS.post(new KeyEvent(key)); - else - // TODO: split into new KeyUp event - Keybind.getKeybinds().stream() - .filter(bind -> bind.getKey() == key) - .forEach(Keybind::onRelease); + ClientAPI.EVENT_BUS.post(down ? new KeyEvent(key) : new KeyUpEvent(key)); } @Inject(method = "init", at = @At("RETURN")) From 600ed9ae9de02537aff1b7ee934bdd2d9bb05c35 Mon Sep 17 00:00:00 2001 From: Brady Date: Thu, 10 Aug 2017 11:45:50 -0500 Subject: [PATCH 19/26] Added additional check for KeyEvent The event should only be invoked when the user is not in a gui screen --- src/main/java/me/zero/client/load/mixin/MixinMinecraft.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java b/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java index d9042166..056bacdf 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java +++ b/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java @@ -55,6 +55,8 @@ @Mixin(Minecraft.class) public abstract class MixinMinecraft implements IMinecraft { + @Shadow public GuiScreen currentScreen; + @Accessor @Override public abstract Timer getTimer(); @Accessor @Override public abstract void setSession(Session session); @Accessor @Override public abstract void setRightClickDelayTimer(int delay); @@ -86,6 +88,9 @@ public void onLoop(CallbackInfo ci) { @Inject(method = "runTickKeyboard", at = @At(value = "INVOKE_ASSIGN", target = "org/lwjgl/input/Keyboard.getEventKeyState()Z", remap = false)) public void onKeyEvent(CallbackInfo ci) { + if (currentScreen != null) + return; + boolean down = Keyboard.getEventKeyState(); int key = Keyboard.getEventKey(); From 12addaa03e662a3b54b3e3936f47df839218ba99 Mon Sep 17 00:00:00 2001 From: Brady Date: Thu, 10 Aug 2017 11:58:49 -0500 Subject: [PATCH 20/26] Better formatted Mixins Changed access modifiers of Mixin methods to be less permissive. --- .../me/zero/client/load/mixin/MixinBlock.java | 2 +- .../zero/client/load/mixin/MixinEntity.java | 2 +- .../load/mixin/MixinEntityLivingBase.java | 2 +- .../load/mixin/MixinEntityPlayerSP.java | 8 ++++---- .../load/mixin/MixinEntityRenderer.java | 4 ++-- .../client/load/mixin/MixinFontRenderer.java | 4 ++-- .../client/load/mixin/MixinGuiIngame.java | 2 +- .../client/load/mixin/MixinItemRenderer.java | 2 +- .../client/load/mixin/MixinMinecraft.java | 20 +++++++++---------- .../load/mixin/MixinNetworkManager.java | 6 +++--- .../zero/client/load/mixin/MixinProfiler.java | 2 +- .../zero/client/load/mixin/MixinRender.java | 4 ++-- .../client/load/mixin/MixinRenderItem.java | 2 +- .../load/mixin/MixinRenderLivingBase.java | 2 +- .../client/load/mixin/MixinRenderManager.java | 2 +- 15 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/main/java/me/zero/client/load/mixin/MixinBlock.java b/src/main/java/me/zero/client/load/mixin/MixinBlock.java index 9cacfcc5..212a2e21 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinBlock.java +++ b/src/main/java/me/zero/client/load/mixin/MixinBlock.java @@ -45,7 +45,7 @@ public abstract class MixinBlock { @Shadow protected static void addCollisionBoxToList(BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable AxisAlignedBB blockBox) {} @Inject(method = "canCollideCheck", at = @At("HEAD"), cancellable = true) - public void canCollideCheck(IBlockState state, boolean hitIfLiquid, CallbackInfoReturnable ci) { + private void canCollideCheck(IBlockState state, boolean hitIfLiquid, CallbackInfoReturnable ci) { BlockCollisionEvent event = new BlockCollisionEvent((Block) (Object) this); ClientAPI.EVENT_BUS.post(event); if (event.isCancelled()) diff --git a/src/main/java/me/zero/client/load/mixin/MixinEntity.java b/src/main/java/me/zero/client/load/mixin/MixinEntity.java index b7347670..356a90ee 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinEntity.java +++ b/src/main/java/me/zero/client/load/mixin/MixinEntity.java @@ -64,7 +64,7 @@ public abstract class MixinEntity implements IEntity { private Vec2 rotation, prevRotation; @Inject(method = "applyEntityCollision", at = @At("HEAD"), cancellable = true) - public void applyEntityCollision(Entity entityIn, CallbackInfo ci) { + private void applyEntityCollision(Entity entityIn, CallbackInfo ci) { EntityCollisionEvent event = new EntityCollisionEvent((Entity) (Object) this, entityIn); ClientAPI.EVENT_BUS.post(event); if (event.isCancelled()) diff --git a/src/main/java/me/zero/client/load/mixin/MixinEntityLivingBase.java b/src/main/java/me/zero/client/load/mixin/MixinEntityLivingBase.java index 3e604e51..c7467439 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinEntityLivingBase.java +++ b/src/main/java/me/zero/client/load/mixin/MixinEntityLivingBase.java @@ -33,7 +33,7 @@ public class MixinEntityLivingBase { @Inject(method = "onDeath", at = @At("HEAD")) - public void onDeath(DamageSource cause, CallbackInfo ci) { + private void onDeath(DamageSource cause, CallbackInfo ci) { ClientAPI.EVENT_BUS.post(new EntityDeathEvent((EntityLivingBase) (Object) this, cause)); } } diff --git a/src/main/java/me/zero/client/load/mixin/MixinEntityPlayerSP.java b/src/main/java/me/zero/client/load/mixin/MixinEntityPlayerSP.java index 5cb56d5a..3c1c040e 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinEntityPlayerSP.java +++ b/src/main/java/me/zero/client/load/mixin/MixinEntityPlayerSP.java @@ -62,22 +62,22 @@ public abstract class MixinEntityPlayerSP extends MixinEntity { @Shadow protected abstract boolean isCurrentViewEntity(); @Inject(method = "onUpdate", at = @At("HEAD")) - public void onUpdate(CallbackInfo ci) { + private void onUpdate(CallbackInfo ci) { ClientAPI.EVENT_BUS.post(new UpdateEvent()); } @Inject(method = "onLivingUpdate", at = @At("HEAD")) - public void onLivingUpdatePre(CallbackInfo ci) { + private void onLivingUpdatePre(CallbackInfo ci) { ClientAPI.EVENT_BUS.post(new LivingUpdateEvent(EventState.PRE)); } @Inject(method = "onLivingUpdate", at = @At("RETURN")) - public void onLivingUpdatePost(CallbackInfo ci) { + private void onLivingUpdatePost(CallbackInfo ci) { ClientAPI.EVENT_BUS.post(new LivingUpdateEvent(EventState.POST)); } @Redirect(method = "move", at = @At(value = "INVOKE", target = "net/minecraft/client/entity/AbstractClientPlayer.move(Lnet/minecraft/entity/MoverType;DDD)V")) - public void move(AbstractClientPlayer player, MoverType type, double x, double y, double z) { + private void move(AbstractClientPlayer player, MoverType type, double x, double y, double z) { MoveEvent event = new MoveEvent(type, x, y, z); ClientAPI.EVENT_BUS.post(event); if (event.isCancelled()) diff --git a/src/main/java/me/zero/client/load/mixin/MixinEntityRenderer.java b/src/main/java/me/zero/client/load/mixin/MixinEntityRenderer.java index b4fbbd81..376af28e 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinEntityRenderer.java +++ b/src/main/java/me/zero/client/load/mixin/MixinEntityRenderer.java @@ -34,13 +34,13 @@ public class MixinEntityRenderer { @Inject(method = "getFOVModifier", at = @At("HEAD"), cancellable = true) - public void getFOVModifier(float partialTicks, boolean useFOVSetting, CallbackInfoReturnable ci) { + private void getFOVModifier(float partialTicks, boolean useFOVSetting, CallbackInfoReturnable ci) { if (Camera.isCapturing()) ci.setReturnValue(90.0F); } @Inject(method = "updateCameraAndRender", at = @At(value = "INVOKE", target = "net/minecraft/profiler/Profiler.endStartSection(Ljava/lang/String;)V")) - public void updateCameraAndRender(float partialTicks, long nanoTime, CallbackInfo ci) { + private void updateCameraAndRender(float partialTicks, long nanoTime, CallbackInfo ci) { ClientAPI.EVENT_BUS.post(new RenderScreenEvent(partialTicks)); } } diff --git a/src/main/java/me/zero/client/load/mixin/MixinFontRenderer.java b/src/main/java/me/zero/client/load/mixin/MixinFontRenderer.java index ad25a2f9..1f5edd33 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinFontRenderer.java +++ b/src/main/java/me/zero/client/load/mixin/MixinFontRenderer.java @@ -31,14 +31,14 @@ public abstract class MixinFontRenderer { @ModifyVariable(method = "renderStringAtPos", at = @At("HEAD")) - public String renderStringAtPos(String text) { + private String renderStringAtPos(String text) { TextEvent event = new TextEvent(text); ClientAPI.EVENT_BUS.post(event); return event.getText(); } @ModifyVariable(method = "getStringWidth", at = @At("HEAD")) - public String getStringWidth(String text) { + private String getStringWidth(String text) { TextEvent event = new TextEvent(text); ClientAPI.EVENT_BUS.post(event); return event.getText(); diff --git a/src/main/java/me/zero/client/load/mixin/MixinGuiIngame.java b/src/main/java/me/zero/client/load/mixin/MixinGuiIngame.java index 009ab1f8..954caaca 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinGuiIngame.java +++ b/src/main/java/me/zero/client/load/mixin/MixinGuiIngame.java @@ -32,7 +32,7 @@ public class MixinGuiIngame { @Inject(method = "renderGameOverlay", at = @At("RETURN")) - public void renderGameOverlay(float partialTicks, CallbackInfo ci) { + private void renderGameOverlay(float partialTicks, CallbackInfo ci) { ClientAPI.EVENT_BUS.post(new RenderHudEvent(partialTicks)); } } diff --git a/src/main/java/me/zero/client/load/mixin/MixinItemRenderer.java b/src/main/java/me/zero/client/load/mixin/MixinItemRenderer.java index 2498123d..402bfecf 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinItemRenderer.java +++ b/src/main/java/me/zero/client/load/mixin/MixinItemRenderer.java @@ -35,7 +35,7 @@ public abstract class MixinItemRenderer { @Inject(method = "renderItemInFirstPerson(Lnet/minecraft/client/entity/AbstractClientPlayer;FFLnet/minecraft/util/EnumHand;FLnet/minecraft/item/ItemStack;F)V", at = @At("HEAD"), cancellable = true) - public void renderItemInFirstPerson(AbstractClientPlayer p_187457_1_, float p_187457_2_, float p_187457_3_, EnumHand p_187457_4_, float p_187457_5_, ItemStack p_187457_6_, float p_187457_7_, CallbackInfo ci) { + private void renderItemInFirstPerson(AbstractClientPlayer p_187457_1_, float p_187457_2_, float p_187457_3_, EnumHand p_187457_4_, float p_187457_5_, ItemStack p_187457_6_, float p_187457_7_, CallbackInfo ci) { ItemRenderEvent event = new ItemRenderEvent((ItemRenderer) (Object) this, p_187457_2_, p_187457_4_, p_187457_5_, p_187457_6_, p_187457_7_); ClientAPI.EVENT_BUS.post(event); if (event.isCancelled()) diff --git a/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java b/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java index 056bacdf..52d4d799 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java +++ b/src/main/java/me/zero/client/load/mixin/MixinMinecraft.java @@ -77,17 +77,17 @@ public void clickMouse(ClickEvent.MouseButton button) { } @Inject(method = "runTick", at = @At("HEAD")) - public void onTick(CallbackInfo ci) { + private void onTick(CallbackInfo ci) { ClientAPI.EVENT_BUS.post(new TickEvent()); } @Inject(method = "runGameLoop", at = @At("HEAD")) - public void onLoop(CallbackInfo ci) { + private void onLoop(CallbackInfo ci) { ClientAPI.EVENT_BUS.post(new LoopEvent()); } @Inject(method = "runTickKeyboard", at = @At(value = "INVOKE_ASSIGN", target = "org/lwjgl/input/Keyboard.getEventKeyState()Z", remap = false)) - public void onKeyEvent(CallbackInfo ci) { + private void onKeyEvent(CallbackInfo ci) { if (currentScreen != null) return; @@ -98,7 +98,7 @@ public void onKeyEvent(CallbackInfo ci) { } @Inject(method = "init", at = @At("RETURN")) - public void init(CallbackInfo ci) { + private void init(CallbackInfo ci) { // Try and find the "client.json" config InputStream stream = this.getClass().getResourceAsStream("/client.json"); @@ -141,29 +141,29 @@ public void init(CallbackInfo ci) { } @Inject(method = "clickMouse", at = @At("HEAD")) - public void clickMouse(CallbackInfo ci) { + private void clickMouse(CallbackInfo ci) { ClientAPI.EVENT_BUS.post(new ClickEvent(LEFT)); } @Inject(method = "rightClickMouse", at = @At("HEAD")) - public void rightClickMouse(CallbackInfo ci) { + private void rightClickMouse(CallbackInfo ci) { ClientAPI.EVENT_BUS.post(new ClickEvent(RIGHT)); } @Inject(method = "middleClickMouse", at = @At("HEAD")) - public void middleClickMouse(CallbackInfo ci) { + private void middleClickMouse(CallbackInfo ci) { ClientAPI.EVENT_BUS.post(new ClickEvent(MIDDLE)); } @ModifyVariable(method = "displayGuiScreen", at = @At("HEAD")) - public GuiScreen displayGuiScreen(GuiScreen screen) { + private GuiScreen displayGuiScreen(GuiScreen screen) { GuiEvent event = new GuiEvent(screen); ClientAPI.EVENT_BUS.post(event); return event.getScreen(); } @Inject(method = "loadWorld(Lnet/minecraft/client/multiplayer/WorldClient;Ljava/lang/String;)V", at = @At("HEAD")) - public void loadWorld(@Nullable WorldClient worldClientIn, String loadingMessage, CallbackInfo ci) { + private void loadWorld(@Nullable WorldClient worldClientIn, String loadingMessage, CallbackInfo ci) { // If the world is null, then it must be unloading if (worldClientIn != null) ClientAPI.EVENT_BUS.post(new WorldEvent.Load(worldClientIn)); @@ -172,7 +172,7 @@ public void loadWorld(@Nullable WorldClient worldClientIn, String loadingMessage } @Inject(method = "shutdown", at = @At("HEAD"), cancellable = true) - public void shutdown(CallbackInfo ci) { + private void shutdown(CallbackInfo ci) { GameShutdownEvent event = new GameShutdownEvent(); ClientAPI.EVENT_BUS.post(event); if (event.isCancelled()) diff --git a/src/main/java/me/zero/client/load/mixin/MixinNetworkManager.java b/src/main/java/me/zero/client/load/mixin/MixinNetworkManager.java index 2993555b..ffee2b9b 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinNetworkManager.java +++ b/src/main/java/me/zero/client/load/mixin/MixinNetworkManager.java @@ -36,11 +36,11 @@ @Mixin(NetworkManager.class) public abstract class MixinNetworkManager { - @Shadow public abstract void dispatchPacket(final Packet inPacket, @Nullable final GenericFutureListener>[] futureListeners); + @Shadow protected abstract void dispatchPacket(final Packet inPacket, @Nullable final GenericFutureListener>[] futureListeners); @Redirect(method = "channelRead0", at = @At(value = "INVOKE", target = "net/minecraft/network/Packet.processPacket(Lnet/minecraft/network/INetHandler;)V")) @SuppressWarnings("unchecked") - public void processPacket(Packet packetIn, INetHandler handler) { + private void processPacket(Packet packetIn, INetHandler handler) { PacketEvent event = new PacketEvent.Receive(packetIn); ClientAPI.EVENT_BUS.post(event); if (event.isCancelled()) @@ -50,7 +50,7 @@ public void processPacket(Packet packetIn, INetHandler handler) { } @Redirect(method = "sendPacket", at = @At(value = "INVOKE", target = "net/minecraft/network/NetworkManager.dispatchPacket(Lnet/minecraft/network/Packet;[Lio/netty/util/concurrent/GenericFutureListener;)V")) - public void sendPacket(NetworkManager networkManager, Packet packetIn, @Nullable final GenericFutureListener>[] futureListeners) { + private void sendPacket(NetworkManager networkManager, Packet packetIn, @Nullable final GenericFutureListener>[] futureListeners) { PacketEvent event = new PacketEvent.Send(packetIn); ClientAPI.EVENT_BUS.post(event); if (event.isCancelled()) diff --git a/src/main/java/me/zero/client/load/mixin/MixinProfiler.java b/src/main/java/me/zero/client/load/mixin/MixinProfiler.java index 0537f0e4..34b7968d 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinProfiler.java +++ b/src/main/java/me/zero/client/load/mixin/MixinProfiler.java @@ -35,7 +35,7 @@ public class MixinProfiler { @Shadow private String profilingSection; @Inject(method = "startSection", at = @At("HEAD")) - public void startSection(String name, CallbackInfo ci) { + private void startSection(String name, CallbackInfo ci) { ClientAPI.EVENT_BUS.post(new ProfilerEvent(profilingSection, name)); } } diff --git a/src/main/java/me/zero/client/load/mixin/MixinRender.java b/src/main/java/me/zero/client/load/mixin/MixinRender.java index fa46bb2f..78ec60ec 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinRender.java +++ b/src/main/java/me/zero/client/load/mixin/MixinRender.java @@ -35,7 +35,7 @@ public class MixinRender { @Inject(method = "getTeamColor", at = @At("HEAD"), cancellable = true) - public void getTeamColor(Entity entityIn, CallbackInfoReturnable ci) { + private void getTeamColor(Entity entityIn, CallbackInfoReturnable ci) { TeamColorEvent event = new TeamColorEvent(entityIn); ClientAPI.EVENT_BUS.post(event); if (event.isCancelled()) @@ -43,7 +43,7 @@ public void getTeamColor(Entity entityIn, CallbackInfoReturnable ci) { } @Inject(method = "renderLivingLabel", at = @At("HEAD"), cancellable = true) - public void renderLivingLabel(Entity entityIn, String str, double x, double y, double z, int maxDistance, CallbackInfo ci) { + private void renderLivingLabel(Entity entityIn, String str, double x, double y, double z, int maxDistance, CallbackInfo ci) { RenderEntityLabelEvent event = new RenderEntityLabelEvent(entityIn, str); ClientAPI.EVENT_BUS.post(event); if (event.isCancelled()) diff --git a/src/main/java/me/zero/client/load/mixin/MixinRenderItem.java b/src/main/java/me/zero/client/load/mixin/MixinRenderItem.java index 50787fcf..ae353375 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinRenderItem.java +++ b/src/main/java/me/zero/client/load/mixin/MixinRenderItem.java @@ -33,7 +33,7 @@ public class MixinRenderItem { @Inject(method = "renderEffect", at = @At("HEAD"), cancellable = true) - public void renderEffect(IBakedModel model, CallbackInfo ci) { + private void renderEffect(IBakedModel model, CallbackInfo ci) { GlintEffectEvent event = new GlintEffectEvent(GlintEffectEvent.GlintTarget.ITEM); ClientAPI.EVENT_BUS.post(event); if (event.isCancelled()) diff --git a/src/main/java/me/zero/client/load/mixin/MixinRenderLivingBase.java b/src/main/java/me/zero/client/load/mixin/MixinRenderLivingBase.java index 3fb91e7e..44613566 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinRenderLivingBase.java +++ b/src/main/java/me/zero/client/load/mixin/MixinRenderLivingBase.java @@ -34,7 +34,7 @@ public class MixinRenderLivingBase { @Redirect(method = "renderLayers", at = @At(value = "INVOKE", target = "net/minecraft/client/renderer/entity/layers/LayerRenderer.doRenderLayer(Lnet/minecraft/entity/EntityLivingBase;FFFFFFF)V")) @SuppressWarnings("unchecked") - public void doRenderLayer(LayerRenderer renderer, EntityLivingBase entitylivingbaseIn, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scaleIn) { + private void doRenderLayer(LayerRenderer renderer, EntityLivingBase entitylivingbaseIn, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scaleIn) { LayerRenderEvent event = new LayerRenderEvent(entitylivingbaseIn, renderer); ClientAPI.EVENT_BUS.post(event); if (!event.isCancelled()) diff --git a/src/main/java/me/zero/client/load/mixin/MixinRenderManager.java b/src/main/java/me/zero/client/load/mixin/MixinRenderManager.java index ff8a78d1..adc7b24a 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinRenderManager.java +++ b/src/main/java/me/zero/client/load/mixin/MixinRenderManager.java @@ -35,7 +35,7 @@ public class MixinRenderManager { @Redirect(method = "doRenderEntity(Lnet/minecraft/entity/Entity;DDDFFZ)V", at = @At(value = "INVOKE", target = "net/minecraft/client/renderer/entity/Render.doRender(Lnet/minecraft/entity/Entity;DDDFF)V")) @SuppressWarnings("unchecked") - public void doRender(Render render, Entity entity, double x, double y, double z, float entityYaw, float partialTicks) { + private void doRender(Render render, Entity entity, double x, double y, double z, float entityYaw, float partialTicks) { EntityRenderEvent event = new EntityRenderEvent(EventState.PRE, render, entity, x, y, z, entityYaw, partialTicks); ClientAPI.EVENT_BUS.post(event); if (!event.isCancelled()) From adbd33ab9c2fe26d01a4a9b6a0ed8d6dc3521bf8 Mon Sep 17 00:00:00 2001 From: Brady Date: Thu, 10 Aug 2017 15:13:34 -0500 Subject: [PATCH 21/26] Improved Gradle Config Game version and mappings are defined in gradle.properties --- build.gradle | 8 ++++---- gradle.properties | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 gradle.properties diff --git a/build.gradle b/build.gradle index 83309213..963d439b 100644 --- a/build.gradle +++ b/build.gradle @@ -30,10 +30,10 @@ compileJava { } minecraft { - version = '1.12.1' - runDir = 'run' + version = project.gameVersion + mappings = project.mappings tweakClass = 'me.zero.client.load.ClientTweaker' - mappings = 'snapshot_20170805' + runDir = 'run' makeObfSourceJar = false } @@ -55,7 +55,7 @@ repositories { dependencies { compile 'com.github.ZeroMemes:Alpine:1.4' compile 'net.jodah:typetools:0.5.0' - compile('org.spongepowered:mixin:0.6.10-SNAPSHOT') { + compile('org.spongepowered:mixin:0.7.1-SNAPSHOT') { exclude module: 'launchwrapper' exclude module: 'guava' exclude module: 'gson' diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..bf7af056 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,18 @@ +# +# Copyright 2017 ZeroMemes +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +gameVersion = 1.12.1 +mappings = snapshot_20170805 \ No newline at end of file From a70f3f6cae57aadd609270e635a15db2f888e057 Mon Sep 17 00:00:00 2001 From: Brady Date: Thu, 10 Aug 2017 15:16:52 -0500 Subject: [PATCH 22/26] Added Copyright notice to build.gradle and settings.gradle --- build.gradle | 16 ++++++++++++++++ settings.gradle | 17 ++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 963d439b..fb4bcaec 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,19 @@ +/* + * Copyright 2017 ZeroMemes + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + buildscript { repositories { mavenCentral() diff --git a/settings.gradle b/settings.gradle index 6419802e..64d6892b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,17 @@ -rootProject.name = 'client-api' +/* + * Copyright 2017 ZeroMemes + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +rootProject.name = 'client-api' \ No newline at end of file From f6d79860cc928c572be5c4c13715ea6db7660b93 Mon Sep 17 00:00:00 2001 From: LeafHacker Date: Thu, 10 Aug 2017 21:40:39 +0100 Subject: [PATCH 23/26] Move more properties into gradle.properties - Move version, group and name - Rename gameVersion to minecraftVersion - Change name from client-api to ClientAPI - Add a description --- build.gradle | 5 +---- gradle.properties | 8 ++++++-- settings.gradle | 17 ----------------- 3 files changed, 7 insertions(+), 23 deletions(-) delete mode 100644 settings.gradle diff --git a/build.gradle b/build.gradle index fb4bcaec..7765e4f9 100644 --- a/build.gradle +++ b/build.gradle @@ -37,16 +37,13 @@ apply plugin: 'java' apply plugin: 'net.minecraftforge.gradle.tweaker-client' apply plugin: 'org.spongepowered.mixin' -version '2.1' -group 'com.github.ZeroMemes' - sourceCompatibility = targetCompatibility = '1.8' // Needed so Eclipse task generates correctly compileJava { sourceCompatibility = targetCompatibility = '1.8' } minecraft { - version = project.gameVersion + version = project.minecraftVersion mappings = project.mappings tweakClass = 'me.zero.client.load.ClientTweaker' runDir = 'run' diff --git a/gradle.properties b/gradle.properties index bf7af056..88d7f082 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,5 +14,9 @@ # limitations under the License. # -gameVersion = 1.12.1 -mappings = snapshot_20170805 \ No newline at end of file +name = ClientAPI +group = com.github.ZeroMemes +description = An API to provids a shared base for writing modded clients. +version = 2.1 +minecraftVersion = 1.12.1 +mappings = snapshot_20170805 \ No newline at end of file diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 64d6892b..00000000 --- a/settings.gradle +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2017 ZeroMemes - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -rootProject.name = 'client-api' \ No newline at end of file From 5bb77e45f73a98af23534e241d36e6890943886d Mon Sep 17 00:00:00 2001 From: LeafHacker Date: Thu, 10 Aug 2017 23:10:55 +0100 Subject: [PATCH 24/26] Fix mixin warnings, mostly about overwrite reasons - Fixed warning about elevating access to onUpdateWalkingPlayer from private to public. - Added @reason doc strings to the four overwrite methods. --- src/main/java/me/zero/client/load/mixin/MixinBlock.java | 1 + .../java/me/zero/client/load/mixin/MixinEntityPlayerSP.java | 5 ++++- .../me/zero/client/load/mixin/MixinNettyPacketDecoder.java | 2 ++ .../me/zero/client/load/mixin/MixinNettyPacketEncoder.java | 2 ++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/zero/client/load/mixin/MixinBlock.java b/src/main/java/me/zero/client/load/mixin/MixinBlock.java index 212a2e21..d0e07fde 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinBlock.java +++ b/src/main/java/me/zero/client/load/mixin/MixinBlock.java @@ -53,6 +53,7 @@ private void canCollideCheck(IBlockState state, boolean hitIfLiquid, CallbackInf } /** + * @reason the overwritten method is only one line, we need to overwrite to mutate the AABB and pass params into the event constructor * @author Brady */ @Overwrite diff --git a/src/main/java/me/zero/client/load/mixin/MixinEntityPlayerSP.java b/src/main/java/me/zero/client/load/mixin/MixinEntityPlayerSP.java index 3c1c040e..0552ce70 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinEntityPlayerSP.java +++ b/src/main/java/me/zero/client/load/mixin/MixinEntityPlayerSP.java @@ -87,10 +87,11 @@ private void move(AbstractClientPlayer player, MoverType type, double x, double } /** + * @reason In addition to firing pre and post events, we also want to override some position values (prefixed with p). * @author Brady */ @Overwrite - public void onUpdateWalkingPlayer() { + private void onUpdateWalkingPlayer() { EntityPlayerSP _this = (EntityPlayerSP) (Object) this; MotionUpdateEvent pre = new MotionUpdateEvent(EventState.PRE); @@ -110,6 +111,8 @@ public void onUpdateWalkingPlayer() { if (this.isCurrentViewEntity()) { + // Override vanilla defaults of _tis.posX, etc + // This is why we need to overwrite the method body. double pX = pre.getX(); double pY = pre.getY(); double pZ = pre.getZ(); diff --git a/src/main/java/me/zero/client/load/mixin/MixinNettyPacketDecoder.java b/src/main/java/me/zero/client/load/mixin/MixinNettyPacketDecoder.java index 94f0561d..d4e4622a 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinNettyPacketDecoder.java +++ b/src/main/java/me/zero/client/load/mixin/MixinNettyPacketDecoder.java @@ -27,6 +27,7 @@ public class MixinNettyPacketDecoder { @Shadow @Final private EnumPacketDirection direction; /** + * @reason we need to wait until the packet is built and then pass it (and the connection state) to the event constructor * @author Brady */ @Overwrite @@ -39,6 +40,7 @@ protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) t EnumConnectionState state = ctx.channel().attr(NetworkManager.PROTOCOL_ATTRIBUTE_KEY).get(); Packet packet = state.getPacket(this.direction, packetId); + // We need the packet to create our Event, so we have to overwrite the method body PacketEvent event = new PacketEvent.Decode(packet, state); ClientAPI.EVENT_BUS.post(event); packet = event.getPacket(); diff --git a/src/main/java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java b/src/main/java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java index e0e9394f..06444213 100644 --- a/src/main/java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java +++ b/src/main/java/me/zero/client/load/mixin/MixinNettyPacketEncoder.java @@ -26,6 +26,7 @@ public class MixinNettyPacketEncoder { @Shadow @Final private EnumPacketDirection direction; /** + * @reason mostly because we need to mutate msg, but also so that we can pass the connection state to the event constructor * @author Brady */ @Overwrite @@ -37,6 +38,7 @@ protected void encode(ChannelHandlerContext ctx, Packet msg, ByteBuf out) thr LOGGER.debug(RECEIVED_PACKET_MARKER, "OUT: [{}:{}] {}", state, packetId, msg.getClass().getName()); } + // We need the state and we plan to mutate the msg, hence the overwrite PacketEvent event = new PacketEvent.Encode(msg, state); ClientAPI.EVENT_BUS.post(event); msg = event.getPacket(); From fdf9adf5a8569fea64df520cb9c951676068eb5a Mon Sep 17 00:00:00 2001 From: Brady Date: Fri, 11 Aug 2017 10:42:24 -0500 Subject: [PATCH 25/26] Update MixinGradle version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7765e4f9..aa5b8fc3 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ buildscript { dependencies { classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' - classpath 'org.spongepowered:mixingradle:0.4-SNAPSHOT' + classpath 'org.spongepowered:mixingradle:0.5-SNAPSHOT' } } From a59ed27a8c9e0037af6f83022fc463bb90f52d14 Mon Sep 17 00:00:00 2001 From: Brady Date: Fri, 11 Aug 2017 13:36:56 -0500 Subject: [PATCH 26/26] Minor bug fixing Allow implementation of Shader Fix IndexOutOfBoundsException --- src/main/java/me/zero/client/api/util/render/RenderUtils.java | 2 +- .../java/me/zero/client/api/util/render/gl/ShaderProgram.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/me/zero/client/api/util/render/RenderUtils.java b/src/main/java/me/zero/client/api/util/render/RenderUtils.java index bca651b5..20850439 100644 --- a/src/main/java/me/zero/client/api/util/render/RenderUtils.java +++ b/src/main/java/me/zero/client/api/util/render/RenderUtils.java @@ -254,7 +254,7 @@ private static void rectangleGradient(float x1, float y1, float x2, float y2, in c1 = color[0]; c2 = color[0]; c3 = color[1]; - c4 = color[2]; + c4 = color[1]; } else { c1 = color[0]; c2 = color[1]; diff --git a/src/main/java/me/zero/client/api/util/render/gl/ShaderProgram.java b/src/main/java/me/zero/client/api/util/render/gl/ShaderProgram.java index 81cb1a2d..8dca3f47 100644 --- a/src/main/java/me/zero/client/api/util/render/gl/ShaderProgram.java +++ b/src/main/java/me/zero/client/api/util/render/gl/ShaderProgram.java @@ -32,7 +32,7 @@ * @author Brady * @since 7/23/2017 3:31 PM */ -public final class ShaderProgram extends GLObject { +public class ShaderProgram extends GLObject { /** * Instance of the system supported shader adapter