- mstate.blendfunc1 = GL_SRC_ALPHA;
- mstate.blendfunc2 = GL_ONE;
- }
- else if (ent->alpha != 1.0 || R_TextureHasAlpha(texture))
- {
- mstate.blendfunc1 = GL_SRC_ALPHA;
- mstate.blendfunc2 = GL_ONE_MINUS_SRC_ALPHA;
- }
- else
- {
- mstate.blendfunc1 = GL_ONE;
- mstate.blendfunc2 = GL_ZERO;
- }
- colorscale = r_colorscale;
- if (gl_combine.integer)
- {
- mstate.texrgbscale[0] = 4;
- colorscale *= 0.25f;
- }
- mstate.tex[0] = R_GetTexture(texture);
- R_Mesh_State(&mstate);
- ZymoticLerpBones(ent->model->zymnum_bones, (zymbonematrix *) ent->model->zymdata_poses, ent->frameblend, ent->model->zymdata_bones);
- ZymoticTransformVerts(numverts, varray_vertex, ent->model->zymdata_vertbonecounts, ent->model->zymdata_verts);
- ZymoticCalcNormals(numverts, varray_vertex, aliasvertnorm, ent->model->zymnum_shaders, ent->model->zymdata_renderlist);
- memcpy(varray_texcoord[0], ent->model->zymdata_texcoords, ent->model->zymnum_verts * sizeof(float[4]));
- GL_UseColorArray();
- R_LightModel(ent, numverts, varray_vertex, aliasvertnorm, varray_color, ifog * colorscale, ifog * colorscale, ifog * colorscale, false);
- R_Mesh_Draw(numverts, numtriangles, elements);
- c_alias_polys += numtriangles;
-
- if (fog)
- {
- memset(&mstate, 0, sizeof(mstate));
- mstate.blendfunc1 = GL_SRC_ALPHA;
- mstate.blendfunc2 = GL_ONE_MINUS_SRC_ALPHA;
- // FIXME: need alpha mask for fogging...
- //mstate.tex[0] = R_GetTexture(texture);
- R_Mesh_State(&mstate);
- GL_Color(fogcolor[0] * r_colorscale, fogcolor[1] * r_colorscale, fogcolor[2] * r_colorscale, ent->alpha * fog);
- R_Mesh_Draw(numverts, numtriangles, elements);
- c_alias_polys += numtriangles;
- }
-}
-
-void R_Model_Zymotic_Draw(entity_render_t *ent)
-{
- int i;
-
- if (ent->alpha < (1.0f / 64.0f))
- return; // basically completely transparent
-
- c_models++;
-
- for (i = 0;i < ent->model->zymnum_shaders;i++)
- {
- if (ent->effects & EF_ADDITIVE || ent->alpha != 1.0 || R_TextureHasAlpha(ent->model->zymdata_textures[i]))
- R_MeshQueue_AddTransparent(ent->origin, R_DrawZymoticModelMeshCallback, ent, i);
- else
- R_DrawZymoticModelMeshCallback(ent, i);
+ skin = R_FetchAliasSkin(ent, mesh);
+ // FIXME: transparent skins need to be lit during the transparent render
+ if (skin->flags & ALIASSKIN_TRANSPARENT)
+ continue;
+ vertex3f = NULL;
+ svector3f = NULL;
+ tvector3f = NULL;
+ normal3f = NULL;
+ for (layernum = 0, layer = skin->data_layers;layernum < skin->num_layers;layernum++, layer++)
+ {
+ if (!(layer->flags & (ALIASLAYER_DIFFUSE | ALIASLAYER_SPECULAR))
+ || ((layer->flags & ALIASLAYER_NODRAW_IF_NOTCOLORMAPPED) && ent->colormap < 0)
+ || ((layer->flags & ALIASLAYER_NODRAW_IF_COLORMAPPED) && ent->colormap >= 0))
+ continue;
+ lightcolor2[0] = lightcolor[0] * ifog;
+ lightcolor2[1] = lightcolor[1] * ifog;
+ lightcolor2[2] = lightcolor[2] * ifog;
+ ambientscale2 = 0;
+ diffusescale2 = 0;
+ specularscale2 = 0;
+ if (layer->flags & ALIASLAYER_SPECULAR)
+ specularscale2 = specularscale;
+ if (layer->flags & ALIASLAYER_DIFFUSE)
+ {
+ if (layer->flags & ALIASLAYER_COLORMAP_PANTS)
+ {
+ // 128-224 are backwards ranges
+ c = (ent->colormap & 0xF) << 4;c += (c >= 128 && c < 224) ? 4 : 12;
+ // fullbright passes were already taken care of, so skip them in realtime lighting passes
+ if (c < 224)
+ {
+ bcolor = (qbyte *) (&palette_complete[c]);
+ lightcolor2[0] *= bcolor[0] * (1.0f / 255.0f);
+ lightcolor2[1] *= bcolor[1] * (1.0f / 255.0f);
+ lightcolor2[2] *= bcolor[2] * (1.0f / 255.0f);
+ ambientscale2 = ambientscale;
+ diffusescale2 = diffusescale;
+ }
+ }
+ else if (layer->flags & ALIASLAYER_COLORMAP_SHIRT)
+ {
+ // 128-224 are backwards ranges
+ c = (ent->colormap & 0xF0);c += (c >= 128 && c < 224) ? 4 : 12;
+ // fullbright passes were already taken care of, so skip them in realtime lighting passes
+ if (c < 224)
+ {
+ bcolor = (qbyte *) (&palette_complete[c]);
+ lightcolor2[0] *= bcolor[0] * (1.0f / 255.0f);
+ lightcolor2[1] *= bcolor[1] * (1.0f / 255.0f);
+ lightcolor2[2] *= bcolor[2] * (1.0f / 255.0f);
+ ambientscale2 = ambientscale;
+ diffusescale2 = diffusescale;
+ }
+ }
+ else
+ {
+ ambientscale2 = ambientscale;
+ diffusescale2 = diffusescale;
+ }
+ }
+ if (!(ambientscale2 + diffusescale2 + specularscale2) || VectorLength2(lightcolor2) <= 0.01)
+ continue;
+ c_alias_polys += mesh->num_triangles;
+ if (!vertex3f)
+ {
+ if (ent->frameblend[0].frame == 0 && ent->frameblend[0].lerp == 1)
+ {
+ vertex3f = mesh->data_basevertex3f;
+ svector3f = mesh->data_basesvector3f;
+ tvector3f = mesh->data_basetvector3f;
+ normal3f = mesh->data_basenormal3f;
+ }
+ else
+ {
+ vertex3f = varray_vertex3f;
+ svector3f = varray_svector3f;
+ tvector3f = varray_tvector3f;
+ normal3f = varray_normal3f;
+ Mod_Alias_GetMesh_Vertex3f(ent->model, ent->frameblend, mesh, vertex3f);
+ Mod_BuildTextureVectorsAndNormals(mesh->num_vertices, mesh->num_triangles, vertex3f, mesh->data_texcoord2f, mesh->data_element3i, svector3f, tvector3f, normal3f);
+ }
+ }
+ // TODO: make layer have ->gloss as well as ->texture, and merge specular layer for common non-colormapped case?
+ R_Shadow_RenderLighting(mesh->num_vertices, mesh->num_triangles, mesh->data_element3i, vertex3f, svector3f, tvector3f, normal3f, mesh->data_texcoord2f, relativelightorigin, relativeeyeorigin, lightcolor2, matrix_modeltolight, matrix_modeltoattenuationxyz, matrix_modeltoattenuationz, layer->texture, layer->nmap, layer->texture, lightcubemap, ambientscale2, diffusescale2, specularscale2);
+ }