ProceduralTextureHandler
ProceduralTextureInterface

Availability LightWave 6.0 | Component Layout, Modeler | Header lwtexture.h

Fundamentally, a procedural texture is a function of three variables. In other words, given three numbers x, y and z, a procedural texture calculates and returns a fourth number t.

The variables are usually the coordinates of a 3D position, either in world space or in some idealized texture space, and the number returned by the function is used to modulate a rendering parameter, typically one of the surface attributes. LightWave's built-in fractal noise is an example of a procedural texture.

Some procedural textures will also return a gradient. Roughly speaking, this is the direction of the texture at the sample point, or the direction in which the value of the texture function increases the fastest. If the texture is being used as a bump map, the renderer can infer a bump normal from the gradient.

If your texture function is analytical, you can compute the gradient from the partial derivative of the function with respect to each axis. You aren't required to form the gradient that way, or at all. If the texture doesn't return a gradient, the renderer will calculate a numerical approximation by calling your texture function at six neighboring points.

Textures can also return a color. This is useful when the texture will be applied to the color channel of a surface or will modulate some other color-valued parameter.

Handler Activation Function

   XCALL_( int ) MyTexture( long version, GlobalFunc *global,
      LWTextureHandler *local, void *serverData );

The local argument to a texture's activation function is an LWTextureHandler.

   typedef struct st_LWTextureHandler {
      LWInstanceFuncs *inst;
      LWItemFuncs     *item;
      LWRenderFuncs   *rend;
      double          (*evaluate) (LWInstance, LWTextureAccess *);
      unsigned int    (*flags)    (LWInstance);
   } LWTextureHandler;

The first three members of this structure are the standard handler functions. In addition to these, a procedural texture provides an evaluation function and a flags function.

The context argument to the inst->create function is the LWTextureID for the texture. LWTextureID is defined in the lwtxtr.h header file and is used by the texture functions and texture editor globals.

A procedural texture can be activated by Modeler as well as Layout. When activated by Modeler, the LWItemFuncs pointer in the local data is NULL. Be sure to test for this before filling in the useItems and changeID fields. Note too that if your texture relies on Layout-only globals, those won't be available when Modeler calls your callbacks.

txval = evaluate( instance, access )
Returns a texture value, given the information in the access structure, described below.
flagbits = flags( instance )
Returns an int that tells LightWave about the texture. The return value can be any of the following flags combined using bitwise-or.
LWTEXF_GRAD
The texture returns a gradient (the evaluation function sets the value of the txGrad member of the access structure). If this flag isn't set, the texture engine ignores txGrad and, when necessary, calculates the gradient numerically (by evaluating 6 neighboring points).
LWTEXF_SLOWPREVIEW
Set this if the texture evaluates too slowly to be previewed in real time.
LWTEXF_AXIS
The texture uses an axis. The texture editor will allow the user to select an axis for the texture, and this selection will be found in the axis member of the access structure.
LWTEXF_AALIAS
The texture value is already antialiased. Currently ignored, but it may not be in the future.
LWTEXF_DISPLACE
Use the texture value for displacements. If this flag is set, the texture editor's axis selector is enabled and the displacement occurs along the selected axis. If this flag isn't set, but LWTEXF_GRAD is, the texture engine will use the gradient for displacements. If neither flag is set, no displacement will occur.
LWTEXF_HV_SRF
The texture is appropriate for use as a HyperVoxels surface texture. This basically means that the texture function is continuous and evaluates relatively quickly.
LWTEXF_HV_VOL
The texture is appropriate for use as a HyperVoxels volume texture. Efficiency is especially important for these textures.
LWTEXF_SELF_COLOR
The texture returns an RGBA color in addition to a value.

Interface Activation Function

   XCALL_( int ) MyInterface( long version, GlobalFunc *global,
      LWInterface *local, void *serverData );

This is the standard interface activation for handlers.

Texture Access

The access structure passed to the evaluation function contains parameters that can affect the texture value. The texture can return a gradient and a color through the txGrad and txRGBA fields. The other fields are read-only.

   typedef struct st_LWTextureAccess {
      double  wPos[3];
      double  tPos[3];
      double  size[3];
      double  amp;
      double  spotSize;
      double  txGrad[3];
      int     axis;
      int     flags;
      double  octaves;
      double  txRGBA[4];
   } LWTextureAccess;
wPos
The world coordinate position of the sample to be textured.
tPos
The position of the sample in texture coordinates.
size
The size of the texture. The size value is used to scale the texture spatially. The interpretation is up to the texture, but typically this is the size of a texture cell or the distance between repeating elements.
amp
The amplitude of the texture. This value is typically used to scale the magnitude or strength of the texture.
spotSize
The approximate diameter of the sample spot. This is useful when antialiasing the texture.
txGrad
Storage for the texture gradient at the sample. The evaluation function must fill this in when the flags function returns LWTEXF_GRAD. Otherwise it can be ignored.
axis
The texture axis selected by the user. Only valid if the flags function set the LWTEXF_AXIS or LWTEXF_DISPLACE flags.
flags
The access flags provide information about the context in which the evaluation function was called.
LWTXEF_VECTOR
Set when a bump is being evaluated.
LWTXEF_AXISX
LWTXEF_AXISY
LWTXEF_AXISZ
Which dimensions are used for evaluation. Currently, all three of these are always set, but in the future, the texture engine might evaluate the texture in 2D only, for example, and it would use these flags to allow the texture to switch to an evaluation optimized for 2D.
LWTXEF_DISPLACE
Set when a displacement is being evaluated.
LWTXEF_COLOR
Set when a color is being evaluated.
octaves
The number of octaves, or frequencies, that should be used by the texture. This affects the amount of structure the texture generates at different scales. This field is currently only initialized by HyperVoxels.
txRGBA
Storage for the texture color at the sample. The evaluation function must fill this in when the flags function returns LWTEXF_SELF_COLOR. Otherwise it can be ignored..

Example

The rapts sample contains 10 procedural textures.