107 float3 query_pt =
points_[idx];
108 if (isnan(query_pt.z))
109 return make_float4 (0.0f,0.0f,0.0f,0.0f);
115 bool west_valid = (xIdx > 1) && !isnan (
points_[idx-1].z) && std::abs (
points_[idx-1].z - query_pt.
z) < 200;
116 bool east_valid = (xIdx <
width_-1) && !isnan (
points_[idx+1].z) && std::abs (
points_[idx+1].z - query_pt.
z) < 200;
121 if (west_valid & east_valid)
123 if (west_valid & !east_valid)
125 if (!west_valid & east_valid)
127 if (!west_valid & !east_valid)
128 return make_float4 (0.0f,0.0f,0.0f,1.0f);
130 if (south_valid & north_valid)
132 if (south_valid & !north_valid)
134 if (!south_valid & north_valid)
136 if (!south_valid & !north_valid)
137 return make_float4 (0.0f,0.0f,0.0f,1.0f);
139 float3 normal = cross (horiz, vert);
141 float curvature = length (normal);
142 curvature = std::abs(horiz.z) > 0.04 | std::abs(vert.z) > 0.04 | !west_valid | !east_valid | !north_valid | !south_valid;
144 float3 mc = normalize (normal);
145 if ( dot (query_pt, mc) > 0 )
147 return make_float4 (mc.x, mc.y, mc.z, curvature);