Commit 35d59a000819118ae93b849aa39458158c8f9a7e
1 parent
0a1da0c9
moving clipping plane functionality to convenience class so that mods can use it as well
Showing
7 changed files
with
202 additions
and
102 deletions
java/client/com/mumfrey/liteloader/client/gui/GuiLiteLoaderPanel.java
... | ... | @@ -2,7 +2,6 @@ package com.mumfrey.liteloader.client.gui; |
2 | 2 | |
3 | 3 | import static org.lwjgl.opengl.GL11.*; |
4 | 4 | |
5 | -import java.nio.DoubleBuffer; | |
6 | 5 | import java.util.ArrayList; |
7 | 6 | import java.util.List; |
8 | 7 | |
... | ... | @@ -16,7 +15,6 @@ import net.minecraft.client.resources.I18n; |
16 | 15 | import net.minecraft.util.IIcon; |
17 | 16 | import net.minecraft.util.ResourceLocation; |
18 | 17 | |
19 | -import org.lwjgl.BufferUtils; | |
20 | 18 | import org.lwjgl.input.Keyboard; |
21 | 19 | import org.lwjgl.input.Mouse; |
22 | 20 | |
... | ... | @@ -55,13 +53,6 @@ public class GuiLiteLoaderPanel extends GuiScreen |
55 | 53 | static final int PANEL_BOTTOM = 26; |
56 | 54 | |
57 | 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 | 57 | private static boolean displayErrorToolTip = true; |
67 | 58 | |
... | ... | @@ -770,79 +761,4 @@ public class GuiLiteLoaderPanel extends GuiScreen |
770 | 761 | { |
771 | 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 | 765 | \ No newline at end of file | ... | ... |
java/client/com/mumfrey/liteloader/client/gui/GuiModListEntry.java
1 | 1 | package com.mumfrey.liteloader.client.gui; |
2 | 2 | |
3 | +import static com.mumfrey.liteloader.client.util.GLClippingPlanes.*; | |
3 | 4 | import static org.lwjgl.opengl.GL11.*; |
4 | 5 | |
5 | 6 | import java.util.ArrayList; |
... | ... | @@ -273,9 +274,9 @@ public class GuiModListEntry extends Gui |
273 | 274 | String tooltipText = icon.getDisplayText(); |
274 | 275 | if (tooltipText != null) |
275 | 276 | { |
276 | - GuiLiteLoaderPanel.glDisableClipping(); | |
277 | + glDisableClipping(); | |
277 | 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 | 282 | if (icon instanceof IconClickable) this.mouseOverIcon = (IconClickable)icon; |
... | ... | @@ -323,7 +324,7 @@ public class GuiModListEntry extends Gui |
323 | 324 | |
324 | 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 | 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 | 207 | glAlphaFunc(GL_GREATER, 0.1F); |
208 | 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 | 211 | \ No newline at end of file | ... | ... |
java/client/com/mumfrey/liteloader/client/gui/GuiPanelConfigContainer.java
java/client/com/mumfrey/liteloader/client/gui/GuiPanelMods.java
1 | 1 | package com.mumfrey.liteloader.client.gui; |
2 | 2 | |
3 | +import static com.mumfrey.liteloader.client.util.GLClippingPlanes.*; | |
3 | 4 | import static org.lwjgl.opengl.GL11.*; |
4 | 5 | |
5 | 6 | import java.util.ArrayList; |
... | ... | @@ -7,6 +8,10 @@ import java.util.List; |
7 | 8 | import java.util.Map; |
8 | 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 | 15 | import org.lwjgl.input.Keyboard; |
11 | 16 | |
12 | 17 | import com.mumfrey.liteloader.LiteMod; |
... | ... | @@ -19,10 +24,6 @@ import com.mumfrey.liteloader.launch.LoaderEnvironment; |
19 | 24 | import com.mumfrey.liteloader.modconfig.ConfigManager; |
20 | 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 | 28 | * Mods panel |
28 | 29 | * | ... | ... |
java/client/com/mumfrey/liteloader/client/gui/GuiScrollPanel.java
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 | +} | ... | ... |