Ejemplo n.º 1
0
        /*
        ================
        R_SetupAndDrawSprite
        ================
        */
        static void R_SetupAndDrawSprite()
        {
            int			        i, nump;
            double		        dot, scale;
            double[]            pv;
            double[][]	        pverts;
            double[]            left = new double[3], up = new double[3], right = new double[3], down = new double[3], transformed = new double[3], local = new double[3];
            draw.emitpoint_t[]	outverts = new draw.emitpoint_t[MAXWORKINGVERTS+1];

            for (int kk = 0; kk < MAXWORKINGVERTS + 1; kk++) outverts[kk] = new draw.emitpoint_t();
            dot = mathlib.DotProduct (r_spritedesc.vpn, modelorg);

            // backface cull
            if (dot >= 0)
                return;

            // build the sprite poster in worldspace
            mathlib.VectorScale (r_spritedesc.vright, r_spritedesc.pspriteframe.right, ref right);
            mathlib.VectorScale (r_spritedesc.vup, r_spritedesc.pspriteframe.up, ref up);
            mathlib.VectorScale (r_spritedesc.vright, r_spritedesc.pspriteframe.left, ref left);
            mathlib.VectorScale (r_spritedesc.vup, r_spritedesc.pspriteframe.down, ref down);

            pverts = clip_verts[0];

            pverts[0][0] = r_entorigin[0] + up[0] + left[0];
            pverts[0][1] = r_entorigin[1] + up[1] + left[1];
            pverts[0][2] = r_entorigin[2] + up[2] + left[2];
            pverts[0][3] = 0;
            pverts[0][4] = 0;

            pverts[1][0] = r_entorigin[0] + up[0] + right[0];
            pverts[1][1] = r_entorigin[1] + up[1] + right[1];
            pverts[1][2] = r_entorigin[2] + up[2] + right[2];
            pverts[1][3] = sprite_width;
            pverts[1][4] = 0;

            pverts[2][0] = r_entorigin[0] + down[0] + right[0];
            pverts[2][1] = r_entorigin[1] + down[1] + right[1];
            pverts[2][2] = r_entorigin[2] + down[2] + right[2];
            pverts[2][3] = sprite_width;
            pverts[2][4] = sprite_height;

            pverts[3][0] = r_entorigin[0] + down[0] + left[0];
            pverts[3][1] = r_entorigin[1] + down[1] + left[1];
            pverts[3][2] = r_entorigin[2] + down[2] + left[2];
            pverts[3][3] = 0;
            pverts[3][4] = sprite_height;

            // clip to the frustum in worldspace
            nump = 4;
            clip_current = 0;

            for (i=0 ; i<4 ; i++)
            {
                nump = R_ClipSpriteFace (nump, view_clipplanes[i]);
                if (nump < 3)
                    return;
                if (nump >= MAXWORKINGVERTS)
                    sys_linux.Sys_Error("R_SetupAndDrawSprite: too many points");
            }

            // transform vertices into viewspace and project
            r_spritedesc.nearzi = -999999;

            for (i=0 ; i<nump ; i++)
            {
                pv = clip_verts[clip_current][i];
                mathlib.VectorSubtract (pv, r_origin, ref local);
                render.TransformVector (local, ref transformed);

                if (transformed[2] < NEAR_CLIP)
                    transformed[2] = NEAR_CLIP;

                outverts[i].zi = 1.0 / transformed[2];
                if (outverts[i].zi > r_spritedesc.nearzi)
                    r_spritedesc.nearzi = outverts[i].zi;

                outverts[i].s = pv[3];
                outverts[i].t = pv[4];

                scale = xscale * outverts[i].zi;
                outverts[i].u = (xcenter + scale * transformed[0]);

                scale = yscale * outverts[i].zi;
                outverts[i].v = (ycenter - scale * transformed[1]);
            }

            // draw it
            r_spritedesc.nump = nump;
            r_spritedesc.pverts = outverts;

            draw.D_DrawSprite ();
        }
Ejemplo n.º 2
0
        /*
         * ================
         * R_SetupAndDrawSprite
         * ================
         */
        static void R_SetupAndDrawSprite()
        {
            int    i, nump;
            double dot, scale;

            double[]           pv;
            double[][]         pverts;
            double[]           left     = new double[3], up = new double[3], right = new double[3], down = new double[3], transformed = new double[3], local = new double[3];
            draw.emitpoint_t[] outverts = new draw.emitpoint_t[MAXWORKINGVERTS + 1];

            for (int kk = 0; kk < MAXWORKINGVERTS + 1; kk++)
            {
                outverts[kk] = new draw.emitpoint_t();
            }
            dot = mathlib.DotProduct(r_spritedesc.vpn, modelorg);

            // backface cull
            if (dot >= 0)
            {
                return;
            }

            // build the sprite poster in worldspace
            mathlib.VectorScale(r_spritedesc.vright, r_spritedesc.pspriteframe.right, ref right);
            mathlib.VectorScale(r_spritedesc.vup, r_spritedesc.pspriteframe.up, ref up);
            mathlib.VectorScale(r_spritedesc.vright, r_spritedesc.pspriteframe.left, ref left);
            mathlib.VectorScale(r_spritedesc.vup, r_spritedesc.pspriteframe.down, ref down);

            pverts = clip_verts[0];

            pverts[0][0] = r_entorigin[0] + up[0] + left[0];
            pverts[0][1] = r_entorigin[1] + up[1] + left[1];
            pverts[0][2] = r_entorigin[2] + up[2] + left[2];
            pverts[0][3] = 0;
            pverts[0][4] = 0;

            pverts[1][0] = r_entorigin[0] + up[0] + right[0];
            pverts[1][1] = r_entorigin[1] + up[1] + right[1];
            pverts[1][2] = r_entorigin[2] + up[2] + right[2];
            pverts[1][3] = sprite_width;
            pverts[1][4] = 0;

            pverts[2][0] = r_entorigin[0] + down[0] + right[0];
            pverts[2][1] = r_entorigin[1] + down[1] + right[1];
            pverts[2][2] = r_entorigin[2] + down[2] + right[2];
            pverts[2][3] = sprite_width;
            pverts[2][4] = sprite_height;

            pverts[3][0] = r_entorigin[0] + down[0] + left[0];
            pverts[3][1] = r_entorigin[1] + down[1] + left[1];
            pverts[3][2] = r_entorigin[2] + down[2] + left[2];
            pverts[3][3] = 0;
            pverts[3][4] = sprite_height;

            // clip to the frustum in worldspace
            nump         = 4;
            clip_current = 0;

            for (i = 0; i < 4; i++)
            {
                nump = R_ClipSpriteFace(nump, view_clipplanes[i]);
                if (nump < 3)
                {
                    return;
                }
                if (nump >= MAXWORKINGVERTS)
                {
                    sys_linux.Sys_Error("R_SetupAndDrawSprite: too many points");
                }
            }

            // transform vertices into viewspace and project
            r_spritedesc.nearzi = -999999;

            for (i = 0; i < nump; i++)
            {
                pv = clip_verts[clip_current][i];
                mathlib.VectorSubtract(pv, r_origin, ref local);
                render.TransformVector(local, ref transformed);

                if (transformed[2] < NEAR_CLIP)
                {
                    transformed[2] = NEAR_CLIP;
                }

                outverts[i].zi = 1.0 / transformed[2];
                if (outverts[i].zi > r_spritedesc.nearzi)
                {
                    r_spritedesc.nearzi = outverts[i].zi;
                }

                outverts[i].s = pv[3];
                outverts[i].t = pv[4];

                scale         = xscale * outverts[i].zi;
                outverts[i].u = (xcenter + scale * transformed[0]);

                scale         = yscale * outverts[i].zi;
                outverts[i].v = (ycenter - scale * transformed[1]);
            }

            // draw it
            r_spritedesc.nump   = nump;
            r_spritedesc.pverts = outverts;

            draw.D_DrawSprite();
        }