X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=r_sky.c;h=6ab1f25a4ba00dc4a780c94855854b9b646a20bf;hb=195a5f4e8031dcc37d16fc81e7dc9da044721b33;hp=3e9d9bf58945eed13182d45f2b1d768a4e3dca75;hpb=bc8b80ee19f7a87e326fa765427d0c4e8dfe9940;p=xonotic%2Fdarkplaces.git diff --git a/r_sky.c b/r_sky.c index 3e9d9bf5..6ab1f25a 100644 --- a/r_sky.c +++ b/r_sky.c @@ -1,52 +1,20 @@ #include "quakedef.h" -void LoadSky_f(void); - cvar_t r_sky = {CVAR_SAVE, "r_sky", "1"}; - -static char skyworldname[1024]; -rtexture_t *solidskytexture; -rtexture_t *alphaskytexture; -static qboolean skyavailable_quake; -static qboolean skyavailable_box; -static rtexturepool_t *skytexturepool; - +qboolean skyavailable_quake; +qboolean skyavailable_box; int skyrendernow; int skyrendermasked; -static void r_sky_start(void) -{ - skytexturepool = R_AllocTexturePool(); - solidskytexture = NULL; - alphaskytexture = NULL; -} - -static void r_sky_shutdown(void) -{ - R_FreeTexturePool(&skytexturepool); - solidskytexture = NULL; - alphaskytexture = NULL; -} - -int R_SetSkyBox(char *sky); - -static void r_sky_newmap(void) -{ - skyavailable_quake = false; - if (!strcmp(skyworldname, cl.worldmodel->name)) - skyavailable_quake = true; -} - -void R_Sky_Init(void) -{ - Cmd_AddCommand ("loadsky", &LoadSky_f); - Cvar_RegisterVariable (&r_sky); - R_RegisterModule("R_Sky", r_sky_start, r_sky_shutdown, r_sky_newmap); -} - +static rtexture_t *solidskytexture; +static rtexture_t *alphaskytexture; static int skyrendersphere; static int skyrenderbox; +static rtexturepool_t *skytexturepool; +static char skyname[256]; +static char *suf[6] = {"rt", "bk", "lf", "ft", "up", "dn"}; +static rtexture_t *skyboxside[6]; void R_SkyStartFrame(void) { @@ -66,16 +34,12 @@ void R_SkyStartFrame(void) } } -static char skyname[256]; - /* ================== R_SetSkyBox ================== */ -static char *suf[6] = {"rt", "bk", "lf", "ft", "up", "dn"}; -static rtexture_t *skyboxside[6]; -int R_SetSkyBox(char *sky) +int R_SetSkyBox(const char *sky) { int i; char name[1024]; @@ -154,103 +118,96 @@ int skyboxindex[6] = {0, 1, 2, 0, 2, 3}; static void R_SkyBox(void) { - rmeshbufferinfo_t m; + rmeshstate_t m; #define R_SkyBoxPolyVec(i,s,t,x,y,z) \ - m.vertex[i * 4 + 0] = (x) * 16.0f + r_origin[0];\ - m.vertex[i * 4 + 1] = (y) * 16.0f + r_origin[1];\ - m.vertex[i * 4 + 2] = (z) * 16.0f + r_origin[2];\ - m.texcoords[0][i * 2 + 0] = (s) * (254.0f/256.0f) + (1.0f/256.0f);\ - m.texcoords[0][i * 2 + 1] = (t) * (254.0f/256.0f) + (1.0f/256.0f); + varray_vertex[i * 4 + 0] = (x) * 16.0f;\ + varray_vertex[i * 4 + 1] = (y) * 16.0f;\ + varray_vertex[i * 4 + 2] = (z) * 16.0f;\ + varray_texcoord[0][i * 2 + 0] = (s) * (254.0f/256.0f) + (1.0f/256.0f);\ + varray_texcoord[0][i * 2 + 1] = (t) * (254.0f/256.0f) + (1.0f/256.0f); memset(&m, 0, sizeof(m)); - m.transparent = false; m.blendfunc1 = GL_ONE; m.blendfunc2 = GL_ZERO; + m.wantoverbright = false; m.depthdisable = true; // don't modify or read zbuffer - m.numtriangles = 2; - m.numverts = 4; m.tex[0] = R_GetTexture(skyboxside[3]); // front - if (R_Mesh_Draw_GetBuffer(&m)) - { - memcpy(m.index, skyboxindex, sizeof(int[6])); - m.color[0] = m.color[4] = m.color[8] = m.color[12] = m.colorscale; - m.color[1] = m.color[5] = m.color[9] = m.color[13] = m.colorscale; - m.color[2] = m.color[6] = m.color[10] = m.color[14] = m.colorscale; - m.color[3] = m.color[7] = m.color[11] = m.color[15] = 1; - R_SkyBoxPolyVec(0, 1, 0, 1, -1, 1); - R_SkyBoxPolyVec(1, 1, 1, 1, -1, -1); - R_SkyBoxPolyVec(2, 0, 1, 1, 1, -1); - R_SkyBoxPolyVec(3, 0, 0, 1, 1, 1); - } + R_Mesh_State(&m); + + memcpy(varray_element, skyboxindex, sizeof(int[6])); + varray_color[0] = varray_color[4] = varray_color[8] = varray_color[12] = mesh_colorscale; + varray_color[1] = varray_color[5] = varray_color[9] = varray_color[13] = mesh_colorscale; + varray_color[2] = varray_color[6] = varray_color[10] = varray_color[14] = mesh_colorscale; + varray_color[3] = varray_color[7] = varray_color[11] = varray_color[15] = 1; + R_SkyBoxPolyVec(0, 1, 0, 1, -1, 1); + R_SkyBoxPolyVec(1, 1, 1, 1, -1, -1); + R_SkyBoxPolyVec(2, 0, 1, 1, 1, -1); + R_SkyBoxPolyVec(3, 0, 0, 1, 1, 1); + R_Mesh_Draw(4, 2); m.tex[0] = R_GetTexture(skyboxside[1]); // back - if (R_Mesh_Draw_GetBuffer(&m)) - { - memcpy(m.index, skyboxindex, sizeof(int[6])); - m.color[0] = m.color[4] = m.color[8] = m.color[12] = m.colorscale; - m.color[1] = m.color[5] = m.color[9] = m.color[13] = m.colorscale; - m.color[2] = m.color[6] = m.color[10] = m.color[14] = m.colorscale; - m.color[3] = m.color[7] = m.color[11] = m.color[15] = 1; - R_SkyBoxPolyVec(0, 1, 0, -1, 1, 1); - R_SkyBoxPolyVec(1, 1, 1, -1, 1, -1); - R_SkyBoxPolyVec(2, 0, 1, -1, -1, -1); - R_SkyBoxPolyVec(3, 0, 0, -1, -1, 1); - } + R_Mesh_State(&m); + memcpy(varray_element, skyboxindex, sizeof(int[6])); + varray_color[0] = varray_color[4] = varray_color[8] = varray_color[12] = mesh_colorscale; + varray_color[1] = varray_color[5] = varray_color[9] = varray_color[13] = mesh_colorscale; + varray_color[2] = varray_color[6] = varray_color[10] = varray_color[14] = mesh_colorscale; + varray_color[3] = varray_color[7] = varray_color[11] = varray_color[15] = 1; + R_SkyBoxPolyVec(0, 1, 0, -1, 1, 1); + R_SkyBoxPolyVec(1, 1, 1, -1, 1, -1); + R_SkyBoxPolyVec(2, 0, 1, -1, -1, -1); + R_SkyBoxPolyVec(3, 0, 0, -1, -1, 1); + R_Mesh_Draw(4, 2); m.tex[0] = R_GetTexture(skyboxside[0]); // right - if (R_Mesh_Draw_GetBuffer(&m)) - { - memcpy(m.index, skyboxindex, sizeof(int[6])); - m.color[0] = m.color[4] = m.color[8] = m.color[12] = m.colorscale; - m.color[1] = m.color[5] = m.color[9] = m.color[13] = m.colorscale; - m.color[2] = m.color[6] = m.color[10] = m.color[14] = m.colorscale; - m.color[3] = m.color[7] = m.color[11] = m.color[15] = 1; - R_SkyBoxPolyVec(0, 1, 0, 1, 1, 1); - R_SkyBoxPolyVec(1, 1, 1, 1, 1, -1); - R_SkyBoxPolyVec(2, 0, 1, -1, 1, -1); - R_SkyBoxPolyVec(3, 0, 0, -1, 1, 1); - } + R_Mesh_State(&m); + memcpy(varray_element, skyboxindex, sizeof(int[6])); + varray_color[0] = varray_color[4] = varray_color[8] = varray_color[12] = mesh_colorscale; + varray_color[1] = varray_color[5] = varray_color[9] = varray_color[13] = mesh_colorscale; + varray_color[2] = varray_color[6] = varray_color[10] = varray_color[14] = mesh_colorscale; + varray_color[3] = varray_color[7] = varray_color[11] = varray_color[15] = 1; + R_SkyBoxPolyVec(0, 1, 0, 1, 1, 1); + R_SkyBoxPolyVec(1, 1, 1, 1, 1, -1); + R_SkyBoxPolyVec(2, 0, 1, -1, 1, -1); + R_SkyBoxPolyVec(3, 0, 0, -1, 1, 1); + R_Mesh_Draw(4, 2); m.tex[0] = R_GetTexture(skyboxside[2]); // left - if (R_Mesh_Draw_GetBuffer(&m)) - { - memcpy(m.index, skyboxindex, sizeof(int[6])); - m.color[0] = m.color[4] = m.color[8] = m.color[12] = m.colorscale; - m.color[1] = m.color[5] = m.color[9] = m.color[13] = m.colorscale; - m.color[2] = m.color[6] = m.color[10] = m.color[14] = m.colorscale; - m.color[3] = m.color[7] = m.color[11] = m.color[15] = 1; - R_SkyBoxPolyVec(0, 1, 0, -1, -1, 1); - R_SkyBoxPolyVec(1, 1, 1, -1, -1, -1); - R_SkyBoxPolyVec(2, 0, 1, 1, -1, -1); - R_SkyBoxPolyVec(3, 0, 0, 1, -1, 1); - } + R_Mesh_State(&m); + memcpy(varray_element, skyboxindex, sizeof(int[6])); + varray_color[0] = varray_color[4] = varray_color[8] = varray_color[12] = mesh_colorscale; + varray_color[1] = varray_color[5] = varray_color[9] = varray_color[13] = mesh_colorscale; + varray_color[2] = varray_color[6] = varray_color[10] = varray_color[14] = mesh_colorscale; + varray_color[3] = varray_color[7] = varray_color[11] = varray_color[15] = 1; + R_SkyBoxPolyVec(0, 1, 0, -1, -1, 1); + R_SkyBoxPolyVec(1, 1, 1, -1, -1, -1); + R_SkyBoxPolyVec(2, 0, 1, 1, -1, -1); + R_SkyBoxPolyVec(3, 0, 0, 1, -1, 1); + R_Mesh_Draw(4, 2); m.tex[0] = R_GetTexture(skyboxside[4]); // up - if (R_Mesh_Draw_GetBuffer(&m)) - { - memcpy(m.index, skyboxindex, sizeof(int[6])); - m.color[0] = m.color[4] = m.color[8] = m.color[12] = m.colorscale; - m.color[1] = m.color[5] = m.color[9] = m.color[13] = m.colorscale; - m.color[2] = m.color[6] = m.color[10] = m.color[14] = m.colorscale; - m.color[3] = m.color[7] = m.color[11] = m.color[15] = 1; - R_SkyBoxPolyVec(0, 1, 0, 1, -1, 1); - R_SkyBoxPolyVec(1, 1, 1, 1, 1, 1); - R_SkyBoxPolyVec(2, 0, 1, -1, 1, 1); - R_SkyBoxPolyVec(3, 0, 0, -1, -1, 1); - } + R_Mesh_State(&m); + memcpy(varray_element, skyboxindex, sizeof(int[6])); + varray_color[0] = varray_color[4] = varray_color[8] = varray_color[12] = mesh_colorscale; + varray_color[1] = varray_color[5] = varray_color[9] = varray_color[13] = mesh_colorscale; + varray_color[2] = varray_color[6] = varray_color[10] = varray_color[14] = mesh_colorscale; + varray_color[3] = varray_color[7] = varray_color[11] = varray_color[15] = 1; + R_SkyBoxPolyVec(0, 1, 0, 1, -1, 1); + R_SkyBoxPolyVec(1, 1, 1, 1, 1, 1); + R_SkyBoxPolyVec(2, 0, 1, -1, 1, 1); + R_SkyBoxPolyVec(3, 0, 0, -1, -1, 1); + R_Mesh_Draw(4, 2); m.tex[0] = R_GetTexture(skyboxside[5]); // down - if (R_Mesh_Draw_GetBuffer(&m)) - { - memcpy(m.index, skyboxindex, sizeof(int[6])); - m.color[0] = m.color[4] = m.color[8] = m.color[12] = m.colorscale; - m.color[1] = m.color[5] = m.color[9] = m.color[13] = m.colorscale; - m.color[2] = m.color[6] = m.color[10] = m.color[14] = m.colorscale; - m.color[3] = m.color[7] = m.color[11] = m.color[15] = 1; - R_SkyBoxPolyVec(0, 1, 0, 1, 1, -1); - R_SkyBoxPolyVec(1, 1, 1, 1, -1, -1); - R_SkyBoxPolyVec(2, 0, 1, -1, -1, -1); - R_SkyBoxPolyVec(3, 0, 0, -1, 1, -1); - } + R_Mesh_State(&m); + memcpy(varray_element, skyboxindex, sizeof(int[6])); + varray_color[0] = varray_color[4] = varray_color[8] = varray_color[12] = mesh_colorscale; + varray_color[1] = varray_color[5] = varray_color[9] = varray_color[13] = mesh_colorscale; + varray_color[2] = varray_color[6] = varray_color[10] = varray_color[14] = mesh_colorscale; + varray_color[3] = varray_color[7] = varray_color[11] = varray_color[15] = 1; + R_SkyBoxPolyVec(0, 1, 0, 1, 1, -1); + R_SkyBoxPolyVec(1, 1, 1, 1, -1, -1); + R_SkyBoxPolyVec(2, 0, 1, -1, -1, -1); + R_SkyBoxPolyVec(3, 0, 0, -1, 1, -1); + R_Mesh_Draw(4, 2); } -#define skygridx 16 +#define skygridx 32 #define skygridx1 (skygridx + 1) #define skygridxrecip (1.0f / (skygridx)) #define skygridy 32 @@ -311,17 +268,18 @@ static void skyspherearrays(float *v, float *t, float *c, float *source, float s c[3] = 1; t[0] = source[0] + s; t[1] = source[1] + s; - v[0] = source[2] + r_origin[0]; - v[1] = source[3] + r_origin[1]; - v[2] = source[4] + r_origin[2]; + v[0] = source[2]; + v[1] = source[3]; + v[2] = source[4]; } } static void R_SkySphere(void) { + int numverts, numtriangles; float speedscale, speedscale2; static qboolean skysphereinitialized = false; - rmeshbufferinfo_t m; + rmeshstate_t m; if (!skysphereinitialized) { skysphereinitialized = true; @@ -333,33 +291,40 @@ static void R_SkySphere(void) speedscale2 = cl.time*16.0/128.0; speedscale2 -= (int)speedscale2; + numverts = skygridx1*skygridy1; + numtriangles = skygridx*skygridy*2; + + R_Mesh_ResizeCheck(numverts, numtriangles); + memset(&m, 0, sizeof(m)); - m.transparent = false; m.blendfunc1 = GL_ONE; m.blendfunc2 = GL_ZERO; + m.wantoverbright = false; m.depthdisable = true; // don't modify or read zbuffer - m.numtriangles = skygridx*skygridy*2; - m.numverts = skygridx1*skygridy1; m.tex[0] = R_GetTexture(solidskytexture); - if (R_Mesh_Draw_GetBuffer(&m)) - { - memcpy(m.index, skysphereindices, m.numtriangles * sizeof(int[3])); - skyspherearrays(m.vertex, m.texcoords[0], m.color, skysphere, speedscale, m.colorscale); - } + R_Mesh_State(&m); + + memcpy(varray_element, skysphereindices, numtriangles * sizeof(int[3])); + skyspherearrays(varray_vertex, varray_texcoord[0], varray_color, skysphere, speedscale, mesh_colorscale); + R_Mesh_Draw(numverts, numtriangles); + m.blendfunc1 = GL_SRC_ALPHA; m.blendfunc2 = GL_ONE_MINUS_SRC_ALPHA; m.tex[0] = R_GetTexture(alphaskytexture); - if (R_Mesh_Draw_GetBuffer(&m)) - { - memcpy(m.index, skysphereindices, m.numtriangles * sizeof(int[3])); - skyspherearrays(m.vertex, m.texcoords[0], m.color, skysphere, speedscale2, m.colorscale); - } + R_Mesh_State(&m); + + memcpy(varray_element, skysphereindices, numtriangles * sizeof(int[3])); + skyspherearrays(varray_vertex, varray_texcoord[0], varray_color, skysphere, speedscale2, mesh_colorscale); + R_Mesh_Draw(numverts, numtriangles); } void R_Sky(void) { + matrix4x4_t skymatrix; if (skyrendermasked) { + Matrix4x4_CreateTranslate(&skymatrix, r_origin[0], r_origin[1], r_origin[2]); + R_Mesh_Matrix(&skymatrix); if (skyrendersphere) { // this does not modify depth buffer @@ -397,7 +362,7 @@ void R_InitSky (qbyte *src, int bytesperpixel) qbyte skyupperlayerpixels[128*128*4], skylowerlayerpixels[128*128*4]; unsigned trans[128*128], transpix, *rgba; - strcpy(skyworldname, loadmodel->name); + skyavailable_quake = true; // flush skytexturepool so we won't build up a leak from uploading textures multiple times R_FreeTexturePool(&skytexturepool); @@ -465,3 +430,39 @@ void R_InitSky (qbyte *src, int bytesperpixel) alphaskytexture = R_LoadTexture (skytexturepool, "sky_alphatexture", 128, 128, (qbyte *) trans, TEXTYPE_RGBA, TEXF_ALPHA | TEXF_PRECACHE); } +void R_ResetQuakeSky(void) +{ + skyavailable_quake = false; +} + +void R_ResetSkyBox(void) +{ + skyboxside[0] = skyboxside[1] = skyboxside[2] = skyboxside[3] = skyboxside[4] = skyboxside[5] = NULL; + skyname[0] = 0; + skyavailable_box = false; +} + +static void r_sky_start(void) +{ + skytexturepool = R_AllocTexturePool(); + solidskytexture = NULL; + alphaskytexture = NULL; +} + +static void r_sky_shutdown(void) +{ + R_FreeTexturePool(&skytexturepool); + solidskytexture = NULL; + alphaskytexture = NULL; +} + +static void r_sky_newmap(void) +{ +} + +void R_Sky_Init(void) +{ + Cmd_AddCommand ("loadsky", &LoadSky_f); + Cvar_RegisterVariable (&r_sky); + R_RegisterModule("R_Sky", r_sky_start, r_sky_shutdown, r_sky_newmap); +}