fog control, vaugely similar to fitzquake, but runs slower. does at least work properly with rtlights.

fixed menutint.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3761 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2011-03-31 02:32:32 +00:00
parent a0f3482093
commit 6a4976300e
17 changed files with 287 additions and 292 deletions

View file

@ -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);

View file

@ -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:

View file

@ -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];

View file

@ -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)

View file

@ -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*/

View file

@ -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*/

View file

@ -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];

View file

@ -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));

View file

@ -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;
}
}

View file

@ -5,7 +5,7 @@
DECLARE_HANDLE(HMONITOR);
#endif
#include <d3d9.h>
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);

View file

@ -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
}

View file

@ -11361,176 +11361,6 @@
/>
</FileConfiguration>
</File>
<File
RelativePath="..\client\r_bulleten.c"
>
<FileConfiguration
Name="MinGLDebug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="MinGLDebug|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="D3DDebug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="D3DDebug|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="MinGLRelease|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="MinGLRelease|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="GLDebug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="GLDebug|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="Release Dedicated Server|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="Release Dedicated Server|x64"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="MRelease|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="MRelease|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="Debug Dedicated Server|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="Debug Dedicated Server|x64"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="MDebug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="MDebug|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="GLRelease|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
<FileConfiguration
Name="GLRelease|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
/>
</FileConfiguration>
</File>
<File
RelativePath="..\client\r_part.c"
>
@ -14105,13 +13935,6 @@
<File
RelativePath="..\client\snd_al.c"
>
<FileConfiguration
Name="D3DDebug|x64"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Release Dedicated Server|Win32"
ExcludedFromBuild="true"
@ -14128,20 +13951,6 @@
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="MRelease|Win32"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="MRelease|x64"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug Dedicated Server|Win32"
ExcludedFromBuild="true"
@ -14158,13 +13967,6 @@
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="MDebug|x64"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\client\snd_directx.c"
@ -28256,6 +28058,10 @@
RelativePath="..\d3d\d3d_image.c"
>
</File>
<File
RelativePath="..\d3d\d3d_shader.c"
>
</File>
<File
RelativePath="..\d3d\vid_d3d.c"
>

View file

@ -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);

View file

@ -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<<n))
permutationdefines[pn++] = permutationname[n];
}
permutationdefines[pn++] = NULL;
prog->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"

View file

@ -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)
{

View file

@ -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

View file

@ -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");
}