summaryrefslogtreecommitdiff
path: root/source/sw_sprite.c
diff options
context:
space:
mode:
authorAndrey Nazarov <skuller@skuller.net>2007-08-14 20:18:08 +0000
committerAndrey Nazarov <skuller@skuller.net>2007-08-14 20:18:08 +0000
commitf294db4ccf45f6274e65260dd6f9a2c5faa94313 (patch)
treee8cf1ba2bfe9c8417eec17faf912442f52fc4ef2 /source/sw_sprite.c
Initial import of the new Q2PRO tree.
Diffstat (limited to 'source/sw_sprite.c')
-rw-r--r--source/sw_sprite.c123
1 files changed, 123 insertions, 0 deletions
diff --git a/source/sw_sprite.c b/source/sw_sprite.c
new file mode 100644
index 0000000..cac2e37
--- /dev/null
+++ b/source/sw_sprite.c
@@ -0,0 +1,123 @@
+/*
+Copyright (C) 1997-2001 Id Software, Inc.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+// r_sprite.c
+#include "sw_local.h"
+
+extern polydesc_t r_polydesc;
+
+void R_BuildPolygonFromSurface(msurface_t *fa);
+void R_PolygonCalculateGradients (void);
+
+extern void R_PolyChooseSpanletRoutine( float alpha, qboolean isturbulent );
+
+extern vec5_t r_clip_verts[2][MAXWORKINGVERTS+2];
+
+extern void R_ClipAndDrawPoly( float alpha, qboolean isturbulent, qboolean textured );
+
+/*
+** R_DrawSprite
+**
+** Draw currententity / currentmodel as a single texture
+** mapped polygon
+*/
+void R_DrawSprite (void)
+{
+ vec5_t *pverts;
+ vec3_t left, up, right, down;
+ dsprite_t *s_psprite;
+ dsprframe_t *s_psprframe;
+
+
+ s_psprite = (dsprite_t *)currentmodel->pool.base;
+#if 0
+ if (currententity->frame >= s_psprite->numframes
+ || currententity->frame < 0)
+ {
+ Com_Printf( "No such sprite frame %i\n",
+ currententity->frame);
+ currententity->frame = 0;
+ }
+#endif
+ currententity->frame %= s_psprite->numframes;
+
+ s_psprframe = &s_psprite->frames[currententity->frame];
+
+ r_polydesc.pixels = currentmodel->skins[currententity->frame]->pixels[0];
+ r_polydesc.pixel_width = s_psprframe->width;
+ r_polydesc.pixel_height = s_psprframe->height;
+ r_polydesc.dist = 0;
+
+ // generate the sprite's axes, completely parallel to the viewplane.
+ VectorCopy (vup, r_polydesc.vup);
+ VectorCopy (vright, r_polydesc.vright);
+ VectorCopy (vpn, r_polydesc.vpn);
+
+// build the sprite poster in worldspace
+ VectorScale (r_polydesc.vright,
+ s_psprframe->width - s_psprframe->origin_x, right);
+ VectorScale (r_polydesc.vup,
+ s_psprframe->height - s_psprframe->origin_y, up);
+ VectorScale (r_polydesc.vright,
+ -s_psprframe->origin_x, left);
+ VectorScale (r_polydesc.vup,
+ -s_psprframe->origin_y, down);
+
+ // invert UP vector for sprites
+ VectorNegate( r_polydesc.vup, r_polydesc.vup );
+
+ pverts = r_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] = s_psprframe->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] = s_psprframe->width;
+ pverts[2][4] = s_psprframe->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] = s_psprframe->height;
+
+ r_polydesc.nump = 4;
+ r_polydesc.s_offset = ( r_polydesc.pixel_width >> 1);
+ r_polydesc.t_offset = ( r_polydesc.pixel_height >> 1);
+ VectorCopy( modelorg, r_polydesc.viewer_position );
+
+ r_polydesc.stipple_parity = 1;
+ if ( currententity->flags & RF_TRANSLUCENT )
+ R_ClipAndDrawPoly ( currententity->alpha, qfalse, qtrue );
+ else
+ R_ClipAndDrawPoly ( 1.0F, qfalse, qtrue );
+ r_polydesc.stipple_parity = 0;
+}
+