// ------------------------------------------------------------------------------------- // Texture map current scanline. // Uses globals Du_dx and Dv_dx to incrementally compute u,v coordinates // ------------------------------------------------------------------------------------- void tmap_scanline_flat(int y, fix xleft, fix xright) { if (xright < xleft) return; // setup to call assembler scanline renderer fx_y = y; fx_xleft = f2i(xleft); fx_xright = f2i(xright); if ( Gr_scanline_darkening_level >= GR_FADE_LEVELS ) cur_tmap_scanline_flat(); else { tmap_flat_shade_value = Gr_scanline_darkening_level; cur_tmap_scanline_shaded(); } }
// ------------------------------------------------------------------------------------- // Texture map current scanline. // Uses globals Du_dx and Dv_dx to incrementally compute u,v coordinates // ------------------------------------------------------------------------------------- void tmap_scanline_flat(int y, fix xleft, fix xright) { if (xright < xleft) return; // setup to call assembler scanline renderer fx_y = y; fx_xleft = xleft/F1_0; // (xleft >> 16) != xleft/F1_0 for negative numbers, f2i caused random crashes fx_xright = xright/F1_0; if ( grd_curcanv->cv_fade_level >= GR_FADE_OFF ) cur_tmap_scanline_flat(); else { tmap_flat_shade_value = grd_curcanv->cv_fade_level; cur_tmap_scanline_shaded(); } }
// ------------------------------------------------------------------------------------- // Texture map current scanline. // Uses globals Du_dx and Dv_dx to incrementally compute u,v coordinates // ------------------------------------------------------------------------------------- void tmap_scanline_flat(int y, fix xleft, fix xright) { if (xright < xleft) return; // setup to call assembler scanline renderer fx_y = y; fx_xleft = f2i(xleft); fx_xright = f2i(xright); if ( gameStates.render.grAlpha >= GR_ACTUAL_FADE_LEVELS ) cur_tmap_scanline_flat(); else { tmap_flat_shadeValue = gameStates.render.grAlpha; cur_tmap_scanline_shaded(); } }
// ------------------------------------------------------------------------------------- // Texture map current scanline using linear interpolation. // ------------------------------------------------------------------------------------- void ntmap_scanline_lighted_linear(grs_bitmap *srcb, int y, fix xleft, fix xright, fix uleft, fix uright, fix vleft, fix vright, fix lleft, fix lright) { fix dx,recip_dx,du_dx,dv_dx,dl_dx; dx = f2i(xright) - f2i(xleft); if ((dx < 0) || (xright < 0) || (xleft > xright)) // the (xleft > xright) term is not redundant with (dx < 0) because dx is computed using integers return; // setup to call assembler scanline renderer if (dx < FIX_RECIP_TABLE_SIZE) recip_dx = fix_recip[dx]; else recip_dx = F1_0/dx; du_dx = fixmul(uright - uleft,recip_dx); dv_dx = fixmul(vright - vleft,recip_dx); fx_u = uleft; fx_v = vleft; fx_du_dx = du_dx; fx_dv_dx = dv_dx; fx_y = y; fx_xright = f2i(xright); fx_xleft = f2i(xleft); pixptr = srcb->bm_data; switch (Lighting_enabled) { case 0: //added 07/11/99 adb - prevent writing before the buffer if (fx_xleft < 0) fx_xleft = 0; //end addition -adb cur_tmap_scanline_lin_nolight(); break; case 1: if (lleft < F1_0/2) lleft = F1_0/2; if (lright < F1_0/2) lright = F1_0/2; if (lleft > MAX_LIGHTING_VALUE*NUM_LIGHTING_LEVELS) lleft = MAX_LIGHTING_VALUE*NUM_LIGHTING_LEVELS; if (lright > MAX_LIGHTING_VALUE*NUM_LIGHTING_LEVELS) lright = MAX_LIGHTING_VALUE*NUM_LIGHTING_LEVELS; //added 07/11/99 adb - prevent writing before the buffer if (fx_xleft < 0) fx_xleft = 0; //end addition -adb { fix mul_thing; fx_l = lleft; fx_dl_dx = fixmul(lright - lleft,recip_dx); // This is a pretty ugly hack to prevent lighting overflows. mul_thing = dx * fx_dl_dx; if (lleft + mul_thing < 0) fx_dl_dx += 12; else if (lleft + mul_thing > (NUM_LIGHTING_LEVELS*F1_0-F1_0/2)) fx_dl_dx -= 12; } fx_l = lleft; dl_dx = fixmul(lright - lleft,recip_dx); fx_dl_dx = dl_dx; cur_tmap_scanline_lin(); break; case 2: #ifdef EDITOR_TMAP fx_xright = f2i(xright); fx_xleft = f2i(xleft); tmap_flat_color = 1; cur_tmap_scanline_flat(); #else Int3(); // Illegal, called an editor only routine! #endif break; } }
// ------------------------------------------------------------------------------------- // Texture map current scanline in perspective. // ------------------------------------------------------------------------------------- void ntmap_scanline_lighted(grs_bitmap *srcb, int y, fix xleft, fix xright, fix uleft, fix uright, fix vleft, fix vright, fix zleft, fix zright, fix lleft, fix lright) { fix dx,recip_dx; fx_xright = f2i(xright); //edited 06/27/99 Matt Mueller - moved these tests up from within the switch so as not to do a bunch of needless calculations when we are just gonna return anyway. Slight fps boost? if (fx_xright < Window_clip_left) return; fx_xleft = f2i(xleft); if (fx_xleft > Window_clip_right) return; //end edit -MM dx = fx_xright - fx_xleft; if ((dx < 0) || (xright < 0) || (xleft > xright)) // the (xleft > xright) term is not redundant with (dx < 0) because dx is computed using integers return; // setup to call assembler scanline renderer if (dx < FIX_RECIP_TABLE_SIZE) recip_dx = fix_recip[dx]; else recip_dx = F1_0/dx; fx_u = uleft; fx_v = vleft; fx_z = zleft; fx_du_dx = fixmul(uright - uleft,recip_dx); fx_dv_dx = fixmul(vright - vleft,recip_dx); fx_dz_dx = fixmul(zright - zleft,recip_dx); fx_y = y; pixptr = srcb->bm_data; switch (Lighting_enabled) { case 0: //added 05/17/99 Matt Mueller - prevent writing before the buffer if ((fx_y == 0) && (fx_xleft < 0)) fx_xleft = 0; //end addition -MM if (fx_xright > Window_clip_right) fx_xright = Window_clip_right; cur_tmap_scanline_per(); break; case 1: { fix mul_thing; if (lleft < 0) lleft = 0; if (lright < 0) lright = 0; if (lleft > (NUM_LIGHTING_LEVELS*F1_0-F1_0/2)) lleft = (NUM_LIGHTING_LEVELS*F1_0-F1_0/2); if (lright > (NUM_LIGHTING_LEVELS*F1_0-F1_0/2)) lright = (NUM_LIGHTING_LEVELS*F1_0-F1_0/2); fx_l = lleft; fx_dl_dx = fixmul(lright - lleft,recip_dx); // This is a pretty ugly hack to prevent lighting overflows. mul_thing = dx * fx_dl_dx; if (lleft + mul_thing < 0) fx_dl_dx += 12; else if (lleft + mul_thing > (NUM_LIGHTING_LEVELS*F1_0-F1_0/2)) fx_dl_dx -= 12; //added 05/17/99 Matt Mueller - prevent writing before the buffer if ((fx_y == 0) && (fx_xleft < 0)) fx_xleft = 0; //end addition -MM if (fx_xright > Window_clip_right) fx_xright = Window_clip_right; cur_tmap_scanline_per(); break; } case 2: #ifdef EDITOR_TMAP fx_xright = f2i(xright); fx_xleft = f2i(xleft); tmap_flat_color = 1; cur_tmap_scanline_flat(); #else Int3(); // Illegal, called an editor only routine! #endif break; } }