summaryrefslogtreecommitdiffstats
path: root/src/jake2/render/lwjgl/Polygon.java
diff options
context:
space:
mode:
authorCarsten Weisse <[email protected]>2005-01-09 22:36:31 +0000
committerCarsten Weisse <[email protected]>2005-01-09 22:36:31 +0000
commit2fb37c78fb3ef89482b20b0521e6f1c63bba36c3 (patch)
treeadbb88f3114984c42910a8608e37c3570cf8f9e1 /src/jake2/render/lwjgl/Polygon.java
parent1e005eacf3cd42609500e1953803029967a1f366 (diff)
the Polygon implementation (FloatBuffer as backbuffer) and the changes to use the interface
Diffstat (limited to 'src/jake2/render/lwjgl/Polygon.java')
-rw-r--r--src/jake2/render/lwjgl/Polygon.java160
1 files changed, 160 insertions, 0 deletions
diff --git a/src/jake2/render/lwjgl/Polygon.java b/src/jake2/render/lwjgl/Polygon.java
new file mode 100644
index 0000000..3b401e2
--- /dev/null
+++ b/src/jake2/render/lwjgl/Polygon.java
@@ -0,0 +1,160 @@
+/*
+ * Polygon.java
+ * Copyright (C) 2003
+ *
+ * $Id: Polygon.java,v 1.1 2005-01-09 22:35:31 cawe Exp $
+ */
+/*
+Copyright (C) 1997-2001 Id Software, Inc.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+package jake2.render.lwjgl;
+
+import java.nio.FloatBuffer;
+
+import jake2.Defines;
+import jake2.render.glpoly_t;
+import jake2.util.Lib;
+
+/**
+ * Polygon
+ *
+ * @author cwei
+ */
+public final class Polygon extends glpoly_t {
+
+ private final static int MAX_POLYS = 20000;
+ private final static int MAX_BUFFER_VERTICES = 120000;
+
+ // backup for s1 scrolling
+ private static float[] s1_old = new float[MAX_VERTICES];
+
+ private static FloatBuffer buffer = Lib.newFloatBuffer(MAX_BUFFER_VERTICES * STRIDE);
+ private static int bufferIndex = 0;
+ private static int polyCount = 0;
+ private static Polygon[] polyCache = new Polygon[MAX_POLYS];
+ static {
+ for (int i = 0; i < polyCache.length; i++) {
+ polyCache[i] = new Polygon();
+ }
+ }
+
+ static glpoly_t create(int numverts) {
+ Polygon poly = polyCache[polyCount++];
+ poly.clear();
+ poly.numverts = numverts;
+ poly.pos = bufferIndex;
+ bufferIndex += numverts;
+ return poly;
+ }
+
+ static void reset() {
+ polyCount = 0;
+ bufferIndex = 0;
+ }
+
+ static FloatBuffer getInterleavedBuffer() {
+ return (FloatBuffer)buffer.rewind();
+ }
+
+ private Polygon() {
+ }
+
+ private final void clear() {
+ next = null;
+ chain = null;
+ numverts = 0;
+ flags = 0;
+ }
+
+ // the interleaved buffer has the format:
+ // textureCoord0 (index 0, 1)
+ // vertex (index 2, 3, 4)
+ // textureCoord1 (index 5, 6)
+
+ public final float x(int index) {
+ return buffer.get((index + pos) * 7 + 2);
+ }
+
+ public final void x(int index, float value) {
+ buffer.put((index + pos) * 7 + 2, value);
+ }
+
+ public final float y(int index) {
+ return buffer.get((index + pos) * 7 + 3);
+ }
+
+ public final void y(int index, float value) {
+ buffer.put((index + pos) * 7 + 3, value);
+ }
+
+ public final float z(int index) {
+ return buffer.get((index + pos) * 7 + 4);
+ }
+
+ public final void z(int index, float value) {
+ buffer.put((index + pos) * 7 + 4, value);
+ }
+
+ public final float s1(int index) {
+ return buffer.get((index + pos) * 7 + 0);
+ }
+
+ public final void s1(int index, float value) {
+ buffer.put((index + pos) * 7 + 0, value);
+ }
+
+ public final float t1(int index) {
+ return buffer.get((index + pos) * 7 + 1);
+ }
+
+ public final void t1(int index, float value) {
+ buffer.put((index + pos) * 7 + 1, value);
+ }
+
+ public final float s2(int index) {
+ return buffer.get((index + pos) * 7 + 5);
+ }
+
+ public final void s2(int index, float value) {
+ buffer.put((index + pos) * 7 + 5, value);
+ }
+
+ public final float t2(int index) {
+ return buffer.get((index + pos) * 7 + 6);
+ }
+
+ public final void t2(int index, float value) {
+ buffer.put((index + pos) * 7 + 6, value);
+ }
+
+ public final void beginScrolling(float scroll) {
+ int index = pos * 7;
+ for (int i = 0; i < numverts; i++, index+=7) {
+ scroll += s1_old[i] = buffer.get(index);
+ buffer.put(index, scroll);
+ }
+ }
+
+ public final void endScrolling() {
+ int index = pos * 7;
+ for (int i = 0; i < numverts; i++, index+=7) {
+ buffer.put(index, s1_old[i]);
+ }
+ }
+} \ No newline at end of file