diff options
Diffstat (limited to 'src/jake2/client/V.java')
-rw-r--r-- | src/jake2/client/V.java | 417 |
1 files changed, 417 insertions, 0 deletions
diff --git a/src/jake2/client/V.java b/src/jake2/client/V.java new file mode 100644 index 0000000..3b9d139 --- /dev/null +++ b/src/jake2/client/V.java @@ -0,0 +1,417 @@ +/* + * V.java + * Copyright (C) 2003 + * + * $Id: V.java,v 1.1 2004-07-07 19:58:52 hzi 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.client; + +import jake2.Globals; +import jake2.game.Cmd; +import jake2.game.cvar_t; +import jake2.qcommon.*; +import jake2.sys.Sys; +import jake2.util.Math3D; +import jake2.util.Vargs; + +import java.io.IOException; + +/** + * V + */ +public final class V extends Globals { + + static cvar_t cl_testblend; + static cvar_t cl_testparticles; + static cvar_t cl_testentities; + static cvar_t cl_testlights; + static cvar_t cl_stats; + + static int r_numdlights; + static dlight_t[] r_dlights = new dlight_t[MAX_DLIGHTS]; + + static int r_numentities; + static entity_t[] r_entities = new entity_t[MAX_ENTITIES]; + + static int r_numparticles; + static particle_t[] r_particles = new particle_t[MAX_PARTICLES]; + + static lightstyle_t[] r_lightstyles = new lightstyle_t[MAX_LIGHTSTYLES]; + static { + for (int i = 0; i < r_dlights.length; i++) + r_dlights[i] = new dlight_t(); + for (int i = 0; i < r_entities.length; i++) + r_entities[i] = new entity_t(); + for (int i = 0; i < r_particles.length; i++) + r_particles[i] = new particle_t(); + for (int i = 0; i < r_lightstyles.length; i++) + r_lightstyles[i] = new lightstyle_t(); + } + + /* + ==================== + V_ClearScene + + Specifies the model that will be used as the world + ==================== + */ + static void ClearScene() { + r_numdlights = 0; + r_numentities = 0; + r_numparticles = 0; + } + + /* + ===================== + V_AddEntity + + ===================== + */ + static void AddEntity(entity_t ent) { + if (r_numentities >= MAX_ENTITIES) + return; + r_entities[r_numentities++].set(ent); + } + + /* + ===================== + V_AddParticle + + ===================== + */ + static void AddParticle(float[] org, int color, float alpha) { + particle_t p; + + if (r_numparticles >= MAX_PARTICLES) + return; + + p = r_particles[r_numparticles++]; + + VectorCopy(org, p.origin); + p.color = color; + p.alpha = alpha; + } + + /* + ===================== + V_AddLight + + ===================== + */ + static void AddLight(float[] org, float intensity, float r, float g, float b) { + dlight_t dl; + + if (r_numdlights >= MAX_DLIGHTS) + return; + dl = r_dlights[r_numdlights++]; + VectorCopy(org, dl.origin); + dl.intensity = intensity; + dl.color[0] = r; + dl.color[1] = g; + dl.color[2] = b; + } + + + /* + ===================== + V_AddLightStyle + + ===================== + */ + static void AddLightStyle(int style, float r, float g, float b) { + lightstyle_t ls; + + if (style < 0 || style > MAX_LIGHTSTYLES) + Com.Error(ERR_DROP, "Bad light style " + style); + ls = r_lightstyles[style]; + + ls.white = r + g + b; + ls.rgb[0] = r; + ls.rgb[1] = g; + ls.rgb[2] = b; + } + + /* + ================ + V_TestParticles + + If cl_testparticles is set, create 4096 particles in the view + ================ + */ + static void TestParticles() { + particle_t p; + int i, j; + float d, r, u; + + r_numparticles = MAX_PARTICLES; + for (i = 0; i < r_numparticles; i++) { + d = i * 0.25f; + r = 4 * ((i & 7) - 3.5f); + u = 4 * (((i >> 3) & 7) - 3.5f); + p = r_particles[i]; + + for (j = 0; j < 3; j++) + p.origin[j] = + cl.refdef.vieworg[j] + + cl.v_forward[j] * d + + cl.v_right[j] * r + + cl.v_up[j] * u; + + p.color = 8; + p.alpha = cl_testparticles.value; + } + } + + /* + ================ + V_TestEntities + + If cl_testentities is set, create 32 player models + ================ + */ + static void TestEntities() { + int i, j; + float f, r; + entity_t ent; + + r_numentities = 32; + //memset (r_entities, 0, sizeof(r_entities)); + for (i = 0; i < r_entities.length; i++) + r_entities[i] = new entity_t(); + + for (i=0 ; i<r_numentities ; i++) + { + ent = r_entities[i]; + + r = 64 * ( (i%4) - 1.5f ); + f = 64 * (i/4) + 128; + + for (j=0 ; j<3 ; j++) + ent.origin[j] = cl.refdef.vieworg[j] + cl.v_forward[j]*f + + cl.v_right[j]*r; + + ent.model = cl.baseclientinfo.model; + ent.skin = cl.baseclientinfo.skin; + } + } + + /* + ================ + V_TestLights + + If cl_testlights is set, create 32 lights models + ================ + */ + static void TestLights() { + int i, j; + float f, r; + dlight_t dl; + + r_numdlights = 32; + //memset (r_dlights, 0, sizeof(r_dlights)); + for (i = 0; i < r_dlights.length; i++) + r_dlights[i] = new dlight_t(); + + for (i=0 ; i<r_numdlights ; i++) + { + dl = r_dlights[i]; + + r = 64 * ( (i%4) - 1.5f ); + f = 64 * (i/4) + 128; + + for (j=0 ; j<3 ; j++) + dl.origin[j] = cl.refdef.vieworg[j] + cl.v_forward[j]*f + + cl.v_right[j]*r; + dl.color[0] = ((i%6)+1) & 1; + dl.color[1] = (((i%6)+1) & 2)>>1; + dl.color[2] = (((i%6)+1) & 4)>>2; + dl.intensity = 200; + } + } + + static xcommand_t Gun_Next_f = new xcommand_t() { + public void execute() { + gun_frame++; + Com.Printf("frame " + gun_frame + "\n"); + } + }; + + static xcommand_t Gun_Prev_f = new xcommand_t() { + public void execute() { + gun_frame--; + if (gun_frame < 0) + gun_frame = 0; + Com.Printf("frame " + gun_frame + "\n"); + } + }; + + static xcommand_t Gun_Model_f = new xcommand_t() { + public void execute() { + if (Cmd.Argc() != 2) { + gun_model = null; + return; + } + String name = "models/" + Cmd.Argv(1) + "/tris.md2"; + gun_model = re.RegisterModel(name); + } + }; + + /* + ================== + V_RenderView + + ================== + */ + static void RenderView(float stereo_separation) { +// extern int entitycmpfnc( const entity_t *, const entity_t * ); +// + if (cls.state != ca_active) return; + + if (!cl.refresh_prepped) return; // still loading + + if (cl_timedemo.value != 0.0f) { + if (cl.timedemo_start == 0) + cl.timedemo_start = Sys.Milliseconds(); + cl.timedemo_frames++; + } + + // an invalid frame will just use the exact previous refdef + // we can't use the old frame if the video mode has changed, though... + if ( cl.frame.valid && (cl.force_refdef || cl_paused.value == 0.0f) ) { + cl.force_refdef = false; + + V.ClearScene(); + + // build a refresh entity list and calc cl.sim* + // this also calls CL_CalcViewValues which loads + // v_forward, etc. + CL.AddEntities(); + + if (cl_testparticles.value != 0.0f) + TestParticles(); + if (cl_testentities.value != 0.0f) + TestEntities(); + if (cl_testlights.value != 0.0f) + TestLights(); + if (cl_testblend.value != 0.0f) { + cl.refdef.blend[0] = 1.0f; + cl.refdef.blend[1] = 0.5f; + cl.refdef.blend[2] = 0.25f; + cl.refdef.blend[3] = 0.5f; + } + + // offset vieworg appropriately if we're doing stereo separation + if ( stereo_separation != 0 ) { + float[] tmp = new float[3]; + + Math3D.VectorScale( cl.v_right, stereo_separation, tmp ); + Math3D.VectorAdd( cl.refdef.vieworg, tmp, cl.refdef.vieworg ); + } + + // never let it sit exactly on a node line, because a water plane can + // dissapear when viewed with the eye exactly on it. + // the server protocol only specifies to 1/8 pixel, so add 1/16 in each axis + cl.refdef.vieworg[0] += 1.0/16; + cl.refdef.vieworg[1] += 1.0/16; + cl.refdef.vieworg[2] += 1.0/16; + + cl.refdef.x = scr_vrect.x; + cl.refdef.y = scr_vrect.y; + cl.refdef.width = scr_vrect.width; + cl.refdef.height = scr_vrect.height; + cl.refdef.fov_y = Math3D.CalcFov(cl.refdef.fov_x, cl.refdef.width, cl.refdef.height); + cl.refdef.time = cl.time*0.001f; + + cl.refdef.areabits = cl.frame.areabits; + + if (cl_add_entities.value == 0.0f) + r_numentities = 0; + if (cl_add_particles.value == 0.0f) + r_numparticles = 0; + if (cl_add_lights.value == 0.0f) + r_numdlights = 0; + if (cl_add_blend.value == 0) { + Math3D.VectorClear(cl.refdef.blend); + } + + cl.refdef.num_entities = r_numentities; + cl.refdef.entities = r_entities; + cl.refdef.num_particles = r_numparticles; + cl.refdef.particles = r_particles; + cl.refdef.num_dlights = r_numdlights; + cl.refdef.dlights = r_dlights; + cl.refdef.lightstyles = r_lightstyles; + + cl.refdef.rdflags = cl.frame.playerstate.rdflags; + + // sort entities for better cache locality + // !!! useless in Java !!! + //Arrays.sort(cl.refdef.entities, entitycmpfnc); + } + + re.RenderFrame(cl.refdef); + if (cl_stats.value != 0.0f) + Com.Printf("ent:%i lt:%i part:%i\n", new Vargs(3).add(r_numentities).add( + r_numdlights).add(r_numparticles)); + if ( log_stats.value != 0.0f && ( log_stats_file != null ) ) + try { + log_stats_file.write(r_numentities + "," + r_numdlights + "," + r_numparticles); + } catch (IOException e) {} + + SCR.AddDirtyPoint(scr_vrect.x, scr_vrect.y); + SCR.AddDirtyPoint(scr_vrect.x+scr_vrect.width-1, scr_vrect.y+scr_vrect.height-1); + + SCR.DrawCrosshair(); + } + + /* + ============= + V_Viewpos_f + ============= + */ + static xcommand_t Viewpos_f = new xcommand_t() { + public void execute() { + Com.Printf("(%i %i %i) : %i\n", + new Vargs(4).add((int)cl.refdef.vieworg[0]).add( + (int)cl.refdef.vieworg[1]).add( + (int)cl.refdef.vieworg[2]).add( + (int)cl.refdef.viewangles[YAW])); + } + }; + + public static void Init() { + Cmd.AddCommand("gun_next", Gun_Next_f); + Cmd.AddCommand("gun_prev", Gun_Prev_f); + Cmd.AddCommand("gun_model", Gun_Model_f); + + Cmd.AddCommand("viewpos", Viewpos_f); + + crosshair = Cvar.Get("crosshair", "0", CVAR_ARCHIVE); + + cl_testblend = Cvar.Get("cl_testblend", "0", 0); + cl_testparticles = Cvar.Get("cl_testparticles", "0", 0); + cl_testentities = Cvar.Get("cl_testentities", "0", 0); + cl_testlights = Cvar.Get("cl_testlights", "0", 0); + + cl_stats = Cvar.Get("cl_stats", "0", 0); + } +} |