📄 main.java
字号:
*/ void R_DrawParticles() { if (gl_ext_pointparameters.value != 0.0f && qglPointParameterfEXT) { gl.glEnableClientState(GL.GL_VERTEX_ARRAY); gl.glVertexPointer(3, GL.GL_FLOAT, 0, particle_t.vertexArray); gl.glEnableClientState(GL.GL_COLOR_ARRAY); gl.glColorPointer(4, GL.GL_UNSIGNED_BYTE, 0, particle_t.colorArray); gl.glDepthMask(false); gl.glEnable(GL.GL_BLEND); gl.glDisable(GL.GL_TEXTURE_2D); gl.glPointSize(gl_particle_size.value); gl.glDrawArrays(GL.GL_POINTS, 0, r_newrefdef.num_particles); gl.glDisableClientState(GL.GL_COLOR_ARRAY); gl.glDisableClientState(GL.GL_VERTEX_ARRAY); gl.glDisable(GL.GL_BLEND); gl.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); gl.glDepthMask(true); gl.glEnable(GL.GL_TEXTURE_2D); } else { GL_DrawParticles(r_newrefdef.num_particles); } } /* ============ R_PolyBlend ============ */ void R_PolyBlend() { if (gl_polyblend.value == 0.0f) return; if (v_blend[3] == 0.0f) return; gl.glDisable(GL.GL_ALPHA_TEST); gl.glEnable(GL.GL_BLEND); gl.glDisable(GL.GL_DEPTH_TEST); gl.glDisable(GL.GL_TEXTURE_2D); gl.glLoadIdentity(); // FIXME: get rid of these gl.glRotatef(-90, 1, 0, 0); // put Z going up gl.glRotatef(90, 0, 0, 1); // put Z going up gl.glColor4f(v_blend[0], v_blend[1], v_blend[2], v_blend[3]); gl.glBegin(GL.GL_QUADS); gl.glVertex3f(10, 100, 100); gl.glVertex3f(10, -100, 100); gl.glVertex3f(10, -100, -100); gl.glVertex3f(10, 100, -100); gl.glEnd(); gl.glDisable(GL.GL_BLEND); gl.glEnable(GL.GL_TEXTURE_2D); gl.glEnable(GL.GL_ALPHA_TEST); gl.glColor4f(1, 1, 1, 1); } // ======================================================================= int SignbitsForPlane(cplane_t out) { // for fast box on planeside test int bits = 0; for (int j = 0; j < 3; j++) { if (out.normal[j] < 0) bits |= (1 << j); } return bits; } void R_SetFrustum() { // rotate VPN right by FOV_X/2 degrees Math3D.RotatePointAroundVector(frustum[0].normal, vup, vpn, - (90f - r_newrefdef.fov_x / 2f)); // rotate VPN left by FOV_X/2 degrees Math3D.RotatePointAroundVector(frustum[1].normal, vup, vpn, 90f - r_newrefdef.fov_x / 2f); // rotate VPN up by FOV_X/2 degrees Math3D.RotatePointAroundVector(frustum[2].normal, vright, vpn, 90f - r_newrefdef.fov_y / 2f); // rotate VPN down by FOV_X/2 degrees Math3D.RotatePointAroundVector(frustum[3].normal, vright, vpn, - (90f - r_newrefdef.fov_y / 2f)); for (int i = 0; i < 4; i++) { frustum[i].type = Defines.PLANE_ANYZ; frustum[i].dist = Math3D.DotProduct(r_origin, frustum[i].normal); frustum[i].signbits = (byte) SignbitsForPlane(frustum[i]); } } // ======================================================================= /* =============== R_SetupFrame =============== */ void R_SetupFrame() { int i; mleaf_t leaf; r_framecount++; // build the transformation matrix for the given view angles Math3D.VectorCopy(r_newrefdef.vieworg, r_origin); Math3D.AngleVectors(r_newrefdef.viewangles, vpn, vright, vup); // current viewcluster if ((r_newrefdef.rdflags & Defines.RDF_NOWORLDMODEL) == 0) { r_oldviewcluster = r_viewcluster; r_oldviewcluster2 = r_viewcluster2; leaf = Mod_PointInLeaf(r_origin, r_worldmodel); r_viewcluster = r_viewcluster2 = leaf.cluster; // check above and below so crossing solid water doesn't draw wrong if (leaf.contents == 0) { // look down a bit float[] temp = { 0, 0, 0 }; Math3D.VectorCopy(r_origin, temp); temp[2] -= 16; leaf = Mod_PointInLeaf(temp, r_worldmodel); if ((leaf.contents & Defines.CONTENTS_SOLID) == 0 && (leaf.cluster != r_viewcluster2)) r_viewcluster2 = leaf.cluster; } else { // look up a bit float[] temp = { 0, 0, 0 }; Math3D.VectorCopy(r_origin, temp); temp[2] += 16; leaf = Mod_PointInLeaf(temp, r_worldmodel); if ((leaf.contents & Defines.CONTENTS_SOLID) == 0 && (leaf.cluster != r_viewcluster2)) r_viewcluster2 = leaf.cluster; } } for (i = 0; i < 4; i++) v_blend[i] = r_newrefdef.blend[i]; c_brush_polys = 0; c_alias_polys = 0; // clear out the portion of the screen that the NOWORLDMODEL defines if ((r_newrefdef.rdflags & Defines.RDF_NOWORLDMODEL) != 0) { gl.glEnable(GL.GL_SCISSOR_TEST); gl.glClearColor(0.3f, 0.3f, 0.3f, 1.0f); gl.glScissor( r_newrefdef.x, vid.height - r_newrefdef.height - r_newrefdef.y, r_newrefdef.width, r_newrefdef.height); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glClearColor(1.0f, 0.0f, 0.5f, 0.5f); gl.glDisable(GL.GL_SCISSOR_TEST); } } void MYgluPerspective(double fovy, double aspect, double zNear, double zFar) { double xmin, xmax, ymin, ymax; ymax = zNear * Math.tan(fovy * Math.PI / 360.0); ymin = -ymax; xmin = ymin * aspect; xmax = ymax * aspect; xmin += - (2 * gl_state.camera_separation) / zNear; xmax += - (2 * gl_state.camera_separation) / zNear; gl.glFrustum(xmin, xmax, ymin, ymax, zNear, zFar); } /* ============= R_SetupGL ============= */ void R_SetupGL() { float screenaspect; int x, x2, y2, y, w, h; // // set up viewport // x = (int) Math.floor(r_newrefdef.x * vid.width / vid.width); x2 = (int) Math.ceil((r_newrefdef.x + r_newrefdef.width) * vid.width / vid.width); y = (int) Math.floor(vid.height - r_newrefdef.y * vid.height / vid.height); y2 = (int) Math.ceil(vid.height - (r_newrefdef.y + r_newrefdef.height) * vid.height / vid.height); w = x2 - x; h = y - y2; gl.glViewport(x, y2, w, h); // // set up projection matrix // screenaspect = (float) r_newrefdef.width / r_newrefdef.height; gl.glMatrixMode(GL.GL_PROJECTION); gl.glLoadIdentity(); MYgluPerspective(r_newrefdef.fov_y, screenaspect, 4, 4096); gl.glCullFace(GL.GL_FRONT); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); gl.glRotatef(-90, 1, 0, 0); // put Z going up gl.glRotatef(90, 0, 0, 1); // put Z going up gl.glRotatef(-r_newrefdef.viewangles[2], 1, 0, 0); gl.glRotatef(-r_newrefdef.viewangles[0], 0, 1, 0); gl.glRotatef(-r_newrefdef.viewangles[1], 0, 0, 1); gl.glTranslatef(-r_newrefdef.vieworg[0], -r_newrefdef.vieworg[1], -r_newrefdef.vieworg[2]); gl.glGetFloatv(GL.GL_MODELVIEW_MATRIX, r_world_matrix); // // set drawing parms // if (gl_cull.value != 0.0f) gl.glEnable(GL.GL_CULL_FACE); else gl.glDisable(GL.GL_CULL_FACE); gl.glDisable(GL.GL_BLEND); gl.glDisable(GL.GL_ALPHA_TEST); gl.glEnable(GL.GL_DEPTH_TEST); } /* ============= R_Clear ============= */ int trickframe = 0; void R_Clear() { if (gl_ztrick.value != 0.0f) { if (gl_clear.value != 0.0f) { gl.glClear(GL.GL_COLOR_BUFFER_BIT); } trickframe++; if ((trickframe & 1) != 0) { gldepthmin = 0; gldepthmax = 0.49999f; gl.glDepthFunc(GL.GL_LEQUAL); } else { gldepthmin = 1; gldepthmax = 0.5f; gl.glDepthFunc(GL.GL_GEQUAL); } } else { if (gl_clear.value != 0.0f) gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); else gl.glClear(GL.GL_DEPTH_BUFFER_BIT); gldepthmin = 0; gldepthmax = 1; gl.glDepthFunc(GL.GL_LEQUAL); } gl.glDepthRange(gldepthmin, gldepthmax); } void R_Flash() { R_PolyBlend(); } /* ================ R_RenderView r_newrefdef must be set before the first call ================ */ void R_RenderView(refdef_t fd) { if (r_norefresh.value != 0.0f) return; r_newrefdef = fd; // included by cwei if (r_newrefdef == null) { Com.Error(Defines.ERR_DROP, "R_RenderView: refdef_t fd is null"); } if (r_worldmodel == null && (r_newrefdef.rdflags & Defines.RDF_NOWORLDMODEL) == 0) Com.Error(Defines.ERR_DROP, "R_RenderView: NULL worldmodel"); if (r_speeds.value != 0.0f) { c_brush_polys = 0; c_alias_polys = 0; } R_PushDlights(); if (gl_finish.value != 0.0f) gl.glFinish(); R_SetupFrame(); R_SetFrustum(); R_SetupGL(); R_MarkLeaves(); // done here so we know if we're in water R_DrawWorld(); R_DrawEntitiesOnList(); R_RenderDlights(); R_DrawParticles(); R_DrawAlphaSurfaces(); R_Flash(); if (r_speeds.value != 0.0f) { VID.Printf( Defines.PRINT_ALL, "%4i wpoly %4i epoly %i tex %i lmaps\n", new Vargs(4).add(c_brush_polys).add(c_alias_polys).add(c_visible_textures).add(c_visible_lightmaps)); } } void R_SetGL2D() { // set 2D virtual screen size gl.glViewport(0, 0, vid.width, vid.height); gl.glMatrixMode(GL.GL_PROJECTION); gl.glLoadIdentity(); gl.glOrtho(0, vid.width, vid.height, 0, -99999, 99999); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); gl.glDisable(GL.GL_DEPTH_TEST); gl.glDisable(GL.GL_CULL_FACE); gl.glDisable(GL.GL_BLEND); gl.glEnable(GL.GL_ALPHA_TEST); gl.glColor4f(1, 1, 1, 1); } /* ==================== R_SetLightLevel ==================== */ void R_SetLightLevel() { float[] shadelight = { 0, 0, 0 }; if ((r_newrefdef.rdflags & Defines.RDF_NOWORLDMODEL) != 0) return; // save off light value for server to look at (BIG HACK!) R_LightPoint(r_newrefdef.vieworg, shadelight); // pick the greatest component, which should be the same // as the mono value returned by software if (shadelight[0] > shadelight[1]) { if (shadelight[0] > shadelight[2]) r_lightlevel.value = 150 * shadelight[0]; else r_lightlevel.value = 150 * shadelight[2]; } else { if (shadelight[1] > shadelight[2]) r_lightlevel.value = 150 * shadelight[1]; else r_lightlevel.value = 150 * shadelight[2]; } } /* @@@@@@@@@@@@@@@@@@@@@ R_RenderFrame @@@@@@@@@@@@@@@@@@@@@ */ protected void R_RenderFrame(refdef_t fd) { R_RenderView(fd); R_SetLightLevel(); R_SetGL2D(); } protected void R_Register() { r_lefthand = Cvar.Get("hand", "0", Globals.CVAR_USERINFO | Globals.CVAR_ARCHIVE); r_norefresh = Cvar.Get("r_norefresh", "0", 0); r_fullbright = Cvar.Get("r_fullbright", "0", 0); r_drawentities = Cvar.Get("r_drawentities", "1", 0); r_drawworld = Cvar.Get("r_drawworld", "1", 0); r_novis = Cvar.Get("r_novis", "0", 0); r_nocull = Cvar.Get("r_nocull", "0", 0); r_lerpmodels = Cvar.Get("r_lerpmodels", "1", 0); r_speeds = Cvar.Get("r_speeds", "0", 0); r_lightlevel = Cvar.Get("r_lightlevel", "1", 0); gl_nosubimage = Cvar.Get("gl_nosubimage", "0", 0); gl_allow_software = Cvar.Get("gl_allow_software", "0", 0); gl_particle_min_size = Cvar.Get("gl_particle_min_size", "2", Globals.CVAR_ARCHIVE); gl_particle_max_size = Cvar.Get("gl_particle_max_size", "40", Globals.CVAR_ARCHIVE); gl_particle_size = Cvar.Get("gl_particle_size", "40", Globals.CVAR_ARCHIVE); gl_particle_att_a = Cvar.Get("gl_particle_att_a", "0.01", Globals.CVAR_ARCHIVE); gl_particle_att_b = Cvar.Get("gl_particle_att_b", "0.0", Globals.CVAR_ARCHIVE); gl_particle_att_c = Cvar.Get("gl_particle_att_c", "0.01", Globals.CVAR_ARCHIVE); gl_modulate = Cvar.Get("gl_modulate", "1.5", Globals.CVAR_ARCHIVE); gl_log = Cvar.Get("gl_log", "0", 0); gl_bitdepth = Cvar.Get("gl_bitdepth", "0", 0); gl_mode = Cvar.Get("gl_mode", "1", Globals.CVAR_ARCHIVE); gl_lightmap = Cvar.Get("gl_lightmap", "0", 0); gl_shadows = Cvar.Get("gl_shadows", "0", Globals.CVAR_ARCHIVE); gl_dynamic = Cvar.Get("gl_dynamic", "1", 0); gl_nobind = Cvar.Get("gl_nobind", "0", 0); gl_round_down = Cvar.Get("gl_round_down", "1", 0); gl_picmip = Cvar.Get("gl_picmip", "0", 0); gl_skymip = Cvar.Get("gl_skymip", "0", 0); gl_showtris = Cvar.Get("gl_showtris", "0", 0); gl_ztrick = Cvar.Get("gl_ztrick", "0", 0); gl_finish = Cvar.Get("gl_finish", "0", Globals.CVAR_ARCHIVE); gl_clear = Cvar.Get("gl_clear", "0", 0); gl_cull = Cvar.Get("gl_cull", "1", 0); gl_polyblend = Cvar.Get("gl_polyblend", "1", 0); gl_flashblend = Cvar.Get("gl_flashblend", "0", 0); gl_playermip = Cvar.Get("gl_playermip", "0", 0); gl_monolightmap = Cvar.Get("gl_monolightmap", "0", 0); gl_driver = Cvar.Get("gl_driver", "opengl32", Globals.CVAR_ARCHIVE); gl_texturemode = Cvar.Get("gl_texturemode", "GL_LINEAR_MIPMAP_NEAREST", Globals.CVAR_ARCHIVE); gl_texturealphamode = Cvar.Get("gl_texturealphamode", "default", Globals.CVAR_ARCHIVE); gl_texturesolidmode = Cvar.Get("gl_texturesolidmode", "default", Globals.CVAR_ARCHIVE); gl_lockpvs = Cvar.Get("gl_lockpvs", "0", 0); gl_vertex_arrays = Cvar.Get("gl_vertex_arrays", "0", Globals.CVAR_ARCHIVE); gl_ext_swapinterval = Cvar.Get("gl_ext_swapinterval", "1", Globals.CVAR_ARCHIVE); gl_ext_palettedtexture = Cvar.Get("gl_ext_palettedtexture", "0", Globals.CVAR_ARCHIVE); gl_ext_multitexture = Cvar.Get("gl_ext_multitexture", "1", Globals.CVAR_ARCHIVE); gl_ext_pointparameters = Cvar.Get("gl_ext_pointparameters", "1", Globals.CVAR_ARCHIVE); gl_ext_compiled_vertex_array = Cvar.Get("gl_ext_compiled_vertex_array", "1", Globals.CVAR_ARCHIVE); gl_drawbuffer = Cvar.Get("gl_drawbuffer", "GL_BACK", 0); gl_swapinterval = Cvar.Get("gl_swapinterval", "1", Globals.CVAR_ARCHIVE); gl_saturatelighting = Cvar.Get("gl_saturatelighting", "0", 0); gl_3dlabs_broken = Cvar.Get("gl_3dlabs_broken", "1", Globals.CVAR_ARCHIVE); vid_fullscreen = Cvar.Get("vid_fullscreen", "0", Globals.CVAR_ARCHIVE); vid_gamma = Cvar.Get("vid_gamma", "1.0", Globals.CVAR_ARCHIVE); vid_ref = Cvar.Get("vid_ref", "jogl", Globals.CVAR_ARCHIVE); Cmd.AddCommand("imagelist", new xcommand_t() { public void execute() { GL_ImageList_f(); } }); Cmd.AddCommand("screenshot", new xcommand_t() { public void execute() { GL_ScreenShot_f(); } }); Cmd.AddCommand("modellist", new xcommand_t() { public void execute() { Mod_Modellist_f(); } }); Cmd.AddCommand("gl_strings", new xcommand_t() { public void execute() { GL_Strings_f(); } }); } /* ================== R_SetMode ================== */ protected boolean R_SetMode() { int err; // enum rserr_t boolean fullscreen;// if (vid_fullscreen.modified && !gl_config.allow_cds) {// VID.Printf(Defines.PRINT_ALL, "R_SetMode() - CDS not allowed with this driver\n");// Cvar.SetValue("vid_fullscreen", (vid_fullscreen.value > 0.0f) ? 0.0f : 1.0f);// vid_fullscreen.modified = false;// } fullscreen = (vid_fullscreen.value > 0.0f); vid_fullscreen.modified = false; gl_mode.modified = false; Dimension dim = new Dimension(vid.width, vid.height); if ((err = GLimp_SetMode(dim, (int) gl_mode.value, fullscreen)) == rserr_ok) { gl_state.prev_mode = (int) gl_mode.value; } else { if (err == rserr_invalid_fullscreen) { Cvar.SetValue("vid_fullscreen", 0); vid_fullscreen.modified = false; VID.Printf(Defines.PRINT_ALL, "ref_gl::R_SetMode() - fullscreen unavailable in this mode\n"); if ((err = GLimp_SetMode(dim, (int) gl_mode.value, false)) == rserr_ok) return true; } else if (err == rserr_invalid_mode) { Cvar.SetValue("gl_mode", gl_state.prev_mode); gl_mode.modified = false; VID.Printf(Defines.PRINT_ALL, "ref_gl::R_SetMode() - invalid mode\n"); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -