diff options
Diffstat (limited to 'src/jake2/render/fastjogl/Surf.java')
-rw-r--r-- | src/jake2/render/fastjogl/Surf.java | 1288 |
1 files changed, 0 insertions, 1288 deletions
diff --git a/src/jake2/render/fastjogl/Surf.java b/src/jake2/render/fastjogl/Surf.java deleted file mode 100644 index 5c90ed4..0000000 --- a/src/jake2/render/fastjogl/Surf.java +++ /dev/null @@ -1,1288 +0,0 @@ -/* - * Surf.java - * Copyright (C) 2003 - * - * $Id: Surf.java,v 1.10 2005-06-08 21:27:09 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 jake2.Defines; -import jake2.client.*; -import jake2.game.cplane_t; -import jake2.qcommon.Com; -import jake2.render.*; -import jake2.util.*; -import jake2.util.Lib; -import jake2.util.Math3D; - -import java.nio.*; -import java.util.Arrays; - -import net.java.games.jogl.GL; -import net.java.games.jogl.util.BufferUtils; - -/** - * Surf - * - * @author cwei - */ -public abstract class Surf extends Draw { - - // GL_RSURF.C: surface-related refresh code - float[] modelorg = { 0, 0, 0 }; // relative to viewpoint - - msurface_t r_alpha_surfaces; - - static final int DYNAMIC_LIGHT_WIDTH = 128; - - static final int DYNAMIC_LIGHT_HEIGHT = 128; - - static final int LIGHTMAP_BYTES = 4; - - static final int BLOCK_WIDTH = 128; - - static final int BLOCK_HEIGHT = 128; - - static final int MAX_LIGHTMAPS = 128; - - int c_visible_lightmaps; - - int c_visible_textures; - - static final int GL_LIGHTMAP_FORMAT = GL.GL_RGBA; - - static class gllightmapstate_t { - int internal_format; - - int current_lightmap_texture; - - msurface_t[] lightmap_surfaces = new msurface_t[MAX_LIGHTMAPS]; - - int[] allocated = new int[BLOCK_WIDTH]; - - // the lightmap texture data needs to be kept in - // main memory so texsubimage can update properly - //byte[] lightmap_buffer = new byte[4 * BLOCK_WIDTH * BLOCK_HEIGHT]; - IntBuffer lightmap_buffer = Lib.newIntBuffer( - BLOCK_WIDTH * BLOCK_HEIGHT, ByteOrder.LITTLE_ENDIAN); - - public gllightmapstate_t() { - for (int i = 0; i < MAX_LIGHTMAPS; i++) - lightmap_surfaces[i] = new msurface_t(); - } - - public void clearLightmapSurfaces() { - for (int i = 0; i < MAX_LIGHTMAPS; i++) - // TODO lightmap_surfaces[i].clear(); - lightmap_surfaces[i] = new msurface_t(); - } - - } - - gllightmapstate_t gl_lms = new gllightmapstate_t(); - - // Model.java - abstract byte[] Mod_ClusterPVS(int cluster, model_t model); - - // Warp.java - abstract void R_DrawSkyBox(); - - abstract void R_AddSkySurface(msurface_t surface); - - abstract void R_ClearSkyBox(); - - abstract void EmitWaterPolys(msurface_t fa); - - // Light.java - abstract void R_MarkLights(dlight_t light, int bit, mnode_t node); - - abstract void R_SetCacheState(msurface_t surf); - - abstract void R_BuildLightMap(msurface_t surf, IntBuffer dest, int stride); - - /* - * ============================================================= - * - * BRUSH MODELS - * - * ============================================================= - */ - - /* - * =============== R_TextureAnimation - * - * Returns the proper texture for a given time and base texture - * =============== - */ - image_t R_TextureAnimation(mtexinfo_t tex) { - int c; - - if (tex.next == null) - return tex.image; - - c = currententity.frame % tex.numframes; - while (c != 0) { - tex = tex.next; - c--; - } - - return tex.image; - } - - /* - * ================ DrawGLPoly ================ - */ - void DrawGLPoly(glpoly_t p) { - gl.glDrawArrays(GL.GL_POLYGON, p.pos, p.numverts); - } - - // ============ - // PGM - /* - * ================ DrawGLFlowingPoly -- version of DrawGLPoly that handles - * scrolling texture ================ - */ - void DrawGLFlowingPoly(glpoly_t p) { - float scroll = -64 - * ((r_newrefdef.time / 40.0f) - (int) (r_newrefdef.time / 40.0f)); - if (scroll == 0.0f) - scroll = -64.0f; - - p.beginScrolling(scroll); - gl.glDrawArrays(GL.GL_POLYGON, p.pos, p.numverts); - p.endScrolling(); - } - - // PGM - // ============ - - /* - * * R_DrawTriangleOutlines - */ - void R_DrawTriangleOutlines() { - 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 (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.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(GL.GL_DEPTH_TEST); - gl.glEnable(GL.GL_TEXTURE_2D); - } - - private IntBuffer temp2 = Lib - .newIntBuffer(34 * 34, ByteOrder.LITTLE_ENDIAN); - - /* - * ================ R_RenderBrushPoly ================ - */ - void R_RenderBrushPoly(msurface_t fa) { - int maps; - image_t image; - boolean is_dynamic = false; - - c_brush_polys++; - - image = R_TextureAnimation(fa.texinfo); - - if ((fa.flags & Defines.SURF_DRAWTURB) != 0) { - GL_Bind(image.texnum); - - // warp texture, no lightmaps - GL_TexEnv(GL.GL_MODULATE); - gl.glColor4f(gl_state.inverse_intensity, - gl_state.inverse_intensity, gl_state.inverse_intensity, - 1.0F); - EmitWaterPolys(fa); - GL_TexEnv(GL.GL_REPLACE); - - return; - } else { - GL_Bind(image.texnum); - GL_TexEnv(GL.GL_REPLACE); - } - - // ====== - // PGM - if ((fa.texinfo.flags & Defines.SURF_FLOWING) != 0) - DrawGLFlowingPoly(fa.polys); - else - DrawGLPoly(fa.polys); - // PGM - // ====== - - // ersetzt goto - boolean gotoDynamic = false; - /* - * * check for lightmap modification - */ - for (maps = 0; maps < Defines.MAXLIGHTMAPS - && fa.styles[maps] != (byte) 255; maps++) { - if (r_newrefdef.lightstyles[fa.styles[maps] & 0xFF].white != fa.cached_light[maps]) { - gotoDynamic = true; - break; - } - } - - // this is a hack from cwei - if (maps == 4) - maps--; - - // dynamic this frame or dynamic previously - if (gotoDynamic || (fa.dlightframe == r_framecount)) { - // label dynamic: - if (gl_dynamic.value != 0) { - if ((fa.texinfo.flags & (Defines.SURF_SKY - | Defines.SURF_TRANS33 | Defines.SURF_TRANS66 | Defines.SURF_WARP)) == 0) { - is_dynamic = true; - } - } - } - - if (is_dynamic) { - if (((fa.styles[maps] & 0xFF) >= 32 || fa.styles[maps] == 0) - && (fa.dlightframe != r_framecount)) { - // ist ersetzt durch temp2: unsigned temp[34*34]; - int smax, tmax; - - smax = (fa.extents[0] >> 4) + 1; - tmax = (fa.extents[1] >> 4) + 1; - - R_BuildLightMap(fa, temp2, smax); - R_SetCacheState(fa); - - GL_Bind(gl_state.lightmap_textures + fa.lightmaptexturenum); - - gl.glTexSubImage2D(GL.GL_TEXTURE_2D, 0, fa.light_s, fa.light_t, - smax, tmax, GL_LIGHTMAP_FORMAT, GL.GL_UNSIGNED_BYTE, - temp2); - - fa.lightmapchain = gl_lms.lightmap_surfaces[fa.lightmaptexturenum]; - gl_lms.lightmap_surfaces[fa.lightmaptexturenum] = fa; - } else { - fa.lightmapchain = gl_lms.lightmap_surfaces[0]; - gl_lms.lightmap_surfaces[0] = fa; - } - } else { - fa.lightmapchain = gl_lms.lightmap_surfaces[fa.lightmaptexturenum]; - gl_lms.lightmap_surfaces[fa.lightmaptexturenum] = fa; - } - } - - /* - * ================ R_DrawAlphaSurfaces - * - * Draw water surfaces and windows. The BSP tree is waled front to back, so - * unwinding the chain of alpha_surfaces will draw back to front, giving - * proper ordering. ================ - */ - void R_DrawAlphaSurfaces() { - msurface_t s; - float intens; - - // - // go back to the world matrix - // - gl.glLoadMatrixf(r_world_matrix); - - gl.glEnable(GL.GL_BLEND); - GL_TexEnv(GL.GL_MODULATE); - - // the textures are prescaled up for a better lighting range, - // so scale it back down - intens = gl_state.inverse_intensity; - - gl.glInterleavedArrays(GL.GL_T2F_V3F, Polygon.BYTE_STRIDE, - globalPolygonInterleavedBuf); - - for (s = r_alpha_surfaces; s != null; s = s.texturechain) { - GL_Bind(s.texinfo.image.texnum); - c_brush_polys++; - if ((s.texinfo.flags & Defines.SURF_TRANS33) != 0) - gl.glColor4f(intens, intens, intens, 0.33f); - else if ((s.texinfo.flags & Defines.SURF_TRANS66) != 0) - gl.glColor4f(intens, intens, intens, 0.66f); - else - gl.glColor4f(intens, intens, intens, 1); - if ((s.flags & Defines.SURF_DRAWTURB) != 0) - EmitWaterPolys(s); - else if ((s.texinfo.flags & Defines.SURF_FLOWING) != 0) // PGM - // 9/16/98 - DrawGLFlowingPoly(s.polys); // PGM - else - DrawGLPoly(s.polys); - } - - GL_TexEnv(GL.GL_REPLACE); - gl.glColor4f(1, 1, 1, 1); - gl.glDisable(GL.GL_BLEND); - - r_alpha_surfaces = null; - } - - /* - * ================ DrawTextureChains ================ - */ - void DrawTextureChains() { - int i; - msurface_t s; - image_t image; - - c_visible_textures = 0; - - for (i = 0; i < numgltextures; i++) { - image = gltextures[i]; - - if (image.registration_sequence == 0) - continue; - if (image.texturechain == null) - continue; - c_visible_textures++; - - for (s = image.texturechain; s != null; s = s.texturechain) { - if ((s.flags & Defines.SURF_DRAWTURB) == 0) - R_RenderBrushPoly(s); - } - } - - GL_EnableMultitexture(false); - for (i = 0; i < numgltextures; i++) { - image = gltextures[i]; - - if (image.registration_sequence == 0) - continue; - s = image.texturechain; - if (s == null) - continue; - - for (; s != null; s = s.texturechain) { - if ((s.flags & Defines.SURF_DRAWTURB) != 0) - R_RenderBrushPoly(s); - } - - image.texturechain = null; - } - - GL_TexEnv(GL.GL_REPLACE); - } - - // direct buffer - private IntBuffer temp = Lib.newIntBuffer(128 * 128, - ByteOrder.LITTLE_ENDIAN); - - void GL_RenderLightmappedPoly(msurface_t surf) { - int i, nv = surf.polys.numverts; - int map = 0; - int index; - float[][] v; - FloatBuffer texCoord = globalPolygonInterleavedBuf; - image_t image = R_TextureAnimation(surf.texinfo); - boolean is_dynamic = false; - int lmtex = surf.lightmaptexturenum; - glpoly_t p; - - // ersetzt goto - boolean gotoDynamic = false; - - for (map = 0; map < Defines.MAXLIGHTMAPS - && (surf.styles[map] != (byte) 255); map++) { - if (r_newrefdef.lightstyles[surf.styles[map] & 0xFF].white != surf.cached_light[map]) { - gotoDynamic = true; - break; - } - } - - // this is a hack from cwei - if (map == 4) - map--; - - // dynamic this frame or dynamic previously - if (gotoDynamic || (surf.dlightframe == r_framecount)) { - // label dynamic: - if (gl_dynamic.value != 0) { - if ((surf.texinfo.flags & (Defines.SURF_SKY - | Defines.SURF_TRANS33 | Defines.SURF_TRANS66 | Defines.SURF_WARP)) == 0) { - is_dynamic = true; - } - } - } - - if (is_dynamic) { - // ist raus gezogen worden int[] temp = new int[128*128]; - int smax, tmax; - - if (((surf.styles[map] & 0xFF) >= 32 || surf.styles[map] == 0) - && (surf.dlightframe != r_framecount)) { - smax = (surf.extents[0] >> 4) + 1; - tmax = (surf.extents[1] >> 4) + 1; - - R_BuildLightMap(surf, temp, smax); - R_SetCacheState(surf); - - GL_MBind(GL_TEXTURE1, gl_state.lightmap_textures - + surf.lightmaptexturenum); - - lmtex = surf.lightmaptexturenum; - - gl.glTexSubImage2D(GL.GL_TEXTURE_2D, 0, surf.light_s, - surf.light_t, smax, tmax, GL_LIGHTMAP_FORMAT, - GL.GL_UNSIGNED_BYTE, temp); - - } else { - smax = (surf.extents[0] >> 4) + 1; - tmax = (surf.extents[1] >> 4) + 1; - - R_BuildLightMap(surf, temp, smax); - - GL_MBind(GL_TEXTURE1, gl_state.lightmap_textures + 0); - - lmtex = 0; - - gl.glTexSubImage2D(GL.GL_TEXTURE_2D, 0, surf.light_s, - surf.light_t, smax, tmax, GL_LIGHTMAP_FORMAT, - GL.GL_UNSIGNED_BYTE, temp); - - } - - c_brush_polys++; - - GL_MBind(GL_TEXTURE0, image.texnum); - GL_MBind(GL_TEXTURE1, gl_state.lightmap_textures + lmtex); - - // ========== - // PGM - if ((surf.texinfo.flags & Defines.SURF_FLOWING) != 0) { - float scroll; - - scroll = -64 - * ((r_newrefdef.time / 40.0f) - (int) (r_newrefdef.time / 40.0f)); - if (scroll == 0.0f) - scroll = -64.0f; - - for (p = surf.polys; p != null; p = p.chain) { - p.beginScrolling(scroll); - gl.glDrawArrays(GL.GL_POLYGON, p.pos, p.numverts); - p.endScrolling(); - } - } else { - for (p = surf.polys; p != null; p = p.chain) { - gl.glDrawArrays(GL.GL_POLYGON, p.pos, p.numverts); - } - } - // PGM - // ========== - } else { - c_brush_polys++; - - GL_MBind(GL_TEXTURE0, image.texnum); - GL_MBind(GL_TEXTURE1, gl_state.lightmap_textures + lmtex); - - // ========== - // PGM - if ((surf.texinfo.flags & Defines.SURF_FLOWING) != 0) { - float scroll; - - scroll = -64 - * ((r_newrefdef.time / 40.0f) - (int) (r_newrefdef.time / 40.0f)); - if (scroll == 0.0) - scroll = -64.0f; - - for (p = surf.polys; p != null; p = p.chain) { - p.beginScrolling(scroll); - gl.glDrawArrays(GL.GL_POLYGON, p.pos, p.numverts); - p.endScrolling(); - } - } else { - // PGM - // ========== - for (p = surf.polys; p != null; p = p.chain) { - gl.glDrawArrays(GL.GL_POLYGON, p.pos, p.numverts); - } - - // ========== - // PGM - } - // PGM - // ========== - } - } - - /* - * ================= R_DrawInlineBModel ================= - */ - void R_DrawInlineBModel() { - int i, k; - cplane_t pplane; - float dot; - msurface_t psurf; - dlight_t lt; - - // calculate dynamic lighting for bmodel - if (gl_flashblend.value == 0) { - for (k = 0; k < r_newrefdef.num_dlights; k++) { - lt = r_newrefdef.dlights[k]; - R_MarkLights(lt, 1 << k, - currentmodel.nodes[currentmodel.firstnode]); - } - } - - // psurf = ¤tmodel->surfaces[currentmodel->firstmodelsurface]; - int psurfp = currentmodel.firstmodelsurface; - msurface_t[] surfaces; - surfaces = currentmodel.surfaces; - //psurf = surfaces[psurfp]; - - if ((currententity.flags & Defines.RF_TRANSLUCENT) != 0) { - gl.glEnable(GL.GL_BLEND); - gl.glColor4f(1, 1, 1, 0.25f); - GL_TexEnv(GL.GL_MODULATE); - } - - // - // draw texture - // - for (i = 0; i < currentmodel.nummodelsurfaces; i++) { - psurf = surfaces[psurfp++]; - // find which side of the node we are on - pplane = psurf.plane; - - dot = Math3D.DotProduct(modelorg, pplane.normal) - pplane.dist; - - // draw the polygon - if (((psurf.flags & Defines.SURF_PLANEBACK) != 0 && (dot < -BACKFACE_EPSILON)) - || ((psurf.flags & Defines.SURF_PLANEBACK) == 0 && (dot > BACKFACE_EPSILON))) { - if ((psurf.texinfo.flags & (Defines.SURF_TRANS33 | Defines.SURF_TRANS66)) != 0) { - // add to the translucent chain - psurf.texturechain = r_alpha_surfaces; - r_alpha_surfaces = psurf; - } else if ((psurf.flags & Defines.SURF_DRAWTURB) == 0) { - GL_RenderLightmappedPoly(psurf); - } else { - GL_EnableMultitexture(false); - R_RenderBrushPoly(psurf); - GL_EnableMultitexture(true); - } - } - } - - if ((currententity.flags & Defines.RF_TRANSLUCENT) != 0) { - gl.glDisable(GL.GL_BLEND); - gl.glColor4f(1, 1, 1, 1); - GL_TexEnv(GL.GL_REPLACE); - } - } - - /* - * ================= R_DrawBrushModel ================= - */ - void R_DrawBrushModel(entity_t e) { - if (currentmodel.nummodelsurfaces == 0) - return; - - currententity = e; - gl_state.currenttextures[0] = gl_state.currenttextures[1] = -1; - - float[] mins = Vec3Cache.get(); - float[] maxs = Vec3Cache.get(); - boolean rotated; - if (e.angles[0] != 0 || e.angles[1] != 0 || e.angles[2] != 0) { - rotated = true; - for (int i = 0; i < 3; i++) { - mins[i] = e.origin[i] - currentmodel.radius; - maxs[i] = e.origin[i] + currentmodel.radius; - } - } else { - rotated = false; - Math3D.VectorAdd(e.origin, currentmodel.mins, mins); - Math3D.VectorAdd(e.origin, currentmodel.maxs, maxs); - } - - if (R_CullBox(mins, maxs)) { - Vec3Cache.release(2); // mins, maxs - return; - } - - Vec3Cache.release(2); // mins, maxs - - gl.glColor3f(1, 1, 1); - - // memset (gl_lms.lightmap_surfaces, 0, - // sizeof(gl_lms.lightmap_surfaces)); - - // TODO wird beim multitexturing nicht gebraucht - //gl_lms.clearLightmapSurfaces(); - - Math3D.VectorSubtract(r_newrefdef.vieworg, e.origin, modelorg); - if (rotated) { - float[] temp = Vec3Cache.get(); - float[] forward = Vec3Cache.get(); - float[] right = Vec3Cache.get(); - float[] up = Vec3Cache.get(); - - Math3D.VectorCopy(modelorg, temp); - Math3D.AngleVectors(e.angles, forward, right, up); - modelorg[0] = Math3D.DotProduct(temp, forward); - modelorg[1] = -Math3D.DotProduct(temp, right); - modelorg[2] = Math3D.DotProduct(temp, up); - - Vec3Cache.release(4); // temp, forward, right, up - } - - gl.glPushMatrix(); - - e.angles[0] = -e.angles[0]; // stupid quake bug - e.angles[2] = -e.angles[2]; // stupid quake bug - R_RotateForEntity(e); - e.angles[0] = -e.angles[0]; // stupid quake bug - e.angles[2] = -e.angles[2]; // stupid quake bug - - GL_EnableMultitexture(true); - GL_SelectTexture(GL_TEXTURE0); - GL_TexEnv(GL.GL_REPLACE); - 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, - globalPolygonTexCoord1Buf); - gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY); - - R_DrawInlineBModel(); - - gl.glClientActiveTextureARB(GL_TEXTURE1); - gl.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY); - - GL_EnableMultitexture(false); - - gl.glPopMatrix(); - } - - /* - * ============================================================= - * - * WORLD MODEL - * - * ============================================================= - */ - - /* - * ================ R_RecursiveWorldNode ================ - */ - void R_RecursiveWorldNode(mnode_t node) { - int c, side, sidebit; - cplane_t plane; - msurface_t surf; - msurface_t mark; - mleaf_t pleaf; - float dot = 0; - image_t image; - - if (node.contents == Defines.CONTENTS_SOLID) - return; // solid - - if (node.visframe != r_visframecount) - return; - - if (R_CullBox(node.mins, node.maxs)) - return; - - // if a leaf node, draw stuff - if (node.contents != -1) { - pleaf = (mleaf_t) node; - - // check for door connected areas - if (r_newrefdef.areabits != null) { - if (((r_newrefdef.areabits[pleaf.area >> 3] & 0xFF) & (1 << (pleaf.area & 7))) == 0) - return; // not visible - } - - int markp = 0; - - mark = pleaf.getMarkSurface(markp); // first marked surface - c = pleaf.nummarksurfaces; - - if (c != 0) { - do { - mark.visframe = r_framecount; - mark = pleaf.getMarkSurface(++markp); // next surface - } while (--c != 0); - } - - return; - } - - // node is just a decision point, so go down the apropriate sides - - // find which side of the node we are on - plane = node.plane; - - switch (plane.type) { - case Defines.PLANE_X: - dot = modelorg[0] - plane.dist; - break; - case Defines.PLANE_Y: - dot = modelorg[1] - plane.dist; - break; - case Defines.PLANE_Z: - dot = modelorg[2] - plane.dist; - break; - default: - dot = Math3D.DotProduct(modelorg, plane.normal) - plane.dist; - break; - } - - if (dot >= 0.0f) { - side = 0; - sidebit = 0; - } else { - side = 1; - sidebit = Defines.SURF_PLANEBACK; - } - - // recurse down the children, front side first - R_RecursiveWorldNode(node.children[side]); - - // draw stuff - //for ( c = node.numsurfaces, surf = - // r_worldmodel.surfaces[node.firstsurface]; c != 0 ; c--, surf++) - for (c = 0; c < node.numsurfaces; c++) { - surf = r_worldmodel.surfaces[node.firstsurface + c]; - if (surf.visframe != r_framecount) - continue; - - if ((surf.flags & Defines.SURF_PLANEBACK) != sidebit) - continue; // wrong side - - if ((surf.texinfo.flags & Defines.SURF_SKY) != 0) { // just adds to - // visible sky - // bounds - R_AddSkySurface(surf); - } else if ((surf.texinfo.flags & (Defines.SURF_TRANS33 | Defines.SURF_TRANS66)) != 0) { - // add to the translucent chain - surf.texturechain = r_alpha_surfaces; - r_alpha_surfaces = surf; - } else { - if ((surf.flags & Defines.SURF_DRAWTURB) == 0) { - GL_RenderLightmappedPoly(surf); - } else { - // the polygon is visible, so add it to the texture - // sorted chain - // FIXME: this is a hack for animation - image = R_TextureAnimation(surf.texinfo); - surf.texturechain = image.texturechain; - image.texturechain = surf; - } - } - } - - // recurse down the back side - R_RecursiveWorldNode(node.children[1 - side]); - } - - /* - * ============= R_DrawWorld ============= - */ - private final entity_t worldEnt = new entity_t(); - - void R_DrawWorld() { - - if (r_drawworld.value == 0) - return; - - if ((r_newrefdef.rdflags & Defines.RDF_NOWORLDMODEL) != 0) - return; - - currentmodel = r_worldmodel; - - Math3D.VectorCopy(r_newrefdef.vieworg, modelorg); - - entity_t ent = worldEnt; - // auto cycle the world frame for texture animation - ent.clear(); - ent.frame = (int) (r_newrefdef.time * 2); - currententity = ent; - - gl_state.currenttextures[0] = gl_state.currenttextures[1] = -1; - - gl.glColor3f(1, 1, 1); - // memset (gl_lms.lightmap_surfaces, 0, - // sizeof(gl_lms.lightmap_surfaces)); - // TODO wird bei multitexture nicht gebraucht - //gl_lms.clearLightmapSurfaces(); - - R_ClearSkyBox(); - - GL_EnableMultitexture(true); - - GL_SelectTexture(GL_TEXTURE0); - GL_TexEnv(GL.GL_REPLACE); - gl.glInterleavedArrays(GL.GL_T2F_V3F, Polygon.BYTE_STRIDE, - globalPolygonInterleavedBuf); - GL_SelectTexture(GL_TEXTURE1); - gl.glTexCoordPointer(2, GL.GL_FLOAT, Polygon.BYTE_STRIDE, - globalPolygonTexCoord1Buf); - gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY); - - if (gl_lightmap.value != 0) - GL_TexEnv(GL.GL_REPLACE); - else - GL_TexEnv(GL.GL_MODULATE); - - R_RecursiveWorldNode(r_worldmodel.nodes[0]); // root node - - gl.glClientActiveTextureARB(GL_TEXTURE1); - gl.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY); - - GL_EnableMultitexture(false); - - DrawTextureChains(); - R_DrawSkyBox(); - R_DrawTriangleOutlines(); - } - - byte[] fatvis = new byte[Defines.MAX_MAP_LEAFS / 8]; - - /* - * =============== R_MarkLeaves - * - * Mark the leaves and nodes that are in the PVS for the current cluster - * =============== - */ - void R_MarkLeaves() { - //byte[] vis; - //byte[] fatvis = new byte[Defines.MAX_MAP_LEAFS / 8]; - - //Arrays.fill(fatvis, (byte)0); - - mnode_t node; - int i, c; - mleaf_t leaf; - int cluster; - - if (r_oldviewcluster == r_viewcluster - && r_oldviewcluster2 == r_viewcluster2 && r_novis.value == 0 - && r_viewcluster != -1) - return; - - // development aid to let you run around and see exactly where - // the pvs ends - if (gl_lockpvs.value != 0) - return; - - r_visframecount++; - r_oldviewcluster = r_viewcluster; - r_oldviewcluster2 = r_viewcluster2; - - if (r_novis.value != 0 || r_viewcluster == -1 - || r_worldmodel.vis == null) { - // mark everything - for (i = 0; i < r_worldmodel.numleafs; i++) - r_worldmodel.leafs[i].visframe = r_visframecount; - for (i = 0; i < r_worldmodel.numnodes; i++) - r_worldmodel.nodes[i].visframe = r_visframecount; - return; - } - - byte[] vis = Mod_ClusterPVS(r_viewcluster, r_worldmodel); - // may have to combine two clusters because of solid water boundaries - if (r_viewcluster2 != r_viewcluster) { - // memcpy (fatvis, vis, (r_worldmodel.numleafs+7)/8); - System - .arraycopy(vis, 0, fatvis, 0, - (r_worldmodel.numleafs + 7) >> 3); - vis = Mod_ClusterPVS(r_viewcluster2, r_worldmodel); - c = (r_worldmodel.numleafs + 31) >> 5; - c <<= 2; - for (int k = 0; k < c; k+=4) { - fatvis[k] |= vis[k]; - fatvis[k + 1] |= vis[k + 1]; - fatvis[k + 2] |= vis[k + 2]; - fatvis[k + 3] |= vis[k + 3]; - } - - vis = fatvis; - } - - for (i = 0; i < r_worldmodel.numleafs; i++) { - leaf = r_worldmodel.leafs[i]; - cluster = leaf.cluster; - if (cluster == -1) - continue; - if (((vis[cluster >> 3] & 0xFF) & (1 << (cluster & 7))) != 0) { - node = (mnode_t) leaf; - do { - if (node.visframe == r_visframecount) - break; - node.visframe = r_visframecount; - node = node.parent; - } while (node != null); - } - } - } - - /* - * ============================================================================= - * - * LIGHTMAP ALLOCATION - * - * ============================================================================= - */ - - void LM_InitBlock() { - Arrays.fill(gl_lms.allocated, 0); - } - - void LM_UploadBlock(boolean dynamic) { - int texture; - int height = 0; - - if (dynamic) { - texture = 0; - } else { - texture = gl_lms.current_lightmap_texture; - } - - GL_Bind(gl_state.lightmap_textures + texture); - gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, - GL.GL_LINEAR); - gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, - GL.GL_LINEAR); - - if (dynamic) { - int i; - - for (i = 0; i < BLOCK_WIDTH; i++) { - if (gl_lms.allocated[i] > height) - height = gl_lms.allocated[i]; - } - - gl.glTexSubImage2D(GL.GL_TEXTURE_2D, 0, 0, 0, BLOCK_WIDTH, height, - GL_LIGHTMAP_FORMAT, GL.GL_UNSIGNED_BYTE, - gl_lms.lightmap_buffer); - } else { - gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, gl_lms.internal_format, - BLOCK_WIDTH, BLOCK_HEIGHT, 0, GL_LIGHTMAP_FORMAT, - GL.GL_UNSIGNED_BYTE, gl_lms.lightmap_buffer); - if (++gl_lms.current_lightmap_texture == MAX_LIGHTMAPS) - Com.Error(Defines.ERR_DROP, - "LM_UploadBlock() - MAX_LIGHTMAPS exceeded\n"); - - //debugLightmap(gl_lms.lightmap_buffer, 128, 128, 4); - - } - } - - // returns a texture number and the position inside it - boolean LM_AllocBlock(int w, int h, pos_t pos) { - int x = pos.x; - int y = pos.y; - int i, j; - int best, best2; - - best = BLOCK_HEIGHT; - - for (i = 0; i < BLOCK_WIDTH - w; i++) { - best2 = 0; - - for (j = 0; j < w; j++) { - if (gl_lms.allocated[i + j] >= best) - break; - if (gl_lms.allocated[i + j] > best2) - best2 = gl_lms.allocated[i + j]; - } - if (j == w) { // this is a valid spot - pos.x = x = i; - pos.y = y = best = best2; - } - } - - if (best + h > BLOCK_HEIGHT) - return false; - - for (i = 0; i < w; i++) - gl_lms.allocated[x + i] = best + h; - - return true; - } - - /* - * ================ GL_BuildPolygonFromSurface ================ - */ - void GL_BuildPolygonFromSurface(msurface_t fa) { - int i, lindex, lnumverts; - medge_t[] pedges; - medge_t r_pedge; - int vertpage; - float[] vec; - float s, t; - // reconstruct the polygon - pedges = currentmodel.edges; - lnumverts = fa.numedges; - vertpage = 0; - - // - // draw texture - // - glpoly_t poly = Polygon.create(lnumverts); - - poly.next = fa.polys; - poly.flags = fa.flags; - fa.polys = poly; - - for (i = 0; i < lnumverts; i++) { - lindex = currentmodel.surfedges[fa.firstedge + i]; - - if (lindex > 0) { - r_pedge = pedges[lindex]; - vec = currentmodel.vertexes[r_pedge.v[0]].position; - } else { - r_pedge = pedges[-lindex]; - vec = currentmodel.vertexes[r_pedge.v[1]].position; - } - s = Math3D.DotProduct(vec, fa.texinfo.vecs[0]) - + fa.texinfo.vecs[0][3]; - s /= fa.texinfo.image.width; - - t = Math3D.DotProduct(vec, fa.texinfo.vecs[1]) - + fa.texinfo.vecs[1][3]; - t /= fa.texinfo.image.height; - - 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 - // - s = Math3D.DotProduct(vec, fa.texinfo.vecs[0]) - + fa.texinfo.vecs[0][3]; - s -= fa.texturemins[0]; - s += fa.light_s * 16; - s += 8; - s /= BLOCK_WIDTH * 16; //fa.texinfo.texture.width; - - t = Math3D.DotProduct(vec, fa.texinfo.vecs[1]) - + fa.texinfo.vecs[1][3]; - t -= fa.texturemins[1]; - t += fa.light_t * 16; - t += 8; - t /= BLOCK_HEIGHT * 16; //fa.texinfo.texture.height; - - poly.s2(i, s); - poly.t2(i, t); - } - } - - /* - * ======================== GL_CreateSurfaceLightmap - * ======================== - */ - void GL_CreateSurfaceLightmap(msurface_t surf) { - int smax, tmax; - IntBuffer base; - - if ((surf.flags & (Defines.SURF_DRAWSKY | Defines.SURF_DRAWTURB)) != 0) - return; - - smax = (surf.extents[0] >> 4) + 1; - tmax = (surf.extents[1] >> 4) + 1; - - pos_t lightPos = new pos_t(surf.light_s, surf.light_t); - - if (!LM_AllocBlock(smax, tmax, lightPos)) { - LM_UploadBlock(false); - LM_InitBlock(); - lightPos = new pos_t(surf.light_s, surf.light_t); - if (!LM_AllocBlock(smax, tmax, lightPos)) { - Com.Error(Defines.ERR_FATAL, - "Consecutive calls to LM_AllocBlock(" + smax + "," - + tmax + ") failed\n"); - } - } - - // kopiere die koordinaten zurueck - surf.light_s = lightPos.x; - surf.light_t = lightPos.y; - - surf.lightmaptexturenum = gl_lms.current_lightmap_texture; - - base = gl_lms.lightmap_buffer; - base.position(surf.light_t * BLOCK_WIDTH + surf.light_s); - - R_SetCacheState(surf); - R_BuildLightMap(surf, base.slice(), BLOCK_WIDTH); - } - - lightstyle_t[] lightstyles; - - IntBuffer dummy = BufferUtils.newIntBuffer(128 * 128); - - /* - * ================== GL_BeginBuildingLightmaps - * - * ================== - */ - void GL_BeginBuildingLightmaps(model_t m) { - // static lightstyle_t lightstyles[MAX_LIGHTSTYLES]; - // init lightstyles - if (lightstyles == null) { - lightstyles = new lightstyle_t[Defines.MAX_LIGHTSTYLES]; - for (int i = 0; i < lightstyles.length; i++) { - lightstyles[i] = new lightstyle_t(); - } - } - - // memset( gl_lms.allocated, 0, sizeof(gl_lms.allocated) ); - Arrays.fill(gl_lms.allocated, 0); - - r_framecount = 1; // no dlightcache - - GL_EnableMultitexture(true); - GL_SelectTexture(GL_TEXTURE1); - - /* - * * setup the base lightstyles so the lightmaps won't have to be - * regenerated * the first time they're seen - */ - for (int i = 0; i < Defines.MAX_LIGHTSTYLES; i++) { - lightstyles[i].rgb[0] = 1; - lightstyles[i].rgb[1] = 1; - lightstyles[i].rgb[2] = 1; - lightstyles[i].white = 3; - } - r_newrefdef.lightstyles = lightstyles; - - if (gl_state.lightmap_textures == 0) { - gl_state.lightmap_textures = TEXNUM_LIGHTMAPS; - } - - gl_lms.current_lightmap_texture = 1; - - /* - * * if mono lightmaps are enabled and we want to use alpha * blending - * (a,1-a) then we're likely running on a 3DLabs * Permedia2. In a - * perfect world we'd use a GL_ALPHA lightmap * in order to conserve - * space and maximize bandwidth, however * this isn't a perfect world. * * - * So we have to use alpha lightmaps, but stored in GL_RGBA format, * - * which means we only get 1/16th the color resolution we should when * - * using alpha lightmaps. If we find another board that supports * only - * alpha lightmaps but that can at least support the GL_ALPHA * format - * then we should change this code to use real alpha maps. - */ - - char format = gl_monolightmap.string.toUpperCase().charAt(0); - - if (format == 'A') { - gl_lms.internal_format = gl_tex_alpha_format; - } - /* - * * try to do hacked colored lighting with a blended texture - */ - else if (format == 'C') { - gl_lms.internal_format = gl_tex_alpha_format; - } else if (format == 'I') { - gl_lms.internal_format = GL.GL_INTENSITY8; - } else if (format == 'L') { - gl_lms.internal_format = GL.GL_LUMINANCE8; - } else { - gl_lms.internal_format = gl_tex_solid_format; - } - - /* - * * initialize the dynamic lightmap texture - */ - GL_Bind(gl_state.lightmap_textures + 0); - gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, - GL.GL_LINEAR); - gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, - GL.GL_LINEAR); - gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, gl_lms.internal_format, - BLOCK_WIDTH, BLOCK_HEIGHT, 0, GL_LIGHTMAP_FORMAT, - GL.GL_UNSIGNED_BYTE, dummy); - } - - /* - * ======================= GL_EndBuildingLightmaps ======================= - */ - void GL_EndBuildingLightmaps() { - LM_UploadBlock(false); - GL_EnableMultitexture(false); - } - - /* - * new buffers for vertex array handling - */ - static FloatBuffer globalPolygonInterleavedBuf = Polygon.getInterleavedBuffer(); - - static FloatBuffer globalPolygonTexCoord1Buf = null; - - static { - globalPolygonInterleavedBuf.position(Polygon.STRIDE - 2); - globalPolygonTexCoord1Buf = globalPolygonInterleavedBuf.slice(); - globalPolygonInterleavedBuf.position(0); - }; - - //ImageFrame frame; - - // void debugLightmap(byte[] buf, int w, int h, float scale) { - // IntBuffer pix = - // ByteBuffer.wrap(buf).order(ByteOrder.LITTLE_ENDIAN).asIntBuffer(); - // - // int[] pixel = new int[w * h]; - // - // pix.get(pixel); - // - // BufferedImage image = new BufferedImage(w, h, - // BufferedImage.TYPE_4BYTE_ABGR); - // image.setRGB(0, 0, w, h, pixel, 0, w); - // AffineTransformOp op = new - // AffineTransformOp(AffineTransform.getScaleInstance(scale, scale), - // AffineTransformOp.TYPE_NEAREST_NEIGHBOR); - // BufferedImage tmp = op.filter(image, null); - // - // if (frame == null) { - // frame = new ImageFrame(null); - // frame.show(); - // } - // frame.showImage(tmp); - // - // } - -}
\ No newline at end of file |