Exemple #1
0
  /** R_DrawAliasModel */
  void R_DrawAliasModel(entity_t e) {
    if ((e.flags & Defines.RF_WEAPONMODEL) == 0) {
      if (R_CullAliasModel(e)) return;
    }

    if ((e.flags & Defines.RF_WEAPONMODEL) != 0) {
      if (r_lefthand.value == 2.0f) return;
    }

    qfiles.dmdl_t paliashdr = (qfiles.dmdl_t) currentmodel.extradata;

    //
    // get lighting information
    //
    // PMM - rewrote, reordered to handle new shells & mixing
    // PMM - 3.20 code .. replaced with original way of doing it to keep mod
    // authors happy
    //
    int i;
    if ((currententity.flags
            & (Defines.RF_SHELL_HALF_DAM
                | Defines.RF_SHELL_GREEN
                | Defines.RF_SHELL_RED
                | Defines.RF_SHELL_BLUE
                | Defines.RF_SHELL_DOUBLE))
        != 0) {
      Math3D.VectorClear(shadelight);
      if ((currententity.flags & Defines.RF_SHELL_HALF_DAM) != 0) {
        shadelight[0] = 0.56f;
        shadelight[1] = 0.59f;
        shadelight[2] = 0.45f;
      }
      if ((currententity.flags & Defines.RF_SHELL_DOUBLE) != 0) {
        shadelight[0] = 0.9f;
        shadelight[1] = 0.7f;
      }
      if ((currententity.flags & Defines.RF_SHELL_RED) != 0) shadelight[0] = 1.0f;
      if ((currententity.flags & Defines.RF_SHELL_GREEN) != 0) shadelight[1] = 1.0f;
      if ((currententity.flags & Defines.RF_SHELL_BLUE) != 0) shadelight[2] = 1.0f;
    } else if ((currententity.flags & Defines.RF_FULLBRIGHT) != 0) {
      for (i = 0; i < 3; i++) shadelight[i] = 1.0f;
    } else {
      R_LightPoint(currententity.origin, shadelight);

      // player lighting hack for communication back to server
      // big hack!
      if ((currententity.flags & Defines.RF_WEAPONMODEL) != 0) {
        // pick the greatest component, which should be the same
        // as the mono value returned by software
        if (shadelight[0] > shadelight[1]) {
          if (shadelight[0] > shadelight[2]) r_lightlevel.value = 150 * shadelight[0];
          else r_lightlevel.value = 150 * shadelight[2];
        } else {
          if (shadelight[1] > shadelight[2]) r_lightlevel.value = 150 * shadelight[1];
          else r_lightlevel.value = 150 * shadelight[2];
        }
      }

      if (gl_monolightmap.string.charAt(0) != '0') {
        float s = shadelight[0];

        if (s < shadelight[1]) s = shadelight[1];
        if (s < shadelight[2]) s = shadelight[2];

        shadelight[0] = s;
        shadelight[1] = s;
        shadelight[2] = s;
      }
    }

    if ((currententity.flags & Defines.RF_MINLIGHT) != 0) {
      for (i = 0; i < 3; i++) if (shadelight[i] > 0.1f) break;
      if (i == 3) {
        shadelight[0] = 0.1f;
        shadelight[1] = 0.1f;
        shadelight[2] = 0.1f;
      }
    }

    if ((currententity.flags & Defines.RF_GLOW) != 0) { // bonus items
      // will pulse
      // with time
      float scale;
      float min;

      scale = (float) (0.1f * Math.sin(r_newrefdef.time * 7));
      for (i = 0; i < 3; i++) {
        min = shadelight[i] * 0.8f;
        shadelight[i] += scale;
        if (shadelight[i] < min) shadelight[i] = min;
      }
    }

    // =================
    // PGM ir goggles color override
    if ((r_newrefdef.rdflags & Defines.RDF_IRGOGGLES) != 0
        && (currententity.flags & Defines.RF_IR_VISIBLE) != 0) {
      shadelight[0] = 1.0f;
      shadelight[1] = 0.0f;
      shadelight[2] = 0.0f;
    }
    // PGM
    // =================

    shadedots =
        r_avertexnormal_dots[
            ((int) (currententity.angles[1] * (SHADEDOT_QUANT / 360.0))) & (SHADEDOT_QUANT - 1)];

    float an = (float) (currententity.angles[1] / 180 * Math.PI);
    shadevector[0] = (float) Math.cos(-an);
    shadevector[1] = (float) Math.sin(-an);
    shadevector[2] = 1;
    Math3D.VectorNormalize(shadevector);

    //
    // locate the proper data
    //

    c_alias_polys += paliashdr.num_tris;

    //
    // draw all the triangles
    //
    if ((currententity.flags & Defines.RF_DEPTHHACK) != 0) // hack the
      // depth range
      // to prevent
      // view model
      // from poking
      // into walls
      gl.glDepthRange(gldepthmin, gldepthmin + 0.3 * (gldepthmax - gldepthmin));

    if ((currententity.flags & Defines.RF_WEAPONMODEL) != 0 && (r_lefthand.value == 1.0f)) {
      gl.glMatrixMode(GL_PROJECTION);
      gl.glPushMatrix();
      gl.glLoadIdentity();
      gl.glScalef(-1, 1, 1);
      MYgluPerspective(r_newrefdef.fov_y, (float) r_newrefdef.width / r_newrefdef.height, 4, 4096);
      gl.glMatrixMode(GL_MODELVIEW);

      gl.glCullFace(GL_BACK);
    }

    gl.glPushMatrix();
    e.angles[PITCH] = -e.angles[PITCH]; // sigh.
    R_RotateForEntity(e);
    e.angles[PITCH] = -e.angles[PITCH]; // sigh.

    image_t skin;
    // select skin
    if (currententity.skin != null) skin = currententity.skin; // custom player skin
    else {
      if (currententity.skinnum >= qfiles.MAX_MD2SKINS) skin = currentmodel.skins[0];
      else {
        skin = currentmodel.skins[currententity.skinnum];
        if (skin == null) skin = currentmodel.skins[0];
      }
    }
    if (skin == null) skin = r_notexture; // fallback...
    GL_Bind(skin.texnum);

    // draw it

    gl.glShadeModel(GL_SMOOTH);

    GL_TexEnv(GL_MODULATE);
    if ((currententity.flags & Defines.RF_TRANSLUCENT) != 0) {
      gl.glEnable(GL_BLEND);
    }

    if ((currententity.frame >= paliashdr.num_frames) || (currententity.frame < 0)) {
      VID.Printf(
          Defines.PRINT_ALL,
          "R_DrawAliasModel "
              + currentmodel.name
              + ": no such frame "
              + currententity.frame
              + '\n');
      currententity.frame = 0;
      currententity.oldframe = 0;
    }

    if ((currententity.oldframe >= paliashdr.num_frames) || (currententity.oldframe < 0)) {
      VID.Printf(
          Defines.PRINT_ALL,
          "R_DrawAliasModel "
              + currentmodel.name
              + ": no such oldframe "
              + currententity.oldframe
              + '\n');
      currententity.frame = 0;
      currententity.oldframe = 0;
    }

    if (r_lerpmodels.value == 0.0f) currententity.backlerp = 0;

    GL_DrawAliasFrameLerp(paliashdr, currententity.backlerp);

    GL_TexEnv(GL_REPLACE);
    gl.glShadeModel(GL_FLAT);

    gl.glPopMatrix();

    if ((currententity.flags & Defines.RF_WEAPONMODEL) != 0 && (r_lefthand.value == 1.0F)) {
      gl.glMatrixMode(GL_PROJECTION);
      gl.glPopMatrix();
      gl.glMatrixMode(GL_MODELVIEW);
      gl.glCullFace(GL_FRONT);
    }

    if ((currententity.flags & Defines.RF_TRANSLUCENT) != 0) {
      gl.glDisable(GL_BLEND);
    }

    if ((currententity.flags & Defines.RF_DEPTHHACK) != 0) gl.glDepthRange(gldepthmin, gldepthmax);

    if (gl_shadows.value != 0.0f
        && (currententity.flags & (Defines.RF_TRANSLUCENT | Defines.RF_WEAPONMODEL)) == 0) {
      gl.glPushMatrix();
      R_RotateForEntity(e);
      gl.glDisable(GL_TEXTURE_2D);
      gl.glEnable(GL_BLEND);
      gl.glColor4f(0, 0, 0, 0.5f);
      GL_DrawAliasShadow(paliashdr, currententity.frame);
      gl.glEnable(GL_TEXTURE_2D);
      gl.glDisable(GL_BLEND);
      gl.glPopMatrix();
    }
    gl.glColor4f(1, 1, 1, 1);
  }
Exemple #2
0
  /** R_CullAliasModel */
  boolean R_CullAliasModel(entity_t e) {
    qfiles.dmdl_t paliashdr = (qfiles.dmdl_t) currentmodel.extradata;

    if ((e.frame >= paliashdr.num_frames) || (e.frame < 0)) {
      VID.Printf(
          Defines.PRINT_ALL,
          "R_CullAliasModel " + currentmodel.name + ": no such frame " + e.frame + '\n');
      e.frame = 0;
    }
    if ((e.oldframe >= paliashdr.num_frames) || (e.oldframe < 0)) {
      VID.Printf(
          Defines.PRINT_ALL,
          "R_CullAliasModel " + currentmodel.name + ": no such oldframe " + e.oldframe + '\n');
      e.oldframe = 0;
    }

    qfiles.daliasframe_t pframe = paliashdr.aliasFrames[e.frame];
    qfiles.daliasframe_t poldframe = paliashdr.aliasFrames[e.oldframe];

    /*
     * * compute axially aligned mins and maxs
     */
    if (pframe == poldframe) {
      for (int i = 0; i < 3; i++) {
        mins[i] = pframe.translate[i];
        maxs[i] = mins[i] + pframe.scale[i] * 255;
      }
    } else {
      float thismaxs, oldmaxs;
      for (int i = 0; i < 3; i++) {
        thismaxs = pframe.translate[i] + pframe.scale[i] * 255;

        oldmaxs = poldframe.translate[i] + poldframe.scale[i] * 255;

        if (pframe.translate[i] < poldframe.translate[i]) mins[i] = pframe.translate[i];
        else mins[i] = poldframe.translate[i];

        if (thismaxs > oldmaxs) maxs[i] = thismaxs;
        else maxs[i] = oldmaxs;
      }
    }

    /*
     * * compute a full bounding box
     */
    float[] tmp;
    for (int i = 0; i < 8; i++) {
      tmp = bbox[i];
      if ((i & 1) != 0) tmp[0] = mins[0];
      else tmp[0] = maxs[0];

      if ((i & 2) != 0) tmp[1] = mins[1];
      else tmp[1] = maxs[1];

      if ((i & 4) != 0) tmp[2] = mins[2];
      else tmp[2] = maxs[2];
    }

    /*
     * * rotate the bounding box
     */
    tmp = mins;
    Math3D.VectorCopy(e.angles, tmp);
    tmp[YAW] = -tmp[YAW];
    Math3D.AngleVectors(tmp, vectors[0], vectors[1], vectors[2]);

    for (int i = 0; i < 8; i++) {
      Math3D.VectorCopy(bbox[i], tmp);

      bbox[i][0] = Math3D.DotProduct(vectors[0], tmp);
      bbox[i][1] = -Math3D.DotProduct(vectors[1], tmp);
      bbox[i][2] = Math3D.DotProduct(vectors[2], tmp);

      Math3D.VectorAdd(e.origin, bbox[i], bbox[i]);
    }

    int f, mask;
    int aggregatemask = ~0; // 0xFFFFFFFF

    for (int p = 0; p < 8; p++) {
      mask = 0;

      for (f = 0; f < 4; f++) {
        float dp = Math3D.DotProduct(frustum[f].normal, bbox[p]);

        if ((dp - frustum[f].dist) < 0) {
          mask |= (1 << f);
        }
      }

      aggregatemask &= mask;
    }

    if (aggregatemask != 0) {
      return true;
    }

    return false;
  }