diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 97bf550e1..c48692430 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -1042,6 +1042,11 @@ void CL_ClearState (void) // wipe the entire cl structure memset (&cl, 0, sizeof(cl)); + cl.fog_density = 0; + cl.fog_colour[0] = 0.3; + cl.fog_colour[1] = 0.3; + cl.fog_colour[2] = 0.3; + SZ_Clear (&cls.netchan.message); r_worldentity.model = NULL; @@ -2887,6 +2892,24 @@ void CL_FTP_f(void) #endif */ +void CL_Fog_f(void) +{ + if (Cmd_Argc() <= 1) + { + Con_Printf("Current fog %f (r:%f g:%f b:%f)\n", cl.fog_density, cl.fog_colour[0], cl.fog_colour[1], cl.fog_colour[2]); + } + else + { + cl.fog_density = atof(Cmd_Argv(1)); + if (Cmd_Argc() > 5) + { + cl.fog_colour[0] = atof(Cmd_Argv(2)); + cl.fog_colour[1] = atof(Cmd_Argv(3)); + cl.fog_colour[2] = atof(Cmd_Argv(4)); + } + } +} + void CL_Skygroup_f(void); void SCR_ShowPic_Script_f(void); /* @@ -3141,6 +3164,7 @@ void CL_Init (void) Cmd_AddCommand ("topten", NULL); + Cmd_AddCommand ("fog", CL_Fog_f); Cmd_AddCommand ("kill", NULL); Cmd_AddCommand ("pause", NULL); Cmd_AddCommand ("say", CL_Say_f); diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 71f8fddeb..79ebe5312 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -5944,10 +5944,10 @@ void CLNQ_ParseServerMessage (void) Cmd_ExecuteString("bf", RESTRICT_RCON); break; case svcfitz_fog: - /*density =*/ MSG_ReadByte(); - /*red =*/ MSG_ReadByte(); - /*green =*/ MSG_ReadByte(); - /*blue =*/ MSG_ReadByte(); + cl.fog_density = MSG_ReadByte(); + cl.fog_colour[0] = MSG_ReadByte()/255.0f; + cl.fog_colour[1] = MSG_ReadByte()/255.0f; + cl.fog_colour[2] = MSG_ReadByte()/255.0f; /*time =*/ MSG_ReadShort(); break; case svcfitz_spawnbaseline2: diff --git a/engine/client/client.h b/engine/client/client.h index 1b683b77b..7f854559b 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -590,6 +590,9 @@ typedef struct float skyrotate; vec3_t skyaxis; + float fog_density; + vec3_t fog_colour; + char levelname[40]; // for display on solo scoreboard int playernum[MAX_SPLITS]; qboolean nolocalplayer[MAX_SPLITS]; diff --git a/engine/client/r_2d.c b/engine/client/r_2d.c index bf4d38125..27e4d40b5 100644 --- a/engine/client/r_2d.c +++ b/engine/client/r_2d.c @@ -88,9 +88,20 @@ void R2D_Init(void) missing_texture = R_LoadTexture8("no_texture", 16, 16, (unsigned char*)r_notexture_mip + r_notexture_mip->offsets[0], IF_NOALPHA|IF_NOGAMMA, 0); - draw_backtile = R2D_SafePicFromWad ("backtile"); - if (!draw_backtile) - draw_backtile = R2D_SafeCachePic ("gfx/menu/backtile.lmp"); + draw_backtile = R_RegisterShader("gfx/backtile.lmp", + "{\n" +#ifdef USE_EGL + "program default2d\n" +#endif + "nomipmaps\n" + "{\n" + "map $diffuse\n" + "}\n" + "}\n"); + if (!TEXVALID(draw_backtile->defaulttextures.base)) + draw_backtile->defaulttextures.base = R_LoadHiResTexture("gfx/backtile", NULL, IF_NOPICMIP|IF_NOMIPMAP); + if (!TEXVALID(draw_backtile->defaulttextures.base)) + draw_backtile->defaulttextures.base = R_LoadHiResTexture("gfx/menu/backtile", NULL, IF_NOPICMIP|IF_NOMIPMAP); shader_draw_fill = R_RegisterShader("fill_opaque", "{\n" @@ -136,13 +147,17 @@ void R2D_Init(void) "{\n" "#ifdef VERTEX_SHADER\n" "\ + uniform mat4 m_view;\ + uniform mat4 m_projection;\ + attribute vec3 v_position;\ + attribute vec2 v_texcoord;\ varying vec2 texcoord;\ uniform vec3 rendertexturescale;\ void main(void)\ {\ - texcoord.x = gl_MultiTexCoord0.x*rendertexturescale.x;\ - texcoord.y = (1-gl_MultiTexCoord0.y)*rendertexturescale.y;\ - gl_Position = ftransform();\ + texcoord.x = v_texcoord.x*rendertexturescale.x;\ + texcoord.y = (1.0-v_texcoord.y)*rendertexturescale.y;\ + gl_Position = m_projection * m_view * vec4(v_position, 1.0);\ }\ \n" "#endif\n" @@ -150,13 +165,13 @@ void R2D_Init(void) "\ varying vec2 texcoord;\ uniform vec3 colorparam;\ - uniform sampler2D source;\ + uniform sampler2D s_t0;\ uniform int invert;\ const vec3 lumfactors = vec3(0.299, 0.587, 0.114);\ const vec3 invertvec = vec3(1.0, 1.0, 1.0);\ void main(void)\ {\ - vec3 texcolor = texture2D(source, texcoord).rgb;\ + vec3 texcolor = texture2D(s_t0, texcoord).rgb;\ float luminance = dot(lumfactors, texcolor);\ texcolor = vec3(luminance, luminance, luminance);\ texcolor *= colorparam;\ @@ -167,7 +182,6 @@ void R2D_Init(void) "}\n" "param cvari r_menutint_inverse invert\n" "param cvar3f r_menutint colorparam\n" - "param texture 0 source\n" "param rendertexturescale rendertexturescale\n" "{\n" @@ -402,7 +416,7 @@ void R2D_TileClear (int x, int y, int w, int h) draw_mesh_st[3][0] = newsl; draw_mesh_st[3][1] = newth; - BE_DrawMesh_Single(draw_backtile, &draw_mesh, NULL, NULL); + BE_DrawMesh_Single(draw_backtile, &draw_mesh, NULL, &draw_backtile->defaulttextures); } void R2D_Conback_Callback(struct cvar_s *var, char *oldvalue) diff --git a/engine/client/render.h b/engine/client/render.h index 5f4d72849..46c8a5428 100644 --- a/engine/client/render.h +++ b/engine/client/render.h @@ -144,6 +144,10 @@ typedef struct float m_projection[16]; float m_view[16]; + vec3_t gfog_rgb; + float gfog_alpha; + float gfog_density; + vrect_t pxrect; /*vrect, but in pixels rather than virtual coords*/ qboolean externalview; /*draw external models and not viewmodels*/ qboolean recurse; /*in a mirror/portal/half way through drawing something else*/ diff --git a/engine/client/renderer.c b/engine/client/renderer.c index 2c3d2e1f0..30242ba13 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -197,7 +197,7 @@ extern cvar_t r_drawentities; extern cvar_t r_drawviewmodel; extern cvar_t r_drawworld; extern cvar_t r_fullbright; -cvar_t r_mirroralpha = SCVARF("r_mirroralpha","1", CVAR_CHEAT); +cvar_t r_mirroralpha = SCVARF("r_mirroralpha","1", CVAR_CHEAT|CVAR_SHADERSYSTEM); extern cvar_t r_netgraph; extern cvar_t r_norefresh; extern cvar_t r_novis; @@ -349,7 +349,6 @@ void GLRenderer_Init(void) Cvar_Register (&vid_desktopgamma, GLRENDEREROPTIONS); //renderer - Cvar_Register (&r_mirroralpha, GLRENDEREROPTIONS); Cvar_Register (&r_norefresh, GLRENDEREROPTIONS); Cvar_Register (&gl_affinemodels, GLRENDEREROPTIONS); @@ -525,6 +524,7 @@ void Renderer_Init(void) Cvar_Register (&vid_desktopsettings, VIDCOMMANDGROUP); + Cvar_Register (&r_mirroralpha, GLRENDEREROPTIONS); Cvar_Register (&r_skyboxname, GRAPHICALNICETIES); Cbuf_AddText("alias sky r_skybox\n", RESTRICT_LOCAL); /*alternative name for users*/ diff --git a/engine/client/view.c b/engine/client/view.c index 925702136..01372acb3 100644 --- a/engine/client/view.c +++ b/engine/client/view.c @@ -953,6 +953,11 @@ void V_CalcRefdef (int pnum) return; #endif + + r_refdef.gfog_density = cl.fog_density; + r_refdef.gfog_alpha = cl.fog_density?1:0;//cl.fog_alpha; + VectorCopy(cl.fog_colour, r_refdef.gfog_rgb); + // view is the weapon model (only visible from inside body) view = &cl.viewent[pnum]; diff --git a/engine/client/wad.c b/engine/client/wad.c index cd67f3fa8..34010240f 100644 --- a/engine/client/wad.c +++ b/engine/client/wad.c @@ -631,6 +631,19 @@ void Mod_ParseInfoFromEntityLump(model_t *wmodel, char *data, char *mapname) //a { Q_strncpyz(cl.skyname, com_token, sizeof(cl.skyname)); } + else if (!strcmp("fog", key)) + { + char *s; + Q_strncpyz(key, com_token, sizeof(key)); + s = COM_Parse(key); + cl.fog_density = atof(com_token); + s = COM_Parse(s); + cl.fog_colour[0] = atof(com_token); + s = COM_Parse(s); + cl.fog_colour[1] = atof(com_token); + s = COM_Parse(s); + cl.fog_colour[2] = atof(com_token); + } else if (!strcmp("sky", key)) // for Quake2 maps { Q_strncpyz(cl.skyname, com_token, sizeof(cl.skyname)); diff --git a/engine/d3d/d3d_backend.c b/engine/d3d/d3d_backend.c index 2416dd2fe..cbde8a58e 100644 --- a/engine/d3d/d3d_backend.c +++ b/engine/d3d/d3d_backend.c @@ -466,7 +466,6 @@ static void D3DBE_ApplyShaderBits(unsigned int bits) void D3DBE_Init(void) { - unsigned int i; be_maxpasses = MAX_TMUS; memset(&shaderstate, 0, sizeof(shaderstate)); shaderstate.curvertdecl = -1; @@ -1499,6 +1498,21 @@ static qboolean BE_DrawMeshChain_SetupPass(shaderpass_t *pass, unsigned int vert return true; } +static void BE_RenderMeshProgram(unsigned int vertcount, unsigned int idxfirst, unsigned int idxcount) +{ + shader_t *s = shaderstate.curshader; + shaderpass_t *pass = s->passes; + + IDirect3DDevice9_SetVertexShader(pD3DDev9, s->prog->handle[0].hlsl.vert); + IDirect3DDevice9_SetPixelShader(pD3DDev9, s->prog->handle[0].hlsl.frag); + +// IDirect3DDevice9_SetVertexShaderConstantF(pD3DDev9, + d3dcheck(IDirect3DDevice9_DrawIndexedPrimitive(pD3DDev9, D3DPT_TRIANGLELIST, 0, 0, vertcount, idxfirst, idxcount/3)); + + IDirect3DDevice9_SetVertexShader(pD3DDev9, NULL); + IDirect3DDevice9_SetPixelShader(pD3DDev9, NULL); +} + static void BE_Cull(unsigned int cullflags) { cullflags |= r_refdef.flipcull; @@ -1574,8 +1588,9 @@ static void BE_DrawMeshChain_Internal(void) d3dcheck(IDirect3DIndexBuffer9_Unlock(shaderstate.dynidx_buff)); d3dcheck(IDirect3DDevice9_SetIndices(pD3DDev9, shaderstate.dynidx_buff)); - if (shaderstate.mode == BEM_DEPTHONLY) + switch (shaderstate.mode) { + case BEM_DEPTHONLY: IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_COLORWRITEENABLE, 0); /*deactivate any extras*/ for (passno = 0; passno < shaderstate.lastpasscount; ) @@ -1588,21 +1603,29 @@ static void BE_DrawMeshChain_Internal(void) shaderstate.lastpasscount = 0; d3dcheck(IDirect3DDevice9_DrawIndexedPrimitive(pD3DDev9, D3DPT_TRIANGLELIST, 0, 0, vertcount, idxfirst, idxcount/3)); IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_ALPHA); - } - else - { - /*now go through and flush each pass*/ - for (passno = 0; passno < shaderstate.curshader->numpasses; passno += pass->numMergedPasses) + break; + default: + case BEM_STANDARD: + if (shaderstate.curshader->prog) { - if (!BE_DrawMeshChain_SetupPass(pass+passno, vertcount)) - continue; - #ifdef BENCH - shaderstate.bench.draws++; - if (shaderstate.bench.clamp && shaderstate.bench.clamp < shaderstate.bench.draws) - continue; - #endif - d3dcheck(IDirect3DDevice9_DrawIndexedPrimitive(pD3DDev9, D3DPT_TRIANGLELIST, 0, 0, vertcount, idxfirst, idxcount/3)); + BE_RenderMeshProgram(vertcount, idxfirst, idxcount); } + else + { + /*now go through and flush each pass*/ + for (passno = 0; passno < shaderstate.curshader->numpasses; passno += pass->numMergedPasses) + { + if (!BE_DrawMeshChain_SetupPass(pass+passno, vertcount)) + continue; + #ifdef BENCH + shaderstate.bench.draws++; + if (shaderstate.bench.clamp && shaderstate.bench.clamp < shaderstate.bench.draws) + continue; + #endif + d3dcheck(IDirect3DDevice9_DrawIndexedPrimitive(pD3DDev9, D3DPT_TRIANGLELIST, 0, 0, vertcount, idxfirst, idxcount/3)); + } + } + break; } } diff --git a/engine/d3d/d3d_image.c b/engine/d3d/d3d_image.c index 1d4854b1d..cf5369d02 100644 --- a/engine/d3d/d3d_image.c +++ b/engine/d3d/d3d_image.c @@ -5,7 +5,7 @@ DECLARE_HANDLE(HMONITOR); #endif #include -LPDIRECT3DDEVICE9 pD3DDev9; +extern LPDIRECT3DDEVICE9 pD3DDev9; typedef struct d3dtexture_s { @@ -133,7 +133,6 @@ static void Upload_Texture_32(LPDIRECT3DTEXTURE9 tex, unsigned int *data, int wi unsigned char swapbuf[4]; unsigned char swapbuf2[4]; D3DLOCKED_RECT lock; - int i; D3DSURFACE_DESC desc; IDirect3DTexture9_GetLevelDesc(tex, 0, &desc); diff --git a/engine/d3d/vid_d3d.c b/engine/d3d/vid_d3d.c index a91937011..d8cc97b96 100644 --- a/engine/d3d/vid_d3d.c +++ b/engine/d3d/vid_d3d.c @@ -347,7 +347,20 @@ static LRESULT WINAPI D3D9_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA IN_RawInput_Read((HANDLE)lParam); break; - case WM_SIZE: + case WM_GETMINMAXINFO: + { + RECT windowrect; + RECT clientrect; + MINMAXINFO *mmi = (MINMAXINFO *) lParam; + + GetWindowRect (hWnd, &windowrect); + GetClientRect (hWnd, &clientrect); + + mmi->ptMinTrackSize.x = 320 + ((windowrect.right - windowrect.left) - (clientrect.right - clientrect.left)); + mmi->ptMinTrackSize.y = 200 + ((windowrect.bottom - windowrect.top) - (clientrect.bottom - clientrect.top)); + } + return 0; + case WM_SIZE: if (!vid_initializing) { extern cvar_t vid_conautoscale, vid_conwidth; @@ -529,7 +542,7 @@ static qboolean initD3D9Device(HWND hWnd, rendererstate_t *info, unsigned int de char *s; for (s = inf.Description + strlen(inf.Description)-1; s >= inf.Description && *s <= ' '; s--) *s = 0; - Con_Printf("D3D9: Using device %s\n", inf.Description); + Con_Printf("D3D9: %s\n", inf.Description); vid.numpages = d3dpp.BackBufferCount; @@ -555,6 +568,8 @@ static qboolean initD3D9Device(HWND hWnd, rendererstate_t *info, unsigned int de rect.bottom = d3dpp.BackBufferHeight; AdjustWindowRectEx(&rect, WS_OVERLAPPEDWINDOW, FALSE, 0); MoveWindow(d3dpp.hDeviceWindow, mi.rcWork.left, mi.rcWork.top, rect.right-rect.left, rect.bottom-rect.top, false); + + D3DShader_Init(); } return true; //successful } diff --git a/engine/dotnet2005/ftequake.vcproj b/engine/dotnet2005/ftequake.vcproj index 52fd4d706..06dd9f1dc 100644 --- a/engine/dotnet2005/ftequake.vcproj +++ b/engine/dotnet2005/ftequake.vcproj @@ -11361,176 +11361,6 @@ /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -14105,13 +13935,6 @@ - - - - - - - - - - - - + + diff --git a/engine/gl/gl_backend.c b/engine/gl/gl_backend.c index 363fe6237..4c4126099 100644 --- a/engine/gl/gl_backend.c +++ b/engine/gl/gl_backend.c @@ -1,6 +1,7 @@ #include "quakedef.h" //#define FORCESTATE +//#define WIREFRAME #ifdef GLQUAKE @@ -432,6 +433,12 @@ void GL_SetShaderState2D(qboolean is2d) { shaderstate.updatetime = realtime; shaderstate.force2d = is2d; +#ifdef WIREFRAME + if (!is2d) + qglPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + else + qglPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +#endif BE_SelectMode(BEM_STANDARD, 0); } @@ -928,29 +935,39 @@ void Shader_LightPass_Spot(char *shortname, shader_t *s, const void *args) Shader_DefaultScript(shortname, s, shadertext); } -texid_t GenerateFogTexture(void) +void GenerateFogTexture(texid_t *tex, float density, float zscale) { #define FOGS 256 #define FOGT 32 byte_vec4_t fogdata[FOGS*FOGT]; int s, t; - float f; + float f, z; for(s = 0; s < FOGS; s++) for(t = 0; t < FOGT; t++) { - f = (float)s / FOGS; + z = (float)s / (FOGS-1); + z *= zscale; + + if (0)//q3 + f = pow(f, 0.5); + else if (1)//GL_EXP + f = 1-exp(-density * z); + else //GL_EXP2 + f = 1-exp(-(density*density) * z); if (f < 0) f = 0; if (f > 1) f = 1; - f = pow(f, 0.5); + fogdata[t*FOGS + s][0] = 255; fogdata[t*FOGS + s][1] = 255; fogdata[t*FOGS + s][2] = 255; fogdata[t*FOGS + s][3] = 255*f; } - return R_LoadTexture32("fog", FOGS, FOGT, fogdata, IF_CLAMP|IF_NOMIPMAP); + if (!TEXVALID(*tex)) + *tex = R_AllocNewTexture(FOGS, FOGT); + R_Upload(*tex, "fog", TF_RGBA32, fogdata, NULL, FOGS, FOGT, IF_CLAMP|IF_NOMIPMAP); } void GLBE_Init(void) @@ -1001,8 +1018,7 @@ void GLBE_Init(void) currententity = &r_worldentity; - - shaderstate.fogtexture = GenerateFogTexture(); + shaderstate.fogtexture = r_nulltex; } //end tables @@ -2648,10 +2664,17 @@ void GLBE_SelectEntity(entity_t *ent) qglDepthRange (gldepthmin, gldepthmin + 0.3*(gldepthmax-gldepthmin)); } -void BE_SelectFog(vec3_t colour, float alpha, float fardist) +void BE_SelectFog(vec3_t colour, float alpha, float density) { + float zscale; + + density /= 64; + + zscale = 2048; /*this value is meant to be the distance at which fog the value becomes as good as fully fogged, just hack it to 2048...*/ + GenerateFogTexture(&shaderstate.fogtexture, density, zscale); + shaderstate.fogfar = 1/zscale; /*scaler for z coords*/ + qglColor4f(colour[0], colour[1], colour[2], alpha); - shaderstate.fogfar = 1/fardist; } #ifdef RTLIGHTS @@ -3089,8 +3112,14 @@ static void BE_SubmitMeshesSortList(batch_t *sortlist) if (batch->shader->flags & SHADER_SKY) { if (shaderstate.mode == BEM_STANDARD) - R_DrawSkyChain (batch); - if (shaderstate.mode != BEM_FOG) + { + if (!batch->shader->prog) + { + R_DrawSkyChain (batch); + continue; + } + } + else if (shaderstate.mode != BEM_FOG) continue; } @@ -3311,29 +3340,11 @@ void GLBE_DrawWorld (qbyte *vis) BE_DrawPolys(false); - if (1)//gl_fog.value) + if (r_refdef.gfog_alpha) { - cvar_t *v; - vec3_t rgb; - float alpha; - float fardist; - v = Cvar_Get("_gl_fog", "0", 0, "experimental"); - if (v->value) - { - v = Cvar_Get("_gl_fog_red", "1", 0, "experimental"); - rgb[0] = v->value; - v = Cvar_Get("_gl_fog_green", "1", 0, "experimental"); - rgb[1] = v->value; - v = Cvar_Get("_gl_fog_blue", "1", 0, "experimental"); - rgb[2] = v->value; - v = Cvar_Get("_gl_fog_alpha", "1", 0, "experimental"); - alpha = v->value; - v = Cvar_Get("_gl_fog_dist", "512", 0, "experimental"); - fardist = v->value; - BE_SelectMode(BEM_FOG, 0); - BE_SelectFog(rgb, alpha, fardist); - GLBE_SubmitMeshes(true, batches); - } + BE_SelectMode(BEM_FOG, 0); + BE_SelectFog(r_refdef.gfog_rgb, r_refdef.gfog_alpha, r_refdef.gfog_density); + GLBE_SubmitMeshes(true, batches); } BE_SelectEntity(&r_worldentity); diff --git a/engine/gl/gl_shader.c b/engine/gl/gl_shader.c index d9e74b996..7ede787c7 100644 --- a/engine/gl/gl_shader.c +++ b/engine/gl/gl_shader.c @@ -777,7 +777,7 @@ static void Shader_LoadPermutations(program_t *prog, char *script, int qrtype) if (qrenderer != qrtype) { } - #ifdef GLQUAKE +#ifdef GLQUAKE else if (qrenderer == QR_OPENGL) { if (nopermutation & p) @@ -793,7 +793,24 @@ static void Shader_LoadPermutations(program_t *prog, char *script, int qrtype) permutationdefines[pn++] = NULL; prog->handle[p].glsl = GLSlang_CreateProgram(permutationdefines, script, script); } - #endif +#endif +#ifdef D3DQUAKE + else if (qrenderer == QR_DIRECT3D) + { + if (nopermutation & p) + { + continue; + } + pn = 0; + for (n = 0; permutationname[n]; n++) + { + if (p & (1u<handle[p] = D3DShader_CreateProgram(permutationdefines, script, script); + } +#endif } Shader_ProgAutoFields(prog); @@ -1031,14 +1048,14 @@ struct sbuiltin_s "uniform sampler2D s_t1;\n" "uniform mediump float e_time;\n" - "uniform mediump vec3 eyepos;\n" + "uniform mediump vec3 e_eyepos;\n" "varying mediump vec3 pos;\n" "void main (void)\n" "{\n" " mediump vec2 tccoord;\n" - " mediump vec3 dir = pos - eyepos;\n" + " mediump vec3 dir = pos - e_eyepos;\n" " dir.z *= 3.0;\n" " dir.xy /= 0.5*length(dir);\n" @@ -1068,7 +1085,7 @@ struct sbuiltin_s "#ifdef FRAGMENT_SHADER\n" "uniform float e_time;\n" - "uniform vec3 eyepos;\n" + "uniform vec3 e_eyepos;\n" "varying vec3 pos;\n" "uniform sampler2D s_t0;\n" "uniform sampler2D s_t1;\n" @@ -1077,7 +1094,7 @@ struct sbuiltin_s "{\n" " vec2 tccoord;\n" - " vec3 dir = pos - eyepos;\n" + " vec3 dir = pos - e_eyepos;\n" " dir.z *= 3.0;\n" " dir.xy /= 0.5*length(dir);\n" @@ -1209,6 +1226,56 @@ struct sbuiltin_s "}\n" "#endif\n" }, +#endif +#if 0//def D3DQUAKE + {QR_DIRECT3D, 9, "defaultsky", + + "struct a2v {\n" + "float4 pos: POSITION;\n" + "};\n" + "struct v2f {\n" + "#ifdef VERTEX_SHADER\n" + "float4 pos: POSITION;\n" + "#endif\n" + "float3 vpos: COLOR;\n" + "};\n" + + "#ifdef VERTEX_SHADER\n" + "float4x4 ModelViewProj;\n" + "v2f main (a2v inp)\n" + "{\n" + " v2f outp;\n" + " outp.pos = mul(inp.pos, ModelViewProj);\n" + " outp.vpos = inp.pos;\n" + " return outp;\n" + "}\n" + "#endif\n" + + "#ifdef FRAGMENT_SHADER\n" + "float e_time;\n" + "float3 e_eyepos;\n" + "sampler2D s_t0;\n" + "sampler2D s_t1;\n" + "float4 main (v2f inp) : COLOR0\n" + "{\n" + " float2 tccoord;\n" + + " float3 dir = inp.vpos - e_eyepos;\n" + + " dir.z *= 3.0;\n" + " dir.xy /= 0.5*length(dir);\n" + + " tccoord = (dir.xy + e_time*0.03125);\n" + " float4 solid = tex2D(s_t0, tccoord);\n" + + " tccoord = (dir.xy + e_time*0.0625);\n" + " float4 clouds = tex2D(s_t1, tccoord);\n" + + " return float4((solid.rgb*(1.0-clouds.a)) + (clouds.a*clouds.rgb), 1);\n" +// " return solid.rgb;/*gl_FragColor.g = clouds.r;*/gl_FragColor.b = clouds.a;\n" + "}\n" + "#endif\n" + }, #endif {QR_NONE} }; @@ -1317,6 +1384,7 @@ static void Shader_ProgAutoFields(program_t *prog) /*ent properties*/ {"e_time", SP_TIME}, + {"e_eyepos", SP_EYEPOS}, {"e_colour", SP_ENTCOLOURS}, {"e_topcolour", SP_TOPCOLOURS}, {"e_bottomcolour", SP_BOTTOMCOLOURS}, @@ -1439,6 +1507,10 @@ static void Shader_GLSLProgramName (shader_t *shader, shaderpass_t *pass, char * { Shader_SLProgramName(shader,pass,ptr,QR_OPENGL); } +static void Shader_ProgramName (shader_t *shader, shaderpass_t *pass, char **ptr) +{ + Shader_SLProgramName(shader,pass,ptr,qrenderer); +} static void Shader_HLSLProgramName (shader_t *shader, shaderpass_t *pass, char **ptr) { Shader_SLProgramName(shader,pass,ptr,QR_DIRECT3D); @@ -1627,7 +1699,7 @@ static shaderkey_t shaderkeys[] = {"entitymergable", Shader_EntityMergable}, {"glslprogram", Shader_GLSLProgramName}, - {"program", Shader_GLSLProgramName}, //legacy + {"program", Shader_ProgramName}, //legacy {"hlslprogram", Shader_HLSLProgramName}, //for d3d {"param", Shader_ProgramParam}, @@ -3575,28 +3647,11 @@ void Shader_DefaultBSPQ1(char *shortname, shader_t *s, const void *args) Shader_Free(s); memset (s, 0, sizeof(*s)); } -#ifdef GLQUAKE - if (!builtin && qrenderer == QR_OPENGL && gl_config.arb_shader_objects) - builtin = ( - "{\n" - "sort sky\n" - "program defaultsky\n" - "param eyepos eyepos\n" - "surfaceparm nodlight\n" - //"skyparms - 512 -\n" - "{\n" - "map $diffuse\n" - "}\n" - "{\n" - "map $fullbright\n" - "}\n" - "}\n" - ); -#endif if (!builtin) builtin = ( "{\n" "sort sky\n" + "program defaultsky\n" "skyparms - 512 -\n" /*WARNING: these values are not authentic quake, only close aproximations*/ "{\n" diff --git a/engine/gl/gl_vidnt.c b/engine/gl/gl_vidnt.c index 2264ae219..d2e22727d 100644 --- a/engine/gl/gl_vidnt.c +++ b/engine/gl/gl_vidnt.c @@ -1705,6 +1705,19 @@ LONG WINAPI GLMainWndProc ( IN_RawInput_Read((HANDLE)lParam); break; + case WM_GETMINMAXINFO: + { + RECT windowrect; + RECT clientrect; + MINMAXINFO *mmi = (MINMAXINFO *) lParam; + + GetWindowRect (hWnd, &windowrect); + GetClientRect (hWnd, &clientrect); + + mmi->ptMinTrackSize.x = 320 + ((windowrect.right - windowrect.left) - (clientrect.right - clientrect.left)); + mmi->ptMinTrackSize.y = 200 + ((windowrect.bottom - windowrect.top) - (clientrect.bottom - clientrect.top)); + } + return 0; case WM_SIZE: if (!vid_initializing) { diff --git a/engine/gl/shader.h b/engine/gl/shader.h index ea42a7bb2..1ffdc32d0 100644 --- a/engine/gl/shader.h +++ b/engine/gl/shader.h @@ -314,6 +314,13 @@ typedef struct { union programhandle_u { int glsl; +#ifdef D3DQUAKE + struct + { + void *vert; + void *frag; + } hlsl; +#endif }; typedef struct programshared_s @@ -452,6 +459,9 @@ void D3DBE_UploadAllLightmaps(void); void D3DBE_DrawWorld (qbyte *vis); qboolean D3DBE_LightCullModel(vec3_t org, model_t *model); void D3DBE_SelectEntity(entity_t *ent); + +union programhandle_u D3DShader_CreateProgram (char **precompilerconstants, char *vert, char *frag); +void D3DShader_Init(void); #endif //Asks the backend to invoke DrawMeshChain for each surface, and to upload lightmaps as required diff --git a/engine/server/pr_cmds.c b/engine/server/pr_cmds.c index 1b49d3997..e77fd2666 100644 --- a/engine/server/pr_cmds.c +++ b/engine/server/pr_cmds.c @@ -611,7 +611,7 @@ void PR_LoadGlabalStruct(void) } if (!((nqglobalvars_t*)pr_globals)->trace_fraction) { - ((nqglobalvars_t*)pr_globals)->trace_fraction = (vec3_t *)PR_FindGlobal(svprogfuncs, "trace_frac", 0); + ((nqglobalvars_t*)pr_globals)->trace_fraction = (float *)PR_FindGlobal(svprogfuncs, "trace_frac", 0); if (!((nqglobalvars_t*)pr_globals)->trace_fraction) SV_Error("Could not find export trace_fraction in progs\n"); }