Commit 7ab034295c052784a82cdacd190841d70c101ca2
1 parent
a2baddb7
adding FrameBufferListener
Showing
6 changed files
with
128 additions
and
5 deletions
debug/obfuscation.properties
| ... | ... | @@ -14,4 +14,6 @@ field_148759_a=underlyingIntegerMap |
| 14 | 14 | #field_148748_b= |
| 15 | 15 | field_147559_m=mapSpecialRenderers |
| 16 | 16 | field_145855_i=nameToClassMap |
| 17 | -field_145853_j=classToNameMap | |
| 18 | 17 | \ No newline at end of file |
| 18 | +field_145853_j=classToNameMap | |
| 19 | +func_147615_c=framebufferRender | |
| 20 | +func_147612_c=bindFramebufferTexture | |
| 19 | 21 | \ No newline at end of file | ... | ... |
java/client/com/mumfrey/liteloader/FrameBufferListener.java
0 → 100644
| 1 | +package com.mumfrey.liteloader; | |
| 2 | + | |
| 3 | +import net.minecraft.client.shader.Framebuffer; | |
| 4 | + | |
| 5 | +/** | |
| 6 | + * Interface for mods which want to interact with Minecraft's main Frame Buffer Object | |
| 7 | + * | |
| 8 | + * @author Adam Mummery-Smith | |
| 9 | + */ | |
| 10 | +public interface FrameBufferListener extends LiteMod | |
| 11 | +{ | |
| 12 | + /** | |
| 13 | + * Called before the FBO is rendered. Useful if you want to interact with the FBO before it is drawn to the screen | |
| 14 | + */ | |
| 15 | + public abstract void preRenderFBO(Framebuffer fbo); | |
| 16 | + | |
| 17 | + /** | |
| 18 | + * Called immediately before the FBO is rendered to the screen, after the appropriate GL modes and matrix transforms | |
| 19 | + * have been set but before the FBO is actually rendered into the main output buffer. | |
| 20 | + * | |
| 21 | + * @param fbo FBO instance | |
| 22 | + * @param width FBO width | |
| 23 | + * @param height FBO height | |
| 24 | + */ | |
| 25 | + public abstract void onRenderFBO(Framebuffer fbo, int width, int height); | |
| 26 | + | |
| 27 | + /** | |
| 28 | + * Called after the FBO is rendered whilst still inside the FBO transform | |
| 29 | + */ | |
| 30 | + public abstract void postRenderFBO(Framebuffer fbo); | |
| 31 | +} | ... | ... |
java/client/com/mumfrey/liteloader/client/CallbackProxyClient.java
| ... | ... | @@ -2,6 +2,8 @@ package com.mumfrey.liteloader.client; |
| 2 | 2 | |
| 3 | 3 | import net.minecraft.client.Minecraft; |
| 4 | 4 | import net.minecraft.client.entity.EntityClientPlayerMP; |
| 5 | +import net.minecraft.client.renderer.OpenGlHelper; | |
| 6 | +import net.minecraft.client.shader.Framebuffer; | |
| 5 | 7 | import net.minecraft.entity.player.EntityPlayerMP; |
| 6 | 8 | import net.minecraft.network.INetHandler; |
| 7 | 9 | import net.minecraft.network.NetworkManager; |
| ... | ... | @@ -39,6 +41,10 @@ public class CallbackProxyClient |
| 39 | 41 | private static boolean clock = false; |
| 40 | 42 | |
| 41 | 43 | private static ClientEvents events; |
| 44 | + | |
| 45 | + private static boolean fboEnabled; | |
| 46 | + | |
| 47 | + private static boolean renderingFBO; | |
| 42 | 48 | |
| 43 | 49 | public static void handleLoginSuccessPacket(INetHandler netHandler, S02PacketLoginSuccess packet) |
| 44 | 50 | { |
| ... | ... | @@ -261,9 +267,40 @@ public class CallbackProxyClient |
| 261 | 267 | { |
| 262 | 268 | CallbackProxyClient.events.onSendChatMessage(e, message); |
| 263 | 269 | } |
| 270 | + | |
| 271 | + public static void onResize(EventInfo<Minecraft> e) | |
| 272 | + { | |
| 273 | + CallbackProxyClient.events.onResize(e.getSource()); | |
| 274 | + } | |
| 275 | + | |
| 276 | + public static void preRenderFBO(EventInfo<Minecraft> e) | |
| 277 | + { | |
| 278 | + CallbackProxyClient.fboEnabled = OpenGlHelper.isFramebufferEnabled(); | |
| 279 | + | |
| 280 | + if (CallbackProxyClient.fboEnabled) | |
| 281 | + { | |
| 282 | + CallbackProxyClient.renderingFBO = true; | |
| 283 | + CallbackProxyClient.events.preRenderFBO(e.getSource().getFramebuffer()); | |
| 284 | + } | |
| 285 | + } | |
| 286 | + | |
| 287 | + public static void postRenderFBO(EventInfo<Minecraft> e) | |
| 288 | + { | |
| 289 | + CallbackProxyClient.renderingFBO = false; | |
| 264 | 290 | |
| 265 | - public static void onResize(EventInfo<Minecraft> e) | |
| 266 | - { | |
| 267 | - CallbackProxyClient.events.onResize(e.getSource()); | |
| 268 | - } | |
| 291 | + if (CallbackProxyClient.fboEnabled) | |
| 292 | + { | |
| 293 | + CallbackProxyClient.events.postRenderFBO(e.getSource().getFramebuffer()); | |
| 294 | + } | |
| 295 | + } | |
| 296 | + | |
| 297 | + public static void renderFBO(EventInfo<Framebuffer> e, int width, int height) | |
| 298 | + { | |
| 299 | + if (CallbackProxyClient.renderingFBO) | |
| 300 | + { | |
| 301 | + CallbackProxyClient.events.onRenderFBO(e.getSource(), width, height); | |
| 302 | + } | |
| 303 | + | |
| 304 | + CallbackProxyClient.renderingFBO = false; | |
| 305 | + } | |
| 269 | 306 | } | ... | ... |
java/client/com/mumfrey/liteloader/client/ClientEvents.java
| ... | ... | @@ -6,6 +6,7 @@ import net.minecraft.client.Minecraft; |
| 6 | 6 | import net.minecraft.client.entity.EntityClientPlayerMP; |
| 7 | 7 | import net.minecraft.client.gui.GuiNewChat; |
| 8 | 8 | import net.minecraft.client.gui.ScaledResolution; |
| 9 | +import net.minecraft.client.shader.Framebuffer; | |
| 9 | 10 | import net.minecraft.network.INetHandler; |
| 10 | 11 | import net.minecraft.network.login.INetHandlerLoginClient; |
| 11 | 12 | import net.minecraft.network.login.server.S02PacketLoginSuccess; |
| ... | ... | @@ -159,6 +160,11 @@ public class ClientEvents extends Events<Minecraft, IntegratedServer> |
| 159 | 160 | * List of mods which monitor changes in the viewport |
| 160 | 161 | */ |
| 161 | 162 | private LinkedList<ViewportListener> viewportListeners = new LinkedList<ViewportListener>(); |
| 163 | + | |
| 164 | + /** | |
| 165 | + * List of mods which interact with the main minecraft FBO | |
| 166 | + */ | |
| 167 | + private LinkedList<FrameBufferListener> frameBufferListeners = new LinkedList<FrameBufferListener>(); | |
| 162 | 168 | |
| 163 | 169 | /** |
| 164 | 170 | * Hash code of the current world. We don't store the world reference here because we don't want |
| ... | ... | @@ -212,6 +218,7 @@ public class ClientEvents extends Events<Minecraft, IntegratedServer> |
| 212 | 218 | delegate.registerInterface(OutboundChatListener.class); |
| 213 | 219 | delegate.registerInterface(OutboundChatFilter.class); |
| 214 | 220 | delegate.registerInterface(ViewportListener.class); |
| 221 | + delegate.registerInterface(FrameBufferListener.class); | |
| 215 | 222 | } |
| 216 | 223 | |
| 217 | 224 | /** |
| ... | ... | @@ -437,6 +444,17 @@ public class ClientEvents extends Events<Minecraft, IntegratedServer> |
| 437 | 444 | this.viewportListeners.add(viewportListener); |
| 438 | 445 | } |
| 439 | 446 | } |
| 447 | + | |
| 448 | + /** | |
| 449 | + * @param frameBufferListener | |
| 450 | + */ | |
| 451 | + public void addFrameBufferListener(FrameBufferListener frameBufferListener) | |
| 452 | + { | |
| 453 | + if (!this.frameBufferListeners.contains(frameBufferListener)) | |
| 454 | + { | |
| 455 | + this.frameBufferListeners.add(frameBufferListener); | |
| 456 | + } | |
| 457 | + } | |
| 440 | 458 | |
| 441 | 459 | /** |
| 442 | 460 | * Late initialisation callback |
| ... | ... | @@ -778,4 +796,22 @@ public class ClientEvents extends Events<Minecraft, IntegratedServer> |
| 778 | 796 | for (JoinGameListener joinGameListener : this.joinGameListeners) |
| 779 | 797 | joinGameListener.onJoinGame(netHandler, loginPacket); |
| 780 | 798 | } |
| 799 | + | |
| 800 | + void preRenderFBO(Framebuffer framebuffer) | |
| 801 | + { | |
| 802 | + for (FrameBufferListener frameBufferListener : this.frameBufferListeners) | |
| 803 | + frameBufferListener.preRenderFBO(framebuffer); | |
| 804 | + } | |
| 805 | + | |
| 806 | + void onRenderFBO(Framebuffer framebuffer, int width, int height) | |
| 807 | + { | |
| 808 | + for (FrameBufferListener frameBufferListener : this.frameBufferListeners) | |
| 809 | + frameBufferListener.onRenderFBO(framebuffer, width, height); | |
| 810 | + } | |
| 811 | + | |
| 812 | + void postRenderFBO(Framebuffer framebuffer) | |
| 813 | + { | |
| 814 | + for (FrameBufferListener frameBufferListener : this.frameBufferListeners) | |
| 815 | + frameBufferListener.postRenderFBO(framebuffer); | |
| 816 | + } | |
| 781 | 817 | } | ... | ... |
java/client/com/mumfrey/liteloader/client/transformers/LiteLoaderEventInjectionTransformer.java
| ... | ... | @@ -5,6 +5,7 @@ import com.mumfrey.liteloader.transformers.event.Event; |
| 5 | 5 | import com.mumfrey.liteloader.transformers.event.EventInjectionTransformer; |
| 6 | 6 | import com.mumfrey.liteloader.transformers.event.InjectionPoint; |
| 7 | 7 | import com.mumfrey.liteloader.transformers.event.MethodInfo; |
| 8 | +import com.mumfrey.liteloader.transformers.event.inject.BeforeInvoke; | |
| 8 | 9 | import com.mumfrey.liteloader.transformers.event.inject.MethodHead; |
| 9 | 10 | |
| 10 | 11 | public class LiteLoaderEventInjectionTransformer extends EventInjectionTransformer |
| ... | ... | @@ -21,5 +22,18 @@ public class LiteLoaderEventInjectionTransformer extends EventInjectionTransform |
| 21 | 22 | Event updateFramebufferSize = Event.getOrCreate("updateFramebufferSize", false); |
| 22 | 23 | MethodInfo updateFramebufferSizeTarget = new MethodInfo(Obf.Minecraft, Obf.updateFramebufferSize, Void.TYPE); |
| 23 | 24 | this.addEvent(updateFramebufferSize, updateFramebufferSizeTarget, head).addListener(new MethodInfo(Obf.CallbackProxyClient, "onResize")); |
| 25 | + | |
| 26 | + MethodInfo framebufferRender = new MethodInfo(Obf.FrameBuffer, Obf.framebufferRender, "(II)V"); | |
| 27 | + BeforeInvoke beforeFramebufferRender = new BeforeInvoke(framebufferRender); | |
| 28 | + | |
| 29 | + Event preRenderFBO = Event.getOrCreate("preRenderFBO", false); | |
| 30 | + MethodInfo runGameLoop = new MethodInfo(Obf.Minecraft, Obf.runGameLoop, Void.TYPE); | |
| 31 | + this.addEvent(preRenderFBO, runGameLoop, beforeFramebufferRender).addListener(new MethodInfo(Obf.CallbackProxyClient, "preRenderFBO")); | |
| 32 | + | |
| 33 | + Event renderFBO = Event.getOrCreate("renderFBO", false); | |
| 34 | + this.addEvent(renderFBO, framebufferRender, new BeforeInvoke(new MethodInfo(Obf.FrameBuffer, Obf.bindFramebufferTexture, Void.TYPE))).addListener(new MethodInfo(Obf.CallbackProxyClient, "renderFBO")); | |
| 35 | + | |
| 36 | + Event postRenderFBO = Event.getOrCreate("postRenderFBO", false); | |
| 37 | + this.addEvent(postRenderFBO, runGameLoop, InjectionPoint.after(beforeFramebufferRender)).addListener(new MethodInfo(Obf.CallbackProxyClient, "postRenderFBO"));; | |
| 24 | 38 | } |
| 25 | 39 | } | ... | ... |
java/common/com/mumfrey/liteloader/core/runtime/Obf.java
| ... | ... | @@ -46,6 +46,7 @@ public class Obf |
| 46 | 46 | public static final Obf EntityClientPlayerMP = new Obf("net.minecraft.client.entity.EntityClientPlayerMP", "bjk" ); |
| 47 | 47 | public static final Obf Blocks = new Obf("net.minecraft.init.Blocks", "ajn" ); |
| 48 | 48 | public static final Obf Items = new Obf("net.minecraft.init.Items", "ade" ); |
| 49 | + public static final Obf FrameBuffer = new Obf("net.minecraft.client.shader.Framebuffer", "bmg" ); | |
| 49 | 50 | |
| 50 | 51 | // Fields |
| 51 | 52 | // ----------------------------------------------------------------------------------------- |
| ... | ... | @@ -82,6 +83,8 @@ public class Obf |
| 82 | 83 | public static final Obf startServerThread = new Obf("func_71256_s", "w" ); |
| 83 | 84 | public static final Obf sendChatMessage = new Obf("func_71165_d", "a" ); |
| 84 | 85 | public static final Obf updateFramebufferSize = new Obf("func_147119_ah", "an" ); |
| 86 | + public static final Obf framebufferRender = new Obf("func_147615_c", "c" ); | |
| 87 | + public static final Obf bindFramebufferTexture = new Obf("func_147612_c", "c" ); | |
| 85 | 88 | |
| 86 | 89 | public static final int MCP = 0; |
| 87 | 90 | public static final int SRG = 1; | ... | ... |