/** * @brief Allocates data arrays for animated models. Only called once at loading time. */ void R_ModLoadArrayData (mAliasModel_t *mod, mAliasMesh_t *mesh, qboolean loadNormals) { const int v = mesh->num_tris * 3 * 3; const int t = mesh->num_tris * 3 * 4; const int st = mesh->num_tris * 3 * 2; assert(mesh->verts == NULL); assert(mesh->texcoords == NULL); assert(mesh->normals == NULL); assert(mesh->tangents == NULL); assert(mesh->next_verts == NULL); assert(mesh->next_normals == NULL); assert(mesh->next_tangents == NULL); mesh->verts = (float *)Mem_PoolAlloc(sizeof(float) * v, vid_modelPool, 0); mesh->normals = (float *)Mem_PoolAlloc(sizeof(float) * v, vid_modelPool, 0); mesh->tangents = (float *)Mem_PoolAlloc(sizeof(float) * t, vid_modelPool, 0); mesh->texcoords = (float *)Mem_PoolAlloc(sizeof(float) * st, vid_modelPool, 0); if (mod->num_frames == 1) { R_FillArrayData(mod, mesh, 0.0, 0, 0, loadNormals); } else { mesh->next_verts = (float *)Mem_PoolAlloc(sizeof(float) * v, vid_modelPool, 0); mesh->next_normals = (float *)Mem_PoolAlloc(sizeof(float) * v, vid_modelPool, 0); mesh->next_tangents = (float *)Mem_PoolAlloc(sizeof(float) * t, vid_modelPool, 0); mod->curFrame = -1; mod->oldFrame = -1; } }
/** * @brief Animated model render function * @see R_DrawAliasStatic */ static void R_DrawAliasFrameLerp (mAliasModel_t* mod, mAliasMesh_t *mesh, float backlerp, int framenum, int oldframenum, const vec4_t shellColor) { R_FillArrayData(mod, mesh, backlerp, framenum, oldframenum, false); R_EnableAnimation(mesh, backlerp, true); glDrawArrays(GL_TRIANGLES, 0, mesh->num_tris * 3); refdef.batchCount++; R_DrawMeshModelShell(mesh, shellColor); R_EnableAnimation(NULL, 0.0, false); R_CheckError(); }