void DisplaceOperation::pixelTransform(const float xy[2], float r_uv[2], float r_deriv[2][2]) { float col[4]; float uv[2]; /* temporary variables for derivative estimation */ int num; m_inputScaleXProgram->readSampled(col, xy[0], xy[1], COM_PS_NEAREST); float xs = col[0]; m_inputScaleYProgram->readSampled(col, xy[0], xy[1], COM_PS_NEAREST); float ys = col[0]; /* clamp x and y displacement to triple image resolution - * to prevent hangs from huge values mistakenly plugged in eg. z buffers */ CLAMP(xs, -m_width_x4, m_width_x4); CLAMP(ys, -m_height_x4, m_height_x4); /* displaced pixel in uv coords, for image sampling */ read_displacement(xy[0], xy[1], xs, ys, xy, r_uv[0], r_uv[1]); /* Estimate partial derivatives using 1-pixel offsets */ const float epsilon[2] = { 1.0f, 1.0f }; zero_v2(r_deriv[0]); zero_v2(r_deriv[1]); num = 0; if (read_displacement(xy[0] + epsilon[0], xy[1], xs, ys, xy, uv[0], uv[1])) { r_deriv[0][0] += uv[0] - r_uv[0]; r_deriv[1][0] += uv[1] - r_uv[1]; ++num; } if (read_displacement(xy[0] - epsilon[0], xy[1], xs, ys, xy, uv[0], uv[1])) { r_deriv[0][0] += r_uv[0] - uv[0]; r_deriv[1][0] += r_uv[1] - uv[1]; ++num; } if (num > 0) { float numinv = 1.0f / (float)num; r_deriv[0][0] *= numinv; r_deriv[1][0] *= numinv; } num = 0; if (read_displacement(xy[0], xy[1] + epsilon[1], xs, ys, xy, uv[0], uv[1])) { r_deriv[0][1] += uv[0] - r_uv[0]; r_deriv[1][1] += uv[1] - r_uv[1]; ++num; } if (read_displacement(xy[0], xy[1] - epsilon[1], xs, ys, xy, uv[0], uv[1])) { r_deriv[0][1] += r_uv[0] - uv[0]; r_deriv[1][1] += r_uv[1] - uv[1]; ++num; } if (num > 0) { float numinv = 1.0f / (float)num; r_deriv[0][1] *= numinv; r_deriv[1][1] *= numinv; } }
int main(int argc, char **argv) { /* Read command line arguments */ read_command_line(argc,argv); /* Read Parameters from parameter file */ read_parameters(); /* read box from file header */ if (box_from_header) read_box(infilename); /* Initialize cell data structures */ init_cells(); /* Read coordinates and displacement */ read_displacement(infilename); /* Calculate strain tensor */ calc_strain(); /* Output strain tensor */ write_data(); return 0; }