Generated by Cython 3.2.1

Yellow lines hint at Python interaction.
Click on a line that starts with a "+" to see the C code that Cython generated for it.

Raw output: rastercyth.c

+001: # ==============================================================================
  __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_test, __pyx_t_5) < (0)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 002: # pyvale: the python validation engine
 003: # License: MIT
 004: # Copyright (C) 2025 The Computer Aided Validation Team
 005: # ==============================================================================
 006: 
 007: """
 008: NOTE: this module is a feature under developement.
 009: """
 010: 
+011: import numpy as np
  __pyx_t_1 = __Pyx_Import(__pyx_mstate_global->__pyx_n_u_numpy, 0, 0, NULL, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 11, __pyx_L1_error)
  __pyx_t_4 = __pyx_t_1;
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_np, __pyx_t_4) < (0)) __PYX_ERR(0, 11, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 012: import cython
 013: #from cython.parallel import prange, parallel, threadid
 014: from cython.cimports.libc.math import floor, ceil
+015: from pyvale.sensorsim.cameradata import CameraData
  {
    PyObject* const __pyx_imported_names[] = {__pyx_mstate_global->__pyx_n_u_CameraData};
    __pyx_t_1 = __Pyx_Import(__pyx_mstate_global->__pyx_n_u_pyvale_sensorsim_cameradata, __pyx_imported_names, 1, NULL, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error)
  }
  __pyx_t_4 = __pyx_t_1;
  __Pyx_GOTREF(__pyx_t_4);
  {
    PyObject* const __pyx_imported_names[] = {__pyx_mstate_global->__pyx_n_u_CameraData};
    __pyx_t_9 = 0; {
      __pyx_t_5 = __Pyx_ImportFrom(__pyx_t_4, __pyx_imported_names[__pyx_t_9]); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 15, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_imported_names[__pyx_t_9], __pyx_t_5) < (0)) __PYX_ERR(0, 15, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    }
  }
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 016: 
 017: # NOTE: This module is a feature under developement.
 018: 
+019: @cython.nogil
static CYTHON_INLINE size_t __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_range_len_double(double __pyx_v_start, double __pyx_v_stop, double __pyx_v_step) {
  size_t __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 020: @cython.cfunc # python+C or cython.cfunc for C only
 021: @cython.boundscheck(False) # Turn off array bounds checking
 022: @cython.wraparound(False)  # Turn off negative indexing
 023: @cython.cdivision(True)    # Turn off divide by zero check
 024: @cython.inline
 025: @cython.exceptval(check=False)
 026: def range_len_double(start: cython.double,
 027:                      stop: cython.double,
 028:                      step: cython.double) -> cython.size_t:
+029:     return int(ceil((stop - start) / step))
  __pyx_r = ((size_t)ceil(((__pyx_v_stop - __pyx_v_start) / __pyx_v_step)));
  goto __pyx_L0;
 030: 
 031: 
+032: @cython.nogil
static CYTHON_INLINE __Pyx_memviewslice __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_vec_range_int(int __pyx_v_start, int __pyx_v_stop, int __pyx_v_step, __Pyx_memviewslice __pyx_v_vec_buffer) {
  size_t __pyx_v_num_vals;
  size_t __pyx_v_ii;
  __Pyx_memviewslice __pyx_r = { 0, 0, { 0 }, { 0 }, { 0 } };
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_7, 1);
  __pyx_r.data = NULL;
  __pyx_r.memview = NULL;
  __Pyx_AddTraceback("pyvale.sensorsim.cython.rastercyth.vec_range_int", __pyx_clineno, __pyx_lineno, __pyx_filename);
  goto __pyx_L2;
  __pyx_L0:;
  if (unlikely(!__pyx_r.memview)) {
    PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
    PyErr_SetString(PyExc_TypeError, "Memoryview return value is not initialized");
    __Pyx_PyGILState_Release(__pyx_gilstate_save);
  }
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L2:;
  return __pyx_r;
}
 033: @cython.cfunc # python+C or cython.cfunc for C only
 034: @cython.boundscheck(False) # Turn off array bounds checking
 035: @cython.wraparound(False)  # Turn off negative indexing
 036: @cython.cdivision(True)    # Turn off divide by zero check
 037: @cython.inline
 038: @cython.exceptval(check=False)
 039: def vec_range_int(start: cython.int,
 040:                   stop: cython.int,
 041:                   step: cython.int,
 042:                   vec_buffer: cython.long[:]) -> cython.long[:]:
 043: 
+044:     num_vals: cython.size_t = int(ceil((stop - start) / step))
  __pyx_v_num_vals = ((size_t)ceil(((__pyx_v_stop - __pyx_v_start) / __pyx_v_step)));
 045: 
+046:     vec_buffer[0] = start
  __pyx_t_1 = 0;
  *((long *) ( /* dim=0 */ (__pyx_v_vec_buffer.data + __pyx_t_1 * __pyx_v_vec_buffer.strides[0]) )) = __pyx_v_start;
 047:     ii: cython.size_t
+048:     for ii in range(1,num_vals):
  __pyx_t_2 = __pyx_v_num_vals;
  __pyx_t_3 = __pyx_t_2;
  for (__pyx_t_4 = 1; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
    __pyx_v_ii = __pyx_t_4;
+049:         vec_buffer[ii] = vec_buffer[ii-1] + step
    __pyx_t_5 = (__pyx_v_ii - 1);
    __pyx_t_6 = __pyx_v_ii;
    *((long *) ( /* dim=0 */ (__pyx_v_vec_buffer.data + __pyx_t_6 * __pyx_v_vec_buffer.strides[0]) )) = ((*((long *) ( /* dim=0 */ (__pyx_v_vec_buffer.data + __pyx_t_5 * __pyx_v_vec_buffer.strides[0]) ))) + __pyx_v_step);
  }
 050: 
+051:     return vec_buffer[0:num_vals]
  __pyx_t_7.data = __pyx_v_vec_buffer.data;
  __pyx_t_7.memview = __pyx_v_vec_buffer.memview;
  __PYX_INC_MEMVIEW(&__pyx_t_7, 0);
  __pyx_t_8 = -1;
  if (unlikely(__pyx_memoryview_slice_memviewslice(
    &__pyx_t_7,
    __pyx_v_vec_buffer.shape[0], __pyx_v_vec_buffer.strides[0], __pyx_v_vec_buffer.suboffsets[0],
    0,
    0,
    &__pyx_t_8,
    0,
    __pyx_v_num_vals,
    0,
    1,
    1,
    0,
    1) < 0))
{
    __PYX_ERR(0, 51, __pyx_L1_error)
}

__pyx_r = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
  goto __pyx_L0;
 052: 
 053: 
+054: @cython.nogil
static CYTHON_INLINE double __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_vec_max_double(__Pyx_memviewslice __pyx_v_vals) {
  size_t __pyx_v_num_vals;
  size_t __pyx_v_ii;
  double __pyx_v_max_val;
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 055: @cython.cfunc # python+C or cython.cfunc for C only
 056: @cython.boundscheck(False) # Turn off array bounds checking
 057: @cython.wraparound(False)  # Turn off negative indexing
 058: @cython.cdivision(True)    # Turn off divide by zero check
 059: @cython.inline
 060: @cython.exceptval(check=False)
 061: def vec_max_double(vals: cython.double[:]) -> cython.double:
 062: 
+063:     num_vals: cython.size_t = vals.shape[0]
  __pyx_v_num_vals = (__pyx_v_vals.shape[0]);
 064: 
+065:     ii: cython.size_t = 0
  __pyx_v_ii = 0;
+066:     max_val: cython.double = vals[ii]
  __pyx_t_1 = __pyx_v_ii;
  __pyx_v_max_val = (*((double *) ( /* dim=0 */ (__pyx_v_vals.data + __pyx_t_1 * __pyx_v_vals.strides[0]) )));
 067: 
+068:     for ii in range(1,num_vals):
  __pyx_t_1 = __pyx_v_num_vals;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 1; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_ii = __pyx_t_3;
+069:         if vals[ii] > max_val:
    __pyx_t_4 = __pyx_v_ii;
    __pyx_t_5 = ((*((double *) ( /* dim=0 */ (__pyx_v_vals.data + __pyx_t_4 * __pyx_v_vals.strides[0]) ))) > __pyx_v_max_val);
    if (__pyx_t_5) {
/* … */
    }
  }
+070:             max_val = vals[ii]
      __pyx_t_4 = __pyx_v_ii;
      __pyx_v_max_val = (*((double *) ( /* dim=0 */ (__pyx_v_vals.data + __pyx_t_4 * __pyx_v_vals.strides[0]) )));
 071: 
+072:     return max_val
  __pyx_r = __pyx_v_max_val;
  goto __pyx_L0;
 073: 
 074: 
+075: @cython.nogil
static CYTHON_INLINE double __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_vec_min_double(__Pyx_memviewslice __pyx_v_vals) {
  size_t __pyx_v_num_vals;
  size_t __pyx_v_ii;
  double __pyx_v_min_val;
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 076: @cython.cfunc # python+C or cython.cfunc for C only
 077: @cython.boundscheck(False) # Turn off array bounds checking
 078: @cython.wraparound(False)  # Turn off negative indexing
 079: @cython.cdivision(True)    # Turn off divide by zero check
 080: @cython.inline
 081: @cython.exceptval(check=False)
 082: def vec_min_double(vals: cython.double[:]) -> cython.double:
 083: 
+084:     num_vals: cython.size_t = vals.shape[0]
  __pyx_v_num_vals = (__pyx_v_vals.shape[0]);
 085: 
+086:     ii: cython.size_t = 0
  __pyx_v_ii = 0;
+087:     min_val: cython.double = vals[ii]
  __pyx_t_1 = __pyx_v_ii;
  __pyx_v_min_val = (*((double *) ( /* dim=0 */ (__pyx_v_vals.data + __pyx_t_1 * __pyx_v_vals.strides[0]) )));
 088: 
+089:     for ii in range(1,num_vals):
  __pyx_t_1 = __pyx_v_num_vals;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 1; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_ii = __pyx_t_3;
+090:         if vals[ii] < min_val:
    __pyx_t_4 = __pyx_v_ii;
    __pyx_t_5 = ((*((double *) ( /* dim=0 */ (__pyx_v_vals.data + __pyx_t_4 * __pyx_v_vals.strides[0]) ))) < __pyx_v_min_val);
    if (__pyx_t_5) {
/* … */
    }
  }
+091:             min_val = vals[ii]
      __pyx_t_4 = __pyx_v_ii;
      __pyx_v_min_val = (*((double *) ( /* dim=0 */ (__pyx_v_vals.data + __pyx_t_4 * __pyx_v_vals.strides[0]) )));
 092: 
+093:     return min_val
  __pyx_r = __pyx_v_min_val;
  goto __pyx_L0;
 094: 
 095: 
+096: @cython.nogil
static CYTHON_INLINE double __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_vec_dot_double(__Pyx_memviewslice __pyx_v_vec0, __Pyx_memviewslice __pyx_v_vec1) {
  size_t __pyx_v_vec0_len;
  size_t __pyx_v_vec1_len;
  size_t __pyx_v_ii;
  double __pyx_v_dot;
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 097: @cython.cfunc # python+C or cython.cfunc for C only
 098: @cython.boundscheck(False) # Turn off array bounds checking
 099: @cython.wraparound(False)  # Turn off negative indexing
 100: @cython.cdivision(True)    # Turn off divide by zero check
 101: @cython.inline
 102: @cython.exceptval(check=False)
 103: def vec_dot_double(vec0: cython.double[:], vec1: cython.double[:]
 104:                    ) -> cython.double:
+105:     vec0_len: cython.size_t = vec0.shape[0]
  __pyx_v_vec0_len = (__pyx_v_vec0.shape[0]);
+106:     vec1_len: cython.size_t = vec1.shape[0]
  __pyx_v_vec1_len = (__pyx_v_vec1.shape[0]);
+107:     if vec0_len != vec1_len:
  __pyx_t_1 = (__pyx_v_vec0_len != __pyx_v_vec1_len);
  if (__pyx_t_1) {
/* … */
  }
+108:         return 0.0
    __pyx_r = 0.0;
    goto __pyx_L0;
 109: 
+110:     ii: cython.size_t = 0
  __pyx_v_ii = 0;
+111:     dot: cython.double = 0.0
  __pyx_v_dot = 0.0;
+112:     for ii in range(vec0_len):
  __pyx_t_2 = __pyx_v_vec0_len;
  __pyx_t_3 = __pyx_t_2;
  for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
    __pyx_v_ii = __pyx_t_4;
+113:         dot += vec0[ii]*vec1[ii]
    __pyx_t_5 = __pyx_v_ii;
    __pyx_t_6 = __pyx_v_ii;
    __pyx_v_dot = (__pyx_v_dot + ((*((double *) ( /* dim=0 */ (__pyx_v_vec0.data + __pyx_t_5 * __pyx_v_vec0.strides[0]) ))) * (*((double *) ( /* dim=0 */ (__pyx_v_vec1.data + __pyx_t_6 * __pyx_v_vec1.strides[0]) )))));
  }
 114: 
+115:     return dot
  __pyx_r = __pyx_v_dot;
  goto __pyx_L0;
 116: 
 117: 
+118: @cython.nogil
static CYTHON_INLINE int __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_bound_index_min(double __pyx_v_min_val) {
  int __pyx_v_min_ind;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 119: @cython.cfunc # python+C or cython.cfunc for C only
 120: @cython.boundscheck(False) # Turn off array bounds checking
 121: @cython.wraparound(False)  # Turn off negative indexing
 122: @cython.cdivision(True)    # Turn off divide by zero check
 123: @cython.inline
 124: @cython.exceptval(check=False)
 125: def bound_index_min(min_val: cython.double) -> cython.int:
+126:     min_ind: cython.int = int(floor(min_val))
  __pyx_v_min_ind = ((int)floor(__pyx_v_min_val));
+127:     if min_ind < 0:
  __pyx_t_1 = (__pyx_v_min_ind < 0);
  if (__pyx_t_1) {
/* … */
  }
+128:         min_ind = 0
    __pyx_v_min_ind = 0;
+129:     return min_ind
  __pyx_r = __pyx_v_min_ind;
  goto __pyx_L0;
 130: 
 131: 
+132: @cython.nogil
static CYTHON_INLINE int __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_bound_index_max(double __pyx_v_max_val, int __pyx_v_num_pixels) {
  int __pyx_v_max_ind;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 133: @cython.cfunc # python+C or cython.cfunc for C only
 134: @cython.boundscheck(False) # Turn off array bounds checking
 135: @cython.wraparound(False)  # Turn off negative indexing
 136: @cython.cdivision(True)    # Turn off divide by zero check
 137: @cython.inline
 138: @cython.exceptval(check=False)
 139: def bound_index_max(max_val: cython.double,
 140:                     num_pixels: cython.int) -> cython.int:
+141:     max_ind: cython.int = int(ceil(max_val))
  __pyx_v_max_ind = ((int)ceil(__pyx_v_max_val));
+142:     if max_ind > (num_pixels-1):
  __pyx_t_1 = (__pyx_v_max_ind > (__pyx_v_num_pixels - 1));
  if (__pyx_t_1) {
/* … */
  }
+143:         max_ind = (num_pixels-1)
    __pyx_v_max_ind = (__pyx_v_num_pixels - 1);
+144:     return max_ind
  __pyx_r = __pyx_v_max_ind;
  goto __pyx_L0;
 145: 
 146: 
+147: @cython.nogil
static CYTHON_INLINE __Pyx_memviewslice __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_mult_mat44_by_vec3(__Pyx_memviewslice __pyx_v_mat44, __Pyx_memviewslice __pyx_v_vec3_in, __Pyx_memviewslice __pyx_v_vec3_out) {
  __Pyx_memviewslice __pyx_r = { 0, 0, { 0 }, { 0 }, { 0 } };
/* … */
  /* function exit code */
  __pyx_L0:;
  if (unlikely(!__pyx_r.memview)) {
    PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
    PyErr_SetString(PyExc_TypeError, "Memoryview return value is not initialized");
    __Pyx_PyGILState_Release(__pyx_gilstate_save);
  }
  return __pyx_r;
}
 148: @cython.cfunc # python+C or cython.cfunc for C only
 149: @cython.boundscheck(False) # Turn off array bounds checking
 150: @cython.wraparound(False)  # Turn off negative indexing
 151: @cython.cdivision(True)    # Turn off divide by zero check
 152: @cython.inline
 153: @cython.exceptval(check=False)
 154: def mult_mat44_by_vec3(mat44: cython.double[:,:], vec3_in: cython.double[:],
 155:                        vec3_out: cython.double[:]) -> cython.double[:]:
 156: 
+157:     vec3_out[0] = (mat44[0,0]*vec3_in[0]
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_3 = 0;
/* … */
  __pyx_t_12 = 0;
  *((double *) ( /* dim=0 */ (__pyx_v_vec3_out.data + __pyx_t_12 * __pyx_v_vec3_out.strides[0]) )) = (((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mat44.data + __pyx_t_1 * __pyx_v_mat44.strides[0]) ) + __pyx_t_2 * __pyx_v_mat44.strides[1]) ))) * (*((double *) ( /* dim=0 */ (__pyx_v_vec3_in.data + __pyx_t_3 * __pyx_v_vec3_in.strides[0]) )))) + ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mat44.data + __pyx_t_4 * __pyx_v_mat44.strides[0]) ) + __pyx_t_5 * __pyx_v_mat44.strides[1]) ))) * (*((double *) ( /* dim=0 */ (__pyx_v_vec3_in.data + __pyx_t_6 * __pyx_v_vec3_in.strides[0]) ))))) + ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mat44.data + __pyx_t_7 * __pyx_v_mat44.strides[0]) ) + __pyx_t_8 * __pyx_v_mat44.strides[1]) ))) * (*((double *) ( /* dim=0 */ (__pyx_v_vec3_in.data + __pyx_t_9 * __pyx_v_vec3_in.strides[0]) ))))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mat44.data + __pyx_t_10 * __pyx_v_mat44.strides[0]) ) + __pyx_t_11 * __pyx_v_mat44.strides[1]) ))));
+158:                       + mat44[0,1]*vec3_in[1]
  __pyx_t_4 = 0;
  __pyx_t_5 = 1;
  __pyx_t_6 = 1;
+159:                       + mat44[0,2]*vec3_in[2]
  __pyx_t_7 = 0;
  __pyx_t_8 = 2;
  __pyx_t_9 = 2;
+160:                       + mat44[0,3])
  __pyx_t_10 = 0;
  __pyx_t_11 = 3;
+161:     vec3_out[1] = (mat44[1,0]*vec3_in[0]
  __pyx_t_11 = 1;
  __pyx_t_10 = 0;
  __pyx_t_9 = 0;
/* … */
  __pyx_t_12 = 1;
  *((double *) ( /* dim=0 */ (__pyx_v_vec3_out.data + __pyx_t_12 * __pyx_v_vec3_out.strides[0]) )) = (((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mat44.data + __pyx_t_11 * __pyx_v_mat44.strides[0]) ) + __pyx_t_10 * __pyx_v_mat44.strides[1]) ))) * (*((double *) ( /* dim=0 */ (__pyx_v_vec3_in.data + __pyx_t_9 * __pyx_v_vec3_in.strides[0]) )))) + ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mat44.data + __pyx_t_8 * __pyx_v_mat44.strides[0]) ) + __pyx_t_7 * __pyx_v_mat44.strides[1]) ))) * (*((double *) ( /* dim=0 */ (__pyx_v_vec3_in.data + __pyx_t_6 * __pyx_v_vec3_in.strides[0]) ))))) + ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mat44.data + __pyx_t_5 * __pyx_v_mat44.strides[0]) ) + __pyx_t_4 * __pyx_v_mat44.strides[1]) ))) * (*((double *) ( /* dim=0 */ (__pyx_v_vec3_in.data + __pyx_t_3 * __pyx_v_vec3_in.strides[0]) ))))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mat44.data + __pyx_t_2 * __pyx_v_mat44.strides[0]) ) + __pyx_t_1 * __pyx_v_mat44.strides[1]) ))));
+162:                       + mat44[1,1]*vec3_in[1]
  __pyx_t_8 = 1;
  __pyx_t_7 = 1;
  __pyx_t_6 = 1;
+163:                       + mat44[1,2]*vec3_in[2]
  __pyx_t_5 = 1;
  __pyx_t_4 = 2;
  __pyx_t_3 = 2;
+164:                       + mat44[1,3])
  __pyx_t_2 = 1;
  __pyx_t_1 = 3;
+165:     vec3_out[2] = (mat44[2,0]*vec3_in[0]
  __pyx_t_1 = 2;
  __pyx_t_2 = 0;
  __pyx_t_3 = 0;
/* … */
  __pyx_t_12 = 2;
  *((double *) ( /* dim=0 */ (__pyx_v_vec3_out.data + __pyx_t_12 * __pyx_v_vec3_out.strides[0]) )) = (((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mat44.data + __pyx_t_1 * __pyx_v_mat44.strides[0]) ) + __pyx_t_2 * __pyx_v_mat44.strides[1]) ))) * (*((double *) ( /* dim=0 */ (__pyx_v_vec3_in.data + __pyx_t_3 * __pyx_v_vec3_in.strides[0]) )))) + ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mat44.data + __pyx_t_4 * __pyx_v_mat44.strides[0]) ) + __pyx_t_5 * __pyx_v_mat44.strides[1]) ))) * (*((double *) ( /* dim=0 */ (__pyx_v_vec3_in.data + __pyx_t_6 * __pyx_v_vec3_in.strides[0]) ))))) + ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mat44.data + __pyx_t_7 * __pyx_v_mat44.strides[0]) ) + __pyx_t_8 * __pyx_v_mat44.strides[1]) ))) * (*((double *) ( /* dim=0 */ (__pyx_v_vec3_in.data + __pyx_t_9 * __pyx_v_vec3_in.strides[0]) ))))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mat44.data + __pyx_t_10 * __pyx_v_mat44.strides[0]) ) + __pyx_t_11 * __pyx_v_mat44.strides[1]) ))));
+166:                       + mat44[2,1]*vec3_in[1]
  __pyx_t_4 = 2;
  __pyx_t_5 = 1;
  __pyx_t_6 = 1;
+167:                       + mat44[2,2]*vec3_in[2]
  __pyx_t_7 = 2;
  __pyx_t_8 = 2;
  __pyx_t_9 = 2;
+168:                       + mat44[2,3])
  __pyx_t_10 = 2;
  __pyx_t_11 = 3;
+169:     vec3_out[3] = (mat44[3,0]*vec3_in[0]
  __pyx_t_11 = 3;
  __pyx_t_10 = 0;
  __pyx_t_9 = 0;
/* … */
  __pyx_t_12 = 3;
  *((double *) ( /* dim=0 */ (__pyx_v_vec3_out.data + __pyx_t_12 * __pyx_v_vec3_out.strides[0]) )) = (((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mat44.data + __pyx_t_11 * __pyx_v_mat44.strides[0]) ) + __pyx_t_10 * __pyx_v_mat44.strides[1]) ))) * (*((double *) ( /* dim=0 */ (__pyx_v_vec3_in.data + __pyx_t_9 * __pyx_v_vec3_in.strides[0]) )))) + ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mat44.data + __pyx_t_8 * __pyx_v_mat44.strides[0]) ) + __pyx_t_7 * __pyx_v_mat44.strides[1]) ))) * (*((double *) ( /* dim=0 */ (__pyx_v_vec3_in.data + __pyx_t_6 * __pyx_v_vec3_in.strides[0]) ))))) + ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mat44.data + __pyx_t_5 * __pyx_v_mat44.strides[0]) ) + __pyx_t_4 * __pyx_v_mat44.strides[1]) ))) * (*((double *) ( /* dim=0 */ (__pyx_v_vec3_in.data + __pyx_t_3 * __pyx_v_vec3_in.strides[0]) ))))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mat44.data + __pyx_t_2 * __pyx_v_mat44.strides[0]) ) + __pyx_t_1 * __pyx_v_mat44.strides[1]) ))));
+170:                       + mat44[3,1]*vec3_in[1]
  __pyx_t_8 = 3;
  __pyx_t_7 = 1;
  __pyx_t_6 = 1;
+171:                       + mat44[3,2]*vec3_in[2]
  __pyx_t_5 = 3;
  __pyx_t_4 = 2;
  __pyx_t_3 = 2;
+172:                       + mat44[3,3])
  __pyx_t_2 = 3;
  __pyx_t_1 = 3;
 173: 
+174:     return vec3_out
  __PYX_INC_MEMVIEW(&__pyx_v_vec3_out, 0);
  __pyx_r = __pyx_v_vec3_out;
  goto __pyx_L0;
 175: 
 176: 
+177: @cython.nogil
static __Pyx_memviewslice __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_world_to_raster_coords(__Pyx_memviewslice __pyx_v_coords_world, __Pyx_memviewslice __pyx_v_world_to_cam_mat, double __pyx_v_image_dist, __Pyx_memviewslice __pyx_v_image_dims, __Pyx_memviewslice __pyx_v_num_pixels, __Pyx_memviewslice __pyx_v_coords_raster) {
  size_t __pyx_v_xx;
  size_t __pyx_v_yy;
  size_t __pyx_v_zz;
  size_t __pyx_v_ww;
  __Pyx_memviewslice __pyx_r = { 0, 0, { 0 }, { 0 }, { 0 } };
  __PYX_INC_MEMVIEW(&__pyx_v_coords_raster, 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_1, 1);
  __pyx_r.data = NULL;
  __pyx_r.memview = NULL;
  __Pyx_AddTraceback("pyvale.sensorsim.cython.rastercyth.world_to_raster_coords", __pyx_clineno, __pyx_lineno, __pyx_filename);
  goto __pyx_L2;
  __pyx_L0:;
  if (unlikely(!__pyx_r.memview)) {
    PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
    PyErr_SetString(PyExc_TypeError, "Memoryview return value is not initialized");
    __Pyx_PyGILState_Release(__pyx_gilstate_save);
  }
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L2:;
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_coords_raster, 0);
  return __pyx_r;
}
 178: @cython.cfunc # python+C or cython.cfunc for C only
 179: @cython.boundscheck(False) # Turn off array bounds checking
 180: @cython.wraparound(False)  # Turn off negative indexing
 181: @cython.cdivision(True)    # Turn off divide by zero check
 182: @cython.exceptval(check=False)
 183: def world_to_raster_coords(coords_world: cython.double[:],
 184:                            world_to_cam_mat: cython.double[:,:],
 185:                            image_dist: cython.double,
 186:                            image_dims: cython.double[:],
 187:                            num_pixels: cython.int[:],
 188:                            coords_raster: cython.double[:]
 189:                            ) -> cython.double[:]:
+190:     xx: cython.size_t = 0
  __pyx_v_xx = 0;
+191:     yy: cython.size_t = 1
  __pyx_v_yy = 1;
+192:     zz: cython.size_t = 2
  __pyx_v_zz = 2;
+193:     ww: cython.size_t = 3
  __pyx_v_ww = 3;
 194: 
+195:     coords_raster = mult_mat44_by_vec3(world_to_cam_mat,
  __pyx_t_1 = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_mult_mat44_by_vec3(__pyx_v_world_to_cam_mat, __pyx_v_coords_world, __pyx_v_coords_raster); if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 195, __pyx_L1_error)
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_coords_raster, 0);
  __pyx_v_coords_raster = __pyx_t_1;
  __pyx_t_1.memview = NULL;
  __pyx_t_1.data = NULL;
 196:                                        coords_world,
 197:                                        coords_raster)
 198: 
+199:     coords_raster[xx] = coords_raster[xx] / coords_raster[ww]
  __pyx_t_2 = __pyx_v_xx;
  __pyx_t_3 = __pyx_v_ww;
  __pyx_t_4 = __pyx_v_xx;
  *((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_4 * __pyx_v_coords_raster.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_2 * __pyx_v_coords_raster.strides[0]) ))) / (*((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_3 * __pyx_v_coords_raster.strides[0]) ))));
+200:     coords_raster[yy] = coords_raster[yy] / coords_raster[ww]
  __pyx_t_3 = __pyx_v_yy;
  __pyx_t_2 = __pyx_v_ww;
  __pyx_t_4 = __pyx_v_yy;
  *((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_4 * __pyx_v_coords_raster.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_3 * __pyx_v_coords_raster.strides[0]) ))) / (*((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_2 * __pyx_v_coords_raster.strides[0]) ))));
+201:     coords_raster[zz] = coords_raster[zz] / coords_raster[ww]
  __pyx_t_2 = __pyx_v_zz;
  __pyx_t_3 = __pyx_v_ww;
  __pyx_t_4 = __pyx_v_zz;
  *((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_4 * __pyx_v_coords_raster.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_2 * __pyx_v_coords_raster.strides[0]) ))) / (*((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_3 * __pyx_v_coords_raster.strides[0]) ))));
 202: 
+203:     coords_raster[xx] = (image_dist * coords_raster[xx]
  __pyx_t_3 = __pyx_v_xx;
/* … */
  __pyx_t_4 = __pyx_v_xx;
  *((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_4 * __pyx_v_coords_raster.strides[0]) )) = ((__pyx_v_image_dist * (*((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_3 * __pyx_v_coords_raster.strides[0]) )))) / (-(*((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_2 * __pyx_v_coords_raster.strides[0]) )))));
+204:                         / -coords_raster[zz])
  __pyx_t_2 = __pyx_v_zz;
+205:     coords_raster[yy] = (image_dist * coords_raster[yy]
  __pyx_t_2 = __pyx_v_yy;
/* … */
  __pyx_t_4 = __pyx_v_yy;
  *((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_4 * __pyx_v_coords_raster.strides[0]) )) = ((__pyx_v_image_dist * (*((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_2 * __pyx_v_coords_raster.strides[0]) )))) / (-(*((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_3 * __pyx_v_coords_raster.strides[0]) )))));
+206:                         / -coords_raster[zz])
  __pyx_t_3 = __pyx_v_zz;
 207: 
+208:     coords_raster[xx] = 2*coords_raster[xx] / image_dims[xx]
  __pyx_t_3 = __pyx_v_xx;
  __pyx_t_2 = __pyx_v_xx;
  __pyx_t_4 = __pyx_v_xx;
  *((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_4 * __pyx_v_coords_raster.strides[0]) )) = ((2.0 * (*((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_3 * __pyx_v_coords_raster.strides[0]) )))) / (*((double *) ( /* dim=0 */ (__pyx_v_image_dims.data + __pyx_t_2 * __pyx_v_image_dims.strides[0]) ))));
+209:     coords_raster[yy] = 2*coords_raster[yy] / image_dims[yy]
  __pyx_t_2 = __pyx_v_yy;
  __pyx_t_3 = __pyx_v_yy;
  __pyx_t_4 = __pyx_v_yy;
  *((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_4 * __pyx_v_coords_raster.strides[0]) )) = ((2.0 * (*((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_2 * __pyx_v_coords_raster.strides[0]) )))) / (*((double *) ( /* dim=0 */ (__pyx_v_image_dims.data + __pyx_t_3 * __pyx_v_image_dims.strides[0]) ))));
 210: 
+211:     coords_raster[xx] = (coords_raster[xx] + 1)/2 * num_pixels[xx]
  __pyx_t_3 = __pyx_v_xx;
  __pyx_t_2 = __pyx_v_xx;
  __pyx_t_4 = __pyx_v_xx;
  *((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_4 * __pyx_v_coords_raster.strides[0]) )) = ((((*((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_3 * __pyx_v_coords_raster.strides[0]) ))) + 1.0) / 2.0) * (*((int *) ( /* dim=0 */ (__pyx_v_num_pixels.data + __pyx_t_2 * __pyx_v_num_pixels.strides[0]) ))));
+212:     coords_raster[yy] = (1-coords_raster[yy])/2 * num_pixels[yy]
  __pyx_t_2 = __pyx_v_yy;
  __pyx_t_3 = __pyx_v_yy;
  __pyx_t_4 = __pyx_v_yy;
  *((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_4 * __pyx_v_coords_raster.strides[0]) )) = (((1.0 - (*((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_2 * __pyx_v_coords_raster.strides[0]) )))) / 2.0) * (*((int *) ( /* dim=0 */ (__pyx_v_num_pixels.data + __pyx_t_3 * __pyx_v_num_pixels.strides[0]) ))));
+213:     coords_raster[zz] = -coords_raster[zz]
  __pyx_t_3 = __pyx_v_zz;
  __pyx_t_2 = __pyx_v_zz;
  *((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_2 * __pyx_v_coords_raster.strides[0]) )) = (-(*((double *) ( /* dim=0 */ (__pyx_v_coords_raster.data + __pyx_t_3 * __pyx_v_coords_raster.strides[0]) ))));
 214: 
+215:     return coords_raster
  __PYX_INC_MEMVIEW(&__pyx_v_coords_raster, 0);
  __pyx_r = __pyx_v_coords_raster;
  goto __pyx_L0;
 216: 
+217: @cython.cfunc
static CYTHON_INLINE double __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_edge_function(__Pyx_memviewslice __pyx_v_vert_0, __Pyx_memviewslice __pyx_v_vert_1, __Pyx_memviewslice __pyx_v_vert_2) {
  double __pyx_v_edge_fun;
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 218: @cython.nogil
 219: @cython.boundscheck(False)
 220: @cython.wraparound(False)
 221: @cython.inline
 222: @cython.exceptval(check=False)
 223: def edge_function(vert_0: cython.double[:],
 224:                   vert_1: cython.double[:],
 225:                   vert_2: cython.double[:]) -> cython.double:
 226:     edge_fun: cython.double = (
+227:         (vert_2[0] - vert_0[0]) * (vert_1[1] - vert_0[1])
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_3 = 1;
  __pyx_t_4 = 1;
+228:         - (vert_2[1] - vert_0[1]) * (vert_1[0] - vert_0[0]))
  __pyx_t_5 = 1;
  __pyx_t_6 = 1;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_edge_fun = ((((*((double *) ( /* dim=0 */ (__pyx_v_vert_2.data + __pyx_t_1 * __pyx_v_vert_2.strides[0]) ))) - (*((double *) ( /* dim=0 */ (__pyx_v_vert_0.data + __pyx_t_2 * __pyx_v_vert_0.strides[0]) )))) * ((*((double *) ( /* dim=0 */ (__pyx_v_vert_1.data + __pyx_t_3 * __pyx_v_vert_1.strides[0]) ))) - (*((double *) ( /* dim=0 */ (__pyx_v_vert_0.data + __pyx_t_4 * __pyx_v_vert_0.strides[0]) ))))) - (((*((double *) ( /* dim=0 */ (__pyx_v_vert_2.data + __pyx_t_5 * __pyx_v_vert_2.strides[0]) ))) - (*((double *) ( /* dim=0 */ (__pyx_v_vert_0.data + __pyx_t_6 * __pyx_v_vert_0.strides[0]) )))) * ((*((double *) ( /* dim=0 */ (__pyx_v_vert_1.data + __pyx_t_7 * __pyx_v_vert_1.strides[0]) ))) - (*((double *) ( /* dim=0 */ (__pyx_v_vert_0.data + __pyx_t_8 * __pyx_v_vert_0.strides[0]) ))))));
+229:     return edge_fun
  __pyx_r = __pyx_v_edge_fun;
  goto __pyx_L0;
 230: 
 231: 
+232: @cython.cfunc
static CYTHON_INLINE double __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_edge_function_pt(__Pyx_memviewslice __pyx_v_vert_0, __Pyx_memviewslice __pyx_v_vert_1, double __pyx_v_vert_2_x, double __pyx_v_vert_2_y) {
  double __pyx_v_edge_fun;
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 233: @cython.nogil
 234: @cython.boundscheck(False)
 235: @cython.wraparound(False)
 236: @cython.inline
 237: @cython.exceptval(check=False)
 238: def edge_function_pt(vert_0: cython.double[:],
 239:                      vert_1: cython.double[:],
 240:                      vert_2_x: cython.double,
 241:                      vert_2_y: cython.double) -> cython.double:
 242:     edge_fun: cython.double = (
+243:         (vert_2_x - vert_0[0]) * (vert_1[1] - vert_0[1])
  __pyx_t_1 = 0;
  __pyx_t_2 = 1;
  __pyx_t_3 = 1;
+244:         - (vert_2_y - vert_0[1]) * (vert_1[0] - vert_0[0]))
  __pyx_t_4 = 1;
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_v_edge_fun = (((__pyx_v_vert_2_x - (*((double *) ( /* dim=0 */ (__pyx_v_vert_0.data + __pyx_t_1 * __pyx_v_vert_0.strides[0]) )))) * ((*((double *) ( /* dim=0 */ (__pyx_v_vert_1.data + __pyx_t_2 * __pyx_v_vert_1.strides[0]) ))) - (*((double *) ( /* dim=0 */ (__pyx_v_vert_0.data + __pyx_t_3 * __pyx_v_vert_0.strides[0]) ))))) - ((__pyx_v_vert_2_y - (*((double *) ( /* dim=0 */ (__pyx_v_vert_0.data + __pyx_t_4 * __pyx_v_vert_0.strides[0]) )))) * ((*((double *) ( /* dim=0 */ (__pyx_v_vert_1.data + __pyx_t_5 * __pyx_v_vert_1.strides[0]) ))) - (*((double *) ( /* dim=0 */ (__pyx_v_vert_0.data + __pyx_t_6 * __pyx_v_vert_0.strides[0]) ))))));
+245:     return edge_fun
  __pyx_r = __pyx_v_edge_fun;
  goto __pyx_L0;
 246: 
 247: 
+248: @cython.ccall
static PyObject *__pyx_pw_6pyvale_9sensorsim_6cython_10rastercyth_1average_image(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static __Pyx_memviewslice __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_average_image(__Pyx_memviewslice __pyx_v_image_subpx, int __pyx_v_sub_samp, CYTHON_UNUSED int __pyx_skip_dispatch) {
  size_t __pyx_v_px_num_y;
  size_t __pyx_v_px_num_x;
  PyObject *__pyx_v_image_buff_avg_np = NULL;
  __Pyx_memviewslice __pyx_v_image_buff_avg = { 0, 0, { 0 }, { 0 }, { 0 } };
  size_t __pyx_v_num_subpx_y;
  size_t __pyx_v_num_subpx_x;
  double __pyx_v_subpx_per_px;
  size_t __pyx_v_ss_size;
  size_t __pyx_v_num_px_y;
  size_t __pyx_v_num_px_x;
  double __pyx_v_px_sum;
  size_t __pyx_v_ix;
  size_t __pyx_v_iy;
  size_t __pyx_v_sx;
  size_t __pyx_v_sy;
  __Pyx_memviewslice __pyx_r = { 0, 0, { 0 }, { 0 }, { 0 } };
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_7, 1);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __pyx_r.data = NULL;
  __pyx_r.memview = NULL;
  __Pyx_AddTraceback("pyvale.sensorsim.cython.rastercyth.average_image", __pyx_clineno, __pyx_lineno, __pyx_filename);
  goto __pyx_L2;
  __pyx_L0:;
  if (unlikely(!__pyx_r.memview)) {
    PyErr_SetString(PyExc_TypeError, "Memoryview return value is not initialized");
  }
  __pyx_L2:;
  __Pyx_XDECREF(__pyx_v_image_buff_avg_np);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_image_buff_avg, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_6pyvale_9sensorsim_6cython_10rastercyth_1average_image(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static PyMethodDef __pyx_mdef_6pyvale_9sensorsim_6cython_10rastercyth_1average_image = {"average_image", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_6pyvale_9sensorsim_6cython_10rastercyth_1average_image, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_6pyvale_9sensorsim_6cython_10rastercyth_1average_image(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  __Pyx_memviewslice __pyx_v_image_subpx = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_sub_samp;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("average_image (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_image_subpx,&__pyx_mstate_global->__pyx_n_u_sub_samp,0};
  PyObject* values[2] = {0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 248, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 248, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 248, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "average_image", 0) < (0)) __PYX_ERR(0, 248, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 2; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("average_image", 1, 2, 2, i); __PYX_ERR(0, 248, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 2)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 248, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 248, __pyx_L3_error)
    }
    __pyx_v_image_subpx = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_image_subpx.memview)) __PYX_ERR(0, 252, __pyx_L3_error)
    __pyx_v_sub_samp = __Pyx_PyLong_As_int(values[1]); if (unlikely((__pyx_v_sub_samp == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 253, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("average_image", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 248, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_image_subpx, 1);
  __Pyx_AddTraceback("pyvale.sensorsim.cython.rastercyth.average_image", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_image_subpx.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "image_subpx"); __PYX_ERR(0, 252, __pyx_L1_error)
  }
  __pyx_r = __pyx_pf_6pyvale_9sensorsim_6cython_10rastercyth_average_image(__pyx_self, __pyx_v_image_subpx, __pyx_v_sub_samp);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  goto __pyx_L7_cleaned_up;
  __pyx_L0:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __pyx_L7_cleaned_up:;
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_image_subpx, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyvale_9sensorsim_6cython_10rastercyth_average_image(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_image_subpx, int __pyx_v_sub_samp) {
  PyObject *__pyx_r = NULL;
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_v_image_subpx.memview)) { __Pyx_RaiseUnboundLocalError("image_subpx"); __PYX_ERR(0, 248, __pyx_L1_error) }
  if (unlikely(((PyObject *) __pyx_v_image_subpx.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 248, __pyx_L1_error)
  }
  __pyx_t_1 = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_average_image(__pyx_v_image_subpx, __pyx_v_sub_samp, 1); if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 248, __pyx_L1_error)
  __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_t_1, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 248, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_1, 1);
  __pyx_t_1.memview = NULL; __pyx_t_1.data = NULL;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_1, 1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyvale.sensorsim.cython.rastercyth.average_image", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 248, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_image_subpx, __pyx_mstate_global->__pyx_kp_u_cython_double) < (0)) __PYX_ERR(0, 248, __pyx_L1_error)
  if (PyDict_SetItem(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_sub_samp, __pyx_mstate_global->__pyx_kp_u_cython_int) < (0)) __PYX_ERR(0, 248, __pyx_L1_error)
  __pyx_t_5 = __Pyx_CyFunction_New(&__pyx_mdef_6pyvale_9sensorsim_6cython_10rastercyth_1average_image, 0, __pyx_mstate_global->__pyx_n_u_average_image, NULL, __pyx_mstate_global->__pyx_n_u_pyvale_sensorsim_cython_rastercy, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[0])); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 248, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_5);
  #endif
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_5, __pyx_t_4);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_average_image, __pyx_t_5) < (0)) __PYX_ERR(0, 248, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 249: @cython.boundscheck(False)
 250: @cython.wraparound(False)
 251: @cython.cdivision(True)
 252: def average_image(image_subpx: cython.double[:,:],
 253:                   sub_samp: cython.int,
 254:                   ) -> cython.double[:,:]:
 255: 
+256:     if sub_samp <= 1:
  __pyx_t_1 = (__pyx_v_sub_samp <= 1);
  if (__pyx_t_1) {
/* … */
  }
+257:         return np.asarray(image_subpx[:,:])
    __pyx_t_3 = NULL;
    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 257, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 257, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = __pyx_memoryview_fromslice(__pyx_v_image_subpx, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 257, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_6 = 1;
    #if CYTHON_UNPACK_METHODS
    if (unlikely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_5);
      assert(__pyx_t_3);
      PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(__pyx__function);
      __Pyx_DECREF_SET(__pyx_t_5, __pyx__function);
      __pyx_t_6 = 0;
    }
    #endif
    {
      PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_4};
      __pyx_t_2 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_5, __pyx_callargs+__pyx_t_6, (2-__pyx_t_6) | (__pyx_t_6*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 257, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
    }
    __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 257, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_7;
    __pyx_t_7.memview = NULL;
    __pyx_t_7.data = NULL;
    goto __pyx_L0;
 258: 
+259:     px_num_y: cython.size_t = int(ceil(image_subpx.shape[0]/sub_samp))
  __pyx_v_px_num_y = ((size_t)ceil(((__pyx_v_image_subpx.shape[0]) / ((Py_ssize_t)__pyx_v_sub_samp))));
+260:     px_num_x: cython.size_t = int(ceil(image_subpx.shape[1]/sub_samp))
  __pyx_v_px_num_x = ((size_t)ceil(((__pyx_v_image_subpx.shape[1]) / ((Py_ssize_t)__pyx_v_sub_samp))));
 261: 
+262:     image_buff_avg_np = np.full((px_num_y,px_num_x),0.0,dtype=np.float64)
  __pyx_t_5 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 262, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_full); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 262, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyLong_FromSize_t(__pyx_v_px_num_y); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 262, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_8 = __Pyx_PyLong_FromSize_t(__pyx_v_px_num_x); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 262, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 262, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_GIVEREF(__pyx_t_4);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_4) != (0)) __PYX_ERR(0, 262, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_8);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8) != (0)) __PYX_ERR(0, 262, __pyx_L1_error);
  __pyx_t_4 = 0;
  __pyx_t_8 = 0;
  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 262, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_mstate_global->__pyx_n_u_float64); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 262, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  __pyx_t_6 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_5);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_6 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[3 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_5, __pyx_t_9, __pyx_mstate_global->__pyx_float_0_0};
    __pyx_t_8 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 262, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_4, __pyx_t_8, __pyx_callargs+3, 0) < (0)) __PYX_ERR(0, 262, __pyx_L1_error)
    __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_6, (3-__pyx_t_6) | (__pyx_t_6*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_8);
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 262, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_v_image_buff_avg_np = __pyx_t_2;
  __pyx_t_2 = 0;
+263:     image_buff_avg: cython.double[:,:] = image_buff_avg_np
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_image_buff_avg_np, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 263, __pyx_L1_error)
  __pyx_v_image_buff_avg = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
 264: 
+265:     num_subpx_y: cython.size_t = image_subpx.shape[0]
  __pyx_v_num_subpx_y = (__pyx_v_image_subpx.shape[0]);
+266:     num_subpx_x: cython.size_t = image_subpx.shape[1]
  __pyx_v_num_subpx_x = (__pyx_v_image_subpx.shape[1]);
+267:     subpx_per_px: cython.double = float(sub_samp*sub_samp)
  __pyx_v_subpx_per_px = ((double)(__pyx_v_sub_samp * __pyx_v_sub_samp));
+268:     ss_size: cython.size_t = sub_samp
  __pyx_v_ss_size = __pyx_v_sub_samp;
 269: 
+270:     num_px_y: cython.size_t = int(num_subpx_y/sub_samp)
  __pyx_v_num_px_y = (__pyx_v_num_subpx_y / ((size_t)__pyx_v_sub_samp));
+271:     num_px_x: cython.size_t = int(num_subpx_x/sub_samp)
  __pyx_v_num_px_x = (__pyx_v_num_subpx_x / ((size_t)__pyx_v_sub_samp));
 272: 
+273:     px_sum: cython.double = 0.0
  __pyx_v_px_sum = 0.0;
 274: 
+275:     ix: cython.size_t = 0
  __pyx_v_ix = 0;
+276:     iy: cython.size_t = 0
  __pyx_v_iy = 0;
+277:     sx: cython.size_t = 0
  __pyx_v_sx = 0;
+278:     sy: cython.size_t = 0
  __pyx_v_sy = 0;
 279: 
+280:     for iy in range(num_px_y):
  __pyx_t_6 = __pyx_v_num_px_y;
  __pyx_t_10 = __pyx_t_6;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_iy = __pyx_t_11;
+281:         for ix in range(num_px_x):
    __pyx_t_12 = __pyx_v_num_px_x;
    __pyx_t_13 = __pyx_t_12;
    for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
      __pyx_v_ix = __pyx_t_14;
+282:             px_sum = 0.0
      __pyx_v_px_sum = 0.0;
+283:             for sy in range(ss_size):
      __pyx_t_15 = __pyx_v_ss_size;
      __pyx_t_16 = __pyx_t_15;
      for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
        __pyx_v_sy = __pyx_t_17;
+284:                 for sx in range(ss_size):
        __pyx_t_18 = __pyx_v_ss_size;
        __pyx_t_19 = __pyx_t_18;
        for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) {
          __pyx_v_sx = __pyx_t_20;
+285:                     px_sum += image_subpx[ss_size*iy+sy,ss_size*ix+sx]
          __pyx_t_21 = ((__pyx_v_ss_size * __pyx_v_iy) + __pyx_v_sy);
          __pyx_t_22 = ((__pyx_v_ss_size * __pyx_v_ix) + __pyx_v_sx);
          __pyx_v_px_sum = (__pyx_v_px_sum + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_image_subpx.data + __pyx_t_21 * __pyx_v_image_subpx.strides[0]) ) + __pyx_t_22 * __pyx_v_image_subpx.strides[1]) ))));
        }
      }
 286: 
+287:             image_buff_avg[iy,ix] = px_sum / subpx_per_px
      __pyx_t_15 = __pyx_v_iy;
      __pyx_t_16 = __pyx_v_ix;
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_image_buff_avg.data + __pyx_t_15 * __pyx_v_image_buff_avg.strides[0]) ) + __pyx_t_16 * __pyx_v_image_buff_avg.strides[1]) )) = (__pyx_v_px_sum / __pyx_v_subpx_per_px);
    }
  }
 288: 
+289:     return image_buff_avg
  __PYX_INC_MEMVIEW(&__pyx_v_image_buff_avg, 1);
  __pyx_r = __pyx_v_image_buff_avg;
  goto __pyx_L0;
 290: 
 291: 
+292: @cython.nogil
static int __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth__average_image(__Pyx_memviewslice __pyx_v_image_buff_subpx_in, int __pyx_v_sub_samp, __Pyx_memviewslice __pyx_v_image_buff_avg_out) {
  size_t __pyx_v_num_subpx_y;
  size_t __pyx_v_num_subpx_x;
  double __pyx_v_subpx_per_px;
  size_t __pyx_v_ss_size;
  size_t __pyx_v_num_px_y;
  size_t __pyx_v_num_px_x;
  double __pyx_v_px_sum;
  size_t __pyx_v_ix;
  size_t __pyx_v_iy;
  size_t __pyx_v_sx;
  size_t __pyx_v_sy;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 293: @cython.cfunc
 294: @cython.boundscheck(False)
 295: @cython.wraparound(False)
 296: @cython.cdivision(True)
 297: @cython.exceptval(check=False)
 298: def _average_image(image_buff_subpx_in: cython.double[:,:],
 299:                    sub_samp: cython.int,
 300:                    image_buff_avg_out: cython.double[:,:]
 301:                    ) -> cython.int:
 302: 
+303:     num_subpx_y: cython.size_t = image_buff_subpx_in.shape[0]
  __pyx_v_num_subpx_y = (__pyx_v_image_buff_subpx_in.shape[0]);
+304:     num_subpx_x: cython.size_t = image_buff_subpx_in.shape[1]
  __pyx_v_num_subpx_x = (__pyx_v_image_buff_subpx_in.shape[1]);
+305:     subpx_per_px: cython.double = float(sub_samp*sub_samp)
  __pyx_v_subpx_per_px = ((double)(__pyx_v_sub_samp * __pyx_v_sub_samp));
+306:     ss_size: cython.size_t = sub_samp
  __pyx_v_ss_size = __pyx_v_sub_samp;
 307: 
+308:     num_px_y: cython.size_t = int(num_subpx_y/sub_samp)
  __pyx_v_num_px_y = (__pyx_v_num_subpx_y / ((size_t)__pyx_v_sub_samp));
+309:     num_px_x: cython.size_t = int(num_subpx_x/sub_samp)
  __pyx_v_num_px_x = (__pyx_v_num_subpx_x / ((size_t)__pyx_v_sub_samp));
 310: 
+311:     px_sum: cython.double = 0.0
  __pyx_v_px_sum = 0.0;
 312: 
+313:     ix: cython.size_t = 0
  __pyx_v_ix = 0;
+314:     iy: cython.size_t = 0
  __pyx_v_iy = 0;
+315:     sx: cython.size_t = 0
  __pyx_v_sx = 0;
+316:     sy: cython.size_t = 0
  __pyx_v_sy = 0;
 317: 
+318:     for iy in range(num_px_y):
  __pyx_t_1 = __pyx_v_num_px_y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_iy = __pyx_t_3;
+319:         for ix in range(num_px_x):
    __pyx_t_4 = __pyx_v_num_px_x;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_ix = __pyx_t_6;
+320:             px_sum = 0.0
      __pyx_v_px_sum = 0.0;
+321:             for sy in range(ss_size):
      __pyx_t_7 = __pyx_v_ss_size;
      __pyx_t_8 = __pyx_t_7;
      for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
        __pyx_v_sy = __pyx_t_9;
+322:                 for sx in range(ss_size):
        __pyx_t_10 = __pyx_v_ss_size;
        __pyx_t_11 = __pyx_t_10;
        for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
          __pyx_v_sx = __pyx_t_12;
+323:                     px_sum += image_buff_subpx_in[ss_size*iy+sy,ss_size*ix+sx]
          __pyx_t_13 = ((__pyx_v_ss_size * __pyx_v_iy) + __pyx_v_sy);
          __pyx_t_14 = ((__pyx_v_ss_size * __pyx_v_ix) + __pyx_v_sx);
          __pyx_v_px_sum = (__pyx_v_px_sum + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_image_buff_subpx_in.data + __pyx_t_13 * __pyx_v_image_buff_subpx_in.strides[0]) ) + __pyx_t_14 * __pyx_v_image_buff_subpx_in.strides[1]) ))));
        }
      }
 324: 
+325:             image_buff_avg_out[iy,ix] = px_sum / subpx_per_px
      __pyx_t_7 = __pyx_v_iy;
      __pyx_t_8 = __pyx_v_ix;
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_image_buff_avg_out.data + __pyx_t_7 * __pyx_v_image_buff_avg_out.strides[0]) ) + __pyx_t_8 * __pyx_v_image_buff_avg_out.strides[1]) )) = (__pyx_v_px_sum / __pyx_v_subpx_per_px);
    }
  }
 326: 
+327:     return 0
  __pyx_r = 0;
  goto __pyx_L0;
 328: 
 329: 
 330: #///////////////////////////////////////////////////////////////////////////////
+331: @cython.ccall # python+C or cython.cfunc for C only
static PyObject *__pyx_pw_6pyvale_9sensorsim_6cython_10rastercyth_3raster_static_frame(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static PyObject *__pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_raster_static_frame(__Pyx_memviewslice __pyx_v_coords, __Pyx_memviewslice __pyx_v_connect, __Pyx_memviewslice __pyx_v_fields_to_render, PyObject *__pyx_v_cam_data, CYTHON_UNUSED int __pyx_skip_dispatch) {
  __Pyx_memviewslice __pyx_v_world_to_cam_mat = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_pixels_num = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_image_dims = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_image_dist;
  int __pyx_v_sub_samp;
  size_t __pyx_v_nodes_per_elem;
  size_t __pyx_v_fields_num;
  int __pyx_v_sub_pix_x;
  int __pyx_v_sub_pix_y;
  PyObject *__pyx_v_image_buff_avg_np = NULL;
  __Pyx_memviewslice __pyx_v_image_buff_avg = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_depth_buff_avg_np = NULL;
  __Pyx_memviewslice __pyx_v_depth_buff_avg = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_depth_buffer_np = NULL;
  __Pyx_memviewslice __pyx_v_depth_buff_subpx = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_image_buffer_np = NULL;
  __Pyx_memviewslice __pyx_v_image_buff_subpx = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_nodes_raster_np = NULL;
  __Pyx_memviewslice __pyx_v_nodes_raster_buff = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_field_raster_np = NULL;
  __Pyx_memviewslice __pyx_v_field_raster_buff = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_weights_np = NULL;
  __Pyx_memviewslice __pyx_v_weights_buff = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_px_coord_np = NULL;
  __Pyx_memviewslice __pyx_v_px_coord_buff = { 0, 0, { 0 }, { 0 }, { 0 } };
  size_t __pyx_v_elems_in_image;
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_2, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_3, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_4, 1);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_15, 1);
  __Pyx_AddTraceback("pyvale.sensorsim.cython.rastercyth.raster_static_frame", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_world_to_cam_mat, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_pixels_num, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_image_dims, 1);
  __Pyx_XDECREF(__pyx_v_image_buff_avg_np);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_image_buff_avg, 1);
  __Pyx_XDECREF(__pyx_v_depth_buff_avg_np);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_depth_buff_avg, 1);
  __Pyx_XDECREF(__pyx_v_depth_buffer_np);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_depth_buff_subpx, 1);
  __Pyx_XDECREF(__pyx_v_image_buffer_np);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_image_buff_subpx, 1);
  __Pyx_XDECREF(__pyx_v_nodes_raster_np);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_nodes_raster_buff, 1);
  __Pyx_XDECREF(__pyx_v_field_raster_np);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_field_raster_buff, 1);
  __Pyx_XDECREF(__pyx_v_weights_np);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_weights_buff, 1);
  __Pyx_XDECREF(__pyx_v_px_coord_np);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_px_coord_buff, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_6pyvale_9sensorsim_6cython_10rastercyth_3raster_static_frame(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static PyMethodDef __pyx_mdef_6pyvale_9sensorsim_6cython_10rastercyth_3raster_static_frame = {"raster_static_frame", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_6pyvale_9sensorsim_6cython_10rastercyth_3raster_static_frame, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_6pyvale_9sensorsim_6cython_10rastercyth_3raster_static_frame(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  __Pyx_memviewslice __pyx_v_coords = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_connect = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_fields_to_render = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_cam_data = 0;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("raster_static_frame (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_coords,&__pyx_mstate_global->__pyx_n_u_connect,&__pyx_mstate_global->__pyx_n_u_fields_to_render,&__pyx_mstate_global->__pyx_n_u_cam_data,0};
  PyObject* values[4] = {0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 331, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 331, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 331, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 331, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 331, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "raster_static_frame", 0) < (0)) __PYX_ERR(0, 331, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 4; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("raster_static_frame", 1, 4, 4, i); __PYX_ERR(0, 331, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 4)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 331, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 331, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 331, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 331, __pyx_L3_error)
    }
    __pyx_v_coords = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_coords.memview)) __PYX_ERR(0, 335, __pyx_L3_error)
    __pyx_v_connect = __Pyx_PyObject_to_MemoryviewSlice_dsds_size_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_connect.memview)) __PYX_ERR(0, 336, __pyx_L3_error)
    __pyx_v_fields_to_render = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_fields_to_render.memview)) __PYX_ERR(0, 337, __pyx_L3_error)
    __pyx_v_cam_data = values[3];
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("raster_static_frame", 1, 4, 4, __pyx_nargs); __PYX_ERR(0, 331, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_coords, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_connect, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_fields_to_render, 1);
  __Pyx_AddTraceback("pyvale.sensorsim.cython.rastercyth.raster_static_frame", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_coords.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "coords"); __PYX_ERR(0, 335, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_connect.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "connect"); __PYX_ERR(0, 336, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_fields_to_render.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "fields_to_render"); __PYX_ERR(0, 337, __pyx_L1_error)
  }
  __pyx_r = __pyx_pf_6pyvale_9sensorsim_6cython_10rastercyth_2raster_static_frame(__pyx_self, __pyx_v_coords, __pyx_v_connect, __pyx_v_fields_to_render, __pyx_v_cam_data);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  goto __pyx_L7_cleaned_up;
  __pyx_L0:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __pyx_L7_cleaned_up:;
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_coords, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_connect, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_fields_to_render, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyvale_9sensorsim_6cython_10rastercyth_2raster_static_frame(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_coords, __Pyx_memviewslice __pyx_v_connect, __Pyx_memviewslice __pyx_v_fields_to_render, PyObject *__pyx_v_cam_data) {
  PyObject *__pyx_r = NULL;
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_v_coords.memview)) { __Pyx_RaiseUnboundLocalError("coords"); __PYX_ERR(0, 331, __pyx_L1_error) }
  if (unlikely(((PyObject *) __pyx_v_coords.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 331, __pyx_L1_error)
  }
  if (unlikely(!__pyx_v_connect.memview)) { __Pyx_RaiseUnboundLocalError("connect"); __PYX_ERR(0, 331, __pyx_L1_error) }
  if (unlikely(((PyObject *) __pyx_v_connect.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 331, __pyx_L1_error)
  }
  if (unlikely(!__pyx_v_fields_to_render.memview)) { __Pyx_RaiseUnboundLocalError("fields_to_render"); __PYX_ERR(0, 331, __pyx_L1_error) }
  if (unlikely(((PyObject *) __pyx_v_fields_to_render.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 331, __pyx_L1_error)
  }
  __pyx_t_1 = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_raster_static_frame(__pyx_v_coords, __pyx_v_connect, __pyx_v_fields_to_render, __pyx_v_cam_data, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 331, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("pyvale.sensorsim.cython.rastercyth.raster_static_frame", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_5 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 331, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (PyDict_SetItem(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_coords, __pyx_mstate_global->__pyx_kp_u_cython_double) < (0)) __PYX_ERR(0, 331, __pyx_L1_error)
  if (PyDict_SetItem(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_connect, __pyx_mstate_global->__pyx_kp_u_cython_size_t) < (0)) __PYX_ERR(0, 331, __pyx_L1_error)
  if (PyDict_SetItem(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_fields_to_render, __pyx_mstate_global->__pyx_kp_u_cython_double) < (0)) __PYX_ERR(0, 331, __pyx_L1_error)
  if (PyDict_SetItem(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_cam_data, __pyx_mstate_global->__pyx_n_u_CameraData) < (0)) __PYX_ERR(0, 331, __pyx_L1_error)
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_6pyvale_9sensorsim_6cython_10rastercyth_3raster_static_frame, 0, __pyx_mstate_global->__pyx_n_u_raster_static_frame, NULL, __pyx_mstate_global->__pyx_n_u_pyvale_sensorsim_cython_rastercy, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[1])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 331, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_4);
  #endif
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_4, __pyx_t_5);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_raster_static_frame, __pyx_t_4) < (0)) __PYX_ERR(0, 331, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 332: @cython.boundscheck(False) # Turn off array bounds checking
 333: @cython.wraparound(False)  # Turn off negative indexing
 334: @cython.cdivision(True)    # Turn off divide by zero check
 335: def raster_static_frame(coords: cython.double[:,:],
 336:                         connect: cython.size_t[:,:],
 337:                         fields_to_render: cython.double[:,:],
 338:                         cam_data: CameraData,
 339:                         ) -> tuple[np.ndarray,np.ndarray,int]:
 340: 
 341: 
+342:     world_to_cam_mat: cython.double[:,:] = cam_data.world_to_cam_mat
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_cam_data, __pyx_mstate_global->__pyx_n_u_world_to_cam_mat); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 342, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_t_1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_2.memview)) __PYX_ERR(0, 342, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_world_to_cam_mat = __pyx_t_2;
  __pyx_t_2.memview = NULL;
  __pyx_t_2.data = NULL;
+343:     pixels_num: cython.int[:] = cam_data.pixels_num
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_cam_data, __pyx_mstate_global->__pyx_n_u_pixels_num); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 343, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyObject_to_MemoryviewSlice_ds_int(__pyx_t_1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_3.memview)) __PYX_ERR(0, 343, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_pixels_num = __pyx_t_3;
  __pyx_t_3.memview = NULL;
  __pyx_t_3.data = NULL;
+344:     image_dims: cython.double[:] = cam_data.image_dims
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_cam_data, __pyx_mstate_global->__pyx_n_u_image_dims); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 344, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_t_1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_4.memview)) __PYX_ERR(0, 344, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_image_dims = __pyx_t_4;
  __pyx_t_4.memview = NULL;
  __pyx_t_4.data = NULL;
+345:     image_dist: cython.double = cam_data.image_dist
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_cam_data, __pyx_mstate_global->__pyx_n_u_image_dist); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 345, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = __Pyx_PyFloat_AsDouble(__pyx_t_1); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 345, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_image_dist = __pyx_t_5;
+346:     sub_samp: cython.int = cam_data.sub_samp
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_cam_data, __pyx_mstate_global->__pyx_n_u_sub_samp); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 346, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_6 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 346, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_sub_samp = __pyx_t_6;
 347: 
+348:     nodes_per_elem: cython.size_t = connect.shape[1]
  __pyx_v_nodes_per_elem = (__pyx_v_connect.shape[1]);
+349:     fields_num: cython.size_t = fields_to_render.shape[1]
  __pyx_v_fields_num = (__pyx_v_fields_to_render.shape[1]);
+350:     sub_pix_x: cython.int = pixels_num[0]*sub_samp
  __pyx_t_7 = 0;
  __pyx_v_sub_pix_x = ((*((int *) ( /* dim=0 */ (__pyx_v_pixels_num.data + __pyx_t_7 * __pyx_v_pixels_num.strides[0]) ))) * __pyx_v_sub_samp);
+351:     sub_pix_y: cython.int = pixels_num[1]*sub_samp
  __pyx_t_7 = 1;
  __pyx_v_sub_pix_y = ((*((int *) ( /* dim=0 */ (__pyx_v_pixels_num.data + __pyx_t_7 * __pyx_v_pixels_num.strides[0]) ))) * __pyx_v_sub_samp);
 352: 
 353:     #---------------------------------------------------------------------------
 354:     # Final image buffer memory allocation
+355:     image_buff_avg_np = np.full((pixels_num[1],pixels_num[0],fields_num),0.0,dtype=np.float64)
  __pyx_t_8 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 355, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_full); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 355, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_7 = 1;
  __pyx_t_9 = __Pyx_PyLong_From_int((*((int *) ( /* dim=0 */ (__pyx_v_pixels_num.data + __pyx_t_7 * __pyx_v_pixels_num.strides[0]) )))); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 355, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_7 = 0;
  __pyx_t_11 = __Pyx_PyLong_From_int((*((int *) ( /* dim=0 */ (__pyx_v_pixels_num.data + __pyx_t_7 * __pyx_v_pixels_num.strides[0]) )))); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 355, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = __Pyx_PyLong_FromSize_t(__pyx_v_fields_num); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 355, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 355, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __Pyx_GIVEREF(__pyx_t_9);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9) != (0)) __PYX_ERR(0, 355, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_11);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_11) != (0)) __PYX_ERR(0, 355, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_12);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_12) != (0)) __PYX_ERR(0, 355, __pyx_L1_error);
  __pyx_t_9 = 0;
  __pyx_t_11 = 0;
  __pyx_t_12 = 0;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 355, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_float64); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 355, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_14 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_10))) {
    __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_10);
    assert(__pyx_t_8);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_10);
    __Pyx_INCREF(__pyx_t_8);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_10, __pyx__function);
    __pyx_t_14 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[3 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_8, __pyx_t_13, __pyx_mstate_global->__pyx_float_0_0};
    __pyx_t_12 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 355, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_11, __pyx_t_12, __pyx_callargs+3, 0) < (0)) __PYX_ERR(0, 355, __pyx_L1_error)
    __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_10, __pyx_callargs+__pyx_t_14, (3-__pyx_t_14) | (__pyx_t_14*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_12);
    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 355, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_image_buff_avg_np = __pyx_t_1;
  __pyx_t_1 = 0;
+356:     image_buff_avg: cython.double[:,:,:] = image_buff_avg_np
  __pyx_t_15 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(__pyx_v_image_buff_avg_np, PyBUF_WRITABLE); if (unlikely(!__pyx_t_15.memview)) __PYX_ERR(0, 356, __pyx_L1_error)
  __pyx_v_image_buff_avg = __pyx_t_15;
  __pyx_t_15.memview = NULL;
  __pyx_t_15.data = NULL;
 357: 
+358:     depth_buff_avg_np = np.full((pixels_num[1],pixels_num[0]),0.0,dtype=np.float64)
  __pyx_t_10 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 358, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_full); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 358, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_7 = 1;
  __pyx_t_12 = __Pyx_PyLong_From_int((*((int *) ( /* dim=0 */ (__pyx_v_pixels_num.data + __pyx_t_7 * __pyx_v_pixels_num.strides[0]) )))); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 358, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_7 = 0;
  __pyx_t_13 = __Pyx_PyLong_From_int((*((int *) ( /* dim=0 */ (__pyx_v_pixels_num.data + __pyx_t_7 * __pyx_v_pixels_num.strides[0]) )))); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 358, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 358, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_GIVEREF(__pyx_t_12);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_12) != (0)) __PYX_ERR(0, 358, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_13);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_13) != (0)) __PYX_ERR(0, 358, __pyx_L1_error);
  __pyx_t_12 = 0;
  __pyx_t_13 = 0;
  __Pyx_GetModuleGlobalName(__pyx_t_13, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 358, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_mstate_global->__pyx_n_u_float64); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 358, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
  __pyx_t_14 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_11))) {
    __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_11);
    assert(__pyx_t_10);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_11);
    __Pyx_INCREF(__pyx_t_10);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_11, __pyx__function);
    __pyx_t_14 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[3 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_10, __pyx_t_8, __pyx_mstate_global->__pyx_float_0_0};
    __pyx_t_13 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 358, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_12, __pyx_t_13, __pyx_callargs+3, 0) < (0)) __PYX_ERR(0, 358, __pyx_L1_error)
    __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_11, __pyx_callargs+__pyx_t_14, (3-__pyx_t_14) | (__pyx_t_14*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_13);
    __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 358, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_depth_buff_avg_np = __pyx_t_1;
  __pyx_t_1 = 0;
+359:     depth_buff_avg: cython.double[:,:] = depth_buff_avg_np
  __pyx_t_2 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_depth_buff_avg_np, PyBUF_WRITABLE); if (unlikely(!__pyx_t_2.memview)) __PYX_ERR(0, 359, __pyx_L1_error)
  __pyx_v_depth_buff_avg = __pyx_t_2;
  __pyx_t_2.memview = NULL;
  __pyx_t_2.data = NULL;
 360: 
 361:     #---------------------------------------------------------------------------
 362:     # Per-thread scratch memory allocations
+363:     depth_buffer_np = np.full((sub_pix_y,sub_pix_x),1.0e6,dtype=np.float64)
  __pyx_t_11 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_13, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 363, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_mstate_global->__pyx_n_u_full); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 363, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
  __pyx_t_13 = __Pyx_PyLong_From_int(__pyx_v_sub_pix_y); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 363, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __pyx_t_8 = __Pyx_PyLong_From_int(__pyx_v_sub_pix_x); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 363, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 363, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_GIVEREF(__pyx_t_13);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_13) != (0)) __PYX_ERR(0, 363, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_8);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_8) != (0)) __PYX_ERR(0, 363, __pyx_L1_error);
  __pyx_t_13 = 0;
  __pyx_t_8 = 0;
  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 363, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_mstate_global->__pyx_n_u_float64); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 363, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  __pyx_t_14 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_12))) {
    __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_12);
    assert(__pyx_t_11);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_12);
    __Pyx_INCREF(__pyx_t_11);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_12, __pyx__function);
    __pyx_t_14 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[3 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_11, __pyx_t_10, __pyx_mstate_global->__pyx_float_1_0e6};
    __pyx_t_8 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 363, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_13, __pyx_t_8, __pyx_callargs+3, 0) < (0)) __PYX_ERR(0, 363, __pyx_L1_error)
    __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_12, __pyx_callargs+__pyx_t_14, (3-__pyx_t_14) | (__pyx_t_14*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_8);
    __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 363, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_depth_buffer_np = __pyx_t_1;
  __pyx_t_1 = 0;
+364:     depth_buff_subpx: cython.double[:,:] = depth_buffer_np
  __pyx_t_2 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_depth_buffer_np, PyBUF_WRITABLE); if (unlikely(!__pyx_t_2.memview)) __PYX_ERR(0, 364, __pyx_L1_error)
  __pyx_v_depth_buff_subpx = __pyx_t_2;
  __pyx_t_2.memview = NULL;
  __pyx_t_2.data = NULL;
 365: 
+366:     image_buffer_np = np.full((sub_pix_y,sub_pix_x,fields_num),0.0,dtype=np.float64)
  __pyx_t_12 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_mstate_global->__pyx_n_u_full); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  __pyx_t_8 = __Pyx_PyLong_From_int(__pyx_v_sub_pix_y); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_10 = __Pyx_PyLong_From_int(__pyx_v_sub_pix_x); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __pyx_t_11 = __Pyx_PyLong_FromSize_t(__pyx_v_fields_num); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_GIVEREF(__pyx_t_8);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_8) != (0)) __PYX_ERR(0, 366, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_10);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_10) != (0)) __PYX_ERR(0, 366, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_11);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_t_11) != (0)) __PYX_ERR(0, 366, __pyx_L1_error);
  __pyx_t_8 = 0;
  __pyx_t_10 = 0;
  __pyx_t_11 = 0;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_float64); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_14 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_13))) {
    __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_13);
    assert(__pyx_t_12);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_13);
    __Pyx_INCREF(__pyx_t_12);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_13, __pyx__function);
    __pyx_t_14 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[3 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_12, __pyx_t_9, __pyx_mstate_global->__pyx_float_0_0};
    __pyx_t_11 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 366, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_10, __pyx_t_11, __pyx_callargs+3, 0) < (0)) __PYX_ERR(0, 366, __pyx_L1_error)
    __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_13, __pyx_callargs+__pyx_t_14, (3-__pyx_t_14) | (__pyx_t_14*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_11);
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 366, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_image_buffer_np = __pyx_t_1;
  __pyx_t_1 = 0;
+367:     image_buff_subpx: cython.double[:,:,:] = image_buffer_np
  __pyx_t_15 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(__pyx_v_image_buffer_np, PyBUF_WRITABLE); if (unlikely(!__pyx_t_15.memview)) __PYX_ERR(0, 367, __pyx_L1_error)
  __pyx_v_image_buff_subpx = __pyx_t_15;
  __pyx_t_15.memview = NULL;
  __pyx_t_15.data = NULL;
 368: 
 369:     # shape=(nodes_per_elem, coord[X,Y,Z,W])
+370:     nodes_raster_np = np.empty((nodes_per_elem,4),dtype=np.float64)
  __pyx_t_13 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 370, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 370, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_11 = __Pyx_PyLong_FromSize_t(__pyx_v_nodes_per_elem); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 370, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 370, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_GIVEREF(__pyx_t_11);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_11) != (0)) __PYX_ERR(0, 370, __pyx_L1_error);
  __Pyx_INCREF(__pyx_mstate_global->__pyx_int_4);
  __Pyx_GIVEREF(__pyx_mstate_global->__pyx_int_4);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_mstate_global->__pyx_int_4) != (0)) __PYX_ERR(0, 370, __pyx_L1_error);
  __pyx_t_11 = 0;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 370, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_float64); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 370, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_14 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_10))) {
    __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_10);
    assert(__pyx_t_13);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_10);
    __Pyx_INCREF(__pyx_t_13);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_10, __pyx__function);
    __pyx_t_14 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_13, __pyx_t_9};
    __pyx_t_11 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 370, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_12, __pyx_t_11, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 370, __pyx_L1_error)
    __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_10, __pyx_callargs+__pyx_t_14, (2-__pyx_t_14) | (__pyx_t_14*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_11);
    __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 370, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_nodes_raster_np = __pyx_t_1;
  __pyx_t_1 = 0;
+371:     nodes_raster_buff: cython.double[:,:] = nodes_raster_np
  __pyx_t_2 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_nodes_raster_np, PyBUF_WRITABLE); if (unlikely(!__pyx_t_2.memview)) __PYX_ERR(0, 371, __pyx_L1_error)
  __pyx_v_nodes_raster_buff = __pyx_t_2;
  __pyx_t_2.memview = NULL;
  __pyx_t_2.data = NULL;
 372: 
+373:     field_raster_np = np.empty((nodes_per_elem,),dtype=np.float64)
  __pyx_t_10 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 373, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 373, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_11 = __Pyx_PyLong_FromSize_t(__pyx_v_nodes_per_elem); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 373, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 373, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_GIVEREF(__pyx_t_11);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_11) != (0)) __PYX_ERR(0, 373, __pyx_L1_error);
  __pyx_t_11 = 0;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 373, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_float64); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 373, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_14 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_12))) {
    __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_12);
    assert(__pyx_t_10);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_12);
    __Pyx_INCREF(__pyx_t_10);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_12, __pyx__function);
    __pyx_t_14 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_10, __pyx_t_9};
    __pyx_t_11 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 373, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_13, __pyx_t_11, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 373, __pyx_L1_error)
    __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_12, __pyx_callargs+__pyx_t_14, (2-__pyx_t_14) | (__pyx_t_14*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_11);
    __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 373, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_field_raster_np = __pyx_t_1;
  __pyx_t_1 = 0;
+374:     field_raster_buff: cython.double[:] = field_raster_np
  __pyx_t_4 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_field_raster_np, PyBUF_WRITABLE); if (unlikely(!__pyx_t_4.memview)) __PYX_ERR(0, 374, __pyx_L1_error)
  __pyx_v_field_raster_buff = __pyx_t_4;
  __pyx_t_4.memview = NULL;
  __pyx_t_4.data = NULL;
 375: 
+376:     weights_np = np.zeros((nodes_per_elem,),np.float64)
  __pyx_t_12 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_11 = __Pyx_PyLong_FromSize_t(__pyx_v_nodes_per_elem); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_GIVEREF(__pyx_t_11);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_11) != (0)) __PYX_ERR(0, 376, __pyx_L1_error);
  __pyx_t_11 = 0;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_float64); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_14 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_13))) {
    __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_13);
    assert(__pyx_t_12);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_13);
    __Pyx_INCREF(__pyx_t_12);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_13, __pyx__function);
    __pyx_t_14 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[3] = {__pyx_t_12, __pyx_t_9, __pyx_t_10};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_13, __pyx_callargs+__pyx_t_14, (3-__pyx_t_14) | (__pyx_t_14*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 376, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_weights_np = __pyx_t_1;
  __pyx_t_1 = 0;
+377:     weights_buff: cython.double[:] = weights_np
  __pyx_t_4 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_weights_np, PyBUF_WRITABLE); if (unlikely(!__pyx_t_4.memview)) __PYX_ERR(0, 377, __pyx_L1_error)
  __pyx_v_weights_buff = __pyx_t_4;
  __pyx_t_4.memview = NULL;
  __pyx_t_4.data = NULL;
 378: 
 379:     # Only used for edge function in raster coords - need x,y
+380:     px_coord_np = np.zeros((2,),np.float64)
  __pyx_t_13 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 380, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 380, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 380, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_float64); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 380, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __pyx_t_14 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_13);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_13);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_14 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[3] = {__pyx_t_13, __pyx_mstate_global->__pyx_tuple[2], __pyx_t_12};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_14, (3-__pyx_t_14) | (__pyx_t_14*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 380, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_px_coord_np = __pyx_t_1;
  __pyx_t_1 = 0;
+381:     px_coord_buff: cython.double[:] = px_coord_np
  __pyx_t_4 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_px_coord_np, PyBUF_WRITABLE); if (unlikely(!__pyx_t_4.memview)) __PYX_ERR(0, 381, __pyx_L1_error)
  __pyx_v_px_coord_buff = __pyx_t_4;
  __pyx_t_4.memview = NULL;
  __pyx_t_4.data = NULL;
 382: 
 383: 
 384:     #---------------------------------------------------------------------------
+385:     elems_in_image: cython.size_t = _raster_frame(coords[:,:],
  if (unlikely(((PyObject *) __pyx_v_coords.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 385, __pyx_L1_error)
  }
/* … */
  __pyx_v_elems_in_image = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth__raster_frame(__pyx_v_coords, __pyx_v_connect, __pyx_v_fields_to_render, __pyx_v_world_to_cam_mat, __pyx_v_pixels_num, __pyx_v_image_dims, __pyx_v_image_dist, __pyx_v_sub_samp, __pyx_v_image_buff_avg, __pyx_v_depth_buff_avg, __pyx_v_image_buff_subpx, __pyx_v_depth_buff_subpx, __pyx_v_nodes_raster_buff, __pyx_v_field_raster_buff, __pyx_v_px_coord_buff, __pyx_v_weights_buff);
+386:                                                   connect[:,:],
  if (unlikely(((PyObject *) __pyx_v_connect.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 386, __pyx_L1_error)
  }
+387:                                                   fields_to_render[:,:],
  if (unlikely(((PyObject *) __pyx_v_fields_to_render.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 387, __pyx_L1_error)
  }
+388:                                                   world_to_cam_mat[:,:],
  if (unlikely(((PyObject *) __pyx_v_world_to_cam_mat.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 388, __pyx_L1_error)
  }
+389:                                                   pixels_num[:],
  if (unlikely(((PyObject *) __pyx_v_pixels_num.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 389, __pyx_L1_error)
  }
+390:                                                   image_dims[:],
  if (unlikely(((PyObject *) __pyx_v_image_dims.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 390, __pyx_L1_error)
  }
 391:                                                   image_dist,
 392:                                                   sub_samp,
+393:                                                   image_buff_avg[:,:,:],
  if (unlikely(((PyObject *) __pyx_v_image_buff_avg.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 393, __pyx_L1_error)
  }
+394:                                                   depth_buff_avg[:,:],
  if (unlikely(((PyObject *) __pyx_v_depth_buff_avg.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 394, __pyx_L1_error)
  }
+395:                                                   image_buff_subpx[:,:,:],
  if (unlikely(((PyObject *) __pyx_v_image_buff_subpx.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 395, __pyx_L1_error)
  }
+396:                                                   depth_buff_subpx[:,:],
  if (unlikely(((PyObject *) __pyx_v_depth_buff_subpx.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 396, __pyx_L1_error)
  }
+397:                                                   nodes_raster_buff[:,:],
  if (unlikely(((PyObject *) __pyx_v_nodes_raster_buff.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 397, __pyx_L1_error)
  }
+398:                                                   field_raster_buff[:],
  if (unlikely(((PyObject *) __pyx_v_field_raster_buff.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 398, __pyx_L1_error)
  }
+399:                                                   px_coord_buff[:],
  if (unlikely(((PyObject *) __pyx_v_px_coord_buff.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 399, __pyx_L1_error)
  }
+400:                                                   weights_buff[:])
  if (unlikely(((PyObject *) __pyx_v_weights_buff.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 400, __pyx_L1_error)
  }
 401: 
+402:     return (image_buff_avg_np,depth_buff_avg_np,elems_in_image)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyLong_FromSize_t(__pyx_v_elems_in_image); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 402, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 402, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_INCREF(__pyx_v_image_buff_avg_np);
  __Pyx_GIVEREF(__pyx_v_image_buff_avg_np);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_image_buff_avg_np) != (0)) __PYX_ERR(0, 402, __pyx_L1_error);
  __Pyx_INCREF(__pyx_v_depth_buff_avg_np);
  __Pyx_GIVEREF(__pyx_v_depth_buff_avg_np);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_v_depth_buff_avg_np) != (0)) __PYX_ERR(0, 402, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_1);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_t_1) != (0)) __PYX_ERR(0, 402, __pyx_L1_error);
  __pyx_t_1 = 0;
  __pyx_r = ((PyObject*)__pyx_t_9);
  __pyx_t_9 = 0;
  goto __pyx_L0;
 403: 
 404: #///////////////////////////////////////////////////////////////////////////////
+405: @cython.ccall # python+C or cython.cfunc for C only
static PyObject *__pyx_pw_6pyvale_9sensorsim_6cython_10rastercyth_5raster_deform_frame(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static PyObject *__pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_raster_deform_frame(CYTHON_UNUSED __Pyx_memviewslice __pyx_v_coords, CYTHON_UNUSED __Pyx_memviewslice __pyx_v_connect, CYTHON_UNUSED __Pyx_memviewslice __pyx_v_fields_to_render, CYTHON_UNUSED PyObject *__pyx_v_cam_data, CYTHON_UNUSED __Pyx_memviewslice __pyx_v_field_disp, CYTHON_UNUSED int __pyx_skip_dispatch) {
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_r = ((PyObject*)Py_None); __Pyx_INCREF(Py_None);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
/* Python wrapper */
static PyObject *__pyx_pw_6pyvale_9sensorsim_6cython_10rastercyth_5raster_deform_frame(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static PyMethodDef __pyx_mdef_6pyvale_9sensorsim_6cython_10rastercyth_5raster_deform_frame = {"raster_deform_frame", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_6pyvale_9sensorsim_6cython_10rastercyth_5raster_deform_frame, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_6pyvale_9sensorsim_6cython_10rastercyth_5raster_deform_frame(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  __Pyx_memviewslice __pyx_v_coords = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_connect = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_fields_to_render = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_cam_data = 0;
  __Pyx_memviewslice __pyx_v_field_disp = { 0, 0, { 0 }, { 0 }, { 0 } };
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("raster_deform_frame (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_coords,&__pyx_mstate_global->__pyx_n_u_connect,&__pyx_mstate_global->__pyx_n_u_fields_to_render,&__pyx_mstate_global->__pyx_n_u_cam_data,&__pyx_mstate_global->__pyx_n_u_field_disp,0};
  PyObject* values[5] = {0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 405, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 405, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 405, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 405, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 405, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 405, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "raster_deform_frame", 0) < (0)) __PYX_ERR(0, 405, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 5; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("raster_deform_frame", 1, 5, 5, i); __PYX_ERR(0, 405, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 5)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 405, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 405, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 405, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 405, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 405, __pyx_L3_error)
    }
    __pyx_v_coords = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_coords.memview)) __PYX_ERR(0, 409, __pyx_L3_error)
    __pyx_v_connect = __Pyx_PyObject_to_MemoryviewSlice_dsds_size_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_connect.memview)) __PYX_ERR(0, 410, __pyx_L3_error)
    __pyx_v_fields_to_render = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_fields_to_render.memview)) __PYX_ERR(0, 411, __pyx_L3_error)
    __pyx_v_cam_data = values[3];
    __pyx_v_field_disp = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_field_disp.memview)) __PYX_ERR(0, 413, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("raster_deform_frame", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 405, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_coords, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_connect, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_fields_to_render, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_field_disp, 1);
  __Pyx_AddTraceback("pyvale.sensorsim.cython.rastercyth.raster_deform_frame", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_coords.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "coords"); __PYX_ERR(0, 409, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_connect.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "connect"); __PYX_ERR(0, 410, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_fields_to_render.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "fields_to_render"); __PYX_ERR(0, 411, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_field_disp.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "field_disp"); __PYX_ERR(0, 413, __pyx_L1_error)
  }
  __pyx_r = __pyx_pf_6pyvale_9sensorsim_6cython_10rastercyth_4raster_deform_frame(__pyx_self, __pyx_v_coords, __pyx_v_connect, __pyx_v_fields_to_render, __pyx_v_cam_data, __pyx_v_field_disp);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  goto __pyx_L7_cleaned_up;
  __pyx_L0:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __pyx_L7_cleaned_up:;
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_coords, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_connect, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_fields_to_render, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_field_disp, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyvale_9sensorsim_6cython_10rastercyth_4raster_deform_frame(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_coords, __Pyx_memviewslice __pyx_v_connect, __Pyx_memviewslice __pyx_v_fields_to_render, PyObject *__pyx_v_cam_data, __Pyx_memviewslice __pyx_v_field_disp) {
  PyObject *__pyx_r = NULL;
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_v_coords.memview)) { __Pyx_RaiseUnboundLocalError("coords"); __PYX_ERR(0, 405, __pyx_L1_error) }
  if (unlikely(((PyObject *) __pyx_v_coords.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 405, __pyx_L1_error)
  }
  if (unlikely(!__pyx_v_connect.memview)) { __Pyx_RaiseUnboundLocalError("connect"); __PYX_ERR(0, 405, __pyx_L1_error) }
  if (unlikely(((PyObject *) __pyx_v_connect.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 405, __pyx_L1_error)
  }
  if (unlikely(!__pyx_v_fields_to_render.memview)) { __Pyx_RaiseUnboundLocalError("fields_to_render"); __PYX_ERR(0, 405, __pyx_L1_error) }
  if (unlikely(((PyObject *) __pyx_v_fields_to_render.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 405, __pyx_L1_error)
  }
  if (unlikely(!__pyx_v_field_disp.memview)) { __Pyx_RaiseUnboundLocalError("field_disp"); __PYX_ERR(0, 405, __pyx_L1_error) }
  if (unlikely(((PyObject *) __pyx_v_field_disp.memview) == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
    __PYX_ERR(0, 405, __pyx_L1_error)
  }
  __pyx_t_1 = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_raster_deform_frame(__pyx_v_coords, __pyx_v_connect, __pyx_v_fields_to_render, __pyx_v_cam_data, __pyx_v_field_disp, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 405, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("pyvale.sensorsim.cython.rastercyth.raster_deform_frame", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_PyDict_NewPresized(5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 405, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_coords, __pyx_mstate_global->__pyx_kp_u_cython_double) < (0)) __PYX_ERR(0, 405, __pyx_L1_error)
  if (PyDict_SetItem(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_connect, __pyx_mstate_global->__pyx_kp_u_cython_size_t) < (0)) __PYX_ERR(0, 405, __pyx_L1_error)
  if (PyDict_SetItem(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_fields_to_render, __pyx_mstate_global->__pyx_kp_u_cython_double) < (0)) __PYX_ERR(0, 405, __pyx_L1_error)
  if (PyDict_SetItem(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_cam_data, __pyx_mstate_global->__pyx_n_u_CameraData) < (0)) __PYX_ERR(0, 405, __pyx_L1_error)
  if (PyDict_SetItem(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_field_disp, __pyx_mstate_global->__pyx_kp_u_cython_double) < (0)) __PYX_ERR(0, 405, __pyx_L1_error)
  __pyx_t_5 = __Pyx_CyFunction_New(&__pyx_mdef_6pyvale_9sensorsim_6cython_10rastercyth_5raster_deform_frame, 0, __pyx_mstate_global->__pyx_n_u_raster_deform_frame, NULL, __pyx_mstate_global->__pyx_n_u_pyvale_sensorsim_cython_rastercy, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[2])); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 405, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_5);
  #endif
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_5, __pyx_t_4);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_raster_deform_frame, __pyx_t_5) < (0)) __PYX_ERR(0, 405, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 406: @cython.boundscheck(False) # Turn off array bounds checking
 407: @cython.wraparound(False)  # Turn off negative indexing
 408: @cython.cdivision(True)    # Turn off divide by zero check
 409: def raster_deform_frame(coords: cython.double[:,:],
 410:                         connect: cython.size_t[:,:],
 411:                         fields_to_render: cython.double[:,:],
 412:                         cam_data: CameraData,
 413:                         field_disp: cython.double[:,:],
 414:                         ) -> tuple[np.ndarray,np.ndarray,int]:
 415:     pass
 416: 
 417: #///////////////////////////////////////////////////////////////////////////////
 418: #@cython.nogil
+419: @cython.cfunc # python+C or cython.cfunc for C only
static size_t __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth__raster_frame(__Pyx_memviewslice __pyx_v_coords, __Pyx_memviewslice __pyx_v_connect, __Pyx_memviewslice __pyx_v_fields_to_render, __Pyx_memviewslice __pyx_v_world_to_cam_mat, __Pyx_memviewslice __pyx_v_num_pixels, __Pyx_memviewslice __pyx_v_image_dims, double __pyx_v_image_dist, int __pyx_v_sub_samp, __Pyx_memviewslice __pyx_v_image_buff_avg, __Pyx_memviewslice __pyx_v_depth_buff_avg, __Pyx_memviewslice __pyx_v_image_buff_subpx, __Pyx_memviewslice __pyx_v_depth_buff_subpx, __Pyx_memviewslice __pyx_v_nodes_raster_buff, __Pyx_memviewslice __pyx_v_field_raster_buff, __Pyx_memviewslice __pyx_v_px_coord_buff, __Pyx_memviewslice __pyx_v_weights_buff) {
  size_t __pyx_v_xx;
  size_t __pyx_v_yy;
  size_t __pyx_v_zz;
  size_t __pyx_v_elem_count;
  size_t __pyx_v_nodes_per_elem;
  size_t __pyx_v_fields_num;
  double __pyx_v_tol;
  size_t __pyx_v_elems_in_image;
  double __pyx_v_coord_step;
  double __pyx_v_coord_offset;
  size_t __pyx_v_ee;
  size_t __pyx_v_nn;
  CYTHON_UNUSED size_t __pyx_v_ii;
  CYTHON_UNUSED size_t __pyx_v_jj;
  size_t __pyx_v_ww;
  size_t __pyx_v_ff;
  double __pyx_v_elem_area;
  double __pyx_v_x_min;
  double __pyx_v_x_max;
  double __pyx_v_y_min;
  double __pyx_v_y_max;
  size_t __pyx_v_xi_min;
  size_t __pyx_v_xi_max;
  size_t __pyx_v_yi_min;
  size_t __pyx_v_yi_max;
  size_t __pyx_v_num_bound_x;
  size_t __pyx_v_num_bound_y;
  double __pyx_v_bound_coord_x;
  double __pyx_v_bound_coord_y;
  size_t __pyx_v_bound_ind_x;
  size_t __pyx_v_bound_ind_y;
  double __pyx_v_weight_dot_nodes;
  double __pyx_v_px_coord_z;
  double __pyx_v_px_field;
  size_t __pyx_r;
 420: @cython.boundscheck(False) # Turn off array bounds checking
 421: @cython.wraparound(False)  # Turn off negative indexing
 422: @cython.cdivision(True)    # Turn off divide by zero check
 423: @cython.exceptval(check=False) # Turn off exceptions
 424: def _raster_frame(coords: cython.double[:,:],
 425:                  connect: cython.size_t[:,:],
 426:                  fields_to_render: cython.double[:,:],
 427:                  world_to_cam_mat: cython.double[:,:],
 428:                  num_pixels: cython.int[:],
 429:                  image_dims: cython.double[:],
 430:                  image_dist: cython.double,
 431:                  sub_samp: cython.int,
 432:                  # From here these are memory buffers that will be written into
 433:                  image_buff_avg: cython.double[:,:,:],
 434:                  depth_buff_avg: cython.double[:,:],
 435:                  image_buff_subpx: cython.double[:,:,:],
 436:                  depth_buff_subpx: cython.double[:,:],
 437:                  nodes_raster_buff: cython.double[:,:],
 438:                  field_raster_buff: cython.double[:],
 439:                  px_coord_buff: cython.double[:],
 440:                  weights_buff: cython.double[:],
 441:                  ) -> cython.size_t:
 442:     """Rasters a single frame and all associated fields into the image and depth
 443:     buffer provided as inputs to the function. This is a pure cython function
 444:     with the GIL released for parallelisation. All fields (textures) are
 445:     rendered in a sub-loop so that the depth buffer and inside/outside test is
 446:     only performed once for all fields to be rendered.
 447: 
 448:     Parameters
 449:     ----------
 450:     coords : cython.double[:,:]
 451:         Input. shape=(num_nodes,coords[x,y,z,w])
 452:     connect : cython.size_t[:,:]
 453:         Input. shape=(num_elems,nodes_per_elem)
 454:     fields_to_render : cython.double[:,:]
 455:         Input. shape=(num_nodes,num_fields)
 456:     world_to_cam_mat : cython.double[:,:]
 457:         Input. Homogeneous coordinate transformation matrix from world to camera
 458:          coordinates. shape=(4,4).
 459:     num_pixels : cython.int[:]
 460:         Input. shape=(2 [num_px_x,num_px_y],)
 461:     image_dims : cython.double[:]
 462:         Input. shape=(2 [fov_size_x,fov_size_y],)
 463:     image_dist : cython.double
 464:         Input.
 465:     sub_samp : cython.int
 466:         Number of subsamples per pixel for anti-aliasing.
 467:     image_buff_avg : cython.double[:,:,:]
 468:         Output buffer. shape=(num_px_y,num_px_x,num_fields)
 469:     depth_buff_avg : cython.double[:,:]
 470:         Output buffer. shape=(num_px_y,num_px_x)
 471:     image_buff_subpx : cython.double[:,:,:]
 472:         Processing buffer (output). shape=(num_subpx_y,num_subpx_x,num_fields)
 473:     depth_buff_subpx : cython.double[:,:]
 474:         Processing buffer (output). shape=(num_subpx_y,num_subpx_x)
 475:     nodes_raster_buff : cython.double[:,:]
 476:         Processing buffer. shape=(nodes_per_elem, 4 coord[x,y,z,w])
 477:     field_raster_buff : cython.double[:]
 478:         Processing buffer. shape=(nodes_per_elem,)
 479:     px_coord_buff : cython.double[:]
 480:         Processing buffer. shape=(2,)
 481:     weights_buff : cython.double[:]
 482:         Processing buffer. shape=(nodes_per_elem,)
 483: 
 484:     Returns
 485:     -------
 486:     cython.size_t
 487:         Number of rendered elements after backface culling and cropping.
 488:     """
 489: 
+490:     xx: cython.size_t = 0
  __pyx_v_xx = 0;
+491:     yy: cython.size_t = 1
  __pyx_v_yy = 1;
+492:     zz: cython.size_t = 2
  __pyx_v_zz = 2;
 493: 
+494:     elem_count: cython.size_t = connect.shape[0]
  __pyx_v_elem_count = (__pyx_v_connect.shape[0]);
+495:     nodes_per_elem: cython.size_t = connect.shape[1]
  __pyx_v_nodes_per_elem = (__pyx_v_connect.shape[1]);
+496:     fields_num: cython.size_t = fields_to_render.shape[1]
  __pyx_v_fields_num = (__pyx_v_fields_to_render.shape[1]);
 497: 
 498:     # tolerance for floating point zero dot product
+499:     tol: cython.double = 1e-12
  __pyx_v_tol = 1e-12;
 500: 
 501:     #elem_count: cython.size_t = 1
+502:     elems_in_image: cython.size_t = 0
  __pyx_v_elems_in_image = 0;
 503: 
 504:     # Lifted constants
+505:     coord_step: cython.double = 1.0/float(sub_samp)
  __pyx_v_coord_step = (1.0 / ((double)__pyx_v_sub_samp));
+506:     coord_offset: cython.double = 1.0/(2.0*float(sub_samp))
  __pyx_v_coord_offset = (1.0 / (2.0 * ((double)__pyx_v_sub_samp)));
 507: 
+508:     ee: cython.size_t = 0
  __pyx_v_ee = 0;
+509:     nn: cython.size_t = 0
  __pyx_v_nn = 0;
+510:     ii: cython.size_t = 0
  __pyx_v_ii = 0;
+511:     jj: cython.size_t = 0
  __pyx_v_jj = 0;
+512:     ww: cython.size_t = 0
  __pyx_v_ww = 0;
+513:     ff: cython.size_t = 0
  __pyx_v_ff = 0;
 514: 
+515:     for ee in range(elem_count):
  __pyx_t_1 = __pyx_v_elem_count;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_ee = __pyx_t_3;
 516: 
+517:         for nn in range(nodes_per_elem):
    __pyx_t_4 = __pyx_v_nodes_per_elem;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_nn = __pyx_t_6;
 518:             # shape=(nodes_per_elem, coord[X,Y,Z,W])
+519:             nodes_raster_buff[nn,:] = world_to_raster_coords(coords[connect[ee,nn],:],
      __pyx_t_7 = __pyx_v_ee;
      __pyx_t_8 = __pyx_v_nn;
      __pyx_t_9.data = __pyx_v_coords.data;
      __pyx_t_9.memview = __pyx_v_coords.memview;
      __PYX_INC_MEMVIEW(&__pyx_t_9, 1);
      {
    Py_ssize_t __pyx_tmp_idx = (*((size_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_connect.data + __pyx_t_7 * __pyx_v_connect.strides[0]) ) + __pyx_t_8 * __pyx_v_connect.strides[1]) )));
    Py_ssize_t __pyx_tmp_stride = __pyx_v_coords.strides[0];
        __pyx_t_9.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_9.shape[0] = __pyx_v_coords.shape[1];
__pyx_t_9.strides[0] = __pyx_v_coords.strides[1];
    __pyx_t_9.suboffsets[0] = -1;

if (unlikely(((PyObject *) __pyx_t_9.memview) == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
        __PYX_ERR(0, 519, __pyx_L1_error)
      }
/* … */
      __pyx_t_11 = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_world_to_raster_coords(__pyx_t_9, __pyx_v_world_to_cam_mat, __pyx_v_image_dist, __pyx_v_image_dims, __pyx_v_num_pixels, __pyx_t_10); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 519, __pyx_L1_error)
      __PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 1);
      __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
      __PYX_XCLEAR_MEMVIEW(&__pyx_t_10, 1);
      __pyx_t_10.memview = NULL; __pyx_t_10.data = NULL;
      __pyx_t_10.data = __pyx_v_nodes_raster_buff.data;
      __pyx_t_10.memview = __pyx_v_nodes_raster_buff.memview;
      __PYX_INC_MEMVIEW(&__pyx_t_10, 1);
      {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_nn;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_nodes_raster_buff.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_nodes_raster_buff.shape[1];
__pyx_t_10.strides[0] = __pyx_v_nodes_raster_buff.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

if (unlikely((__pyx_memoryview_copy_contents(__pyx_t_11, __pyx_t_10, 1, 1, 0) < 0))) __PYX_ERR(0, 519, __pyx_L1_error)
      __PYX_XCLEAR_MEMVIEW(&__pyx_t_10, 1);
      __pyx_t_10.memview = NULL; __pyx_t_10.data = NULL;
      __PYX_XCLEAR_MEMVIEW(&__pyx_t_11, 1);
      __pyx_t_11.memview = NULL; __pyx_t_11.data = NULL;
    }
 520:                                                         world_to_cam_mat,
 521:                                                         image_dist,
 522:                                                         image_dims,
 523:                                                         num_pixels,
+524:                                                         nodes_raster_buff[nn,:])
      __pyx_t_10.data = __pyx_v_nodes_raster_buff.data;
      __pyx_t_10.memview = __pyx_v_nodes_raster_buff.memview;
      __PYX_INC_MEMVIEW(&__pyx_t_10, 1);
      {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_nn;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_nodes_raster_buff.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_nodes_raster_buff.shape[1];
__pyx_t_10.strides[0] = __pyx_v_nodes_raster_buff.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

if (unlikely(((PyObject *) __pyx_t_10.memview) == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
        __PYX_ERR(0, 524, __pyx_L1_error)
      }
 525: 
 526: 
+527:         elem_area: cython.double = edge_function(nodes_raster_buff[0,:],
    __pyx_t_11.data = __pyx_v_nodes_raster_buff.data;
    __pyx_t_11.memview = __pyx_v_nodes_raster_buff.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_11, 1);
    {
    Py_ssize_t __pyx_tmp_idx = 0;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_nodes_raster_buff.strides[0];
        __pyx_t_11.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_11.shape[0] = __pyx_v_nodes_raster_buff.shape[1];
__pyx_t_11.strides[0] = __pyx_v_nodes_raster_buff.strides[1];
    __pyx_t_11.suboffsets[0] = -1;

if (unlikely(((PyObject *) __pyx_t_11.memview) == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
      __PYX_ERR(0, 527, __pyx_L1_error)
    }
/* … */
    __pyx_v_elem_area = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_edge_function(__pyx_t_11, __pyx_t_10, __pyx_t_9);
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_11, 1);
    __pyx_t_11.memview = NULL; __pyx_t_11.data = NULL;
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_10, 1);
    __pyx_t_10.memview = NULL; __pyx_t_10.data = NULL;
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 1);
    __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
+528:                                                  nodes_raster_buff[1,:],
    __pyx_t_10.data = __pyx_v_nodes_raster_buff.data;
    __pyx_t_10.memview = __pyx_v_nodes_raster_buff.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_10, 1);
    {
    Py_ssize_t __pyx_tmp_idx = 1;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_nodes_raster_buff.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_nodes_raster_buff.shape[1];
__pyx_t_10.strides[0] = __pyx_v_nodes_raster_buff.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

if (unlikely(((PyObject *) __pyx_t_10.memview) == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
      __PYX_ERR(0, 528, __pyx_L1_error)
    }
+529:                                                  nodes_raster_buff[2,:])
    __pyx_t_9.data = __pyx_v_nodes_raster_buff.data;
    __pyx_t_9.memview = __pyx_v_nodes_raster_buff.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_9, 1);
    {
    Py_ssize_t __pyx_tmp_idx = 2;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_nodes_raster_buff.strides[0];
        __pyx_t_9.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_9.shape[0] = __pyx_v_nodes_raster_buff.shape[1];
__pyx_t_9.strides[0] = __pyx_v_nodes_raster_buff.strides[1];
    __pyx_t_9.suboffsets[0] = -1;

if (unlikely(((PyObject *) __pyx_t_9.memview) == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
      __PYX_ERR(0, 529, __pyx_L1_error)
    }
 530: 
+531:         if elem_area < -tol: # Backface culling
    __pyx_t_12 = (__pyx_v_elem_area < (-__pyx_v_tol));
    if (__pyx_t_12) {
/* … */
    }
+532:             continue
      goto __pyx_L3_continue;
 533: 
 534:         # print(f"{nodes_raster_buff[0,0]},{nodes_raster_buff[0,1]},{nodes_raster_buff[0,2]}")
 535:         # print(f"{nodes_raster_buff[1,0]},{nodes_raster_buff[1,1]},{nodes_raster_buff[1,2]}")
 536:         # print(f"{nodes_raster_buff[2,0]},{nodes_raster_buff[2,1]},{nodes_raster_buff[2,2]}")
 537:         # print(f"{ee} ELEM AREA : {elem_area}")
 538:         # print()
 539: 
+540:         x_min: cython.double = vec_min_double(nodes_raster_buff[:,xx])
    __pyx_t_9.data = __pyx_v_nodes_raster_buff.data;
    __pyx_t_9.memview = __pyx_v_nodes_raster_buff.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_9, 1);
    __pyx_t_9.shape[0] = __pyx_v_nodes_raster_buff.shape[0];
__pyx_t_9.strides[0] = __pyx_v_nodes_raster_buff.strides[0];
    __pyx_t_9.suboffsets[0] = -1;

{
    Py_ssize_t __pyx_tmp_idx = __pyx_v_xx;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_nodes_raster_buff.strides[1];
        __pyx_t_9.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

if (unlikely(((PyObject *) __pyx_t_9.memview) == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
      __PYX_ERR(0, 540, __pyx_L1_error)
    }
    __pyx_v_x_min = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_vec_min_double(__pyx_t_9);
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 1);
    __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
+541:         x_max: cython.double = vec_max_double(nodes_raster_buff[:,xx])
    __pyx_t_9.data = __pyx_v_nodes_raster_buff.data;
    __pyx_t_9.memview = __pyx_v_nodes_raster_buff.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_9, 1);
    __pyx_t_9.shape[0] = __pyx_v_nodes_raster_buff.shape[0];
__pyx_t_9.strides[0] = __pyx_v_nodes_raster_buff.strides[0];
    __pyx_t_9.suboffsets[0] = -1;

{
    Py_ssize_t __pyx_tmp_idx = __pyx_v_xx;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_nodes_raster_buff.strides[1];
        __pyx_t_9.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

if (unlikely(((PyObject *) __pyx_t_9.memview) == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
      __PYX_ERR(0, 541, __pyx_L1_error)
    }
    __pyx_v_x_max = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_vec_max_double(__pyx_t_9);
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 1);
    __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
 542: 
+543:         if ((x_min > num_pixels[xx]-1) or (x_max < 0)): # x crop
    __pyx_t_4 = __pyx_v_xx;
    __pyx_t_13 = (__pyx_v_x_min > ((*((int *) ( /* dim=0 */ (__pyx_v_num_pixels.data + __pyx_t_4 * __pyx_v_num_pixels.strides[0]) ))) - 1));
    if (!__pyx_t_13) {
    } else {
      __pyx_t_12 = __pyx_t_13;
      goto __pyx_L9_bool_binop_done;
    }
    __pyx_t_13 = (__pyx_v_x_max < 0.0);
    __pyx_t_12 = __pyx_t_13;
    __pyx_L9_bool_binop_done:;
    if (__pyx_t_12) {
/* … */
    }
+544:             continue
      goto __pyx_L3_continue;
 545: 
+546:         y_min: cython.double = vec_min_double(nodes_raster_buff[:,yy])
    __pyx_t_9.data = __pyx_v_nodes_raster_buff.data;
    __pyx_t_9.memview = __pyx_v_nodes_raster_buff.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_9, 1);
    __pyx_t_9.shape[0] = __pyx_v_nodes_raster_buff.shape[0];
__pyx_t_9.strides[0] = __pyx_v_nodes_raster_buff.strides[0];
    __pyx_t_9.suboffsets[0] = -1;

{
    Py_ssize_t __pyx_tmp_idx = __pyx_v_yy;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_nodes_raster_buff.strides[1];
        __pyx_t_9.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

if (unlikely(((PyObject *) __pyx_t_9.memview) == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
      __PYX_ERR(0, 546, __pyx_L1_error)
    }
    __pyx_v_y_min = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_vec_min_double(__pyx_t_9);
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 1);
    __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
+547:         y_max: cython.double = vec_max_double(nodes_raster_buff[:,yy])
    __pyx_t_9.data = __pyx_v_nodes_raster_buff.data;
    __pyx_t_9.memview = __pyx_v_nodes_raster_buff.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_9, 1);
    __pyx_t_9.shape[0] = __pyx_v_nodes_raster_buff.shape[0];
__pyx_t_9.strides[0] = __pyx_v_nodes_raster_buff.strides[0];
    __pyx_t_9.suboffsets[0] = -1;

{
    Py_ssize_t __pyx_tmp_idx = __pyx_v_yy;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_nodes_raster_buff.strides[1];
        __pyx_t_9.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

if (unlikely(((PyObject *) __pyx_t_9.memview) == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
      __PYX_ERR(0, 547, __pyx_L1_error)
    }
    __pyx_v_y_max = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_vec_max_double(__pyx_t_9);
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 1);
    __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
 548: 
+549:         if ((y_min > num_pixels[yy]-1) or (y_max < 0)): # y crop
    __pyx_t_4 = __pyx_v_yy;
    __pyx_t_13 = (__pyx_v_y_min > ((*((int *) ( /* dim=0 */ (__pyx_v_num_pixels.data + __pyx_t_4 * __pyx_v_num_pixels.strides[0]) ))) - 1));
    if (!__pyx_t_13) {
    } else {
      __pyx_t_12 = __pyx_t_13;
      goto __pyx_L12_bool_binop_done;
    }
    __pyx_t_13 = (__pyx_v_y_max < 0.0);
    __pyx_t_12 = __pyx_t_13;
    __pyx_L12_bool_binop_done:;
    if (__pyx_t_12) {
/* … */
    }
+550:             continue
      goto __pyx_L3_continue;
 551: 
 552:         # print(f"Elem {ee}: x, min {x_min}")
 553:         # print(f"Elem {ee}: x, max {x_max}")
 554:         # print(f"Elem {ee}: y, min {y_min}")
 555:         # print(f"Elem {ee}: y, max {y_max}\n")
 556: 
+557:         elems_in_image += 1
    __pyx_v_elems_in_image = (__pyx_v_elems_in_image + 1);
 558: 
+559:         xi_min: cython.size_t = bound_index_min(x_min)
    __pyx_v_xi_min = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_bound_index_min(__pyx_v_x_min);
+560:         xi_max: cython.size_t = bound_index_max(x_max,num_pixels[xx])
    __pyx_t_4 = __pyx_v_xx;
    __pyx_v_xi_max = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_bound_index_max(__pyx_v_x_max, (*((int *) ( /* dim=0 */ (__pyx_v_num_pixels.data + __pyx_t_4 * __pyx_v_num_pixels.strides[0]) ))));
+561:         yi_min: cython.size_t = bound_index_min(y_min)
    __pyx_v_yi_min = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_bound_index_min(__pyx_v_y_min);
+562:         yi_max: cython.size_t = bound_index_max(y_max,num_pixels[yy])
    __pyx_t_4 = __pyx_v_yy;
    __pyx_v_yi_max = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_bound_index_max(__pyx_v_y_max, (*((int *) ( /* dim=0 */ (__pyx_v_num_pixels.data + __pyx_t_4 * __pyx_v_num_pixels.strides[0]) ))));
 563: 
 564:         # print(f"Elem {ee}: xi, min {xi_min}")
 565:         # print(f"Elem {ee}: xi, max {xi_max}")
 566:         # print(f"Elem {ee}: yi, min {yi_min}")
 567:         # print(f"Elem {ee}: yi, max {yi_max}\n")
 568: 
+569:         for nn in range(nodes_per_elem):
    __pyx_t_4 = __pyx_v_nodes_per_elem;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_nn = __pyx_t_6;
+570:             nodes_raster_buff[nn,zz] = 1/nodes_raster_buff[nn,zz]
      __pyx_t_8 = __pyx_v_nn;
      __pyx_t_7 = __pyx_v_zz;
      __pyx_t_14 = __pyx_v_nn;
      __pyx_t_15 = __pyx_v_zz;
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_nodes_raster_buff.data + __pyx_t_14 * __pyx_v_nodes_raster_buff.strides[0]) ) + __pyx_t_15 * __pyx_v_nodes_raster_buff.strides[1]) )) = (1.0 / (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_nodes_raster_buff.data + __pyx_t_8 * __pyx_v_nodes_raster_buff.strides[0]) ) + __pyx_t_7 * __pyx_v_nodes_raster_buff.strides[1]) ))));
    }
 571: 
+572:         num_bound_x: cython.size_t = range_len_double(float(xi_min),
    __pyx_v_num_bound_x = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_range_len_double(((double)__pyx_v_xi_min), ((double)__pyx_v_xi_max), __pyx_v_coord_step);
 573:                                                       float(xi_max),
 574:                                                       coord_step)
+575:         num_bound_y: cython.size_t = range_len_double(float(yi_min),
    __pyx_v_num_bound_y = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_range_len_double(((double)__pyx_v_yi_min), ((double)__pyx_v_yi_max), __pyx_v_coord_step);
 576:                                                       float(yi_max),
 577:                                                       coord_step)
 578: 
+579:         bound_coord_x: cython.double = float(xi_min) + coord_offset
    __pyx_v_bound_coord_x = (((double)__pyx_v_xi_min) + __pyx_v_coord_offset);
+580:         bound_coord_y: cython.double = float(yi_min) + coord_offset
    __pyx_v_bound_coord_y = (((double)__pyx_v_yi_min) + __pyx_v_coord_offset);
 581: 
+582:         bound_ind_x: cython.size_t = sub_samp*xi_min
    __pyx_v_bound_ind_x = (__pyx_v_sub_samp * __pyx_v_xi_min);
+583:         bound_ind_y: cython.size_t = sub_samp*yi_min
    __pyx_v_bound_ind_y = (__pyx_v_sub_samp * __pyx_v_yi_min);
 584: 
 585:         # print(f"Elem {ee}: bound_coord_x={bound_coord_x}")
 586:         # print(f"Elem {ee}: bound_coord_y={bound_coord_y}")
 587:         # print(f"Elem {ee}: bound_ind_x={bound_ind_x}")
 588:         # print(f"Elem {ee}: bound_ind_y={bound_ind_y}")
 589:         # print(f"Elem {ee}: coord_step={coord_step}")
 590:         # print(f"Elem {ee}: num_bound_x={num_bound_x}")
 591:         # print(f"Elem {ee}: num_bound_x={num_bound_y}")
 592:         # print()
 593: 
 594: 
+595:         for jj in range(num_bound_y):
    __pyx_t_4 = __pyx_v_num_bound_y;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_jj = __pyx_t_6;
 596: 
+597:             bound_coord_x = float(xi_min) + coord_offset
      __pyx_v_bound_coord_x = (((double)__pyx_v_xi_min) + __pyx_v_coord_offset);
+598:             bound_ind_x: cython.size_t = sub_samp*xi_min
      __pyx_v_bound_ind_x = (__pyx_v_sub_samp * __pyx_v_xi_min);
 599: 
+600:             for ii in range(num_bound_x):
      __pyx_t_7 = __pyx_v_num_bound_x;
      __pyx_t_8 = __pyx_t_7;
      for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_8; __pyx_t_15+=1) {
        __pyx_v_ii = __pyx_t_15;
 601: 
+602:                 px_coord_buff[xx] = bound_coord_x
        __pyx_t_14 = __pyx_v_xx;
        *((double *) ( /* dim=0 */ (__pyx_v_px_coord_buff.data + __pyx_t_14 * __pyx_v_px_coord_buff.strides[0]) )) = __pyx_v_bound_coord_x;
+603:                 px_coord_buff[yy] = bound_coord_y
        __pyx_t_14 = __pyx_v_yy;
        *((double *) ( /* dim=0 */ (__pyx_v_px_coord_buff.data + __pyx_t_14 * __pyx_v_px_coord_buff.strides[0]) )) = __pyx_v_bound_coord_y;
 604: 
 605:                 # Check the edge functions for each edge one at a time, as soon
 606:                 # as one is outside we don't need to do anymore work
+607:                 weights_buff[0] = edge_function(nodes_raster_buff[1,:],
        __pyx_t_9.data = __pyx_v_nodes_raster_buff.data;
        __pyx_t_9.memview = __pyx_v_nodes_raster_buff.memview;
        __PYX_INC_MEMVIEW(&__pyx_t_9, 1);
        {
    Py_ssize_t __pyx_tmp_idx = 1;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_nodes_raster_buff.strides[0];
        __pyx_t_9.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_9.shape[0] = __pyx_v_nodes_raster_buff.shape[1];
__pyx_t_9.strides[0] = __pyx_v_nodes_raster_buff.strides[1];
    __pyx_t_9.suboffsets[0] = -1;

if (unlikely(((PyObject *) __pyx_t_9.memview) == Py_None)) {
          PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
          __PYX_ERR(0, 607, __pyx_L1_error)
        }
/* … */
        __pyx_t_16 = 0;
        *((double *) ( /* dim=0 */ (__pyx_v_weights_buff.data + __pyx_t_16 * __pyx_v_weights_buff.strides[0]) )) = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_edge_function(__pyx_t_9, __pyx_t_10, __pyx_v_px_coord_buff);
        __PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 1);
        __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
        __PYX_XCLEAR_MEMVIEW(&__pyx_t_10, 1);
        __pyx_t_10.memview = NULL; __pyx_t_10.data = NULL;
+608:                                                 nodes_raster_buff[2,:],
        __pyx_t_10.data = __pyx_v_nodes_raster_buff.data;
        __pyx_t_10.memview = __pyx_v_nodes_raster_buff.memview;
        __PYX_INC_MEMVIEW(&__pyx_t_10, 1);
        {
    Py_ssize_t __pyx_tmp_idx = 2;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_nodes_raster_buff.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_nodes_raster_buff.shape[1];
__pyx_t_10.strides[0] = __pyx_v_nodes_raster_buff.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

if (unlikely(((PyObject *) __pyx_t_10.memview) == Py_None)) {
          PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
          __PYX_ERR(0, 608, __pyx_L1_error)
        }
 609:                                                 px_coord_buff)
+610:                 if (weights_buff[0] < -tol):
        __pyx_t_16 = 0;
        __pyx_t_12 = ((*((double *) ( /* dim=0 */ (__pyx_v_weights_buff.data + __pyx_t_16 * __pyx_v_weights_buff.strides[0]) ))) < (-__pyx_v_tol));
        if (__pyx_t_12) {
/* … */
        }
+611:                     bound_coord_x += coord_step
          __pyx_v_bound_coord_x = (__pyx_v_bound_coord_x + __pyx_v_coord_step);
+612:                     bound_ind_x += 1
          __pyx_v_bound_ind_x = (__pyx_v_bound_ind_x + 1);
+613:                     continue
          goto __pyx_L18_continue;
 614: 
+615:                 weights_buff[1] = edge_function(nodes_raster_buff[2,:],
        __pyx_t_10.data = __pyx_v_nodes_raster_buff.data;
        __pyx_t_10.memview = __pyx_v_nodes_raster_buff.memview;
        __PYX_INC_MEMVIEW(&__pyx_t_10, 1);
        {
    Py_ssize_t __pyx_tmp_idx = 2;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_nodes_raster_buff.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_nodes_raster_buff.shape[1];
__pyx_t_10.strides[0] = __pyx_v_nodes_raster_buff.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

if (unlikely(((PyObject *) __pyx_t_10.memview) == Py_None)) {
          PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
          __PYX_ERR(0, 615, __pyx_L1_error)
        }
/* … */
        __pyx_t_16 = 1;
        *((double *) ( /* dim=0 */ (__pyx_v_weights_buff.data + __pyx_t_16 * __pyx_v_weights_buff.strides[0]) )) = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_edge_function(__pyx_t_10, __pyx_t_9, __pyx_v_px_coord_buff);
        __PYX_XCLEAR_MEMVIEW(&__pyx_t_10, 1);
        __pyx_t_10.memview = NULL; __pyx_t_10.data = NULL;
        __PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 1);
        __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
+616:                                                 nodes_raster_buff[0,:],
        __pyx_t_9.data = __pyx_v_nodes_raster_buff.data;
        __pyx_t_9.memview = __pyx_v_nodes_raster_buff.memview;
        __PYX_INC_MEMVIEW(&__pyx_t_9, 1);
        {
    Py_ssize_t __pyx_tmp_idx = 0;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_nodes_raster_buff.strides[0];
        __pyx_t_9.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_9.shape[0] = __pyx_v_nodes_raster_buff.shape[1];
__pyx_t_9.strides[0] = __pyx_v_nodes_raster_buff.strides[1];
    __pyx_t_9.suboffsets[0] = -1;

if (unlikely(((PyObject *) __pyx_t_9.memview) == Py_None)) {
          PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
          __PYX_ERR(0, 616, __pyx_L1_error)
        }
 617:                                                 px_coord_buff)
+618:                 if (weights_buff[1] < -tol):
        __pyx_t_16 = 1;
        __pyx_t_12 = ((*((double *) ( /* dim=0 */ (__pyx_v_weights_buff.data + __pyx_t_16 * __pyx_v_weights_buff.strides[0]) ))) < (-__pyx_v_tol));
        if (__pyx_t_12) {
/* … */
        }
+619:                     bound_coord_x += coord_step
          __pyx_v_bound_coord_x = (__pyx_v_bound_coord_x + __pyx_v_coord_step);
+620:                     bound_ind_x += 1
          __pyx_v_bound_ind_x = (__pyx_v_bound_ind_x + 1);
+621:                     continue
          goto __pyx_L18_continue;
 622: 
 623: 
+624:                 weights_buff[2] = edge_function(nodes_raster_buff[0,:],
        __pyx_t_9.data = __pyx_v_nodes_raster_buff.data;
        __pyx_t_9.memview = __pyx_v_nodes_raster_buff.memview;
        __PYX_INC_MEMVIEW(&__pyx_t_9, 1);
        {
    Py_ssize_t __pyx_tmp_idx = 0;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_nodes_raster_buff.strides[0];
        __pyx_t_9.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_9.shape[0] = __pyx_v_nodes_raster_buff.shape[1];
__pyx_t_9.strides[0] = __pyx_v_nodes_raster_buff.strides[1];
    __pyx_t_9.suboffsets[0] = -1;

if (unlikely(((PyObject *) __pyx_t_9.memview) == Py_None)) {
          PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
          __PYX_ERR(0, 624, __pyx_L1_error)
        }
/* … */
        __pyx_t_16 = 2;
        *((double *) ( /* dim=0 */ (__pyx_v_weights_buff.data + __pyx_t_16 * __pyx_v_weights_buff.strides[0]) )) = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_edge_function(__pyx_t_9, __pyx_t_10, __pyx_v_px_coord_buff);
        __PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 1);
        __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
        __PYX_XCLEAR_MEMVIEW(&__pyx_t_10, 1);
        __pyx_t_10.memview = NULL; __pyx_t_10.data = NULL;
+625:                                                 nodes_raster_buff[1,:],
        __pyx_t_10.data = __pyx_v_nodes_raster_buff.data;
        __pyx_t_10.memview = __pyx_v_nodes_raster_buff.memview;
        __PYX_INC_MEMVIEW(&__pyx_t_10, 1);
        {
    Py_ssize_t __pyx_tmp_idx = 1;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_nodes_raster_buff.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_nodes_raster_buff.shape[1];
__pyx_t_10.strides[0] = __pyx_v_nodes_raster_buff.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

if (unlikely(((PyObject *) __pyx_t_10.memview) == Py_None)) {
          PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
          __PYX_ERR(0, 625, __pyx_L1_error)
        }
 626:                                                 px_coord_buff)
+627:                 if (weights_buff[2] < -tol):
        __pyx_t_16 = 2;
        __pyx_t_12 = ((*((double *) ( /* dim=0 */ (__pyx_v_weights_buff.data + __pyx_t_16 * __pyx_v_weights_buff.strides[0]) ))) < (-__pyx_v_tol));
        if (__pyx_t_12) {
/* … */
        }
+628:                     bound_coord_x += coord_step
          __pyx_v_bound_coord_x = (__pyx_v_bound_coord_x + __pyx_v_coord_step);
+629:                     bound_ind_x += 1
          __pyx_v_bound_ind_x = (__pyx_v_bound_ind_x + 1);
+630:                     continue
          goto __pyx_L18_continue;
 631: 
 632:                 # if (ee%6) == 0:
 633:                 #     print(f"Elem: {ee}")
 634:                 #     print(f"x bound ind={bound_ind_x}, coord={bound_coord_x}")
 635:                 #     print(f"y bound ind={bound_ind_y}, coord={bound_coord_y}")
 636:                 #     print(f"weights=[{weights_buff[0]},{weights_buff[1]},{weights_buff[2]}]")
 637:                 #     print()
 638: 
 639: 
+640:                 for ww in range(nodes_per_elem):
        __pyx_t_14 = __pyx_v_nodes_per_elem;
        __pyx_t_17 = __pyx_t_14;
        for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_17; __pyx_t_18+=1) {
          __pyx_v_ww = __pyx_t_18;
+641:                     weights_buff[ww] = weights_buff[ww] / elem_area
          __pyx_t_19 = __pyx_v_ww;
          __pyx_t_20 = __pyx_v_ww;
          *((double *) ( /* dim=0 */ (__pyx_v_weights_buff.data + __pyx_t_20 * __pyx_v_weights_buff.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_weights_buff.data + __pyx_t_19 * __pyx_v_weights_buff.strides[0]) ))) / __pyx_v_elem_area);
        }
 642: 
+643:                 weight_dot_nodes: cython.double = vec_dot_double(
        __pyx_v_weight_dot_nodes = __pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_vec_dot_double(__pyx_v_weights_buff, __pyx_t_10);
        __PYX_XCLEAR_MEMVIEW(&__pyx_t_10, 1);
        __pyx_t_10.memview = NULL; __pyx_t_10.data = NULL;
 644:                                                     weights_buff,
+645:                                                     nodes_raster_buff[:,zz])
        __pyx_t_10.data = __pyx_v_nodes_raster_buff.data;
        __pyx_t_10.memview = __pyx_v_nodes_raster_buff.memview;
        __PYX_INC_MEMVIEW(&__pyx_t_10, 1);
        __pyx_t_10.shape[0] = __pyx_v_nodes_raster_buff.shape[0];
__pyx_t_10.strides[0] = __pyx_v_nodes_raster_buff.strides[0];
    __pyx_t_10.suboffsets[0] = -1;

{
    Py_ssize_t __pyx_tmp_idx = __pyx_v_zz;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_nodes_raster_buff.strides[1];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

if (unlikely(((PyObject *) __pyx_t_10.memview) == Py_None)) {
          PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
          __PYX_ERR(0, 645, __pyx_L1_error)
        }
 646: 
 647:                 # Check the depth buffer, if the element is behind move on
+648:                 px_coord_z: cython.double = 1/weight_dot_nodes
        __pyx_v_px_coord_z = (1.0 / __pyx_v_weight_dot_nodes);
+649:                 if px_coord_z >= depth_buff_subpx[bound_ind_y,bound_ind_x]:
        __pyx_t_14 = __pyx_v_bound_ind_y;
        __pyx_t_17 = __pyx_v_bound_ind_x;
        __pyx_t_12 = (__pyx_v_px_coord_z >= (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_depth_buff_subpx.data + __pyx_t_14 * __pyx_v_depth_buff_subpx.strides[0]) ) + __pyx_t_17 * __pyx_v_depth_buff_subpx.strides[1]) ))));
        if (__pyx_t_12) {
/* … */
        }
+650:                     bound_coord_x += coord_step
          __pyx_v_bound_coord_x = (__pyx_v_bound_coord_x + __pyx_v_coord_step);
+651:                     bound_ind_x += 1
          __pyx_v_bound_ind_x = (__pyx_v_bound_ind_x + 1);
+652:                     continue
          goto __pyx_L18_continue;
 653: 
 654:                 # We only need one depth buffer for all fields
+655:                 depth_buff_subpx[bound_ind_y,bound_ind_x] = px_coord_z
        __pyx_t_17 = __pyx_v_bound_ind_y;
        __pyx_t_14 = __pyx_v_bound_ind_x;
        *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_depth_buff_subpx.data + __pyx_t_17 * __pyx_v_depth_buff_subpx.strides[0]) ) + __pyx_t_14 * __pyx_v_depth_buff_subpx.strides[1]) )) = __pyx_v_px_coord_z;
 656: 
+657:                 for ff in range(fields_num):
        __pyx_t_14 = __pyx_v_fields_num;
        __pyx_t_17 = __pyx_t_14;
        for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_17; __pyx_t_18+=1) {
          __pyx_v_ff = __pyx_t_18;
+658:                     for nn in range(nodes_per_elem):
          __pyx_t_19 = __pyx_v_nodes_per_elem;
          __pyx_t_20 = __pyx_t_19;
          for (__pyx_t_21 = 0; __pyx_t_21 < __pyx_t_20; __pyx_t_21+=1) {
            __pyx_v_nn = __pyx_t_21;
 659: 
+660:                         field_raster_buff[nn] = (fields_to_render[connect[ee,nn],ff]
            __pyx_t_22 = __pyx_v_ee;
            __pyx_t_23 = __pyx_v_nn;
            __pyx_t_24 = (*((size_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_connect.data + __pyx_t_22 * __pyx_v_connect.strides[0]) ) + __pyx_t_23 * __pyx_v_connect.strides[1]) )));
            __pyx_t_25 = __pyx_v_ff;
/* … */
            __pyx_t_28 = __pyx_v_nn;
            *((double *) ( /* dim=0 */ (__pyx_v_field_raster_buff.data + __pyx_t_28 * __pyx_v_field_raster_buff.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fields_to_render.data + __pyx_t_24 * __pyx_v_fields_to_render.strides[0]) ) + __pyx_t_25 * __pyx_v_fields_to_render.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_nodes_raster_buff.data + __pyx_t_26 * __pyx_v_nodes_raster_buff.strides[0]) ) + __pyx_t_27 * __pyx_v_nodes_raster_buff.strides[1]) ))));
          }
+661:                                                 *nodes_raster_buff[nn,zz])
            __pyx_t_26 = __pyx_v_nn;
            __pyx_t_27 = __pyx_v_zz;
 662: 
 663:                     px_field: cython.double = (vec_dot_double(field_raster_buff,
 664:                                                               weights_buff)
+665:                                                               *px_coord_z)
          __pyx_v_px_field = (__pyx_f_6pyvale_9sensorsim_6cython_10rastercyth_vec_dot_double(__pyx_v_field_raster_buff, __pyx_v_weights_buff) * __pyx_v_px_coord_z);
 666: 
+667:                     image_buff_subpx[bound_ind_y,bound_ind_x,ff] = px_field
          __pyx_t_19 = __pyx_v_bound_ind_y;
          __pyx_t_20 = __pyx_v_bound_ind_x;
          __pyx_t_21 = __pyx_v_ff;
          *((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_image_buff_subpx.data + __pyx_t_19 * __pyx_v_image_buff_subpx.strides[0]) ) + __pyx_t_20 * __pyx_v_image_buff_subpx.strides[1]) ) + __pyx_t_21 * __pyx_v_image_buff_subpx.strides[2]) )) = __pyx_v_px_field;
        }
 668: 
 669:                 # end for(x) - increment the x coords
+670:                 bound_coord_x += coord_step
        __pyx_v_bound_coord_x = (__pyx_v_bound_coord_x + __pyx_v_coord_step);
+671:                 bound_ind_x += 1
        __pyx_v_bound_ind_x = (__pyx_v_bound_ind_x + 1);
        __pyx_L18_continue:;
      }
 672: 
 673:             # end for(y) - increment the y coords
+674:             bound_coord_y += coord_step
      __pyx_v_bound_coord_y = (__pyx_v_bound_coord_y + __pyx_v_coord_step);
+675:             bound_ind_y += 1
      __pyx_v_bound_ind_y = (__pyx_v_bound_ind_y + 1);
    }
    __pyx_L3_continue:;
  }
 676: 
+677:     _average_image(depth_buff_subpx,sub_samp,depth_buff_avg)
  (void)(__pyx_f_6pyvale_9sensorsim_6cython_10rastercyth__average_image(__pyx_v_depth_buff_subpx, __pyx_v_sub_samp, __pyx_v_depth_buff_avg));
 678: 
+679:     for ff in range(fields_num):
  __pyx_t_1 = __pyx_v_fields_num;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_ff = __pyx_t_3;
+680:         _average_image(image_buff_subpx[:,:,ff],
    __pyx_t_29.data = __pyx_v_image_buff_subpx.data;
    __pyx_t_29.memview = __pyx_v_image_buff_subpx.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_29, 1);
    __pyx_t_29.shape[0] = __pyx_v_image_buff_subpx.shape[0];
__pyx_t_29.strides[0] = __pyx_v_image_buff_subpx.strides[0];
    __pyx_t_29.suboffsets[0] = -1;

__pyx_t_29.shape[1] = __pyx_v_image_buff_subpx.shape[1];
__pyx_t_29.strides[1] = __pyx_v_image_buff_subpx.strides[1];
    __pyx_t_29.suboffsets[1] = -1;

{
    Py_ssize_t __pyx_tmp_idx = __pyx_v_ff;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_image_buff_subpx.strides[2];
        __pyx_t_29.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

if (unlikely(((PyObject *) __pyx_t_29.memview) == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
      __PYX_ERR(0, 680, __pyx_L1_error)
    }
/* … */
    (void)(__pyx_f_6pyvale_9sensorsim_6cython_10rastercyth__average_image(__pyx_t_29, __pyx_v_sub_samp, __pyx_t_30));
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_29, 1);
    __pyx_t_29.memview = NULL; __pyx_t_29.data = NULL;
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_30, 1);
    __pyx_t_30.memview = NULL; __pyx_t_30.data = NULL;
  }
 681:                         sub_samp,
+682:                         image_buff_avg[:,:,ff])
    __pyx_t_30.data = __pyx_v_image_buff_avg.data;
    __pyx_t_30.memview = __pyx_v_image_buff_avg.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_30, 1);
    __pyx_t_30.shape[0] = __pyx_v_image_buff_avg.shape[0];
__pyx_t_30.strides[0] = __pyx_v_image_buff_avg.strides[0];
    __pyx_t_30.suboffsets[0] = -1;

__pyx_t_30.shape[1] = __pyx_v_image_buff_avg.shape[1];
__pyx_t_30.strides[1] = __pyx_v_image_buff_avg.strides[1];
    __pyx_t_30.suboffsets[1] = -1;

{
    Py_ssize_t __pyx_tmp_idx = __pyx_v_ff;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_image_buff_avg.strides[2];
        __pyx_t_30.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

if (unlikely(((PyObject *) __pyx_t_30.memview) == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "cannot pass None into a C function argument that is declared 'not None'");
      __PYX_ERR(0, 682, __pyx_L1_error)
    }
 683: 
+684:     return elems_in_image
  __pyx_r = __pyx_v_elems_in_image;
  goto __pyx_L0;