⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mesh.java

📁 Jake2是一个Java 3D游戏引擎.
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                 * frame.translate[0]; point[1] = verts[order[2]].v[1] *                 * frame.scale[1] + frame.translate[1]; point[2] =                 * verts[order[2]].v[2] * frame.scale[2] + frame.translate[2];                 */                if (gl_vertex_arrays.value != 0.0f) {                    index = order[orderIndex + 2] * 3;                    point[0] = vertexArrayBuf.get(index);                    point[1] = vertexArrayBuf.get(index + 1);                    point[2] = vertexArrayBuf.get(index + 2);                } else {                    Math3D.VectorCopy(s_lerped[order[orderIndex + 2]], point);                }                point[0] -= shadevector[0] * (point[2] + lheight);                point[1] -= shadevector[1] * (point[2] + lheight);                point[2] = height;                gl.glVertex3f(point[0], point[1], point[2]);                orderIndex += 3;            } while (--count != 0);            gl.glEnd();        }    }    /*     * * R_CullAliasModel     */    boolean R_CullAliasModel(float[][] bbox, entity_t e) {        int i;        float[] mins = { 0, 0, 0 };        float[] maxs = { 0, 0, 0 };        qfiles.dmdl_t paliashdr;        float[][] vectors = { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } };        float[] thismins = { 0, 0, 0 };        float[] oldmins = { 0, 0, 0 };        float[] thismaxs = { 0, 0, 0 };        float[] oldmaxs = { 0, 0, 0 };        qfiles.daliasframe_t pframe, poldframe;        float[] angles = { 0, 0, 0 };        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;        }        pframe = paliashdr.aliasFrames[e.frame];        poldframe = paliashdr.aliasFrames[e.oldframe];        /*         * * compute axially aligned mins and maxs         */        if (pframe == poldframe) {            for (i = 0; i < 3; i++) {                mins[i] = pframe.translate[i];                maxs[i] = mins[i] + pframe.scale[i] * 255;            }        } else {            for (i = 0; i < 3; i++) {                thismins[i] = pframe.translate[i];                thismaxs[i] = thismins[i] + pframe.scale[i] * 255;                oldmins[i] = poldframe.translate[i];                oldmaxs[i] = oldmins[i] + poldframe.scale[i] * 255;                if (thismins[i] < oldmins[i])                    mins[i] = thismins[i];                else                    mins[i] = oldmins[i];                if (thismaxs[i] > oldmaxs[i])                    maxs[i] = thismaxs[i];                else                    maxs[i] = oldmaxs[i];            }        }        /*         * * compute a full bounding box         */        for (i = 0; i < 8; i++) {            float[] tmp = { 0, 0, 0 };            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];            Math3D.VectorCopy(tmp, bbox[i]);        }        /*         * * rotate the bounding box         */        Math3D.VectorCopy(e.angles, angles);        angles[YAW] = -angles[YAW];        Math3D.AngleVectors(angles, vectors[0], vectors[1], vectors[2]);        for (i = 0; i < 8; i++) {            float[] tmp = { 0, 0, 0 };            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 p, f;            int aggregatemask = ~0; // 0xFFFFFFFF            for (p = 0; p < 8; p++) {                int 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;        }    }    /*     * ================= R_DrawAliasModel     *      * =================     */    void R_DrawAliasModel(entity_t e) {        int i;        qfiles.dmdl_t paliashdr;        float an;        // bounding box        float[][] bbox = { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 },                { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } };        image_t skin;        if ((e.flags & Defines.RF_WEAPONMODEL) == 0) {            if (R_CullAliasModel(bbox, e))                return;        }        if ((e.flags & Defines.RF_WEAPONMODEL) != 0) {            if (r_lefthand.value == 2.0f)                return;        }        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        //        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)];        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.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.GL_MODELVIEW);            gl.glCullFace(GL.GL_BACK);        }        gl.glPushMatrix();        e.angles[PITCH] = -e.angles[PITCH]; // sigh.        R_RotateForEntity(e);        e.angles[PITCH] = -e.angles[PITCH]; // sigh.        // 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.GL_SMOOTH);        GL_TexEnv(GL.GL_MODULATE);        if ((currententity.flags & Defines.RF_TRANSLUCENT) != 0) {            gl.glEnable(GL.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.GL_REPLACE);        gl.glShadeModel(GL.GL_FLAT);        gl.glPopMatrix();        if ((currententity.flags & Defines.RF_WEAPONMODEL) != 0                && (r_lefthand.value == 1.0F)) {            gl.glMatrixMode(GL.GL_PROJECTION);            gl.glPopMatrix();            gl.glMatrixMode(GL.GL_MODELVIEW);            gl.glCullFace(GL.GL_FRONT);        }        if ((currententity.flags & Defines.RF_TRANSLUCENT) != 0) {            gl.glDisable(GL.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.GL_TEXTURE_2D);            gl.glEnable(GL.GL_BLEND);            gl.glColor4f(0, 0, 0, 0.5f);            GL_DrawAliasShadow(paliashdr, currententity.frame);            gl.glEnable(GL.GL_TEXTURE_2D);            gl.glDisable(GL.GL_BLEND);            gl.glPopMatrix();        }        gl.glColor4f(1, 1, 1, 1);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -