X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=r_sky.c;h=25fa9fd5ea73a8e9b5b8fe2fad054bbd31f207c5;hp=364818a888f3a45e241ac52c009c67bf04eed2c7;hb=d27eb486d3859260adacdc77fc32ac3714d2efb7;hpb=5715fdeb47caa02252ab9b6c0895310e43bea716 diff --git a/r_sky.c b/r_sky.c index 364818a8..25fa9fd5 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]; @@ -150,113 +114,72 @@ void LoadSky_f (void) } } -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;\ - m.vertex[i * 4 + 1] = (y) * 16.0f;\ - m.vertex[i * 4 + 2] = (z) * 16.0f;\ - 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.blendfunc1 = GL_ONE; m.blendfunc2 = GL_ZERO; m.depthdisable = true; // don't modify or read zbuffer - m.numtriangles = 2; - m.numverts = 4; m.tex[0] = R_GetTexture(skyboxside[3]); // front - Matrix4x4_CreateTranslate(&m.matrix, r_origin[0], r_origin[1], r_origin[2]); - if (R_Mesh_Draw_GetBuffer(&m, false)) - { - 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_Render(); - } + R_Mesh_State(&m); + + varray_color[0] = varray_color[4] = varray_color[8] = varray_color[12] = r_colorscale; + varray_color[1] = varray_color[5] = varray_color[9] = varray_color[13] = r_colorscale; + varray_color[2] = varray_color[6] = varray_color[10] = varray_color[14] = r_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, polygonelements); m.tex[0] = R_GetTexture(skyboxside[1]); // back - if (R_Mesh_Draw_GetBuffer(&m, false)) - { - 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_Render(); - } + R_Mesh_State(&m); + 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, polygonelements); m.tex[0] = R_GetTexture(skyboxside[0]); // right - if (R_Mesh_Draw_GetBuffer(&m, false)) - { - 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_Render(); - } + R_Mesh_State(&m); + 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, polygonelements); m.tex[0] = R_GetTexture(skyboxside[2]); // left - if (R_Mesh_Draw_GetBuffer(&m, false)) - { - 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_Render(); - } + R_Mesh_State(&m); + 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, polygonelements); m.tex[0] = R_GetTexture(skyboxside[4]); // up - if (R_Mesh_Draw_GetBuffer(&m, false)) - { - 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_Render(); - } + R_Mesh_State(&m); + 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, polygonelements); m.tex[0] = R_GetTexture(skyboxside[5]); // down - if (R_Mesh_Draw_GetBuffer(&m, false)) - { - 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_Render(); - } + R_Mesh_State(&m); + 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, polygonelements); } -#define skygridx 16 +#define skygridx 32 #define skygridx1 (skygridx + 1) #define skygridxrecip (1.0f / (skygridx)) #define skygridy 32 @@ -325,9 +248,10 @@ static void skyspherearrays(float *v, float *t, float *c, float *source, float s 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; @@ -339,35 +263,37 @@ 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); + memset(&m, 0, sizeof(m)); m.blendfunc1 = GL_ONE; m.blendfunc2 = GL_ZERO; m.depthdisable = true; // don't modify or read zbuffer - m.numtriangles = skygridx*skygridy*2; - m.numverts = skygridx1*skygridy1; m.tex[0] = R_GetTexture(solidskytexture); - Matrix4x4_CreateTranslate(&m.matrix, r_origin[0], r_origin[1], r_origin[2]); - if (R_Mesh_Draw_GetBuffer(&m, false)) - { - memcpy(m.index, skysphereindices, m.numtriangles * sizeof(int[3])); - skyspherearrays(m.vertex, m.texcoords[0], m.color, skysphere, speedscale, m.colorscale); - R_Mesh_Render(); - } + R_Mesh_State(&m); + + skyspherearrays(varray_vertex, varray_texcoord[0], varray_color, skysphere, speedscale, r_colorscale); + R_Mesh_Draw(numverts, numtriangles, skysphereindices); + m.blendfunc1 = GL_SRC_ALPHA; m.blendfunc2 = GL_ONE_MINUS_SRC_ALPHA; m.tex[0] = R_GetTexture(alphaskytexture); - if (R_Mesh_Draw_GetBuffer(&m, false)) - { - memcpy(m.index, skysphereindices, m.numtriangles * sizeof(int[3])); - skyspherearrays(m.vertex, m.texcoords[0], m.color, skysphere, speedscale2, m.colorscale); - R_Mesh_Render(); - } + R_Mesh_State(&m); + + skyspherearrays(varray_vertex, varray_texcoord[0], varray_color, skysphere, speedscale2, r_colorscale); + R_Mesh_Draw(numverts, numtriangles, skysphereindices); } 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 @@ -405,7 +331,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); @@ -473,3 +399,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); +}