out[2] += v->origin[0] * matrix[8] + v->origin[1] * matrix[9] + v->origin[2] * matrix[10] + v->origin[3] * matrix[11];
}
}
+ else if (!model->surfmesh.data_morphvertex3f)
+ Host_Error("model %s has no skeletal or vertex morph animation data", model->name);
else
{
- int i, vertcount;
- float lerp1, lerp2, lerp3, lerp4;
- const float *vertsbase, *verts1, *verts2, *verts3, *verts4;
// vertex morph
- if (!model->surfmesh.data_morphvertex3f)
- Host_Error("model %s has no skeletal or vertex morph animation data", model->name);
- vertsbase = model->surfmesh.data_morphvertex3f;
- vertcount = model->surfmesh.num_vertices;
- verts1 = vertsbase + frameblend[0].frame * vertcount * 3;
- lerp1 = frameblend[0].lerp;
+ int numverts = model->surfmesh.num_vertices;
+ const float *vertsbase = model->surfmesh.data_morphvertex3f;
+ const float *verts1 = vertsbase + numverts * 3 * frameblend[0].frame;
if (frameblend[1].lerp)
{
- verts2 = vertsbase + frameblend[1].frame * vertcount * 3;
- lerp2 = frameblend[1].lerp;
+ int i;
+ float lerp1 = frameblend[0].lerp;
+ const float *verts2 = vertsbase + numverts * 3 * frameblend[1].frame;
+ float lerp2 = frameblend[1].lerp;
if (frameblend[2].lerp)
{
- verts3 = vertsbase + frameblend[2].frame * vertcount * 3;
- lerp3 = frameblend[2].lerp;
+ const float *verts3 = vertsbase + numverts * 3 * frameblend[2].frame;
+ float lerp3 = frameblend[2].lerp;
if (frameblend[3].lerp)
{
- verts4 = vertsbase + frameblend[3].frame * vertcount * 3;
- lerp4 = frameblend[3].lerp;
- for (i = 0;i < vertcount * 3;i++)
- VectorMAMAMAM(lerp1, verts1 + i, lerp2, verts2 + i, lerp3, verts3 + i, lerp4, verts4 + i, out3f + i);
+ const float *verts4 = vertsbase + numverts * 3 * frameblend[3].frame;
+ float lerp4 = frameblend[3].lerp;
+ for (i = 0;i < numverts * 3;i++)
+ out3f[i] = lerp1 * verts1[i] + lerp2 * verts2[i] + lerp3 * verts3[i] + lerp4 * verts4[i];
}
else
- for (i = 0;i < vertcount * 3;i++)
- VectorMAMAM(lerp1, verts1 + i, lerp2, verts2 + i, lerp3, verts3 + i, out3f + i);
+ for (i = 0;i < numverts * 3;i++)
+ out3f[i] = lerp1 * verts1[i] + lerp2 * verts2[i] + lerp3 * verts3[i];
}
else
- for (i = 0;i < vertcount * 3;i++)
- VectorMAM(lerp1, verts1 + i, lerp2, verts2 + i, out3f + i);
+ for (i = 0;i < numverts * 3;i++)
+ out3f[i] = lerp1 * verts1[i] + lerp2 * verts2[i];
}
else
- memcpy(out3f, verts1, vertcount * sizeof(float[3]));
+ memcpy(out3f, verts1, numverts * 3 * sizeof(float));
}
}
loadmodel->surfmesh.data_tvector3f = loadmodel->surfmesh.data_vertex3f + loadmodel->surfmesh.num_vertices * 6;
loadmodel->surfmesh.data_normal3f = loadmodel->surfmesh.data_vertex3f + loadmodel->surfmesh.num_vertices * 9;
Mod_Alias_GetMesh_Vertex3f(loadmodel, frameblend, loadmodel->surfmesh.data_vertex3f);
- Mod_BuildTextureVectorsAndNormals(0, loadmodel->surfmesh.num_vertices, loadmodel->surfmesh.num_triangles, loadmodel->surfmesh.data_vertex3f, loadmodel->surfmesh.data_texcoordtexture2f, loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.data_svector3f, loadmodel->surfmesh.data_tvector3f, loadmodel->surfmesh.data_normal3f, true);
+ Mod_BuildNormals(0, loadmodel->surfmesh.num_vertices, loadmodel->surfmesh.num_triangles, loadmodel->surfmesh.data_vertex3f, loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.data_normal3f, true);
+ 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, true);
}
static void Mod_MDLMD2MD3_TraceBox(model_t *model, int frame, trace_t *trace, const vec3_t start, const vec3_t boxmins, const vec3_t boxmaxs, const vec3_t end, int hitsupercontentsmask)
if (vertex3f)
Z_Free(vertex3f);
maxvertices = (model->surfmesh.num_vertices + 255) & ~255;
- vertex3f = Z_Malloc(maxvertices * sizeof(float[3]));
+ vertex3f = (float *)Z_Malloc(maxvertices * sizeof(float[3]));
}
if (VectorLength2(boxmins) + VectorLength2(boxmaxs) == 0)
{
if (vertex3f)
Z_Free(vertex3f);
maxvertices = (model->surfmesh.num_vertices + 255) & ~255;
- vertex3f = Z_Malloc(maxvertices * sizeof(float[3]));
+ vertex3f = (float *)Z_Malloc(maxvertices * sizeof(float[3]));
}
Mod_Alias_GetMesh_Vertex3f(model, frameblend, vertex3f);
Collision_TraceBrushTriangleMeshFloat(trace, thisbrush_start, thisbrush_end, model->surfmesh.num_triangles, model->surfmesh.data_element3i, vertex3f, SUPERCONTENTS_SOLID, 0, surface->texture, segmentmins, segmentmaxs);
skin->currentframe = skin;
skin->basematerialflags = MATERIALFLAG_WALL;
if (skin->skin.fog)
- skin->basematerialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_TRANSPARENT;
+ skin->basematerialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_BLENDED | MATERIALFLAG_TRANSPARENT;
skin->currentmaterialflags = skin->basematerialflags;
}
loadmodel->surfmesh.data_texcoordtexture2f[(j + surface->num_firstvertex) * 2 + 0] = LittleFloat(((float *)((unsigned char *)pinmesh + LittleLong(pinmesh->lump_texcoords)))[j * 2 + 0]);
loadmodel->surfmesh.data_texcoordtexture2f[(j + surface->num_firstvertex) * 2 + 1] = LittleFloat(((float *)((unsigned char *)pinmesh + LittleLong(pinmesh->lump_texcoords)))[j * 2 + 1]);
}
- for (j = 0;j < surface->num_vertices * loadmodel->numframes;j++)
+ for (j = 0;j < loadmodel->numframes;j++)
{
- loadmodel->surfmesh.data_morphvertex3f[(j + surface->num_firstvertex) * 3 + 0] = LittleShort(((short *)((unsigned char *)pinmesh + LittleLong(pinmesh->lump_framevertices)))[j * 4 + 0]) * (1.0f / 64.0f);
- loadmodel->surfmesh.data_morphvertex3f[(j + surface->num_firstvertex) * 3 + 1] = LittleShort(((short *)((unsigned char *)pinmesh + LittleLong(pinmesh->lump_framevertices)))[j * 4 + 1]) * (1.0f / 64.0f);
- loadmodel->surfmesh.data_morphvertex3f[(j + surface->num_firstvertex) * 3 + 2] = LittleShort(((short *)((unsigned char *)pinmesh + LittleLong(pinmesh->lump_framevertices)))[j * 4 + 2]) * (1.0f / 64.0f);
+ const short *in4s = (short *)((unsigned char *)pinmesh + LittleLong(pinmesh->lump_framevertices)) + j * surface->num_vertices * 4;
+ float *out3f = loadmodel->surfmesh.data_morphvertex3f + 3 * (j * loadmodel->surfmesh.num_vertices + surface->num_firstvertex);
+ for (k = 0;k < surface->num_vertices;k++, in4s += 4, out3f += 3)
+ {
+ out3f[0] = LittleShort(in4s[0]) * (1.0f / 64.0f);
+ out3f[1] = LittleShort(in4s[1]) * (1.0f / 64.0f);
+ out3f[2] = LittleShort(in4s[2]) * (1.0f / 64.0f);
+ }
}
if (LittleLong(pinmesh->num_shaders) >= 1)
meshtriangles = 0;
for (i = 0;i < loadmodel->num_surfaces;i++)
{
- int lastvertex;
+ int firstvertex, lastvertex;
if (renderlist >= renderlistend)
Host_Error("%s corrupt renderlist (wrong size)", loadmodel->name);
count = BigLong(*renderlist);renderlist++;
surface->texture = loadmodel->data_textures + i;
surface->num_firsttriangle = meshtriangles;
surface->num_triangles = count;
- surface->num_firstvertex = meshvertices;
- surface->num_vertices = meshvertices;
+ meshtriangles += surface->num_triangles;
- // load the elements and find the used vertex range
- lastvertex = 0;
+ // load the elements
outelements = loadmodel->surfmesh.data_element3i + surface->num_firsttriangle * 3;
- for (j = 0;j < surface->num_triangles;j++)
+ for (j = 0;j < surface->num_triangles;j++, renderlist += 3)
{
- outelements[2] = BigLong(renderlist[0]);
- outelements[1] = BigLong(renderlist[1]);
- outelements[0] = BigLong(renderlist[2]);
- if ((unsigned int)outelements[0] >= (unsigned int)pheader->numverts
- || (unsigned int)outelements[1] >= (unsigned int)pheader->numverts
- || (unsigned int)outelements[2] >= (unsigned int)pheader->numverts)
+ outelements[j*3+2] = BigLong(renderlist[0]);
+ outelements[j*3+1] = BigLong(renderlist[1]);
+ outelements[j*3+0] = BigLong(renderlist[2]);
+ }
+ // validate the elements and find the used vertex range
+ firstvertex = meshvertices;
+ lastvertex = 0;
+ for (j = 0;j < surface->num_triangles * 3;j++)
+ {
+ if ((unsigned int)outelements[j] >= (unsigned int)meshvertices)
Host_Error("%s corrupt renderlist (out of bounds index)", loadmodel->name);
- if (vertbonecounts[outelements[0]] == 0 || vertbonecounts[outelements[1]] == 0 || vertbonecounts[outelements[2]] == 0)
- Host_Error("%s corrupt renderlist (references vertex with no bone weights", loadmodel->name);
- surface->num_firstvertex = min(surface->num_firstvertex, outelements[0]);
- surface->num_firstvertex = min(surface->num_firstvertex, outelements[1]);
- surface->num_firstvertex = min(surface->num_firstvertex, outelements[2]);
- lastvertex = max(lastvertex, outelements[0]);
- lastvertex = max(lastvertex, outelements[1]);
- lastvertex = max(lastvertex, outelements[2]);
- renderlist += 3;
- outelements += 3;
+ firstvertex = min(firstvertex, outelements[j]);
+ lastvertex = max(lastvertex, outelements[j]);
}
- surface->num_vertices = lastvertex + 1 - surface->num_firstvertex;
+ surface->num_firstvertex = firstvertex;
+ surface->num_vertices = lastvertex + 1 - firstvertex;
// since zym models do not have named sections, reuse their shader
// name as the section name
meshtriangles = 0;
numvertexboneweights = 0;
- // load the meshes now
+ // gather combined statistics from the meshes
dpmmesh = (dpmmesh_t *) (pbase + pheader->ofs_meshs);
- for (i = 0;i < loadmodel->num_surfaces;i++)
+ for (i = 0;i < (int)pheader->num_meshs;i++)
{
int numverts = BigLong(dpmmesh->num_verts);
meshvertices += numverts;;
meshtriangles += BigLong(dpmmesh->num_tris);
- // to find out how many weights exist we two a two-stage load...
data = (unsigned char *) (pbase + BigLong(dpmmesh->ofs_verts));
for (j = 0;j < numverts;j++)
{