9 #ifdef KERNEL_CONNECT_CHANNELS 27 __global
const float2 *seed_point_array,
28 __global
const bool *mask_array,
29 __global
const float2 *uv_array,
30 __global uint *mapping_array
35 const uint global_id = get_global_id(0u)+get_global_id(1u)*get_global_size(0u);
36 const float2 current_seed_point_vec = seed_point_array[global_id];
37 __private uint idx, prev_idx, n_steps = 0u, step=0u;
38 __private
float l_trajectory = 0.0f, dl = 0.0f, dt =
DT_MAX;
39 __private float2 next_vec, uv1_vec, uv2_vec, dxy1_vec, dxy2_vec,
40 vec = current_seed_point_vec, prev_vec = vec;
48 while (prev_idx==idx && !mask_array[idx] && n_steps!=
MAX_N_STEPS) {
50 vec, &next_vec, &idx);
51 if (!mask_array[idx]) {
53 &dxy1_vec, &dxy2_vec, &vec, &prev_vec,
54 &next_vec, &n_steps, &idx, &prev_idx,
60 while ((mapping_array[idx] &
IS_CHANNEL)==0 && !mask_array[idx]
63 vec, &next_vec, &idx);
64 if (!mask_array[idx]) {
66 &dxy1_vec, &dxy2_vec, &vec, &prev_vec,
67 &next_vec, &n_steps, &idx, &prev_idx,
77 vec = current_seed_point_vec;
80 while (!mask_array[idx] && step<n_steps-1) {
82 if (mapping_array[idx]==0u) {
95 #ifdef KERNEL_PUSH_TO_EXIT 97 #define CHECK_TAIL(nbr_vec) { \ 98 nbr_idx = get_array_idx(nbr_vec); \ 99 if ( !mask_array[nbr_idx] && (mapping_array[nbr_idx]&IS_THINCHANNEL) ) { \ 103 #define CHECK_EXIT(nbr_vec) { \ 104 nbr_idx = get_array_idx(nbr_vec); \ 105 if ( mask_array[nbr_idx] ) { \ 110 #define CHECK_E_TAIL(vec) CHECK_TAIL((float2)(vec[0]+1.0f, vec[1] )) 111 #define CHECK_NE_TAIL(vec) CHECK_TAIL((float2)(vec[0]+1.0f, vec[1]+1.0f )) 112 #define CHECK_N_TAIL(vec) CHECK_TAIL((float2)(vec[0], vec[1]+1.0f )) 113 #define CHECK_NW_TAIL(vec) CHECK_TAIL((float2)(vec[0]-1.0f, vec[1]+1.0f )) 114 #define CHECK_W_TAIL(vec) CHECK_TAIL((float2)(vec[0]-1.0f, vec[1] )) 115 #define CHECK_SW_TAIL(vec) CHECK_TAIL((float2)(vec[0]-1.0f, vec[1]-1.0f )) 116 #define CHECK_S_TAIL(vec) CHECK_TAIL((float2)(vec[0], vec[1]-1.0f )) 117 #define CHECK_SE_TAIL(vec) CHECK_TAIL((float2)(vec[0]+1.0f, vec[1]-1.0f )) 119 #define CHECK_E_EXIT(vec) CHECK_EXIT((float2)(vec[0]+1.0f, vec[1] )) 120 #define CHECK_NE_EXIT(vec) CHECK_EXIT((float2)(vec[0]+1.0f, vec[1]+1.0f )) 121 #define CHECK_N_EXIT(vec) CHECK_EXIT((float2)(vec[0], vec[1]+1.0f )) 122 #define CHECK_NW_EXIT(vec) CHECK_EXIT((float2)(vec[0]-1.0f, vec[1]+1.0f )) 123 #define CHECK_W_EXIT(vec) CHECK_EXIT((float2)(vec[0]-1.0f, vec[1] )) 124 #define CHECK_SW_EXIT(vec) CHECK_EXIT((float2)(vec[0]-1.0f, vec[1]-1.0f )) 125 #define CHECK_S_EXIT(vec) CHECK_EXIT((float2)(vec[0], vec[1]-1.0f )) 126 #define CHECK_SE_EXIT(vec) CHECK_EXIT((float2)(vec[0]+1.0f, vec[1]-1.0f )) 145 __global
const float2 *seed_point_array,
146 __global
const bool *mask_array,
147 __global
const float2 *uv_array,
148 __global uint *mapping_array
153 const uint global_id = get_global_id(0u)+get_global_id(1u)*get_global_size(0u);
154 __private uint idx, nbr_idx, i;
155 __private float2 vec = seed_point_array[global_id];
156 __private uchar tail_flag=0, exit_flag=0;
175 if (tail_flag && exit_flag) {
__kernel void push_to_exit(__global const float2 *seed_point_array, __global const bool *mask_array, __global const float2 *uv_array, __global uint *mapping_array)
Connect up dangling channels to the masked grid boundary.
#define CHECK_NE_EXIT(vec)
#define CHECK_W_TAIL(vec)
#define CHECK_SW_EXIT(vec)
#define CHECK_SE_TAIL(vec)
#define CHECK_N_TAIL(vec)
__kernel void connect_channels(__global const float2 *seed_point_array, __global const bool *mask_array, __global const float2 *uv_array, __global uint *mapping_array)
Connect up channel strands by designating intervening pixels as channel pixels.
static float2 uncompress(char2 compressed_vector)
Unsquish a byte vector back to a float vector.
#define CHECK_E_TAIL(vec)
#define CHECK_SE_EXIT(vec)
#define CHECK_S_EXIT(vec)
#define CHECK_NW_EXIT(vec)
#define CHECK_W_EXIT(vec)
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 CHECK_E_EXIT(vec)
#define CHECK_NE_TAIL(vec)
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 ...
#define CHECK_S_TAIL(vec)
#define CHECK_SW_TAIL(vec)
#define INTERCHANNEL_MAX_N_STEPS
#define CHECK_N_EXIT(vec)
#define CHECK_NW_TAIL(vec)
static bool connect_runge_kutta_step_record(float *dt, float *dl, float *l_trajectory, float2 *dxy1_vec, float2 *dxy2_vec, float2 *vec, float2 *prev_vec, float2 *next_vec, uint *n_steps, uint *idx, uint *prev_idx, __private char2 *trajectory_vec)
Compute a single step of 2nd-order Runge-Kutta numerical integration of a streamline given precompute...