shithub: choc

Download patch

ref: bdd800ded2c0e2df1b15372135b9cfd5901f6ecd
parent: d95111bc5c481f7ccd155d8a8d8064d81b0180ac
author: Samuel Villareal <svkaiser@gmail.com>
date: Mon Sep 6 20:11:51 EDT 2010

+ Translucent sprites - initial implementation

Subversion-branch: /branches/strife-branch
Subversion-revision: 2029

--- a/src/strife/r_draw.c
+++ b/src/strife/r_draw.c
@@ -415,10 +415,110 @@
 
 	frac += fracstep; 
     } while (count--); 
-} 
+}
+
+//
+// R_DrawTLColumn
+//
+// villsa [STRIFE] new function
+// Replacement for R_DrawFuzzColumn
+//
+void R_DrawTLColumn(void)
+{
+     int			count; 
+    byte*		dest; 
+    fixed_t		frac;
+    fixed_t		fracstep;	 
+
+    // Adjust borders. Low... 
+    if (!dc_yl) 
+	dc_yl = 1;
+
+    // .. and high.
+    if (dc_yh == viewheight-1) 
+	dc_yh = viewheight - 2; 
+		 
+    count = dc_yh - dc_yl; 
+
+    // Zero length.
+    if (count < 0) 
+	return; 
+
+#ifdef RANGECHECK 
+    if ((unsigned)dc_x >= SCREENWIDTH
+	|| dc_yl < 0 || dc_yh >= SCREENHEIGHT)
+    {
+	I_Error ("R_DrawFuzzColumn: %i to %i at %i",
+		 dc_yl, dc_yh, dc_x);
+    }
+#endif
+    
+    dest = ylookup[dc_yl] + columnofs[dc_x];
+
+    // Looks familiar.
+    fracstep = dc_iscale; 
+    frac = dc_texturemid + (dc_yl-centery)*fracstep; 
+
+    do
+    {
+        *dest = xlatab[*dest+
+            (dc_colormap[dc_source[(frac>>FRACBITS)&127]]<<8)];
+        dest += SCREENWIDTH;
+        frac += fracstep;
+    } while(count--);
+}
  
+
+//
+// R_DrawMVisTLColumn
+//
+// villsa [STRIFE] new function
+//
+void R_DrawMVisTLColumn(void)
+{
+     int			count; 
+    byte*		dest; 
+    fixed_t		frac;
+    fixed_t		fracstep;	 
+
+    // Adjust borders. Low... 
+    if (!dc_yl) 
+	dc_yl = 1;
+
+    // .. and high.
+    if (dc_yh == viewheight-1) 
+	dc_yh = viewheight - 2; 
+		 
+    count = dc_yh - dc_yl; 
+
+    // Zero length.
+    if (count < 0) 
+	return; 
+
+#ifdef RANGECHECK 
+    if ((unsigned)dc_x >= SCREENWIDTH
+	|| dc_yl < 0 || dc_yh >= SCREENHEIGHT)
+    {
+	I_Error ("R_DrawFuzzColumn: %i to %i at %i",
+		 dc_yl, dc_yh, dc_x);
+    }
+#endif
+    
+    dest = ylookup[dc_yl] + columnofs[dc_x];
+
+    // Looks familiar.
+    fracstep = dc_iscale; 
+    frac = dc_texturemid + (dc_yl-centery)*fracstep; 
+
+    do
+    {
+        *dest = xlatab[((*dest)<<8)
+            + dc_colormap[dc_source[(frac>>FRACBITS)&127]]];
+        dest += SCREENWIDTH;
+        frac += fracstep;
+    } while(count--);
+}
   
-  
  
 
 //
@@ -527,7 +627,52 @@
 	
 	frac += fracstep; 
     } while (count--); 
-} 
+}
+
+//
+// R_DrawTRTLColumn
+//
+// villsa [STRIFE] new function
+//
+void R_DrawTRTLColumn(void)
+{
+    int			count; 
+    byte*		dest; 
+    fixed_t		frac;
+    fixed_t		fracstep;	 
+ 
+    count = dc_yh - dc_yl; 
+    if (count < 0) 
+	return; 
+				 
+#ifdef RANGECHECK 
+    if ((unsigned)dc_x >= SCREENWIDTH
+	|| dc_yl < 0
+	|| dc_yh >= SCREENHEIGHT)
+    {
+	I_Error ( "R_DrawColumn: %i to %i at %i",
+		  dc_yl, dc_yh, dc_x);
+    }
+    
+#endif 
+
+
+    dest = ylookup[dc_yl] + columnofs[dc_x]; 
+
+    // Looks familiar.
+    fracstep = dc_iscale; 
+    frac = dc_texturemid + (dc_yl-centery)*fracstep; 
+
+    // Here we do an additional index re-mapping.
+    do 
+    {
+        *dest = xlatab[((*dest)<<8)
+            + dc_colormap[dc_translation[dc_source[frac>>FRACBITS]]]];
+	dest += SCREENWIDTH;
+	
+	frac += fracstep; 
+    } while (count--); 
+}
 
 
 // haleyjd 08/26/10: [STRIFE] - Rogue's translucency lookup table
--- a/src/strife/r_draw.h
+++ b/src/strife/r_draw.h
@@ -49,8 +49,8 @@
 void 	R_DrawColumnLow (void);
 
 // The Spectre/Invisibility effect.
-void 	R_DrawFuzzColumn (void);
-void 	R_DrawFuzzColumnLow (void);
+//void 	R_DrawFuzzColumn (void);
+//void 	R_DrawFuzzColumnLow (void);
 
 // Draw with color translation tables,
 //  for player sprite rendering,
@@ -57,6 +57,11 @@
 //  Green/Red/Blue/Indigo shirts.
 void	R_DrawTranslatedColumn (void);
 void	R_DrawTranslatedColumnLow (void);
+
+// villsa [STRIFE] - transclucent rendering
+void    R_DrawTLColumn (void);
+void    R_DrawMVisTLColumn (void);
+void    R_DrawTRTLColumn (void);
 
 void
 R_VideoErase
--- a/src/strife/r_main.c
+++ b/src/strife/r_main.c
@@ -709,20 +709,21 @@
     centeryfrac = centery<<FRACBITS;
     projection = centerxfrac;
 
-    if (!detailshift)
+    //if (!detailshift) // villsa [STRIFE]
     {
 	colfunc = basecolfunc = R_DrawColumn;
-	fuzzcolfunc = R_DrawFuzzColumn;
+	fuzzcolfunc = R_DrawTLColumn;   // villsa [STRIFE]
 	transcolfunc = R_DrawTranslatedColumn;
 	spanfunc = R_DrawSpan;
     }
-    else
+    // villsa [STRIFE] unused detail stuff
+    /*else
     {
 	colfunc = basecolfunc = R_DrawColumnLow;
 	fuzzcolfunc = R_DrawFuzzColumnLow;
 	transcolfunc = R_DrawTranslatedColumnLow;
 	spanfunc = R_DrawSpanLow;
-    }
+    }*/
 
     R_InitBuffer (scaledviewwidth, viewheight);
 	
@@ -930,3 +931,4 @@
     // Check for new console commands.
     NetUpdate ();				
 }
+
--- a/src/strife/r_things.c
+++ b/src/strife/r_things.c
@@ -413,23 +413,43 @@
     fixed_t		frac;
     patch_t*		patch;
     int                 clip;   // villsa [STRIFE]
+    int                 translation;    // villsa [STRIFE]
 	
 	
     patch = W_CacheLumpNum (vis->patch+firstspritelump, PU_CACHE);
 
     dc_colormap = vis->colormap;
+
+    // villsa [STRIFE]
+    translation = vis->mobjflags & (MF_COLORSWAP1|MF_COLORSWAP2|MF_COLORSWAP3);
     
-    if (!dc_colormap)
+    // villsa [STRIFE] unused
+    /*if (!dc_colormap)
     {
 	// NULL colormap = shadow draw
 	colfunc = fuzzcolfunc;
+    }*/
+    // villsa [STRIFE]
+    if(vis->mobjflags & MF_SHADOW)
+    {
+        if(!translation)
+        {
+            if(vis->mobjflags & MF_MVIS)
+                colfunc = R_DrawMVisTLColumn;
+            else
+                colfunc = fuzzcolfunc;
+        }
+        else
+        {
+            colfunc = R_DrawTRTLColumn;
+	    dc_translation = translationtables - 256 + (translation>>20);
+        }
     }
     // villsa [STRIFE] new translation tables
-    else if (vis->mobjflags & (MF_COLORSWAP1|MF_COLORSWAP2|MF_COLORSWAP3))
+    else if (translation)
     {
 	colfunc = transcolfunc;
-	dc_translation = translationtables - 256 +
-	    ((vis->mobjflags & (MF_COLORSWAP1|MF_COLORSWAP2|MF_COLORSWAP3))>>20);
+	dc_translation = translationtables - 256 + (translation>>20);
     }
 	
     dc_iscale = abs(vis->xiscale)>>detailshift;
@@ -602,12 +622,13 @@
     vis->patch = lump;
     
     // get light level
-    if (thing->flags & MF_SHADOW)
+    // villsa [STRIFE] unused
+    /*if (thing->flags & MF_SHADOW)
     {
 	// shadow draw
 	vis->colormap = NULL;
     }
-    else if (fixedcolormap)
+    else */if (fixedcolormap)
     {
 	// fixed map
 	vis->colormap = fixedcolormap;