|
@@ -6,17 +6,12 @@ class VolumeDecal extends hxsl.Shader {
|
|
|
|
|
|
@:import BaseMesh;
|
|
|
|
|
|
- @const var isCentered : Bool;
|
|
|
@global var depthMap : Channel;
|
|
|
|
|
|
@param var scale : Vec2;
|
|
|
@param var normal : Vec3;
|
|
|
@param var tangent : Vec3;
|
|
|
-
|
|
|
- @param var min : Vec3;
|
|
|
- @param var max : Vec3;
|
|
|
- @param var maxAngle : Float;
|
|
|
-
|
|
|
+ @const var isCentered : Bool = true;
|
|
|
var calculatedUV : Vec2;
|
|
|
var transformedTangent : Vec4;
|
|
|
|
|
@@ -25,48 +20,23 @@ class VolumeDecal extends hxsl.Shader {
|
|
|
transformedTangent = vec4((tangent * global.modelView.mat3()).normalize(),1.);
|
|
|
}
|
|
|
|
|
|
- function getWorlPos( pos : Vec2 ) : Vec3{
|
|
|
- var depth = depthMap.get(screenToUv(pos)).r;
|
|
|
- var ruv = vec4( pos, depth, 1 );
|
|
|
- var wpos = ruv * camera.inverseViewProj;
|
|
|
- var result = (wpos.xyz / wpos.w);
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- function outsideBounds() : Bool {
|
|
|
- return (pixelTransformedPosition.x < min.x || pixelTransformedPosition.x > max.x ||
|
|
|
- pixelTransformedPosition.y < min.y || pixelTransformedPosition.y > max.y ||
|
|
|
- pixelTransformedPosition.z < min.z || pixelTransformedPosition.z > max.z );
|
|
|
- }
|
|
|
-
|
|
|
function fragment() {
|
|
|
-
|
|
|
var matrix = camera.inverseViewProj * global.modelViewInverse;
|
|
|
var screenPos = projectedPosition.xy / projectedPosition.w;
|
|
|
- var depth = depthMap.get(screenToUv(screenPos));
|
|
|
- var ruv = vec4( screenPos, depth, 1 );
|
|
|
+ var ruv = vec4(
|
|
|
+ screenPos,
|
|
|
+ depthMap.get(screenToUv(screenPos)),
|
|
|
+ 1
|
|
|
+ );
|
|
|
var wpos = ruv * matrix;
|
|
|
var ppos = ruv * camera.inverseViewProj;
|
|
|
-
|
|
|
- var worldPos = getWorlPos(screenPos);
|
|
|
- var ddx = worldPos - getWorlPos(screenPos + vec2(global.pixelSize.x, 0));
|
|
|
- var ddy = worldPos - getWorlPos(screenPos + vec2(0, global.pixelSize.y));
|
|
|
- var worldNormal = normalize(cross(ddy, ddx));
|
|
|
- //transformedNormal = worldNormal;
|
|
|
-
|
|
|
- var angle = acos(dot(worldNormal, normal));
|
|
|
- if( angle > maxAngle )
|
|
|
- discard;
|
|
|
-
|
|
|
pixelTransformedPosition = ppos.xyz / ppos.w;
|
|
|
calculatedUV = scale * (wpos.xy / wpos.w);
|
|
|
-
|
|
|
- if( isCentered )
|
|
|
- calculatedUV += 0.5;
|
|
|
-
|
|
|
- if( outsideBounds() )
|
|
|
+ if( isCentered ) calculatedUV += 0.5;
|
|
|
+ if( min(min(calculatedUV.x, calculatedUV.y), min(1 - calculatedUV.x, 1 - calculatedUV.y)) < 0 )
|
|
|
discard;
|
|
|
}
|
|
|
+
|
|
|
};
|
|
|
|
|
|
public function new( objectWidth : Float, objectHeight : Float ) {
|
|
@@ -74,6 +44,6 @@ class VolumeDecal extends hxsl.Shader {
|
|
|
normal.set(0, 0, 1);
|
|
|
tangent.set(1, 0, 0);
|
|
|
scale.set(1/objectWidth, 1/objectHeight);
|
|
|
- isCentered = true;
|
|
|
}
|
|
|
+
|
|
|
}
|