⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.java

📁 Jake2是一个Java 3D游戏引擎.
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/* * Main.java * Copyright (C) 2003 * * $Id: Main.java,v 1.7 2005/05/07 18:23:25 cawe Exp $ *//*Copyright (C) 1997-2001 Id Software, Inc.This program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public Licenseas published by the Free Software Foundation; either version 2of 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 ofMERCHANTABILITY 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 Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.*/package jake2.render.lwjgl;import jake2.Defines;import jake2.Globals;import jake2.client.VID;import jake2.client.entity_t;import jake2.client.particle_t;import jake2.client.refdef_t;import jake2.game.Cmd;import jake2.game.cplane_t;import jake2.game.cvar_t;import jake2.qcommon.Com;import jake2.qcommon.Cvar;import jake2.qcommon.qfiles;import jake2.qcommon.xcommand_t;import jake2.render.glconfig_t;import jake2.render.glstate_t;import jake2.render.image_t;import jake2.render.mleaf_t;import jake2.render.model_t;import jake2.util.Math3D;import jake2.util.Vargs;import java.awt.Dimension;import java.nio.FloatBuffer;import java.nio.IntBuffer;import org.lwjgl.BufferUtils;import org.lwjgl.opengl.ARBMultitexture;import org.lwjgl.opengl.GL11;import org.lwjgl.opengl.GL13;/** * Main *  * @author cwei */public abstract class Main extends Base {	public static int[] d_8to24table = new int[256];	int c_visible_lightmaps;	int c_visible_textures;	int registration_sequence;	// this a hack for function pointer test	// default disabled	boolean qglColorTableEXT = false;	boolean qglActiveTextureARB = false;	boolean qglPointParameterfEXT = false;	boolean qglLockArraysEXT = false;	boolean qwglSwapIntervalEXT = false;	//	=================	//  abstract methods	//	=================	protected abstract void Draw_GetPalette();	abstract void GL_ImageList_f();	abstract void GL_ScreenShot_f();	abstract void GL_SetTexturePalette(int[] palette);	abstract void GL_Strings_f();	abstract void Mod_Modellist_f();	abstract mleaf_t Mod_PointInLeaf(float[] point, model_t model);	abstract void GL_SetDefaultState();	abstract void GL_InitImages();	abstract void Mod_Init(); // Model.java	abstract void R_InitParticleTexture(); // MIsc.java	abstract void R_DrawAliasModel(entity_t e); // Mesh.java	abstract void R_DrawBrushModel(entity_t e); // Surf.java	abstract void Draw_InitLocal();	abstract void R_LightPoint(float[] p, float[] color);	abstract void R_PushDlights();	abstract void R_MarkLeaves();	abstract void R_DrawWorld();	abstract void R_RenderDlights();	abstract void R_DrawAlphaSurfaces();	abstract void Mod_FreeAll();	abstract void GL_ShutdownImages();	abstract void GL_Bind(int texnum);	abstract void GL_TexEnv(int mode);	abstract void GL_TextureMode(String string);	abstract void GL_TextureAlphaMode(String string);	abstract void GL_TextureSolidMode(String string);	abstract void GL_UpdateSwapInterval();	/*	====================================================================		from gl_rmain.c		====================================================================	*/	int GL_TEXTURE0 = GL13.GL_TEXTURE0;	int GL_TEXTURE1 = GL13.GL_TEXTURE1;	model_t r_worldmodel;	float gldepthmin, gldepthmax;	glconfig_t gl_config = new glconfig_t();	glstate_t gl_state = new glstate_t();	image_t r_notexture; // use for bad textures	image_t r_particletexture; // little dot for particles	entity_t currententity;	model_t currentmodel;	cplane_t frustum[] = { new cplane_t(), new cplane_t(), new cplane_t(), new cplane_t()};	int r_visframecount; // bumped when going to a new PVS	int r_framecount; // used for dlight push checking	int c_brush_polys, c_alias_polys;	float v_blend[] = { 0, 0, 0, 0 }; // final blending color	//	//	   view origin	//	float[] vup = { 0, 0, 0 };	float[] vpn = { 0, 0, 0 };	float[] vright = { 0, 0, 0 };	float[] r_origin = { 0, 0, 0 };	//float r_world_matrix[] = new float[16];	FloatBuffer r_world_matrix=BufferUtils.createFloatBuffer(16);		float r_base_world_matrix[] = new float[16];	//	//	   screen size info	//	refdef_t r_newrefdef = new refdef_t();	int r_viewcluster, r_viewcluster2, r_oldviewcluster, r_oldviewcluster2;	cvar_t r_norefresh;	cvar_t r_drawentities;	cvar_t r_drawworld;	cvar_t r_speeds;	cvar_t r_fullbright;	cvar_t r_novis;	cvar_t r_nocull;	cvar_t r_lerpmodels;	cvar_t r_lefthand;	cvar_t r_lightlevel;	// FIXME: This is a HACK to get the client's light level	cvar_t gl_nosubimage;	cvar_t gl_allow_software;	cvar_t gl_vertex_arrays;	cvar_t gl_particle_min_size;	cvar_t gl_particle_max_size;	cvar_t gl_particle_size;	cvar_t gl_particle_att_a;	cvar_t gl_particle_att_b;	cvar_t gl_particle_att_c;	cvar_t gl_ext_swapinterval;	cvar_t gl_ext_palettedtexture;	cvar_t gl_ext_multitexture;	cvar_t gl_ext_pointparameters;	cvar_t gl_ext_compiled_vertex_array;	cvar_t gl_log;	cvar_t gl_bitdepth;	cvar_t gl_drawbuffer;	cvar_t gl_driver;	cvar_t gl_lightmap;	cvar_t gl_shadows;	cvar_t gl_mode;	cvar_t gl_dynamic;	cvar_t gl_monolightmap;	cvar_t gl_modulate;	cvar_t gl_nobind;	cvar_t gl_round_down;	cvar_t gl_picmip;	cvar_t gl_skymip;	cvar_t gl_showtris;	cvar_t gl_ztrick;	cvar_t gl_finish;	cvar_t gl_clear;	cvar_t gl_cull;	cvar_t gl_polyblend;	cvar_t gl_flashblend;	cvar_t gl_playermip;	cvar_t gl_saturatelighting;	cvar_t gl_swapinterval;	cvar_t gl_texturemode;	cvar_t gl_texturealphamode;	cvar_t gl_texturesolidmode;	cvar_t gl_lockpvs;	cvar_t gl_3dlabs_broken;	cvar_t vid_gamma;	cvar_t vid_ref;	// ============================================================================	// to port from gl_rmain.c, ...	// ============================================================================	/**	 * R_CullBox	 * Returns true if the box is completely outside the frustum	 */	final boolean R_CullBox(float[] mins, float[] maxs) {		assert(mins.length == 3 && maxs.length == 3) : "vec3_t bug";		if (r_nocull.value != 0)			return false;		for (int i = 0; i < 4; i++) {			if (Math3D.BoxOnPlaneSide(mins, maxs, frustum[i]) == 2)				return true;		}		return false;	}	/**	 * R_RotateForEntity	 */	final void R_RotateForEntity(entity_t e) {		gl.glTranslatef(e.origin[0], e.origin[1], e.origin[2]);		gl.glRotatef(e.angles[1], 0, 0, 1);		gl.glRotatef(-e.angles[0], 0, 1, 0);		gl.glRotatef(-e.angles[2], 1, 0, 0);	}	/*	=============================================================		   SPRITE MODELS		=============================================================	*/	// stack variable	private final float[] point = { 0, 0, 0 };	/**	 * R_DrawSpriteModel	 */	void R_DrawSpriteModel(entity_t e) {		float alpha = 1.0F;		qfiles.dsprframe_t frame;		qfiles.dsprite_t psprite;		// don't even bother culling, because it's just a single		// polygon without a surface cache		psprite = (qfiles.dsprite_t) currentmodel.extradata;		e.frame %= psprite.numframes;		frame = psprite.frames[e.frame];		if ((e.flags & Defines.RF_TRANSLUCENT) != 0)			alpha = e.alpha;		if (alpha != 1.0F)			gl.glEnable(GL11.GL_BLEND);		gl.glColor4f(1, 1, 1, alpha);		GL_Bind(currentmodel.skins[e.frame].texnum);		GL_TexEnv(GL11.GL_MODULATE);		if (alpha == 1.0)			gl.glEnable(GL11.GL_ALPHA_TEST);		else			gl.glDisable(GL11.GL_ALPHA_TEST);		gl.glBegin(GL11.GL_QUADS);		gl.glTexCoord2f(0, 1);		Math3D.VectorMA(e.origin, -frame.origin_y, vup, point);		Math3D.VectorMA(point, -frame.origin_x, vright, point);		gl.glVertex3f(point[0], point[1], point[2]);		gl.glTexCoord2f(0, 0);		Math3D.VectorMA(e.origin, frame.height - frame.origin_y, vup, point);		Math3D.VectorMA(point, -frame.origin_x, vright, point);		gl.glVertex3f(point[0], point[1], point[2]);		gl.glTexCoord2f(1, 0);		Math3D.VectorMA(e.origin, frame.height - frame.origin_y, vup, point);		Math3D.VectorMA(point, frame.width - frame.origin_x, vright, point);		gl.glVertex3f(point[0], point[1], point[2]);		gl.glTexCoord2f(1, 1);		Math3D.VectorMA(e.origin, -frame.origin_y, vup, point);		Math3D.VectorMA(point, frame.width - frame.origin_x, vright, point);		gl.glVertex3f(point[0], point[1], point[2]);		gl.glEnd();		gl.glDisable(GL11.GL_ALPHA_TEST);		GL_TexEnv(GL11.GL_REPLACE);		if (alpha != 1.0F)			gl.glDisable(GL11.GL_BLEND);		gl.glColor4f(1, 1, 1, 1);	}	// ==================================================================================	// stack variable	private final float[] shadelight = { 0, 0, 0 };	/**	 * R_DrawNullModel	*/	void R_DrawNullModel() {		if ((currententity.flags & Defines.RF_FULLBRIGHT) != 0) {			// cwei wollte blau: shadelight[0] = shadelight[1] = shadelight[2] = 1.0F;			shadelight[0] = shadelight[1] = shadelight[2] = 0.0F;			shadelight[2] = 0.8F;		}		else {			R_LightPoint(currententity.origin, shadelight);		}		gl.glPushMatrix();		R_RotateForEntity(currententity);		gl.glDisable(GL11.GL_TEXTURE_2D);		gl.glColor3f(shadelight[0], shadelight[1], shadelight[2]);		// this replaces the TRIANGLE_FAN		//glut.glutWireCube(gl, 20);		gl.glBegin(GL11.GL_TRIANGLE_FAN);		gl.glVertex3f(0, 0, -16);		int i;		for (i=0 ; i<=4 ; i++) {			gl.glVertex3f((float)(16.0f * Math.cos(i * Math.PI / 2)), (float)(16.0f * Math.sin(i * Math.PI / 2)), 0.0f);		}		gl.glEnd();				gl.glBegin(GL11.GL_TRIANGLE_FAN);		gl.glVertex3f (0, 0, 16);		for (i=4 ; i>=0 ; i--) {			gl.glVertex3f((float)(16.0f * Math.cos(i * Math.PI / 2)), (float)(16.0f * Math.sin(i * Math.PI / 2)), 0.0f);		}		gl.glEnd();				gl.glColor3f(1, 1, 1);		gl.glPopMatrix();		gl.glEnable(GL11.GL_TEXTURE_2D);	}	/**	 * R_DrawEntitiesOnList	 */	void R_DrawEntitiesOnList() {		if (r_drawentities.value == 0.0f)			return;		// draw non-transparent first		int i;		for (i = 0; i < r_newrefdef.num_entities; i++) {			currententity = r_newrefdef.entities[i];			if ((currententity.flags & Defines.RF_TRANSLUCENT) != 0)				continue; // solid			if ((currententity.flags & Defines.RF_BEAM) != 0) {				R_DrawBeam(currententity);			}			else {				currentmodel = currententity.model;				if (currentmodel == null) {					R_DrawNullModel();					continue;				}				switch (currentmodel.type) {					case mod_alias :						R_DrawAliasModel(currententity);						break;					case mod_brush :						R_DrawBrushModel(currententity);						break;					case mod_sprite :						R_DrawSpriteModel(currententity);						break;					default :						Com.Error(Defines.ERR_DROP, "Bad modeltype");						break;				}			}		}		// draw transparent entities		// we could sort these if it ever becomes a problem...		gl.glDepthMask(false); // no z writes		for (i = 0; i < r_newrefdef.num_entities; i++) {			currententity = r_newrefdef.entities[i];			if ((currententity.flags & Defines.RF_TRANSLUCENT) == 0)				continue; // solid			if ((currententity.flags & Defines.RF_BEAM) != 0) {				R_DrawBeam(currententity);			}			else {				currentmodel = currententity.model;				if (currentmodel == null) {					R_DrawNullModel();					continue;				}				switch (currentmodel.type) {					case mod_alias :						R_DrawAliasModel(currententity);						break;					case mod_brush :						R_DrawBrushModel(currententity);						break;					case mod_sprite :						R_DrawSpriteModel(currententity);						break;					default :						Com.Error(Defines.ERR_DROP, "Bad modeltype");						break;				}			}		}		gl.glDepthMask(true); // back to writing	}		// stack variable 	private final float[] up = { 0, 0, 0 };	private final float[] right = { 0, 0, 0 };	/**	 * GL_DrawParticles	 */	void GL_DrawParticles(int num_particles) {		float origin_x, origin_y, origin_z;		Math3D.VectorScale(vup, 1.5f, up);		Math3D.VectorScale(vright, 1.5f, right);				GL_Bind(r_particletexture.texnum);		gl.glDepthMask(false); // no z buffering		gl.glEnable(GL11.GL_BLEND);		GL_TexEnv(GL11.GL_MODULATE);				gl.glBegin(GL11.GL_TRIANGLES);		FloatBuffer sourceVertices = particle_t.vertexArray;		IntBuffer sourceColors = particle_t.colorArray;		float scale;		int color;		for (int j = 0, i = 0; i < num_particles; i++) {			origin_x = sourceVertices.get(j++);			origin_y = sourceVertices.get(j++);			origin_z = sourceVertices.get(j++);			// hack a scale up to keep particles from disapearing			scale =				(origin_x - r_origin[0]) * vpn[0]					+ (origin_y - r_origin[1]) * vpn[1]					+ (origin_z - r_origin[2]) * vpn[2];			scale = (scale < 20) ? 1 :  1 + scale * 0.004f;			color = sourceColors.get(i);					gl.glColor4ub(				(byte)((color) & 0xFF),				(byte)((color >> 8) & 0xFF),				(byte)((color >> 16) & 0xFF),				(byte)((color >>> 24))			);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -