X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=model_alias.c;h=e0e786922b4223d3cdeb05f85f10da509f03f5f9;hb=1fd37f5239fe019e4d53c3e19b6fa9ff67da12e1;hp=952201121f24400c45cb03d75b416d9a2de01455;hpb=be15782a8afe50e18cd04bb2228989a698cba864;p=xonotic%2Fdarkplaces.git diff --git a/model_alias.c b/model_alias.c index 95220112..e0e78692 100644 --- a/model_alias.c +++ b/model_alias.c @@ -94,6 +94,7 @@ void Mod_Skeletal_AnimateVertices(const dp_model_t *model, const frameblend_t *f // blend the vertex bone weights // special case for the extremely common wf[0] == 1 because it saves 3 multiplies per array when compared to the other case (w[0] is always 1 if only one bone controls this vertex, artists only use multiple bones for certain special cases) // special case for the first bone because it avoids the need to memset the arrays before filling + if (vertex3f) { const float *v = model->surfmesh.data_vertex3f; const int *wi = model->surfmesh.data_vertexweightindex4i; @@ -243,23 +244,26 @@ void Mod_MD3_AnimateVertices(const dp_model_t *model, const frameblend_t *frameb for (blendnum = 0;blendnum < numblends;blendnum++) { const md3vertex_t *verts = model->surfmesh.data_morphmd3vertex + numverts * frameblend[blendnum].subframe; - float scale = frameblend[blendnum].lerp * (1.0f / 64.0f); - if (blendnum == 0) + if (vertex3f) { - for (i = 0;i < numverts;i++) + float scale = frameblend[blendnum].lerp * (1.0f / 64.0f); + if (blendnum == 0) { - vertex3f[i * 3 + 0] = verts[i].origin[0] * scale; - vertex3f[i * 3 + 1] = verts[i].origin[1] * scale; - vertex3f[i * 3 + 2] = verts[i].origin[2] * scale; + for (i = 0;i < numverts;i++) + { + vertex3f[i * 3 + 0] = verts[i].origin[0] * scale; + vertex3f[i * 3 + 1] = verts[i].origin[1] * scale; + vertex3f[i * 3 + 2] = verts[i].origin[2] * scale; + } } - } - else - { - for (i = 0;i < numverts;i++) + else { - vertex3f[i * 3 + 0] += verts[i].origin[0] * scale; - vertex3f[i * 3 + 1] += verts[i].origin[1] * scale; - vertex3f[i * 3 + 2] += verts[i].origin[2] * scale; + for (i = 0;i < numverts;i++) + { + vertex3f[i * 3 + 0] += verts[i].origin[0] * scale; + vertex3f[i * 3 + 1] += verts[i].origin[1] * scale; + vertex3f[i * 3 + 2] += verts[i].origin[2] * scale; + } } } // the yaw and pitch stored in md3 models are 8bit quantized angles @@ -336,27 +340,30 @@ void Mod_MDL_AnimateVertices(const dp_model_t *model, const frameblend_t *frameb for (blendnum = 0;blendnum < numblends;blendnum++) { const trivertx_t *verts = model->surfmesh.data_morphmdlvertex + numverts * frameblend[blendnum].subframe; - float scale[3]; - if (model->surfmesh.data_morphmd2framesize6f) - VectorScale(model->surfmesh.data_morphmd2framesize6f + frameblend[blendnum].subframe * 6, frameblend[blendnum].lerp, scale); - else - VectorScale(model->surfmesh.num_morphmdlframescale, frameblend[blendnum].lerp, scale); - if (blendnum == 0) + if (vertex3f) { - for (i = 0;i < numverts;i++) + float scale[3]; + if (model->surfmesh.data_morphmd2framesize6f) + VectorScale(model->surfmesh.data_morphmd2framesize6f + frameblend[blendnum].subframe * 6, frameblend[blendnum].lerp, scale); + else + VectorScale(model->surfmesh.num_morphmdlframescale, frameblend[blendnum].lerp, scale); + if (blendnum == 0) { - vertex3f[i * 3 + 0] = translate[0] + verts[i].v[0] * scale[0]; - vertex3f[i * 3 + 1] = translate[1] + verts[i].v[1] * scale[1]; - vertex3f[i * 3 + 2] = translate[2] + verts[i].v[2] * scale[2]; + for (i = 0;i < numverts;i++) + { + vertex3f[i * 3 + 0] = translate[0] + verts[i].v[0] * scale[0]; + vertex3f[i * 3 + 1] = translate[1] + verts[i].v[1] * scale[1]; + vertex3f[i * 3 + 2] = translate[2] + verts[i].v[2] * scale[2]; + } } - } - else - { - for (i = 0;i < numverts;i++) + else { - vertex3f[i * 3 + 0] += verts[i].v[0] * scale[0]; - vertex3f[i * 3 + 1] += verts[i].v[1] * scale[1]; - vertex3f[i * 3 + 2] += verts[i].v[2] * scale[2]; + for (i = 0;i < numverts;i++) + { + vertex3f[i * 3 + 0] += verts[i].v[0] * scale[0]; + vertex3f[i * 3 + 1] += verts[i].v[1] * scale[1]; + vertex3f[i * 3 + 2] += verts[i].v[2] * scale[2]; + } } } // the vertex normals in mdl models are an index into a table of @@ -498,10 +505,13 @@ static void Mod_BuildBaseBonePoses(void) { int i, k; double scale; - float *basebonepose = (float *) Mem_Alloc(tempmempool, loadmodel->num_bones * sizeof(float[12])); + float *basebonepose; float *in12f = loadmodel->data_poses; - float *out12f = basebonepose; + float *out12f; float *outinv12f = loadmodel->data_baseboneposeinverse; + if (!loadmodel->num_bones) + return; + out12f = basebonepose = (float *) Mem_Alloc(tempmempool, loadmodel->num_bones * sizeof(float[12])); for (i = 0;i < loadmodel->num_bones;i++, in12f += 12, out12f += 12, outinv12f += 12) { if (loadmodel->data_bones[i].parent >= 0) @@ -613,7 +623,7 @@ static void Mod_Alias_MorphMesh_CompileFrames(void) { frameblend[0].subframe = i; loadmodel->AnimateVertices(loadmodel, frameblend, loadmodel->surfmesh.data_vertex3f, loadmodel->surfmesh.data_normal3f, NULL, NULL); - Mod_BuildTextureVectorsFromNormals(0, loadmodel->surfmesh.num_vertices, loadmodel->surfmesh.num_triangles, loadmodel->surfmesh.data_vertex3f, loadmodel->surfmesh.data_texcoordtexture2f, loadmodel->surfmesh.data_normal3f, loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.data_svector3f, loadmodel->surfmesh.data_tvector3f, r_smoothnormals_areaweighting.integer); + Mod_BuildTextureVectorsFromNormals(0, loadmodel->surfmesh.num_vertices, loadmodel->surfmesh.num_triangles, loadmodel->surfmesh.data_vertex3f, loadmodel->surfmesh.data_texcoordtexture2f, loadmodel->surfmesh.data_normal3f, loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.data_svector3f, loadmodel->surfmesh.data_tvector3f, r_smoothnormals_areaweighting.integer != 0); // encode the svector and tvector in 3 byte format for permanent storage for (j = 0;j < loadmodel->surfmesh.num_vertices;j++) {