X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=gl_rsurf.c;h=dd32b9bc0fc001de1f39c16ab805fecfd326e654;hb=f4d146d977657c9569797e278df183234509553b;hp=ba73451ba69273f16f9b0a44af7d25acfc8592e8;hpb=605b22f83aeabb5aa490df3f6714ca468146dd7e;p=xonotic%2Fdarkplaces.git diff --git a/gl_rsurf.c b/gl_rsurf.c index ba73451b..dd32b9bc 100644 --- a/gl_rsurf.c +++ b/gl_rsurf.c @@ -753,7 +753,6 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2) { const entity_render_t *ent = calldata1; const msurface_t *surf = ent->model->brushq1.surfaces + calldata2; - float colorscale; rmeshstate_t m; float alpha; float modelorg[3]; @@ -761,15 +760,17 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2) matrix4x4_t tempmatrix; float args[4] = {0.05f,0,0,0.04f}; - if (r_waterscroll.value) + if (gl_textureshader && r_watershader.value && !fogenabled) + { + Matrix4x4_CreateTranslate(&tempmatrix, sin(cl.time) * 0.025 * r_waterscroll.value, sin(cl.time * 0.8f) * 0.025 * r_waterscroll.value, 0); + R_Mesh_TextureMatrix(1, &tempmatrix); + Matrix4x4_CreateFromQuakeEntity(&tempmatrix, 0, 0, 0, 0, 0, 0, r_watershader.value); + R_Mesh_TextureMatrix(0, &tempmatrix); + } + else if (r_waterscroll.value) { // scrolling in texture matrix Matrix4x4_CreateTranslate(&tempmatrix, sin(cl.time) * 0.025 * r_waterscroll.value, sin(cl.time * 0.8f) * 0.025 * r_waterscroll.value, 0); - if (gl_textureshader && r_watershader.integer) - { - R_Mesh_TextureMatrix(1, &tempmatrix); - Matrix4x4_CreateTranslate(&tempmatrix, -sin(cl.time) * 0.025 * r_waterscroll.value, -sin(cl.time * 0.8f) * 0.025 * r_waterscroll.value, 0); - } R_Mesh_TextureMatrix(0, &tempmatrix); } @@ -794,25 +795,19 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2) GL_BlendFunc(GL_ONE, GL_ZERO); GL_DepthMask(true); } - if (gl_textureshader && r_watershader.integer) + if (gl_textureshader && r_watershader.value && !fogenabled) { - m.tex[0] = R_GetTexture(mod_shared_distorttexture); + m.tex[0] = R_GetTexture(mod_shared_distorttexture[(int)(cl.time * 16)&63]); m.tex[1] = R_GetTexture(texture->skin.base); } else m.tex[0] = R_GetTexture(texture->skin.base); - colorscale = 1; - if (gl_combine.integer) - { - m.texrgbscale[0] = 4; - colorscale *= 0.25f; - } GL_DepthTest(true); if (fogenabled) GL_ColorPointer(varray_color4f); else GL_Color(1, 1, 1, alpha); - if (gl_textureshader && r_watershader.integer) + if (gl_textureshader && r_watershader.value && !fogenabled) { GL_ActiveTexture (0); qglTexEnvi (GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D); @@ -832,11 +827,11 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2) if (fogenabled) { R_FillColors(varray_color4f, surf->mesh.num_vertices, 1, 1, 1, alpha); - RSurf_FogColors_Vertex3f_Color4f(surf->mesh.data_vertex3f, varray_color4f, colorscale, surf->mesh.num_vertices, modelorg); + RSurf_FogColors_Vertex3f_Color4f(surf->mesh.data_vertex3f, varray_color4f, 1, surf->mesh.num_vertices, modelorg); } R_Mesh_Draw(surf->mesh.num_vertices, surf->mesh.num_triangles, surf->mesh.data_element3i); - if (gl_textureshader && r_watershader.integer) + if (gl_textureshader && r_watershader.value && !fogenabled) { qglDisable (GL_TEXTURE_SHADER_NV); GL_ActiveTexture (0); @@ -857,7 +852,7 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2) R_Mesh_Draw(surf->mesh.num_vertices, surf->mesh.num_triangles, surf->mesh.data_element3i); } - if (r_waterscroll.value) + if ((gl_textureshader && r_watershader.value && !fogenabled) || r_waterscroll.value) { Matrix4x4_CreateIdentity(&tempmatrix); R_Mesh_TextureMatrix(0, &tempmatrix); @@ -1666,8 +1661,13 @@ void R_DrawWorld(entity_render_t *ent) { if (ent->model == NULL) return; - if (!ent->model->brushq1.numleafs && ent->model->Draw) - ent->model->Draw(ent); + if (!ent->model->brushq1.numleafs) + { + if (ent->model->DrawSky) + ent->model->DrawSky(ent); + if (ent->model->Draw) + ent->model->Draw(ent); + } else { R_PrepareSurfaces(ent); @@ -1797,49 +1797,54 @@ void R_DrawCollisionBrush(colbrushf_t *brush) R_Mesh_Draw(brush->numpoints, brush->numtriangles, brush->elements); } -void R_Q3BSP_DrawFace(entity_render_t *ent, q3mface_t *face) +void R_Q3BSP_DrawSkyFace(entity_render_t *ent, q3mface_t *face) { rmeshstate_t m; if (!face->num_triangles) return; - if (face->texture->renderflags) + if (skyrendernow) { - if (face->texture->renderflags & Q3MTEXTURERENDERFLAGS_SKY) - { - if (skyrendernow) - { - skyrendernow = false; - if (skyrendermasked) - R_Sky(); - } + skyrendernow = false; + if (skyrendermasked) + R_Sky(); + } - R_Mesh_Matrix(&ent->matrix); + R_Mesh_Matrix(&ent->matrix); - GL_Color(fogcolor[0], fogcolor[1], fogcolor[2], 1); - if (skyrendermasked) - { - // depth-only (masking) - qglColorMask(0,0,0,0); - // just to make sure that braindead drivers don't draw anything - // despite that colormask... - GL_BlendFunc(GL_ZERO, GL_ONE); - } - else - { - // fog sky - GL_BlendFunc(GL_ONE, GL_ZERO); - } - GL_DepthMask(true); - GL_DepthTest(true); + GL_Color(fogcolor[0], fogcolor[1], fogcolor[2], 1); + if (skyrendermasked) + { + // depth-only (masking) + qglColorMask(0,0,0,0); + // just to make sure that braindead drivers don't draw anything + // despite that colormask... + GL_BlendFunc(GL_ZERO, GL_ONE); + } + else + { + // fog sky + GL_BlendFunc(GL_ONE, GL_ZERO); + } + GL_DepthMask(true); + GL_DepthTest(true); - memset(&m, 0, sizeof(m)); - R_Mesh_State_Texture(&m); + memset(&m, 0, sizeof(m)); + R_Mesh_State_Texture(&m); - GL_VertexPointer(face->data_vertex3f); - R_Mesh_Draw(face->num_vertices, face->num_triangles, face->data_element3i); - qglColorMask(1,1,1,1); + GL_VertexPointer(face->data_vertex3f); + R_Mesh_Draw(face->num_vertices, face->num_triangles, face->data_element3i); + qglColorMask(1,1,1,1); +} + +void R_Q3BSP_DrawFace(entity_render_t *ent, q3mface_t *face) +{ + rmeshstate_t m; + if (!face->num_triangles) + return; + if (face->texture->renderflags) + { + if (face->texture->renderflags & Q3MTEXTURERENDERFLAGS_SKY) return; - } if (face->texture->renderflags & Q3MTEXTURERENDERFLAGS_NODRAW) return; } @@ -1868,17 +1873,10 @@ void R_Q3BSP_DrawFace(entity_render_t *ent, q3mface_t *face) R_Mesh_Draw(face->num_vertices, face->num_triangles, face->data_element3i); } -/* -void R_Q3BSP_DrawSky(entity_render_t *ent) -{ -} -*/ - void R_Q3BSP_RecursiveWorldNode(entity_render_t *ent, q3mnode_t *node, const vec3_t modelorg, qbyte *pvs, int markframe) { int i; q3mleaf_t *leaf; - q3mface_t *face; while (node->isnode) { if (R_CullBox(node->mins, node->maxs)) @@ -1890,22 +1888,42 @@ void R_Q3BSP_RecursiveWorldNode(entity_render_t *ent, q3mnode_t *node, const vec return; leaf = (q3mleaf_t *)node; if (pvs[leaf->clusterindex >> 3] & (1 << (leaf->clusterindex & 7))) - { for (i = 0;i < leaf->numleaffaces;i++) + leaf->firstleafface[i]->markframe = markframe; +} + +static int r_q3bsp_framecount = -1; + +void R_Q3BSP_DrawSky(entity_render_t *ent) +{ + int i; + q3mface_t *face; + vec3_t modelorg; + model_t *model; + qbyte *pvs; + R_Mesh_Matrix(&ent->matrix); + model = ent->model; + if (r_drawcollisionbrushes.integer < 2) + { + Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg); + if (ent == &cl_entities[0].render && model->brushq3.num_pvsclusters && !r_novis.integer && (pvs = model->brush.GetPVS(model, modelorg))) { - face = leaf->firstleafface[i]; - if (face->markframe != markframe) + if (r_q3bsp_framecount != r_framecount) { - face->markframe = markframe; - if (!R_CullBox(face->mins, face->maxs)) - R_Q3BSP_DrawFace(ent, face); + r_q3bsp_framecount = r_framecount; + R_Q3BSP_RecursiveWorldNode(ent, model->brushq3.data_nodes, modelorg, pvs, r_framecount); } + for (i = 0, face = model->brushq3.data_thismodel->firstface;i < model->brushq3.data_thismodel->numfaces;i++, face++) + if (face->markframe == r_framecount && (face->texture->renderflags & Q3MTEXTURERENDERFLAGS_SKY) && !R_CullBox(face->mins, face->maxs)) + R_Q3BSP_DrawSkyFace(ent, face); } + else + for (i = 0, face = model->brushq3.data_thismodel->firstface;i < model->brushq3.data_thismodel->numfaces;i++, face++) + if ((face->texture->renderflags & Q3MTEXTURERENDERFLAGS_SKY)) + R_Q3BSP_DrawSkyFace(ent, face); } } - - void R_Q3BSP_Draw(entity_render_t *ent) { int i; @@ -1913,14 +1931,22 @@ void R_Q3BSP_Draw(entity_render_t *ent) vec3_t modelorg; model_t *model; qbyte *pvs; - static int markframe = 0; R_Mesh_Matrix(&ent->matrix); model = ent->model; if (r_drawcollisionbrushes.integer < 2) { Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg); if (ent == &cl_entities[0].render && model->brushq3.num_pvsclusters && !r_novis.integer && (pvs = model->brush.GetPVS(model, modelorg))) - R_Q3BSP_RecursiveWorldNode(ent, model->brushq3.data_nodes, modelorg, pvs, ++markframe); + { + if (r_q3bsp_framecount != r_framecount) + { + r_q3bsp_framecount = r_framecount; + R_Q3BSP_RecursiveWorldNode(ent, model->brushq3.data_nodes, modelorg, pvs, r_framecount); + } + for (i = 0, face = model->brushq3.data_thismodel->firstface;i < model->brushq3.data_thismodel->numfaces;i++, face++) + if (face->markframe == r_framecount && !R_CullBox(face->mins, face->maxs)) + R_Q3BSP_DrawFace(ent, face); + } else for (i = 0, face = model->brushq3.data_thismodel->firstface;i < model->brushq3.data_thismodel->numfaces;i++, face++) R_Q3BSP_DrawFace(ent, face);