15 #ifdef KERNEL_SEGMENT_DOWNCHANNELS 16 __kernel
void segment_downchannels(
39 __global
const float2 *seed_point_array,
40 __global
const bool *mask_array,
41 __global
const float2 *uv_array,
42 __global
const uint *mapping_array,
43 __global
const uint *count_array,
44 __global
const uint *link_array,
45 __global uint *label_array
50 const uint global_id = get_global_id(0u)+get_global_id(1u)*get_global_size(0u);
51 __private uint idx, prev_idx, segment_label=0u,
53 __private float2 vec = seed_point_array[global_id];
58 segment_label = prev_idx;
59 atomic_xchg(&label_array[prev_idx],segment_label);
61 idx = link_array[prev_idx];
64 while (!mask_array[idx] && prev_idx!=idx) {
67 if (count_array[idx]>=segmentation_counter) {
76 atomic_xchg(&label_array[idx],segment_label);
79 idx = link_array[idx];
85 #ifdef KERNEL_SEGMENT_HILLSLOPES 109 __global
const float2 *seed_point_array,
110 __global
const bool *mask_array,
111 __global
const float2 *uv_array,
112 __global
const uint *mapping_array,
113 __global
const uint *count_array,
114 __global
const uint *link_array,
115 __global uint *label_array
120 const uint global_id = get_global_id(0u)+get_global_id(1u)*get_global_size(0u);
121 __private uint idx, hillslope_idx, n_steps=0u;
122 __private
float dl=0.0f, dt=
DT_MAX;
123 __private float2 uv1_vec, uv2_vec, dxy1_vec, dxy2_vec,
124 vec = seed_point_array[global_id], next_vec;
133 vec, &next_vec, &idx);
135 &vec, &next_vec, &n_steps, &idx))
138 if (mapping_array[idx]&IS_THINCHANNEL) {
141 atomic_xchg(&label_array[hillslope_idx],label_array[idx]);
147 #ifdef KERNEL_SUBSEGMENT_CHANNEL_EDGES 170 __global
const float2 *seed_point_array,
171 __global
const bool *mask_array,
172 __global
const float2 *uv_array,
173 __global uint *mapping_array,
174 __global
const uint *channel_label_array,
175 __global
const uint *link_array,
176 __global uint *label_array
181 const uint global_id = get_global_id(0u)+get_global_id(1u)*get_global_size(0u);
182 __private uint idx, prev_idx, left_idx, segment_label=0u, prev_x,prev_y, x,y, n_turns;
183 __private
char dx,dy, rotated_dx,rotated_dy;
184 __private float2 vec = seed_point_array[global_id];
188 segment_label = channel_label_array[prev_idx];
190 idx = link_array[prev_idx];
192 while (prev_idx!=idx) {
205 dx = (char)(x-prev_x);
206 dy = (char)(y-prev_y);
210 while (left_idx!=prev_idx && ++n_turns<=4) {
213 rotated_dx = rotated_dx/clamp((
char)abs(rotated_dx),(
char)1,(
char)2);
214 rotated_dy = rotated_dy/clamp((
char)abs(rotated_dy),(
char)1,(
char)2);
218 left_idx = (prev_x+rotated_dx) + (prev_y+rotated_dy)*
NX_PADDED;
220 left_idx = (prev_x+rotated_dx)*
NY_PADDED + (prev_y+rotated_dy);
222 if (!mask_array[left_idx] && label_array[left_idx]==segment_label) {
236 idx = link_array[idx];
238 if (!mask_array[idx] && ( ((mapping_array[prev_idx]) & IS_MAJORCONFLUENCE)
249 #ifdef KERNEL_SUBSEGMENT_FLANKS 273 __global
const float2 *seed_point_array,
274 __global
const bool *mask_array,
275 __global
const float2 *uv_array,
276 __global
const uint *mapping_array,
277 __global
const uint *count_array,
278 __global
const uint *link_array,
279 __global uint *label_array
284 const uint global_id = get_global_id(0u)+get_global_id(1u)*get_global_size(0u);
285 __private uint idx, hillslope_idx, n_steps=0u;
286 __private
float dl=0.0f, dt=
DT_MAX;
287 __private float2 uv1_vec, uv2_vec, dxy1_vec, dxy2_vec,
288 vec = seed_point_array[global_id], next_vec;
294 while (!mask_array[idx] && ((~mapping_array[idx])&
IS_LEFTFLANK)
295 && ((~mapping_array[idx])&IS_THINCHANNEL) && n_steps<(
MAX_N_STEPS-1)) {
297 vec, &next_vec, &idx);
299 &vec, &next_vec, &n_steps, &idx))
302 if (mapping_array[idx]&IS_LEFTFLANK) {
__kernel void subsegment_channel_edges(__global const float2 *seed_point_array, __global const bool *mask_array, __global const float2 *uv_array, __global uint *mapping_array, __global const uint *channel_label_array, __global const uint *link_array, __global uint *label_array)
TBD.
__kernel void subsegment_flanks(__global const float2 *seed_point_array, __global const bool *mask_array, __global const float2 *uv_array, __global const uint *mapping_array, __global const uint *count_array, __global const uint *link_array, __global uint *label_array)
TBD.
static void compute_step_vec(const float dt, const __global float2 *uv_array, float2 *dxy1_vec, float2 *dxy2_vec, float2 *uv1_vec, float2 *uv2_vec, const float2 vec, float2 *next_vec, uint *idx)
Compute a 2nd-order Runge-Kutta integration step along a streamline.
#define LEFT_FLANK_ADDITION
static uint get_array_idx(float2 vec)
Compute the array index of the padded grid pixel pointed to by a float2 grid position vector (choice ...
__kernel void segment_hillslopes(__global const float2 *seed_point_array, __global const bool *mask_array, __global const float2 *uv_array, __global const uint *mapping_array, __global const uint *count_array, __global const uint *link_array, __global uint *label_array)
TBD.
static bool segment_runge_kutta_step(float *dt, float *dl, float2 *dxy1_vec, float2 *dxy2_vec, float2 *vec, float2 *next_vec, uint *n_steps, uint *idx)
Compute a single step of 2nd-order Runge-Kutta numerical integration of a streamline given precompute...
#define SEGMENTATION_THRESHOLD
#define IS_MAJORCONFLUENCE