Element type: | miSCENE_NBOX |
Data type: | miBox |
Sizes: | |
Defaults: | all nulls |
typedef struct miBox { miCBoolean mtl_is_label; miUchar sharp; miUchar spare[2]; miUint spare2; miVector bbox_min; /* bounding box: low corner */ miVector bbox_max; /* bounding box: high corner */ miUint no_primlists; /* number of lists of prims, excluding border primlists */ miUint no_prims; /* total number of primitives contained in all primitive lists, excluding border prims */ miUint no_border_primlists; /* number of border primlists */ miUint no_border_prims;/* number of primitives contained */ /* in all border primlists */ miUint primdata_size; /* prim data: size per primitive */ miUint pdata_size; /* prim data: total size (there could be extra data after primlist data */ miTag topology; /* adjacency information for all primitives (region+border) */ miUint prim_offset; /* byte offset: primitives */ miUint mtl_offset; /* byte offset: materials */ miUint dim_offset; /* byte offset: tex/usr offset table*/ miUint pdata_offset; /* byte offset: prim data */ miVertex_info vertex_info; /* vertex specification */ miScalar data[1]; /* vertex lines begin, more follow */ } miBox;
In mental ray 3.4, miBox was introduced to improve efficiency. miBox optimizes memory coherence.
A translator should not change the fields in an miBox directly; the api functions mi_api_primlist_begin, mi_api_primlist_border, mi_api_primlist_dimensions, mi_api_primlist_approx, mi_api_primlist_topology, mi_api_primlist_end should be used. Writing boxes directly makes rendering faster because no tessellation is involved, but it does make the code more susceptible to changes in mental ray. miBox is an internal data structure that changes in incompatible ways periodically, unlike miObjects.
mtl_is_label is a flag that informs the renderer that the material field in the primitives does not hold a material but an integer label. The renderer must ignore the material in this case and use the inherited material. This flag is set for tagged objects in the mi2 language.
sharp stores the tessellation sharpness: 0 means interpolated and 255 means faceted. mental ray 3.2 also allows intermediate values in the range 1..254.
bbox_min and bbox_max are the low and high corners respectively of the bounding box around the vextex positions. no_prims is the total number of primitives (triangles, strip faces, quads etc) contained in all primitive lists, excluding border primitives.
no_primlists is the total number of primitive lists contained in the box. Each primitive list consists of prims, excluding border primitives.
no_border_prims is the total number of primitives in all border primitive lists.
no_border_primlists is the number of primitive lists defining the border.
primdata_size specifies the number of 32-bit integers
which are assigned to each primitive from the pdata_offset array.
For example primdata_size = 1
means that for
subsequent primitives one integer from pdata_offset can be
used as user data.
pdata_size specifies the size of the whole pdata section. There may be extra space after primlist data, for individual needs.
prim_offset is the offset to an array of integers defining multiple primitive lists. Each primitive list begins with a primitive type combined with a count into a single 32-bit value: type is stored in bits 28-31, count in bits 0-27. The primitive vertex integers follow, referring to the vertex lines.
mtl_offset is the offset to an array of integers defining materials.
dim_offset is the offset to the array of scalar offsets within a vertex line for all texture and user spaces. The dim_offset array has at least one entry for texture spaces and one for user data spaces, which are identical to no_textures or no_users. If no_textures or no_users is greater than zero, additional entries are present with values of at least three (defined after position in the vertex line).
pdata_offset is the offset to the user data, swapped as integers. Interpretation is up to the application.
data[1] is the beginning of the vertex line storage.
vertex_info defines a primitive vertex. Vertex data is stored as an interleaved array of lines of scalars in the box. A line contains a 3-d vertex position and may contain, for example, a normal (3 scalars), first derivatives (6 scalars), second derivatives (9 scalars), textures, and user data. miVertex_info describes the layout of the lines.
typedef struct miVertex_info { miUint2 line_size; /* vertex line size in #scalars */ miUchar normal_offset; /* when 0, not present */ miUchar derivs_offset; /* surf derivs, when 0, not present */ miUchar derivs2_offset; /* surf 2nd derivs, when 0, not pr. */ miUchar bump_offset; /* bump basis vectors if non null */ miUchar no_bumps; /* number of bump vectors */ miUchar motion_offset; /* when 0, not present */ miUchar no_motions; /* number of motion vectors */ miUchar texture_offset; /* when 0, not present */ miUchar no_textures; /* number of textures */ miUchar user_offset; /* when 0, not present */ miUchar no_users; /* number of user vectors */ miUchar spare[3]} /* not used */ } miVertex_info}
line_size is the number of scalars in a line of vertex data. normal_offset is the to the normal vector.
derivs_offset is the offset to the first partial derivatives.
derivs2_offset is the offset to the second partial derivatives.
bump_offset is the offset to the bump vectors. no_bumps is the number of bump vectors. motion_offset is the offset to the motion vectors.
no_motions is the number of motion vectors. texture_offset is the offset to the texture vectors.
no_textures is the number of texture spaces. user_offset is the offset to the user vectors. no_users is the number of user spaces.
A number of macros exist to provide access to miBox contents.
miBOX_VERTEX_LINES(box) returns the address of the first vertex line.
miBOX_VERTEX_LINE(box, idx) returns the address of a certain vertex line.
miBOX_PRIMS(box) returns the address of the first primitive list.
miBOX_MATERIALS(box) returns the address of the first material tag/integer.
miBOX_TEX_OFFSET(box) returns the address of the first texture space dim_offset entry.
miBOX_USER_OFFSET(box) returns the address of the first user space dim_offset entry.
miBOX_PRIMDATA(box) returns the address of the first 32-bit data for primitives.
miVL_POS(box, line) returns the vertex position.
miVL_NORMAL(box, line) returns the vertex normal.
miVL_DERIVS1(box, line) returns the partial derivative u vector, v at subsequent address.
miVL_DERIVS2(box, line) returns the second derivatives (three vectors in total).
miVL_BUMP(box, line) returns the first bump basis vector.
miVL_MOTION(box, line) returns the first motion vector.
miVL_TEXTURE(box, line) returns the first texture scalar.
miVL_TEXTURE_D(box, line, offs returns the address of a certain texture space. offs is an entry from the dim_offset array, i.e. a scalar offset within the line.
miVL_USER(box, line) returns the first user vertex data.
miVL_USER_D(box, line, offs) returns the address of a certain user data space. offs is an entry from the dim_offset array, i.e a scalar offset within the line.
miBOX_NO_VTXLINES(box) returns the number of vertex lines.
miBOX_NO_MATERIALS(box) returns the number of materials defined.
miBOX_PD(box, idx) return the address of primitive data for the primitive with global index idx.
miBOX_POS(box, idx) returns the position entry for line index idx.
miBOX_MOTION(box, idx, which) returns the motion vector which for line index idx.
miBOX_TRI(box, idx) returns vertex triple for a certain triangle. Assumes that the box defines one sequential list of triangles. Skip the primtype/index count entry (+1).
miBOX_MATERIAL(box, idx) returns material for a certain triangle, same assumptions as for miBOX_TRI.
miBOX_SIZE(box) returns the size of the entire miBox.
Copyright © 1986-2008 by mental images GmbH