home << prev next >> contents  


Auxiliary Functions

    miBoolean mi_lookup_color_texture(
        miColor         *color,
        miState         *state,
        miTag           tag,
        miVector        *coord)

tag is assumed to be a texture as taken from a color texture parameter of a shader. This function checks whether the tag refers to a shader (procedural texture) or an image, depending on which type of color texture statement was used in the .mi file. If tag is a shader, coord is stored in state→tex, the referenced texture shader is called, and its return value is returned. If tag is an image, coord is brought into the range (0..1, 0..1) by removing the integer part, the image is looked up at the resulting 2D coordinate, and miTRUE is returned. If the texture is marked with the filter keyword, multi-level pyramid filtering is performed, a procedure related to classical mip-map textures. In both cases, the color resulting from the lookup is stored in * color.

    typedef struct {
        miScalar        eccmax;
        miScalar        max_minor;
        miScalar        circle_radius;
        miBoolean       bilinear;
        miScalar        spare[10];
    } miTexfilter;

    miBoolean mi_lookup_filter_color_texture(
        miColor         *color,
        miState         *state,
        miTag           tag,
        miTexfilter     *paras,
        miMatrix        ST)

This function provides higher quality filtering than the multi-level pyramid filtering of mi_lookup_color_texture described above using a transformation ST which transforms the coordinate system centered in the current raster position in screen space to texture space. The functions mi_texture_filter_project and mi_texture_filter_transform are provided for helping to calculate this transformation matrix.

This function expects that tag does not refer to a texture shader, that is, it works only on texture images. It will return miFALSE when used with incorrect parameters or if a projection failed.

In the filtering algorithm a circle around the current raster position is projected to an ellipse in texture space, and returns the average color of all texture pixels inside the ellipse. If the texture defined by tag is a pyramid texture, multi-level lookup of the texture pixels is performed to speed up the filtering. In the algorithm the level calculation is based on the minor radius of the ellipse.

The filtering can be controlled by choosing different values in paras. If paras is a null, default values for medium filter quality are used.

The eccmax field in miTexfilter specifies the maximum allowed eccentricity of the ellipse. It must be equal to or greater than 1.0. The eccentricity is defined by the ratio of the major and minor radius. Under severe projective distortion the ellipse can have a very large eccentricity and too many texture pixels would be covered by the elliptical area, resulting in long rendering times. In order to limit the filtering time in these cases, the eccentricity threshold can be specified. If the eccentricity is greater than this value, the minor radius of the ellipse is made larger allowing for a potentially higher level in the texture image pyramid since the level calculation is based on the minor radius.

In this calculation a level is selected where the minor radius of the ellipse has a maximum length of max_minor texture pixels. In each successive level in the image pyramid the radius is divided by two, and there are fewer pixels inside the elliptical area. The useful range for eccmax is approximately 10 to 30, higher values will result in better antialiasing. For max_minor the range should be 3 to 8. Higher values result in better antialiasing.

The size of the projected screen-space circle can be modified with the circle_radius parameter. Larger values will result in more blurring since the elliptical area is also made larger. Smaller values will increase the aliasing. The useful range for this field is 0.4 to 1.0.

When a magnification area is detected, that is, an area in which the pixels are not compressed (the elliptical area is smaller than a texture pixel), bilinear texture pixel interpolation can be switched on by setting the bilinear field to miTRUE, which results in a more blurry image.

See page elltexex for an example.

    miBoolean mi_lookup_scalar_texture(
        miScalar        *scalar,
        miState         *state,
        miTag           tag,
        miVector        *coord)

This function is equivalent to mi_lookup_color_texture, except that tag is assumed to refer to a scalar texture shader or scalar image, as defined in the .mi file with a scalar texture statement, and a scalar is looked up returned in * scalar. Note that filtering of scalar textures (enabled with filter scalar texture statements) is supported only in mental ray 3.1.2 and later.

    miBoolean mi_lookup_vector_texture(
        miVector        *vector,
        miState         *state,
        miTag           tag,
        miVector        *coord)

This function is also equivalent to mi_lookup_color_texture, except that tag is assumed to refer to a vector texture shader or vector image, as defined in the .mi file with a vector texture statement, and a vector is looked up returned in * vector. Vector textures cannot be filtered.

    miBoolean mi_texture_filter_project(
        miVector        p[3],
        miVector        t[3],
        miState *const  state,
        miScalar        disc_r,
        miUint          space)

This function helps in calculating the screen to texture space transformation matrix required by mi_lookup_filter_color_texture. It projects three points including the current raster position onto the current intersection primitive (statepri) plane and calculates the texture coordinates in the intersections. If statepri is null, or if the projection fails, miFALSE is returned.

This function assumes that the current intersected object has a texture space associated and uses space as an index into the texture space. The three screen space points are returned in p, the corresponding two dimensional texture space points are put into t. The first point in the array is always the central raster position (0,0), the others are inside a disc with radius of disc_r from this central position. Note that the points are relative to the central position, absolute screen space coordinates are not used. The value of disc_r should be set to 0.5 in most cases, since the full pixel is projected to texture space. However, when there are highly curved objects in the scene, a smaller value can effectively remove projection problems where the projected points are far outside the hit triangle primitive.

    miBoolean mi_texture_filter_transform(
        miMatrix        ST,
        miVector        p[3],
        miVector        t[3])

This function helps in calculating the screen to texture space transformation matrix required by mi_lookup_filter_color_texture. The three two dimensional screen space points in p and the corresponding three two dimensional texture space points form a linear equation which is solved for the transformation matrix. See page elltexex for an example. This function returns miFALSE if the linear equation mentioned above has no solution.

    miScalar mi_luminance(
        miState         *state,
        miColor         *color);

Return the luminance of color, by multiplying each RGB component by a factor (default ) and adding the results. The factors can be changed with the luminance weight statement, or the luminance_weight field in the miOptions structure. The purpose of having a single function to do this calculation is to make luminance calculations in shaders consistent across all shaders, and making the weight easily changeable in one central place. This is for shaders only; mental ray does not calculate luminances or use the weights in any way.

    miBoolean mi_tri_vectors(
        miState         *state,
        int             which,
        int             ntex,
        miVector        **a,
        miVector        **b,
        miVector        **c)

All the information in the state pertains to the interpolated intersection point in a triangle. This function can be used to obtain information about the uninterpolated triangle vertices. Together with the barycentric coordinates in the state, parameters retrieved with mi_tri_vectors may be interpolated differently by the shader. The which argument is a character that controls which triple of vectors is to be retrieved:

which vector
'p' the points in space
'n' the normal vectors
'm' the motion vectors
't' the texture coordinates of texture space ntex
'u' the U bump basis vectors
'v' the V bump basis vectors
'U' the first surface derivative in U (d P du)
'V' the first surface derivative in U (d P dv)
'X' the second surface derivative d^2 P du^2
'Y' the second surface derivative d^2 P dv^2
'Z' the second surface derivative d^2 P du dv
'*' the user vectors

A pointer to the vectors is stored in * a, * b, and * c. The shader may not modify these vectors. They are stored in the space used when the scene was created (either object space or camera space depending on ); the original data is accessed without implicit transformation to internal space. If the requested triple is not available, miFALSE is returned. This function relies on ; it only works if the shader has not modified this variable, as some ray-marching volume shaders do.

This function may not be called in displacement shaders because triangles do not yet exist at that stage. Displacement displaces vertices, not triangles; triangles are built from final vertices later. It also may not be called for hair objects, because hair is not based on triangles. (mental ray 3.2 and later detect this case and return miFALSE for hair objects.)

    miBoolean mi_texture_interpolate(
        miState         *state,
        miUint          space,
        miScalar        *result)

3.4 This function interpolates the current intersection texture coordinates, using the barycentric coordinates from the state. The texture space index is given with space. The coordinates are written to the array result which must be allocated large enough according to the dimension of the texture space. This function is needed only for geometry with texture coordinates that have more or fewer than three dimensions. Standard 3D texture coordinates should be read from . Non-3D texture coordinates are supported only for subdivision surfaces and raw primitive lists. Use the miQ_TEXTURE_DIM mode of mi_query to find the dimension of a texture coordinate.

    miBoolean mi_raster_unit(
        miState         *state,
        miVector        *x,
        miVector        *y)

3.2 Transforms a pair of X and Y unit vectors in raster space to the current object space. In other words, the returned x and y vectors specify the size of a pixel in object space. This information is useful for selecting filter parameters in the shader, such as bump map precisions or texture lookups. This function assumes a pinhole camera. The orientation of the surface at the current shading point is not taken into account.

    miBoolean mi_query(
        const miQ_type  query,
        miState *const  state,
        miTag           tag,
        void * const    result,
        ...)

Return various pieces of information about the current state of mental ray. query is the request code specifying what piece of information to query; state is the shader state, tag is the tag of the DB element to query, if any, and result is a pointer to the variable to store the results in. Some queries do not require a tag; in this case miNULLTAG must be passed as tag. Some queries require extra arguments in addition to the four standard arguments. mi_query returns miFALSE if the queried value is not available or an unknown type code is used. The following query codes are available:

query code state tag result purpose
miQ_DATA_DECL N Y miTag user data declaration if any, or 0
miQ_DATA_LABEL N Y miUint translator-defined user data label
miQ_DATA_NEEDSWAP N Y miBoolean requires byte-swapping by shader
miQ_DATA_NEXT N Y miTag next user data block in chain, or 0
miQ_DATA_PARAM N Y char * user data contents
miQ_DATA_PARAM_SIZE N Y int size of user data block in bytes
miQ_DATE N N char * mental ray compilation date
miQ_DECL_LOCK N Y miLock * shared by all shader instances
miQ_DECL_NAME N Y char * shader name
miQ_DECL_PARAM N Y char * ascii-encoded parameter declaration
miQ_DECL_RESULT_SIZE N Y int result size, 4 unless struct
miQ_DECL_TYPE N Y int miTYPE_* result type
miQ_DECL_VERSION N Y int shader declaration version
miQ_FINALGATHER_STATE3.2 Y N int 0=not a finalgather ray (grand)child, 1=finalgather ray (grand)child in a tile rendering, 2=finalgather ray (grand)child in finalgather precomputing
miQ_SAMPLE_MOVING3.5 Y N int Not zero if mental ray has detected geometry motion for the current raster sample.
miQ_FUNC_CALLTYPE Y N int one of miSHADER_*, as specified by the calling mi_call_shader
miQ_FUNC_DECL N Y miTag tag of shader declaration
miQ_FUNC_INDIRECT N Y miTag take params from this shader
miQ_FUNC_LOCK N Y miLock * local shader instance lock
miQ_FUNC_NEXT N Y miTag next shader in shader list
miQ_FUNC_PARAM N Y void * shader parameters
miQ_FUNC_PARAM_SIZE N Y int size of shader parameters in bytes
miQ_FUNC_RESULT_SIZE N Y int shader result size in bytes
miQ_FUNC_TAG3.2 Y N miTag tag of the currently running shader
miQ_FUNC_TLS_GET Y N void * retrieve thread-local shader data pointer
miQ_FUNC_TLS_GETALL Y N void *, int get list of all valid thread-local shader data pointers, and the list size
miQ_FUNC_TLS_SET Y N void * set thread-local shader data pointer (see page querytls)
miQ_FUNC_TYPE N Y int 0=C/C++, 1=phen., 2=output file
miQ_FUNC_USERPTR N Y void ** user pointer in shader instance
miQ_GEO_DATA N N miTag user data block of current object
miQ_GEO_HAS_DERIVS3.2 Y N miBoolean * validity of state derivatives
miQ_GEO_HAS_DERIVS23.2 Y N miBoolean * validity of state second derivatives
miQ_GEO_LABEL N N miUint translator-defined triangle label
miQ_GLOBAL_LIGHTS N N miTag * array with global light tags
miQ_GROUP_DATA N Y miTag user data block
miQ_GROUP_KID N Y miTag nth child (n is fifth argument)
miQ_GROUP_LABEL N Y miUint translator-defined group label
miQ_GROUP_MERGE_GROUP N Y miBoolean miTRUE if connected
miQ_GROUP_NKIDS N Y int number of child instances
miQ_IMAGE_BITS N Y int num of bits per component (8,16,32)
miQ_IMAGE_COLORCLIP N N miBoolean color frame buffer color clipping mode
miQ_IMAGE_COMP N Y int num of components (1,2,3,4)
miQ_IMAGE_DESATURATE N N miBoolean color frame buffer desaturation mode
miQ_IMAGE_DITHER N N miBoolean color frame buffer dithering mode
miQ_IMAGE_FILTER N Y miBoolean image allows filtering
miQ_IMAGE_GAMMA N N double color frame buffer gamma factor
miQ_IMAGE_HEIGHT N Y int height of image in pixels
miQ_IMAGE_NOPREMULT N N miBoolean color frame buffer premultiplication mode
miQ_IMAGE_WIDTH N Y int width of image in pixels
miQ_INST_AREA N Y miScalar light instances only: area of area light
miQ_INST_CAUSTIC N Y miUint bitmap: 1=enable casting, 2=enable receiving, 3=disable casting, 4=disable receiving
miQ_INST_DATA N Y miTag user data block
miQ_INST_DECL N Y miTag inherited parameter declaration
miQ_INST_FUNCTION N Y miTag optional procedural transformation
miQ_INST_GLOBAL_TO_LOCAL N Y miMatrix * instance transformation
miQ_INST_GLOBILLUM N Y miUint bitmap: 1=enable casting, 2=enable receiving, 3=disable casting, 4=disable receiving
miQ_INST_HIDE N Y miBoolean instance is inactive
miQ_INST_IDENTITY N Y miBoolean miTRUE if identity transformation
miQ_INST_ITEM N Y miTag instanced scene element
miQ_INST_LABEL N Y miUint translator-defined instance label
miQ_INST_LOCAL_TO_GLOBAL N Y miMatrix * inverse instance transformation
miQ_INST_MATERIAL N Y miTag inherited material
miQ_INST_PARAM N Y void * inherited parameters
miQ_INST_PARAM_SIZE N Y int inherited parameter size
miQ_INST_PARENT N Y miTag leaf instance parent (0 otherwise)
miQ_INST_PLACEHOLDER_ITEM N Y miTag content of placeholder instances
miQ_INST_SHADOW N Y miUint invisible to shadow rays
miQ_INST_TRACE N Y miUint visible to secondary rays
miQ_INST_VISIBLE N Y miUint visible to primary rays
miQ_LIGHT_AREA N Y int 0=none, 1=rectangle, 2=disc, 3=sphere
miQ_LIGHT_AREA_C_AXIS N Y miVector axis of cylinder area light
miQ_LIGHT_AREA_C_RADIUS N Y miScalar radius of cylinder area light
miQ_LIGHT_AREA_R_EDGE_U N Y miVector U size of rectangular area light
miQ_LIGHT_AREA_R_EDGE_V N Y miVector V size of rectangular area light
miQ_LIGHT_AREA_D_NORMAL N Y miVector normal vector of disc area light
miQ_LIGHT_AREA_D_RADIUS N Y miScalar radius of disc area light
miQ_LIGHT_AREA_S_RADIUS N Y miScalar radius of spherical area light
miQ_LIGHT_AREA_SAMPLES_U N Y int number of samples in U direction
miQ_LIGHT_AREA_SAMPLES_V N Y int number of samples in V direction
miQ_LIGHT_CAUSTIC_PHOTONS N Y int number of caustic photons to store
miQ_LIGHT_CAUSTIC_PHOTONS_EMIT N Y int number of caustic photons to emit
miQ_LIGHT_DATA N Y miTag user data block
miQ_LIGHT_DIRECTION Y Y miVector light direction
miQ_LIGHT_EMITTER N Y miVector tag of light photon emitter shader
miQ_LIGHT_ENERGY N Y miTag energy for caustics and globillum
miQ_LIGHT_EXPONENT N Y miScalar distance falloff, n in 1 / r^n
miQ_LIGHT_GLOBAL_PHOTONS N Y miColor number of globillum photons to store
miQ_LIGHT_GLOBAL_PHOTONS_EMIT N Y miColor number of globillum photons to emit
miQ_LIGHT_LABEL N Y int light label
miQ_LIGHT_NORMAL Y N miVector normal vector at light surface in world coordinates
miQ_LIGHT_ORIGIN Y Y miVector light position
miQ_LIGHT_SHADER N Y miTag tag of light shader
miQ_LIGHT_SPREAD N Y miScalar outer cone angle of spot light
miQ_LIGHT_TANGENT_SPACE Y N miVector[3] tangent, bi-tangent and normal vector at light surface in world coordinates
miQ_LIGHT_TYPE N Y int 0=point, 1=directional, 2=spot
miQ_LIGHT_USE_SHADOWMAP N Y miBoolean light has a shadow map
miQ_LIGHTPROFILE_COSTHETA_MAX N Y miScalar largest possible value of the cosine of the profile vertical angle
miQ_LIGHTPROFILE_COSTHETA_MIN N Y miScalar smallest value of the cosine of the profile vertical angle.
miQ_LIGHTPROFILE_INTENSITY_MAX N Y miScalar largest intensity value of the profile
miQ_LIGHTPROFILE_PHI_MAX N Y miScalar horizontal angle where the light profile ends
miQ_LIGHTPROFILE_PHI_MIN N Y miScalar horizontal angle where the light profile starts
miQ_LIGHTPROFILE_PHI_RES N Y int number of interpolation points in the horizontal direction
miQ_LIGHTPROFILE_THETA_RES N Y int number of interpolation points in the vertical direction
miQ_MTL_CONTOUR N Y miTag contour shader
miQ_MTL_DISPLACE N Y miTag displacement shader
miQ_MTL_ENVIRONMENT N Y miTag environment shader
miQ_MTL_OPAQUE N Y miBoolean material is opaque to shadow rays
miQ_MTL_PHOTON N Y miTag photon shader
miQ_MTL_PHOTONVOL N Y miTag photon volume shader
miQ_MTL_SHADER N Y miTag material shader
miQ_MTL_SHADOW N Y miTag shadow shader
miQ_MTL_VOLUME N Y miTag volume shader
miQ_NUM_BUMPS3.2 Y N int * number of bumps in state x, y bump lists
miQ_NUM_GLOBAL_LIGHTS N N int number of global lights
miQ_NUM_TEXTURES Y N int * number of textures in state->tex_list
miQ_OBJ_CAUSTIC N Y miUint 0=none, 1=casts, 2=receives, 3=both
miQ_OBJ_DATA N Y miTag user data block
miQ_OBJ_GLOBILLUM N Y miUint 0=none, 1=casts, 2=receives, 3=both
miQ_OBJ_LABEL N Y miUint translator-defined object label
miQ_OBJ_SHADOW N Y miBoolean invisible to shadow rays
miQ_OBJ_TRACE N Y miBoolean visible to secondary rays
miQ_OBJ_TYPE N Y int 0=polygonal, 1=surfaces
miQ_OBJ_VIEW_DEPENDENT N Y miBoolean contains view-dependent surfaces
miQ_OBJ_VISIBLE N Y miBoolean visible to primary rays
miQ_PIXEL_SAMPLE3.2 Y N miScalar[2] set up QMC sequences for sampling, and return a jitter value for lightmap shaders. See page miqpixelsample for an example.
miQ_PRI_BBOX_MAX Y N miVector object-space bounding box of intersected primitive
miQ_PRI_BBOX_MIN Y N miVector object-space bounding box of intersected primitive
miQ_RAY_INTERFACE Y N MI::RAY:Interface* pointer to C++ interface class
miQ_SCENE_BBOX_ALL Y N miVector[2] world-space bounding box of all geometry
miQ_SCENE_BBOX_CAUSTIC_G Y N miVector[2] bounding box of all caustic-casting geometry
miQ_SCENE_BBOX_CAUSTIC_R Y N miVector[2] bounding box of all caustic-receiving geometry
miQ_SCENE_BBOX_GLOBILLUM_G Y N miVector[2] bounding box of all globillum-casting geometry
miQ_SCENE_BBOX_GLOBILLUM_R Y N miVector[2] bounding box of all globillum-receiving geometry
miQ_SCENE_BBOX_SHADOW Y N miVector[2] bounding box of all shadow-casting geometry
miQ_SCENE_ROOT_GROUP Y N miTag the root group of the scene from the render statement; useful for custom scene traversals
miQ_TEXTURE_DIM N Y miUint dimension of nth texture space of intersected primitive (n is fifth argument)
miQ_TILE_PIXELS Y N int[4] lower left and upper right tile pixel coord
miQ_TILE_SAMPLES Y N int[4] same but including filter source margin
miQ_TRANS_CAMERA_TO_INTERNAL Y N miMatrix * camera to internal space transformation
miQ_TRANS_CAMERA_TO_WORLD Y N miMatrix * camera to world space transformation
miQ_TRANS_INTERNAL_TO_CAMERA Y N miMatrix * internal to camera space transformation
miQ_TRANS_INTERNAL_TO_OBJECT Y N miMatrix * internal to object space transformation
miQ_TRANS_INTERNAL_TO_WORLD Y N miMatrix * internal to world space transformation
miQ_TRANS_OBJECT_TO_INTERNAL Y N miMatrix * object to internal space transformation
miQ_TRANS_OBJECT_TO_WORLD Y N miMatrix * object to world space transformation
miQ_TRANS_WORLD_TO_CAMERA Y N miMatrix * world to camera space transformation
miQ_TRANS_WORLD_TO_INTERNAL Y N miMatrix * world to internal space transformation
miQ_TRANS_WORLD_TO_OBJECT Y N miMatrix * internal to world space transformation
miQ_PRI_DATA Y N miPri_data the per-primitive data of the current primitive in the state
miQ_VERSION N N char * mental ray version string

The "N" symbol in the state column indicates that the state is not used. The "N" symbol in the tag column means that miNULLTAG must be passed. Some queries can specify a state instead of a tag. Their query codes are indicated with a *, which stands for any of the preceding codes whose names begin with the same prefix; in this case mi_query will take the current shader ( ) instead of an arbitrary tag. This is slightly faster than passing a tag.

The result type in the table indicates the type of the variable that mi_query accepts a pointer to: to obtain an integer result from mi_query (the table lists an "int"), a pointer to an integer must be passed as the fourth argument ("int *"). For mi_query, "function" is synonymous with "shader".

The result of the miQ_INST_VISIBLE, miQ_INST_SHADOW, miQ_INST_TRACE, and miQ_INST_CAUSTIC queries depend on whether a scene DAG or leaf instance tag is passed. A scene DAG instance contains the flags specified by the scene description language when the instance was created. A leaf instance contains the effective instance flags for rendering, that is, with instance inheritance and object flags taken into account. The miQ_INST_VISIBLE etc. modes should be used instead of the miQ_OBJ_VISIBLE etc. modes because they return the same modes that mental ray uses when rendering.

The result vectors of the miQ_LIGHT_ORIGIN and miQ_LIGHT_DIRECTION queries are defined in internal space if the light instance tag is passed, otherwise the vectors are defined in local space.

The miQ_TILE_* codes are supported by mental ray 2.1.34.107 or later. They describe the location and size of the currently rendered image tile. The returned values are in the order xlow xhigh ylow yhigh. The sampled area may be larger than the tile due to filtering and jittering. These codes may be used to detect if a shader is called in the finalgather precomputing stage: for finalgather precomputing the return value is miFALSE as no tile exist.

The miQ_SAMPLE_MOVING3.5 mode can be used by an environment shader to detect if taking several samples of a moving environment texture at different shutter times would be advantageous. If the queried value is not zero, mental ray does such oversampling automatically.

The query codes miQ_NUM_TEXTURES and miQ_GEO_LABEL may only be used if has not been modified by the shader or calling shader. Ray-marching volume shaders sometimes clear this state variable. Both are not supported in displacement shaders. miQ_GEO_LABEL also returns miFALSE if the object is not marked tagged and no polygon/surface labels exist. In mental ray 3.3, the miQ_GEO_LABEL mode may be used from displacement shaders; this did not work in earlier versions.

Note that a return type of miMatrix * means that the address of a pointer must be passed, not the address of a matrix. This reduces the number of bytes that mi_query has to copy from 64 (sixteen floats) to only four (or eight, on some CPU architectures).

The query mode miQ_PRI_DATA returns an miPri_data structure which is defined as follows:

    typedef struct miPri_data {
        miUint          info_size;      /* size of info */
        const miUint    *info;          /* info: data layout */
        miUint          data_size;      /* size of triangle data */
        const miUint    *data;          /* primitive (triangle) data */
    } miPri_data;
  

All fields in this structure are specific to the current intersected object. The field info_size specifies the size of the per-face userdata information block for the current intersection, in multiples of 32 bit. The address of this block is given in info if info_size is not zero. The per-face data of the hit primitive is returned in data, the length of the data block in multiples of 32 bit is given in data_size. Per face data can be present even if the information block is not specified. The caller must pass a pointer to such a structure which is then filled out by mi_query.


    miBoolean mi_shaderstate_set(
        miState         *state,
        const char      *key,
        void            *value,
        int             valsize,
        int             lifetime)

3.2 Store a data block * value under the name key (which has become const in mental ray 3.3). The data block can be retrieved by key with mi_shaderstate_get later. Shorter keys are slightly faster to hash and compare. valsize is the size of the value block to store. A copy of * value is made. If a data item with the same key exists, it is replaced with the new one. If value or valsize are null, an existing data item with the same key is deleted and none is created. The lifetime controls when the data item is deleted: at the end of the current eye ray if lifetime is miSS_LIFETIME_EYERAY, or at some later point, but no later than the end of the rectangle, if it is miSS_LIFETIME_RECT. The latter is slightly faster. In any case, data items are separate for each host, thread, and rectangle.

Data items stored with this mechanisms are intended for communication between shaders called during evaluation of a single eye ray, both upstream and downstream. For example, a material shader may set a data item to be picked up by any later light shader, or by the root lens shader. It is a replacement for , which works only downstream and causes conflicts if more than one data item is needed. The mechanism is only available in eye ray context during rendering, but not in geometry, output, displacement, or other shaders that do not get called as a consequence of an eye ray. As a special case, use in lightmap shaders is supported.

Note that transparency in rasterizer mode (formerly called Rapid Motion) is not performed by casting rays that could carry shader state, but by compositing at a later stage. For this reason it is not possible to transport shader state through a call to mi_trace_transparency In rasterizer mode.


    void *mi_shaderstate_get(
        struct miState  *state,
        const char      *key,
        int             *valsize)

3.2 Look up a data element previously stored with mi_shaderstate_set, under the same key, and return a pointer to the stored value. Also return the size of the stored value in *valsize, unless valsize is a null pointer. If no data element is found, a null pointer is returned and valsize is undefined.


    void mi_shaderstate_enumerate(
        miState         *state,
        miBoolean       (*cb)(void *arg, char *key, void *val, int vsz, int l),
        void            *arg)

3.2 The callback cb is called for each known item, with the opaque arg pointer, key, value, value size, and lifetime. If cb is a null pointer, the list is printed using mi_info. This function is intended for debugging only; the implied linear search is inefficient. Callback mode is useful to interpret the contents of the value pointer; mi_info merely prints an address.


    miBoolean mi_fb_put(
        miState         *state,
        int             fb,
        void            *data)

Store data into the sample so that it gets filtered and stored in user frame buffer fb later. The type of the data to copy from * data is determined by the frame buffer type as defined in the options block. The frame buffer number fb must be a number equal to or greater than 0, corresponding to the fb n number in the frame buffer statements. (mental ray 3.3 and earlier only supported the range 0..7.) If this frame buffer was not defined, this function has no effect and returns miFALSE. The data is stored in the current sample (i.e., the current location for which the primary ray was cast), and is filtered to create frame buffer pixels after all samples in the region have been taken. There is no way to store user frame buffer data in arbitrary locations with this function. It should be called for all samples and all defined user frame buffers to avoid leaving holes; if user frame buffer data is left undefined in a sample because mi_fb_put was not called, the data defaults to zero and is filtered as such.

Output shaders may not use this function because there is no notion of "samples" during output shading; instead, they must use the standard mi_img_put_* functions with an offset of miRC_IMAGE_USER + fb. Shaders may get the data type of a frame buffer n by inspecting . Similarly, final gathering, light mapping, displacement, and geometry shaders may not use mi_fb_put and mi_fb_get because the frame buffers are only available during frame rendering. 3.4 The data type of a frame buffer is stored in .

    miBoolean mi_fb_get(
        miState         *state,
        int             fb,
        void            *data)

Retrieve data from user frame buffer fb. The type of the data copied to * data is determined by the frame buffer type as defined in the options block. It will never be larger than 16 bytes (the size of a miColor). The frame buffer number fb must be in the range 0...7. If this frame buffer was not defined, this function returns miFALSE, and no data is stored. This function is intended to let shaders retrieve data that may have been stored by shaders called in later ray generations, but like mi_fb_put it is limited to the current sample. Again, output shaders may not use this function because there is no notion of "samples" during output shading; instead, they must use the standard mi_img_get_* functions with an offset of miRC_IMAGE_USER + fb.

    miImg_image *mi_output_image_open(
        miState         *state,
        miUint          idx)

3.4 Returns an image pointer for a frame buffer index. idx is one of the miRC_IMAGE_RGBA, miRC_IMAGE_USER etc. constants. May only be called from output shaders. Versions prior to 3.4 could obtain the output image from a static array in the state, but this array is no longer available in mental ray 3.4. This means that all output shaders need to be rewritten for mental ray 3.4.

    void mi_output_image_close(
        miState         *state,
        miUint          idx)

3.4 Closes an opened frame buffer image that has been opened with mi_output_image_open. idx is one of the miRC_IMAGE_RGBA, miRC_IMAGE_USER etc constants. May only be called from output shaders.

    miBoolean mi_geoshader_add_result(
        miTag           *result,
        const miTag     item)

This function should be called from geometry shaders for adding a scene element to the result. If result or item are null, miFALSE is returned. If result refers to a null tag, an instance group is created and returned in result. If result is non-null but does not refer to an instance group, an instance group is created, the result element is put into this group and the group is returned in result. Now that this function has enforced that an instance group element is always returned, the item element is put into the returned group. See page geoshaderex for an example.

    miBoolean mi_geoshader_tesselate(
        miState         *state,
        miTag           *leaves,
        miTag           source)

This function should be called from geometry shaders only. It builds a list of instances that describes the object, instance group, or instance source. If source contains more than one object, there will be multiple instances in the leaves list. The leaves argument is set to the tag of the first instance; the others are chained to one another with the next field in each instance. The last instance in the list has a null next field.

The tessellation function also tessellates the geometry described by each instance, and attaches the triangles resulting from the tessellation to the boxes field of the instance. Triangles are stored in boxes, which are data structures consisting of a header, a vector list, a vertex list, and a triangle list. In mental ray 2.x, boxes have a maximum size; if an object does not fit into one box, more are generated and chained using the next_box tag in each box.

    miBoolean mi_geoshader_tesselate_end(
        miTag           leaves)

Release all memory allocated by mi_geoshader_tesselate. This function releases all instances and boxes attached to the instance chain leaves, which was created by mi_geoshader_tesselate. Multiple instance lists can exist at the same time; it is not necessary to release one before creating the next but since memory demands may be substantial if the tessellated geometry is large, it is recommended to not keep instance lists longer than necessary.

    typedef struct {
        miBoolean       prefer_approx_polygons; /* triangles from polygons */
        miBoolean       prefer_approx_faces;    /* triangles from surfaces */
        miBoolean       ascii_output;           /* non-binary output */
        miBoolean       verbatim_textures;      /* dump textures verbatim ? */
        miBoolean       norendercommand;        /* disable rendercmd echo? */
        miUint          explode_objects;        /* write objects to subfiles */
        miTag           leaf_insts;             /* for prefer_approx_* lookup*/
        miBoolean       nolinkcommand;          /* don't echo link statements*/
        miUint          dont_echo;              /* EO_* bitmap: omit these */
        miUint          dont_recurse;           /* EO_* bitmap: no prereqs */
    } miEchoOptions;

    miBoolean mi_geoshader_echo_tag(
        FILE            *fp,
        miTag           tag,
        miEchoOptions   *eopt)

This function exists for debugging geometry shaders. It echos a .mi scene fragment, anchored at tag, to the stdio file fp. The options should be cleared with memset or similar, and then initialized (the structure occasionally grows; this way recompilation will suffice). The prefer_approx_polygons, prefer_approx_faces, norendercommand, and nolinkcommand must be miFALSE (0). ascii_output prints geometry vectors as ASCII numbers instead of the default binary vectors. verbatim_textures includes texture files in the echoed scene, instead of referencing them by file name. explode_objects, if nonzero, causes all objects with more than the given number of vectors to be echoed to independent subfiles; this is not generally useful for debugging. The dont_echo and dont_recurse bitmaps of miEO_ bits allow excluding certain scene element types. In a geometry shader it may be useful to set dont_recurse to to suppress echo of all tags that tag is referencing. See the command-line option -echo (appendix A) for more details.

    char *mi_string_substitute(
        char            *newname,
        char            *name,
        long            size)

This function [18] performs substitutions on the file path name, and returns the substituted path in newname, which must point to a char buffer of sufficient size ( miPATHSIZE is recommended). The size of the buffer must be passed as size to prevent buffer overruns. Substitutions are taken from the MI_RAY_SUBSTITUTE environment variable, the mental ray registry mechanism, and the (obsolete) Softimage Linktab mechanism. For details on the first two refer to [Driemeyer 01]. The value of newname is returned.

    miInteger mi_volume_num_shaders(
        miState         *state)

In autovolume mode, volume shaders can use this function to determine the number of overlapping volumes whose volume shaders have the same (highest) volume level as the current volume shader. This is the length of the list of volume shaders to call. Refer to the autovolume section on page autovolshd for more information on autovolumes. mental ray 3.2 also supports autovolume mode for photon emitters, so photon shaders can determine which photonvolumes a photon passes through.

    miInteger mi_volume_cur_shader(
        miState         *state)

In autovolume mode, volume shaders can use this function to determine their own position in the list of volume shaders to call. The first volume shader gets number 0.

    miTag *mi_volume_tags(
        miState         *state)

In autovolume mode, volume shaders can use this function to retrieve the list of volume shader tags scheduled for being called for this ray segment. The length of the list can be obtained by calling mi_volume_num_shaders.

    miTag *mi_volume_instances(
        miState         *state)

This function is a companion function to mi_volume_tags. It returns a constant pointer to the leaf instances through which the current ray is traveling. The n-th instance tag in the returned array corresponds to the n-th volume shader tag in the array returned by mi_volume_tags. A volume shader could use this function to store the instance it is associated with to (which otherwise holds the instance of the hit primitive) to enable correct object transformations from the vector_to_object and point_from_object family. The instance tag can also be used to obtain instance-specific user data.

    void mi_opacity_set(
        miState         *state,
        miColor         *color)
  

3.2 This function has an effect in the rasterizer rendering mode (formerly called Rapid Motion) only. Since the rasterizer handles transparency in a separate shading sample combination pass and not inside the material shader, the shader cannot normally create matte objects by returning a transparent color regardless of other objects behind the shaded surface. The shading sample combination phase would fill in the obscured objects. In this case, the shader may use mi_opacity_set to explicitly set the opacity to be used for combining instead oif the result alpha. As a bonus, the opacity may be set for R, G, B, and A separately, instead of using the result alpha for all components. The color is saved along with the result color returned by the shader until the combination phase.

    miBoolean mi_opacity_get(
        miState         *state,
        miColor         *color)
  

3.2 After mi_opacity_set has been called at any point for the current surface shading point and all its secondary rays, it remains in effect until the rasterizer (formerly called Rapid Motion) shades the next surface point. It is saved along with the returned color until shading sample combination. Since any of the shaders of a Phenomenon can call mi_opacity_set, the companion function mi_opacity_get can be used to retrieve the opacity color last set. This is also useful in volume shaders that need to control matte opacity. The function returns miFALSE if mi_opacity_set has not been called for the current shading point yet; in this case color is undefined.

    miColor *mi_volume_user_color(
        miState         *state)

In autovolume mode, volume shaders can use this function to store an arbitrary color value. This is useful for communication between different volume shaders in the list. For example, the first volume shader can initialize this value, and the last can return it.

[18] This function was introduced in mental ray 2.1.36.

home << prev next >> contents  


Copyright © 1986-2006 by mental images GmbH