📄 main.java
字号:
// first vertex gl.glTexCoord2f(0.0625f, 0.0625f); gl.glVertex3f(origin_x, origin_y, origin_z); // second vertex gl.glTexCoord2f(1.0625f, 0.0625f); gl.glVertex3f(origin_x + up[0] * scale, origin_y + up[1] * scale, origin_z + up[2] * scale); // third vertex gl.glTexCoord2f(0.0625f, 1.0625f); gl.glVertex3f(origin_x + right[0] * scale, origin_y + right[1] * scale, origin_z + right[2] * scale); } gl.glEnd(); gl.glDisable(GL11.GL_BLEND); gl.glColor4f(1, 1, 1, 1); gl.glDepthMask(true); // back to normal Z buffering GL_TexEnv(GL11.GL_REPLACE); } /** * R_DrawParticles */ void R_DrawParticles() { if (gl_ext_pointparameters.value != 0.0f && qglPointParameterfEXT) { //gl.glEnableClientState(GL11.GL_VERTEX_ARRAY); gl.glVertexPointer(3, 0, particle_t.vertexArray); gl.glEnableClientState(GL11.GL_COLOR_ARRAY); gl.glColorPointer(4, true, 0, particle_t.getColorAsByteBuffer()); gl.glDepthMask(false); gl.glEnable(GL11.GL_BLEND); gl.glDisable(GL11.GL_TEXTURE_2D); gl.glPointSize(gl_particle_size.value); gl.glDrawArrays(GL11.GL_POINTS, 0, r_newrefdef.num_particles); gl.glDisableClientState(GL11.GL_COLOR_ARRAY); //gl.glDisableClientState(GL11.GL_VERTEX_ARRAY); gl.glDisable(GL11.GL_BLEND); gl.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); gl.glDepthMask(true); gl.glEnable(GL11.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(GL11.GL_ALPHA_TEST); gl.glEnable(GL11.GL_BLEND); gl.glDisable(GL11.GL_DEPTH_TEST); gl.glDisable(GL11.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(GL11.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(GL11.GL_BLEND); gl.glEnable(GL11.GL_TEXTURE_2D); gl.glEnable(GL11.GL_ALPHA_TEST); gl.glColor4f(1, 1, 1, 1); } // ======================================================================= /** * SignbitsForPlane */ 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; } /** * R_SetFrustum */ 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]); } } // ======================================================================= // stack variable private final float[] temp = {0, 0, 0}; /** * R_SetupFrame */ void R_SetupFrame() { 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 mleaf_t leaf; 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 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 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 (int 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(GL11.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(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); gl.glClearColor(1.0f, 0.0f, 0.5f, 0.5f); gl.glDisable(GL11.GL_SCISSOR_TEST); } } /** * MYgluPerspective * * @param fovy * @param aspect * @param zNear * @param zFar */ void MYgluPerspective(double fovy, double aspect, double zNear, double zFar) { double ymax = zNear * Math.tan(fovy * Math.PI / 360.0); double ymin = -ymax; double xmin = ymin * aspect; double 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() { // // set up viewport // //int x = (int) Math.floor(r_newrefdef.x * vid.width / vid.width); int x = r_newrefdef.x; //int x2 = (int) Math.ceil((r_newrefdef.x + r_newrefdef.width) * vid.width / vid.width); int x2 = r_newrefdef.x + r_newrefdef.width; //int y = (int) Math.floor(vid.height - r_newrefdef.y * vid.height / vid.height); int y = vid.height - r_newrefdef.y; //int y2 = (int) Math.ceil(vid.height - (r_newrefdef.y + r_newrefdef.height) * vid.height / vid.height); int y2 = vid.height - (r_newrefdef.y + r_newrefdef.height); int w = x2 - x; int h = y - y2; gl.glViewport(x, y2, w, h); // // set up projection matrix // float screenaspect = (float) r_newrefdef.width / r_newrefdef.height; gl.glMatrixMode(GL11.GL_PROJECTION); gl.glLoadIdentity(); MYgluPerspective(r_newrefdef.fov_y, screenaspect, 4, 4096); gl.glCullFace(GL11.GL_FRONT); gl.glMatrixMode(GL11.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.glGetFloat(GL11.GL_MODELVIEW_MATRIX, r_world_matrix); r_world_matrix.clear(); // // set drawing parms // if (gl_cull.value != 0.0f) gl.glEnable(GL11.GL_CULL_FACE); else gl.glDisable(GL11.GL_CULL_FACE); gl.glDisable(GL11.GL_BLEND); gl.glDisable(GL11.GL_ALPHA_TEST); gl.glEnable(GL11.GL_DEPTH_TEST); } int trickframe = 0; /** * R_Clear */ void R_Clear() { if (gl_ztrick.value != 0.0f) { if (gl_clear.value != 0.0f) { gl.glClear(GL11.GL_COLOR_BUFFER_BIT); } trickframe++; if ((trickframe & 1) != 0) { gldepthmin = 0; gldepthmax = 0.49999f; gl.glDepthFunc(GL11.GL_LEQUAL); } else { gldepthmin = 1; gldepthmax = 0.5f; gl.glDepthFunc(GL11.GL_GEQUAL); } } else { if (gl_clear.value != 0.0f) gl.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); else gl.glClear(GL11.GL_DEPTH_BUFFER_BIT); gldepthmin = 0; gldepthmax = 1; gl.glDepthFunc(GL11.GL_LEQUAL); } gl.glDepthRange(gldepthmin, gldepthmax); } /** * R_Flash */ 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)); } } /** * R_SetGL2D */ void R_SetGL2D() { // set 2D virtual screen size gl.glViewport(0, 0, vid.width, vid.height); gl.glMatrixMode(GL11.GL_PROJECTION); gl.glLoadIdentity(); gl.glOrtho(0, vid.width, vid.height, 0, -99999, 99999); gl.glMatrixMode(GL11.GL_MODELVIEW); gl.glLoadIdentity(); gl.glDisable(GL11.GL_DEPTH_TEST); gl.glDisable(GL11.GL_CULL_FACE); gl.glDisable(GL11.GL_BLEND); gl.glEnable(GL11.GL_ALPHA_TEST); gl.glColor4f(1, 1, 1, 1); } // stack variable private final float[] light = { 0, 0, 0 }; /** * R_SetLightLevel */ void R_SetLightLevel() { 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, light); // pick the greatest component, which should be the same // as the mono value returned by software if (light[0] > light[1]) { if (light[0] > light[2]) r_lightlevel.value = 150 * light[0]; else r_lightlevel.value = 150 * light[2]; } else { if (light[1] > light[2]) r_lightlevel.value = 150 * light[1]; else r_lightlevel.value = 150 * light[2]; } } /** * R_RenderFrame */ protected void R_RenderFrame(refdef_t fd) { R_RenderView(fd); R_SetLightLevel(); R_SetGL2D(); } /** * R_Register */ 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", "3", Globals.CVAR_ARCHIVE); // 640x480 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", "1", 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", "0", 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", "lwjgl", 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(); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -