vpVolumeNormals  compute surface normal vectors and gradient magnitudes for a
volume
#include <volpack.h>
vpResult
vpVolumeNormals(vpc, scalar_data, length,
scalar_field, grad_field, norm_field)

 vpContext *vpc;

 unsigned char *scalar_data;

 int length;

 int scalar_field;

 int grad_field;

 int norm_field;
 vpc
 VolPack context from vpCreateContext.
 scalar_data
 3D array of scalar samples.
 length
 Size of scalar_data array in bytes.
 scalar_field
 Voxel field number indicating the field in which to store the scalar
samples.
 grad_field
 Voxel field number indicating the field in which to store the gradient
magnitudes of the scalar samples.
 norm_field
 Voxel field number indicating the field in which to store encoded surface
normal vectors.
vpVolumeNormals is used to precompute values for voxel fields used in
classification and shading algorithms. The input is a 3D array of scalar
values; a separate routine is provided for processing scanlines of voxel data
(see vpScanlineNormals(3)). For each voxel, the routine computes an
approximation for the gradient of the scalar field (using a centraldifference
operator). From this vector the routine can compute the magnitude of the
gradient, which is useful for some classification schemes (see
vpSetClassifierTable(3)), and a surface normal vector in the direction of the
gradient vector, which is used to implement lighting models (see
vpShadeTable(3)). The scalar value, gradient magnitude and surface normal
vector are then stored into the fields of the voxel array, which is separate
from the array of scalar values.
The scalar array must be an array of 8bit values (other sizes are not currently
supported). The dimensions of the array must match the volume dimensions
previously specified with
vpSetVolumeSize. The
size argument is
used to make sure the array has the correct size. The voxel array must also be
initialized by calling
vpSetRawVoxels prior to calling
vpVolumeNormals.
The three voxel field number arguments indicate which voxel fields the computed
information should be stored into, and which field the scalar samples should
be copied to. The field numbers must correspond to appropriatelysized voxel
fields previously specified with
vpSetVoxelField. Any of these
arguments can be the constant VP_SKIP_FIELD, in which case the corresponding
quantity is not computed or copied. The voxel fields for the scalar value and
the gradient magnitude must be onebyte fields, and the field for the surface
normal vector must be a twobyte field. The constants VP_SCALAR_MAX,
VP_GRAD_MAX and VP_NORM_MAX give the maximum value that might be stored in
each field, respectively. The value stored in the surface normal vector field
is actually an encoded surface normal; see vpNormalIndex(3).
The normal return value is VP_OK. The following error return values are
possible:
 VPERROR_BAD_SIZE
 The size of the scalar array does not match the volume dimensions.
 VPERROR_BAD_VALUE
 One or more of the voxel fields specified is invalid, or the corresponding
voxel field has the wrong size.
 VPERROR_BAD_VOXEL
 The voxel size or the voxel fields have not been specified or have been
incorrectly specified.
 VPERROR_BAD_VOLUME
 The volume array or volume dimensions have not been specified, or the size
of the volume array does not match the volume dimensions.
VolPack(3), vpCreateContext(3), vpNormalIndex(3), vpScanlineNormals(3),
vpSetClassifierTable(3), vpSetLookupShader(3)