-void R_DrawQ2AliasModel (void)
-{
- int *order, count;
- vec3_t diff;
- skinframe_t *skinframe;
- model_t *model;
-
- model = currentrenderentity->model;
-
- R_SetupMDLMD2Frames(&skinframe);
-
- if (!r_render.integer)
- return;
-
- // FIXME FIXME FIXME rewrite loader to convert to triangle mesh
- glBindTexture(GL_TEXTURE_2D, R_GetTexture(skinframe->base));
-
- if (currentrenderentity->effects & EF_ADDITIVE)
- {
- glBlendFunc(GL_SRC_ALPHA, GL_ONE); // additive rendering
- glEnable(GL_BLEND);
- glDepthMask(0);
- }
- else if (currentrenderentity->alpha != 1.0 || R_TextureHasAlpha(skinframe->base))
- {
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
- glDepthMask(0);
- }
- else
- {
- glDisable(GL_BLEND);
- glDepthMask(1);
- }
-
- // LordHavoc: big mess...
- // using vertex arrays only slightly, although it is enough to prevent duplicates
- // (saving half the transforms)
- glVertexPointer(3, GL_FLOAT, sizeof(float[3]), aliasvert);
- glColorPointer(4, GL_FLOAT, sizeof(float[4]), aliasvertcolor);
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_COLOR_ARRAY);
-
- GL_LockArray(0, model->numverts);
-
- order = model->md2data_glcmds;
- while(1)
- {
- if (!(count = *order++))
- break;
- if (count > 0)
- glBegin(GL_TRIANGLE_STRIP);
- else
- {
- glBegin(GL_TRIANGLE_FAN);
- count = -count;
- }
- do
- {
- glTexCoord2f(((float *)order)[0], ((float *)order)[1]);
- glArrayElement(order[2]);
- order += 3;
- }
- while (count--);
- }
-
- GL_UnlockArray();
-
- glDisableClientState(GL_COLOR_ARRAY);
- glDisableClientState(GL_VERTEX_ARRAY);
-
- if (fogenabled)
- {
- glDisable (GL_TEXTURE_2D);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable (GL_BLEND);
- glDepthMask(0); // disable zbuffer updates
-
- VectorSubtract(currentrenderentity->origin, r_origin, diff);
- glColor4f(fogcolor[0], fogcolor[1], fogcolor[2], currentrenderentity->alpha * exp(fogdensity/DotProduct(diff,diff)));
-
- // LordHavoc: big mess...
- // using vertex arrays only slightly, although it is enough to prevent duplicates
- // (saving half the transforms)
- glVertexPointer(3, GL_FLOAT, sizeof(float[3]), aliasvert);
- glEnableClientState(GL_VERTEX_ARRAY);
-
- GL_LockArray(0, model->numverts);
-
- order = model->md2data_glcmds;
- while(1)
- {
- if (!(count = *order++))
- break;
- if (count > 0)
- glBegin(GL_TRIANGLE_STRIP);
- else
- {
- glBegin(GL_TRIANGLE_FAN);
- count = -count;
- }
- do
- {
- glArrayElement(order[2]);
- order += 3;
- }
- while (count--);
- }
-
- GL_UnlockArray();
-
- glDisableClientState(GL_VERTEX_ARRAY);
-
- glEnable (GL_TEXTURE_2D);
- glColor3f (1,1,1);
- }
-
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable (GL_BLEND);
- glDepthMask(1);
-}
-