/* ================ 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 (); }
/* * ================ * 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(); }