Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
Fetching contributors…

Cannot retrieve contributors at this time

file 74 lines (50 sloc) 2.796 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
/*
===========================================================================

Doom 3 BFG Edition GPL Source Code
Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.

This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").

Doom 3 BFG Edition Source Code 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 3 of the License, or
(at your option) any later version.

Doom 3 BFG Edition Source Code 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 Doom 3 BFG Edition Source Code. If not, see <http://www.gnu.org/licenses/>.

In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below.

If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.

===========================================================================
*/

#include "global.inc"

/*

This shader will cover a square block of pixel coordinates, but some of them might
be scissored off if the edges of the screen or the midpoint divider are visible through
the optics.

*/

uniform sampler2D samp0 : register(s0);

struct PS_IN {
vec4 texcoord0 : TEXCOORD0_centroid;
};


struct PS_OUT {
float4 color : COLOR;
};

void main( PS_IN fragment, out PS_OUT result ) {
    const float screenWarp_range = 1.45;

    const vec2 warpCenter = vec2( 0.5, 0.5 );
    vec2 centeredTexcoord = fragment.texcoord0.xy - warpCenter;

float radialLength = length( centeredTexcoord );
vec2 radialDir = normalize( centeredTexcoord );

// get it down into the 0 - PI/2 range
float range = screenWarp_range;
float scaledRadialLength = radialLength * range;
float tanScaled = tan( scaledRadialLength );

    float rescaleValue = tan( 0.5 * range );

    // If radialLength was 0.5, we want rescaled to also come out
    // as 0.5, so the edges of the rendered image are at the edges
    // of the warped image.
float rescaled = tanScaled / rescaleValue;

    vec2 warped = warpCenter + vec2( 0.5, 0.5 ) * radialDir * rescaled;

result.color = tex2D( samp0, warped );
}
Something went wrong with that request. Please try again.