Commit 35d59a000819118ae93b849aa39458158c8f9a7e

Authored by Mumfrey
1 parent 0a1da0c9

moving clipping plane functionality to convenience class so that mods can use it as well

java/client/com/mumfrey/liteloader/client/gui/GuiLiteLoaderPanel.java
@@ -2,7 +2,6 @@ package com.mumfrey.liteloader.client.gui; @@ -2,7 +2,6 @@ package com.mumfrey.liteloader.client.gui;
2 2
3 import static org.lwjgl.opengl.GL11.*; 3 import static org.lwjgl.opengl.GL11.*;
4 4
5 -import java.nio.DoubleBuffer;  
6 import java.util.ArrayList; 5 import java.util.ArrayList;
7 import java.util.List; 6 import java.util.List;
8 7
@@ -16,7 +15,6 @@ import net.minecraft.client.resources.I18n; @@ -16,7 +15,6 @@ import net.minecraft.client.resources.I18n;
16 import net.minecraft.util.IIcon; 15 import net.minecraft.util.IIcon;
17 import net.minecraft.util.ResourceLocation; 16 import net.minecraft.util.ResourceLocation;
18 17
19 -import org.lwjgl.BufferUtils;  
20 import org.lwjgl.input.Keyboard; 18 import org.lwjgl.input.Keyboard;
21 import org.lwjgl.input.Mouse; 19 import org.lwjgl.input.Mouse;
22 20
@@ -55,13 +53,6 @@ public class GuiLiteLoaderPanel extends GuiScreen @@ -55,13 +53,6 @@ public class GuiLiteLoaderPanel extends GuiScreen
55 static final int PANEL_BOTTOM = 26; 53 static final int PANEL_BOTTOM = 26;
56 54
57 private static final double TWEEN_RATE = 0.08; 55 private static final double TWEEN_RATE = 0.08;
58 -  
59 - /**  
60 - * Used for clipping  
61 - */  
62 - private static DoubleBuffer doubleBuffer = BufferUtils.createByteBuffer(64).asDoubleBuffer();  
63 -  
64 - private static int clippingPlaneFlags = 0;  
65 56
66 private static boolean displayErrorToolTip = true; 57 private static boolean displayErrorToolTip = true;
67 58
@@ -770,79 +761,4 @@ public class GuiLiteLoaderPanel extends GuiScreen @@ -770,79 +761,4 @@ public class GuiLiteLoaderPanel extends GuiScreen
770 { 761 {
771 glDrawTexturedRect(x, y, icon.getIconWidth(), icon.getIconHeight(), icon.getMinU(), icon.getMinV(), icon.getMaxU(), icon.getMaxV(), alpha); 762 glDrawTexturedRect(x, y, icon.getIconWidth(), icon.getIconHeight(), icon.getMinU(), icon.getMinV(), icon.getMaxU(), icon.getMaxV(), alpha);
772 } 763 }
773 -  
774 - /**  
775 - * Enable OpenGL clipping planes (uses planes 2, 3, 4 and 5)  
776 - *  
777 - * @param xLeft Left edge clip or -1 to not use this plane  
778 - * @param xRight Right edge clip or -1 to not use this plane  
779 - * @param yTop Top edge clip or -1 to not use this plane  
780 - * @param yBottom Bottom edge clip or -1 to not use this plane  
781 - */  
782 - final static void glEnableClipping(int xLeft, int xRight, int yTop, int yBottom)  
783 - {  
784 - clippingPlaneFlags = 0;  
785 -  
786 - // Apply left edge clipping if specified  
787 - if (xLeft != -1)  
788 - {  
789 - doubleBuffer.clear();  
790 - doubleBuffer.put(1).put(0).put(0).put(-xLeft).flip();  
791 - glClipPlane(GL_CLIP_PLANE2, doubleBuffer);  
792 - glEnable(GL_CLIP_PLANE2);  
793 - clippingPlaneFlags |= GL_CLIP_PLANE2;  
794 - }  
795 -  
796 - // Apply right edge clipping if specified  
797 - if (xRight != -1)  
798 - {  
799 - doubleBuffer.clear();  
800 - doubleBuffer.put(-1).put(0).put(0).put(xRight).flip();  
801 - glClipPlane(GL_CLIP_PLANE3, doubleBuffer);  
802 - glEnable(GL_CLIP_PLANE3);  
803 - clippingPlaneFlags |= GL_CLIP_PLANE3;  
804 - }  
805 -  
806 - // Apply top edge clipping if specified  
807 - if (yTop != -1)  
808 - {  
809 - doubleBuffer.clear();  
810 - doubleBuffer.put(0).put(1).put(0).put(-yTop).flip();  
811 - glClipPlane(GL_CLIP_PLANE4, doubleBuffer);  
812 - glEnable(GL_CLIP_PLANE4);  
813 - clippingPlaneFlags |= GL_CLIP_PLANE4;  
814 - }  
815 -  
816 - // Apply bottom edge clipping if specified  
817 - if (yBottom != -1)  
818 - {  
819 - doubleBuffer.clear();  
820 - doubleBuffer.put(0).put(-1).put(0).put(yBottom).flip();  
821 - glClipPlane(GL_CLIP_PLANE5, doubleBuffer);  
822 - glEnable(GL_CLIP_PLANE5);  
823 - clippingPlaneFlags |= GL_CLIP_PLANE5;  
824 - }  
825 - }  
826 -  
827 - /**  
828 - * Enable clipping planes which were previously enabled  
829 - */  
830 - final static void glEnableClipping()  
831 - {  
832 - if ((clippingPlaneFlags & GL_CLIP_PLANE2) == GL_CLIP_PLANE2) glEnable(GL_CLIP_PLANE2);  
833 - if ((clippingPlaneFlags & GL_CLIP_PLANE3) == GL_CLIP_PLANE3) glEnable(GL_CLIP_PLANE3);  
834 - if ((clippingPlaneFlags & GL_CLIP_PLANE4) == GL_CLIP_PLANE4) glEnable(GL_CLIP_PLANE4);  
835 - if ((clippingPlaneFlags & GL_CLIP_PLANE5) == GL_CLIP_PLANE5) glEnable(GL_CLIP_PLANE5);  
836 - }  
837 -  
838 - /**  
839 - * Disable OpenGL clipping planes (uses planes 2, 3, 4 and 5)  
840 - */  
841 - final static void glDisableClipping()  
842 - {  
843 - glDisable(GL_CLIP_PLANE5);  
844 - glDisable(GL_CLIP_PLANE4);  
845 - glDisable(GL_CLIP_PLANE3);  
846 - glDisable(GL_CLIP_PLANE2);  
847 - }  
848 } 764 }
849 \ No newline at end of file 765 \ No newline at end of file
java/client/com/mumfrey/liteloader/client/gui/GuiModListEntry.java
1 package com.mumfrey.liteloader.client.gui; 1 package com.mumfrey.liteloader.client.gui;
2 2
  3 +import static com.mumfrey.liteloader.client.util.GLClippingPlanes.*;
3 import static org.lwjgl.opengl.GL11.*; 4 import static org.lwjgl.opengl.GL11.*;
4 5
5 import java.util.ArrayList; 6 import java.util.ArrayList;
@@ -273,9 +274,9 @@ public class GuiModListEntry extends Gui @@ -273,9 +274,9 @@ public class GuiModListEntry extends Gui
273 String tooltipText = icon.getDisplayText(); 274 String tooltipText = icon.getDisplayText();
274 if (tooltipText != null) 275 if (tooltipText != null)
275 { 276 {
276 - GuiLiteLoaderPanel.glDisableClipping(); 277 + glDisableClipping();
277 GuiLiteLoaderPanel.drawTooltip(this.fontRenderer, tooltipText, mouseX, mouseY, 4096, 4096, GuiModListEntry.WHITE, GuiModListEntry.BLEND_HALF & GuiModListEntry.BLACK); 278 GuiLiteLoaderPanel.drawTooltip(this.fontRenderer, tooltipText, mouseX, mouseY, 4096, 4096, GuiModListEntry.WHITE, GuiModListEntry.BLEND_HALF & GuiModListEntry.BLACK);
278 - GuiLiteLoaderPanel.glEnableClipping(); 279 + glEnableClipping();
279 } 280 }
280 281
281 if (icon instanceof IconClickable) this.mouseOverIcon = (IconClickable)icon; 282 if (icon instanceof IconClickable) this.mouseOverIcon = (IconClickable)icon;
@@ -323,7 +324,7 @@ public class GuiModListEntry extends Gui @@ -323,7 +324,7 @@ public class GuiModListEntry extends Gui
323 324
324 this.mouseOverScrollBar = this.isMouseOver(mouseX, mouseY, xPosition + width - 5, yPos, 5, scrollHeight); 325 this.mouseOverScrollBar = this.isMouseOver(mouseX, mouseY, xPosition + width - 5, yPos, 5, scrollHeight);
325 326
326 - GuiLiteLoaderPanel.glEnableClipping(-1, -1, yPos, bottom - 3); 327 + glEnableClipping(-1, -1, yPos, bottom - 3);
327 this.fontRenderer.drawSplitString(this.description, xPosition + 5, yPos - this.scrollBar.getValue(), width - 11, GuiModListEntry.DESCRIPTION_COLOUR); 328 this.fontRenderer.drawSplitString(this.description, xPosition + 5, yPos - this.scrollBar.getValue(), width - 11, GuiModListEntry.DESCRIPTION_COLOUR);
328 } 329 }
329 330
java/client/com/mumfrey/liteloader/client/gui/GuiPanel.java
@@ -207,15 +207,4 @@ public abstract class GuiPanel extends Gui @@ -207,15 +207,4 @@ public abstract class GuiPanel extends Gui
207 glAlphaFunc(GL_GREATER, 0.1F); 207 glAlphaFunc(GL_GREATER, 0.1F);
208 glDisable(GL_BLEND); 208 glDisable(GL_BLEND);
209 } 209 }
210 -  
211 -  
212 - protected static final void glEnableClipping(int xLeft, int xRight, int yTop, int yBottom)  
213 - {  
214 - GuiLiteLoaderPanel.glEnableClipping(xLeft, xRight, yTop, yBottom);  
215 - }  
216 -  
217 - protected static final void glDisableClipping()  
218 - {  
219 - GuiLiteLoaderPanel.glDisableClipping();  
220 - }  
221 } 210 }
222 \ No newline at end of file 211 \ No newline at end of file
java/client/com/mumfrey/liteloader/client/gui/GuiPanelConfigContainer.java
1 package com.mumfrey.liteloader.client.gui; 1 package com.mumfrey.liteloader.client.gui;
2 2
  3 +import static com.mumfrey.liteloader.client.util.GLClippingPlanes.*;
3 import static org.lwjgl.opengl.GL11.*; 4 import static org.lwjgl.opengl.GL11.*;
4 import net.minecraft.client.Minecraft; 5 import net.minecraft.client.Minecraft;
5 import net.minecraft.client.gui.GuiButton; 6 import net.minecraft.client.gui.GuiButton;
java/client/com/mumfrey/liteloader/client/gui/GuiPanelMods.java
1 package com.mumfrey.liteloader.client.gui; 1 package com.mumfrey.liteloader.client.gui;
2 2
  3 +import static com.mumfrey.liteloader.client.util.GLClippingPlanes.*;
3 import static org.lwjgl.opengl.GL11.*; 4 import static org.lwjgl.opengl.GL11.*;
4 5
5 import java.util.ArrayList; 6 import java.util.ArrayList;
@@ -7,6 +8,10 @@ import java.util.List; @@ -7,6 +8,10 @@ import java.util.List;
7 import java.util.Map; 8 import java.util.Map;
8 import java.util.TreeMap; 9 import java.util.TreeMap;
9 10
  11 +import net.minecraft.client.Minecraft;
  12 +import net.minecraft.client.gui.GuiButton;
  13 +import net.minecraft.client.resources.I18n;
  14 +
10 import org.lwjgl.input.Keyboard; 15 import org.lwjgl.input.Keyboard;
11 16
12 import com.mumfrey.liteloader.LiteMod; 17 import com.mumfrey.liteloader.LiteMod;
@@ -19,10 +24,6 @@ import com.mumfrey.liteloader.launch.LoaderEnvironment; @@ -19,10 +24,6 @@ import com.mumfrey.liteloader.launch.LoaderEnvironment;
19 import com.mumfrey.liteloader.modconfig.ConfigManager; 24 import com.mumfrey.liteloader.modconfig.ConfigManager;
20 import com.mumfrey.liteloader.modconfig.ConfigPanel; 25 import com.mumfrey.liteloader.modconfig.ConfigPanel;
21 26
22 -import net.minecraft.client.Minecraft;  
23 -import net.minecraft.client.gui.GuiButton;  
24 -import net.minecraft.client.resources.I18n;  
25 -  
26 /** 27 /**
27 * Mods panel 28 * Mods panel
28 * 29 *
java/client/com/mumfrey/liteloader/client/gui/GuiScrollPanel.java
1 package com.mumfrey.liteloader.client.gui; 1 package com.mumfrey.liteloader.client.gui;
2 2
  3 +import static com.mumfrey.liteloader.client.util.GLClippingPlanes.*;
3 import static org.lwjgl.opengl.GL11.*; 4 import static org.lwjgl.opengl.GL11.*;
4 import net.minecraft.client.Minecraft; 5 import net.minecraft.client.Minecraft;
5 import net.minecraft.client.gui.GuiButton; 6 import net.minecraft.client.gui.GuiButton;
java/client/com/mumfrey/liteloader/client/util/GLClippingPlanes.java 0 โ†’ 100644
  1 +package com.mumfrey.liteloader.client.util;
  2 +
  3 +import static org.lwjgl.opengl.GL11.*;
  4 +
  5 +import java.nio.DoubleBuffer;
  6 +
  7 +import org.lwjgl.BufferUtils;
  8 +import org.lwjgl.util.Rectangle;
  9 +
  10 +/**
  11 + * OpenGL clipping plane convenience functions. We prefer to clip rectangular GUI regions in Minecraft using
  12 + * clipping rather than scissor because scissor is a nuisance to work with, primarily because it works in
  13 + * "window" (OpenGL window) coordinates and doesn't respect the current transformation matrix. Using clipping
  14 + * planes we can specify clipping edges in "Minecraft screen coordinates", can optionally clip on only one or
  15 + * two axes, and also don't need to worry about the current transform.
  16 + *
  17 + * @author Adam Mummery-Smith
  18 + */
  19 +public final class GLClippingPlanes
  20 +{
  21 + public enum Plane
  22 + {
  23 + LEFT(GL_CLIP_PLANE0),
  24 + RIGHT(GL_CLIP_PLANE1),
  25 + TOP(GL_CLIP_PLANE2),
  26 + BOTTOM(GL_CLIP_PLANE3);
  27 +
  28 + final int plane;
  29 + final int sign;
  30 +
  31 + private Plane(int plane)
  32 + {
  33 + this.plane = plane;
  34 + this.sign = (plane % 2 == 0) ? -1 : 1;
  35 + }
  36 + }
  37 +
  38 + private static final int STACK_DEPTH = 1;
  39 + private static final int STACK_FRAME_SIZE = 128;
  40 +
  41 + private static DoubleBuffer doubleBuffer = BufferUtils.createByteBuffer(STACK_FRAME_SIZE * STACK_DEPTH).asDoubleBuffer();
  42 +
  43 + private static int clippingPlaneFlags = 0;
  44 +
  45 + private static int totalClippingPlanes = glGetInteger(GL_MAX_CLIP_PLANES);
  46 +
  47 +// private static int frame = 0;
  48 +
  49 + static
  50 + {
  51 + for (int f = 0; f < STACK_DEPTH; f++)
  52 + {
  53 + // Clipping normals
  54 + GLClippingPlanes.doubleBuffer.put(1).put(0).put(0).put(0);
  55 + GLClippingPlanes.doubleBuffer.put(-1).put(0).put(0).put(0);
  56 + GLClippingPlanes.doubleBuffer.put(0).put(1).put(0).put(0);
  57 + GLClippingPlanes.doubleBuffer.put(0).put(-1).put(0).put(0);
  58 + }
  59 + }
  60 +
  61 + private GLClippingPlanes() {}
  62 +
  63 + /**
  64 + * Get the total number of available clipping planes on the platform
  65 + */
  66 + public static int glGetTotalClippingPlanes()
  67 + {
  68 + return GLClippingPlanes.totalClippingPlanes;
  69 + }
  70 +
  71 + /**
  72 + * Enable OpenGL clipping planes (uses planes 0, 1, 2 and 3)
  73 + *
  74 + * @param left Left edge clip or -1 to not use this plane
  75 + * @param right Right edge clip or -1 to not use this plane
  76 + * @param top Top edge clip or -1 to not use this plane
  77 + * @param bottom Bottom edge clip or -1 to not use this plane
  78 + */
  79 + public static void glEnableClipping(int left, int right, int top, int bottom)
  80 + {
  81 + GLClippingPlanes.clippingPlaneFlags = 0;
  82 +
  83 + glEnableClipping(GL_CLIP_PLANE0, left, -1);
  84 + glEnableClipping(GL_CLIP_PLANE1, right, 1);
  85 + glEnableClipping(GL_CLIP_PLANE2, top, -1);
  86 + glEnableClipping(GL_CLIP_PLANE3, bottom, 1);
  87 + }
  88 +
  89 + /**
  90 + * Enable OpenGL clipping planes (uses planes 0, 1, 2 and 3)
  91 + *
  92 + * @param rect Clipping rectangle
  93 + */
  94 + public static void glEnableClipping(Rectangle rect)
  95 + {
  96 + GLClippingPlanes.clippingPlaneFlags = 0;
  97 +
  98 + glEnableClipping(GL_CLIP_PLANE0, rect.getX(), -1);
  99 + glEnableClipping(GL_CLIP_PLANE1, rect.getX() + rect.getWidth(), 1);
  100 + glEnableClipping(GL_CLIP_PLANE2, rect.getY(), -1);
  101 + glEnableClipping(GL_CLIP_PLANE3, rect.getY() + rect.getHeight(), 1);
  102 + }
  103 +
  104 + /**
  105 + * Enable horizontal clipping planes (left and right) (uses planes 0, 1)
  106 + *
  107 + * @param left Left edge clip or -1 to not use this plane
  108 + * @param right Right edge clip or -1 to not use this plane
  109 + */
  110 + public static void glEnableHorizontalClipping(int left, int right)
  111 + {
  112 + glEnableClipping(GL_CLIP_PLANE0, left, -1);
  113 + glEnableClipping(GL_CLIP_PLANE1, right, 1);
  114 + }
  115 +
  116 + /**
  117 + * Enable vertical clipping planes (top and bottom) (uses planes 2, 3)
  118 + *
  119 + * @param top Top edge clip or -1 to not use this plane
  120 + * @param bottom Bottom edge clip or -1 to not use this plane
  121 + */
  122 + public static void glEnableVerticalClipping(int top, int bottom)
  123 + {
  124 + glEnableClipping(GL_CLIP_PLANE2, top, -1);
  125 + glEnableClipping(GL_CLIP_PLANE3, bottom, 1);
  126 + }
  127 +
  128 + /**
  129 + * @param plane
  130 + * @param value
  131 + */
  132 + public static void glEnableClipping(int plane, int value)
  133 + {
  134 + if (plane < GL_CLIP_PLANE0 || plane >= (GL_CLIP_PLANE0 + GLClippingPlanes.totalClippingPlanes))
  135 + {
  136 + throw new IllegalArgumentException("Invalid clipping plane enum specified GL_CLIP_PLANE" + (plane - GL_CLIP_PLANE0));
  137 + }
  138 +
  139 + glEnableClipping(plane, value, (plane % 2 == 0) ? -1 : 1);
  140 + }
  141 +
  142 + /**
  143 + * @param plane
  144 + * @param value
  145 + */
  146 + public static void glEnableClipping(Plane plane, int value)
  147 + {
  148 + glEnableClipping(plane.plane, value, plane.sign);
  149 + }
  150 +
  151 + /**
  152 + * Enable clipping on a particular axis
  153 + *
  154 + * @param plane Clipping plane to enable
  155 + * @param value Clipping plane position
  156 + * @param sign Sign of the position
  157 + */
  158 + private static void glEnableClipping(int plane, int value, int sign)
  159 + {
  160 + if (value == -1) return;
  161 +
  162 + int offset = (plane - GL_CLIP_PLANE0) << 2;
  163 + GLClippingPlanes.doubleBuffer.put(offset + 3, value * sign).position(offset);
  164 + GLClippingPlanes.clippingPlaneFlags |= plane;
  165 +
  166 + glClipPlane(plane, GLClippingPlanes.doubleBuffer);
  167 + glEnable(plane);
  168 + }
  169 +
  170 + /**
  171 + * Enable clipping planes which were previously enabled
  172 + */
  173 + public static void glEnableClipping()
  174 + {
  175 + if ((GLClippingPlanes.clippingPlaneFlags & GL_CLIP_PLANE0) == GL_CLIP_PLANE0) glEnable(GL_CLIP_PLANE0);
  176 + if ((GLClippingPlanes.clippingPlaneFlags & GL_CLIP_PLANE1) == GL_CLIP_PLANE1) glEnable(GL_CLIP_PLANE1);
  177 + if ((GLClippingPlanes.clippingPlaneFlags & GL_CLIP_PLANE2) == GL_CLIP_PLANE2) glEnable(GL_CLIP_PLANE2);
  178 + if ((GLClippingPlanes.clippingPlaneFlags & GL_CLIP_PLANE3) == GL_CLIP_PLANE3) glEnable(GL_CLIP_PLANE3);
  179 + }
  180 +
  181 + /**
  182 + * Disable OpenGL clipping planes (uses planes 2, 3, 4 and 5)
  183 + */
  184 + public static void glDisableClipping()
  185 + {
  186 + glDisable(GL_CLIP_PLANE3);
  187 + glDisable(GL_CLIP_PLANE2);
  188 + glDisable(GL_CLIP_PLANE1);
  189 + glDisable(GL_CLIP_PLANE0);
  190 + }
  191 +}