diff options
author | Carsten Weisse <[email protected]> | 2005-01-09 22:36:31 +0000 |
---|---|---|
committer | Carsten Weisse <[email protected]> | 2005-01-09 22:36:31 +0000 |
commit | 2fb37c78fb3ef89482b20b0521e6f1c63bba36c3 (patch) | |
tree | adbb88f3114984c42910a8608e37c3570cf8f9e1 /src/jake2 | |
parent | 1e005eacf3cd42609500e1953803029967a1f366 (diff) |
the Polygon implementation (FloatBuffer as backbuffer) and the changes to use the interface
Diffstat (limited to 'src/jake2')
-rw-r--r-- | src/jake2/render/fastjogl/Model.java | 5 | ||||
-rw-r--r-- | src/jake2/render/fastjogl/Polygon.java | 160 | ||||
-rw-r--r-- | src/jake2/render/fastjogl/Surf.java | 133 | ||||
-rw-r--r-- | src/jake2/render/fastjogl/Warp.java | 63 | ||||
-rw-r--r-- | src/jake2/render/lwjgl/Model.java | 8 | ||||
-rw-r--r-- | src/jake2/render/lwjgl/Polygon.java | 160 | ||||
-rw-r--r-- | src/jake2/render/lwjgl/Surf.java | 169 | ||||
-rw-r--r-- | src/jake2/render/lwjgl/Warp.java | 130 |
8 files changed, 513 insertions, 315 deletions
diff --git a/src/jake2/render/fastjogl/Model.java b/src/jake2/render/fastjogl/Model.java index 080f6dd..a5bcd5b 100644 --- a/src/jake2/render/fastjogl/Model.java +++ b/src/jake2/render/fastjogl/Model.java @@ -2,7 +2,7 @@ * Model.java * Copyright (C) 2003 * - * $Id: Model.java,v 1.5 2004-09-22 19:22:10 salomo Exp $ + * $Id: Model.java,v 1.6 2005-01-09 22:36:31 cawe Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -1089,7 +1089,8 @@ public abstract class Model extends Surf { */ protected void R_BeginRegistration(String model) { resetModelArrays(); - resetPolygonArrays(); +// resetPolygonArrays(); + Polygon.reset(); cvar_t flushmap; diff --git a/src/jake2/render/fastjogl/Polygon.java b/src/jake2/render/fastjogl/Polygon.java new file mode 100644 index 0000000..6ccdda0 --- /dev/null +++ b/src/jake2/render/fastjogl/Polygon.java @@ -0,0 +1,160 @@ +/* + * Polygon.java + * Copyright (C) 2003 + * + * $Id: Polygon.java,v 1.1 2005-01-09 22:36: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.fastjogl; + +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 diff --git a/src/jake2/render/fastjogl/Surf.java b/src/jake2/render/fastjogl/Surf.java index e15e1d8..752d83f 100644 --- a/src/jake2/render/fastjogl/Surf.java +++ b/src/jake2/render/fastjogl/Surf.java @@ -2,7 +2,7 @@ * Surf.java * Copyright (C) 2003 * - * $Id: Surf.java,v 1.5 2004-09-22 19:22:11 salomo Exp $ + * $Id: Surf.java,v 1.6 2005-01-09 22:36:31 cawe Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -172,22 +172,14 @@ public abstract class Surf extends Draw { * scrolling texture ================ */ void DrawGLFlowingPoly(glpoly_t p) { - int i; - float scroll; - - scroll = -64 + float scroll = -64 * ((r_newrefdef.time / 40.0f) - (int) (r_newrefdef.time / 40.0f)); if (scroll == 0.0f) scroll = -64.0f; - FloatBuffer texCoord = globalPolygonInterleavedBuf; - float[][] v = p.verts; - int index = p.pos * POLYGON_STRIDE; - for (i = 0; i < p.numverts; i++) { - texCoord.put(index, v[i][3] + scroll); - index += POLYGON_STRIDE; - } + p.beginScrolling(scroll); gl.glDrawArrays(GL.GL_POLYGON, p.pos, p.numverts); + p.endScrolling(); } // PGM @@ -197,28 +189,22 @@ public abstract class Surf extends Draw { * * R_DrawTriangleOutlines */ void R_DrawTriangleOutlines() { - int i, j; - glpoly_t p; - - if (gl_showtris.value == 0) + if (gl_showtris.value == 0) return; gl.glDisable(GL.GL_TEXTURE_2D); gl.glDisable(GL.GL_DEPTH_TEST); gl.glColor4f(1, 1, 1, 1); - for (i = 0; i < MAX_LIGHTMAPS; i++) { - msurface_t surf; - - for (surf = gl_lms.lightmap_surfaces[i]; surf != null; surf = surf.lightmapchain) { - p = surf.polys; - for (; p != null; p = p.chain) { - for (j = 2; j < p.numverts; j++) { + for (int i = 0; i < MAX_LIGHTMAPS; i++) { + for (msurface_t surf = gl_lms.lightmap_surfaces[i]; surf != null; surf = surf.lightmapchain) { + for (glpoly_t p = surf.polys; p != null; p = p.chain) { + for (int j = 2; j < p.numverts; j++) { gl.glBegin(GL.GL_LINE_STRIP); - gl.glVertex3fv(p.verts[0]); - gl.glVertex3fv(p.verts[j - 1]); - gl.glVertex3fv(p.verts[j]); - gl.glVertex3fv(p.verts[0]); + gl.glVertex3f(p.x(0), p.y(0), p.z(0)); + gl.glVertex3f(p.x(j-1), p.y(j-1), p.z(j-1)); + gl.glVertex3f(p.x(j), p.y(j), p.z(j)); + gl.glVertex3f(p.x(0), p.y(0), p.z(0)); gl.glEnd(); } } @@ -351,7 +337,7 @@ public abstract class Surf extends Draw { // so scale it back down intens = gl_state.inverse_intensity; - gl.glInterleavedArrays(GL.GL_T2F_V3F, POLYGON_BYTE_STRIDE, + gl.glInterleavedArrays(GL.GL_T2F_V3F, Polygon.BYTE_STRIDE, globalPolygonInterleavedBuf); for (s = r_alpha_surfaces; s != null; s = s.texturechain) { @@ -519,13 +505,9 @@ public abstract class Surf extends Draw { scroll = -64.0f; for (p = surf.polys; p != null; p = p.chain) { - v = p.verts; - index = p.pos * POLYGON_STRIDE; - for (i = 0; i < p.numverts; i++) { - texCoord.put(index, v[i][3] + scroll); - index += POLYGON_STRIDE; - } + p.beginScrolling(scroll); gl.glDrawArrays(GL.GL_POLYGON, p.pos, p.numverts); + p.endScrolling(); } } else { for (p = surf.polys; p != null; p = p.chain) { @@ -551,13 +533,9 @@ public abstract class Surf extends Draw { scroll = -64.0f; for (p = surf.polys; p != null; p = p.chain) { - v = p.verts; - index = p.pos * POLYGON_STRIDE; - for (i = 0; i < p.numverts; i++) { - texCoord.put(index, v[i][3] + scroll); - index += POLYGON_STRIDE; - } + p.beginScrolling(scroll); gl.glDrawArrays(GL.GL_POLYGON, p.pos, p.numverts); + p.endScrolling(); } } else { // PGM @@ -702,11 +680,11 @@ public abstract class Surf extends Draw { GL_EnableMultitexture(true); GL_SelectTexture(GL_TEXTURE0); GL_TexEnv(GL.GL_REPLACE); - gl.glInterleavedArrays(GL.GL_T2F_V3F, POLYGON_BYTE_STRIDE, + gl.glInterleavedArrays(GL.GL_T2F_V3F, Polygon.BYTE_STRIDE, globalPolygonInterleavedBuf); GL_SelectTexture(GL_TEXTURE1); GL_TexEnv(GL.GL_MODULATE); - gl.glTexCoordPointer(2, GL.GL_FLOAT, POLYGON_BYTE_STRIDE, + gl.glTexCoordPointer(2, GL.GL_FLOAT, Polygon.BYTE_STRIDE, globalPolygonTexCoord1Buf); gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY); @@ -875,10 +853,10 @@ public abstract class Surf extends Draw { GL_SelectTexture(GL_TEXTURE0); GL_TexEnv(GL.GL_REPLACE); - gl.glInterleavedArrays(GL.GL_T2F_V3F, POLYGON_BYTE_STRIDE, + gl.glInterleavedArrays(GL.GL_T2F_V3F, Polygon.BYTE_STRIDE, globalPolygonInterleavedBuf); GL_SelectTexture(GL_TEXTURE1); - gl.glTexCoordPointer(2, GL.GL_FLOAT, POLYGON_BYTE_STRIDE, + gl.glTexCoordPointer(2, GL.GL_FLOAT, Polygon.BYTE_STRIDE, globalPolygonTexCoord1Buf); gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY); @@ -1074,7 +1052,6 @@ public abstract class Surf extends Draw { int vertpage; float[] vec; float s, t; - glpoly_t poly; float[] total = { 0, 0, 0 }; // reconstruct the polygon @@ -1086,14 +1063,11 @@ public abstract class Surf extends Draw { // // draw texture // - // poly = Hunk_Alloc (sizeof(glpoly_t) + (lnumverts-4) * - // VERTEXSIZE*sizeof(float)); - poly = new glpoly_t(lnumverts); + glpoly_t poly = Polygon.create(lnumverts); poly.next = fa.polys; poly.flags = fa.flags; fa.polys = poly; - poly.numverts = lnumverts; for (i = 0; i < lnumverts; i++) { lindex = currentmodel.surfedges[fa.firstedge + i]; @@ -1114,9 +1088,11 @@ public abstract class Surf extends Draw { t /= fa.texinfo.image.height; Math3D.VectorAdd(total, vec, total); - Math3D.VectorCopy(vec, poly.verts[i]); - poly.verts[i][3] = s; - poly.verts[i][4] = t; + poly.x(i, vec[0]); + poly.y(i, vec[1]); + poly.z(i, vec[2]); + poly.s1(i, s); + poly.t1(i, t); // // lightmap texture coordinates @@ -1135,14 +1111,9 @@ public abstract class Surf extends Draw { t += 8; t /= BLOCK_HEIGHT * 16; //fa.texinfo.texture.height; - poly.verts[i][5] = s; - poly.verts[i][6] = t; + poly.s2(i, s); + poly.t2(i, t); } - - poly.numverts = lnumverts; - - precompilePolygon(poly); - } /* @@ -1284,55 +1255,19 @@ public abstract class Surf extends Draw { } /* - * new functions for vertex array handling + * new buffers for vertex array handling */ - static final int POLYGON_BUFFER_SIZE = 120000; - - static final int POLYGON_STRIDE = 7; - - static final int POLYGON_BYTE_STRIDE = POLYGON_STRIDE - * BufferUtils.SIZEOF_FLOAT; - - static FloatBuffer globalPolygonInterleavedBuf = BufferUtils - .newFloatBuffer(POLYGON_BUFFER_SIZE * 7); + static FloatBuffer globalPolygonInterleavedBuf = Polygon.getInterleavedBuffer(); static FloatBuffer globalPolygonTexCoord1Buf = null; static { - globalPolygonInterleavedBuf.position(POLYGON_STRIDE - 2); + globalPolygonInterleavedBuf.position(Polygon.STRIDE - 2); globalPolygonTexCoord1Buf = globalPolygonInterleavedBuf.slice(); globalPolygonInterleavedBuf.position(0); }; - void precompilePolygon(glpoly_t p) { - - p.pos = globalPolygonInterleavedBuf.position() / POLYGON_STRIDE; - - float[] v; - FloatBuffer buffer = globalPolygonInterleavedBuf; - - for (int i = 0; i < p.verts.length; i++) { - v = p.verts[i]; - // textureCoord0 - buffer.put(v[3]); - buffer.put(v[4]); - - // vertex - buffer.put(v[0]); - buffer.put(v[1]); - buffer.put(v[2]); - - // textureCoord1 - buffer.put(v[5]); - buffer.put(v[6]); - } - } - - public static void resetPolygonArrays() { - globalPolygonInterleavedBuf.rewind(); - } - - //ImageFrame frame; + //ImageFrame frame; // void debugLightmap(byte[] buf, int w, int h, float scale) { // IntBuffer pix = diff --git a/src/jake2/render/fastjogl/Warp.java b/src/jake2/render/fastjogl/Warp.java index ca4e42e..bfaf6b4 100644 --- a/src/jake2/render/fastjogl/Warp.java +++ b/src/jake2/render/fastjogl/Warp.java @@ -2,7 +2,7 @@ * Warp.java * Copyright (C) 2003 * - * $Id: Warp.java,v 1.4 2004-09-22 19:22:11 salomo Exp $ + * $Id: Warp.java,v 1.5 2005-01-09 22:36:30 cawe Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -200,16 +200,17 @@ public abstract class Warp extends Model { // VERTEXSIZE*sizeof(float)); // init polys - glpoly_t poly = new glpoly_t(numverts + 2); + glpoly_t poly = Polygon.create(numverts + 2); poly.next = warpface.polys; warpface.polys = poly; - poly.numverts = numverts + 2; Math3D.VectorClear(total); total_s = 0; total_t = 0; for (i = 0; i < numverts; i++) { - Math3D.VectorCopy(verts[i], poly.verts[i + 1]); + poly.x(i + 1, verts[i][0]); + poly.y(i + 1, verts[i][1]); + poly.z(i + 1, verts[i][2]); s = Math3D.DotProduct(verts[i], warpface.texinfo.vecs[0]); t = Math3D.DotProduct(verts[i], warpface.texinfo.vecs[1]); @@ -217,19 +218,25 @@ public abstract class Warp extends Model { total_t += t; Math3D.VectorAdd(total, verts[i], total); - poly.verts[i + 1][3] = s; - poly.verts[i + 1][4] = t; + poly.s1(i + 1, s); + poly.t1(i + 1, t); } - - Math3D.VectorScale(total, (1.0f / numverts), poly.verts[0]); - poly.verts[0][3] = total_s / numverts; - poly.verts[0][4] = total_t / numverts; + + float scale = 1.0f / numverts; + poly.x(0, total[0] * scale); + poly.y(0, total[1] * scale); + poly.z(0, total[2] * scale); + poly.s1(0, total_s * scale); + poly.t1(0, total_t * scale); // memcpy (poly.verts[i+1], poly.verts[1], sizeof(poly.verts[0])); - System.arraycopy(poly.verts[1], 0, poly.verts[i + 1], 0, - poly.verts[1].length); // :-) - - precompilePolygon(poly); + poly.x(i + 1, poly.x(1)); + poly.y(i + 1, poly.y(1)); + poly.z(i + 1, poly.z(1)); + poly.s1(i + 1, poly.s1(1)); + poly.t1(i + 1, poly.t1(1)); + poly.s2(i + 1, poly.s2(1)); + poly.t2(i + 1, poly.t2(1)); } /* @@ -282,7 +289,6 @@ public abstract class Warp extends Model { */ void EmitWaterPolys(msurface_t fa) { glpoly_t p, bp; - float[] v; int i; float s = 0; float t = 0; @@ -296,16 +302,13 @@ public abstract class Warp extends Model { else scroll = 0; - int index; - FloatBuffer texCoord = globalPolygonInterleavedBuf; for (bp = fa.polys; bp != null; bp = bp.next) { p = bp; - index = p.pos * POLYGON_STRIDE; + gl.glBegin(GL.GL_TRIANGLE_FAN); for (i = 0; i < p.numverts; i++) { - v = p.verts[i]; - os = v[3]; - ot = v[4]; + os = p.s1(i); + ot = p.t1(i); s = os + Warp.SIN[(int) ((ot * 0.125f + r_newrefdef.time) * TURBSCALE) & 255]; @@ -316,11 +319,10 @@ public abstract class Warp extends Model { + Warp.SIN[(int) ((os * 0.125f + rdt) * TURBSCALE) & 255]; t *= (1.0f / 64); - texCoord.put(index, s); - texCoord.put(index + 1, t); - index += POLYGON_STRIDE; + gl.glTexCoord2f(s, t); + gl.glVertex3f(p.x(i), p.y(i), p.z(i)); } - gl.glDrawArrays(GL.GL_TRIANGLE_FAN, p.pos, p.numverts); + gl.glEnd(); } } @@ -521,13 +523,12 @@ public abstract class Warp extends Model { * ================= R_AddSkySurface ================= */ void R_AddSkySurface(msurface_t fa) { - int i; - glpoly_t p; - // calculate vertex values for sky box - for (p = fa.polys; p != null; p = p.next) { - for (i = 0; i < p.numverts; i++) { - Math3D.VectorSubtract(p.verts[i], r_origin, verts[i]); + for (glpoly_t p = fa.polys; p != null; p = p.next) { + for (int i = 0; i < p.numverts; i++) { + verts[i][0] = p.x(i) - r_origin[0]; + verts[i][1] = p.y(i) - r_origin[1]; + verts[i][2] = p.z(i) - r_origin[2]; } ClipSkyPolygon(p.numverts, verts, 0); } diff --git a/src/jake2/render/lwjgl/Model.java b/src/jake2/render/lwjgl/Model.java index bdfbd81..3b32767 100644 --- a/src/jake2/render/lwjgl/Model.java +++ b/src/jake2/render/lwjgl/Model.java @@ -2,7 +2,7 @@ * Model.java * Copyright (C) 2003 * - * $Id: Model.java,v 1.3 2004-12-16 21:55:58 cawe Exp $ + * $Id: Model.java,v 1.4 2005-01-09 22:35:31 cawe Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -1172,8 +1172,8 @@ public abstract class Model extends Surf { protected void R_BeginRegistration(String model) { resetModelArrays(); - resetPolygonArrays(); - + Polygon.reset(); + cvar_t flushmap; registration_sequence++; @@ -1261,8 +1261,6 @@ public abstract class Model extends Surf { } } GL_FreeUnusedImages(); - resetPolygonArrays(); - //modelMemoryUsage(); } 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 diff --git a/src/jake2/render/lwjgl/Surf.java b/src/jake2/render/lwjgl/Surf.java index f76d011..8104a87 100644 --- a/src/jake2/render/lwjgl/Surf.java +++ b/src/jake2/render/lwjgl/Surf.java @@ -2,7 +2,7 @@ * Surf.java * Copyright (C) 2003 * - * $Id: Surf.java,v 1.4 2004-12-16 21:55:58 cawe Exp $ + * $Id: Surf.java,v 1.5 2005-01-09 22:35:31 cawe Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -47,6 +47,8 @@ import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.util.Arrays; +import net.java.games.jogl.GL; + import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; @@ -174,15 +176,9 @@ public abstract class Surf extends Draw { scroll = -64 * ( (r_newrefdef.time / 40.0f) - (int)(r_newrefdef.time / 40.0f) ); if(scroll == 0.0f) scroll = -64.0f; - - FloatBuffer texCoord = globalPolygonInterleavedBuf; - float[][] v = p.verts; - int index = p.pos * POLYGON_STRIDE; - for (i=0 ; i<p.numverts ; i++) { - texCoord.put(index, v[i][3] + scroll); - index += POLYGON_STRIDE; - } + p.beginScrolling(scroll); gl.glDrawArrays(GL11.GL_POLYGON, p.pos, p.numverts); + p.endScrolling(); } // PGM // ============ @@ -192,45 +188,30 @@ public abstract class Surf extends Draw { */ void R_DrawTriangleOutlines() { - int i, j; - glpoly_t p; - - if (gl_showtris.value == 0) - return; - - gl.glDisable (GL11.GL_TEXTURE_2D); - gl.glDisable (GL11.GL_DEPTH_TEST); - gl.glColor4f (1,1,1,1); - - for (i=0 ; i<MAX_LIGHTMAPS ; i++) - { - msurface_t surf; - - for ( surf = gl_lms.lightmap_surfaces[i]; surf != null; surf = surf.lightmapchain ) - { - p = surf.polys; - for ( ; p != null ; p=p.chain) - { - for (j=2 ; j<p.numverts ; j++ ) - { - float[] pverts0=p.verts[0]; - float[] pvertsjm1=p.verts[j-1]; - float[] pvertsj=p.verts[j]; - - - gl.glBegin (GL11.GL_LINE_STRIP); - gl.glVertex3f (pverts0[0],pverts0[1],pverts0[2]); - gl.glVertex3f (pvertsjm1[0],pvertsjm1[1],pvertsjm1[2]); - gl.glVertex3f (pvertsj[0],pvertsj[1],pvertsj[2]); - gl.glVertex3f (pverts0[0],pverts0[1],pverts0[2]); - gl.glEnd (); - } - } - } - } - - gl.glEnable (GL11.GL_DEPTH_TEST); - gl.glEnable (GL11.GL_TEXTURE_2D); + if (gl_showtris.value == 0) + return; + + gl.glDisable(GL11.GL_TEXTURE_2D); + gl.glDisable(GL11.GL_DEPTH_TEST); + gl.glColor4f(1, 1, 1, 1); + + for (int i = 0; i < MAX_LIGHTMAPS; i++) { + for (msurface_t surf = gl_lms.lightmap_surfaces[i]; surf != null; surf = surf.lightmapchain) { + for (glpoly_t p = surf.polys; p != null; p = p.chain) { + for (int j = 2; j < p.numverts; j++) { + gl.glBegin(GL11.GL_LINE_STRIP); + gl.glVertex3f(p.x(0), p.y(0), p.z(0)); + gl.glVertex3f(p.x(j-1), p.y(j-1), p.z(j-1)); + gl.glVertex3f(p.x(j), p.y(j), p.z(j)); + gl.glVertex3f(p.x(0), p.y(0), p.z(0)); + gl.glEnd(); + } + } + } + } + + gl.glEnable(GL11.GL_DEPTH_TEST); + gl.glEnable(GL11.GL_TEXTURE_2D); } private IntBuffer temp2 = Lib.newIntBuffer(34 * 34, ByteOrder.LITTLE_ENDIAN); @@ -375,7 +356,7 @@ public abstract class Surf extends Draw { // so scale it back down intens = gl_state.inverse_intensity; - gl.glInterleavedArrays(GL11.GL_T2F_V3F, POLYGON_BYTE_STRIDE, globalPolygonInterleavedBuf); + gl.glInterleavedArrays(GL11.GL_T2F_V3F, Polygon.BYTE_STRIDE, globalPolygonInterleavedBuf); for (s=r_alpha_surfaces ; s != null ; s=s.texturechain) { @@ -557,13 +538,9 @@ public abstract class Surf extends Draw { for ( p = surf.polys; p != null; p = p.chain ) { - v = p.verts; - index = p.pos * POLYGON_STRIDE; - for (i=0 ; i<p.numverts ; i++) { - texCoord.put(index, v[i][3] + scroll); - index += POLYGON_STRIDE; - } + p.beginScrolling(scroll); gl.glDrawArrays(GL11.GL_POLYGON, p.pos, p.numverts); + p.endScrolling(); } } else @@ -595,13 +572,9 @@ public abstract class Surf extends Draw { for ( p = surf.polys; p != null; p = p.chain ) { - v = p.verts; - index = p.pos * POLYGON_STRIDE; - for (i=0 ; i<p.numverts ; i++) { - texCoord.put(index, v[i][3] + scroll); - index += POLYGON_STRIDE; - } + p.beginScrolling(scroll); gl.glDrawArrays(GL11.GL_POLYGON, p.pos, p.numverts); + p.endScrolling(); } } else @@ -766,10 +739,10 @@ public abstract class Surf extends Draw { GL_EnableMultitexture( true ); GL_SelectTexture(GL_TEXTURE0); GL_TexEnv( GL11.GL_REPLACE ); - gl.glInterleavedArrays(GL11.GL_T2F_V3F, POLYGON_BYTE_STRIDE, globalPolygonInterleavedBuf); + gl.glInterleavedArrays(GL11.GL_T2F_V3F, Polygon.BYTE_STRIDE, globalPolygonInterleavedBuf); GL_SelectTexture(GL_TEXTURE1); GL_TexEnv( GL11.GL_MODULATE ); - gl.glTexCoordPointer(2, POLYGON_BYTE_STRIDE, globalPolygonTexCoord1Buf); + gl.glTexCoordPointer(2, Polygon.BYTE_STRIDE, globalPolygonTexCoord1Buf); gl.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY); R_DrawInlineBModel(); @@ -956,9 +929,9 @@ public abstract class Surf extends Draw { GL_SelectTexture( GL_TEXTURE0); GL_TexEnv( GL11.GL_REPLACE ); - gl.glInterleavedArrays(GL11.GL_T2F_V3F, POLYGON_BYTE_STRIDE, globalPolygonInterleavedBuf); + gl.glInterleavedArrays(GL11.GL_T2F_V3F, Polygon.BYTE_STRIDE, globalPolygonInterleavedBuf); GL_SelectTexture( GL_TEXTURE1); - gl.glTexCoordPointer(2, POLYGON_BYTE_STRIDE, globalPolygonTexCoord1Buf); + gl.glTexCoordPointer(2, Polygon.BYTE_STRIDE, globalPolygonTexCoord1Buf); gl.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY); if ( gl_lightmap.value != 0) @@ -1182,7 +1155,6 @@ public abstract class Surf extends Draw { int vertpage; float[] vec; float s, t; - glpoly_t poly; float[] total = {0, 0, 0}; // reconstruct the polygon @@ -1195,12 +1167,11 @@ public abstract class Surf extends Draw { // draw texture // // poly = Hunk_Alloc (sizeof(glpoly_t) + (lnumverts-4) * VERTEXSIZE*sizeof(float)); - poly = new glpoly_t(lnumverts); + glpoly_t poly = Polygon.create(lnumverts); poly.next = fa.polys; poly.flags = fa.flags; fa.polys = poly; - poly.numverts = lnumverts; for (i=0 ; i<lnumverts ; i++) { @@ -1223,9 +1194,15 @@ public abstract class Surf extends Draw { t /= fa.texinfo.image.height; Math3D.VectorAdd (total, vec, total); - Math3D.VectorCopy (vec, poly.verts[i]); - poly.verts[i][3] = s; - poly.verts[i][4] = t; + //Math3D.VectorCopy (vec, poly.verts[i]); + poly.x(i, vec[0]); + poly.y(i, vec[1]); + poly.z(i, vec[2]); + + //poly.verts[i][3] = s; + //poly.verts[i][4] = t; + poly.s1(i, s); + poly.t1(i, t); // // lightmap texture coordinates @@ -1242,14 +1219,11 @@ public abstract class Surf extends Draw { t += 8; t /= BLOCK_HEIGHT*16; //fa.texinfo.texture.height; - poly.verts[i][5] = s; - poly.verts[i][6] = t; +// poly.verts[i][5] = s; +// poly.verts[i][6] = t; + poly.s2(i, s); + poly.t2(i, t); } - - poly.numverts = lnumverts; - - precompilePolygon(poly); - } /* @@ -1413,50 +1387,17 @@ public abstract class Surf extends Draw { } /* - * new functions for vertex array handling + * new buffers for vertex array handling */ - static final int POLYGON_BUFFER_SIZE = 120000; - static final int POLYGON_STRIDE = 7; - static final int POLYGON_BYTE_STRIDE = POLYGON_STRIDE * Lib.SIZEOF_FLOAT; - - static FloatBuffer globalPolygonInterleavedBuf = BufferUtils.createFloatBuffer(POLYGON_BUFFER_SIZE * 7); + static FloatBuffer globalPolygonInterleavedBuf = Polygon.getInterleavedBuffer(); static FloatBuffer globalPolygonTexCoord1Buf = null; static { - globalPolygonInterleavedBuf.position(POLYGON_STRIDE - 2); + globalPolygonInterleavedBuf.position(Polygon.STRIDE - 2); globalPolygonTexCoord1Buf = globalPolygonInterleavedBuf.slice(); globalPolygonInterleavedBuf.position(0); }; - void precompilePolygon(glpoly_t p) { - - p.pos = globalPolygonInterleavedBuf.position() / POLYGON_STRIDE; - - float[] v; - FloatBuffer buffer = globalPolygonInterleavedBuf; - - for (int i = 0; i < p.verts.length; i++) { - v = p.verts[i]; - // textureCoord0 - buffer.put(v[3]); - buffer.put(v[4]); - - // vertex - buffer.put(v[0]); - buffer.put(v[1]); - buffer.put(v[2]); - - // textureCoord1 - buffer.put(v[5]); - buffer.put(v[6]); - } - } - - public static void resetPolygonArrays() { - globalPolygonInterleavedBuf.rewind(); - globalPolygonTexCoord1Buf.rewind(); - } - //ImageFrame frame; // void debugLightmap(byte[] buf, int w, int h, float scale) { diff --git a/src/jake2/render/lwjgl/Warp.java b/src/jake2/render/lwjgl/Warp.java index fa7fd42..1c96980 100644 --- a/src/jake2/render/lwjgl/Warp.java +++ b/src/jake2/render/lwjgl/Warp.java @@ -2,7 +2,7 @@ * Warp.java * Copyright (C) 2003 * - * $Id: Warp.java,v 1.2 2004-12-14 12:56:59 cawe Exp $ + * $Id: Warp.java,v 1.3 2005-01-09 22:35:31 cawe Exp $ */ /* Copyright (C) 1997-2001 Id Software, Inc. @@ -35,6 +35,8 @@ import jake2.util.Math3D; import java.nio.FloatBuffer; +import net.java.games.jogl.GL; + import org.lwjgl.opengl.GL11; /** @@ -194,36 +196,43 @@ public abstract class Warp extends Model { // poly = Hunk_Alloc (sizeof(glpoly_t) + ((numverts-4)+2) * VERTEXSIZE*sizeof(float)); // init polys - glpoly_t poly = new glpoly_t(numverts + 2); + glpoly_t poly = Polygon.create(numverts + 2); poly.next = warpface.polys; warpface.polys = poly; - poly.numverts = numverts + 2; Math3D.VectorClear(total); total_s = 0; total_t = 0; - for (i=0 ; i<numverts ; i++) - { - Math3D.VectorCopy(verts[i], poly.verts[i+1]); - s = Math3D.DotProduct(verts[i], warpface.texinfo.vecs[0]); - t = Math3D.DotProduct(verts[i], warpface.texinfo.vecs[1]); - - total_s += s; - total_t += t; - Math3D.VectorAdd(total, verts[i], total); - - poly.verts[i+1][3] = s; - poly.verts[i+1][4] = t; - } - - Math3D.VectorScale(total, (1.0f/numverts), poly.verts[0]); - poly.verts[0][3] = total_s/numverts; - poly.verts[0][4] = total_t/numverts; - - // memcpy (poly.verts[i+1], poly.verts[1], sizeof(poly.verts[0])); - System.arraycopy(poly.verts[1], 0, poly.verts[i+1], 0, poly.verts[1].length); // :-) - - precompilePolygon(poly); + for (i = 0; i < numverts; i++) { + poly.x(i + 1, verts[i][0]); + poly.y(i + 1, verts[i][1]); + poly.z(i + 1, verts[i][2]); + s = Math3D.DotProduct(verts[i], warpface.texinfo.vecs[0]); + t = Math3D.DotProduct(verts[i], warpface.texinfo.vecs[1]); + + total_s += s; + total_t += t; + Math3D.VectorAdd(total, verts[i], total); + + poly.s1(i + 1, s); + poly.t1(i + 1, t); + } + + float scale = 1.0f / numverts; + poly.x(0, total[0] * scale); + poly.y(0, total[1] * scale); + poly.z(0, total[2] * scale); + poly.s1(0, total_s * scale); + poly.t1(0, total_t * scale); + + // memcpy (poly.verts[i+1], poly.verts[1], sizeof(poly.verts[0])); + poly.x(i + 1, poly.x(1)); + poly.y(i + 1, poly.y(1)); + poly.z(i + 1, poly.z(1)); + poly.s1(i + 1, poly.s1(1)); + poly.t1(i + 1, poly.t1(1)); + poly.s2(i + 1, poly.s2(1)); + poly.t2(i + 1, poly.t2(1)); } /* @@ -299,32 +308,28 @@ public abstract class Warp extends Model { else scroll = 0; - int index; - FloatBuffer texCoord = globalPolygonInterleavedBuf; - for (bp=fa.polys ; bp != null ; bp=bp.next) - { - p = bp; - - index = p.pos * POLYGON_STRIDE; - for (i=0; i<p.numverts ; i++) - { - v = p.verts[i]; - os = v[3]; - ot = v[4]; - - s = os + Warp.SIN[(int)((ot * 0.125f + r_newrefdef.time) * TURBSCALE) & 255]; - s += scroll; - s *= (1.0f/64); - - t = ot + Warp.SIN[(int)((os * 0.125f + rdt) * TURBSCALE) & 255]; - t *= (1.0f/64); - - texCoord.put(index, s); - texCoord.put(index + 1, t); - index += POLYGON_STRIDE; - } - gl.glDrawArrays(GL11.GL_TRIANGLE_FAN, p.pos, p.numverts); - } + for (bp = fa.polys; bp != null; bp = bp.next) { + p = bp; + + gl.glBegin(GL11.GL_TRIANGLE_FAN); + for (i = 0; i < p.numverts; i++) { + os = p.s1(i); + ot = p.t1(i); + + s = os + + Warp.SIN[(int) ((ot * 0.125f + r_newrefdef.time) * TURBSCALE) & 255]; + s += scroll; + s *= (1.0f / 64); + + t = ot + + Warp.SIN[(int) ((os * 0.125f + rdt) * TURBSCALE) & 255]; + t *= (1.0f / 64); + + gl.glTexCoord2f(s, t); + gl.glVertex3f(p.x(i), p.y(i), p.z(i)); + } + gl.glEnd(); + } } // =================================================================== @@ -554,19 +559,16 @@ public abstract class Warp extends Model { */ void R_AddSkySurface(msurface_t fa) { - int i; - glpoly_t p; - - // calculate vertex values for sky box - for (p=fa.polys ; p != null ; p=p.next) - { - for (i=0 ; i < p.numverts ; i++) - { - Math3D.VectorSubtract(p.verts[i], r_origin, verts[i]); - } - ClipSkyPolygon (p.numverts, verts, 0); - } - } + // calculate vertex values for sky box + for (glpoly_t p = fa.polys; p != null; p = p.next) { + for (int i = 0; i < p.numverts; i++) { + verts[i][0] = p.x(i) - r_origin[0]; + verts[i][1] = p.y(i) - r_origin[1]; + verts[i][2] = p.z(i) - r_origin[2]; + } + ClipSkyPolygon(p.numverts, verts, 0); + } + } /* |