- out += 3;
- }
-}
-
-void ZymoticCalcNormal3f(int vertcount, float *vertex3f, float *normal3f, int shadercount, int *renderlist)
-{
- int a, b, c, d;
- float *out, v1[3], v2[3], normal[3], s;
- int *u;
- // clear normals
- memset(normal3f, 0, sizeof(float) * vertcount * 3);
- memset(aliasvertusage, 0, sizeof(int) * vertcount);
- // parse render list and accumulate surface normals
- while(shadercount--)
- {
- d = *renderlist++;
- while (d--)
- {
- a = renderlist[0]*4;
- b = renderlist[1]*4;
- c = renderlist[2]*4;
- v1[0] = vertex3f[a+0] - vertex3f[b+0];
- v1[1] = vertex3f[a+1] - vertex3f[b+1];
- v1[2] = vertex3f[a+2] - vertex3f[b+2];
- v2[0] = vertex3f[c+0] - vertex3f[b+0];
- v2[1] = vertex3f[c+1] - vertex3f[b+1];
- v2[2] = vertex3f[c+2] - vertex3f[b+2];
- CrossProduct(v1, v2, normal);
- VectorNormalizeFast(normal);
- // add surface normal to vertices
- a = renderlist[0] * 3;
- normal3f[a+0] += normal[0];
- normal3f[a+1] += normal[1];
- normal3f[a+2] += normal[2];
- aliasvertusage[renderlist[0]]++;
- a = renderlist[1] * 3;
- normal3f[a+0] += normal[0];
- normal3f[a+1] += normal[1];
- normal3f[a+2] += normal[2];
- aliasvertusage[renderlist[1]]++;
- a = renderlist[2] * 3;
- normal3f[a+0] += normal[0];
- normal3f[a+1] += normal[1];
- normal3f[a+2] += normal[2];
- aliasvertusage[renderlist[2]]++;
- renderlist += 3;
- }
- }
- // FIXME: precalc this
- // average surface normals
- out = normal3f;
- u = aliasvertusage;
- while(vertcount--)
- {
- if (*u > 1)
- {
- s = ixtable[*u];
- out[0] *= s;
- out[1] *= s;
- out[2] *= s;
- }
- u++;
- out += 3;
- }
-}
-
-void R_DrawZymoticModelMeshCallback (const void *calldata1, int calldata2)
-{
- float fog, ifog, colorscale, ambientcolor4f[4];
- vec3_t diff;
- int i, *renderlist, *elements;
- rtexture_t *texture;
- rmeshstate_t mstate;
- const entity_render_t *ent = calldata1;
- int shadernum = calldata2;
- int numverts, numtriangles;
-
- R_Mesh_Matrix(&ent->matrix);
-
- // find the vertex index list and texture
- renderlist = ent->model->alias.zymdata_renderlist;
- for (i = 0;i < shadernum;i++)
- renderlist += renderlist[0] * 3 + 1;
- texture = ent->model->alias.zymdata_textures[shadernum];
-
- numverts = ent->model->alias.zymnum_verts;
- numtriangles = *renderlist++;
- elements = renderlist;
-
- expandaliasvert(numverts);
-
- fog = 0;
- if (fogenabled)
- {
- VectorSubtract(ent->origin, r_origin, diff);
- fog = DotProduct(diff,diff);
- if (fog < 0.01f)
- fog = 0.01f;
- fog = exp(fogdensity/fog);
- if (fog > 1)
- fog = 1;
- if (fog < 0.01f)
- fog = 0;
- // fog method: darken, additive fog
- // 1. render model as normal, scaled by inverse of fog alpha (darkens it)
- // 2. render fog as additive
- }
- ifog = 1 - fog;
-
- if (ent->effects & EF_ADDITIVE)
- {
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
- GL_DepthMask(false);
- }
- else if (ent->alpha != 1.0 || R_TextureHasAlpha(texture))
- {
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- GL_DepthMask(false);
- }
- else
- {
- GL_BlendFunc(GL_ONE, GL_ZERO);
- GL_DepthMask(true);
- }
- GL_DepthTest(true);
- GL_VertexPointer(varray_vertex3f);
-
- memset(&mstate, 0, sizeof(mstate));
- colorscale = r_colorscale;
- if (gl_combine.integer)
- {
- mstate.texrgbscale[0] = 4;
- colorscale *= 0.25f;
- }
- mstate.tex[0] = R_GetTexture(texture);
- mstate.pointer_texcoord[0] = ent->model->alias.zymdata_texcoords;
- R_Mesh_State_Texture(&mstate);
-
- ZymoticLerpBones(ent->model->alias.zymnum_bones, (zymbonematrix *) ent->model->alias.zymdata_poses, ent->frameblend, ent->model->alias.zymdata_bones);
-
- ZymoticTransformVerts(numverts, varray_vertex3f, ent->model->alias.zymdata_vertbonecounts, ent->model->alias.zymdata_verts);
- ZymoticCalcNormal3f(numverts, varray_vertex3f, aliasvert_normal3f, ent->model->alias.zymnum_shaders, ent->model->alias.zymdata_renderlist);
- if (R_LightModel(ambientcolor4f, ent, ifog * colorscale, ifog * colorscale, ifog * colorscale, ent->alpha, false))
- {
- GL_ColorPointer(varray_color4f);
- R_LightModel_CalcVertexColors(ambientcolor4f, numverts, varray_vertex3f, aliasvert_normal3f, varray_color4f);