@:directlyUsed@:src({
@global var camera:{ var view : Mat4; var proj : Mat4; var position : Vec3; var projFlip : Float; var projDiag : Vec3; var viewProj : Mat4; var inverseViewProj : Mat4; var zNear : Float; var zFar : Float; @var
var dir : Vec3};
@global var global:{ var time : Float; var pixelSize : Vec2; @perObject
var modelView : Mat4; @perObject
var modelViewInverse : Mat4};
@input var input:{ var position : Vec3; var normal : Vec3};
var output:{ var position : Vec4; var color : Vec4; var depth : Float; var normal : Vec3; var worldDist : Float};
var relativePosition:Vec3;
var transformedPosition:Vec3;
var pixelTransformedPosition:Vec3;
var transformedNormal:Vec3;
var projectedPosition:Vec4;
var pixelColor:Vec4;
var depth:Float;
var screenUV:Vec2;
var specPower:Float;
var specColor:Vec3;
var worldDist:Float;
@param var color:Vec4;
@range(0, 100) @param var specularPower:Float;
@range(0, 10) @param var specularAmount:Float;
@param var specularColor:Vec3;
function __init__() {
relativePosition = input.position;
transformedPosition = relativePosition * global.modelView.mat3x4();
projectedPosition = vec4(transformedPosition, 1) * camera.viewProj;
transformedNormal = (input.normal * global.modelView.mat3()).normalize();
camera.dir = (camera.position - transformedPosition).normalize();
pixelColor = color;
specPower = specularPower;
specColor = specularColor * specularAmount;
screenUV = screenToUv(projectedPosition.xy / projectedPosition.w);
depth = projectedPosition.z / projectedPosition.w;
worldDist = length(transformedPosition - camera.position) / camera.zFar;
};
function __init__fragment() {
transformedNormal = transformedNormal.normalize();
screenUV = screenToUv(projectedPosition.xy / projectedPosition.w);
depth = projectedPosition.z / projectedPosition.w;
specPower = specularPower;
specColor = specularColor * specularAmount;
};
function vertex() {
output.position = projectedPosition * vec4(1, camera.projFlip, 1, 1);
pixelTransformedPosition = transformedPosition;
};
function fragment() {
output.color = pixelColor;
output.depth = depth;
output.normal = transformedNormal;
output.worldDist = worldDist;
};
})@:build(hxsl.Macros.buildShader())@:autoBuild(hxsl.Macros.buildShader())