/*
==========================================================================================
Cg Acceleration Research
Edgar Velazquez-Armendariz (edgar [at] graphics [dot] cornell [dot] edu)
------------------------------------------------------------------------------------------
EdgeSilh.cg
Calculates which edges are part of the object silhouette
==========================================================================================
*/
// # 25 instructions, 3 R-regs, 2 H-regs
half3 main(half2 uv : WPOS,
uniform float3 eye,
uniform float crease, // Index of the first crease edge
uniform float border, // Index of the first border edge
uniform float totalCount, // Total number of edges to be tested
uniform float texLen, // Len of the texture
uniform samplerRECT sV0,
//uniform samplerRECT sV1,
uniform samplerRECT sN0,
uniform samplerRECT sN1) : COLOR
{
// For each edge, recovers its vertex and normals from floating point textures
float3 v0 = texRECT(sV0, uv).rgb;
//float3 v1 = texRECT(sV1, uv).rgb;
float3 n0 = texRECT(sN0, uv).rgb;
float3 n1 = texRECT(sN1, uv).rgb;
// Calculate the index of the current fragment given its position.
// The values of WPOS are {0.5, 1.5, 2.5, ...}, so this computes
// a linearization of the position
half2 uvAux = uv - half2(0.5, 0.5);
float index = (uvAux.x + uvAux.y*texLen);
// The result color to be written
half3 res = half3(0, 0, 0);
// Calculates the vector from the eye to V0
float3 p = eye - v0;
// I will only calculate the appropiate edges
if (index < totalCount) {
float2 dot01; // x-dot0, y-dot1
dot01.x = dot(p, n0);
dot01.y = dot(p, n1);
const float2 sign01 = sign(dot01);
// Regular and Crease edges require dot1 calculation
if (index < border) {
res = ((index < crease) ? (sign01.x != sign01.y) : // Regular edge test
(sign01.x > 0 || sign01.y > 0)).rrr; // Crease edge test
}
else {
res = (sign01.x > 0).rrr; // Border edge test
}
}
// Finally, return the color
return res;
}