X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=model_shared.c;h=c54375043d7bfbcb469df518c51fb4d3e2575c09;hb=cdd93e8c5f467a92d2104f87d1dac61dcd53de15;hp=7697fa6ee1ce5ff7d49cfeb80a99de6619df8674;hpb=79d25017219944e264aadc7ab556c86d3955e4b2;p=xonotic%2Fdarkplaces.git diff --git a/model_shared.c b/model_shared.c index 7697fa6e..c5437504 100644 --- a/model_shared.c +++ b/model_shared.c @@ -148,7 +148,6 @@ Mod_Init static void Mod_Print(void); static void Mod_Precache (void); static void Mod_Decompile_f(void); -static void Mod_BuildVBOs(void); static void Mod_GenerateLightmaps_f(void); void Mod_Init (void) { @@ -655,11 +654,11 @@ void Mod_BuildTriangleNeighbors(int *neighbors, const int *elements, int numtria int element[2]; } edgehashentry_t; - static edgehashentry_t *edgehash[TRIANGLEEDGEHASH]; + static edgehashentry_t **edgehash; edgehashentry_t *edgehashentries, *hash; if (!numtriangles) return; - memset(edgehash, 0, sizeof(edgehash)); + edgehash = Mem_Alloc(tempmempool, TRIANGLEEDGEHASH * sizeof(*edgehash)); // if there are too many triangles for the stack array, allocate larger buffer edgehashentries = (edgehashentry_t *)Mem_Alloc(tempmempool, numtriangles * 3 * sizeof(edgehashentry_t)); // find neighboring triangles @@ -711,6 +710,7 @@ void Mod_BuildTriangleNeighbors(int *neighbors, const int *elements, int numtria } // free the allocated buffer Mem_Free(edgehashentries); + Mem_Free(edgehash); } #else // very slow but simple way @@ -1148,6 +1148,8 @@ static void Mod_ShadowMesh_CreateVBOs(shadowmesh_t *mesh) { if (!vid.support.arb_vertex_buffer_object) return; + if (mesh->vbo) + return; // element buffer is easy because it's just one array if (mesh->numtriangles) @@ -1482,7 +1484,7 @@ static void Q3Shader_AddToHash (q3shaderinfo_t* shader) end = ((unsigned char *) (&shader->Q3SHADERINFO_COMPARE_END)) + sizeof(shader->Q3SHADERINFO_COMPARE_END); start2 = (unsigned char *) (&entry->shader.Q3SHADERINFO_COMPARE_START); if(memcmp(start, start2, end - start)) - Con_Printf("Shader '%s' already defined, ignoring mismatching redeclaration\n", shader->name); + Con_DPrintf("Shader '%s' already defined, ignoring mismatching redeclaration\n", shader->name); else Con_DPrintf("Shader '%s' already defined\n", shader->name); return; @@ -1556,7 +1558,7 @@ void Mod_LoadQ3Shaders(void) strlcpy(shader.name, com_token, sizeof(shader.name)); if (!COM_ParseToken_QuakeC(&text, false) || strcasecmp(com_token, "{")) { - Con_Printf("%s parsing error - expected \"{\", found \"%s\"\n", search->filenames[fileindex], com_token); + Con_DPrintf("%s parsing error - expected \"{\", found \"%s\"\n", search->filenames[fileindex], com_token); break; } while (COM_ParseToken_QuakeC(&text, false)) @@ -1600,12 +1602,12 @@ void Mod_LoadQ3Shaders(void) } //for (j = numparameters;j < TEXTURE_MAXFRAMES + 4;j++) // parameter[j][0] = 0; - if (developer.integer >= 100) + if (developer_insane.integer) { - Con_Printf("%s %i: ", shader.name, shader.numlayers - 1); + Con_DPrintf("%s %i: ", shader.name, shader.numlayers - 1); for (j = 0;j < numparameters;j++) - Con_Printf(" %s", parameter[j]); - Con_Print("\n"); + Con_DPrintf(" %s", parameter[j]); + Con_DPrint("\n"); } if (numparameters >= 2 && !strcasecmp(parameter[0], "blendfunc")) { @@ -1797,7 +1799,7 @@ void Mod_LoadQ3Shaders(void) shader.textureblendalpha = true; } } - layer->texflags = TEXF_ALPHA | TEXF_PRECACHE; + layer->texflags = TEXF_ALPHA; if (!(shader.surfaceparms & Q3SURFACEPARM_NOMIPMAPS)) layer->texflags |= TEXF_MIPMAP; if (!(shader.textureflags & Q3TEXTUREFLAG_NOPICMIP)) @@ -1821,12 +1823,12 @@ void Mod_LoadQ3Shaders(void) // parameter[j][0] = 0; if (fileindex == 0 && !strcasecmp(com_token, "}")) break; - if (developer.integer >= 100) + if (developer_insane.integer) { - Con_Printf("%s: ", shader.name); + Con_DPrintf("%s: ", shader.name); for (j = 0;j < numparameters;j++) - Con_Printf(" %s", parameter[j]); - Con_Print("\n"); + Con_DPrintf(" %s", parameter[j]); + Con_DPrint("\n"); } if (numparameters < 1) continue; @@ -2210,21 +2212,21 @@ nothing GL_ZERO GL_ONE } else if (!strcmp(texture->name, "noshader") || !texture->name[0]) { - if (developer.integer >= 100) - Con_Printf("^1%s:^7 using fallback noshader material for ^3\"%s\"\n", loadmodel->name, name); + if (developer_extra.integer) + Con_DPrintf("^1%s:^7 using fallback noshader material for ^3\"%s\"\n", loadmodel->name, name); texture->surfaceparms = 0; } else if (!strcmp(texture->name, "common/nodraw") || !strcmp(texture->name, "textures/common/nodraw")) { - if (developer.integer >= 100) - Con_Printf("^1%s:^7 using fallback nodraw material for ^3\"%s\"\n", loadmodel->name, name); + if (developer_extra.integer) + Con_DPrintf("^1%s:^7 using fallback nodraw material for ^3\"%s\"\n", loadmodel->name, name); texture->surfaceparms = 0; texture->basematerialflags = MATERIALFLAG_NODRAW | MATERIALFLAG_NOSHADOW; } else { - if (developer.integer >= 100) - Con_Printf("^1%s:^7 No shader found for texture ^3\"%s\"\n", loadmodel->name, texture->name); + if (developer_extra.integer) + Con_DPrintf("^1%s:^7 No shader found for texture ^3\"%s\"\n", loadmodel->name, texture->name); texture->surfaceparms = 0; if (texture->surfaceflags & Q3SURFACEFLAG_NODRAW) texture->basematerialflags |= MATERIALFLAG_NODRAW | MATERIALFLAG_NOSHADOW; @@ -2480,9 +2482,9 @@ void Mod_MakeSortedSurfaces(dp_model_t *mod) Mem_Free(numsurfacesfortexture); } -static void Mod_BuildVBOs(void) +void Mod_BuildVBOs(void) { - if (developer.integer && loadmodel->surfmesh.data_element3s && loadmodel->surfmesh.data_element3i) + if (gl_paranoid.integer && loadmodel->surfmesh.data_element3s && loadmodel->surfmesh.data_element3i) { int i; for (i = 0;i < loadmodel->surfmesh.num_triangles*3;i++) @@ -2497,6 +2499,9 @@ static void Mod_BuildVBOs(void) if (!vid.support.arb_vertex_buffer_object) return; + // only build a vbo if one has not already been created (this is important for brush models which load specially) + if (loadmodel->surfmesh.vbo) + return; // element buffer is easy because it's just one array if (loadmodel->surfmesh.num_triangles) @@ -2649,9 +2654,7 @@ static void Mod_Decompile_SMD(dp_model_t *model, const char *filename, int first int transformindex; int poseindex; int cornerindex; - float modelscale; const int *e; - const float *pose; size_t l; size_t outbufferpos = 0; size_t outbuffermax = 0x100000; @@ -2660,16 +2663,6 @@ static void Mod_Decompile_SMD(dp_model_t *model, const char *filename, int first l = dpsnprintf(outbuffer + outbufferpos, outbuffermax - outbufferpos, "version 1\nnodes\n"); if (l > 0) outbufferpos += l; - modelscale = 1; - if(model->num_poses >= 0) - modelscale = sqrt(model->data_poses[0] * model->data_poses[0] + model->data_poses[1] * model->data_poses[1] + model->data_poses[2] * model->data_poses[2]); - if(fabs(modelscale - 1) > 1e-4) - { - if(firstpose == 0) // only print the when writing the reference pose - Con_Printf("The model has an old-style model scale of %f\n", modelscale); - } - else - modelscale = 1; for (transformindex = 0;transformindex < model->num_bones;transformindex++) { if (outbufferpos >= outbuffermax >> 1) @@ -2688,17 +2681,18 @@ static void Mod_Decompile_SMD(dp_model_t *model, const char *filename, int first l = dpsnprintf(outbuffer + outbufferpos, outbuffermax - outbufferpos, "end\nskeleton\n"); if (l > 0) outbufferpos += l; - for (poseindex = 0, pose = model->data_poses + model->num_bones * 12 * firstpose;poseindex < numposes;poseindex++) + for (poseindex = 0;poseindex < numposes;poseindex++) { countframes++; l = dpsnprintf(outbuffer + outbufferpos, outbuffermax - outbufferpos, "time %i\n", poseindex); if (l > 0) outbufferpos += l; - for (transformindex = 0;transformindex < model->num_bones;transformindex++, pose += 12) + for (transformindex = 0;transformindex < model->num_bones;transformindex++) { float a, b, c; float angles[3]; - float mtest[3][4]; + float mtest[4][3]; + matrix4x4_t posematrix; if (outbufferpos >= outbuffermax >> 1) { outbuffermax *= 2; @@ -2710,18 +2704,8 @@ static void Mod_Decompile_SMD(dp_model_t *model, const char *filename, int first // strangely the smd angles are for a transposed matrix, so we // have to generate a transposed matrix, then convert that... - mtest[0][0] = pose[ 0]; - mtest[0][1] = pose[ 4]; - mtest[0][2] = pose[ 8]; - mtest[0][3] = pose[ 3]; - mtest[1][0] = pose[ 1]; - mtest[1][1] = pose[ 5]; - mtest[1][2] = pose[ 9]; - mtest[1][3] = pose[ 7]; - mtest[2][0] = pose[ 2]; - mtest[2][1] = pose[ 6]; - mtest[2][2] = pose[10]; - mtest[2][3] = pose[11]; + Matrix4x4_FromBonePose6s(&posematrix, model->num_posescale, model->data_poses6s + 6*(model->num_bones * poseindex + transformindex)); + Matrix4x4_ToArray12FloatGL(&posematrix, mtest[0]); AnglesFromVectors(angles, mtest[0], mtest[2], false); if (angles[0] >= 180) angles[0] -= 360; if (angles[1] >= 180) angles[1] -= 360; @@ -2734,8 +2718,8 @@ static void Mod_Decompile_SMD(dp_model_t *model, const char *filename, int first #if 0 { float cy, sy, cp, sp, cr, sr; - float test[3][4]; - // smd matrix construction, for comparing to non-transposed m + float test[4][3]; + // smd matrix construction, for comparing sy = sin(c); cy = cos(c); sp = sin(b); @@ -2744,20 +2728,20 @@ static void Mod_Decompile_SMD(dp_model_t *model, const char *filename, int first cr = cos(a); test[0][0] = cp*cy; - test[1][0] = cp*sy; - test[2][0] = -sp; - test[0][1] = sr*sp*cy+cr*-sy; + test[0][1] = cp*sy; + test[0][2] = -sp; + test[1][0] = sr*sp*cy+cr*-sy; test[1][1] = sr*sp*sy+cr*cy; - test[2][1] = sr*cp; - test[0][2] = (cr*sp*cy+-sr*-sy); - test[1][2] = (cr*sp*sy+-sr*cy); + test[1][2] = sr*cp; + test[2][0] = (cr*sp*cy+-sr*-sy); + test[2][1] = (cr*sp*sy+-sr*cy); test[2][2] = cr*cp; - test[0][3] = pose[3]; - test[1][3] = pose[7]; - test[2][3] = pose[11]; + test[3][0] = pose[9]; + test[3][1] = pose[10]; + test[3][2] = pose[11]; } #endif - l = dpsnprintf(outbuffer + outbufferpos, outbuffermax - outbufferpos, "%3i %f %f %f %f %f %f\n", transformindex, pose[3] * modelscale, pose[7] * modelscale, pose[11] * modelscale, DEG2RAD(angles[ROLL]), DEG2RAD(angles[PITCH]), DEG2RAD(angles[YAW])); + l = dpsnprintf(outbuffer + outbufferpos, outbuffermax - outbufferpos, "%3i %f %f %f %f %f %f\n", transformindex, mtest[3][0], mtest[3][1], mtest[3][2], DEG2RAD(angles[ROLL]), DEG2RAD(angles[PITCH]), DEG2RAD(angles[YAW])); if (l > 0) outbufferpos += l; } @@ -3076,7 +3060,7 @@ static void Mod_GenerateLightmaps_CreateLights_ComputeSVBSP_InsertSurfaces(const const float *vertex3f = model->surfmesh.data_vertex3f; const int *element3i = model->surfmesh.data_element3i; const int *e; - double v2[3][3]; + float v2[3][3]; for (surfaceindex = 0, surface = model->data_surfaces;surfaceindex < model->nummodelsurfaces;surfaceindex++, surface++) { if (!BoxesOverlap(surface->mins, surface->maxs, mins, maxs)) @@ -3097,7 +3081,7 @@ static void Mod_GenerateLightmaps_CreateLights_ComputeSVBSP(dp_model_t *model, l { int maxnodes = 1<<14; svbsp_node_t *nodes; - double origin[3]; + float origin[3]; float mins[3]; float maxs[3]; svbsp_t svbsp; @@ -3740,8 +3724,8 @@ static void Mod_GenerateLightmaps_CreateLightmaps(dp_model_t *model) for (lightmapindex = 0;lightmapindex < model->brushq3.num_mergedlightmaps;lightmapindex++) { - model->brushq3.data_lightmaps[lightmapindex] = R_LoadTexture2D(model->texturepool, va("lightmap%i", lightmapindex), lm_texturesize, lm_texturesize, lightmappixels + lightmapindex * lm_texturesize * lm_texturesize * 4, TEXTYPE_BGRA, TEXF_FORCELINEAR | TEXF_PRECACHE, NULL); - model->brushq3.data_deluxemaps[lightmapindex] = R_LoadTexture2D(model->texturepool, va("deluxemap%i", lightmapindex), lm_texturesize, lm_texturesize, deluxemappixels + lightmapindex * lm_texturesize * lm_texturesize * 4, TEXTYPE_BGRA, TEXF_FORCELINEAR | TEXF_PRECACHE, NULL); + model->brushq3.data_lightmaps[lightmapindex] = R_LoadTexture2D(model->texturepool, va("lightmap%i", lightmapindex), lm_texturesize, lm_texturesize, lightmappixels + lightmapindex * lm_texturesize * lm_texturesize * 4, TEXTYPE_BGRA, TEXF_FORCELINEAR, NULL); + model->brushq3.data_deluxemaps[lightmapindex] = R_LoadTexture2D(model->texturepool, va("deluxemap%i", lightmapindex), lm_texturesize, lm_texturesize, deluxemappixels + lightmapindex * lm_texturesize * lm_texturesize * 4, TEXTYPE_BGRA, TEXF_FORCELINEAR, NULL); } if (lightmappixels)