X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=model_shared.c;h=077197aa23b0ab09091e4957add9d7db5c072425;hb=320b43dcc126fa57ea6674ce2b99c04dcee1869d;hp=ae6cc3b78aff238088b8631a9eb59095fbba16c3;hpb=48669036b4be979d997c27227942ed9c430277d5;p=xonotic%2Fdarkplaces.git diff --git a/model_shared.c b/model_shared.c index ae6cc3b7..077197aa 100644 --- a/model_shared.c +++ b/model_shared.c @@ -27,17 +27,17 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "r_shadow.h" #include "polygon.h" -cvar_t r_mipskins = {CVAR_SAVE, "r_mipskins", "0", "mipmaps model skins so they render faster in the distance and do not display noise artifacts, can cause discoloration of skins if they contain undesirable border colors"}; -cvar_t r_mipnormalmaps = {CVAR_SAVE, "r_mipnormalmaps", "1", "mipmaps normalmaps (turning it off looks sharper but may have aliasing)"}; -cvar_t mod_generatelightmaps_unitspersample = {CVAR_SAVE, "mod_generatelightmaps_unitspersample", "8", "lightmap resolution"}; -cvar_t mod_generatelightmaps_borderpixels = {CVAR_SAVE, "mod_generatelightmaps_borderpixels", "2", "extra space around polygons to prevent sampling artifacts"}; -cvar_t mod_generatelightmaps_texturesize = {CVAR_SAVE, "mod_generatelightmaps_texturesize", "1024", "size of lightmap textures"}; -cvar_t mod_generatelightmaps_lightmapsamples = {CVAR_SAVE, "mod_generatelightmaps_lightmapsamples", "16", "number of shadow tests done per lightmap pixel"}; -cvar_t mod_generatelightmaps_vertexsamples = {CVAR_SAVE, "mod_generatelightmaps_vertexsamples", "16", "number of shadow tests done per vertex"}; -cvar_t mod_generatelightmaps_gridsamples = {CVAR_SAVE, "mod_generatelightmaps_gridsamples", "64", "number of shadow tests done per lightgrid cell"}; -cvar_t mod_generatelightmaps_lightmapradius = {CVAR_SAVE, "mod_generatelightmaps_lightmapradius", "16", "sampling area around each lightmap pixel"}; -cvar_t mod_generatelightmaps_vertexradius = {CVAR_SAVE, "mod_generatelightmaps_vertexradius", "16", "sampling area around each vertex"}; -cvar_t mod_generatelightmaps_gridradius = {CVAR_SAVE, "mod_generatelightmaps_gridradius", "64", "sampling area around each lightgrid cell center"}; +cvar_t r_mipskins = {CVAR_CLIENT | CVAR_SAVE, "r_mipskins", "0", "mipmaps model skins so they render faster in the distance and do not display noise artifacts, can cause discoloration of skins if they contain undesirable border colors"}; +cvar_t r_mipnormalmaps = {CVAR_CLIENT | CVAR_SAVE, "r_mipnormalmaps", "1", "mipmaps normalmaps (turning it off looks sharper but may have aliasing)"}; +cvar_t mod_generatelightmaps_unitspersample = {CVAR_CLIENT | CVAR_SAVE, "mod_generatelightmaps_unitspersample", "8", "lightmap resolution"}; +cvar_t mod_generatelightmaps_borderpixels = {CVAR_CLIENT | CVAR_SAVE, "mod_generatelightmaps_borderpixels", "2", "extra space around polygons to prevent sampling artifacts"}; +cvar_t mod_generatelightmaps_texturesize = {CVAR_CLIENT | CVAR_SAVE, "mod_generatelightmaps_texturesize", "1024", "size of lightmap textures"}; +cvar_t mod_generatelightmaps_lightmapsamples = {CVAR_CLIENT | CVAR_SAVE, "mod_generatelightmaps_lightmapsamples", "16", "number of shadow tests done per lightmap pixel"}; +cvar_t mod_generatelightmaps_vertexsamples = {CVAR_CLIENT | CVAR_SAVE, "mod_generatelightmaps_vertexsamples", "16", "number of shadow tests done per vertex"}; +cvar_t mod_generatelightmaps_gridsamples = {CVAR_CLIENT | CVAR_SAVE, "mod_generatelightmaps_gridsamples", "64", "number of shadow tests done per lightgrid cell"}; +cvar_t mod_generatelightmaps_lightmapradius = {CVAR_CLIENT | CVAR_SAVE, "mod_generatelightmaps_lightmapradius", "16", "sampling area around each lightmap pixel"}; +cvar_t mod_generatelightmaps_vertexradius = {CVAR_CLIENT | CVAR_SAVE, "mod_generatelightmaps_vertexradius", "16", "sampling area around each vertex"}; +cvar_t mod_generatelightmaps_gridradius = {CVAR_CLIENT | CVAR_SAVE, "mod_generatelightmaps_gridradius", "64", "sampling area around each lightgrid cell center"}; dp_model_t *loadmodel; @@ -65,7 +65,7 @@ static void mod_start(void) int nummodels = (int)Mem_ExpandableArray_IndexRange(&models); dp_model_t *mod; - SCR_PushLoadingScreen(false, "Loading models", 1.0); + SCR_PushLoadingScreen("Loading models", 1.0); count = 0; for (i = 0;i < nummodels;i++) if ((mod = (dp_model_t*) Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0] && mod->name[0] != '*') @@ -75,7 +75,7 @@ static void mod_start(void) if ((mod = (dp_model_t*) Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0] && mod->name[0] != '*') if (mod->used) { - SCR_PushLoadingScreen(true, mod->name, 1.0 / count); + SCR_PushLoadingScreen(mod->name, 1.0 / count); Mod_LoadModel(mod, true, false); SCR_PopLoadingScreen(false); } @@ -148,10 +148,10 @@ static void mod_newmap(void) Mod_Init =============== */ -static void Mod_Print(void); -static void Mod_Precache (void); -static void Mod_Decompile_f(void); -static void Mod_GenerateLightmaps_f(void); +static void Mod_Print_f(cmd_state_t *cmd); +static void Mod_Precache_f(cmd_state_t *cmd); +static void Mod_Decompile_f(cmd_state_t *cmd); +static void Mod_GenerateLightmaps_f(cmd_state_t *cmd); void Mod_Init (void) { mod_mempool = Mem_AllocPool("modelinfo", 0, NULL); @@ -174,10 +174,10 @@ void Mod_Init (void) Cvar_RegisterVariable(&mod_generatelightmaps_vertexradius); Cvar_RegisterVariable(&mod_generatelightmaps_gridradius); - Cmd_AddCommand ("modellist", Mod_Print, "prints a list of loaded models"); - Cmd_AddCommand ("modelprecache", Mod_Precache, "load a model"); - Cmd_AddCommand ("modeldecompile", Mod_Decompile_f, "exports a model in several formats for editing purposes"); - Cmd_AddCommand ("mod_generatelightmaps", Mod_GenerateLightmaps_f, "rebuilds lighting on current worldmodel"); + Cmd_AddCommand(CMD_CLIENT, "modellist", Mod_Print_f, "prints a list of loaded models"); + Cmd_AddCommand(CMD_CLIENT, "modelprecache", Mod_Precache_f, "load a model"); + Cmd_AddCommand(CMD_CLIENT, "modeldecompile", Mod_Decompile_f, "exports a model in several formats for editing purposes"); + Cmd_AddCommand(CMD_CLIENT, "mod_generatelightmaps", Mod_GenerateLightmaps_f, "rebuilds lighting on current worldmodel"); } void Mod_RenderInit(void) @@ -458,7 +458,7 @@ dp_model_t *Mod_LoadModel(dp_model_t *mod, qboolean crash, qboolean checkdisk) if (developer_loading.integer) Con_Printf("loading model %s\n", mod->name); - SCR_PushLoadingScreen(true, mod->name, 1); + SCR_PushLoadingScreen(mod->name, 1); // LadyHavoc: unload the existing model in this slot (if there is one) if (mod->loaded || mod->mempool) @@ -579,9 +579,6 @@ dp_model_t *Mod_FindName(const char *name, const char *parentname) if (!parentname) parentname = ""; - // if we're not dedicatd, the renderer calls will crash without video - Host_StartVideo(); - nummodels = (int)Mem_ExpandableArray_IndexRange(&models); if (!name[0]) @@ -638,7 +635,7 @@ void Mod_Reload(void) int nummodels = (int)Mem_ExpandableArray_IndexRange(&models); dp_model_t *mod; - SCR_PushLoadingScreen(false, "Reloading models", 1.0); + SCR_PushLoadingScreen("Reloading models", 1.0); count = 0; for (i = 0;i < nummodels;i++) if ((mod = (dp_model_t *) Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0] && mod->name[0] != '*' && mod->used) @@ -646,7 +643,7 @@ void Mod_Reload(void) for (i = 0;i < nummodels;i++) if ((mod = (dp_model_t *) Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0] && mod->name[0] != '*' && mod->used) { - SCR_PushLoadingScreen(true, mod->name, 1.0 / count); + SCR_PushLoadingScreen(mod->name, 1.0 / count); Mod_LoadModel(mod, true, true); SCR_PopLoadingScreen(false); } @@ -663,7 +660,7 @@ unsigned char *mod_base; Mod_Print ================ */ -static void Mod_Print(void) +static void Mod_Print_f(cmd_state_t *cmd) { int i; int nummodels = (int)Mem_ExpandableArray_IndexRange(&models); @@ -687,10 +684,10 @@ static void Mod_Print(void) Mod_Precache ================ */ -static void Mod_Precache(void) +static void Mod_Precache_f(cmd_state_t *cmd) { - if (Cmd_Argc() == 2) - Mod_ForName(Cmd_Argv(1), false, true, Cmd_Argv(1)[0] == '*' ? cl.model_name[1] : NULL); + if (Cmd_Argc(cmd) == 2) + Mod_ForName(Cmd_Argv(cmd, 1), false, true, Cmd_Argv(cmd, 1)[0] == '*' ? cl.model_name[1] : NULL); else Con_Print("usage: modelprecache \n"); } @@ -1431,14 +1428,6 @@ static void Q3Shader_AddToHash (q3shaderinfo_t* shader) memcpy (&entry->shader, shader, sizeof (q3shaderinfo_t)); } -extern cvar_t mod_noshader_default_offsetmapping; -extern cvar_t mod_q3shader_default_offsetmapping; -extern cvar_t mod_q3shader_default_offsetmapping_scale; -extern cvar_t mod_q3shader_default_offsetmapping_bias; -extern cvar_t mod_q3shader_default_polygonoffset; -extern cvar_t mod_q3shader_default_polygonfactor; -extern cvar_t mod_q3shader_force_addalpha; -extern cvar_t mod_q3shader_force_terrain_alphaflag; void Mod_LoadQ3Shaders(void) { int j; @@ -1970,7 +1959,7 @@ void Mod_LoadQ3Shaders(void) // this sets dpshaderkill to true if dpshaderkillifcvarzero was used, and to false if dpnoshaderkillifcvarzero was used else if (((dpshaderkill = !strcasecmp(parameter[0], "dpshaderkillifcvarzero")) || !strcasecmp(parameter[0], "dpnoshaderkillifcvarzero")) && numparameters >= 2) { - if (Cvar_VariableValue(parameter[1]) == 0.0f) + if (Cvar_VariableValue(&cvars_all, parameter[1], ~0) == 0.0f) shader.dpshaderkill = dpshaderkill; } // this sets dpshaderkill to true if dpshaderkillifcvar was used, and to false if dpnoshaderkillifcvar was used @@ -1981,37 +1970,37 @@ void Mod_LoadQ3Shaders(void) op = parameter[2]; if(!op) { - if (Cvar_VariableValue(parameter[1]) != 0.0f) + if (Cvar_VariableValue(&cvars_all, parameter[1], ~0) != 0.0f) shader.dpshaderkill = dpshaderkill; } else if (numparameters >= 4 && !strcmp(op, "==")) { - if (Cvar_VariableValue(parameter[1]) == atof(parameter[3])) + if (Cvar_VariableValue(&cvars_all, parameter[1], ~0) == atof(parameter[3])) shader.dpshaderkill = dpshaderkill; } else if (numparameters >= 4 && !strcmp(op, "!=")) { - if (Cvar_VariableValue(parameter[1]) != atof(parameter[3])) + if (Cvar_VariableValue(&cvars_all, parameter[1], ~0) != atof(parameter[3])) shader.dpshaderkill = dpshaderkill; } else if (numparameters >= 4 && !strcmp(op, ">")) { - if (Cvar_VariableValue(parameter[1]) > atof(parameter[3])) + if (Cvar_VariableValue(&cvars_all, parameter[1], ~0) > atof(parameter[3])) shader.dpshaderkill = dpshaderkill; } else if (numparameters >= 4 && !strcmp(op, "<")) { - if (Cvar_VariableValue(parameter[1]) < atof(parameter[3])) + if (Cvar_VariableValue(&cvars_all, parameter[1], ~0) < atof(parameter[3])) shader.dpshaderkill = dpshaderkill; } else if (numparameters >= 4 && !strcmp(op, ">=")) { - if (Cvar_VariableValue(parameter[1]) >= atof(parameter[3])) + if (Cvar_VariableValue(&cvars_all, parameter[1], ~0) >= atof(parameter[3])) shader.dpshaderkill = dpshaderkill; } else if (numparameters >= 4 && !strcmp(op, "<=")) { - if (Cvar_VariableValue(parameter[1]) <= atof(parameter[3])) + if (Cvar_VariableValue(&cvars_all, parameter[1], ~0) <= atof(parameter[3])) shader.dpshaderkill = dpshaderkill; } else @@ -2473,6 +2462,7 @@ nothing GL_ZERO GL_ONE texture->specularscalemod = shader->specularscalemod; texture->specularpowermod = shader->specularpowermod; texture->rtlightambient = shader->rtlightambient; + texture->refractive_index = mod_q3shader_default_refractive_index.value; if (shader->dpreflectcube[0]) texture->reflectcubetexture = R_GetCubemap(shader->dpreflectcube); @@ -2562,6 +2552,7 @@ nothing GL_ZERO GL_ONE { if (developer_extra.integer) Con_DPrintf("^1%s:^7 using fallback noshader material for ^3\"%s\"\n", modelname, name); + texture->basematerialflags = defaultmaterialflags; texture->supercontents = SUPERCONTENTS_SOLID | SUPERCONTENTS_OPAQUE; } else if (!strcmp(texture->name, "common/nodraw") || !strcmp(texture->name, "textures/common/nodraw")) @@ -2658,7 +2649,7 @@ void Mod_LoadCustomMaterial(mempool_t *mempool, texture_t *texture, const char * void Mod_UnloadCustomMaterial(texture_t *texture, qboolean purgeskins) { - int i, j; + long unsigned int i, j; for (i = 0; i < sizeof(texture->shaderpasses) / sizeof(texture->shaderpasses[0]); i++) { if (texture->shaderpasses[i]) @@ -2872,6 +2863,8 @@ void Mod_MakeSortedSurfaces(dp_model_t *mod) for (j = 0;j < mod->nummodelsurfaces;j++) { const msurface_t *surface = mod->data_surfaces + j + mod->firstmodelsurface; + if(!surface->texture) + continue; t = (int)(surface->texture - mod->data_textures); numsurfacesfortexture[t]++; } @@ -2884,6 +2877,8 @@ void Mod_MakeSortedSurfaces(dp_model_t *mod) for (j = 0;j < mod->nummodelsurfaces;j++) { const msurface_t *surface = mod->data_surfaces + j + mod->firstmodelsurface; + if (!surface->texture) + continue; t = (int)(surface->texture - mod->data_textures); mod->sortedmodelsurfaces[firstsurfacefortexture[t]++] = j + mod->firstmodelsurface; } @@ -3245,7 +3240,7 @@ Mod_Decompile_f decompiles a model to editable files ================ */ -static void Mod_Decompile_f(void) +static void Mod_Decompile_f(cmd_state_t *cmd) { int i, j, k, l, first, count; dp_model_t *mod; @@ -3263,13 +3258,13 @@ static void Mod_Decompile_f(void) int framegroupstextsize = 0; char vabuf[1024]; - if (Cmd_Argc() != 2) + if (Cmd_Argc(cmd) != 2) { Con_Print("usage: modeldecompile \n"); return; } - strlcpy(inname, Cmd_Argv(1), sizeof(inname)); + strlcpy(inname, Cmd_Argv(cmd, 1), sizeof(inname)); FS_StripExtension(inname, basename, sizeof(basename)); mod = Mod_ForName(inname, false, true, inname[0] == '*' ? cl.model_name[1] : NULL); @@ -4354,9 +4349,9 @@ static void Mod_GenerateLightmaps(dp_model_t *model) loadmodel = oldloadmodel; } -static void Mod_GenerateLightmaps_f(void) +static void Mod_GenerateLightmaps_f(cmd_state_t *cmd) { - if (Cmd_Argc() != 1) + if (Cmd_Argc(cmd) != 1) { Con_Printf("usage: mod_generatelightmaps\n"); return; @@ -4405,9 +4400,10 @@ texture_t *Mod_Mesh_GetTexture(dp_model_t *mod, const char *name, int defaultdra { int i; texture_t *t; - for (i = 0; i < mod->num_textures; i++) - if (!strcmp(mod->data_textures[i].name, name)) - return mod->data_textures + i; + int drawflag = defaultdrawflags & DRAWFLAG_MASK; + for (i = 0, t = mod->data_textures; i < mod->num_textures; i++, t++) + if (!strcmp(t->name, name) && t->mesh_drawflag == drawflag && t->mesh_defaulttexflags == defaulttexflags && t->mesh_defaultmaterialflags == defaultmaterialflags) + return t; if (mod->max_textures <= mod->num_textures) { texture_t *oldtextures = mod->data_textures; @@ -4418,7 +4414,10 @@ texture_t *Mod_Mesh_GetTexture(dp_model_t *mod, const char *name, int defaultdra mod->data_surfaces[i].texture = mod->data_textures + (mod->data_surfaces[i].texture - oldtextures); } t = &mod->data_textures[mod->num_textures++]; - Mod_LoadTextureFromQ3Shader(mod->mempool, mod->name, t, name, false, true, defaulttexflags, defaultmaterialflags); + Mod_LoadTextureFromQ3Shader(mod->mempool, mod->name, t, name, true, true, defaulttexflags, defaultmaterialflags); + t->mesh_drawflag = drawflag; + t->mesh_defaulttexflags = defaulttexflags; + t->mesh_defaultmaterialflags = defaultmaterialflags; switch (defaultdrawflags & DRAWFLAG_MASK) { case DRAWFLAG_ADDITIVE: @@ -4605,7 +4604,7 @@ static void Mod_Mesh_MakeSortedSurfaces(dp_model_t *mod) } } -void Mod_Mesh_ComputeBounds(dp_model_t *mod) +static void Mod_Mesh_ComputeBounds(dp_model_t *mod) { int i; vec_t x2a, x2b, y2a, y2b, z2a, z2b, x2, y2, z2, yawradius, rotatedradius; @@ -4685,7 +4684,7 @@ void Mod_Mesh_Validate(dp_model_t *mod) } } -void Mod_Mesh_UploadDynamicBuffers(dp_model_t *mod) +static void Mod_Mesh_UploadDynamicBuffers(dp_model_t *mod) { mod->surfmesh.data_element3s_indexbuffer = mod->surfmesh.data_element3s ? R_BufferData_Store(mod->surfmesh.num_triangles * sizeof(short[3]), mod->surfmesh.data_element3s, R_BUFFERDATA_INDEX16, &mod->surfmesh.data_element3s_bufferoffset) : NULL; mod->surfmesh.data_element3i_indexbuffer = mod->surfmesh.data_element3i ? R_BufferData_Store(mod->surfmesh.num_triangles * sizeof(int[3]), mod->surfmesh.data_element3i, R_BUFFERDATA_INDEX32, &mod->surfmesh.data_element3i_bufferoffset) : NULL;