Пример #1
0
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;
	}
}
Пример #2
0
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;

}