home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / warptlk3.zip / TOOLKIT / BETA / BOOK / BRENDER.INF (.txt) < prev    next >
OS/2 Help File  |  1995-09-06  |  132KB  |  7,439 lines

  1.  
  2. ΓòÉΓòÉΓòÉ 1. Disclaimer ΓòÉΓòÉΓòÉ
  3.  
  4. Argonaut Technologies Ltd. makes no expressed or implied warranty with respect 
  5. to the contents of this manual, and assumes no responsibility for any errors or 
  6. omissions which it may contain. No liability is assumed for any direct, 
  7. indirect or consequential damages or losses arising in connection with the 
  8. information or examples described herein 
  9.  
  10. Copyright 1995 Argonaut Technologies Ltd. 
  11.  
  12.  
  13. ΓòÉΓòÉΓòÉ 1.1. Trademarks ΓòÉΓòÉΓòÉ
  14.  
  15. 3D Studio is a registered trademark of Autodesk, Inc. 
  16.  
  17. Windows, Windows 95, and Windows NT are registered trademarks of Microsoft 
  18. Corporation. 
  19.  
  20. OS/2 is a registered trademark of IBM Corporation. 
  21.  
  22.  
  23. ΓòÉΓòÉΓòÉ 2. 1.  Introduction ΓòÉΓòÉΓòÉ
  24.  
  25. BRender is an extremely powerful real-time 3D graphics library, with a 
  26. comprehensive Application Programming Interface (API), facilitating rapid and 
  27. intuitive 3D development. 
  28.  
  29.  
  30. ΓòÉΓòÉΓòÉ 2.1. 1.1  Overview ΓòÉΓòÉΓòÉ
  31.  
  32. The libraries have an elegant conceptual design throughout and are, as far as 
  33. possible, platform independent. In brief, they provide functions and data 
  34. structures relevant to the following areas: 
  35.  
  36.      Mathematical primitives, including scalars, angles, quaternions, Euler 
  37.       angles, vectors and matrices, using fixed or floating point numerical 
  38.       representations. 
  39.  
  40.      Rendering, in a number of styles. 
  41.  
  42.      Scene picking and elementary collision detection. 
  43.  
  44.      Hierarchical organisation of objects constituting a scene. 
  45.  
  46.      Lights, cameras and models. 
  47.  
  48.      Texture and environment mapping. 
  49.  
  50.      Efficient handling of items in a 'world database'. 
  51.  
  52.      File systems, memory management and error handling 
  53.  
  54.  Typically, a BRender application will perform the following tasks: 
  55.  
  56.      Initialisation. 
  57.  
  58.      Importing or generating data, for instance, models, materials and 
  59.       textures. 
  60.  
  61.      Rendering scenes. 
  62.  
  63.      Modification of object positions and orientations. 
  64.  
  65.      User interaction. 
  66.  
  67.  
  68. ΓòÉΓòÉΓòÉ 2.2. 1.2  Actors and Hierarchies ΓòÉΓòÉΓòÉ
  69.  
  70. Models, lights, cameras, bounding boxes and clipping planes are all actors. A 
  71. scene consists of a tree-structured hierarchy of actors, and is rendered by 
  72. traversing the tree, beginning at its root. Chapter three describes actors and 
  73. their associated data structures in detail. 
  74.  
  75. The position and orientation of an actor is not given in some absolute 
  76. coordinate system. Instead, they are relative to the coordinate system of the 
  77. actor's parent in the hierarchy. In fact, BRender applies a general affine 
  78. transformation between each actor and each one of its children. As the tree is 
  79. traversed, the transformations are accumulated. The root of the hierarchy has 
  80. no parent, and consequently, it is the only actor with an absolute coordinate 
  81. system. 
  82.  
  83. BRender has a dummy actor type, which can be used to assist the layout and 
  84. organisation of a hierarchy. Invariably, the root of a hierarchy will be a 
  85. dummy actor. 
  86.  
  87. The smallest hierarchy that will produce an actual rendered scene consists of 
  88. four actors, namely a dummy actor, a model, a camera and a light source. The 
  89. dummy actor is at the root of the hierarchy, and the model, camera and light 
  90. are its children. 
  91.  
  92.  
  93. ΓòÉΓòÉΓòÉ 2.3. 1.3  Callbacks ΓòÉΓòÉΓòÉ
  94.  
  95. Callback functions provide a powerful mechanism for customising BRender to suit 
  96. a particular application or platform. Quite simply, a callback is a pointer to 
  97. a function which can be changed by the user as and when necessary. When 
  98. appropriate, BRender uses that pointer to invoke the function. 
  99.  
  100. For example, BRender allows a model to have its own custom callback function, 
  101. which is invoked whenever the model is about to be rendered. The user 
  102. application can then perform a number of custom tasks associated with the 
  103. model, before returning control to BRender. 
  104.  
  105.  
  106. ΓòÉΓòÉΓòÉ 2.4. 1.4  Documentation Conventions ΓòÉΓòÉΓòÉ
  107.  
  108.      Throughout this manual, syntax, arguments, definitions and example code 
  109.       are in the typewriter font, to distinguish them from normal text. For 
  110.       example, 
  111.  
  112.             void BrTransformToTransform(br_transform *dest, br_transform *src);
  113.  
  114.       or 
  115.  
  116.             BR_ACTOR_CAMERA
  117.  
  118.      The '#' character is used as a wildcard in a number of sections and 
  119.       headings, and usually to refer to a collection of functions with a 
  120.       similar name. For example, 
  121.  
  122.             BrMatrix34PostRotate#
  123.  
  124.       will actually refer to the following three function: 
  125.  
  126.             BrMatrix34PostRotateX
  127.             BrMatrix34PostRotateY
  128.             BrMatrix34PostRotateZ
  129.  
  130.      In general, only the public members of BRender data structures are 
  131.       documented. Therefore, care must be taken if instances of those 
  132.       structures are initialised statically. The reader may wish to refer to 
  133.       the relevant BRender header files for the complete structure definitions. 
  134.  
  135.  
  136. ΓòÉΓòÉΓòÉ 3. 2.  The Rendering Engine ΓòÉΓòÉΓòÉ
  137.  
  138. BRender's rendering engine performs the following high-level operations: 
  139.  
  140.      Initialisation 
  141.  
  142.      Rendering scenes using a Z buffer 
  143.  
  144.      Picking actors through a given line of sight 
  145.  
  146.      Elementary collision detection 
  147.  
  148.  
  149. ΓòÉΓòÉΓòÉ 3.1. 2.1  Initialisation ΓòÉΓòÉΓòÉ
  150.  
  151. 2.1.1  Functions 
  152.  
  153. 2.1.1.1  BrBegin 
  154.  
  155. Syntax 
  156.  
  157. void BrBegin(void);
  158.  
  159. Description 
  160.  
  161. Initialise BRender. This function must be called before any other BRender 
  162. functions are used. 
  163.  
  164. See also 
  165.  
  166. BrEnd
  167.  
  168. 2.1.1.2  BrEnd 
  169.  
  170. Syntax 
  171.  
  172. void BrEnd(void);
  173.  
  174. Description 
  175.  
  176. Exit Brender, freeing its internal resources and memory. 
  177.  
  178. See also 
  179.  
  180. BrBegin
  181.  
  182. 2.1.2  Z buffer 
  183.  
  184. 2.1.2.1  BrZbBegin 
  185.  
  186. Syntax 
  187.  
  188. void BrZbBegin(br_uint_8 colour_type, br_uint_8 depth_type);
  189.  
  190. Description 
  191.  
  192. Initialize the Z-buffer renderer. 
  193.  
  194. Arguments 
  195.  
  196.  colour_type 
  197.            Pixelmap type of buffer to render into. 
  198.  depth_type 
  199.            Pixelmap type of Z-buffer. 
  200.  
  201.  See also 
  202.  
  203.   BrZbEnd
  204.  
  205.  Pixelmap types (section 3.8.1.2) 
  206.  
  207.  2.1.2.2  BrZbEnd 
  208.  
  209.  Syntax 
  210.  
  211.   void BrZbEnd(void);
  212.  
  213.  Description 
  214.  
  215.  Close down the Z-buffer renderer. 
  216.  
  217.  See also 
  218.  
  219.   BrZbBegin
  220.  
  221.  2.1.2.3  BrZbSceneRender 
  222.  
  223.  Syntax 
  224.  
  225.   void BrZbSceneRender(br_actor *world,
  226.                        br_actor *camera,
  227.                        br_pixelmap *colour_buffer,
  228.                        br_pixelmap *depth_buffer);
  229.  
  230.  Description 
  231.  
  232.  Render a scene using the Z-buffer renderer. 
  233.  
  234.  Arguments 
  235.  
  236.  world 
  237.            A pointer to the root actor of a scene. 
  238.  camera 
  239.            A pointer to a camera actor. 
  240.  colour_buffer 
  241.            A pointer to the pixelmap to render the scene into. 
  242.  depth_buffer 
  243.            A pointer to the pixelmap to be used as a Z-buffer. It must have the 
  244.            same width and height as the colour buffer. 
  245.  
  246.  Associated definitions 
  247.  
  248.  BR_MAX_NAME 
  249.            Maximum length of a BRender identifier. 
  250.  BR_MAX_LIGHTS 
  251.            Maximum number of active lights. 
  252.  BR_MAX_CLIP_PLANES 
  253.            Maximum number of clipping planes. 
  254.  
  255.  See also 
  256.  
  257.   br_actor
  258.   br_camera
  259.   br_pixelmap
  260.  
  261.  2.1.2.4  BrZbSceneRenderBegin 
  262.  
  263.  Syntax 
  264.  
  265.   void BrZbSceneRenderBegin(br_actor *world,
  266.                             br_actor *camera,
  267.                             br_pixelmap *colour_buffer,
  268.                             br_pixelmap *depth_buffer);
  269.  
  270.  Description 
  271.  
  272.  Set up a new scene to be rendered, processing the camera, lights and 
  273.  environment. 
  274.  
  275.  Arguments 
  276.  
  277.  world 
  278.            A pointer to the root actor of a scene. 
  279.  camera 
  280.            A pointer to a camera actor. 
  281.  colour_buffer 
  282.            A pointer to the pixelmap to render the scene into. 
  283.  depth_buffer 
  284.            A pointer to the pixelmap to be used as a Z-buffer. 
  285.  
  286.  See also 
  287.  
  288.   BrZbSceneRenderAdd
  289.   BrZbSceneRenderEnd
  290.  
  291.  2.1.2.5  BrZbSceneRenderAdd 
  292.  
  293.  Syntax 
  294.  
  295.   void BrZbSceneRenderAdd(br_actor *tree);
  296.  
  297.  Description 
  298.  
  299.  Add a hierarchy of actors to the current rendering. 
  300.  
  301.  Arguments 
  302.  
  303.  tree 
  304.            A pointer to an actor hierarchy. 
  305.  
  306.  See also 
  307.  
  308.   BrZbSceneRenderBegin
  309.   BrZbSceneRenderEnd
  310.  
  311.  2.1.2.6  BrZbSceneRenderEnd 
  312.  
  313.  Syntax 
  314.  
  315.   void BrZbSceneRenderEnd(void);
  316.  
  317.  Description 
  318.  
  319.  Finish rendering a scene, having begun with BrZbSceneRenderBegin. 
  320.  
  321.  See also 
  322.  
  323.   BrZbSceneRenderBegin
  324.   BrZbSceneRenderAdd
  325.  
  326.  2.1.2.7  BrZbModelRender 
  327.  
  328.  Syntax 
  329.  
  330.   void BrZbModelRender(br_actor *actor,
  331.                        br_model *model,
  332.                        br_material *material,
  333.                        br_uint_8 style,
  334.                        int on_screen,
  335.                        int use_custom);
  336.  
  337.  Description 
  338.  
  339.  Render a model actor as part of the current rendering. 
  340.  
  341.  Arguments 
  342.  
  343.  actor 
  344.            A pointer to an actor. 
  345.  model 
  346.            A pointer to the actor's model. 
  347.  material 
  348.            A pointer to the actor's material. 
  349.  style 
  350.            The actor's rendering style. 
  351.  on_screen 
  352.            A flag specifying whether the model is either partially or 
  353.            completely on-screen (either OSC_PARTIAL or OSC_ACCEPT). 
  354.  use_custom 
  355.            If non-zero, invoke the models custom callback function. 
  356.  
  357.  See also 
  358.  
  359.  Custom model callback functions (section 3.5.3) 
  360.  
  361.  2.1.2.8  BrZbSetRenderBoundsCallback 
  362.  
  363.  Syntax 
  364.  
  365.   br_renderbounds_cbfn * BrZbSetRenderBoundsCallback(br_renderbounds_cbfn
  366.                                                      *new_cbfn);
  367.  
  368.  Description 
  369.  
  370.  Set the callback function invoked for each rendered actor. For example, a 
  371.  callback can be set up to log those rectangles in the colour buffer that have 
  372.  been written to (dirty rectangle flagging). 
  373.  
  374.  Arguments 
  375.  
  376.  new_cbfn 
  377.            A pointer to the new callback function. 
  378.  
  379.  Return value 
  380.  
  381.  Returns a pointer to the old callback function. 
  382.  
  383.  See also 
  384.  
  385.   br_renderbounds_cbfn
  386.  
  387.  2.1.2.9  br_renderbounds_cbfn 
  388.  
  389.  Syntax 
  390.  
  391.   typedef void BR_CALLBACK br_renderbounds_cbfn(br_actor *actor,
  392.                                                 br_model *model,
  393.                                                 br_material *material,
  394.                                                 br_uint_8 style,
  395.                                                 br_matrix4 *model_to_screen,
  396.                                                 br_int_32 bounds[4]);
  397.  
  398.  Description 
  399.  
  400.  Type definition for a callback invoked for each rendered actor. A callback of 
  401.  this nature can perform a number of useful operations, for instance: Dirty 
  402.  rectangle flagging; determining which actors are on-screen from frame to 
  403.  frame; interrupting the renderer and performing custom operations. The 
  404.  BR_CALLBACK macro must be used to ensure compiler compatibility. 
  405.  
  406.  The following arguments are passed to the callback function. 
  407.  
  408.  Arguments 
  409.  
  410.  actor 
  411.            A pointer to the actor just rendered. 
  412.  model 
  413.            A pointer to the actor's model. 
  414.  material 
  415.            A pointer to the actor's material. 
  416.  style 
  417.            The actor's rendering style. 
  418.  model_to_screen 
  419.            A pointer to a matrix giving the transformation from the models 
  420.            space to the screen. 
  421.  bounds 
  422.            An array of X and Y values giving the dimensions of the actor's 
  423.            bounding rectangle on screen. Elements in the array should be 
  424.            indexed with the following definitions: 
  425.                    BR_BOUNDS_MIN_X = 0 
  426.                    BR_BOUNDS_MIN_Y = 1 
  427.                    BR_BOUNDS_MAX_X = 2 
  428.                    BR_BOUNDS_MAX_Y = 3 
  429.  
  430.  See also 
  431.  
  432.   BrZbSetRenderBoundsCallback
  433.  
  434.  
  435. ΓòÉΓòÉΓòÉ 3.2. 2.2  Scene picking ΓòÉΓòÉΓòÉ
  436.  
  437. 2.2.1  Functions 
  438.  
  439. 2.2.1.1  BrScenePick2D 
  440.  
  441. Syntax 
  442.  
  443. int BrScenePick2D(br_actor *world,
  444.                   br_actor *camera,
  445.                   br_pixelmap *viewport,
  446.                   int pick_x,
  447.                   int pick_y,
  448.                   br_pick2d_cbfn *callback,
  449.                   void *arg);
  450.  
  451. Description 
  452.  
  453. Traverse a world hierarchy, picking model actors from the scene by casting a 
  454. ray through a given viewport pixel attached to a given camera. A callback is 
  455. invoked for each actor whose bounds intersect the ray. If the callback returns 
  456. a non-zero value, traversal halts.
  457.  
  458. Arguments 
  459.  
  460.  world 
  461.            A pointer to the root of a world hierarchy. 
  462.  camera 
  463.            A pointer to a camera actor. 
  464.  viewport 
  465.            A pointer to the viewport through which the pick ray passes. 
  466.  pick_x, pick_y 
  467.            Coordinates of viewport pixel through which the pick ray passes. 
  468.  callback 
  469.            A pointer to a pick-2D callback function. 
  470.  arg 
  471.            An optional argument to pass to the callback function. 
  472.  
  473.  Return value 
  474.  
  475.  If the callback returns a non-zero value and traversal halts, that value is 
  476.  returned. Otherwise, zero is returned. 
  477.  
  478.  See also 
  479.  
  480.   br_pick2d_cbfn
  481.   BrScenePick3D
  482.  
  483.  2.2.1.2  br_pick2d_cbfn 
  484.  
  485.  Syntax 
  486.  
  487.   typedef int BR_CALLBACK br_pick2d_cbfn(br_actor *a,
  488.                                          br_model *model,
  489.                                          br_vector3 *ray_pos,
  490.                                          br_vector3 *ray_dir,
  491.                                          br_scalar t_near,
  492.                                          br_scalar t_far,
  493.                                          void *arg);
  494.  
  495.  Description 
  496.  
  497.  Type definition for a pick-2D callback function. The following arguments are 
  498.  passed to it, for each actor whose bounds intersect the pick ray. The 
  499.  BR_CALLBACK macro must be used to ensure compiler compatibility. 
  500.  
  501.  Arguments 
  502.  
  503.  a 
  504.            A pointer the actor. 
  505.  model 
  506.            A pointer to the actor's model. 
  507.  ray_pos 
  508.            A pointer to a vector giving the ray position in the actor's own 
  509.            space. 
  510.  ray_dir 
  511.            A pointer to a vector giving the ray direction in the actor's own 
  512.            space. 
  513.  t_near, t_far 
  514.            The absolute values of the Z coordinates of the near and far bounds 
  515.            intersections, in view space. 
  516.  arg 
  517.            An optional argument passed to the callback. 
  518.  
  519.  Return value 
  520.  
  521.  Returns an integer. If it is non-zero, traversal will halt. 
  522.  
  523.  See also 
  524.  
  525.   BrScenePick2D
  526.  
  527.  2.2.1.3  BrScenePick3D 
  528.  
  529.  Syntax 
  530.  
  531.   int BrScenePick3D(br_actor *world,
  532.                     br_actor *reference,
  533.                     br_bounds *bounds,
  534.                     br_pick3d_cbfn *callback,
  535.                     void *arg);
  536.  
  537.  Description 
  538.  
  539.  Traverse a world hierarchy and invoke a callback function for each model actor 
  540.  whose bounds intersect a given bounds in a given reference actor's space. If 
  541.  the callback returns a non-zero value, traversal halts. 
  542.  
  543.  Arguments 
  544.  
  545.  world 
  546.            A pointer to the root of a world hierarchy. 
  547.  reference 
  548.            A pointer to the reference actor. 
  549.  bounds 
  550.            A pointer to a bounds structure. 
  551.  callback 
  552.            A pointer to a pick-3D callback function. 
  553.  arg 
  554.            An optional argument to pass to the callback function. 
  555.  
  556.  Return value 
  557.  
  558.  If the callback returns a non-zero value and traversal halts, that value is 
  559.  returned.  Otherwise, zero is returned. 
  560.  
  561.  See also 
  562.  
  563.   br_pick3d_cbfn
  564.   BrScenePick2D
  565.  
  566.  2.2.1.4  br_pick3d_cbfn 
  567.  
  568.  Syntax 
  569.  
  570.   typedef int BR_CALLBACK br_pick3d_cbfn(br_actor *a,
  571.                                          br_model *model,
  572.                                          br_matrix34 *transform,
  573.                                          br_bounds *bounds,
  574.                                          void *arg);
  575.  
  576.  Description 
  577.  
  578.  Type definition for a pick-3D callback function. The following arguments are 
  579.  passed to it, for each bounds intersection. The BR_CALLBACK macro must be used 
  580.  to ensure compiler compatibility. 
  581.  
  582.  Arguments 
  583.  
  584.  a 
  585.            A pointer the actor. 
  586.  model 
  587.            A pointer to the actor's model. 
  588.  transform 
  589.            A pointer to a matrix transformation from the intersecting actor to 
  590.            the reference actor. 
  591.  bounds 
  592.            A pointer to the original bounds given to BrScenePick3D. 
  593.  arg 
  594.            An optional argument passed to the callback. 
  595.  
  596.  Return value 
  597.  
  598.  Returns an integer. If it is non-zero, traversal will halt. 
  599.  
  600.  See also 
  601.  
  602.   BrScenePick3D
  603.  
  604.  
  605. ΓòÉΓòÉΓòÉ 4. 3.  The World Database ΓòÉΓòÉΓòÉ
  606.  
  607. BRender renders actor hierarchies. This chapter describes the data structures 
  608. which constitute the different actor types, and the functions provided to 
  609. support them. The topics covered include: 
  610.  
  611.      Actors 
  612.      Lights 
  613.      Cameras 
  614.      Clipping planes 
  615.      Models 
  616.      Custom model callback functions 
  617.      Materials 
  618.      Texture maps 
  619.      Environment maps 
  620.      Pixelmaps 
  621.      Shade tables 
  622.      Colour 
  623.      Transforms 
  624.  
  625.  
  626. ΓòÉΓòÉΓòÉ 4.1. 3.1  Actors ΓòÉΓòÉΓòÉ
  627.  
  628. 3.1.1  Datatypes 
  629.  
  630. 3.1.1.1  br_actor 
  631.  
  632. Structure 
  633.  
  634. typedef struct br_actor {
  635.  
  636.             br_actor *next;
  637.             br_actor **prev;
  638.             br_actor *children;
  639.             br_actor *parent;
  640.             br_uint_16 depth;
  641.             br_uint_8 type;
  642.             char *identifier;
  643.             br_model *model;
  644.             br_material *material;
  645.             br_uint_8 render_style;
  646.             br_transform t;
  647.             void *type_data;
  648.  
  649. } br_actor;
  650.  
  651. Description 
  652.  
  653. BRender represents everything in a 3D world as a tree-structured hierarchy of 
  654. actors. Of the seven possible types of actor, the three most important are 
  655. models, cameras, and lights. Some actors have extra type-specific data attached 
  656. to them. 
  657.  
  658. Members 
  659.  
  660.  next 
  661.            References the next actor in a linked list of siblings. 
  662.  prev 
  663.            References the previous actor in a linked list of siblings. 
  664.  children 
  665.            References a child of this actor. 
  666.  parent 
  667.            References the parent of this actor. 
  668.  depth 
  669.            The depth of this actor from the root of the hierarchy. This value 
  670.            is maintained by BRender automatically. 
  671.  type 
  672.            Actor type (see section 3.1.1.2). 
  673.  *identifier 
  674.            Actor name. 
  675.  model 
  676.            If the actor is a model, this points to the relevent model 
  677.            structure. If NULL, the parental model is used. The root actor 
  678.            inherits a default model (a cube). 
  679.  material 
  680.            If the actor is a model, this points to its default material, 
  681.            assigned to faces which do not specify a material explicitly. The 
  682.            default is defined per-actor to make model re-use more convenient. 
  683.            If NULL, the default material is inherited from the parent actor. 
  684.            The root actor inherits a default material (flat-shaded grey). 
  685.  render_style 
  686.            Rendering style (see section 3.1.1.3). 
  687.  t 
  688.            The transformation between this actor and its parent. 
  689.            Transformations are accumulated down the actor hierarchy, and thus 
  690.            the transformation applied to the parent is also applied to this 
  691.            actor. 
  692.  type_data 
  693.            A pointer to any type-specific data attached to this actor. 
  694.  
  695.  See also 
  696.  
  697.   br_model
  698.   br_material
  699.   br_camera
  700.   br_light
  701.  
  702.  3.1.1.2  Actor types 
  703.  
  704.  Description 
  705.  
  706.  Available actor types. 
  707.  
  708.  Definitions 
  709.  
  710.  BR_ACTOR_NONE 
  711.            A dummy actor, used to assist the layout and organisation of a 
  712.            hierarchy. 
  713.  BR_ACTOR_MODEL 
  714.            An object in a scene. The actor references a model structure and 
  715.            default material. 
  716.  BR_ACTOR_LIGHT 
  717.            A light source . The actor references type, positional, directional 
  718.            and colour information in a br_light structure, through the 
  719.            type_data pointer. 
  720.  BR_ACTOR_CAMERA 
  721.            A point from which a scene can be rendered from. The actor 
  722.            references positional, direction and field- of-view information in a 
  723.            br_camera structure, through the type_data pointer. 
  724.  BR_ACTOR_BOUNDS 
  725.            A bounding box . The actor references a br_bounds structure through 
  726.            the type_data pointer, giving the dimensions of the cuboid which 
  727.            contains all or most of this actors descendants. If the bounding box 
  728.            is off-screen, none of its descendants is rendered. 
  729.  BR_ACTOR_BOUNDS_CORRECT 
  730.            A guaranteed bounding box, containing all this actor's descendants. 
  731.            If the bounding box is on-screen, no on-screen check is performed 
  732.            when its descendants are rendered. 
  733.  BR_ACTOR_CLIP_PLANE 
  734.            A clipping plane. The actor references a br_vector4 through the 
  735.            type_data pointer, giving the coefficients of the plane equation of 
  736.            the clip plane. 
  737.  
  738.  See also 
  739.  
  740.   br_actor
  741.   br_light
  742.   br_camera
  743.   br_model
  744.   br_bounds
  745.  
  746.  3.1.1.3  Rendering style 
  747.  
  748.  Description 
  749.  
  750.  Available rendering styles. When BR_RSTYLE_DEFAULT is used, the rendering 
  751.  style is inherited from the most distant ancestor in the world hierarchy with 
  752.  a non-default style. 
  753.  
  754.  Definitions 
  755.  
  756.  BR_RSTYLE_DEFAULT 
  757.            Default style. 
  758.  BR_RSTYLE_NONE 
  759.            Do not render this actor. 
  760.  BR_RSTYLE_POINTS 
  761.            Render vertices only. 
  762.  BR_RSTYLE_EDGES 
  763.            Render edges only with lines. 
  764.  BR_RSTYLE_FACES 
  765.            Render faces. 
  766.  BR_RSTYLE_BOUNDING_POINTS 
  767.            Render bounding box corners with points. 
  768.  BR_RSTYLE_BOUNDING_EDGES 
  769.            Render bounding box edges with lines. 
  770.  BR_RSTYLE_BOUNDING_FACES 
  771.            Render bounding box faces. 
  772.  
  773.  See also 
  774.  
  775.   br_actor
  776.  
  777.  3.1.2  Functions 
  778.  
  779.  3.1.2.1  Actor functions summary 
  780.  
  781.  Syntax 
  782.  
  783.   br_actor * BrActorAllocate(br_uint_8 actor_type, void *type_data);
  784.                              void BrActorFree(br_actor *a);
  785.  
  786.   br_actor * BrActorLoad(char *filename);
  787.   br_uint_32 BrActorLoadMany(char *filename, br_actor **actors, br_uint_16 num);
  788.   br_uint_32 BrActorSave(char *filename, br_actor *actor);
  789.   br_uint_32 BrActorSaveMany(char *filename, br_actor **actors, br_uint_16 num);
  790.  
  791.   br_actor * BrActorAdd(br_actor *parent, br_actor *a);
  792.   br_actor * BrActorRemove(br_actor *a);
  793.  
  794.   br_actor * BrActorSearch(br_actor *root, char *pattern);
  795.   br_uint_32 BrActorSearchMany(br_actor *root, char *pattern,
  796.                                br_actor **actors, int max);
  797.  
  798.   br_uint_32 BrActorEnum(br_actor *parent, br_actor_enum_cbfn *callback,
  799.                          void *arg);
  800.  
  801.   void BrActorRelink(br_actor *parent, br_actor *a);
  802.  
  803.   br_uint_8 BrActorToActorMatrix34(br_matrix34 *m, br_actor *a, br_actor *b);
  804.  
  805.   void BrActorToScreenMatrix4(br_matrix4 *m, br_actor *a, br_actor *camera);
  806.  
  807.  Although many of these functions are similar to those in 'The Registry', they 
  808.  are documented here separately as they relate to hierarchies, rather than 
  809.  individual items. 
  810.  
  811.  3.1.2.2  BrActorAllocate 
  812.  
  813.  Syntax 
  814.  
  815.   br_actor * BrActorAllocate(br_uint_8 actor_type, void *type_data);
  816.  
  817.  Description 
  818.  
  819.  Allocate a new actor. 
  820.  
  821.  Arguments 
  822.  
  823.  actor_type 
  824.            Actor type (see section 3.1.1.2). 
  825.  type_date 
  826.            A pointer to type-specific data. If required but given as NULL, 
  827.            suitable defaults are allocated. 
  828.  
  829.  Return value 
  830.  
  831.  Returns a pointer to the new actor. 
  832.  
  833.  3.1.2.3  BrActorFree 
  834.  
  835.  Syntax 
  836.  
  837.   void BrActorFree(br_actor *a);
  838.  
  839.  Description 
  840.  
  841.  Free an actor, and any children it possesses. 
  842.  
  843.  Arguments 
  844.  
  845.  a 
  846.            A pointer to the actor to be freed. 
  847.  
  848.  3.1.2.4  BrActorLoad 
  849.  
  850.  Syntax 
  851.  
  852.   br_actor * BrActorLoad(char *filename);
  853.  
  854.  Description 
  855.  
  856.  Load a hierarchy of actors. 
  857.  
  858.  Arguments 
  859.  
  860.  *filename 
  861.            Name of the file containing the hierarchy. 
  862.  
  863.  Return value 
  864.  
  865.  Returns a pointer to the actor at the root of the loaded hierarchy, or NULL if 
  866.  unsuccessful. 
  867.  
  868.  3.1.2.5  BrActorLoadMany 
  869.  
  870.  Syntax 
  871.  
  872.   br_uint_32 BrActorLoadMany(char *filename, br_actor **actors, br_uint_16 num);
  873.  
  874.  Description 
  875.  
  876.  Load a number of actor hierarchies. 
  877.  
  878.  Arguments 
  879.  
  880.  *filename 
  881.            Name of the file containing the hierarchies. 
  882.  actors 
  883.            A pointer to an array of pointers to actors. 
  884.  num 
  885.            Maximum number of hierarchies to load. 
  886.  
  887.  Return value 
  888.  
  889.  Returns the number of hierarchies loaded successfully. The pointer array is 
  890.  filled with pointers to the loaded actors. 
  891.  
  892.  3.1.2.6  BrActorSave 
  893.  
  894.  Syntax 
  895.  
  896.   br_uint_32 BrActorSave(char *filename, br_actor *actor);
  897.  
  898.  Description 
  899.  
  900.  Save a hierarchy of actors. 
  901.  
  902.  Arguments 
  903.  
  904.  *filename 
  905.            Name of the file to save the hierarchy to. 
  906.  actor 
  907.            A pointer to an actor, the root of the hierarchy. 
  908.  
  909.  Return value 
  910.  
  911.  Returns NULL if the hierarchy could not be saved. 
  912.  
  913.  3.1.2.7  BrActorSaveMany 
  914.  
  915.  Syntax 
  916.  
  917.   br_uint_32 BrActorSaveMany(char *filename, br_actor **actors, br_uint_16 num);
  918.  
  919.  Description 
  920.  
  921.  Save a number of actor hierarchies. 
  922.  
  923.  Arguments 
  924.  
  925.  *filename 
  926.            Name of the file to save the hierarchies to. 
  927.  actors 
  928.            A pointer to an array of pointers to actors. 
  929.  num 
  930.            Number of hierarchies to save. 
  931.  
  932.  Return value 
  933.  
  934.  Returns the number of hierarchies saved successfully. 
  935.  
  936.  3.1.2.8  BrActorAdd 
  937.  
  938.  Syntax 
  939.  
  940.   br_actor * BrActorAdd(br_actor *parent, br_actor *a);
  941.  
  942.  Description 
  943.  
  944.  Add an actor hierarchy as a child of a given parent. 
  945.  
  946.  Arguments 
  947.  
  948.  parent 
  949.            A pointer to the parental actor. 
  950.  a 
  951.            A pointer to its new child. 
  952.  
  953.  Return value 
  954.  
  955.  Returns a pointer to the added hierarchy. 
  956.  
  957.  3.1.2.9  BrActorRemove 
  958.  
  959.  Syntax 
  960.  
  961.   br_actor * BrActorRemove(br_actor *a);
  962.  
  963.  Description 
  964.  
  965.  Remove an actor hierarchy from its parent. 
  966.  
  967.  Arguments 
  968.  
  969.  a 
  970.            A pointer to the hierarchy to remove. 
  971.  
  972.  Return value 
  973.  
  974.  Returns a pointer to the removed hierarchy. 
  975.  
  976.  3.1.2.10  BrActorSearch 
  977.  
  978.  Syntax 
  979.  
  980.   br_actor * BrActorSearch(br_actor *root, char *pattern);
  981.  
  982.  Description 
  983.  
  984.  Find the first named actor matching a pattern in a given hierarchy. The search 
  985.  pattern can include the standard wildcards '*' and '?'. The search is anchored 
  986.  to the root of the given hierarchy and the search sub-strings for each level 
  987.  in it are delimited with the '/' character. 
  988.  
  989.  Arguments 
  990.  
  991.  root 
  992.            A pointer to an actor hierarchy. 
  993.  *pattern 
  994.            Search pattern. 
  995.  
  996.  Return value 
  997.  
  998.  Returns a pointer to an actor if found, otherwise NULL. 
  999.  
  1000.  Example 
  1001.  
  1002.   br_actor *actor;
  1003.  
  1004.   ...
  1005.  
  1006.   BrActorSearch(actor,"*/*/example_actor");
  1007.  
  1008.  3.1.2.11  BrActorSearchMany 
  1009.  
  1010.  Syntax 
  1011.  
  1012.   br_uint_32 BrActorSearchMany(br_actor *root, char *pattern,
  1013.                                br_actor **actors, int max);
  1014.  
  1015.  Description 
  1016.  
  1017.  Search for a number of named actors in a given hierarchy. The search pattern 
  1018.  is given as for BrActorSearch. 
  1019.  
  1020.  Arguments 
  1021.  
  1022.  root 
  1023.            A pointer to an actor hierarchy. 
  1024.  *pattern 
  1025.            Search pattern. 
  1026.  actors 
  1027.            A pointer to an array of pointers to actors. 
  1028.  max 
  1029.            Maximum number of actors to find. 
  1030.  
  1031.  Return value 
  1032.  
  1033.  Returns the number of actors found. The pointer array is filled with pointers 
  1034.  to the found actors. 
  1035.  
  1036.  3.1.2.12  BrActorEnum 
  1037.  
  1038.  Syntax 
  1039.  
  1040.   br_uint_32 BrActorEnum(br_actor *parent, br_actor_enum_cbfn *callback,
  1041.                          void *arg);
  1042.  
  1043.  Description 
  1044.  
  1045.  Invoke a callback function for each one of an actors children. The callback is 
  1046.  passed a pointer to each child actor, and its second argument is an optional 
  1047.  pointer supplied by the user. The callback itself returns a br_uint_32 value. 
  1048.  The enumeration will halt at any stage if the return value is non-zero. As 
  1049.  demonstrated in the example, the BR_CALLBACK macro must be used to ensure 
  1050.  compiler compatibility. 
  1051.  
  1052.  Arguments 
  1053.  
  1054.  parent 
  1055.            A pointer to an actor. 
  1056.  callback 
  1057.            A pointer to a callback function. 
  1058.  arg 
  1059.            An optional argument to pass to the callback function. 
  1060.  
  1061.  Return value 
  1062.  
  1063.  Returns the first non-zero callback return value, or zero if all children are 
  1064.  enumerated. 
  1065.  
  1066.  Example 
  1067.  
  1068.   br_uint_32 BR_CALLBACK example_callback(br_actor *actor, void *arg)
  1069.   {
  1070.  
  1071.     br_uint_32 value;
  1072.  
  1073.     return(value);
  1074.   }
  1075.  
  1076.   ...
  1077.  
  1078.   {
  1079.     br_actor *example_actor;
  1080.  
  1081.     ...
  1082.  
  1083.     BrActorEnum(example_actor, &example_callback, NULL);  /* Invoke
  1084.                                                          callback for
  1085.                                                          all children of
  1086.                                                          this actor */
  1087.   }
  1088.  
  1089.  3.1.2.13  BrActorRelink 
  1090.  
  1091.  Syntax 
  1092.  
  1093.   void BrActorRelink(br_actor *parent, br_actor *a);
  1094.  
  1095.  Description 
  1096.  
  1097.  Move an actor in a hierarchy, but preserve its apparent world transformation 
  1098.  by manipulating its own transformation as necessary. 
  1099.  
  1100.  Arguments 
  1101.  
  1102.  a 
  1103.            A pointer to an actor. 
  1104.  parent 
  1105.            A pointer to its new parent. 
  1106.  
  1107.  3.1.2.14  BrActorToActorMatrix34 
  1108.  
  1109.  Syntax 
  1110.  
  1111.   br_uint_8 BrActorToActorMatrix34(br_matrix34 *m, br_actor *a, br_actor *b);
  1112.  
  1113.  Description 
  1114.  
  1115.  Accumulate the transformations between one actor and another, representing the 
  1116.  result as a matrix. 
  1117.  
  1118.  Arguments 
  1119.  
  1120.  m 
  1121.            A pointer to the destination matrix. 
  1122.  a,b 
  1123.            Pointers to the actors to accumulate between. 
  1124.  
  1125.  Return value 
  1126.  
  1127.  Returns the type of the accumulated transformation (see section 3.11.1.2). 
  1128.  
  1129.  3.1.2.15  BrActorToScreenMatrix4 
  1130.  
  1131.  Syntax 
  1132.  
  1133.   void BrActorToScreenMatrix4(br_matrix4 *m, br_actor *a, br_actor *camera);
  1134.  
  1135.  Description 
  1136.  
  1137.  Accumulate the transformations between an actor and the screen, representing 
  1138.  the result as a matrix. 
  1139.  
  1140.  Arguments 
  1141.  
  1142.  m 
  1143.            A pointer to the destination matrix. 
  1144.  a 
  1145.            A pointer to an actor. 
  1146.  camera 
  1147.            A pointer to a camera actor. 
  1148.  
  1149.  
  1150. ΓòÉΓòÉΓòÉ 4.2. 3.2  Lights ΓòÉΓòÉΓòÉ
  1151.  
  1152. 3.2.1  Datatypes 
  1153.  
  1154. 3.2.1.1  br_light 
  1155.  
  1156. Structure 
  1157.  
  1158. typedef struct br_light {
  1159.  
  1160.      char *identifier;
  1161.      br_uint_8 type;
  1162.      br_colour colour;
  1163.      br_scalar attenuation_c;
  1164.      br_scalar attenuation_l;
  1165.      br_scalar attenuation_q;
  1166.      br_angle cone_outer;
  1167.      br_angle cone_inner;
  1168.  
  1169. } br_light;
  1170.  
  1171. Description 
  1172.  
  1173. BRender's light data structure. 
  1174.  
  1175. Members 
  1176.  
  1177.  *identifier 
  1178.            Light name. 
  1179.  type 
  1180.            Light type (see section 3.2.1.2). 
  1181.  colour 
  1182.            Light colour (when rendering in true colour). 
  1183.  attenuation_c 
  1184.            Light intensity. 
  1185.  attenuation_l 
  1186.            Linear attenuation factor for point and spot lights. 
  1187.  attenuation_q 
  1188.            Quadratic attenuation factor for point and spot lights. 
  1189.  cone_inner 
  1190.            The angle giving the cone of full-intensity light cast by a spot 
  1191.            light. 
  1192.  cone_outer 
  1193.            The angle giving the cone of illumination of a spot light. 
  1194.  
  1195.  The linear and quadratic attenuation factors determine the degree by which 
  1196.  light intensity falls off with respect to distance and squared distance from 
  1197.  the light source. If d is distance and c, l and q are the constant, linear and 
  1198.  quadratic attenuation factors, then light intensity is proportional to 
  1199.  1/(c+d.l+d.d.q).  The default values supplied for c, l and q are 1.0, 0.0 and 
  1200.  0.0 respectively. 
  1201.  
  1202.  Furthermore, with spot lights, the intensity falls off linearly from maximum 
  1203.  to zero in-between the inner and outer cones. 
  1204.  
  1205.  See also 
  1206.  
  1207.   BrLightEnable
  1208.   BrLightDisable
  1209.  
  1210.  3.2.1.2  Light types 
  1211.  
  1212.  Description 
  1213.  
  1214.  Available light types and options. 
  1215.  
  1216.  Definitions 
  1217.  
  1218.  BR_LIGHT_POINT 
  1219.            A point light source, radiating in all directions. 
  1220.  BR_LIGHT_DIRECT 
  1221.            A directed light source. The light is infinitely distant and shines 
  1222.            along the Z- axis of the light actor. 
  1223.  BR_LIGHT_SPOT 
  1224.            A spot light, with both spatial location and direction. A spot light 
  1225.            has a cone of illumination and shines along the Z- axis of the light 
  1226.            actor. 
  1227.  BR_LIGHT_TYPE 
  1228.            A mask which can be used to strip off any non-type information, for 
  1229.            instance, option flags. 
  1230.  BR_LIGHT_VIEW 
  1231.            An option flag. When set, lighting calculations are performed in 
  1232.            view space rather than model space. This is slower, but prevents odd 
  1233.            anomalies if non-uniform scalings are used on models. 
  1234.  
  1235.  See also 
  1236.  
  1237.   br_light
  1238.   BrMatrix4Perspective
  1239.  
  1240.  3.2.2  Functions 
  1241.  
  1242.  3.2.2.1  BrLightEnable 
  1243.  
  1244.  Syntax 
  1245.  
  1246.   void BrLightEnable(br_actor *l);
  1247.  
  1248.  Description 
  1249.  
  1250.  Enable a light source. By default, light sources are disabled. 
  1251.  
  1252.  Arguments 
  1253.  
  1254.  l 
  1255.            A pointer to a light actor. 
  1256.  
  1257.  See also 
  1258.  
  1259.   BrLightDisable
  1260.  
  1261.  3.2.2.2  BrLightDisable 
  1262.  
  1263.  Syntax 
  1264.  
  1265.   void BrLightDisable(br_actor *l);
  1266.  
  1267.  Description 
  1268.  
  1269.  Disable a light source. 
  1270.  
  1271.  Arguments 
  1272.  
  1273.  l 
  1274.            A pointer to a light actor. 
  1275.  
  1276.  See also 
  1277.  
  1278.   BrLightEnable
  1279.  
  1280.  
  1281. ΓòÉΓòÉΓòÉ 4.3. 3.3  Cameras ΓòÉΓòÉΓòÉ
  1282.  
  1283. 3.3.1  Datatypes 
  1284.  
  1285. 3.3.1.1  br_camera 
  1286.  
  1287. Structure 
  1288.  
  1289. typedef struct br_camera {
  1290.  
  1291.      char *identifier;
  1292.      br_uint_8 type;
  1293.      br_angle field_of_view;
  1294.      br_scalar hither_z;
  1295.      br_scalar yon_z;
  1296.      br_scalar aspect;
  1297.      br_scalar width;
  1298.      br_scalar height;
  1299.  
  1300. } br_camera;
  1301.  
  1302. Description 
  1303.  
  1304. BRender's camera data structure. 
  1305.  
  1306. Members 
  1307.  
  1308.  *identifier 
  1309.            Camera name. 
  1310.  type 
  1311.            Camera type (see section 3.3.1.2). 
  1312.  field_of_view 
  1313.            Field of view (the angle subtended between the sides of the view 
  1314.            volume). Applies only to perspective cameras. 
  1315.  hither_z 
  1316.            Front of view volume, in view coordinates. 
  1317.  yon_z 
  1318.            Back of view volume, in view coordinates. 
  1319.  aspect 
  1320.            Aspect ratio (the ratio between the sides of the view volume). 
  1321.  width, height 
  1322.            Width and height of projection surface. Applies only to parallel 
  1323.            cameras. 
  1324.  
  1325.  See also 
  1326.  
  1327.   BrMatrix4Perspective
  1328.  
  1329.  3.3.1.2  Camera types 
  1330.  
  1331.  Description 
  1332.  
  1333.  Available camera types. 
  1334.  
  1335.  Definitions 
  1336.  
  1337.  BR_CAMERA_PARALLEL 
  1338.            A parallel camera. Object size is independant of its distance from 
  1339.            the camera. 
  1340.  BR_CAMERA_PERSPECTIVE 
  1341.            A standard perspective camera. 
  1342.  
  1343.  See also 
  1344.  
  1345.   br_camera
  1346.  
  1347.  
  1348. ΓòÉΓòÉΓòÉ 4.4. 3.4  Clipping Planes ΓòÉΓòÉΓòÉ
  1349.  
  1350. 3.4.1  Functions 
  1351.  
  1352. 3.4.1.1  BrClipPlaneEnable 
  1353.  
  1354. Syntax 
  1355.  
  1356. void BrClipPlaneEnable(br_actor *cp);
  1357.  
  1358. Description 
  1359.  
  1360. Enable a clip plane. By default, clip planes are disabled. 
  1361.  
  1362. Arguments 
  1363.  
  1364.  cp 
  1365.            A pointer to a clip plane actor. 
  1366.  
  1367.  3.4.1.2  BrClipPlaneDisable 
  1368.  
  1369.  Syntax 
  1370.  
  1371.   void BrClipPlaneDisable(br_actor *cp);
  1372.  
  1373.  Description 
  1374.  
  1375.  Disable a clip plane. 
  1376.  
  1377.  Arguments 
  1378.  
  1379.  cp 
  1380.            A pointer to a clip plane actor. 
  1381.  
  1382.  
  1383. ΓòÉΓòÉΓòÉ 4.5. 3.5  Models ΓòÉΓòÉΓòÉ
  1384.  
  1385. 3.5.1  Datatypes 
  1386.  
  1387. 3.5.1.1 br_model 
  1388.  
  1389. Structure 
  1390.  
  1391. typedef struct br_model {
  1392.  
  1393.      char *identifier;
  1394.      br_vertex *vertices;
  1395.      br_face *faces;
  1396.      br_uint_16 nvertices;
  1397.      br_uint_16 nfaces;
  1398.      br_vector3 pivot;
  1399.      br_uint_16 flags;
  1400.      br_model_custom_cbfn *custom;
  1401.      void *user;
  1402.      br_scalar radius;
  1403.      br_bounds bounds;
  1404.  
  1405. } br_model;
  1406.  
  1407. Description 
  1408.  
  1409. Brender's model data structure, describing a mesh of triangles. 
  1410.  
  1411. Members 
  1412.  
  1413.  *identifier 
  1414.            Model name. 
  1415.  vertices 
  1416.            A pointer to an array of vertices. 
  1417.  faces 
  1418.            A pointer to an array of faces. 
  1419.  nvertices 
  1420.            Number of vertices in the model. 
  1421.  nfaces 
  1422.            Number of faces in the model. 
  1423.  pivot 
  1424.            A vector giving the model's pivot point, or centre of rotation, 
  1425.            relative to its origin. This is the point at which it 'attaches' to 
  1426.            its parent. 
  1427.  flags 
  1428.            Model flags (see section 3.5.1.2). 
  1429.  custom 
  1430.            A custom model callback function. 
  1431.  user 
  1432.            An optional user-supplied pointer. 
  1433.  radius 
  1434.            The bounding radius of the model. 
  1435.  bounds 
  1436.            An axis-aligned bounding box of the model, given in the model's own 
  1437.            coordinate system. 
  1438.  
  1439.  See also 
  1440.  
  1441.   BrModelLoad
  1442.   BrModelUpdate
  1443.  
  1444.  3.5.1.2  Model flags 
  1445.  
  1446.  Description 
  1447.  
  1448.  Available model flags. 
  1449.  
  1450.  Definitions 
  1451.  
  1452.  BR_MODF_DONT_WELD 
  1453.            Vertices with the same coordinates cannot be merged. 
  1454.  BR_MODF_KEEP_ORIGINAL 
  1455.            Don't free original vertices and faces during model update. 
  1456.  BR_MODF_GENERATE_TAGS 
  1457.            Allocate and fill face and vertex tag tables, which map updated face 
  1458.            and vertex indices back to the original face and vertex indices. 
  1459.  BR_MODF_QUICK_UPDATE 
  1460.            Perform fast model update. This may produce slower models. 
  1461.  BR_MODF_CUSTOM 
  1462.            Invoke a custom callback for this model (see section 3.5.3). 
  1463.  
  1464.  See also 
  1465.  
  1466.   BrModelUpdate
  1467.  
  1468.  3.5.1.3  br_face 
  1469.  
  1470.  Structure 
  1471.  
  1472.   struct br_face {
  1473.  
  1474.        br_uint_16 vertices[3];
  1475.        br_material *material;
  1476.        br_uint_16 smoothing;
  1477.        br_uint_8 flags;
  1478.  
  1479.   } br_face;
  1480.  
  1481.  Description 
  1482.  
  1483.  The face data structure, describing a single triangular face. 
  1484.  
  1485.  Members 
  1486.  
  1487.  vertices 
  1488.            An array of vertex indices specifying the vertices of this face. 
  1489.  material 
  1490.            Pointer to the material structure associated with this face. 
  1491.  smoothing 
  1492.            A 16-bit field in which each bit represents a smoothing group. If, 
  1493.            when smooth-shading a surface, two adjacent faces share a smoothing 
  1494.            group, the edge between them will be smooth. 
  1495.  flags 
  1496.            Face flags (see section 3.5.1.4). 
  1497.  
  1498.  See also 
  1499.  
  1500.   br_material
  1501.   br_model
  1502.   br_vertex
  1503.  
  1504.  3.5.1.4  Face flags 
  1505.  
  1506.  Description 
  1507.  
  1508.  Face flags, indicating whether the edges of the face abut co-planar faces, and 
  1509.  thus do not need to be drawn in the wire-frame render style BR_RSTYLE_EDGES. 
  1510.  
  1511.  Definitions 
  1512.  
  1513.  BR_FACEF_COPLANAR_0 
  1514.            The face adjoining edge 0 is coplanar with this face. 
  1515.  BR_FACEF_COPLANAR_1 
  1516.            The face adjoining edge 1 is coplanar with this face. 
  1517.  BR_FACEF_COPLANAR_2 
  1518.            The face adjoining edge 2 is coplanar with this face. 
  1519.  
  1520.  3.5.1.5  br_vertex 
  1521.  
  1522.  Structure 
  1523.  
  1524.   typedef struct br_vertex {
  1525.  
  1526.        br_vector3 p;
  1527.        br_vector2 map;
  1528.        br_uint_8 index;
  1529.        br_uint_8 red;
  1530.        br_uint_8 grn;
  1531.        br_uint_8 blu;
  1532.  
  1533.   } br_vertex;
  1534.  
  1535.  Description 
  1536.  
  1537.  The vertex data structure, describing a single vertex in a model. 
  1538.  
  1539.  Members 
  1540.  
  1541.  p 
  1542.            Coordinates of a point in model space. 
  1543.  map 
  1544.            Texture coordinates of this vertex. 
  1545.  index 
  1546.            Colour index for pre-lit models. 
  1547.  red, grn, blu 
  1548.            True colour values for pre-lit models. 
  1549.  
  1550.  See also 
  1551.  
  1552.   br_face
  1553.   br_model
  1554.  
  1555.  3.5.1.6  br_bounds 
  1556.  
  1557.  Structure 
  1558.  
  1559.   typedef struct br_bounds {
  1560.  
  1561.        br_vector3 min;
  1562.        br_vector3 max;
  1563.  
  1564.   } br_bounds;
  1565.  
  1566.  Description 
  1567.  
  1568.  A data structure describing an axis-aligned bounding box for a model or 
  1569.  hierarchy of actors. 
  1570.  
  1571.  Members 
  1572.  
  1573.  min 
  1574.            Co-ordinates of the minimal corner of the bounding box. 
  1575.  max 
  1576.            Co-ordinates of the maximal corner of the bounding box. 
  1577.  
  1578.  3.5.2  Functions 
  1579.  
  1580.  3.5.2.1  Model functions summary 
  1581.  
  1582.   br_model * BrModelAllocate(char *name, int nvertices, int nfaces);
  1583.   void BrModelFree(br_model *model);
  1584.  
  1585.   br_model * BrModelLoad(char *filename);
  1586.   br_uint_32 BrModelLoadMany(char *filename,br_model **models,int num);
  1587.   br_uint_32 BrModelSave(char *filename,br_model *model);
  1588.   br_uint_32 BrModelSaveMany(char *filename,br_model **models,int num);
  1589.  
  1590.   br_model * BrModelAdd(br_model *model);
  1591.   br_uint_32 BrModelAddMany(br_model **models, int n);
  1592.   br_model * BrModelRemove(br_model *model);
  1593.   br_uint_32 BrModelRemoveMany(br_model **items, int n);
  1594.  
  1595.   br_model * BrModelFind(char *pattern);
  1596.   br_uint_32 BrModelFindMany(char *pattern, br_model **models, int max);
  1597.   br_model_find_cbfn * BrModelFindHook(br_model_find_cbfn *hook);
  1598.  
  1599.   br_uint_32 BrModelCount(char *pattern);
  1600.   br_uint_32 BrModelEnum(char *pattern);
  1601.  
  1602.   void BrModelUpdate(br_model *model, br_uint_16 flags);
  1603.  
  1604.   void BrModelApplyMap(br_model *model,int map_type, br_matrix34 *xform);
  1605.  
  1606.   br_matrix34 * BrModelFitMap(br_model *model, int axis_0, int axis_1,
  1607.                               br_matrix34 *transform);
  1608.  
  1609.  Most of these functions are standard BRender Registry functions and are 
  1610.  documented under 'The Registry'. Only those exclusive to models are documented 
  1611.  here. 
  1612.  
  1613.  3.5.2.2  BrModelApplyMap 
  1614.  
  1615.  Syntax 
  1616.  
  1617.   void BrModelApplyMap(br_model *model, int map_type, br_matrix34 *xform);
  1618.  
  1619.  Description 
  1620.  
  1621.  Generate texture coordinates (u,v) for a model's vertices, using a planar, 
  1622.  spherical, cylindrical, disc or null mapping. The model's vertices can be 
  1623.  pre-transformed by an optional matrix. 
  1624.  
  1625.  Arguments 
  1626.  
  1627.  model 
  1628.            A pointer to a model. 
  1629.  map_type 
  1630.            Mapping type (see section 3.5.2.3). 
  1631.  xform 
  1632.            A pointer to an optional matrix. If NULL, the identity 
  1633.            transformation is used. 
  1634.  
  1635.  See also 
  1636.  
  1637.   BrModelFitMap
  1638.  
  1639.  3.5.2.3  Mapping types 
  1640.  
  1641.  Description 
  1642.  
  1643.  Available texture-mapping schemes. 
  1644.  
  1645.  Definitions 
  1646.  
  1647.  BR_APPLYMAP_NONE 
  1648.            No mapping. 
  1649.  
  1650.            u = 0    v = 0 
  1651.  BR_APPLYMAP_PLANE 
  1652.            A planar mapping. 
  1653.  BR_APPLYMAP_CYLINDER 
  1654.            A cylindrical mapping. This can be visualised by imagining a texture 
  1655.            wrapped around the outside of a cylinder. 
  1656.  BR_APPLYMAP_SPHERE 
  1657.            A spherical mapping. Similar to a cylindrical mapping, but the ends 
  1658.            of the cylinder are shrunk to single points. 
  1659.  BR_APPLYMAP_DISC 
  1660.            A disc mapping. This can be visualised by considering a cylindrical 
  1661.            mapping, shrinking one end of the cylinder to a point and then 
  1662.            flattening it to form a disc. 
  1663.  
  1664.  3.5.2.4  BrModelFitMap 
  1665.  
  1666.  Syntax 
  1667.  
  1668.   br_matrix34 * BrModelFitMap(br_model *model, int axis_0, int axis_1,
  1669.                               br_matrix34 *transform);
  1670.  
  1671.  Description 
  1672.  
  1673.  Generate a transformation which will map the bounds of a model onto a cube 
  1674.  defined by the corner coordinates (-1,-1,-1) and (1,1,1). When passed to 
  1675.  BrModelApplyMap, texture coordinates will be generated which fit the model 
  1676.  exactly. The two axes along which the mapping is applied must be specified.
  1677.  
  1678.  Arguments 
  1679.  
  1680.  model 
  1681.            A pointer to a model. 
  1682.  transform 
  1683.            A pointer to the destination transformation matrix. 
  1684.  axis_0, axis_1 
  1685.            Mapping axes, defined as follows: 
  1686.  
  1687.       BR_FITMAP_PLUS_X 
  1688.       BR_FITMAP_PLUS_Y 
  1689.       BR_FITMAP_PLUS_Z 
  1690.       BR_FITMAP_MINUS_X 
  1691.       BR_FITMAP_MINUS_Y 
  1692.       BR_FITMAP_MINUS_Z 
  1693.  
  1694.  Return value 
  1695.  
  1696.  Returns a pointer to the destination transformation matrix. 
  1697.  
  1698.  See also 
  1699.  
  1700.   BrModelApplyMap
  1701.  
  1702.  3.5.3  Custom model callback functions 
  1703.  
  1704.  3.5.3.1  Callback function type 
  1705.  
  1706.  Syntax 
  1707.  
  1708.   typedef void BR_CALLBACK br_model_custom_cbfn(br_actor *actor,
  1709.                                                 br_model *model,
  1710.                                                 br_material *material,
  1711.                                                 br_uint_8 style,
  1712.                                                 int on_screen,
  1713.                                                 br_matrix34 *model_to_view,
  1714.                                                 br_matrix4 *model_to_screen);
  1715.  
  1716.  Description 
  1717.  
  1718.  Type definition for a custom model callback function. The BR_CALLBACK macro 
  1719.  must be used to ensure compiler compatibility. The functions given in sections 
  1720.  3.5.3.2 to 3.5.3.8 are used within custom model callbacks. They relate to the 
  1721.  model which invoked the callback. 
  1722.  
  1723.  The following arguments are passed to the callback. 
  1724.  
  1725.  Arguments 
  1726.  
  1727.  actor 
  1728.            A pointer to the model's actor structure. 
  1729.  model 
  1730.            A pointer to the model itself. 
  1731.  material 
  1732.            A pointer to the model's default material. 
  1733.  style 
  1734.            The model's rendering style. 
  1735.  on_screen 
  1736.            On-screen flag (either OSC_PARTIAL or OSC_ACCEPT). 
  1737.  model_to_view 
  1738.            A pointer to a matrix giving the model to view space transformation. 
  1739.  model_to_screen 
  1740.            A pointer to a matrix giving the model to screen transformation. 
  1741.  
  1742.  3.5.3.2  BrOnScreenCheck 
  1743.  
  1744.  Syntax 
  1745.  
  1746.   br_uint_8 BrOnScreenCheck(br_bounds *bounds);
  1747.  
  1748.  Description 
  1749.  
  1750.  Check the model's bounding box against the view volume. 
  1751.  
  1752.  Arguments 
  1753.  
  1754.  bounds 
  1755.            A pointer to a br_bounds structure giving the model's bounding box 
  1756.            dimensions. 
  1757.  
  1758.  Return value 
  1759.  
  1760.  Returns one of the following: 
  1761.  
  1762.  OSC_REJECT 
  1763.            Completely off-screen. 
  1764.  OSC_PARTIAL 
  1765.            Partially on-screen. 
  1766.  OSC_ACCEPT 
  1767.            Completely on-screen. 
  1768.  
  1769.  3.5.3.3 BrOriginToScreenXY 
  1770.  
  1771.  Syntax 
  1772.  
  1773.   br_uint_8 BrOriginToScreenXY(br_vector2 *screen);
  1774.  
  1775.  Description 
  1776.  
  1777.  Transform and project the model's origin onto the screen. 
  1778.  
  1779.  Arguments 
  1780.  
  1781.  screen 
  1782.            A pointer to the destination vector. 
  1783.  
  1784.  Return value 
  1785.  
  1786.  Returns NULL if the origin is in front of the camera. 
  1787.  
  1788.  3.5.3.4 BrOriginToScreenXYZO 
  1789.  
  1790.  Syntax 
  1791.  
  1792.   br_uint_32 BrOriginToScreenXYZO(br_vector3 *screen);
  1793.  
  1794.  Description 
  1795.  
  1796.  Transform and project the model's origin onto the screen, generating X, Y and 
  1797.  Z coordinates. If the point is off-screen, it is not projected. 
  1798.  
  1799.  Arguments 
  1800.  
  1801.  screen 
  1802.            A pointer to the destination vector. 
  1803.  
  1804.  Return value 
  1805.  
  1806.  Returns the origin's outcode, made up from the following flags: 
  1807.  
  1808.  OUTCODE_LEFT = 0x01 
  1809.            Set if outside left plane. 
  1810.  OUTCODE_RIGHT = 0x02 
  1811.            Set if outside right plane. 
  1812.  OUTCODE_TOP = 0x04 
  1813.            Set if outside top plane. 
  1814.  OUTCODE_BOTTOM = 0x08 
  1815.            Set if outside bottom plane. 
  1816.  OUTCODE_HITHER = 0x10 
  1817.            Set if outside hither plane. 
  1818.  OUTCODE_YON = 0x20 
  1819.            Set if outside yon plane. 
  1820.  
  1821.  3.5.3.5  BrPointToScreenXY 
  1822.  
  1823.  Syntax 
  1824.  
  1825.   br_uint_8 BrPointToScreenXY(br_vector2 *screen, br_vector3 *point);
  1826.  
  1827.  Description 
  1828.  
  1829.  Transform and project a single point in the model's coordinate system onto the 
  1830.  screen. 
  1831.  
  1832.  Arguments 
  1833.  
  1834.  screen 
  1835.            A pointer to the destination vector. 
  1836.  point 
  1837.            A pointer to the source vector. 
  1838.  
  1839.  Return value 
  1840.  
  1841.  Returns NULL if the point is in front of the camera. 
  1842.  
  1843.  3.5.3.6  BrPointToScreenXYMany 
  1844.  
  1845.  Syntax 
  1846.  
  1847.   void BrPointToScreenXYMany(br_vector2 *screens, br_vector3 *points,
  1848.                              br_uint_32 npoints);
  1849.  
  1850.  Description 
  1851.  
  1852.  Transform and project a number of points in the model's coordinate system onto 
  1853.  the screen. 
  1854.  
  1855.  Arguments 
  1856.  
  1857.  screens 
  1858.            A pointer to an array of destination vectors. 
  1859.  points 
  1860.            A pointer to an array of source vectors. 
  1861.  npoints 
  1862.            Number of points. 
  1863.  
  1864.  3.5.3.7  BrPointToScreenXYZO 
  1865.  
  1866.  Syntax 
  1867.  
  1868.   br_uint_32 BrPointToScreenXYZO(br_vector3 *screen, br_vector3 *point);
  1869.  
  1870.  Description 
  1871.  
  1872.  Transform and project a single point in the model's coordinate system onto the 
  1873.  screen, generating X, Y and Z coordinates. If the point is off-screen, it is 
  1874.  not projected. 
  1875.  
  1876.  Arguments 
  1877.  
  1878.  screen 
  1879.            A pointer to the destination vector. 
  1880.  point 
  1881.            A pointer to the source vector. 
  1882.  
  1883.  Return value 
  1884.  
  1885.  Returns the point's outcode. 
  1886.  
  1887.  See also 
  1888.  
  1889.   BrOriginToScreenXYZO
  1890.  
  1891.  3.5.3.8  BrPointToScreenXYZOMany 
  1892.  
  1893.  Syntax 
  1894.  
  1895.   void BrPointToScreenXYZOMany(br_vector3 *screens, br_uint_32 *outcodes,
  1896.                                br_vector3 *points, br_uint_32 npoints);
  1897.  
  1898.  Description 
  1899.  
  1900.  Transform and project a number of points in the model's coordinate system onto 
  1901.  the screen, generating outcodes and X, Y and Z coordinates. If any points are 
  1902.  off-screen, they are not projected. 
  1903.  
  1904.  Arguments 
  1905.  
  1906.  screens 
  1907.            A pointer to an array of destination vectors. 
  1908.  outcodes 
  1909.            A pointer to an array of outcodes. 
  1910.  points 
  1911.            A pointer to an array of source vectors. 
  1912.  npoints 
  1913.            Number of points. 
  1914.  
  1915.  See also 
  1916.  
  1917.   BrOriginToScreenXYZO
  1918.  
  1919.  
  1920. ΓòÉΓòÉΓòÉ 4.6. 3.6  Materials ΓòÉΓòÉΓòÉ
  1921.  
  1922. 3.6.1  Datatypes 
  1923.  
  1924. 3.6.1.1  br_material 
  1925.  
  1926. Structure 
  1927.  
  1928. typedef struct br_matrix23 {
  1929.  
  1930.      br_scalar m[3][2];
  1931.  
  1932. } br_matrix23;
  1933.  
  1934. typedef struct br_material {
  1935.  
  1936.      char *identifier;
  1937.      br_colour colour;
  1938.      br_ufraction ka;
  1939.      br_ufraction kd;
  1940.      br_ufraction ks;
  1941.      br_scalar power;
  1942.      br_uint_32 flags;
  1943.      br_matrix23 map_transform;
  1944.      br_uint_8 index_base;
  1945.      br_uint_8 index_range;
  1946.      br_pixelmap *colour_map;
  1947.      br_pixelmap *index_shade;
  1948.  
  1949. } br_material;
  1950.  
  1951. Description 
  1952.  
  1953. A structure which describes the appearance of a material that can be applied to 
  1954. a surface. 
  1955.  
  1956. Members 
  1957.  
  1958.  *identifier 
  1959.            Material name. 
  1960.  colour 
  1961.            Material colour, when rendering in true colour. 
  1962.  ka 
  1963.            The ambient lighting contribution for this material. 
  1964.  kd 
  1965.            The directional lighting contribution for this material. Zero will 
  1966.            give a matte surface, whereas one will give a very smooth surface. 
  1967.  ks 
  1968.            The specular lighting contribution for this material. Zero will give 
  1969.            a matte surface, whereas one will give a glossy, polished surface 
  1970.            with highlights. 
  1971.  power 
  1972.            Specular power, determining the 'spread' of a specular highlight. 
  1973.            Zero will give a diffuse highlight, whereas 100 will give a very 
  1974.            localised highlight. 
  1975.  flags 
  1976.            Flags determining how this material is rendered (see section 
  1977.            3.6.1.2). 
  1978.  map_transform 
  1979.            A matrix representing a general texture map transformation, allowing 
  1980.            textures to be rotated, scaled, sheared or translated as necessary. 
  1981.  index_base 
  1982.            The base of an index into a shade table. Used for flat or smooth 
  1983.            shaded materials. 
  1984.  index_range 
  1985.            The range of an index into a shade table. 
  1986.  colour_map 
  1987.            A pointer to a pixelmap containing the texture for this material. If 
  1988.            NULL, the material is not texture-mapped. Zero elements in the 
  1989.            texture will appear transparent. 
  1990.  index_shade 
  1991.            A pointer to a shade table for this material. 
  1992.  
  1993.  See also 
  1994.  
  1995.   br_colour
  1996.   br_pixelmap
  1997.  
  1998.   BrEnvironmentSet
  1999.   BrModelApplyMap
  2000.   BrModelFitMap
  2001.  
  2002.  3.6.1.2  Material flags 
  2003.  
  2004.  Description 
  2005.  
  2006.  Available material rendering styles. 
  2007.  
  2008.  Definitions 
  2009.  
  2010.  BR_MATF_LIGHT 
  2011.            The material is lit. 
  2012.  
  2013.  BR_MATF_PRELIT 
  2014.            The material is pre-lit, in which case colours are taken directly 
  2015.            from the model's vertex structures. 
  2016.  
  2017.  BR_MATF_SMOOTH 
  2018.            The material is smooth (Gouraud) shaded. 
  2019.  
  2020.  BR_MATF_ENVIRONMENT_I 
  2021.            The material is environment-mapped with a viewpoint at infinity. 
  2022.  
  2023.  BR_MATF_ENVIRONMENT_L 
  2024.            The material is environment-mapped with a local viewpoint. 
  2025.  
  2026.  BR_MATF_PERSPECTIVE 
  2027.            The material is perspective texture-mapped. 
  2028.  
  2029.  BR_MATF_DECAL 
  2030.            Zero elements in the texture map are transparent, but allow the 
  2031.            non-texture mapped material underneath to show through. For example, 
  2032.            this could be used to add symbols or logos to a smooth shaded model. 
  2033.  
  2034.  BR_MATF_ALWAYS_VISIBLE 
  2035.            The material will always be visible, and so back-face culling need 
  2036.            not be performed. 
  2037.  
  2038.  BR_MATF_TWO_SIDED 
  2039.            The material has two sides, and lighting calculations are performed 
  2040.            for both of them. 
  2041.  
  2042.  BR_MATF_FORCE_Z_0 
  2043.            The material is automatically in front of all other materials. 
  2044.  
  2045.  3.6.2  Functions 
  2046.  
  2047.  3.6.2.1  Material functions summary 
  2048.  
  2049.   br_material * BrMaterialAllocate(char *name);
  2050.   void BrMaterialFree(br_material *material);
  2051.  
  2052.   br_material * BrMaterialLoad(char *filename);
  2053.   br_uint_32 BrMaterialLoadMany(char *filename, br_material **materials,
  2054.                                 br_uint_16 num);
  2055.   br_uint_32 BrMaterialSave(char *filename, br_material *material);
  2056.   br_uint_32 BrMaterialSaveMany(char *filename, br_material **materials,
  2057.                                 br_uint_16 num);
  2058.  
  2059.   br_material * BrMaterialAdd(br_material *material);
  2060.   br_uint_32 BrMaterialAddMany(br_material **items, int n);
  2061.   br_material * BrMaterialRemove(br_material *material);
  2062.   br_uint_32 BrMaterialRemoveMany(br_material **items, int n);
  2063.  
  2064.   br_material * BrMaterialFind(char *pattern);
  2065.   br_uint_32 BrMaterialFindMany(char *pattern, br_material **materials, int max);
  2066.   br_material_find_cbfn * BrMaterialFindHook(br_material_find_cbfn *hook);
  2067.  
  2068.   br_uint_32 BrMaterialCount(char *pattern);
  2069.   br_uint_32 BrMaterialEnum(char *pattern);
  2070.  
  2071.   void BrMaterialUpdate (br_material *material, br_uint_16 flags);
  2072.  
  2073.  These functions are documented under 'The Registry'. 
  2074.  
  2075.  
  2076. ΓòÉΓòÉΓòÉ 4.7. 3.7  Maps ΓòÉΓòÉΓòÉ
  2077.  
  2078. 3.7.1  Functions 
  2079.  
  2080. 3.7.1.1  Map functions summary 
  2081.  
  2082. br_pixelmap * BrMapAdd(br_pixelmap *pixelmap);
  2083. br_uint_32 BrMapAddMany(br_pixelmap **pixelmaps, int n);
  2084. br_pixelmap * BrMapRemove(br_pixelmap *pixelmap);
  2085. br_uint_32 BrMapRemoveMany(br_pixelmap **pixelmaps, int n);
  2086.  
  2087. br_pixelmap * BrMapFind(char *pattern);
  2088. br_uint_32 BrMapFindMany(char *pattern, br_pixelmap **pixelmaps, int max);
  2089. br_map_find_cbfn * BrMapFindHook(br_map_find_cbfn *hook);
  2090.  
  2091. br_uint_32 BrMapCount(char *pattern);
  2092. br_uint_32 BrMapEnum(char *pattern);
  2093.  
  2094. void BrMapUpdate(br_pixelmap *pixelmap, br_uint_16 flags);
  2095.  
  2096. br_actor * BrEnvironmentSet(br_actor *a);
  2097.  
  2098. Most of these functions are standard BRender Registry functions and are 
  2099. documented under 'The Registry'. Only those exclusive to maps are documented 
  2100. here. 
  2101.  
  2102. 3.7.1.2  BrEnvironmentSet 
  2103.  
  2104. Syntax 
  2105.  
  2106. br_actor * BrEnvironmentSet(br_actor *a);
  2107.  
  2108. Description 
  2109.  
  2110. Set a new environment anchor. By default, the reflective effect produced by an 
  2111. environment map on the surface of a model appears to rotate with the model 
  2112. itself. If this is unsatisfactory, the map can be anchored to an actor. If the 
  2113. actor is the root of a world hierarchy, then reflections will appear more 
  2114. realistic. 
  2115.  
  2116. Arguments 
  2117.  
  2118.  a 
  2119.            A pointer to an actor. 
  2120.  
  2121.  Return value 
  2122.  
  2123.  Returns a pointer to the old environment anchor. 
  2124.  
  2125.  
  2126. ΓòÉΓòÉΓòÉ 4.8. 3.8  Pixelmaps ΓòÉΓòÉΓòÉ
  2127.  
  2128. 3.8.1  Datatypes 
  2129.  
  2130. 3.8.1.1  br_pixelmap 
  2131.  
  2132. Structure 
  2133.  
  2134. typedef struct br_pixelmap {
  2135.  
  2136.      char *identifier;
  2137.      void *pixels;
  2138.      br_pixelmap *map;
  2139.      br_int_16 row_bytes;
  2140.      br_uint_8 type;
  2141.      br_uint_8 flags;
  2142.      br_uint_16 base_x;
  2143.      br_uint_16 base_y;
  2144.      br_uint_16 width;
  2145.      br_uint_16 height;
  2146.      br_int_16 origin_x;
  2147.      br_int_16 origin_y;
  2148.      void *device;
  2149.  
  2150. } br_pixelmap;
  2151.  
  2152. Description 
  2153.  
  2154. BRender's pixelmap structure, used for texture maps, tables, colour buffers and 
  2155. Z-buffers. 
  2156.  
  2157. Members 
  2158.  
  2159.  *identifier 
  2160.            An optional name for texture maps and tables. 
  2161.  pixels 
  2162.            A pointer to raw pixel data. 
  2163.  map 
  2164.            A pointer to a colour-map, used when pixels colours are indexed. 
  2165.  row_bytes 
  2166.            The number of bytes between pixels at the same column of adjacent 
  2167.            rows. 
  2168.  type 
  2169.            Individual pixel type (see section 3.8.1.2). 
  2170.  base_x,base_y 
  2171.            Coordinates of the top-left of the region in use, relative to the 
  2172.            pixel pointed to by pixels. 
  2173.  width,height 
  2174.            Width and height of pixelmap, in pixels. 
  2175.  origin_x,origin_y 
  2176.            Local origin for rendering into the pixelmap, relative to 
  2177.            base_x,base_y. 
  2178.  device 
  2179.            A device pointer, used if the pixelmap originated from a device. 
  2180.  
  2181.  3.8.1.2  Pixelmap types 
  2182.  
  2183.  Description 
  2184.  
  2185.  Various types of pixel. 
  2186.  
  2187.  Definitions 
  2188.  
  2189.  Unless stated otherwise, the numerical suffixes give the number of bits used 
  2190.  per colour or alpha channel, per pixel. 
  2191.  
  2192.  BR_PMT_INDEX_1                Each pixel is an index into a colour map. The 
  2193.  BR_PMT_INDEX_2                numerical suffix gives the number of bits used 
  2194.  BR_PMT_INDEX_4                per pixel. 
  2195.  BR_PMT_INDEX_8 
  2196.  
  2197.  
  2198.  BR_PMT_RGB_555                True colour RGB, 16 bits total per pixel. 
  2199.  BR_PMT_RGB_565                True colour RGB, 16 bits total per pixel. 
  2200.  BR_PMT_RGB_888                True colour RGB, 24 bits total per pixel. 
  2201.  BR_PMT_RGBX_888               True colour RGB, 32 bits total per pixel. 
  2202.  BR_PMT_RGBA_8888              True colour RGB with an alpha channel, 32 bits 
  2203.                                total per pixel. 
  2204.  
  2205.  
  2206.  BR_PMT_DEPTH_16               The pixelmap is used as a Z-buffer. The 
  2207.                                numerical 
  2208.  BR_PMT_DEPTH_32               suffix gives the number of bits used per pixel. 
  2209.  
  2210.  3.8.2  Functions 
  2211.  
  2212.  3.8.2.1  Pixelmap functions summary 
  2213.  
  2214.   br_pixelmap * BrPixelmapAllocate(br_uint_8 type, br_uint_16 w,
  2215.                                    br_uint_16 h, void *pixels, int flags);
  2216.   br_pixelmap * BrPixelmapAllocateSub(br_pixelmap *pm, br_uint_16 x,
  2217.                                       br_uint_16 y, br_uint_16 w, br_uint_16 h);
  2218.   void BrPixelmapFree(br_pixelmap *pm);
  2219.  
  2220.   br_pixelmap * BrPixelmapLoad(char *filename);
  2221.   br_uint_32 BrPixelmapLoadMany(char *filename, br_pixelmap **pixelmaps,
  2222.                                 br_uint_16 num);
  2223.   br_uint_32 BrPixelmapSave(char *filename, br_pixelmap *pixelmap);
  2224.   br_uint_32 BrPixelmapSaveMany(char *filename, br_pixelmap **pixelmaps,
  2225.                                 br_uint_16 num);
  2226.  
  2227.   br_uint_16 BrPixelmapPixelSize(br_pixelmap *pm);
  2228.   br_uint_16 BrPixelmapChannels(br_pixelmap *pm);
  2229.  
  2230.   br_pixelmap * BrPixelmapDoubleBuffer(br_pixelmap *dst, br_pixelmap *src);
  2231.   br_pixelmap * BrPixelmapMatch(br_pixelmap *src, int match_type);
  2232.   br_pixelmap * BrPixelmapClone(br_pixelmap *src);
  2233.  
  2234.   void BrPixelmapFill(br_pixelmap *dat, br_uint_32 colour);
  2235.   void BrPixelmapCopy(br_pixelmap *dst, br_pixelmap *src);
  2236.  
  2237.   void BrPixelmapDirtyRectangleCopy(br_pixelmap *dst, br_pixelmap *src,
  2238.                     br_int_16 x, br_int_16 y, br_uint_16 w, br_uint_16 h);
  2239.   void BrPixelmapDirtyRectangleFill(br_pixelmap *dst, br_int_16 x,
  2240.                     br_int_16 y, br_uint_16 w, br_uint_16 h, br_uint_32 colour);
  2241.  
  2242.   void BrPixelmapRectangleCopy (br_pixelmap *dst, br_int_16 dx, br_int_16 dy,
  2243.                  br_pixelmap *src, br_int_16 sx, br_int_16 sy,
  2244.                  br_uint_16 w, br_uint_16 h);
  2245.   void BrPixelmapRectangleFill(br_pixelmap *dst, br_int _16 x, br_int_32 y,
  2246.                  br_uint_16 w, br_uint_16 h, br_uint_32 colour);
  2247.  
  2248.   void BrPixelmapPlot(br_pixelmap *dst, br_int_16 x, br_int_16 y,
  2249.                       br_uint_32 colour);
  2250.   void BrPixelmapLine(br_pixelmap *dst, br_int_16 x1 , br_int_16 y1,
  2251.                       br_int_16 x2, br_int_16 y2, br_uint_32 colour);
  2252.  
  2253.   void BrPixelmapText(br_pixelmap *dst, br_int_16 x, br_int_16 y,
  2254.                       br_uint_32 colour, br_font *font, char *text);
  2255.   void BrPixelmapTextF(br_pixelmap *dst,br_int_16 x, br_int_16 y,
  2256.                        br_uint_32 colour, br_font *font, char *fmt, ...);
  2257.  
  2258.   br_uint_16 BrPixelmapTextWidth(br_pixelmap *dst, br_font *font, char *text);
  2259.   br_uint_16 BrPixelmapTextHeight(br_pixelmap *dst, br_font *font);
  2260.  
  2261.  Some of these functions are standard BRender Registry functions and are 
  2262.  documented under 'The Registry'. Only those exclusive to pixelmaps are 
  2263.  documented here. 
  2264.  
  2265.  3.8.2.2  BrPixelmapPixelSize 
  2266.  
  2267.  Syntax 
  2268.  
  2269.   br_uint_16 BrPixelmapPixelSize(br_pixelmap *pm);
  2270.  
  2271.  Description 
  2272.  
  2273.  Find the pixel size for a given pixelmap. 
  2274.  
  2275.  Arguments 
  2276.  
  2277.  pm 
  2278.            A pointer to a pixelmap. 
  2279.  
  2280.  Return value 
  2281.  
  2282.  Returns the size of each pixel, in bits. 
  2283.  
  2284.  3.8.2.3  BrPixelmapChannels 
  2285.  
  2286.  Syntax 
  2287.  
  2288.   br_uint_16 BrPixelmapChannels(br_pixelmap *pm);
  2289.  
  2290.  Description 
  2291.  
  2292.  Find the channels available for a given pixelmap. 
  2293.  
  2294.  Arguments 
  2295.  
  2296.  pm 
  2297.            A pointer to a pixelmap. 
  2298.  
  2299.  Return value 
  2300.  
  2301.  Returns a mask giving the available channels, given the following definitions: 
  2302.  
  2303.   BR_PMCHAN_INDEX = 0x0001
  2304.   BR_PMCHAN_RGB   = 0x0002
  2305.   BR_PMCHAN_DEPTH = 0x0004
  2306.   BR_PMCHAN_ALPHA = 0x0008
  2307.   BR_PMCHAN_YUV   = 0x0010
  2308.  
  2309.  3.8.2.4  BrPixelmapDoubleBuffer 
  2310.  
  2311.  Syntax 
  2312.  
  2313.   br_pixelmap * BrPixelmapDoubleBuffer(br_pixelmap *dst, br_pixelmap *src);
  2314.  
  2315.  Description 
  2316.  
  2317.  If the destination pixelmap relates to a device, for example a graphics 
  2318.  hardware screen, then the source 'off-screen' pixelmap is swapped with the 
  2319.  destination pixelmap. 
  2320.  
  2321.  Otherwise, the source pixelmap is copied to the destination pixelmap. 
  2322.  
  2323.  Arguments 
  2324.  
  2325.  dst 
  2326.            A pointer to the destination pixelmap. 
  2327.  src 
  2328.            A pointer to the source pixelmap. 
  2329.  
  2330.  Return value 
  2331.  
  2332.  Always returns a pointer to an 'off-screen' pixelmap which the next frame can 
  2333.  be rendered into. 
  2334.  
  2335.  3.8.2.5  BrPixelmapMatch 
  2336.  
  2337.  Syntax 
  2338.  
  2339.   br_pixelmap * BrPixelmapMatch(br_pixelmap *src, int match_type);
  2340.  
  2341.  Description 
  2342.  
  2343.  Given a pixelmap, allocate either a depth buffer or an off-screen colour 
  2344.  buffer with the same dimensions. 
  2345.  
  2346.  Arguments 
  2347.  
  2348.  src 
  2349.            A pointer to the source pixelmap. 
  2350.  match_type 
  2351.            Either BR_PMMATCH_OFFSCREEN or BR_PMMATCH_DEPTH_16. 
  2352.  
  2353.  Return value 
  2354.  
  2355.  Returns a pointer to the matching pixelmap. 
  2356.  
  2357.  3.8.2.6  BrPixelmapClone 
  2358.  
  2359.  Syntax 
  2360.  
  2361.   br_pixelmap * BrPixelmapClone(br_pixelmap *src);
  2362.  
  2363.  Description 
  2364.  
  2365.  Clone a pixelmap. Duplicate copies of raw pixel and colour-map data are made. 
  2366.  
  2367.  Arguments 
  2368.  
  2369.  src 
  2370.            A pointer to the source pixelmap. 
  2371.  
  2372.  Return value 
  2373.  
  2374.  Returns a pointer to the new pixelmap. 
  2375.  
  2376.  Example 
  2377.  
  2378.   br_pixelmap *image, *working_copy;
  2379.  
  2380.   ...
  2381.  
  2382.   image = BrPixelmapLoad("backdrop.pix");
  2383.  
  2384.   working_copy = BrPixelmapClone(image);
  2385.  
  2386.  3.8.2.7  BrPixelmapFill 
  2387.  
  2388.  Syntax 
  2389.  
  2390.   void BrPixelmapFill(br_pixelmap *dat, br_uint_32 colour);
  2391.  
  2392.  Description 
  2393.  
  2394.  Fill a pixelmap with a given value. 
  2395.  
  2396.  Arguments 
  2397.  
  2398.  dat 
  2399.            A pointer to the pixelmap to be filled. 
  2400.  colour 
  2401.            Value to set each pixel to. 
  2402.  
  2403.  3.8.2.8  BrPixelmapCopy 
  2404.  
  2405.  Syntax 
  2406.  
  2407.   void BrPixelmapCopy(br_pixelmap *dst, br_pixelmap *src);
  2408.  
  2409.  Description 
  2410.  
  2411.  Copy the data in one pixelmap to another. The source and destination pixelmaps 
  2412.  must have the same type and dimensions. 
  2413.  
  2414.  Arguments 
  2415.  
  2416.  dst 
  2417.            A pointer to the destination pixelmap. 
  2418.  src 
  2419.            A pointer to the source pixelmap. 
  2420.  
  2421.  Example 
  2422.  
  2423.  
  2424.   ...
  2425.  
  2426.   BrPixelmapCopy(offscreen, backdrop);
  2427.  
  2428.  3.8.2.9  BrPixelmapDirtyRectangleCopy 
  2429.  
  2430.  Syntax 
  2431.  
  2432.   void BrPixelmapDirtyRectangleCopy(br_pixelmap *dst, br_pixelmap *src,
  2433.                                     br_int_16 x, br_int_16 y, br_uint_16 w, br_uint_16 h)
  2434.  
  2435.  Description 
  2436.  
  2437.  Copy a rectangular window of data from one pixelmap to the same position in 
  2438.  another pixelmap. The source and destination pixelmaps must have the same type 
  2439.  and dimensions. This function can be used in conjunction with a rendering 
  2440.  callback to copy only those regions of a pixelmap that have actually been 
  2441.  rendered to. 
  2442.  
  2443.  Arguments 
  2444.  
  2445.  dst 
  2446.            A pointer to the destination pixelmap. 
  2447.  src 
  2448.            A pointer to the source pixelmap. 
  2449.  x,y 
  2450.            Coordinates of the rectangle's top left corner. 
  2451.  w,h 
  2452.            Rectangle width and height (in pixels). The width is automatically 
  2453.            rounded up to the next multiple of four pixels. 
  2454.  
  2455.  Example 
  2456.  
  2457.   br_int_16 drx, dry;
  2458.   br_uint_16 drw, drh;
  2459.   br_pixelmap *offscreen, *backdrop;
  2460.  
  2461.   ...
  2462.  
  2463.   BrPixelmapDirtyRectangleCopy(offscreen,backdrop,drx,dry,drw,drh);
  2464.  
  2465.  See also 
  2466.  
  2467.  br_renderbounds_cbfn 
  2468.  
  2469.  BrZbSetRenderBoundsCallback 
  2470.  
  2471.  3.8.2.10  BrPixelmapDirtyRectangleFill 
  2472.  
  2473.  Syntax 
  2474.  
  2475.   void BrPixelmapDirtyRectangleFill(br_pixelmap *dst, br_int_16 x,
  2476.                                     br_int_16 y, br_uint_16 w, br_uint_16 h,
  2477.                                     br_uint_32 colour);
  2478.  
  2479.  Description 
  2480.  
  2481.  Set a rectangular window in pixelmap to a given value. This function can be 
  2482.  used in conjunction with a rendering callback to set only those regions of a 
  2483.  pixelmap that have actually been rendered to. 
  2484.  
  2485.  Arguments 
  2486.  
  2487.  dst 
  2488.            A pointer to the destination pixelmap. 
  2489.  x,y 
  2490.            Coordinates of the rectangle's top left corner. 
  2491.  w,h 
  2492.            Rectangle width and height (in pixels). The width is automatically 
  2493.            rounded up to the next multiple of four pixels. 
  2494.  colour 
  2495.            Value to set each pixel to. 
  2496.  
  2497.  Example 
  2498.  
  2499.   br_uint_32 zfar = 0xffffffff;
  2500.   br_int_16 drx, dry;
  2501.   br_unit_16 drw, drh;
  2502.   br_pixelmap *zbuffer;
  2503.  
  2504.   ...
  2505.  
  2506.   BrPixelmapDirtyRectangleFill(zbuffer,drx,dry,drw,drh,zfar);
  2507.  
  2508.  3.8.2.11  BrPixelmapRectangleCopy 
  2509.  
  2510.  Syntax 
  2511.  
  2512.   void BrPixelmapRectangleCopy (br_pixelmap *dst, br_int_16 dx, br_int_16 dy,
  2513.                                 br_pixelmap *src, br_int_16 sx, br_int_16 sy,
  2514.                                 br_uint_16 w, br_uint_16 h);
  2515.  
  2516.  Description 
  2517.  
  2518.  Copy a rectangular window from one pixelmap to another. 
  2519.  
  2520.  Arguments 
  2521.  
  2522.  dst 
  2523.            A pointer to the destination pixelmap. 
  2524.  dx,dy 
  2525.            Coordinates of the destination rectangle's top left corner. 
  2526.  src 
  2527.            A pointer to the source pixelmap. 
  2528.  sx,sy 
  2529.            Coordinates of the source rectangle's top left corner. 
  2530.  w,h 
  2531.            Rectangle width and height (in pixels). 
  2532.  
  2533.  3.8.2.12  BrPixelmapRectangleFill 
  2534.  
  2535.  Syntax 
  2536.  
  2537.   void BrPixelmapRectangleFill(br_pixelmap *dst, br_int _16 x, br_int_16 y,
  2538.                                br_unint_16 w, br_uint_16 h, br_uint_32 colour);
  2539.  
  2540.  Description 
  2541.  
  2542.  Fill a rectangular window in a pixelmap with a given value. 
  2543.  
  2544.  Arguments 
  2545.  
  2546.  dst 
  2547.            A pointer to the destination pixelmap. 
  2548.  x,y 
  2549.            Coordinates of the rectangle's top left corner. 
  2550.  w,h 
  2551.            Rectangle width and height (in pixels). 
  2552.  colour 
  2553.            Value to set each pixel to. 
  2554.  
  2555.  Example 
  2556.  
  2557.   br_int_16 x,y;
  2558.   br_unit_16 w,h;
  2559.   br_pixelmap *offscreen;
  2560.  
  2561.   ...
  2562.  
  2563.   BrPixelmapRectangleFill(offscreen,x,y,w,h,0);
  2564.  
  2565.  3.8.2.13  BrPixelmapPlot 
  2566.  
  2567.  Syntax 
  2568.  
  2569.   void BrPixelmapPlot(br_pixelmap *dst, br_int_16 x, br_int_16 y,
  2570.                       br_uint_32 colour);
  2571.  
  2572.  Description 
  2573.  
  2574.  Set a pixel to a given value. 
  2575.  
  2576.  Arguments 
  2577.  
  2578.  dst 
  2579.            A pointer to the destination pixelmap. 
  2580.  x,y 
  2581.            Pixel coordinates. 
  2582.  colour 
  2583.            Pixel value. 
  2584.  
  2585.  3.8.2.14  BrPixelmapLine 
  2586.  
  2587.  Syntax 
  2588.  
  2589.   void BrPixelmapLine(br_pixelmap *dst, br_int_16 x1 , br_int_16 y1,
  2590.                       br_int_16 x2, br_int_16 y2, br_uint_32 colour);
  2591.  
  2592.  Description 
  2593.  
  2594.  Draw a line in a pixelmap between (x1,y1) and (x2,y2), clipping it to the 
  2595.  edges of the pixelmap if necessary. 
  2596.  
  2597.  Arguments 
  2598.  
  2599.  dst 
  2600.            A pointer to the destination pixelmap. 
  2601.  x1,y1,x2,y2 
  2602.            Coordinates of the line's endpoints. 
  2603.  colour 
  2604.            Value to set each pixel in the line to. 
  2605.  
  2606.  3.8.2.15  BrPixelmapText# 
  2607.  
  2608.  Syntax 
  2609.  
  2610.   void BrPixelmapText(br_pixelmap *dst, br_int_16 x, br_int_16 y,
  2611.                       br_uint_32 colour, br_font *font, char *text);
  2612.  
  2613.   void BrPixelmapTextF(br_pixelmap *dst,br_int_16 x, br_int_16 y,
  2614.                        br_uint_32 colour, br_font *font, char *fmt, ...);
  2615.  
  2616.  Description 
  2617.  
  2618.  Write a string into a pixelmap in a given font. BrPixelmapTextF will accept 
  2619.  format strings and arguments as for the standard printf function. 
  2620.  
  2621.  Arguments 
  2622.  
  2623.  dst 
  2624.            A pointer to the destination pixelmap. 
  2625.  x,y 
  2626.            Coordinates of text's top left corner. 
  2627.  colour 
  2628.            Value to set each text pixel to. 
  2629.  *text 
  2630.            A string. 
  2631.  *fmt 
  2632.            A format string (as for printf). 
  2633.  font 
  2634.            A pointer to a BRender font, or NULL for the default font. 
  2635.  
  2636.  The following pointers are available: 
  2637.  
  2638.   BrFontFixed3x5
  2639.   BrFontProp4x6
  2640.   BrFontProp7x9
  2641.  
  2642.  Example 
  2643.  
  2644.   br_uint_32 colour;
  2645.   br_pixelmap *pmap;
  2646.  
  2647.   ...
  2648.  
  2649.   BrPixelmapText(pmap,0,0,colour,BrFontProp7x9,"Example text...");
  2650.  
  2651.  3.8.2.16  BrPixelmapTextWidth 
  2652.  
  2653.  Syntax 
  2654.  
  2655.   br_uint_16 BrPixelmapTextWidth(br_pixelmap *dst, br_font *font, char *text);
  2656.  
  2657.  Description 
  2658.  
  2659.  Find the width of a string for a given font and pixelmap. 
  2660.  
  2661.  Arguments 
  2662.  
  2663.  dst 
  2664.            A pointer to a pixelmap. 
  2665.  font 
  2666.            A pointer to a BRender font, or NULL for the default font. 
  2667.  *text 
  2668.            A string. 
  2669.  
  2670.  Return value 
  2671.  
  2672.  Returns the string width in pixels. If the third argument is NULL, the width 
  2673.  of one character is returned. 
  2674.  
  2675.  See also 
  2676.  
  2677.   BrPixelmapText
  2678.  
  2679.  3.8.2.17  BrPixelmapTextHeight 
  2680.  
  2681.  Syntax 
  2682.  
  2683.   br_uint_16 BrPixelmapTextHeight(br_pixelmap *dst, br_font *font);
  2684.  
  2685.  Description 
  2686.  
  2687.  Find the height of a font for a given pixelmap. 
  2688.  
  2689.  Arguments 
  2690.  
  2691.  dst 
  2692.            A pointer to a pixelmap. 
  2693.  font 
  2694.            A pointer to a BRender font, or NULL for the default font. 
  2695.  *text 
  2696.            A string. 
  2697.  
  2698.  Return value 
  2699.  
  2700.  Returns the font height in pixels. 
  2701.  
  2702.  See also 
  2703.  
  2704.   BrPixelmapText
  2705.  
  2706.  
  2707. ΓòÉΓòÉΓòÉ 4.9. 3.9  Tables ΓòÉΓòÉΓòÉ
  2708.  
  2709. 3.9.1  Table types 
  2710.  
  2711. 3.9.1.1  Shade tables 
  2712.  
  2713. Description 
  2714.  
  2715. A shade table is a BR_PMT_INDEX_8 pixelmap used when rendering in 256 colour 
  2716. modes. Each entry in the table is an index into a palette. The table can be of 
  2717. arbitrary width and depth, although the default values are 256 and 64, 
  2718. respectively. Each column in the table represents a graduated strip of a single 
  2719. colour, from the darkest possible in the first row, to fully saturated in the 
  2720. last row. 
  2721.  
  2722. Shade tables can be generated by the 'mkshades' tool (see appendix D). 
  2723.  
  2724. 3.9.2  Functions 
  2725.  
  2726. 3.9.2.1  Table functions summary 
  2727.  
  2728. Syntax 
  2729.  
  2730. br_pixelmap * BrTableAdd(br_pixelmap *pixelmap);
  2731. br_uint_32 BrTableAddMany(br_pixelmap **pixelmaps, int n);
  2732. br_pixelmap * BrTableRemove(br_pixelmap *pixelmap);
  2733. br_uint_32 BrTableRemoveMany(br_pixelmap **pixelmaps, int n);
  2734.  
  2735. br_pixelmap * BrTableFind(char *pattern);
  2736. br_uint_32 BrTableFindMany(char *pattern, br_pixelmap **pixelmaps, int max);
  2737. br_table_find_cbfn *BrTableFindHook(br_table_find_cbfn *hook);
  2738.  
  2739. br_uint_32 BrTableCount(char *pattern);
  2740. br_uint_32 BrTableEnum(char *pattern);
  2741.  
  2742. void BrTableUpdate(br_pixelmap *pixelmap, br_uint_16 flags);
  2743.  
  2744. These functions are documented under 'The Registry'. 
  2745.  
  2746.  
  2747. ΓòÉΓòÉΓòÉ 4.10. 3.10  Colour ΓòÉΓòÉΓòÉ
  2748.  
  2749. 3.10.1  Datatypes 
  2750.  
  2751. 10.1.1  br_colour 
  2752.  
  2753. Definition 
  2754.  
  2755. typedef unsigned long int br_colour;
  2756.  
  2757. Description 
  2758.  
  2759. BRender's native colour representation: 32-bit colour. Blue occupies bits 0 to 
  2760. 7, green occupies bits bits 8 to 15, red occupies bits 16 to 23, and an 
  2761. optional alpha value occupies bits 24 to 31. 
  2762.  
  2763. Associated macros 
  2764.  
  2765.  BR_COLOUR_RGB(r,g,b) 
  2766.            Returns a br_ colour given three 8-bit colour components. 
  2767.  BR_COLOUR_RGBA(r,g,b,a) 
  2768.            Returns a br_colour given three 8-bit colour components and an 8-bit 
  2769.            alpha component. 
  2770.  BR_RED(c) 
  2771.            Returns the red component of a colour. 
  2772.  BR_GRN(c) 
  2773.            Returns the green component of a colour. 
  2774.  BR_BLU(c) 
  2775.            Returns the blue component of a colour. 
  2776.  BR_ALPHA(c) 
  2777.            Returns the alpha component of a colour. 
  2778.  
  2779.  See also 
  2780.  
  2781.   br_material
  2782.   br_pixelmap
  2783.  
  2784.  
  2785. ΓòÉΓòÉΓòÉ 4.11. 3.11  Transforms ΓòÉΓòÉΓòÉ
  2786.  
  2787. 3.11.1  Datatypes 
  2788.  
  2789. 3.11.1.1  br_transform 
  2790.  
  2791. Structure 
  2792.  
  2793. typedef struct br_transform {
  2794.  
  2795.      br_uint_16 type;
  2796.  
  2797.      union {
  2798.  
  2799.           br_matrix34 mat;
  2800.  
  2801.           struct {
  2802.                br_euler e;
  2803.                br_scalar _pad[7];
  2804.                br_vector3 t;
  2805.           } euler;
  2806.  
  2807.           struct {
  2808.                br_quat q;
  2809.                br_scalar _pad[5];
  2810.                br_vector3 t;
  2811.           } quat;
  2812.  
  2813.           struct {
  2814.                br_vector3 look;
  2815.                br_vector3 up;
  2816.                br_scalar _pad[3];
  2817.                br_vector3 t;
  2818.           } look_up;
  2819.  
  2820.           struct {
  2821.                br_scalar _pad[9];
  2822.                br_vector3 t;
  2823.           } translate;
  2824.  
  2825.      } t;
  2826.  
  2827. } br_transform;
  2828.  
  2829. Description 
  2830.  
  2831. BRender's generic transformation type, used to specify a transformatin from one 
  2832. actor's space to another. 
  2833.  
  2834. Members 
  2835.  
  2836.  type 
  2837.            Specifies the way in which the transformation is represented. (See 
  2838.            section 3.11.1.2) 
  2839.  
  2840.  3.11.1.2  Transform type definitions 
  2841.  
  2842.  Description 
  2843.  
  2844.  Flags specifying the way in which a generic transformation is represented. 
  2845.  
  2846.  Definitions 
  2847.  
  2848.  BR_TRANSFORM_MATRIX34 
  2849.            The transform is represented by a 3x4 affine matrix (the most 
  2850.            general representation). 
  2851.  BR_TRANSFORM_MATRIX34_LP 
  2852.            The transform is represented by a 3x4 length-preserving matrix. 
  2853.  BR_TRANSFORM_EULER 
  2854.            The transform is represented by a set of Euler angles and a 
  2855.            translation. 
  2856.  BR_TRANSFORM_QUAT 
  2857.            The transform is represented by a quaternion and a translation. 
  2858.  BR_TRANSFORM_LOOK_UP 
  2859.            The transform is represented by a look-at vector, an up vector and a 
  2860.            translation. This transform has the effect of making the actor's Z- 
  2861.            axis lie along the 'look' vector, and the X+ axis lie along the 
  2862.            cross product of the 'look' and 'up' vectors. For example, it is a 
  2863.            convenient method of making a camera point toward a particular 
  2864.            position. 
  2865.  BR_TRANSFORM_TRANSLATION 
  2866.            The transform is a translation only. 
  2867.  BR_TRANSFORM_IDENTITY 
  2868.            The transform is the identity. 
  2869.  
  2870.  See also 
  2871.  
  2872.   Euler Angles
  2873.   Quaternions
  2874.   Vectors
  2875.   Matrices
  2876.  
  2877.  3.11.2  Functions 
  2878.  
  2879.  3.11.2.1  Transform functions summary 
  2880.  
  2881.  Syntax 
  2882.  
  2883.   void BrMatrix34ToTransform(br_transform *xform, br_matrix34 *mat);
  2884.   void BrTransformToMatrix34(br_matrix34 *mat, br_transform *xform);
  2885.  
  2886.   void BrMatrix34PreTransform(br_matrix34 *mat, br_transform *xform);
  2887.   void BrMatrix34PostTransform(br_matrix34 *mat, br_transform *xform);
  2888.   void BrMatrix4PreTransform(br_matrix4 *mat, br_transform *xform);
  2889.  
  2890.   void BrTransformToTransform(br_transform *dest, br_transform *src);
  2891.  
  2892.  The first two groups of functions is documented under 'The Maths Library'. 
  2893.  
  2894.  3.11.2.2  BrTransformToTransform 
  2895.  
  2896.  Syntax 
  2897.  
  2898.   void BrTransformToTransform(br_transform *dest, br_transform *src);
  2899.  
  2900.  Description 
  2901.  
  2902.  Convert from one generic transformation to another. The transformation type in 
  2903.  the destination transformation must be set before conversion is performed. In 
  2904.  some cases, it may not be possible to preserve all components of a given 
  2905.  transformation. For example, when converting from matrix to quaternion, any 
  2906.  scaling or shearing components will be lost. 
  2907.  
  2908.  Arguments 
  2909.  
  2910.  src 
  2911.            A pointer to the source transformation. 
  2912.  dest 
  2913.            A pointer to the destination transformation. 
  2914.  
  2915.  
  2916. ΓòÉΓòÉΓòÉ 5. 4.  The Registry ΓòÉΓòÉΓòÉ
  2917.  
  2918. The Registry is a suite of functions and data structures which simplifies 
  2919. handling items such as materials, models, texture maps, tables and pixelmaps. 
  2920. These functions perform a range of useful and powerful operations on items that 
  2921. have been registered, including the following: 
  2922.  
  2923.      Memory allocation and de-allocation 
  2924.  
  2925.      Loading and saving items 
  2926.  
  2927.      Item preparation and update 
  2928.  
  2929.      Enumeration through a callback function 
  2930.  
  2931.      Search for items by textual name 
  2932.  
  2933.      Counting items 
  2934.  
  2935.  In general, all items should be registered before they are used subsequently. 
  2936.  There is a similar suite of functions for actors, but they are not documented 
  2937.  in this section as they relate to hierarchies, rather than individual items. 
  2938.  Similarly, the registry of resource classes is documented under 'The Support 
  2939.  Library'. 
  2940.  
  2941.  Throughout this chapter, the '#' symbol is used as a wildcard. 
  2942.  
  2943.  
  2944. ΓòÉΓòÉΓòÉ 5.1. 4.1  Registry Functions ΓòÉΓòÉΓòÉ
  2945.  
  2946. 4.1.1  Allocate/Free 
  2947.  
  2948. 4.1.1.1  BrMaterialAllocate 
  2949.  
  2950. Syntax 
  2951.  
  2952. br_material * BrMaterialAllocate(char *name);
  2953.  
  2954. Description 
  2955.  
  2956. Allocate a new material. 
  2957.  
  2958. Arguments 
  2959.  
  2960.  *name 
  2961.            Name of the new material. 
  2962.  
  2963.  Return value 
  2964.  
  2965.  Returns a pointer to the new material, or NULL if unsuccessful. 
  2966.  
  2967.  4.1.1.2  BrModelAllocate 
  2968.  
  2969.  Syntax 
  2970.  
  2971.   br_model * BrModelAllocate(char *name, int nvertices, int nfaces);
  2972.  
  2973.  Description 
  2974.  
  2975.  Allocate a new model. 
  2976.  
  2977.  Arguments 
  2978.  
  2979.  *name 
  2980.            Name of the new model. 
  2981.  nvertices 
  2982.            Number of vertices in the new model. 
  2983.  nfaces 
  2984.            Number of faces in the new model. 
  2985.  
  2986.  Return value 
  2987.  
  2988.  Returns a pointer to the new model, or NULL if unsuccessful. 
  2989.  
  2990.  4.1.1.3  BrPixelmapAllocate 
  2991.  
  2992.  Syntax 
  2993.  
  2994.   br_pixelmap * BrPixelmapAllocate(br_uint_8 type, br_uint_16 w,
  2995.                                    br_uint_16 h, void *pixels, int flags);
  2996.  
  2997.  Description 
  2998.  
  2999.  Allocate a new pixelmap. 
  3000.  
  3001.  Arguments 
  3002.  
  3003.  type 
  3004.            Pixelmap type. 
  3005.  w 
  3006.            Width in pixels. 
  3007.  h 
  3008.            Height in pixels. 
  3009.  pixels 
  3010.            A pointer to an existing block of memory. If NULL, the pixel memory 
  3011.            is allocated automatically. 
  3012.  flags 
  3013.            Either BR_PMAF_NORMAL or BR_PMAF_INVERTED. 
  3014.  
  3015.  Return value 
  3016.  
  3017.  Returns a pointer to the new pixelmap, or NULL if unsuccessful. 
  3018.  
  3019.  4.1.1.4  BrPixelmapAllocateSub 
  3020.  
  3021.  Syntax 
  3022.  
  3023.   br_pixelmap * BrPixelmapAllocateSub(br_pixelmap *pm, br_uint_16 x,
  3024.                                       br_uint_16 y, br_uint_16 w,
  3025.                                       br_uint_16 h);
  3026.  
  3027.  Description 
  3028.  
  3029.  Allocate a pixelmap as part of an existing pixelmap. The new pixelmap is 
  3030.  clipped to the existing pixelmap. 
  3031.  
  3032.  Arguments 
  3033.  
  3034.  pm 
  3035.            A pointer to an existing pixelmap. 
  3036.  x 
  3037.            X coordinate of the top left of the new pixelmap in the existing 
  3038.            pixelmap. 
  3039.  y 
  3040.            Y coordinate of the top left of the new pixelmap in the existing 
  3041.            pixelmap. 
  3042.  w 
  3043.            Width of the new pixelmap. 
  3044.  h 
  3045.            Height of the new pixelmap. 
  3046.  
  3047.  Return value 
  3048.  
  3049.  Returns a pointer to the new pixelmap, or NULL if unsuccessful. 
  3050.  
  3051.  4.1.1.5  Br#Free 
  3052.  
  3053.  Syntax 
  3054.  
  3055.   void BrMaterialFree(br_material *mat);
  3056.   void BrModelFree(br_model *model);
  3057.   void BrPixelmapFree(br_pixelmap *pmap);
  3058.  
  3059.  Description 
  3060.  
  3061.  De-allocate a pixelmap, material or model and any associated memory. 
  3062.  
  3063.  Arguments 
  3064.  
  3065.  mat 
  3066.            A pointer to a material. 
  3067.  model 
  3068.            A pointer to a model. 
  3069.  pmap 
  3070.            A pointer to a pixelmap. 
  3071.  
  3072.  4.1.2  Load/Save 
  3073.  
  3074.  4.1.2.1  Br#Load 
  3075.  
  3076.  Syntax 
  3077.  
  3078.   br_material * BrMaterialLoad(char *filename);
  3079.   br_model * BrModelLoad(char *filename);
  3080.   br_pixelmap * BrPixelmapLoad(char *filename);
  3081.  
  3082.  Description 
  3083.  
  3084.  Load a material, a model or a pixelmap. Note that they are not added to the 
  3085.  registry. 
  3086.  
  3087.  Arguments 
  3088.  
  3089.  *filename 
  3090.            Name of the file containing the item to load. 
  3091.  
  3092.  Return value 
  3093.  
  3094.  Returns a pointer to the loaded item, or NULL if unsuccessful. 
  3095.  
  3096.  See also 
  3097.  
  3098.   Br#LoadMany
  3099.   Br#Save
  3100.   Br#SaveMany
  3101.   Br#Add
  3102.   Br#Remove
  3103.   Br#Update
  3104.  
  3105.  4.1.2.2  Br#LoadMany 
  3106.  
  3107.  Syntax 
  3108.  
  3109.   br_uint_32 BrMaterialLoadMany(char *filename, br_material **materials,
  3110.                                 br_uint_16 num);
  3111.   br_uint_32 BrModelLoadMany(char *filename, br_model **models,
  3112.                              br_uint_16 num);
  3113.   br_uint_32 BrPixelmapLoadMany(char *filename, br_pixelmap **pixelmaps,
  3114.                                 br_uint_16 num);
  3115.  
  3116.  Description 
  3117.  
  3118.  Load a number of materials, models or pixelmaps. Note that they are not added 
  3119.  to the registry. 
  3120.  
  3121.  Arguments 
  3122.  
  3123.  *filename 
  3124.            Name of the file containing the items to load. 
  3125.  materials 
  3126.            A pointer to an array of pointers to materials, or NULL. 
  3127.  models 
  3128.            A pointer to an array of pointers to models, or NULL. 
  3129.  pixelmaps 
  3130.            A pointer to an array of pointers to pixelmaps, or NULL. 
  3131.  num 
  3132.            Maximum number of items to load. 
  3133.  
  3134.  If NULL is passed as the second argument, the items are still loaded but must 
  3135.  be referenced subsequently by name. 
  3136.  
  3137.  Return value 
  3138.  
  3139.  Returns the number of items loaded successfully. The pointer array is filled 
  3140.  with pointers to the loaded items. 
  3141.  
  3142.  4.1.2.3  Br#Save 
  3143.  
  3144.  Syntax 
  3145.  
  3146.   br_uint_32 BrMaterialSave(char *filename, br_material *material);
  3147.   br_uint_32 BrModelSave(char *filename, br_model *model);
  3148.   br_uint_32 BrPixelmapSave(char *filename, br_pixelmap *pixelmap);
  3149.  
  3150.  Description 
  3151.  
  3152.  Save a material, model or pixelmap to a file. 
  3153.  
  3154.  Arguments 
  3155.  
  3156.  *filename 
  3157.            Name of the file to save the item to. 
  3158.  material 
  3159.            A pointer to a material. 
  3160.  model 
  3161.            A pointer to a model. 
  3162.  pixelmap 
  3163.            A pointer to a pixelmap. 
  3164.  
  3165.  Return value 
  3166.  
  3167.  Returns NULL if the item could not be saved. 
  3168.  
  3169.  4.1.2.4  Br#SaveMany 
  3170.  
  3171.  Syntax 
  3172.  
  3173.   br_uint_32 BrMaterialSaveMany(char *filename, br_material **materials,
  3174.                                 br_uint_16 num);
  3175.   br_uint_32 BrModelSaveMany(char *filename, br_model **models,
  3176.                              br_uint_16 num);
  3177.   br_uint_32 BrPixelmapSaveMany(char *filename, br_pixelmap **pixelmaps,
  3178.                                 br_uint_16 num);
  3179.  
  3180.  Description 
  3181.  
  3182.  Save a number of materials, models or pixelmaps to a file. 
  3183.  
  3184.  Arguments 
  3185.  
  3186.  *filename 
  3187.            Name of the file to save the items to. 
  3188.  materials 
  3189.            A pointer to an array of pointers to materials. 
  3190.  models 
  3191.            A pointer to an array of pointers to models. 
  3192.  pixelmaps 
  3193.            A pointer to an array of pointers to pixelmaps. 
  3194.  num 
  3195.            Number of items to save. 
  3196.  
  3197.  If NULL is passed as the second argument, all registered materials, models or 
  3198.  pixelmaps are saved. 
  3199.  
  3200.  Return value 
  3201.  
  3202.  Returns the number of items saved successfully. 
  3203.  
  3204.  4.1.3  Add/Remove 
  3205.  
  3206.  4.1.3.1  Br#Add 
  3207.  
  3208.  Syntax 
  3209.  
  3210.   br_material * BrMaterialAdd(br_material *material);
  3211.   br_model * BrModelAdd(br_model *model);
  3212.   br_pixelmap * BrMapAdd(br_pixelmap *pixelmap);
  3213.   br_pixelmap * BrTableAdd(br_pixelmap *pixelmap);
  3214.  
  3215.  Description 
  3216.  
  3217.  Add a material, model, map or table to the registry, updating them as 
  3218.  necessary. All items must be added to the registry before they are used 
  3219.  subsequently. 
  3220.  
  3221.  Arguments 
  3222.  
  3223.  material 
  3224.            A pointer to a material. 
  3225.  model 
  3226.            A pointer to a model. 
  3227.  pixelmap 
  3228.            A pointer to a pixelmap. 
  3229.  
  3230.  Return value 
  3231.  
  3232.  Returns a pointer to the added item, else NULL if unsuccessful. 
  3233.  
  3234.  See also 
  3235.  
  3236.   Br#Update
  3237.   Br#AddMany
  3238.   Br#Load
  3239.   Br#Find
  3240.   Br#Remove
  3241.  
  3242.  4.1.3.2  Br#AddMany 
  3243.  
  3244.  Syntax 
  3245.  
  3246.   br_uint_32 BrMaterialAddMany(br_material **materials, int n);
  3247.   br_uint_32 BrModelAddMany(br_model **models, int n);
  3248.   br_uint_32 BrMapAddMany(br_pixelmap **pixelmaps, int n);
  3249.   br_uint_32 BrTableAddMany(br_pixelmap **pixelmaps, int n);
  3250.  
  3251.  Description 
  3252.  
  3253.  Add a number of materials, models, maps or tables to the registry, updating 
  3254.  them as necessary. 
  3255.  
  3256.  Arguments 
  3257.  
  3258.  materials 
  3259.            A pointer to an array of pointers to materials. 
  3260.  models 
  3261.            A pointer to an array of pointers to models. 
  3262.  pixelmaps 
  3263.            A pointer to an array of pointers to pixelmaps. 
  3264.  n 
  3265.            Number of items to add to the registry. 
  3266.  
  3267.  Return value 
  3268.  
  3269.  Returns the number of items added successfully. 
  3270.  
  3271.  See also 
  3272.  
  3273.   Br#Update
  3274.   Br#Add
  3275.   Br#Remove
  3276.   Br#RemoveMany
  3277.  
  3278.  4.1.3.3  Br#Remove 
  3279.  
  3280.  Syntax 
  3281.  
  3282.   br_material * BrMaterialRemove(br_material *material);
  3283.   br_model * BrModelRemove(br_model *model);
  3284.   br_pixelmap * BrMapRemove(br_pixelmap *pixelmap);
  3285.   br_pixelmap * BrTableRemove(br_pixelmap *pixelmap);
  3286.  
  3287.  Description 
  3288.  
  3289.  Remove a material, model, map or table from the registry. 
  3290.  
  3291.  Arguments 
  3292.  
  3293.  material 
  3294.            A pointer to a material. 
  3295.  model 
  3296.            A pointer to a model. 
  3297.  pixelmap 
  3298.            A pointer to a pixelmap. 
  3299.  
  3300.  Return value 
  3301.  
  3302.  Returns a pointer to the item removed. 
  3303.  
  3304.  See also 
  3305.  
  3306.   Br#Add
  3307.  
  3308.  4.1.3.4  Br#RemoveMany 
  3309.  
  3310.  Syntax 
  3311.  
  3312.   br_uint_32 BrMaterialRemoveMany(br_material **materials, int n);
  3313.   br_uint_32 BrModelRemoveMany(br_model **models, int n);
  3314.   br_uint_32 BrMapRemoveMany(br_pixelmap **pixelmaps, int n);
  3315.   br_uint_32 BrTableRemoveMany(br_pixelmap **pixelmaps, int n);
  3316.  
  3317.  Description 
  3318.  
  3319.  Remove a number of materials, models, maps or tables from the registry. 
  3320.  
  3321.  Arguments 
  3322.  
  3323.  materials 
  3324.            A pointer to an array of pointers to materials. 
  3325.  models 
  3326.            A pointer to an array of pointers to models. 
  3327.  pixelmaps 
  3328.            A pointer to an array of pointers to pixelmaps. 
  3329.  n 
  3330.            Number of items to remove from the registry. 
  3331.  
  3332.  Return value 
  3333.  
  3334.  Returns the number of items removed successfully. 
  3335.  
  3336.  See also 
  3337.  
  3338.   Br#AddMany
  3339.  
  3340.  4.1.4  Find 
  3341.  
  3342.  4.1.4.1  Br#Find 
  3343.  
  3344.  Syntax 
  3345.  
  3346.   br_material * BrMaterialFind(char *pattern);
  3347.   br_model * BrModelFind(char *pattern);
  3348.   br_pixelmap * BrMapFind(char *pattern);
  3349.   br_pixelmap * BrTableFind(char *pattern);
  3350.  
  3351.  Description 
  3352.  
  3353.  Find a material, model, map or table in the registry by name. A callback 
  3354.  function can be setup to be called if the search is unsuccessful. The search 
  3355.  pattern can include the standard wildcards '*' and '?'. 
  3356.  
  3357.  Arguments 
  3358.  
  3359.  *pattern 
  3360.            Search pattern. 
  3361.  
  3362.  Return value 
  3363.  
  3364.  Returns a pointer to the item if found, otherwise NULL. If a callback exists 
  3365.  and is called, the callback's return value is returned. 
  3366.  
  3367.  See also 
  3368.  
  3369.   Br#FindHook
  3370.   Br#FindMany
  3371.  
  3372.  4.1.4.2  Br#FindMany 
  3373.  
  3374.  Syntax 
  3375.  
  3376.   br_uint_32 BrMaterialFindMany(char *pattern, br_material **materials, int max);
  3377.   br_uint_32 BrModelFindMany(char *pattern, br_model **models, int max);
  3378.   br_uint_32 BrMapFindMany(char *pattern, br_pixelmap **pixelmaps, int max);
  3379.   br_uint_32 BrTableFindMany(char *pattern, br_pixelmap **pixelmaps, int max);
  3380.  
  3381.  Description 
  3382.  
  3383.  Find a number of materials, models, maps or tables in the registry by name. 
  3384.  The search pattern can include the standard wildcards '*' and '?'. 
  3385.  
  3386.  Arguments 
  3387.  
  3388.  *pattern 
  3389.            Search pattern. 
  3390.  materials 
  3391.            A pointer to an array of pointers to materials. 
  3392.  models 
  3393.            A pointer to an array of pointers to models. 
  3394.  pixelmaps 
  3395.            A pointer to an array of pointers to pixelmaps. 
  3396.  max 
  3397.            Maximum number of items to find. 
  3398.  
  3399.  Return value 
  3400.  
  3401.  Returns the number of items found. The pointer array is filled with pointers 
  3402.  to the found items. 
  3403.  
  3404.  See also 
  3405.  
  3406.   Br#Find
  3407.   Br#FindHook
  3408.  
  3409.  4.1.4.3  Br#FindHook 
  3410.  
  3411.  Syntax 
  3412.  
  3413.   br_material_find_cbfn * BrMaterialFindHook(br_material_find_cbfn *hook);
  3414.   br_model_find_cbfn * BrModelFindHook(br_model_find_cbfn *hook);
  3415.   br_map_find_cbfn * BrMapFindHook(br_map_find_cbfn *hook);
  3416.   br_table_find_cbfn * BrTableFindHook(br_table_find_cbfn *hook);
  3417.  
  3418.  Description 
  3419.  
  3420.  Functions to set up a callback. If Br#Find is unsuccessful and a callback has 
  3421.  been set up, the callback is passed the search pattern as its only argument. 
  3422.  The callback should then return a pointer to a substitute or default item. 
  3423.  
  3424.  For example, a callback could be set up to return a default material if the 
  3425.  desired material cannot be found in the registry. 
  3426.  
  3427.  As demonstrated in the example, the BR_CALLBACK macro must be used. This is to 
  3428.  ensure compiler compatibility. 
  3429.  
  3430.  Arguments 
  3431.  
  3432.  hook 
  3433.            A pointer to a callback function. 
  3434.  
  3435.  Return value 
  3436.  
  3437.  Returns a pointer to the old callback function. 
  3438.  
  3439.  Example 
  3440.  
  3441.   br_model BR_CALLBACK *test_callback(char *pattern)
  3442.   {
  3443.        br_model *default_model;
  3444.  
  3445.        ...
  3446.  
  3447.        return(default_model);
  3448.   }
  3449.  
  3450.   ...
  3451.  
  3452.   {
  3453.        br_model *model;
  3454.  
  3455.        ...
  3456.  
  3457.        BrModelFindHook(&test_callback);
  3458.        model = BrModelFind("non_existant_model");
  3459.   }
  3460.  
  3461.  4.1.5  Enumeration 
  3462.  
  3463.  4.1.5.1  Br#Count 
  3464.  
  3465.  Syntax 
  3466.  
  3467.   br_uint_32 BrMaterialCount(char *pattern);
  3468.   br_uint_32 BrModelCount(char *pattern);
  3469.   br_uint_32 BrMapCount(char *pattern);
  3470.   br_uint_32 BrTableCount(char *pattern);
  3471.  
  3472.  Description 
  3473.  
  3474.  Count the number of registered items whose names match a given search pattern. 
  3475.  The search pattern can include the standard wildcards '*' and '?'. 
  3476.  
  3477.  Arguments 
  3478.  
  3479.  *pattern 
  3480.            Search pattern. 
  3481.  
  3482.  Return value 
  3483.  
  3484.  Returns the number of items matching the search pattern. 
  3485.  
  3486.  See also 
  3487.  
  3488.   Br#Enum
  3489.   Br#Find
  3490.  
  3491.  4.1.5.2  Br#Enum 
  3492.  
  3493.  Syntax 
  3494.  
  3495.   br_uint_32 BrMaterialEnum(char *pattern, br_material_enum_cbfn *callback,                            void *arg);
  3496.                             void *arg);
  3497.   br_uint_32 BrModelEnum(char *pattern, br_model_enum_cbfn *callback,
  3498.                          void *arg);
  3499.   br_uint_32 BrMapEnum(char *pattern,br_map_enum_cbfn *callback,
  3500.                        void *arg);
  3501.   br_uint_32 BrTableEnum(char *pattern, br_table_enum_cbfn *callback,
  3502.                          void *arg);
  3503.  
  3504.  Description 
  3505.  
  3506.  Calls a callback function for every item matching a given search pattern. The 
  3507.  callback is passed a pointer to each matching item, and its second argument is 
  3508.  an optional pointer supplied by the user. The search pattern can include the 
  3509.  standard wildcards '*' and '?'. The callback itself returns a br_uint_32 
  3510.  value. The enumeration will halt at any stage if the return value is non-zero. 
  3511.  As demonstrated in the example, the BR_CALLBACK macro must be used to ensure 
  3512.  compiler compatibility. 
  3513.  
  3514.  Arguments 
  3515.  
  3516.  *pattern 
  3517.            Search pattern. 
  3518.  callback 
  3519.            A pointer to a callback function. 
  3520.  arg 
  3521.            An optional argument to pass to the callback function. 
  3522.  
  3523.  Return value 
  3524.  
  3525.  Returns the first non-zero callback return value, or zero if all matching 
  3526.  items are enumerated. 
  3527.  
  3528.  Example 
  3529.  
  3530.   br_uint_32 BR_CALLBACK test_callback(br_material *mat, void *arg)
  3531.   {
  3532.        br_uint_32 count;
  3533.  
  3534.        ...
  3535.  
  3536.        return(count);
  3537.   }
  3538.  
  3539.   ...
  3540.  
  3541.   {
  3542.        br_uint_32 enum;
  3543.  
  3544.        ...
  3545.  
  3546.        enum = BrMaterialEnum("material",&test_callback,NULL);
  3547.   }
  3548.  
  3549.  4.1.6  Update 
  3550.  
  3551.  4.1.6.1  Br#Update 
  3552.  
  3553.  Syntax 
  3554.  
  3555.   void BrMaterialUpdate(br_material *material, br_uint_16 flags);
  3556.   void BrModelUpdate(br_model *model, br_uint_16 flags);
  3557.   void BrMapUpdate(br_pixelmap *pixelmap, br_uint_16 flags);
  3558.   void BrTableUpdate(br_pixelmap *pixelmap, br_uint_16 flags);
  3559.  
  3560.  Description 
  3561.  
  3562.  Update a material, model, map or table. 
  3563.  
  3564.  For example, the user may wish to create a model whilst an application is 
  3565.  running, by supplying lists of vertices and faces. Before it can be rendered, 
  3566.  the model's surface normals, radius, bounding box, and other data structures 
  3567.  must be pre-calculated, using the BrModelUpdate function. 
  3568.  
  3569.  Similarly, if the vertex positions are changed subsequently whilst the 
  3570.  application is running, the model will need to be updated before it is 
  3571.  rendered again. 
  3572.  
  3573.  Items are automatically updated when they are added to the registry. 
  3574.  
  3575.  Arguments 
  3576.  
  3577.  material 
  3578.            A pointer to a material. 
  3579.  model 
  3580.            A pointer to a model. 
  3581.  pixelmap 
  3582.            A pointer to a map or table. 
  3583.  flags 
  3584.            Update flags (see section 4.1.6.2). 
  3585.  
  3586.  See also 
  3587.  
  3588.   Br#Add
  3589.  
  3590.  4.1.6.2  Update flags 
  3591.  
  3592.  Description 
  3593.  
  3594.  Item update flags. In general, BR_#_ALL should be used. If, for example, the 
  3595.  vertices of a prepared model are moved but the topology of the model is left 
  3596.  unchanged, BR_MODU_NORMALS|BR_MODU_BOUNDING_BOX will suffice. 
  3597.  
  3598.  Definitions 
  3599.  
  3600.  BR_MODU_NORMALS Compute surface normals for the model. 
  3601.  BR_MODU_EDGES Compute edges. 
  3602.  BR_MODU_RADIUS Compute the model's bounding radius. 
  3603.  BR_MODU_GROUPS Group all polygons which share the same material. 
  3604.  BR_MODU_BOUNDING_BOX Compute the model's bounding box. 
  3605.  BR_MODU_MATERIALS Update the model's materials. 
  3606.  BR_MODU_ALL Do all of the above. 
  3607.  
  3608.  
  3609.  BR_MATU_ALL Update material. 
  3610.  BR_MAPU_ALL Update map. 
  3611.  BR_TABU_ALL Update table. 
  3612.  
  3613.  See also 
  3614.  
  3615.   Br#Prepare
  3616.  
  3617.  
  3618. ΓòÉΓòÉΓòÉ 6. 5.  The Support Library ΓòÉΓòÉΓòÉ
  3619.  
  3620. The support library plays an important role in BRender's platform independence. 
  3621. BRender applications should not use native C library functions for many 
  3622. operations, primarily those involving file systems, memory allocation and error 
  3623. handling. Instead, they should use the support library functions. By default, 
  3624. many of these are simply wrappers for the standard C calls. 
  3625.  
  3626. Functions are provided to install new filesystem, memory management and error 
  3627. handling functions, and the user can tailor individual calls to suit specific 
  3628. platforms. 
  3629.  
  3630. 5.1  General Functions 
  3631.  
  3632. 5.1.1.1  BrQsort 
  3633.  
  3634. Syntax 
  3635.  
  3636. typedef int br_qsort_cbfn(const void *, const void *);
  3637.  
  3638. void BrQsort(void *basep, unsigned int nelems, unsigned int size,
  3639.              br_qsort_cbfn *comp);
  3640.  
  3641. Description 
  3642.  
  3643. BRender's quick sort. By default, this is just a wrapper for the standard C 
  3644. library call. 
  3645.  
  3646. Arguments 
  3647.  
  3648.  basep 
  3649.            A pointer to the array to be sorted. 
  3650.  nelems 
  3651.            Number of elements in the array. 
  3652.  size 
  3653.            Size of each element (in bytes). 
  3654.  comp 
  3655.            A pointer to a comparison function. 
  3656.  
  3657.  5.1.1.2  BrBlockCopy 
  3658.  
  3659.  Syntax 
  3660.  
  3661.   void BrBlockCopy(void *dest_ptr, void *src_ptr, int dwords);
  3662.  
  3663.  Description 
  3664.  
  3665.  Copy a block of memory. The source and destination blocks must not overlap. 
  3666.  
  3667.  Arguments 
  3668.  
  3669.  dest_ptr 
  3670.            Destination pointer. 
  3671.  src_ptr 
  3672.            Source pointer. 
  3673.  dwords 
  3674.            Size of block to copy (number of 32-bit words). 
  3675.  
  3676.  See also 
  3677.  
  3678.   BrBlockFill
  3679.  
  3680.  5.1.1.3  BrBlockFill 
  3681.  
  3682.  Syntax 
  3683.  
  3684.   void BrBlockFill(void *dest_ptr, int value, int dwords);
  3685.  
  3686.  Description 
  3687.  
  3688.  Fast fill a block of memory. 
  3689.  
  3690.  Arguments 
  3691.  
  3692.  dest_ptr 
  3693.            A pointer to the block to be filled. 
  3694.  value 
  3695.            Value to fill the block with. 
  3696.  dwords 
  3697.            Size of block (number of 32-bit words). 
  3698.  
  3699.  See also 
  3700.  
  3701.   BrBlockCopy
  3702.  
  3703.  
  3704. ΓòÉΓòÉΓòÉ 6.1. 5.2  Error Handling ΓòÉΓòÉΓòÉ
  3705.  
  3706. 5.2.1.1  Error handling macros 
  3707.  
  3708. Syntax 
  3709.  
  3710. #define BR_ERROR(s) BrError(s)
  3711. #define BR_ERROR0(s) BrError(s)
  3712. #define BR_ERROR1(s,a) BrError(s,a)
  3713. #define BR_ERROR2(s,a,b) BrError(s,a,b)
  3714. #define BR_ERROR3(s,a,b,c) BrError(s,a,b,c)
  3715. #define BR_ERROR4(s,a,b,c,d) BrError(s,a,b,c,d)
  3716. #define BR_ERROR5(s,a,b,c,d,e) BrError(s,a,b,c,d,e)
  3717. #define BR_ERROR6(s,a,b,c,d,e,f) BrError(s,a,b,c,d,e,f)
  3718.  
  3719. #define BR_WARNING(s) BrWarning(s)
  3720. #define BR_WARNING0(s) BrWarning(s)
  3721. #define BR_WARNING1(s,a) BrWarning(s,a)
  3722. #define BR_WARNING2(s,a,b) BrWarning(s,a,b)
  3723. #define BR_WARNING3(s,a,b,c) BrWarning(s,a,b,c)
  3724. #define BR_WARNING4(s,a,b,c,d) BrWarning(s,a,b,c,d)
  3725. #define BR_WARNING5(s,a,b,c,d,e) BrWarning(s,a,b,c,d,e)
  3726. #define BR_WARNING6(s,a,b,c,d,e,f) BrWarning(s,a,b,c,d,e,f)
  3727.  
  3728. #define BR_FATAL(s) BrFatal(__FILE__,__LINE__,s)
  3729. #define BR_FATAL0(s) BrFatal(__FILE__,__LINE__,s)
  3730. #define BR_FATAL1(s,a) BrFatal(__FILE__,__LINE__,s,a)
  3731. #define BR_FATAL2(s,a,b) BrFatal(__FILE__,__LINE__,s,a,b)
  3732. #define BR_FATAL3(s,a,b,c) BrFatal(__FILE__,__LINE__,s,a,b,c)
  3733. #define BR_FATAL4(s,a,b,c,d) BrFatal(__FILE__,__LINE__,s,a,b,c,d)
  3734. #define BR_FATAL5(s,a,b,c,d,e) BrFatal(__FILE__,__LINE__,s,a,b,c,d,e)
  3735. #define BR_FATAL6(s,a,b,c,d,e,f) BrFatal(__FILE__,__LINE__, s,a,b,c,d,e,f)
  3736.  
  3737. Description 
  3738.  
  3739. Macros for reporting errors, warnings and fatal errors. Error handling can be 
  3740. turned off at compile time by redefining these macros. 
  3741.  
  3742. Arguments 
  3743.  
  3744.  s 
  3745.            A standard printf format string. 
  3746.  a,b,c,d,e,f 
  3747.            Arguments corresponding with the format string. 
  3748.  
  3749.  5.2.2  Functions 
  3750.  
  3751.  5.2.2.1  BrErrorHandlerSet 
  3752.  
  3753.  Syntax 
  3754.  
  3755.   br_errorhandler * BrErrorHandlerSet(br_errorhandler *neweh);
  3756.  
  3757.  Description 
  3758.  
  3759.  Install a new error handler. 
  3760.  
  3761.  Arguments 
  3762.  
  3763.  neweh 
  3764.            A pointer to an instance of a br_errorhandler structure. 
  3765.  
  3766.  Return value 
  3767.  
  3768.  Returns a pointer to the old error handler. 
  3769.  
  3770.  See also 
  3771.  
  3772.   br_errorhandler
  3773.  
  3774.  5.2.3  Datatypes 
  3775.  
  3776.  5.2.3.1  br_errorhandler 
  3777.  
  3778.  Syntax 
  3779.  
  3780.   typedef struct br_errorhandler {
  3781.  
  3782.        char *identifier;
  3783.        void (*warning)(char *message);
  3784.        void (*error)(char *message);
  3785.  
  3786.   } br_errorhandler;
  3787.  
  3788.  Description 
  3789.  
  3790.  BRender routes error and warning handling calls through an instance of this 
  3791.  structure. 
  3792.  
  3793.  Members 
  3794.  
  3795.  *identifier 
  3796.            Name of the error handler. 
  3797.  warning 
  3798.            A pointer to a warning handler. 
  3799.  error 
  3800.            A pointer to an error handler. 
  3801.  
  3802.  See also 
  3803.  
  3804.   BrErrorHandlerSet
  3805.  
  3806.  
  3807. ΓòÉΓòÉΓòÉ 6.2. 5.3  Big/Little Endian Macros ΓòÉΓòÉΓòÉ
  3808.  
  3809. 5.3.1.1  Conversion macros 
  3810.  
  3811. Syntax 
  3812.  
  3813. #define BrNtoHF(x)
  3814. #define BrNtoHL(x)
  3815. #define BrNtoHS(x)
  3816. #define BrHtoNF(x)
  3817. #define BrHtoNL(x)
  3818. #define BrHtoNS(x)
  3819.  
  3820. Description 
  3821.  
  3822. Macros to convert between big and little endian byte orderings. 
  3823.  
  3824. The naming convention is as follows: N for network order, H for host order, F 
  3825. for float, L for long integer and S for short integer. 
  3826.  
  3827.  
  3828. ΓòÉΓòÉΓòÉ 6.3. 5.4  File System Support ΓòÉΓòÉΓòÉ
  3829.  
  3830. 5.4.1  Import functions 
  3831.  
  3832. 5.4.1.1  BrFmtASCLoad 
  3833.  
  3834. Syntax 
  3835.  
  3836. br_uint_32 BrFmtASCLoad(char *name, br_model **mtable, int max_models);
  3837.  
  3838. Description 
  3839.  
  3840. Import 3D studio models (geometry only). The models are neither updated nor 
  3841. registered. 
  3842.  
  3843. Arguments 
  3844.  
  3845.  *name 
  3846.            Name of the file containing the models. 
  3847.  mtable 
  3848.            A pointer to an array of pointers to models, which will be filled as 
  3849.            they are imported. If NULL, the models are still imported, but must 
  3850.            be referenced subsequently by name. 
  3851.  max_models 
  3852.            The maximum number of models to import. 
  3853.  
  3854.  Return value 
  3855.  
  3856.  Returns the number of successfully imported models. 
  3857.  
  3858.  5.4.1.2  BrFmtNFFLoad 
  3859.  
  3860.  Syntax 
  3861.  
  3862.   br_model * BrFmtNFFLoad(char *name);
  3863.  
  3864.  Description 
  3865.  
  3866.  Import a model expressed in the Neutral File Format. The model is neither 
  3867.  updated nor registered. 
  3868.  
  3869.  Arguments 
  3870.  
  3871.  *name 
  3872.            Name of the file containing the model. 
  3873.  
  3874.  Return value 
  3875.  
  3876.  Returns a pointer to the imported model, or NULL if it could not be imported. 
  3877.  
  3878.  5.4.1.3  BrFmtScriptMaterialLoad 
  3879.  
  3880.  Syntax 
  3881.  
  3882.   br_material * BrFmtScriptMaterialLoad(char *filename);
  3883.  
  3884.  Description 
  3885.  
  3886.  Load a material from a material script. Note that all maps and tables in a 
  3887.  script should be already loaded and registered. If some of them are not, this 
  3888.  function can be combined with Br#FindHook to facilitate rapid setup of 
  3889.  materials with textures. 
  3890.  
  3891.  Arguments 
  3892.  
  3893.  *filename 
  3894.            Name of the file containing the script. 
  3895.  
  3896.  Return value 
  3897.  
  3898.  Returns a pointer to the loaded material, or NULL if unsuccessful. 
  3899.  
  3900.  Example 
  3901.  
  3902.  Material scripts are formatted as follows: 
  3903.  
  3904.   # Comment
  3905.   #
  3906.   # Fields may be given in any order or omitted
  3907.   # (a sensible default will be supplied)
  3908.   # Extra white spaces are ignored
  3909.  
  3910.   material = [
  3911.  
  3912.        name = "foo";
  3913.        flags=[light,prelit,smooth,environment,environment_local,perspective,
  3914.           decal,always_visible,two_sided,force_z_0];
  3915.        colour = [10,10,20];
  3916.        ambient = 0.10;
  3917.        diffuse = 0.70;
  3918.        specular = 0.40;
  3919.        power   = 30;
  3920.        map_transform = [[1,0], [0,1], [0,0]];
  3921.        index_base = 0;
  3922.        index_range = 0;
  3923.  
  3924.        colour_map = "brick";
  3925.        index_shade = "shade.tab";
  3926.  
  3927.   ];
  3928.  
  3929.  5.4.1.4  BrFmtScriptMaterialLoadMany 
  3930.  
  3931.  Syntax 
  3932.  
  3933.   br_uint_32 BrFmtScriptMaterialLoadMany(char *filename,
  3934.                                          br_material **materials,
  3935.                                          br_uint_32 num);
  3936.  
  3937.  Description 
  3938.  
  3939.  Load a number of materials from a material script. 
  3940.  
  3941.  Arguments 
  3942.  
  3943.  *filename 
  3944.            Name of the file containing a number of concatenated material script 
  3945.            entries. 
  3946.  materials 
  3947.            A pointer to an array of pointers to materials. 
  3948.  num 
  3949.            Maximum number of materials to load. 
  3950.  
  3951.  Return value 
  3952.  
  3953.  Return the number of materials loaded successfully. The pointer array is 
  3954.  filled with pointers to the loaded materials. 
  3955.  
  3956.  5.4.1.5  BrFmt#Load 
  3957.  
  3958.  Syntax 
  3959.  
  3960.   br_pixelmap * BrFmtBMPLoad(char *name, br_uint_32 flags);
  3961.   br_pixelmap * BrFmtTGALoad(char *name, br_uint_32 flags);
  3962.   br_pixelmap * BrFmtGIFLoad(char *name, br_uint_32 flags);
  3963.   br_pixelmap * BrFmtIFFLoad(char *name, br_uint_32 flags);
  3964.  
  3965.  Description 
  3966.  
  3967.  Load a pixelmap in the BMP, TGA, GIF or IFF format. 
  3968.  
  3969.  Arguments 
  3970.  
  3971.  *name 
  3972.            Name of the file containing the pixelmap. 
  3973.  flags 
  3974.            Either BR_PMT_RGBX_888 or BR_ PMT_RGBA_8888, when the source 
  3975.            pixelmap uses 32 bits per pixel.  Zero otherwise. 
  3976.  
  3977.  Return value 
  3978.  
  3979.  Returns a pointer to the loaded pixelmap. 
  3980.  
  3981.  5.4.2  File system functions 
  3982.  
  3983.  5.4.2.1  Standard functions 
  3984.  
  3985.  Syntax 
  3986.  
  3987.   br_uint_32 BrFileAttributes(void);
  3988.  
  3989.   int BrFileEof(void *f);
  3990.   int BrFileGetChar(void *f);
  3991.   int BrFileGetLine(char *buf, br_size_t buf_len, void * f);
  3992.   int BrFilePrintf(void *f, char *fmt, ...);
  3993.   int BrFileRead(void *buf, int size, int n,void *f);
  3994.   int BrFileWrite(void *buf, int size, int n, void *f);
  3995.  
  3996.   void * BrFileOpenRead(char *name, br_size_t n_magics,
  3997.                         br_mode_test_cbfn *mode_test,
  3998.                         int *mode_result);
  3999.  
  4000.   void * BrFileOpenWrite(char *name, int text);
  4001.  
  4002.   void BrFileAdvance(long int count, void *f);
  4003.   void BrFileClose(void *f);
  4004.   void BrFilePutChar(int c, void *f);
  4005.   void BrFilePutLine(char *buf, void * f);
  4006.  
  4007.  Description 
  4008.  
  4009.  BRender 's file system function calls, corresponding with the standard C 
  4010.  library functions. By default, BRender's functions are mapped to the C library 
  4011.  functions. 
  4012.  
  4013.  5.4.2.2  BrFilesystemSet 
  4014.  
  4015.  Syntax 
  4016.  
  4017.   br_filesystem * BrFilesystemSet(br_filesystem *newfs);
  4018.  
  4019.  Description 
  4020.  
  4021.  Install a new file system. 
  4022.  
  4023.  Arguments 
  4024.  
  4025.  newfs 
  4026.            A pointer to an instance of a br_filesystem structure. 
  4027.  
  4028.  Return value 
  4029.  
  4030.  Returns a pointer to the old br_filesystem structure. 
  4031.  
  4032.  See also 
  4033.  
  4034.   br_filesystem
  4035.  
  4036.  5.4.2.3  BrWriteModeSet 
  4037.  
  4038.  Syntax 
  4039.  
  4040.   int BrWriteModeSet(int mode);
  4041.  
  4042.  Description 
  4043.  
  4044.  Set the current write mode to plain text or binary (when saving actors, 
  4045.  materials, models, pixelmaps etc.). 
  4046.  
  4047.  Arguments 
  4048.  
  4049.  mode 
  4050.            Write mode. Either BR_FS_MODE_TEXT or BR_FS_MODE_BINARY. 
  4051.  
  4052.  Return value 
  4053.  
  4054.  Returns the old write mode. 
  4055.  
  4056.  See also 
  4057.  
  4058.   Br#Load
  4059.   Br#Save
  4060.  
  4061.  5.4.3  Datatypes 
  4062.  
  4063.  5.4.3.1  br_filesystem 
  4064.  
  4065.  Structure 
  4066.  
  4067.   typedef unsigned int br_size_t;
  4068.  
  4069.   typedef struct br_filesystem {
  4070.  
  4071.      char *identifier;
  4072.      br_uint_32 (*attributes)(void);
  4073.      void * (*open_read)(char *name, br_size_t n_magics,
  4074.                          br_mode_test_cbfn *mode_test,
  4075.                          int *mode_result);
  4076.      void * (*open_write)(char *name, int text);
  4077.      void (*close)(void * f);
  4078.      int (*eof)(void * f);
  4079.      int (*getchr)(void * f);
  4080.      void (*putchr)(int c, void * f);
  4081.      br_size_t (*read) (void *buf, br_size_t size,
  4082.                         unsigned int nelems, void * f);
  4083.      br_size_t (*write)(void *buf, br_size_t size,
  4084.                         unsigned int nelems, void * f);
  4085.      br_size_t (*getline)(char *buf, br_size_t buf_len, void * f);
  4086.      void (*putline)(char *buf, void * f);
  4087.      void (*advance)(br_size_t count, void * f);
  4088.  
  4089.   } br_filesystem;
  4090.  
  4091.  Description 
  4092.  
  4093.  BRender routes all file system calls through an instance of this structure. 
  4094.  The syntax corresponds exactly with the standard C library calls. This allows 
  4095.  the user to tailor BRender's file system characteristics to suit any platform. 
  4096.  As demonstrated in the example, the BR_CALLBACK macro must be used to ensure 
  4097.  compiler compatibility. 
  4098.  
  4099.  Members 
  4100.  
  4101.  *identifier 
  4102.            File system name. 
  4103.  attributes 
  4104.            A pointer to a function inquiring file system attributes. Such a 
  4105.            function should return a value based on the following flags: 
  4106.                 BR_FS_ATTR_READABLE 
  4107.                 BR_FS_ATTR_WRITEABLE 
  4108.                 BR_FS_ATTR_HAS_TEXT 
  4109.                 BR_FS_ATTR_HAS_BINARY 
  4110.                 BR_FS_ATTR_HAS_ADVANCE 
  4111.  open_read 
  4112.            A pointer to a function to open a file for reading. 
  4113.  open_write 
  4114.            A pointer to a function to open a file for writing. 
  4115.  close 
  4116.            A pointer to a function to close an opened file. 
  4117.  eof 
  4118.            A pointer to a function to check for end of file. 
  4119.  getchr 
  4120.            A pointer to a function to read one character. 
  4121.  putchr 
  4122.            A pointer to a function to write one character. 
  4123.  read 
  4124.            A pointer to a function to read a block. 
  4125.  write 
  4126.            A pointer to a function to write a block. 
  4127.  getline 
  4128.            A pointer to a function to read a line of text. 
  4129.  putline 
  4130.            A pointer to a function to write a line of text. 
  4131.  advance 
  4132.            A pointer to a function to advance through a stream. 
  4133.  
  4134.  See also 
  4135.  
  4136.   BrFilesystemSet
  4137.  
  4138.  Example 
  4139.  
  4140.   int BR_CALLBACK example_eof(void *f)
  4141.   {
  4142.  
  4143.     int flag
  4144.  
  4145.     ...
  4146.  
  4147.     return(flag);
  4148.   }
  4149.  
  4150.   {
  4151.     br_filesystem example_filesystem;
  4152.  
  4153.     example_filesystem.eof = &example_eof;
  4154.  
  4155.     ...
  4156.  
  4157.     BrFilesystemSet(&example_filesystem);
  4158.   }
  4159.  
  4160.  
  4161. ΓòÉΓòÉΓòÉ 6.4. 5.5  Memory Management Functions ΓòÉΓòÉΓòÉ
  4162.  
  4163. 5.5.1  Standard memory management functions 
  4164.  
  4165. 5.5.1.1  BrMemAllocate 
  4166.  
  4167. Syntax 
  4168.  
  4169. typedef unsigned int br_size_t;
  4170.  
  4171. void * BrMemAllocate(br_size_t size, br_uint_8 type);
  4172.  
  4173. Description 
  4174.  
  4175. Allocate memory. 
  4176.  
  4177. Arguments 
  4178.  
  4179.  size 
  4180.            Size of memory block to be allocated. 
  4181.  type 
  4182.            Memory type (see section 5.5.2.2). 
  4183.  
  4184.  Return value 
  4185.  
  4186.  Returns a pointer to the allocated memory, or NULL is unsuccessful. 
  4187.  
  4188.  5.5.1.2  BrMemCalloc 
  4189.  
  4190.  Syntax 
  4191.  
  4192.   typedef unsigned int br_size_t;
  4193.  
  4194.   void * BrMemCalloc(int nelems, br_size_t size, br_uint_8 type);
  4195.  
  4196.  Description 
  4197.  
  4198.  Allocate and clear memory. 
  4199.  
  4200.  Arguments 
  4201.  
  4202.  nelems 
  4203.            Number of elements to allocate. 
  4204.  size 
  4205.            Size of each element. 
  4206.  type 
  4207.            Memory type (see section 5.5.2.2). 
  4208.  
  4209.  Return value 
  4210.  
  4211.  Returns a pointer to the allocated memory, or NULL is unsuccessful. 
  4212.  
  4213.  5.5.1.3  BrMemFree 
  4214.  
  4215.  Syntax 
  4216.  
  4217.   void BrMemFree(void *block);
  4218.  
  4219.  Description 
  4220.  
  4221.  De-allocate memory. 
  4222.  
  4223.  Arguments 
  4224.  
  4225.  block 
  4226.            A pointer to the block of memory to de-allocate. 
  4227.  
  4228.  5.5.1.4  BrMemInquire 
  4229.  
  4230.  Syntax 
  4231.  
  4232.   typedef unsigned int br_size_t;
  4233.  
  4234.   br_size_t BrMemInquire(br_uint_8 type);
  4235.  
  4236.  Description 
  4237.  
  4238.  Find the amount of memory available of a given type. 
  4239.  
  4240.  Arguments 
  4241.  
  4242.  type 
  4243.            Memory type (see section 5.5.2.2). 
  4244.  
  4245.  Return value 
  4246.  
  4247.  Returns memory available in bytes. 
  4248.  
  4249.  5.5.1.5  BrMemStrDup 
  4250.  
  4251.  Syntax 
  4252.  
  4253.   char * BrMemStrDup(char *str);
  4254.  
  4255.  Description 
  4256.  
  4257.  Duplicate a string. 
  4258.  
  4259.  Arguments 
  4260.  
  4261.  str 
  4262.            A pointer to the source string. 
  4263.  
  4264.  Return value 
  4265.  
  4266.  Returns a pointer to the new copy of the string. 
  4267.  
  4268.  5.5.1.6  BrAllocatorSet 
  4269.  
  4270.  Syntax 
  4271.  
  4272.   br_allocator * BrAllocatorSet(br_allocator *newal);
  4273.  
  4274.  Description 
  4275.  
  4276.  Install a new set of memory allocation/de-allocation functions. 
  4277.  
  4278.  Arguments 
  4279.  
  4280.  newal 
  4281.            A pointer to an instance of a br_allocator structure. 
  4282.  
  4283.  Return value 
  4284.  
  4285.  Returns a pointer to the old br_allocator structure. 
  4286.  
  4287.  See also 
  4288.  
  4289.   br_allocator
  4290.  
  4291.  5.5.2  Datatypes 
  4292.  
  4293.  5.5.2.1  br_allocator 
  4294.  
  4295.  Syntax 
  4296.  
  4297.   typedef struct br_allocator {
  4298.  
  4299.       char *identifier;
  4300.       void * (*allocate)(br_size_t size, br_uint_8 type);
  4301.       void (*free)(void *block);
  4302.       br_size_t (*inquire)(br_uint_8 type);
  4303.  
  4304.   } br_allocator;
  4305.  
  4306.  Description 
  4307.  
  4308.  BRender routes memory allocation and de-allocation through an instance of this 
  4309.  structure. As demonstrated in the example, the BR_CALLBACK macro must be used 
  4310.  to ensure compiler compatiblilty. 
  4311.  
  4312.  Members 
  4313.  
  4314.  *identifier 
  4315.            Allocator name. 
  4316.  allocate 
  4317.            A pointer to a memory allocator. 
  4318.  free 
  4319.            A pointer to a memory de-allocator. 
  4320.  inquire 
  4321.            A pointer to a memory inquire. 
  4322.  
  4323.  Example 
  4324.  
  4325.   void BR_CALLBACK example_free(void *block)
  4326.   {
  4327.  
  4328.     ...
  4329.  
  4330.   }
  4331.  
  4332.  
  4333.   {
  4334.     br_allocator example_allocator;
  4335.  
  4336.     example_allocator.free = &example_free;
  4337.  
  4338.     ...
  4339.  
  4340.     BrAllocatorSet(&example_allocator);
  4341.   }
  4342.  
  4343.  5.5.2.2  Memory classes 
  4344.  
  4345.  Decsription 
  4346.  
  4347.  BRender memory class definitions. User defined classes begin at 
  4348.  BR_MEMORY_APPLICATION and end at BR_MEMORY_MAX. 
  4349.  
  4350.  Definitions 
  4351.  
  4352.   BR_MEMORY_SCRATCH
  4353.   BR_MEMORY_PIXELMAP
  4354.   BR_MEMORY_PIXELS
  4355.   BR_MEMORY_VERTICES
  4356.   BR_MEMORY_FACES
  4357.   BR_MEMORY_GROUPS
  4358.   BR_MEMORY_MODEL
  4359.   BR_MEMORY_MATERIAL
  4360.   BR_MEMORY_MATERIAL_INDEX
  4361.   BR_MEMORY_ACTOR
  4362.   BR_MEMORY_PREPARED_VERTICES
  4363.   BR_MEMORY_PREPARED_FACES
  4364.   BR_MEMORY_LIGHT
  4365.   BR_MEMORY_CAMERA
  4366.   BR_MEMORY_BOUNDS
  4367.   BR_MEMORY_CLIP_PLANE
  4368.   BR_MEMORY_STRING
  4369.   BR_MEMORY_REGISTRY
  4370.   BR_MEMORY_TRANSFORM
  4371.   BR_MEMORY_RESOURCE_CLASS
  4372.   BR_MEMORY_FILE
  4373.   BR_MEMORY_ANCHOR
  4374.   BR_MEMORY_POOL
  4375.   BR_MEMORY_RENDER_MATERIAL
  4376.  
  4377.   BR_MEMORY_APPLICATION = 0x80
  4378.   BR_MEMORY_MAX = 0x100
  4379.  
  4380.  
  4381. ΓòÉΓòÉΓòÉ 6.5. 5.6  Block pool memory management functions ΓòÉΓòÉΓòÉ
  4382.  
  4383. BRender's block pool allocation functions facilitate rapid allocation and 
  4384. de-allocation of blocks of memory. A large 'pool' of memory is allocated and 
  4385. split into a number of smaller 'blocks'. BRender maintains a record of their 
  4386. usage. If a new block is requested but none is available, BRender will 
  4387. automatically expand the pool as necessary. 
  4388.  
  4389. 5.6.1  Functions 
  4390.  
  4391. 5.6.1.1  BrPoolAllocate 
  4392.  
  4393. Syntax 
  4394.  
  4395. br_pool * BrPoolAllocate(int block_size, int chunk_size,
  4396.                          br_uint_8 mem_type);
  4397.  
  4398. Description 
  4399.  
  4400. Create a new block pool. 
  4401.  
  4402. Arguments 
  4403.  
  4404.  block_size 
  4405.            The size of each block, in bytes. 
  4406.  chuck_size 
  4407.            The number of block to allocate each time the pool becomes full. 
  4408.  mem_type 
  4409.            Memory type (see section 5.5.2.2). 
  4410.  
  4411.  Return value 
  4412.  
  4413.  Returns a pointer to the new pool, or NULL if it could not be created. 
  4414.  
  4415.  5.6.1.2 BrPoolFree 
  4416.  
  4417.  Syntax 
  4418.  
  4419.   void BrPoolFree(br_pool *pool);
  4420.  
  4421.  Description 
  4422.  
  4423.  De-allocate an entire pool, thereby losing any blocks it may contain. 
  4424.  
  4425.  Arguments 
  4426.  
  4427.  pool 
  4428.            A pointer to the pool to be de-allocated. 
  4429.  
  4430.  5.6.1.3  BrPoolEmpty 
  4431.  
  4432.  Syntax 
  4433.  
  4434.   void BrPoolEmpty(br_pool *pool);
  4435.  
  4436.  Description 
  4437.  
  4438.  Mark all blocks in a pool as unused. 
  4439.  
  4440.  Arguments 
  4441.  
  4442.  pool 
  4443.            A pointer to the pool to be emptied. 
  4444.  
  4445.  5.6.1.4  BrPoolBlockAllocate 
  4446.  
  4447.  Syntax 
  4448.  
  4449.   void * BrPoolBlockAllocate(br_pool *pool);
  4450.  
  4451.  Description 
  4452.  
  4453.  Allocate a block from a pool. If the pool is full, it will expand as 
  4454.  necessary. 
  4455.  
  4456.  Arguments 
  4457.  
  4458.  pool 
  4459.            A pointer to the relevent pool. 
  4460.  
  4461.  Return value 
  4462.  
  4463.  Returns a pointer to the allocated block, or NULL if unsuccessful. 
  4464.  
  4465.  5.6.1.5  BrPoolBlockFree 
  4466.  
  4467.  Syntax 
  4468.  
  4469.   void BrPoolBlockFree(br_pool *pool, void *b);
  4470.  
  4471.  Description 
  4472.  
  4473.  De-allocate a block from a pool. 
  4474.  
  4475.  Arguments 
  4476.  
  4477.  pool 
  4478.            A pointer to the relevent pool. 
  4479.  b 
  4480.            A pointer to the block to de-allocate. 
  4481.  
  4482.  
  4483. ΓòÉΓòÉΓòÉ 6.6. 5.7  Resource management functions ΓòÉΓòÉΓòÉ
  4484.  
  4485. Conceptually, resources are a layer on top of the standard memory management 
  4486. functions that allow blocks of memory to be associated in a hierarchy. For 
  4487. instance, freeing a parent block will also free its children. Each class of 
  4488. resource is kept in a registry (in a manner identical to materials, pixelmaps, 
  4489. etc.). Moreover, a resource class can have a 'destructor' function invoked 
  4490. whenever a block in the class is freed. 
  4491.  
  4492. Due to the way in which resources are used internally, models must be created 
  4493. by BRender, either by a Br#Load operation or a Br#Allocate. This is not 
  4494. necessary for actors, and actor structures can be embedded in user-managed 
  4495. structures. 
  4496.  
  4497. 5.7.1  Datatypes 
  4498.  
  4499. 5.7.1.1  Resource class 
  4500.  
  4501. Structure 
  4502.  
  4503. typedef struct br_resource_class {
  4504.  
  4505.     char *identifier;
  4506.     br_uint_8 res_class;
  4507.     br_resourcefree_cbfn *free_cb;
  4508.  
  4509. } br_resource_class;
  4510.  
  4511. Description 
  4512.  
  4513. BRender's resource class structure. 
  4514.  
  4515. Members 
  4516.  
  4517.  *identifier 
  4518.            Resource class name. 
  4519.  res_class 
  4520.            Resource class (see section 5.5.2.2). 
  4521.  free_cb 
  4522.            A pointer to a resource class destructor, called whenever a resource 
  4523.            block in the class is freed. 
  4524.  
  4525.  See also 
  4526.  
  4527.   BrResFree
  4528.  
  4529.  5.7.2  Resource allocation functions 
  4530.  
  4531.  5.7.2.1  BrResAllocate 
  4532.  
  4533.  Syntax 
  4534.  
  4535.   void * BrResAllocate(void *vparent, br_size_t size, int res_class);
  4536.  
  4537.  Description 
  4538.  
  4539.  Allocate a new resource block of a given class. 
  4540.  
  4541.  Arguments 
  4542.  
  4543.  vparent 
  4544.            A pointer to a parental resource block, or NULL if it will have no 
  4545.            parent. 
  4546.  size 
  4547.            Size of block in bytes. 
  4548.  res_class 
  4549.            Resource class (see section 5.5.2.2). 
  4550.  
  4551.  Return value 
  4552.  
  4553.  Returns a pointer to the allocated resource block. 
  4554.  
  4555.  5.7.2.2  BrResFree 
  4556.  
  4557.  Syntax 
  4558.  
  4559.   void BrResFree(void *vres);
  4560.  
  4561.  Description 
  4562.  
  4563.  Free a resource block, and any child resources it has. If any resource classes 
  4564.  have destructors, they are invoked when appropriate. 
  4565.  
  4566.  Arguments 
  4567.  
  4568.  vres 
  4569.            A pointer to a resource block. 
  4570.  
  4571.  Example 
  4572.  
  4573.   void BR_CALLBACK example_destructor(void *res, br_uint_8 res_class ,
  4574.                                       br_size_t size)
  4575.  
  4576.   {
  4577.  
  4578.   ...
  4579.  
  4580.   }
  4581.  
  4582.   #define EXAMPLE_CLASS (BR_MEMORY_ APPLICATION + 1)
  4583.  
  4584.   {
  4585.       void *ptr;
  4586.       br_resource_class example;
  4587.  
  4588.       example.identifier = "class_name" ;
  4589.       example.res_class = EXAMPLE_CLASS;
  4590.       example.free_cb = &example_destructor;
  4591.  
  4592.       ...
  4593.  
  4594.       BrResClassAdd(&example); /* Add resource class to registry */
  4595.  
  4596.       ptr = BrResAllocate(NULL,1024,EXAMPLE_CLASS);
  4597.  
  4598.       BrResFree(ptr);     /* Destructor is invoked */
  4599.   }
  4600.  
  4601.  See also 
  4602.  
  4603.   BrResClassAdd
  4604.   br_resource_class
  4605.  
  4606.  5.7.2.3  BrResStrDup 
  4607.  
  4608.  Syntax 
  4609.  
  4610.   char * BrResStrDup(void *vparent, char *str);
  4611.  
  4612.  Description 
  4613.  
  4614.  Allocate a resource block and copy a string into it. 
  4615.  
  4616.  Arguments 
  4617.  
  4618.  vparent 
  4619.            A pointer to a parental resource block. 
  4620.  str 
  4621.            A pointer to the source string. 
  4622.  
  4623.  Return value 
  4624.  
  4625.  Returns a pointer to the allocated resource block. 
  4626.  
  4627.  5.7.2.4  BrResAdd 
  4628.  
  4629.  Syntax 
  4630.  
  4631.   void * BrResAdd(void *vparent, void *vres);
  4632.  
  4633.  Description 
  4634.  
  4635.  Add a resource block as a child of another. 
  4636.  
  4637.  Arguments 
  4638.  
  4639.  vparent 
  4640.            A pointer to the parent resource block. 
  4641.  vres 
  4642.            A pointer to the child resource block. 
  4643.  
  4644.  Return value 
  4645.  
  4646.  Returns a pointer to the child resource block. 
  4647.  
  4648.  5.7.2.5  BrResRemove 
  4649.  
  4650.  Syntax 
  4651.  
  4652.   void * BrResRemove(void *vres);
  4653.  
  4654.  Description 
  4655.  
  4656.  Remove a resource block from a parent. 
  4657.  
  4658.  Arguments 
  4659.  
  4660.  vres 
  4661.            A pointer to the resource block to be removed. 
  4662.  
  4663.  Return value 
  4664.  
  4665.  Returns a pointer to the removed resource block. 
  4666.  
  4667.  5.7.2.6  BrResClass 
  4668.  
  4669.  Syntax 
  4670.  
  4671.   br_uint_8 BrResClass(void *vres);
  4672.  
  4673.  Description 
  4674.  
  4675.  Find the class of a given resource block. 
  4676.  
  4677.  Arguments 
  4678.  
  4679.  vres 
  4680.            A pointer to a resource block. 
  4681.  
  4682.  Return value 
  4683.  
  4684.  Returns the resource class (see section 5.5.2.2). 
  4685.  
  4686.  5.7.2.7  BrResSize 
  4687.  
  4688.  Syntax 
  4689.  
  4690.   br_uint_32 BrResSize(void *vres);
  4691.  
  4692.  Description 
  4693.  
  4694.  Find the size of a given resource block. 
  4695.  
  4696.  Arguments 
  4697.  
  4698.  vres 
  4699.            A pointer to a resource block. 
  4700.  
  4701.  Return value 
  4702.  
  4703.  Returns the size of the resource block in bytes. 
  4704.  
  4705.  5.7.2.8  BrResChildEnum 
  4706.  
  4707.  Syntax 
  4708.  
  4709.   br_uint_32 BrResChildEnum(void *vres, br_resenum_cbfn *callback, void *arg);
  4710.  
  4711.  Description 
  4712.  
  4713.  Invoke a callback function for each child of a resource block. The callback is 
  4714.  passed a pointer to each child, and its second argument is an optional pointer 
  4715.  supplied by the user. The callback itself returns a br_uint_32 value. The 
  4716.  enumeration will halt at any stage if the return value is non-zero. 
  4717.  
  4718.  As demonstrated in the example, the BR_CALLBACK macro must be used to ensure 
  4719.  compiler compatibility. 
  4720.  
  4721.  Arguments 
  4722.  
  4723.  vres 
  4724.            A pointer to a resource block. 
  4725.  callback 
  4726.            A pointer to a callback function. 
  4727.  arg 
  4728.            An optional argument to pass to the callback function. 
  4729.  
  4730.  Return value 
  4731.  
  4732.  Returns the first non-zero callback return value, or zero if all children are 
  4733.  enumerated. 
  4734.  
  4735.  Example 
  4736.  
  4737.   br_uint_32 example_callback(void *vres, void *arg)
  4738.   {
  4739.     br_uint_32 value;
  4740.  
  4741.     ...
  4742.  
  4743.     return(value);
  4744.   }
  4745.  
  4746.   {
  4747.     br_uint_32 ev;
  4748.     void *rblock;
  4749.  
  4750.     ...
  4751.  
  4752.     ev = BrResChildEnum(rblock,&example_callback,NULL);
  4753.   }
  4754.  
  4755.  5.7.3  Resource class registry functions 
  4756.  
  4757.  5.7.3.1  BrResClassAdd 
  4758.  
  4759.  Syntax 
  4760.  
  4761.   br_resource_class * BrResClassAdd(br_resource_class *rclass);
  4762.  
  4763.  Description 
  4764.  
  4765.  Add a resource class to the registry. 
  4766.  
  4767.  Arguments 
  4768.  
  4769.  rclass 
  4770.            A pointer to a resource class. 
  4771.  
  4772.  Return value 
  4773.  
  4774.  Returns a pointer to the added resource class, or NULL if unsuccessful. 
  4775.  
  4776.  5.7.3.2  BrResClassAddMany 
  4777.  
  4778.  Syntax 
  4779.  
  4780.   br_uint_32 BrResClassAddMany(br_resource_class **items, int n);
  4781.  
  4782.  Description 
  4783.  
  4784.  Add a number of resource classes to the registry. 
  4785.  
  4786.  Arguments 
  4787.  
  4788.  items 
  4789.            A pointer to an array of pointers to resource classes. 
  4790.  n 
  4791.            Number of resource classes to add to the registry. 
  4792.  
  4793.  Return value 
  4794.  
  4795.  Returns the number of resource classes successfully added to the registry. 
  4796.  
  4797.  5.7.3.3  BrResClassRemove 
  4798.  
  4799.  Syntax 
  4800.  
  4801.   br_resource_class * BrResClassRemove(br_resource_class *rclass);
  4802.  
  4803.  Description 
  4804.  
  4805.  Remove a resource class from the registry. 
  4806.  
  4807.  Arguments 
  4808.  
  4809.  rclass 
  4810.            A pointer to a resource class. 
  4811.  
  4812.  Return value 
  4813.  
  4814.  Returns a pointer to the removed resource class. 
  4815.  
  4816.  5.7.3.4  BrResClassRemoveMany 
  4817.  
  4818.  Syntax 
  4819.  
  4820.   br_uint_32 BrResClassRemoveMany(br_resource_class **items, int n);
  4821.  
  4822.  Description 
  4823.  
  4824.  Remove a number of resource classes from the registry. 
  4825.  
  4826.  Arguments 
  4827.  
  4828.  items 
  4829.            A pointer to an array of pointers to resource classes. 
  4830.  n 
  4831.            Number of resource classes to remove from the registry. 
  4832.  
  4833.  Return value 
  4834.  
  4835.  Returns the number of resource classes successfully removed from the registry. 
  4836.  
  4837.  5.7.3.5  BrResClassFind 
  4838.  
  4839.  Syntax 
  4840.  
  4841.   br_resource_class * BrResClassFind(char *pattern);
  4842.  
  4843.  Description 
  4844.  
  4845.  Find a resource class in the registry by name. A callback function can be set 
  4846.  up to be called if the search is unsuccessful. The search pattern can include 
  4847.  the standard wildcards '*' and '?'. 
  4848.  
  4849.  Arguments 
  4850.  
  4851.  *pattern 
  4852.            Search pattern. 
  4853.  
  4854.  Return value 
  4855.  
  4856.  Returns a pointer to the resource class if found, otherwise NULL. If a 
  4857.  callback exists and is called, the callback's return value is returned. 
  4858.  
  4859.  5.7.3.6  BrResClassFindMany 
  4860.  
  4861.  Syntax 
  4862.  
  4863.   br_uint_32 BrResClassFindMany(char *pattern,
  4864.                                 br_resource_class **items, int max);
  4865.  
  4866.  Description 
  4867.  
  4868.  Find a number of resource classes in the registry by name. The search pattern 
  4869.  can include the standard wildcards '*' and '?'. 
  4870.  
  4871.  Arguments 
  4872.  
  4873.  *pattern 
  4874.            Search pattern. 
  4875.  items 
  4876.            A pointer to an array of pointers to resource classes. 
  4877.  max 
  4878.            The maximum number of resource classes to find. 
  4879.  
  4880.  Return value 
  4881.  
  4882.  Returns the number of resource classes found. The pointer array is filled with 
  4883.  pointers to the resource classes. 
  4884.  
  4885.  5.7.3.7  BrResClassFindHook 
  4886.  
  4887.  Syntax 
  4888.  
  4889.   br_resclass_find_cbfn * BrResClassFindHook(br_resclass_find_cbfn *hook);
  4890.  
  4891.  Description 
  4892.  
  4893.  Set up a resource class find callback. If BrResClassFind is unsuccessful and a 
  4894.  callback has been set up, the callback is passed the search pattern as its 
  4895.  only argument. The callback should then return a pointer to a substitute or 
  4896.  default resource class. 
  4897.  
  4898.  Arguments 
  4899.  
  4900.  hook 
  4901.            A pointer to a callback function. 
  4902.  
  4903.  Return value 
  4904.  
  4905.  Returns a pointer to the old callback function. 
  4906.  
  4907.  Example 
  4908.  
  4909.   br_resource_class BR_CALLBACK *example_callback(char *pattern)
  4910.   {
  4911.     br_resource_class default;
  4912.  
  4913.     ...
  4914.  
  4915.     return(&default);
  4916.  
  4917.   }
  4918.  
  4919.   {
  4920.     br_resource_class *rc;
  4921.  
  4922.     ...
  4923.  
  4924.     BrResClassFindHook(&example_callback);
  4925.  
  4926.     rc = BrResClassFind("non_existant_class");
  4927.   }
  4928.  
  4929.  5.7.3.8  BrResClassCount 
  4930.  
  4931.  Syntax 
  4932.  
  4933.   br_uint_32 BrResClassCount(char *pattern);
  4934.  
  4935.  Description 
  4936.  
  4937.  Count the number of resource classes in the registry whose names match a given 
  4938.  search pattern. The search pattern can include the standard wildcards '*' and 
  4939.  '?'. 
  4940.  
  4941.  Arguments 
  4942.  
  4943.  *pattern 
  4944.            Search pattern. 
  4945.  
  4946.  Return value 
  4947.  
  4948.  Returns the number of resource classes matching the search string. 
  4949.  
  4950.  5.7.3.9  BrResClassEnum 
  4951.  
  4952.  Syntax 
  4953.  
  4954.   br_uint_32 BrResClassEnum(char *pattern,
  4955.                             br_resclass_enum_cbfn *callback,
  4956.                             void *arg);
  4957.  
  4958.  Description 
  4959.  
  4960.  Call a callback function for every resource class matching a given search 
  4961.  pattern. The callback is passed a pointer to each matching resource class, and 
  4962.  its second argument is an optional pointer supplied by the user. The search 
  4963.  pattern can include the standard wildcards '*' and '?'. The callback itself 
  4964.  returns a br_uint_32 value. The enumeration will halt at any stage if the 
  4965.  return value is non-zero. 
  4966.  
  4967.  Arguments 
  4968.  
  4969.  *pattern 
  4970.            Search pattern. 
  4971.  callback 
  4972.            A pointer to a callback function. 
  4973.  arg 
  4974.            An optional argument to pass to the callback function. 
  4975.  
  4976.  Return value 
  4977.  
  4978.  Returns the first non-zero callback return value, of zero if all resource 
  4979.  classes are enumerated. 
  4980.  
  4981.  Example 
  4982.  
  4983.   br_uint_32 BR_CALLBACK example_callback(br_resource_class *item,
  4984.                                           void *arg)
  4985.   {
  4986.     br_uint_32 value;
  4987.  
  4988.     ...
  4989.  
  4990.     return(value);
  4991.   }
  4992.  
  4993.   {
  4994.     br_uint_32 ev;
  4995.  
  4996.     ...
  4997.  
  4998.     ev = BrResClassEnum("pattern",&example_callback,NULL);
  4999.   }
  5000.  
  5001.  
  5002. ΓòÉΓòÉΓòÉ 7. 6.  The Maths Library - Overview ΓòÉΓòÉΓòÉ
  5003.  
  5004. BRender provides substantial support for many mathematical primitives, namely: 
  5005. scalars, angles, vectors, matrices, quaternions and Euler angles. Scalars are 
  5006. BRender's own representation of real numbers, and most other objects are built 
  5007. from them. The libraries provide efficient routines for most mathematical 
  5008. operations relevant to 3D graphics. 
  5009.  
  5010.  
  5011. ΓòÉΓòÉΓòÉ 7.1. 6.1  Fixed and floating point representations ΓòÉΓòÉΓòÉ
  5012.  
  5013. To take best advantage of platform specific maths hardware, and to increase 
  5014. speed generally, BRender can use either a fixed or floating point 
  5015. representation in the majority of its maths operations. 
  5016.  
  5017. In fact, BRender has two math libraries: fixed and floating point. They have 
  5018. the same API and the same functionality. A compiler directive specifying the 
  5019. library is set and BRender takes care of the rest. 
  5020.  
  5021. To be flexible in this way, BRender defines its own numerical representations: 
  5022. br_scalar, br_fraction and br_ufraction. If the floating point library is used, 
  5023. they are all floating point numbers. If the fixed point library is used, they 
  5024. are all fixed point numbers. A well-written BRender program will work under 
  5025. either representation. 
  5026.  
  5027. In C, this kind of flexibility is possible only with widespread use of macros, 
  5028. to insert seamlessly alternate sections of code according to which library is 
  5029. in use. It is vital to use the macros and functions provided wherever possible. 
  5030. There are macros for all common arithmetic operations, for the static 
  5031. initialisation of variables, and many specialised functions relevent to 
  5032. transformations and 3D graphics. 
  5033.  
  5034. Throughout this chapter, the '#' symbol is used as a wildcard. 
  5035.  
  5036. 6.1.1.1  Compiler directives for fixed/floating point 
  5037.  
  5038. Definitions 
  5039.  
  5040. BASED_FIXED
  5041. BASED_FLOAT
  5042.  
  5043. Description 
  5044.  
  5045. All BRender programs must be compiled with one of these directives in force. 
  5046. BASED_FIXED causes the use of fixed point numbers wherever possible. 
  5047. Alternatively, BASED_FLOAT causes the use of floating point numbers wherever an 
  5048. increase in accuracy can be made. In general, the fixed point library is faster 
  5049. than the floating point library. 
  5050.  
  5051.  
  5052. ΓòÉΓòÉΓòÉ 7.2. 6.2  Scalars ΓòÉΓòÉΓòÉ
  5053.  
  5054. 6.2.1  Datatypes 
  5055.  
  5056. 6.2.1.1  br_scalar 
  5057.  
  5058. Definitions 
  5059.  
  5060. typedef long br_fixed_ls;
  5061. typedef br_fixed_ls br_scalar;
  5062.  
  5063. typedef float br_scalar;
  5064.  
  5065. Description 
  5066.  
  5067. The br_scalar type is the general numerical representation used by BRender. 
  5068. Under the fixed point library, br_scalar is a 32 bit 16.16 fixed point number, 
  5069. and can represent numbers between approximately -32768 and +32768. Under the 
  5070. floating point library, br_scalar is a float, and can represent numbers between 
  5071. approximately -3.4e38 and +3.4e38. 
  5072.  
  5073. Associated macros 
  5074.  
  5075.  BR_SCALAR(x) 
  5076.            Converts constants to the br_scalar type. 
  5077.  
  5078.  
  5079.  BR_SCALAR_EPSILON 
  5080.            The smallest possible positive scalar value. 
  5081.  BR_SCALAR_MAX 
  5082.            The largest positive value a scalar can represent. 
  5083.  BR_SCALAR_MIN 
  5084.            The largest negative value a scalar can represent. 
  5085.  
  5086.  Example 
  5087.  
  5088.   br_scalar s=BR_SCALAR(100.0);
  5089.  
  5090.  See also 
  5091.  
  5092.   BrFloatToScalar
  5093.   BrIntToScalar
  5094.  
  5095.  6.2.1.2  br_fraction 
  5096.  
  5097.  Definitions 
  5098.  
  5099.   typedef short br_fixed_lsf;
  5100.   typedef br_fixed_lsf br_fraction;
  5101.  
  5102.   typedef float br_fraction;
  5103.  
  5104.  Description 
  5105.  
  5106.  The br_fraction type can be used to represent numbers in the range [- 1,+1). 
  5107.  
  5108.  Under the floating point library, br_fraction is a float. Under the fixed 
  5109.  point library, br_fraction is a 16 bit signed fixed point number. 
  5110.  
  5111.  Associated macros 
  5112.  
  5113.  BR_FRACTION(x) 
  5114.            Converts constants to the br_fraction type. 
  5115.  
  5116.  Example 
  5117.  
  5118.   br_fraction f=BR_FRACTION(-0.5);
  5119.  
  5120.  See also 
  5121.  
  5122.   br_ufraction
  5123.  
  5124.  6.2.1.3  br_ufraction 
  5125.  
  5126.  Definitions 
  5127.  
  5128.   typedef unsigned short br_fixed_luf;
  5129.   typedef br_fixed_luf br_ufraction;
  5130.  
  5131.   typedef float br_ufraction;
  5132.  
  5133.  Description 
  5134.  
  5135.  The br_ufraction type can be used to represent numbers in the range [0,+1). 
  5136.  
  5137.  Under the floating point library, br_ufraction is a float. Under the fixed 
  5138.  point library, br_ufraction is a 16 bit unsigned fixed point number. 
  5139.  
  5140.  Associated macros 
  5141.  
  5142.  BR_UFRACTION(x) 
  5143.            Converts constants to the br_ufraction type. 
  5144.  
  5145.  Example 
  5146.  
  5147.   br_ufraction f=BR_UFRACTION(0.005);
  5148.  
  5149.  See also 
  5150.  
  5151.   br_fraction
  5152.  
  5153.  6.2.2  Functions 
  5154.  
  5155.  6.2.2.1  Scalar conversion functions 
  5156.  
  5157.  Syntax 
  5158.  
  5159.   br_scalar BrAngleToScalar(br_angle a);
  5160.   br_scalar BrFixedToScalar(br_fixed_ls f);
  5161.   br_scalar BrFloatToScalar(float f);
  5162.   br_scalar BrFractionToScalar(br_fraction f);
  5163.   br_scalar BrIntToScalar(int i);
  5164.   br_scalar BrUFractionToScalar(br_ufraction f);
  5165.  
  5166.   br_angle BrScalarToAngle(br_scalar s);
  5167.   br_fixed_ls BrScalarToFixed(br_scalar s);
  5168.   br_float BrScalarToFloat(br_scalar s);
  5169.   br_fraction BrScalarToFraction(br_scalar s);
  5170.   int BrScalarToInt(br_scalar s);
  5171.   br_ufraction BrScalarToUFraction(br_scalar s);
  5172.  
  5173.  Description 
  5174.  
  5175.  Functions implemented as macros to convert scalars to and from angle, fixed 
  5176.  point, float and fraction types. 
  5177.  
  5178.  See also 
  5179.  
  5180.   Angle conversion functions
  5181.  
  5182.  6.2.2.2  Fraction conversion functions 
  5183.  
  5184.  Syntax 
  5185.  
  5186.   br_scalar BrFractionToScalar(br_fraction f);
  5187.   br_fraction BrScalarToFraction(br_scalar s);
  5188.  
  5189.   br_scalar BrUFractionToScalar(br_ufraction uf);
  5190.   br_ufraction BrScalarToUFraction(br_scalar s);
  5191.  
  5192.  Description 
  5193.  
  5194.  Functions implemented as macros to convert between fractions and scalars. 
  5195.  
  5196.  6.2.2.3  Scalar Arithmetic 
  5197.  
  5198.  Syntax 
  5199.  
  5200.   br_scalar BR_ADD(br_scalar a, br_scalar b);
  5201.   br_scalar BR_SUB(br_scalar a, br_scalar b);
  5202.   br_scalar BR_MUL(br_scalar a, br_scalar b);
  5203.   br_scalar BR_DIV(br_scalar a, br_scalar b);
  5204.   br_scalar BR_SQR(br_scalar a);
  5205.   br_scalar BR_RCP(br_scalar a);
  5206.   br_scalar BR_POW(br_scalar a, br_scalar b);
  5207.   br_scalar BR_SQRT(br_scalar a);
  5208.   br_scalar BR_MULDIV(br_scalar a, br_scalar b, br_scalar c);
  5209.   br_scalar BR_ABS(br_scalar a);
  5210.  
  5211.  Description 
  5212.  
  5213.  Scalar arithmetic functions, implemented as macros. 
  5214.  
  5215.  Arguments 
  5216.  
  5217.  a,b,c 
  5218.            Scalars. 
  5219.  
  5220.  Return values 
  5221.  
  5222.  BR_ADD 
  5223.            returns  a+b 
  5224.  BR_SUB 
  5225.            returns a-b 
  5226.  BR_MUL 
  5227.            returns a*b 
  5228.  BR_DIV 
  5229.            returns a/b 
  5230.  BR_RCP 
  5231.            returns 1/a 
  5232.  BR_SQR 
  5233.            returns a^2 
  5234.  BR_POW 
  5235.            returns a^b 
  5236.  BR_SQRT 
  5237.            returns 
  5238.  BR_MULDIV 
  5239.            returns (a*b) / c 
  5240.  BR_ABS 
  5241.            returns |a| 
  5242.  
  5243.  Example 
  5244.  
  5245.   br_scalar s1,s2,s3,s4;
  5246.  
  5247.   ...
  5248.  
  5249.   s1=BR_ADD(s2,BR_POW(s3,s4));
  5250.  
  5251.  See also 
  5252.  
  5253.   BR_MAC#
  5254.   BR_LENGTH#
  5255.  
  5256.  6.2.2.4  Multiply accumulate 
  5257.  
  5258.  Syntax 
  5259.  
  5260.   br_scalar BR_MAC2(br_scalar a, br_scalar b, br_scalar c,
  5261.                     br_scalar d);
  5262.   br_scalar BR_MAC3(br_scalar a, br_scalar b, br_scalar c,
  5263.                     br_scalar d, br_scalar e, br_scalar f);
  5264.   br_scalar BR_MAC4(br_scalar a, br_scalar b, br_scalar c,
  5265.                     br_scalar d, br_scalar e, br_scalar f,
  5266.                     br_scalar g, br_scalar h);
  5267.  
  5268.   br_scalar BR_FMAC2(br_fraction fa, br_scalar b, br _fraction fc,
  5269.                      br_scalar d);
  5270.   br_scalar BR_FMAC3(br_fraction fa, br_scalar b, br _fraction fc,
  5271.                      br_scalar d, br_fraction fe, br_scalar f);
  5272.   br_scalar BR_FMAC4(br_fraction fa, br_scalar b, br _fraction fc,
  5273.                      br_scalar d, br_fraction fe, br_scalar f,
  5274.                      br_fraction fg, br_scalar h);
  5275.  
  5276.  Description 
  5277.  
  5278.  Functions to calculate the sum of the pairwise products of their arguments. 
  5279.  The second group of functions takes fractional multiplicands. 
  5280.  
  5281.  Arguments 
  5282.  
  5283.  a,b,c,d,e,f,g,h 
  5284.            Scalars. 
  5285.  fa,fc,fe,fg 
  5286.            Fractions. 
  5287.  
  5288.  Return value 
  5289.  
  5290.  Returns the sum of the pairwise products of arguments. 
  5291.  
  5292.  Example 
  5293.  
  5294.   br_scalar s1,s2,s3,s4,s5;
  5295.  
  5296.   ...
  5297.  
  5298.   s5=BR_MAC2(s1,s2,s3,s4);    /* s5 = s1*s2 + s3*s4 */
  5299.  
  5300.  See also 
  5301.  
  5302.   BR_LENGTH#
  5303.  
  5304.  6.2.2.5  Multiply accumulate and divide 
  5305.  
  5306.  Syntax 
  5307.  
  5308.   br_scalar BR_MAC2DIV(br_scalar a, br_scalar b, br_scalar c,
  5309.                        br_scalar d, br_scalar s);
  5310.   br_scalar BR_MAC3DIV(br_scalar a, br_scalar b, br_scalar c,
  5311.                        br_scalar d, br_scalar e, br_scalar f,
  5312.                        br_scalar s);
  5313.   br_scalar BR_MAC4DIV(br_scalar a, br_scalar b, br_scalar c,
  5314.                        br_scalar d, br_scalar e, br_scalar f,
  5315.                        br_scalar g, br_scalar h, br_scalar s);
  5316.  
  5317.  Description 
  5318.  
  5319.  Functions to calculate the sum of the pairwise products of their arguments and 
  5320.  divide the result by a scalar. 
  5321.  
  5322.  Arguments 
  5323.  
  5324.  a,b,c,d,e,f,g,h 
  5325.            Scalars. 
  5326.  s 
  5327.            A scalar divisor. 
  5328.  
  5329.  Return values 
  5330.  
  5331.  Returns the sum of the pairwise products of arguments, divided by the scalar 
  5332.  s. 
  5333.  
  5334.  Example 
  5335.  
  5336.   br_scalar s1,s2,s3,s4,s5,s6;
  5337.  
  5338.   ...
  5339.  
  5340.   s6=BR_MAC2DIV(s1,s2,s3,s4,s5);    /* s6 = (s1*s2 + s3*s4) / s5 */
  5341.  
  5342.  See also 
  5343.  
  5344.   BR_LENGTH#
  5345.  
  5346.  6.2.2.6  Length 
  5347.  
  5348.  Syntax 
  5349.  
  5350.   br_scalar BR_LENGTH2(br_scalar a, br_scalar b);
  5351.   br_scalar BR_LENGTH3(br_scalar a, br_scalar b, br_scalar c);
  5352.   br_scalar BR_LENGTH4(br_scalar a, br_scalar b, br_scalar c,
  5353.                        br_scalar d);
  5354.  
  5355.   br_scalar BR_RLENGTH2(br_scalar a, br_scalar b);
  5356.   br_scalar BR_RLENGTH3(br_scalar a, br_scalar b, br_scalar c);
  5357.   br_scalar BR_RLENGTH4(br_scalar a, br_scalar b, br_scalar c,
  5358.                         br_scalar_d);
  5359.  
  5360.  Description 
  5361.  
  5362.  Fast functions to compute the length and reciprocal length of a vector, given 
  5363.  its constituent components. At the expense of accuracy, BR_RLENGTH# uses a 
  5364.  reciprocal square root lookup-table to increase speed. 
  5365.  
  5366.  Arguments 
  5367.  
  5368.  a,b,c,d 
  5369.            Scalars. 
  5370.  
  5371.  Return values 
  5372.  
  5373.  BR_LENGTH# 
  5374.            returns the square root of the sum of its squared arguments. 
  5375.             BR_RLENGTH#
  5376.            returns the reciprocal of the square root of the sum of its squared 
  5377.            arguments. 
  5378.  
  5379.  Example 
  5380.  
  5381.   br_scalar sx,sy,sl;
  5382.  
  5383.   ...
  5384.  
  5385.   sl=BR_LENGTH2(sx,sy);   /* length of line between (0,0) and (sx,sy) */
  5386.  
  5387.  See also 
  5388.  
  5389.   BR_SQR#
  5390.  
  5391.  6.2.2.7  Constant operations 
  5392.  
  5393.  Syntax 
  5394.  
  5395.   br_scalar BR_CONST_MUL(br_scalar a, int b);
  5396.   br_scalar BR_CONST_DIV(br_scalar a, int b);
  5397.  
  5398.  Description 
  5399.  
  5400.  Macros to multiply and divide scalars by integer constants. 
  5401.  
  5402.  Arguments 
  5403.  
  5404.  a 
  5405.            A scalar. 
  5406.  b 
  5407.            An integer constant. 
  5408.  
  5409.  Return values 
  5410.  
  5411.  BR_CONST_MUL 
  5412.            returns a*b 
  5413.  BR_CONST_DIV 
  5414.            returns a/b 
  5415.  
  5416.  See also 
  5417.  
  5418.   Scalar arithmetic
  5419.  
  5420.  6.2.2.8  Sum of squares functions 
  5421.  
  5422.  Syntax 
  5423.  
  5424.   br_scalar BR_SQR2(br_scalar a, br_scalar b);
  5425.   br_scalar BR_SQR3(br_scalar a, br_scalar b, br_scalar c);
  5426.   br_scalar BR_SQR4(br_scalar a, br_scalar b, br_scalar c, br_scalar d);
  5427.  
  5428.  Description 
  5429.  
  5430.  Macros to calculate the sum of squared arguments. 
  5431.  
  5432.  Arguments 
  5433.  
  5434.  a,b,c,d 
  5435.            Scalars. 
  5436.  
  5437.  Return values 
  5438.  
  5439.  Returns the sum of squared arguments. 
  5440.  
  5441.  See also 
  5442.  
  5443.   BR_LENGTH#
  5444.   BR_MAC#
  5445.  
  5446.  
  5447. ΓòÉΓòÉΓòÉ 7.3. 6.3  Integers ΓòÉΓòÉΓòÉ
  5448.  
  5449. 6.3.1  Datatypes 
  5450.  
  5451. 6.3.1.1  br_int_# / br_uint_# 
  5452.  
  5453. Definitions 
  5454.  
  5455. typedef signed long br_int_32;
  5456. typedef unsigned long br_uint_32;
  5457.  
  5458. typedef signed short br_int_16;
  5459. typedef unsigned short br_uint_16;
  5460.  
  5461. typedef signed char br_int_8;
  5462. typedef unsigned char br_uint_8;
  5463.  
  5464. Description 
  5465.  
  5466. BRender's signed and unsigned integer types. 
  5467.  
  5468. 6.3.1.2  Integer conversion functions 
  5469.  
  5470. Syntax 
  5471.  
  5472. int BrFixedToInt(br_fixed_ls s)
  5473. br_fixed_ls BrIntToFixed(int i)
  5474.  
  5475. int BrScalarToInt(br_scalar s)
  5476. br_scalar BrIntToScalar(int i)
  5477.  
  5478. Description 
  5479.  
  5480. Macros to convert between scalars and integers, and fixed-point numbers and 
  5481. integers. 
  5482.  
  5483.  
  5484. ΓòÉΓòÉΓòÉ 7.4. 6.4  Angles ΓòÉΓòÉΓòÉ
  5485.  
  5486. 6.4.1  Datatypes 
  5487.  
  5488. 6.4.1.1  br_angle 
  5489.  
  5490. Definition 
  5491.  
  5492. typedef fixed_luf br_angle;
  5493.  
  5494. Description 
  5495.  
  5496. BRender's own angle representation. One complete revolution corresponds to the 
  5497. entire range of this datatype, and therefore repeated rotations will 'wrap 
  5498. around' correctly. 
  5499.  
  5500. Associated macros 
  5501.  
  5502.  BR_ANGLE_DEG(x) 
  5503.            Converts a constant angle from degrees to the br_angle type 
  5504.  BR_ANGLE_RAD(x) 
  5505.            Converts a constant angle from radians to the br_angle type. 
  5506.  
  5507.  6.4.2  Functions 
  5508.  
  5509.  6.4.2.1  Angle conversion functions 
  5510.  
  5511.  Syntax 
  5512.  
  5513.   br_scalar BrAngleToDegree(br_angle a)
  5514.   br_angle BrDegreeToAngle(br_scalar d)
  5515.  
  5516.   br_scalar BrAngleToRadian(br_angle a)
  5517.   br_angle BrRadianToAngle(br_scalar r)
  5518.  
  5519.   br_scalar BrAngleToScalar(br_angle a)
  5520.   br_angle BrScalarToAngle(br_scalar s)
  5521.  
  5522.   br_scalar BrDegreeToRadian(br_scalar d)
  5523.   br_scalar BrRadianToDegree(br_scalar r)
  5524.  
  5525.  Description 
  5526.  
  5527.  These functions are implemented as macros and convert between different angle 
  5528.  representations, namely: BRender's own angle representation br_angle, degrees 
  5529.  and radians (given as scalars), and scalars themselves, where the range [0,1) 
  5530.  corresponds to one complete rotation. 
  5531.  
  5532.  Example 
  5533.  
  5534.   br_angle a1,a2,a3,a4;
  5535.  
  5536.   ...
  5537.  
  5538.   a1=BR_ANGLE_DEG(90.0);                /* a1 = a2 = a3 = a4 */
  5539.   a2=BrDegreeToAngle(BR_SCALAR(90.0));
  5540.   a3=BrRadianToAngle(BR_SCALAR(PI/2));
  5541.   a4=BrScalarToangle(BR_SCALAR(0.25));
  5542.  
  5543.  See also 
  5544.  
  5545.   br_angle
  5546.  
  5547.  Scalar conversion functions 
  5548.  
  5549.  6.4.2.2  Trigonometry 
  5550.  
  5551.  Syntax 
  5552.  
  5553.   br_scalar BR_SIN(br_angle a);
  5554.   br_scalar BR_COS(br_angle a);
  5555.  
  5556.   br_angle BR_ASIN(br_scalar f);
  5557.   br_angle BR_ACOS(br_scalar f);
  5558.  
  5559.   br_angle BR_ATAN2(br_scalar x, br_scalar y);
  5560.   br_angle BR_ATAN2FAST(br_scalar x, br_scalar y);
  5561.  
  5562.  Description 
  5563.  
  5564.  Standard trigonometric functions. 
  5565.  
  5566.  BR_ATAN2FAST is a faster, but less accurate version of BR_ATAN2. 
  5567.  
  5568.  Arguments 
  5569.  
  5570.  BR_SIN and BR_COS both take one br_angle argument. 
  5571.  
  5572.  BR_ASIN and BR_ACOS both take one br_scalar argument. 
  5573.  
  5574.  BR_ATAN2 and BR_ATAN2FAST both take two br_scalar arguments. 
  5575.  
  5576.  Return values 
  5577.  
  5578.  BR_SIN and BR_COS return the sine and cosine of their argument, respectively. 
  5579.  
  5580.  BR_ASIN and BR_ACOS return the arc-sine and arc-cosine of their argument, 
  5581.  respectively. 
  5582.  
  5583.  BR_ATAN2 and BR_ATAN2FAST  both return the arc-tangent of  their second 
  5584.  argument divided by their first argument. 
  5585.  
  5586.  See also 
  5587.  
  5588.   br_angle
  5589.  
  5590.  
  5591. ΓòÉΓòÉΓòÉ 7.5. 6.5  Euler Angles ΓòÉΓòÉΓòÉ
  5592.  
  5593. 6.5.1  Datatypes 
  5594.  
  5595. 6.5.1.1  br_euler 
  5596.  
  5597. Structure 
  5598.  
  5599. typedef struct br_euler {
  5600.  
  5601.     br_angle a;
  5602.     br_angle b;
  5603.     br_angle c;
  5604.     br_uint_8 order;
  5605.  
  5606. } br_euler;
  5607.  
  5608. Description 
  5609.  
  5610. Euler angles can be used to represent the orientation of an object. Three 
  5611. separate rotations are applied in turn, in a specific order. Euler angles can 
  5612. be either static or relative. With relative euler angles, the rotations are 
  5613. performed around axes relative to the rotations already performed. With static 
  5614. euler angles, the rotations are performed around static axes. 
  5615.  
  5616. Members 
  5617.  
  5618.  a 
  5619.            First angle. 
  5620.  b 
  5621.            Second angle. 
  5622.  c 
  5623.            Third angle. 
  5624.  order 
  5625.            Static or relative rotation order (see section 6.5.1.2). 
  5626.  
  5627.  See also 
  5628.  
  5629.   br_angle
  5630.  
  5631.  Euler angle orderings 
  5632.  
  5633.  6.5.1.2  Euler angle orderings 
  5634.  
  5635.  Description 
  5636.  
  5637.  Definitions for Euler angle orderings. The first three letters indicate the 
  5638.  axes and order in which rotations occurs. The last letter indicates whether 
  5639.  the rotations are static or relative. 
  5640.  
  5641.  Definitions 
  5642.  
  5643.   BR_EULER_XYZ_S
  5644.   BR_EULER_XYX_S
  5645.   BR_EULER_XZY_S
  5646.   BR_EULER_XZX_S
  5647.   BR_EULER_YZX_S
  5648.   BR_EULER_YZY_S
  5649.   BR_EULER_YXZ_S
  5650.   BR_EULER_YXY_S
  5651.   BR_EULER_ZXY_S
  5652.   BR_EULER_ZXZ_S
  5653.   BR_EULER_ZYX_S
  5654.   BR_EULER_ZYZ_S
  5655.   BR_EULER_ZYX_R
  5656.   BR_EULER_XYX_R
  5657.   BR_EULER_YZX_R
  5658.   BR_EULER_XZX_R
  5659.   BR_EULER_XZY_R
  5660.   BR_EULER_YZY_R
  5661.   BR_EULER_ZXY_R
  5662.   BR_EULER_YXY_R
  5663.   BR_EULER_YXZ_R
  5664.   BR_EULER_ZXZ_R
  5665.   BR_EULER_XYZ_R
  5666.   BR_EULER_ZYZ_R
  5667.  
  5668.  See also 
  5669.  
  5670.   br_euler
  5671.   br_angle
  5672.  
  5673.  6.5.2  Functions 
  5674.  
  5675.  6.5.2.1  Euler angle conversion functions 
  5676.  
  5677.  Syntax 
  5678.  
  5679.   br_matrix34 * BrEulerToMatrix34(br_matrix34 *mat, br_euler *euler);
  5680.   br_matrix4 * BrEulerToMatrix4(br_matrix4 *mat, br_euler *euler);
  5681.   br_quat * BrEulerToQuat(br_quat *quat, br_euler *euler);
  5682.  
  5683.   br_euler * BrMatrix34ToEuler(br_euler *euler, br_matrix34 *mat);
  5684.   br_euler * BrMatrix4ToEuler(br_euler *euler, br_matrix4 *mat);
  5685.   br_euler * BrQuatToEuler(br_euler *euler, br_quat *quat);
  5686.  
  5687.  Description 
  5688.  
  5689.  Functions to convert Euler angles to and from matrices and quaternions. Note 
  5690.  that when the source transformation is a matrix, any non-rotational component 
  5691.  of the transformation is lost. 
  5692.  
  5693.  When converting to Euler angles, the order member in the appropriate br_euler 
  5694.  must be set before the conversion is performed. 
  5695.  
  5696.  Arguments 
  5697.  
  5698.  The first argument points to the destination transformation and the second 
  5699.  argument points to the source transformation. 
  5700.  
  5701.  Return value 
  5702.  
  5703.  Returns a pointer to the destination transformation. 
  5704.  
  5705.  See also 
  5706.  
  5707.   BrTransformToTransform
  5708.  
  5709.  
  5710. ΓòÉΓòÉΓòÉ 7.6. 6.6  Quaternions ΓòÉΓòÉΓòÉ
  5711.  
  5712. 6.6.1  Datatypes 
  5713.  
  5714. 6.6.1.1  br_quat 
  5715.  
  5716. Structure 
  5717.  
  5718. typedef struct br_quat {
  5719.  
  5720.     br_scalar x;
  5721.     br_scalar y;
  5722.     br_scalar z;
  5723.     br_scalar w;
  5724.  
  5725. } br_quat;
  5726.  
  5727. Description 
  5728.  
  5729. BRender's quaternion type. A unit quaternion, whose sum of squared elements is 
  5730. one, can be used to represent a rotation around an arbitrary vector. The X, Y 
  5731. and Z components of the quaternion hold the elements of this vector scaled to a 
  5732. length equal to sine of the angle of rotation. The w component holds the cosine 
  5733. of the angle. 
  5734.  
  5735. Associated macros 
  5736.  
  5737.  BR_QUAT(x,y,z,w) 
  5738.            Used for static initialisation of a quaternion. It will 
  5739.            automatically convert its arguments to type br_scalar. 
  5740.  
  5741.  Example 
  5742.  
  5743.   br_quat quat=BR_QUAT(1/sqrt(3),1/sqrt(3),1/sqrt(3),0);
  5744.  
  5745.  6.6.2  Functions 
  5746.  
  5747.  6.6.2.1  Quaternion conversion functions 
  5748.  
  5749.  Syntax 
  5750.  
  5751.   br_euler * BrQuatToEuler(br_euler *euler, br_quat *quat);
  5752.   br_matrix34 * BrQuatToMatrix34(br_matrix34 *mat, br_quat *quat);
  5753.   br_matrix4 * BrQuatToMatrix4(br_matrix4 *mat, br_quat *quat);
  5754.  
  5755.   br_quat * BrEulerToQuat(br_quat *quat, br_euler *euler);
  5756.   br_quat * BrMatrix34ToQuat(br_quat *quat, br_matrix34 *mat);
  5757.   br_quat * BrMatrix4ToQuat(br_quat *quat, br_matrix4 *mat);
  5758.  
  5759.  Description 
  5760.  
  5761.  Functions to convert quaternions to and from matrices and Euler angles. Note 
  5762.  that when the source transformation is a matrix, any non-rotational component 
  5763.  of the transformation is lost. 
  5764.  
  5765.  Arguments 
  5766.  
  5767.  The first argument points to the destination transformation and the second 
  5768.  argument points to the source transformation. 
  5769.  
  5770.  Return value 
  5771.  
  5772.  Returns a pointer to the destination transformation. 
  5773.  
  5774.  See also 
  5775.  
  5776.   BrTransformToTransform
  5777.  
  5778.  6.6.2.2  BrQuatMul 
  5779.  
  5780.  Syntax 
  5781.  
  5782.   br_quat * BrQuatMul(br_quat *q, br_quat *l, br_quat *r);
  5783.  
  5784.  Description 
  5785.  
  5786.  Multiply two quaternions together and place the result in a third destination 
  5787.  quaternion. Quaternion multiplication has the effect of  concatenating the 
  5788.  individual transformations that each represents. It is not commutative. 
  5789.  
  5790.  Arguments 
  5791.  
  5792.  q 
  5793.            A pointer to the destination quaternion. 
  5794.  l,r 
  5795.            Pointers to the two source quaternions. 
  5796.  
  5797.  Return value 
  5798.  
  5799.  Returns a pointer to the destination quaternion. 
  5800.  
  5801.  See also 
  5802.  
  5803.   BrQuatSlerp
  5804.   br_quat
  5805.  
  5806.  6.6.2.3  BrQuatNormalise 
  5807.  
  5808.  Syntax 
  5809.  
  5810.   br_quat * BrQuatNormalise(br_quat *q, br_quat *qq);
  5811.  
  5812.  Description 
  5813.  
  5814.  Normalise a quaternion. Rotations are represented as normalised quaternions in 
  5815.  order to avoid unwanted scaling side-effects. If a large number of operations 
  5816.  is performed on a quaternion, this functions should be used subsequently to 
  5817.  ensure the resulting quaternion remains in normal form, and the sum of the 
  5818.  squares of its elements is one. 
  5819.  
  5820.  Arguments 
  5821.  
  5822.  q 
  5823.            A pointer to the normalised destination quaternion. 
  5824.  qq 
  5825.            A pointer to the source quaternion. 
  5826.  
  5827.  Return value 
  5828.  
  5829.  Returns a pointer to the normalised destination quaternion. 
  5830.  
  5831.  See also 
  5832.  
  5833.   br_quat
  5834.   BrQuatInvert
  5835.  
  5836.  6.6.2.4  BrQuatInvert 
  5837.  
  5838.  Syntax 
  5839.  
  5840.   br_quat * BrQuatInvert(br_quat *q, br_quat *qq);
  5841.  
  5842.  Description 
  5843.  
  5844.  Invert a quaternion and place the result in a second destination quaternion. 
  5845.  The inverse of a quaternion represents the same rotation, but in reverse. 
  5846.  
  5847.  Arguments 
  5848.  
  5849.  q 
  5850.            A pointer to the destination quaternion. 
  5851.  qq 
  5852.            A pointer to the source quaternion. 
  5853.  
  5854.  Return value 
  5855.  
  5856.  Returns a pointer to the destination quaternion. 
  5857.  
  5858.  See also 
  5859.  
  5860.   br_quat
  5861.   BrQuatNormalise
  5862.  
  5863.  6.6.2.5  BrQuatSlerp 
  5864.  
  5865.  Syntax 
  5866.  
  5867.   br_quat * BrQuatSlerp(br_quat *q, br_quat *l, br_quat *r,
  5868.                         br_scalar t, br_int_16 spins);
  5869.  
  5870.  Description 
  5871.  
  5872.  The 'Slerp' operation (spherical linear interpolation) interpolates linearly 
  5873.  between two quaternions along the most direct path between the two 
  5874.  orientations. Moreover, extra spins (complete revolutions) can be inserted in 
  5875.  the path. 
  5876.  
  5877.  Arguments 
  5878.  
  5879.  q 
  5880.            A pointer to the normalised destination quaternion. 
  5881.  l,r 
  5882.            Pointers to the normalised quaternions to interpolate between. 
  5883.  t 
  5884.            Interpolation parameter in the range [0,1]. Zero corresponds to the 
  5885.            source quaternion l, and one corresponds to the source quaternion r. 
  5886.  spins 
  5887.            Number of extra spins. A value of zero causes interpolation along 
  5888.            the shortest path. A value of -1 causes interpolation along the 
  5889.            longest path. 
  5890.  
  5891.  Return value 
  5892.  
  5893.  Returns a pointer to the normalised destination quaternion. 
  5894.  
  5895.  See also 
  5896.  
  5897.   BrQuatMul
  5898.  
  5899.  
  5900. ΓòÉΓòÉΓòÉ 7.7. 6.7  Vectors ΓòÉΓòÉΓòÉ
  5901.  
  5902. 6.7.1  Datatypes 
  5903.  
  5904. 6.7.1.1  br_vector# 
  5905.  
  5906. Structure 
  5907.  
  5908. typedef struct br_vector2 {
  5909.     br_scalar v[2];
  5910. } br_vector2;
  5911.  
  5912. typedef struct br_vector3 {
  5913.     br_scalar v[3];
  5914. } br_vector3;
  5915.  
  5916. typedef struct br_vector4 {
  5917.     br_scalar v[4];
  5918. } br_vector4;
  5919.  
  5920. Description 
  5921.  
  5922. BRender's vector types. 
  5923.  
  5924. Associated macros 
  5925.  
  5926. BR_VECTOR2(a,b)
  5927. BR_VECTOR3(a,b,c)
  5928. BR_VECTOR4(a,b,c,d)
  5929.  
  5930. These macros can be used for vector initialisation. Each argument is 
  5931. automatically converted to a scalar. 
  5932.  
  5933. Example 
  5934.  
  5935. br_vector3 va=BR_VECTOR3(0.0,1.0,2.0);
  5936.  
  5937. 6.7.1.2  br_fvector# 
  5938.  
  5939. Structure 
  5940.  
  5941.     typedef struct br_fvector2 {
  5942.               br_fraction v[2];
  5943.     } br_fvector2;
  5944.  
  5945.     typedef struct br_fvector3 {
  5946.               br_fraction v[3];
  5947.     } br_fvector3;
  5948.  
  5949.     typedef struct br_fvector4 {
  5950.               br_fraction v[4];
  5951.     } br_fvector4;
  5952.  
  5953. Description 
  5954.  
  5955. Brender's fractional vector types. They should be used in situations where each 
  5956. component will never exceed Γö╝1, for example, in the representation of surface 
  5957. normals. 
  5958.  
  5959. Associated macros 
  5960.  
  5961. BR_FVECTOR2(a,b)
  5962. BR_FVECTOR3(a,b,c)
  5963. BR_FVECTOR4(a,b,c,d)
  5964.  
  5965. These macros can be used for vector initialisation. Each argument is 
  5966. automatically converted to a scalar. 
  5967.  
  5968. Example 
  5969.  
  5970. br_fvector2 vb=BR_FVECTOR2(0.1,-0.1);
  5971.  
  5972. 6.7.2  Functions 
  5973.  
  5974. The vector functions are defined as macros.  They are fast, and consequently 
  5975. perform very little range checking or similar argument validation.  If 
  5976. constants are passed as arguments, they must be wrapped with the appropriate 
  5977. type conversion macros. 
  5978.  
  5979. 6.7.2.1  BrVector#Copy 
  5980.  
  5981. Syntax 
  5982.  
  5983. void BrVector2Copy(br_vector2 *v1, br_vector2 *v2);
  5984. void BrVector3Copy(br_vector3 *v1, br_vector3 *v2);
  5985. void BrVector4Copy(br_vector4 *v1, br_vector4 *v2);
  5986.  
  5987. Description 
  5988.  
  5989. Copy a vector. 
  5990.  
  5991. Arguments 
  5992.  
  5993.  v1 
  5994.            A pointer to the destination vector. 
  5995.  v2 
  5996.            A pointer to the source vector. 
  5997.  
  5998.  6.7.2.2  BrVector#Set# 
  5999.  
  6000.  Syntax 
  6001.  
  6002.   void BrVector2Set(br_vector2 *v1, br_scalar s1, br _scalar s2);
  6003.   void BrVector3Set(br_vector3 *v1, br_scalar s1, br_scalar s2,
  6004.                     br_scalar s3);
  6005.  
  6006.   void BrVector2SetInt(br_vector2 *v1, int i1, int i2);
  6007.   void BrVector3SetInt(br_vector3 *v1, int i1, int i2, int i3);
  6008.  
  6009.   void BrVector2SetFloat(br_vector2 *v1, float f1, float f2);
  6010.   void BrVector3SetFloat(br_vector3 *v1, float f1, float f2, float f3);
  6011.  
  6012.  Description 
  6013.  
  6014.  Set a vector with scalar, integer or float arguments. 
  6015.  
  6016.  Arguments 
  6017.  
  6018.  v1 
  6019.            A pointer to the destination vector. 
  6020.  s1,s2,s3 
  6021.            Scalar vector elements. 
  6022.  i1,i2,i3 
  6023.            Integer vector elements. 
  6024.  f1,f2,f3 
  6025.            Float vector elements. 
  6026.  
  6027.  Example 
  6028.  
  6029.   br_vector3 *va,*vb,*vc;
  6030.  
  6031.   ...
  6032.  
  6033.   BrVector3Set(va,BR_SCALAR(1.0),BR_SCALAR(-1.0),BR_SCALAR(2.0));
  6034.   BrVector3SetInt(vb,1,2,3);
  6035.   BrVector3SetFloat(vc,PI,100,1/sqrt(2));
  6036.  
  6037.  6.7.2.3  BrVector#Negate 
  6038.  
  6039.  Syntax 
  6040.  
  6041.   void BrVector2Negate(br_vector2 *v1, br_vector2 *v2);
  6042.   void BrVector3Negate(br_vector3 *v1, br_vector3 *v2);
  6043.  
  6044.  Description 
  6045.  
  6046.  Negate a vector and place the result in a second destination vector. 
  6047.  
  6048.  Arguments 
  6049.  
  6050.  v1 
  6051.            A pointer to the destination vector. 
  6052.  v2 
  6053.            A pointer to the source vector. 
  6054.  
  6055.  6.7.2.4  BrVector#Add 
  6056.  
  6057.  Syntax 
  6058.  
  6059.   void BrVector2Add(br_vector2 *v1, br_vector2 *v2, br_vector2 *v3);
  6060.   void BrVector3Add(br_vector3 *v1, br_vector3 *v2, br_vector3 *v3);
  6061.  
  6062.  Description 
  6063.  
  6064.  Add two vectors and place the result in a third destination vector. 
  6065.  
  6066.  Symbolically:   v1 = v2 + v3 
  6067.  
  6068.  Arguments 
  6069.  
  6070.  v1 
  6071.            A pointer to the destination vector. 
  6072.  v2,v3 
  6073.            Pointers to the source vectors. 
  6074.  
  6075.  6.7.2.5  BrVector#Accumulate 
  6076.  
  6077.  Syntax 
  6078.  
  6079.   void BrVector2Accumulate(br_vector2 *v1, br_vector2 *v2);
  6080.   void BrVector3Accumulate(br_vector3 *v1, br_vector3 *v2);
  6081.  
  6082.  Description 
  6083.  
  6084.  Add one vector to another. 
  6085.  
  6086.  Symbolically:   v1 = v1 + v2 
  6087.  
  6088.  Arguments 
  6089.  
  6090.  v1 
  6091.            A pointer to the accumulating vector. 
  6092.  v2 
  6093.            A pointer to the vector to add. 
  6094.  
  6095.  6.7.2.6  BrVector#Sub 
  6096.  
  6097.  Syntax 
  6098.  
  6099.   void BrVector2Sub(br_vector2 *v1, br_vector2 *v2, br_vector2 *v3);
  6100.   void BrVector3Sub(br_vector3 *v1, br_vector3 *v2, br_vector3 *v3);
  6101.  
  6102.  Description 
  6103.  
  6104.  Subtract one vector from another and place the result in a third destination 
  6105.  vector. 
  6106.  
  6107.  Symbolically:   v1 = v2 - v3 
  6108.  
  6109.  Arguments 
  6110.  
  6111.  v1 
  6112.            A pointer to the destination vector. 
  6113.  v2,v3 
  6114.            Pointers to the source vectors. 
  6115.  
  6116.  6.7.2.7  BrVector#Scale 
  6117.  
  6118.  Syntax 
  6119.  
  6120.   void BrVector2Scale(br_vector2 *v1, br_vector2 *v2, br_scalar s);
  6121.   void BrVector3Scale(br_vector3 *v1, br_vector3 *v2, br_scalar s);
  6122.  
  6123.  Description 
  6124.  
  6125.  Scale a vector by a scalar and place the result in a second destination vector.
  6126.  
  6127.  Arguments 
  6128.  
  6129.  v1 
  6130.            A pointer to the destination vector. 
  6131.  v2 
  6132.            A pointer to the source vector. 
  6133.  s 
  6134.            Scale factor. 
  6135.  
  6136.  6.7.2.8  BrVector#InvScale 
  6137.  
  6138.  Syntax 
  6139.  
  6140.   void BrVector2InvScale(br_vector2 *v1, br_vector2 *v2, br_scalar s);
  6141.   void BrVector3InvScale(br_vector3 *v1, br_vector3 *v2, br_scalar s);
  6142.  
  6143.  Description 
  6144.  
  6145.  Scale a vector by the reciprocal of a scalar and place the result in a second 
  6146.  destination vector.
  6147.  
  6148.  Arguments 
  6149.  
  6150.  v1 
  6151.            A pointer to the destination vector. 
  6152.  v2 
  6153.            A pointer to the source vector. 
  6154.  s 
  6155.            Reciprocal scale factor. 
  6156.  
  6157.  6.7.2.9  BrVector3Cross 
  6158.  
  6159.  Syntax 
  6160.  
  6161.   void BrVector3Cross(br_vector3 *v1, br_vector3 *v2, br_vector3 *v3);
  6162.  
  6163.  Description 
  6164.  
  6165.  Calculate the cross product of two vectors and place the result in a third 
  6166.  destination vector. 
  6167.  
  6168.  Symbolically:    v1 = v2 x v3 
  6169.  
  6170.  Arguments 
  6171.  
  6172.  v1 
  6173.            A pointer to the destination vector. 
  6174.  v2,v3 
  6175.            Pointers to the source vectors. 
  6176.  
  6177.  6.7.2.10  BrVector#Dot 
  6178.  
  6179.  Syntax 
  6180.  
  6181.   br_scalar BrVector2Dot(br_vector2 *v1, br_vector2 *v2);
  6182.   br_scalar BrVector3Dot(br_vector3 *v1, br_vector3 *v2);
  6183.   br_scalar BrVector4Dot(br_vector4 *v1, br_vector4 *v2);
  6184.  
  6185.  Description 
  6186.  
  6187.  Calculate the dot product of two vectors.
  6188.  
  6189.  Arguments 
  6190.  
  6191.  v1,v2 
  6192.            Pointers to the source vectors. 
  6193.  
  6194.  Return value 
  6195.  
  6196.  Returns the dot product of the two source vectors. 
  6197.  
  6198.  6.7.2.11  BrVector3Normalise# 
  6199.  
  6200.  Syntax 
  6201.  
  6202.   void BrVector3Normalise(br_vector3 *v1, br_vector3 *v2);
  6203.   void BrVector3NormaliseQuick(br_vector3 *v1, br_vector3 *v2);
  6204.   void BrVector3NormaliseLP(br_vector3 *v1, br_vector3 *v2);
  6205.  
  6206.  Description 
  6207.  
  6208.  Normalise a vector and place the result in a second destination vector. 
  6209.  
  6210.  BrVector3Normalise checks that the source vector is not of zero length. If it 
  6211.  is, the unit vector along the X axis (1,0,0) is returned. 
  6212.  
  6213.  BrVector3NormaliseQuick does not check for zero length. 
  6214.  
  6215.  BrVector3NormaliseLP is a faster, low-precision version employing a reciprocal 
  6216.  table and it does not check for zero length. 
  6217.  
  6218.  Arguments 
  6219.  
  6220.  v1 
  6221.            A pointer to the destination vector. 
  6222.  v2 
  6223.            A pointer to the source vector. 
  6224.  
  6225.  6.7.2.12  BrVector#Length 
  6226.  
  6227.  Syntax 
  6228.  
  6229.   br_scalar BrVector2Length(br_vector2 *v1);
  6230.   br_scalar BrVector3Length(br_vector3 *v1);
  6231.  
  6232.  Description 
  6233.  
  6234.  Calculate the length of a vector. 
  6235.  
  6236.  Arguments 
  6237.  
  6238.  v1 
  6239.            A pointer to the source vector. 
  6240.  
  6241.  Return value 
  6242.  
  6243.  Returns the length of the vector. 
  6244.  
  6245.  See also 
  6246.  
  6247.   BrVector#LengthSquared
  6248.  
  6249.  6.7.2.13  BrVector#LengthSquared 
  6250.  
  6251.  Syntax 
  6252.  
  6253.   br_scalar BrVector2LengthSquared(br_vector2 *v1);
  6254.   br_scalar BrVector3LengthSquared(br_vector3 *v1);
  6255.  
  6256.  Description 
  6257.  
  6258.  Calculate the squared length of a vector. 
  6259.  
  6260.  Arguments 
  6261.  
  6262.  v1 
  6263.            A pointer to the source vector. 
  6264.  
  6265.  Return value 
  6266.  
  6267.  Returns the squared length of the vector. 
  6268.  
  6269.  See also 
  6270.  
  6271.   BrVector#Length
  6272.  
  6273.  
  6274. ΓòÉΓòÉΓòÉ 7.8. 6.8  Matrices ΓòÉΓòÉΓòÉ
  6275.  
  6276. 6.8.1  Datatypes 
  6277.  
  6278. 6.8.1.1  br_matrix# 
  6279.  
  6280. Structure 
  6281.  
  6282. typedef struct br_matrix34 {
  6283.  
  6284.     br_scalar m[4][3];
  6285.  
  6286. } br_matrix34;
  6287.  
  6288.  
  6289. typedef struct br_matrix4 {
  6290.  
  6291.     br_scalar m[4][4];
  6292.  
  6293. } br_matrix4;
  6294.  
  6295. Description 
  6296.  
  6297. BRender's matrix types. 
  6298.  
  6299. 6.8.2  Functions 
  6300.  
  6301. 6.8.2.1  Matrix conversion functions 
  6302.  
  6303. Syntax 
  6304.  
  6305. br_euler * BrMatrix34ToEuler(br_euler *euler, br_matrix34 *mat);
  6306. br_quat * BrMatrix34ToQuat(br_quat *quat, br_matrix34 *mat);
  6307.  
  6308. br_matrix34 * BrEulerToMatrix34(br_matrix34 *mat, br_euler *euler);
  6309. br_matrix34 * BrQuatToMatrix34(br_matrix34 *mat, br_quat *quat);
  6310.  
  6311. br_euler * BrMatrix4ToEuler(br_euler *euler, br_matrix4 *mat);
  6312. br_quat * BrMatrix4ToQuat(br_quat *quat, br_matrix4 *mat);
  6313.  
  6314. br_matrix4 * BrEulerToMatrix4(br_matrix4 *mat, br_euler *euler);
  6315. br_matrix4 * BrQuatToMatrix4(br_matrix4 *mat, br_quat *quat);
  6316.  
  6317. Description 
  6318.  
  6319. Functions to convert matrices to and from quaternions and Euler angles. Note 
  6320. that when the source transformation is a matrix, any non-rotational component 
  6321. of the transformation is lost. 
  6322.  
  6323. Arguments 
  6324.  
  6325. The first argument points to the destination transformation and the second 
  6326. argument points to the source transformation. 
  6327.  
  6328. Return value 
  6329.  
  6330. Returns a pointer to the destination transformation. 
  6331.  
  6332. 6.8.2.2  BrMatrix#Copy# 
  6333.  
  6334. Syntax 
  6335.  
  6336. void BrMatrix34Copy(br_matrix34 *A, br_matrix34 *B);
  6337. void BrMatrix4Copy34(br_matrix4 *A, br_matrix34 *B);
  6338. void BrMatrix34Copy4(br_matrix34 *A, br_matrix4 *B);
  6339. void BrMatrix4Copy(br_matrix4 *A, br_matrix4 *B);
  6340.  
  6341. Description 
  6342.  
  6343. Copy a matrix. Transformations are preserved when copying between matrices of 
  6344. different size. 
  6345.  
  6346. Arguments 
  6347.  
  6348.  A 
  6349.            A pointer to the destination matrix. 
  6350.  B 
  6351.            A pointer to the source matrix. 
  6352.  
  6353.  Example 
  6354.  
  6355.   br_matrix34 mat1,mat2;
  6356.  
  6357.   ...
  6358.  
  6359.   BrMatrix34Copy(&mat1,&mat2);
  6360.  
  6361.  6.8.2.3  BrMatrix#Mul 
  6362.  
  6363.  Syntax 
  6364.  
  6365.   void BrMatrix34Mul(br_matrix34 *A, br_matrix34 *B, br_matrix34 *C);
  6366.   void BrMatrix4Mul(br_matrix4 *A, br_matrix4 *B, br_matrix4 *C);
  6367.  
  6368.  Description 
  6369.  
  6370.  Multiply two matrices together and place the result in a third matrix. 
  6371.  
  6372.  Symbolically:  A = B C 
  6373.  
  6374.  Arguments 
  6375.  
  6376.  A 
  6377.            A pointer to the destination matrix. 
  6378.  B,C 
  6379.            Pointers to the source matrices. 
  6380.  
  6381.  See also 
  6382.  
  6383.   BrMatrix#Pre#
  6384.   BrMatrix34Post
  6385.  
  6386.  6.8.2.4  BrMatrix#Pre# 
  6387.  
  6388.  Syntax 
  6389.  
  6390.   void BrMatrix34Pre(br_matrix34 *A, br_matrix34 *B);
  6391.   void BrMatrix4Pre34(br_matrix4 *A, br_matrix34 *B);
  6392.  
  6393.  Description 
  6394.  
  6395.  Pre-multiply one matrix by another. 
  6396.  
  6397.  Symbolically:  A = B A 
  6398.  
  6399.  Arguments 
  6400.  
  6401.  A 
  6402.            A pointer to the source/destination matrix. 
  6403.  B 
  6404.            A pointer to the pre-multiplying matrix. 
  6405.  
  6406.  See also 
  6407.  
  6408.   BrMatrix34Post
  6409.   BrMatrix34Mul
  6410.  
  6411.  6.8.2.5  BrMatrix34Post 
  6412.  
  6413.  Syntax 
  6414.  
  6415.   void BrMatrix34Post(br_matrix34 *A ,br_matrix34 *B);
  6416.  
  6417.  Description 
  6418.  
  6419.  Post-multiply one matrix by another. 
  6420.  
  6421.  Symbolically:  A = A B 
  6422.  
  6423.  Arguments 
  6424.  
  6425.  A 
  6426.            A pointer to the source/destination matrix. 
  6427.  B 
  6428.            A pointer to the post-multiplying matrix. 
  6429.  
  6430.  See also 
  6431.  
  6432.   BrMatrix#Pre#
  6433.   BrMatrix34Mul
  6434.  
  6435.  6.8.2.6  BrMatrix#Identity 
  6436.  
  6437.  Syntax 
  6438.  
  6439.   void BrMatrix34Identity(br_matrix34 *mat);
  6440.   void BrMatrix4Identity(br_matrix4 *mat);
  6441.  
  6442.  Description 
  6443.  
  6444.  Generate the identity transformation matrix. 
  6445.  
  6446.  Arguments 
  6447.  
  6448.  mat 
  6449.            A pointer to the destination matrix. 
  6450.  
  6451.  See also 
  6452.  
  6453.   BrMatrix34Rotate
  6454.   BrMatrix34Scale
  6455.   BrMatrix34Translate
  6456.  
  6457.  6.8.2.7  BrMatrix34#Rotate 
  6458.  
  6459.  Syntax 
  6460.  
  6461.   void BrMatrix34Rotate(br_matrix34 *mat, br_angle r, br_vector3 *axis);
  6462.   void BrMatrix34PreRotate(br_matrix34 *mat, br_angle r, br_vector3 *axis);
  6463.   void BrMatrix34PostRotate(br_matrix34 *mat, br_angle r, br_vector3 *axis);
  6464.  
  6465.  Description 
  6466.  
  6467.  Generate, pre-multiply by or post-multiply by a matrix representing a general 
  6468.  rotation about a given axis through a given angle. 
  6469.  
  6470.  Arguments 
  6471.  
  6472.  mat 
  6473.            A pointer to the source/destination matrix. 
  6474.  axis 
  6475.            A pointer to the normalised vector giving the axis about which 
  6476.            rotation will occur. 
  6477.  r 
  6478.            Rotation angle. 
  6479.  
  6480.  See also 
  6481.  
  6482.   br_quat
  6483.   BrMatrix34Rotate#
  6484.  
  6485.  6.8.2.8  BrMatrix34Rotate# 
  6486.  
  6487.  Syntax 
  6488.  
  6489.   void BrMatrix34RotateX(br_matrix34 *mat, angle rx);
  6490.   void BrMatrix34RotateY(br_matrix34 *mat, angle ry);
  6491.   void BrMatrix34RotateZ(br_matrix34 *mat, angle rz);
  6492.  
  6493.  Description 
  6494.  
  6495.  Generate a matrix representing a rotation about the X, Y or Z coordinate axis. 
  6496.  
  6497.  Arguments 
  6498.  
  6499.  mat 
  6500.            A pointer to the destination matrix. 
  6501.  rx,ry,rz 
  6502.            Rotation angles around each coordinate axis. 
  6503.  
  6504.  See also 
  6505.  
  6506.   BrMatrix34#Rotate
  6507.  
  6508.  6.8.2.9  BrMatrix34PreRotate# 
  6509.  
  6510.  Syntax 
  6511.  
  6512.   void BrMatrix34PreRotateX(br_matrix34 *mat, angle rx);
  6513.   void BrMatrix34PreRotateY(br_matrix34 *mat, angle ry);
  6514.   void BrMatrix34PreRotateZ(br_matrix34 *mat, angle rz);
  6515.  
  6516.  Description 
  6517.  
  6518.  Pre-multiply a matrix by a matrix representing a rotation about the X, Y or Z 
  6519.  coordinate axis. 
  6520.  
  6521.  Arguments 
  6522.  
  6523.  mat 
  6524.            A pointer to the source/destination matrix. 
  6525.  rx,ry,rz 
  6526.            Rotation angles around each coordinate axis. 
  6527.  
  6528.  Example 
  6529.  
  6530.   br_angle angle_z=BR_ANGLE_RAD(PI/2);
  6531.   br_matrix34 mat;
  6532.  
  6533.   ...
  6534.  
  6535.   BrMatrix34PreRotateZ(&mat,angle_z);
  6536.  
  6537.  See also 
  6538.  
  6539.   BrMatrix34#Rotate
  6540.  
  6541.  6.8.2.10  BrMatrix34PostRotate# 
  6542.  
  6543.  Syntax 
  6544.  
  6545.   void BrMatrix34PostRotateX(br_matrix34 *mat, angle rx);
  6546.   void BrMatrix34PostRotateY(br_matrix34 *mat, angle ry);
  6547.   void BrMatrix34PostRotateZ(br_matrix34 *mat, angle rz);
  6548.  
  6549.  Description 
  6550.  
  6551.  Post-multiply a matrix by a matrix representing a rotation about the X, Y or Z 
  6552.  coordinate axis. 
  6553.  
  6554.  Arguments 
  6555.  
  6556.  mat 
  6557.            A pointer to the source/destination matrix. 
  6558.  rx,ry,rz 
  6559.            Rotation angles around each coordinate axis. 
  6560.  
  6561.  Example 
  6562.  
  6563.   br_angle angle_x=BR_ANGLE_DEG(90.0);
  6564.   br_matrix34 mat;
  6565.  
  6566.   ...
  6567.  
  6568.   BrMatrix34PostRotateX(&mat,angle_x);
  6569.  
  6570.  See also 
  6571.  
  6572.   BrMatrix34#Rotate
  6573.  
  6574.  6.8.2.11  BrMatrix34Translate 
  6575.  
  6576.  Syntax 
  6577.  
  6578.   void BrMatrix34Translate(br_matrix34 *mat, br_scalar x,
  6579.                            br_scalar y, br_scalar z);
  6580.  
  6581.  Description 
  6582.  
  6583.  Generate a translation transformation matrix. 
  6584.  
  6585.  Arguments 
  6586.  
  6587.  mat 
  6588.            A pointer to the destination matrix. 
  6589.  x,y,z 
  6590.            Translation along each coordinate axis. 
  6591.  
  6592.  See also 
  6593.  
  6594.   BrMatrix34PreTranslate
  6595.   BrMatrix34PostTranslate
  6596.  
  6597.  6.8.2.12  BrMatrix34PreTranslate 
  6598.  
  6599.  Syntax 
  6600.  
  6601.   void BrMatrix34PreTranslate(br_matrix34 *mat, br_scalar x,
  6602.                               br_scalar y, br_scalar z);
  6603.  
  6604.  Description 
  6605.  
  6606.  Pre-multiply a matrix by a matrix representing a translation. 
  6607.  
  6608.  Arguments 
  6609.  
  6610.  mat 
  6611.            A pointer to the source/destination matrix. 
  6612.  x,y,z 
  6613.            Translation along each coordinate axis. 
  6614.  
  6615.  See also 
  6616.  
  6617.   BrMatrix34Translate
  6618.   BrMatrix34PostTranslate
  6619.  
  6620.  6.8.2.13  BrMatrix34PostTranslate 
  6621.  
  6622.  Syntax 
  6623.  
  6624.   void BrMatrix34PostTranslate(br_matrix34 *mat, br_scalar x,
  6625.                                br_scalar y, br_scalar z);
  6626.  
  6627.  Description 
  6628.  
  6629.  Post-multiply a matrix by a matrix representing a translation. 
  6630.  
  6631.  Arguments 
  6632.  
  6633.  mat 
  6634.            A pointer to the source/destination matrix. 
  6635.  x,y,z 
  6636.            Translation along each coordinate axis. 
  6637.  
  6638.  See also 
  6639.  
  6640.   BrMatrix34Translate
  6641.   BrMatrix34PreTranslate
  6642.  
  6643.  6.8.2.14  BrMatrix#Scale 
  6644.  
  6645.  Syntax 
  6646.  
  6647.   void BrMatrix34Scale(br_matrix34 *mat, br_scalar sx, br_scalar sy,
  6648.                        br_scalar sz);
  6649.   void BrMatrix4Scale(br_matrix4 *mat, br_scalar sx , br_scalar sy,
  6650.                       br_scalar sz);
  6651.  
  6652.  Description 
  6653.  
  6654.  Generate a scaling transformation matrix. 
  6655.  
  6656.  Arguments 
  6657.  
  6658.  mat 
  6659.            A pointer to the destination matrix. 
  6660.  sx,sy,sz 
  6661.            Scaling factors along each coordinate axis. 
  6662.  
  6663.  See also 
  6664.  
  6665.   BrMatrix34PreScale
  6666.   BrMatrix34PostScale
  6667.  
  6668.  6.8.2.15  BrMatrix34PreScale 
  6669.  
  6670.  Syntax 
  6671.  
  6672.   void BrMatrix34PreScale(br_matrix34 *mat, br_ scalar sx, br_scalar sy,
  6673.                           br_scalar sz);
  6674.  
  6675.  Description 
  6676.  
  6677.  Pre-multiply a matrix by a matrix representing a scaling transformation. 
  6678.  
  6679.  Arguments 
  6680.  
  6681.  mat 
  6682.            A pointer to the source/destination matrix. 
  6683.  sx,sy,sz 
  6684.            Scaling factors along each coordinate axis. 
  6685.  
  6686.  See also 
  6687.  
  6688.   BrMatrix34PostScale
  6689.   BrMatrix#Scale
  6690.  
  6691.  6.8.2.16  BrMatrix34PostScale 
  6692.  
  6693.  Syntax 
  6694.  
  6695.   void BrMatrix34PostScale(br_matrix34 *mat, br_ scalar sx, br_scalar sy,
  6696.                            br_scalar sz);
  6697.  
  6698.  Description 
  6699.  
  6700.  Post-multiply a matrix by a matrix representing a scaling transformation. 
  6701.  
  6702.  Arguments 
  6703.  
  6704.  mat 
  6705.            A pointer to the source/destination matrix. 
  6706.  sx,sy,sz 
  6707.            Scaling factors along each coordinate axis. 
  6708.  
  6709.  See also 
  6710.  
  6711.   BrMatrix#Scale
  6712.   BrMatrix34PreScale
  6713.  
  6714.  6.8.2.17  BrMatrix34Shear# 
  6715.  
  6716.  Syntax 
  6717.  
  6718.   void BrMatrix34ShearX(br_matrix34 *mat, br_scalar sy, br_scalar sz);
  6719.   void BrMatrix34ShearY(br_matrix34 *mat, br_scalar sx, br_scalar sz);
  6720.   void BrMatrix34ShearZ(br_matrix34 *mat, br_scalar sx, br_scalar sy);
  6721.  
  6722.  Description 
  6723.  
  6724.  Generate a shear transformation, invariant along the X, Y or Z axis. 
  6725.  
  6726.  Arguments 
  6727.  
  6728.  mat 
  6729.            A pointer to the destination matrix. 
  6730.  sx,sy,sz 
  6731.            Shear factors along each coordinate axis. 
  6732.  
  6733.  See also 
  6734.  
  6735.   BrMatrix34PreShear#
  6736.   BrMatrixPostShear#
  6737.  
  6738.  6.8.2.18  BrMatrix34PreShear# 
  6739.  
  6740.  Syntax 
  6741.  
  6742.   void BrMatrix34PreShearX(br_matrix34 *mat, br_scalar sy, br_scalar sz);
  6743.   void BrMatrix34PreShearY(br_matrix34 *mat, br_scalar sx, br_scalar sz);
  6744.   void BrMatrix34PreShearZ(br_matrix34 *mat, br_scalar sx, br_scalar sy);
  6745.  
  6746.  Description 
  6747.  
  6748.  Pre-multiply a matrix by a matrix representing a shear transformation 
  6749.  invariant along the X, Y or Z coordinate axis. 
  6750.  
  6751.  Arguments 
  6752.  
  6753.  mat 
  6754.            A pointer to the source/destination matrix. 
  6755.  sx,sy,sz 
  6756.            Shear factors along each coordinate axis. 
  6757.  
  6758.  See also 
  6759.  
  6760.   BrMatrix34Shear#
  6761.   BrMatrix34PostShear#
  6762.  
  6763.  6.8.2.19  BrMatrix34PostShear# 
  6764.  
  6765.  Syntax 
  6766.  
  6767.   void BrMatrix34PostShearX(br_matrix34 *mat, br_scalar sy, br_scalar sz);
  6768.   void BrMatrix34PostShearY(br_matrix34 *mat, br_scalar sx, br_scalar sz);
  6769.   void BrMatrix34PostShearZ(br_matrix34 *mat, br_scalar sx, br_scalar sy);
  6770.  
  6771.  Description 
  6772.  
  6773.  Post-multiply a matrix by a matrix representing a shear transformation 
  6774.  invariant along the X, Y or Z coordinate axis. 
  6775.  
  6776.  Arguments 
  6777.  
  6778.  mat 
  6779.            A pointer to the source/destination matrix. 
  6780.  sx,sy,sz 
  6781.            Shear factors along each coordinate axis. 
  6782.  
  6783.  See also 
  6784.  
  6785.   BrMatrix34Shear#
  6786.   BrMatrix34PreShear#
  6787.  
  6788.  6.8.2.20  BrMatrix#Apply# 
  6789.  
  6790.  Syntax 
  6791.  
  6792.   void BrMatrix34ApplyV(br_vector3 *a, br_vector3 *b, br_matrix34 *C);
  6793.   void BrMatrix34ApplyP(br_vector3 *a, br_vector3 *b, br_matrix34 *C);
  6794.   void BrMatrix34Apply (br_vector3 *a, br_vector4 *b, br_matrix34 *C);
  6795.  
  6796.   void BrMatrix4ApplyV(br_vector4 *a, br_vector3 *b, br_matrix4 *C);
  6797.   void BrMatrix4ApplyP(br_vector4 *a, br_vector3 *b, br_matrix4 *C);
  6798.   void BrMatrix4Apply (br_vector4 *a, br_vector4 *b, br_matrix4 *C);
  6799.  
  6800.  Description 
  6801.  
  6802.  Takes a br_vector3, a point or a br_vector4, and applies a matrix to it. 
  6803.  
  6804.  Symbolically:  a = b C 
  6805.  
  6806.  Arguments 
  6807.  
  6808.  a 
  6809.            A pointer to the destination vector. 
  6810.  b 
  6811.            A pointer to the source vector. 
  6812.  C 
  6813.            A pointer to the source matrix. 
  6814.  
  6815.  See also 
  6816.  
  6817.   BrMatrix#Mul
  6818.   BrMatrix#TApply#
  6819.  
  6820.  6.8.2.21  BrMatrix#TApply# 
  6821.  
  6822.  Syntax 
  6823.  
  6824.   void BrMatrix34TApplyV(br_vector3 *a, br_vector3 *b, br_matrix34 *C);
  6825.   void BrMatrix34TApplyP(br_vector3 *a, br_vector3 *b, br_matrix34 *C);
  6826.   void BrMatrix34TApply (br_vector4 *a, br_vector4 *b, br_matrix34 *C);
  6827.  
  6828.   void BrMatrix4TApplyV(br_vector4 *a, br_vector3 *b, br_matrix4 *C);
  6829.   void BrMatrix4TApplyP(br_vector4 *a, br_vector3 *b, br_matrix4 *C);
  6830.   void BrMatrix4TApply (br_vector4 *a, br_vector4 *b, br_matrix4 *C);
  6831.  
  6832.  Description 
  6833.  
  6834.  As for BrMatrix#Apply# , but the transpose of the matrix is applied. 
  6835.  
  6836.  Arguments 
  6837.  
  6838.  a 
  6839.            A pointer to the destination vector. 
  6840.  b 
  6841.            A pointer to the source vector. 
  6842.  C 
  6843.            A pointer to the source matrix. 
  6844.  
  6845.  See also 
  6846.  
  6847.   BrMatrix#Mul
  6848.   BrMatrix#Apply#
  6849.  
  6850.  6.8.2.22  BrMatrix4Perspective 
  6851.  
  6852.  Syntax 
  6853.  
  6854.   void BrMatrix4Perspective(br_matrix4 *mat, br_angle field_of_view,
  6855.                             br_scalar aspect, br_scalar hither,
  6856.                             br_scalar yon);
  6857.  
  6858.  Description 
  6859.  
  6860.  This function generates the transformation matrix which BRender uses to map a 
  6861.  scene from world space into camera space. The transformation takes the entire 
  6862.  view volume (a prism of a given angle, with front and back limits hither and 
  6863.  yon) and maps it into the rendering volume, a half cube delimited by the 
  6864.  coordinates (-1,-1,0) and (1,1,-1). 
  6865.  
  6866.  Arguments 
  6867.  
  6868.  mat 
  6869.            A pointer to the destination matrix. 
  6870.  field_of_view 
  6871.            The angle subtended between the sides of the view volume. 
  6872.  aspect 
  6873.            The ratio of the sides of the view volume. 
  6874.  hither, yon 
  6875.            The position of the front and back of the view volume, measured from 
  6876.            the camera. 
  6877.  
  6878.  Example 
  6879.  
  6880.   br_matrix4 mat;
  6881.   br_angle fov=BR_ANGLE_DEG(45.0);
  6882.   br_scalar aspect=BR_SCALAR(1.46);
  6883.  
  6884.   ...
  6885.  
  6886.   BrMatrix4Perspective(&mat,fov,aspect,BR_SCALAR(1.0),BR_SCALAR(20.0));
  6887.  
  6888.  See also 
  6889.  
  6890.   br_camera
  6891.  
  6892.  6.8.2.23  BrMatrix4Determinant 
  6893.  
  6894.  Syntax 
  6895.  
  6896.   br_scalar BrMatrix4Determinant(br_matrix4 *mat);
  6897.  
  6898.  Description 
  6899.  
  6900.  Calculate the determinant of a matrix. 
  6901.  
  6902.  Arguments 
  6903.  
  6904.  mat 
  6905.            A pointer to the source matrix. 
  6906.  
  6907.  Return value 
  6908.  
  6909.  If the inverse of the matrix exists, the determinant is returned. If th ere is 
  6910.  no inverse, scalar zero is returned. 
  6911.  
  6912.  See also 
  6913.  
  6914.   BrMatrix4Adjoint
  6915.   BrMatrix#Inverse
  6916.  
  6917.  6.8.2.24  BrMatrix4Adjoint 
  6918.  
  6919.  Syntax 
  6920.  
  6921.   void BrMatrix4Adjoint(br_matrix4 *A, br_matrix4 *B);
  6922.  
  6923.  Description 
  6924.  
  6925.  Find the adjoint of a matrix (the transposed matrix of co-factors). 
  6926.  
  6927.  Arguments 
  6928.  
  6929.  A 
  6930.            A pointer to the destination adjoint matrix. 
  6931.  B 
  6932.            A pointer to the source matrix. 
  6933.  
  6934.  See also 
  6935.  
  6936.   BrMatrix4Determinant
  6937.   BrMatrix#Inverse
  6938.  
  6939.  6.8.2.25  BrMatrix#Inverse 
  6940.  
  6941.  Syntax 
  6942.  
  6943.   br_scalar BrMatrix34Inverse(br_matrix34 *out, br_matrix34 *in);
  6944.   br_scalar BrMatrix4Inverse(br_matrix4 *out, br_matrix4 *in);
  6945.  
  6946.  Description 
  6947.  
  6948.  Find the inverse of a matrix. 
  6949.  
  6950.  Arguments 
  6951.  
  6952.  *out 
  6953.            A pointer to the inverted destination matrix. 
  6954.  *in 
  6955.            A pointer to the source matrix. 
  6956.  
  6957.  Return value 
  6958.  
  6959.  If the inverse exists, the determinant of the source matrix is returned . If 
  6960.  there is no inverse, scalar zero is returned. 
  6961.  
  6962.  Example 
  6963.  
  6964.   br_matrix34 mat,inv;
  6965.  
  6966.   ...
  6967.  
  6968.   BrMatrix34Inverse(&inv,&mat);
  6969.  
  6970.  See also 
  6971.  
  6972.   BrMatrix4Determinant
  6973.   BrMatrix4Adjoint
  6974.   BrMatrix34LPInverse
  6975.  
  6976.  6.8.2.26  BrMatrix34LPInverse 
  6977.  
  6978.  Syntax 
  6979.  
  6980.   void BrMatrix34LPInverse(br_matrix34 *A, br_matrix34 *B);
  6981.  
  6982.  Description 
  6983.  
  6984.  Find the inverse of a length-preserving transformation matrix. 
  6985.  
  6986.  Arguments 
  6987.  
  6988.  A 
  6989.            A pointer to the inverted destination matrix. 
  6990.  B 
  6991.            A pointer to the source matrix. 
  6992.  
  6993.  See also 
  6994.  
  6995.   BrMatrix#Inverse
  6996.   BrMatrix34LPNormalise
  6997.  
  6998.  6.8.2.27  BrMatrix34LPNormalise 
  6999.  
  7000.  Syntax 
  7001.  
  7002.   void BrMatrix34LPNormalise(br_matrix34 *A, br_matrix34 *B);
  7003.  
  7004.  Description 
  7005.  
  7006.  'Normalise' a matrix. This function takes a matrix and adjusts it so that it 
  7007.  represents a length-preserving transformation. For example, it can be applied 
  7008.  to a length-preserving matrix which has undergone a long sequence of 
  7009.  operations, to ensure that the final result is still truly length-preserving. 
  7010.  
  7011.  Arguments 
  7012.  
  7013.  A 
  7014.            A pointer to the normalised destination matrix. 
  7015.  B 
  7016.            A pointer to the source matrix. 
  7017.  
  7018.  See also 
  7019.  
  7020.   BrMatrix34LPInverse
  7021.  
  7022.  6.8.2.28  BrMatrix34RollingBall 
  7023.  
  7024.  Syntax 
  7025.  
  7026.   void BrMatrix34RollingBall(br_matrix34 *mat, br_int_16 dx,
  7027.                              br_int_16 dy, br_int_16 radius);
  7028.  
  7029.  Description 
  7030.  
  7031.  This function generates a matrix which provides an intuitive way of 
  7032.  controlling the rotation of 3D objects with a mouse or other 2D pointing 
  7033.  device. Imagine a ball on a flat surface, with a mobile flat surface resting 
  7034.  on top of the ball. As the top surface moves about, the ball rotates. 
  7035.  
  7036.  Arguments 
  7037.  
  7038.  mat 
  7039.            A pointer to the destination matrix. 
  7040.  dx,dy 
  7041.            The amount the 'top surface' has moved in each direction. 
  7042.  radius 
  7043.            The radius of the imaginary ball. 
  7044.  
  7045.  Example 
  7046.  
  7047.   br_int_16 mouse_x,mouse_y;
  7048.   br_matrix34 mat;
  7049.  
  7050.   ...
  7051.  
  7052.   BrMatrix34RollingBall(&mat,-mouse_x,mouse_y,500);
  7053.  
  7054.  6.8.2.29  Transformation conversion functions 
  7055.  
  7056.  Syntax 
  7057.  
  7058.   void BrTransformToMatrix34(br_matrix34 *mat, br_transform *xform);
  7059.   void BrMatrix34ToTransform(br_transform *xform, br_matrix34 *mat);
  7060.  
  7061.  Description 
  7062.  
  7063.  Functions to convert between matrices and the generic transformation type 
  7064.  br_transform. 
  7065.  
  7066.  Arguments 
  7067.  
  7068.  mat 
  7069.            A pointer to a matrix. 
  7070.  xform 
  7071.            A pointer to a generic transformation. 
  7072.  
  7073.  The first argument points to the destination transformation and the second 
  7074.  argument points to the source transformation. 
  7075.  
  7076.  See also 
  7077.  
  7078.   BrMatrix#Transform
  7079.   BrTransformToTransform
  7080.  
  7081.  6.8.2.30  BrMatrix#Transform 
  7082.  
  7083.  Syntax 
  7084.  
  7085.   void BrMatrix34PreTransform(br_matrix34 *mat, br_transform *xform);
  7086.   void BrMatrix34PostTransform(br_matrix34 *mat, br_transform *xform);
  7087.  
  7088.   void BrMatrix4PreTransform(br_matrix4 *mat, br_transform *xform);
  7089.  
  7090.  Description 
  7091.  
  7092.  Pre-multiply or post-multiply a matrix by a matrix representing a generic 
  7093.  transformation. 
  7094.  
  7095.  Arguments 
  7096.  
  7097.  mat 
  7098.            A pointer to the source/destination matrix. 
  7099.  xform 
  7100.            A pointer to a generic transformation. 
  7101.  
  7102.  See also 
  7103.  
  7104.   BrTransformToTransform
  7105.  
  7106.  7.1  Appendix A - DOSGfx - Overview 
  7107.  
  7108.  DOSGfx is a small set of screen handling functions intended for DOS based 
  7109.  BRender applications. The functions simplify initialisation of colour buffers, 
  7110.  palettes and video display hardware. 
  7111.  
  7112.  The BRENDER_DOS_GFX environment variable can be used to set the default 
  7113.  graphics mode and resolution. It has the following format: 
  7114.  
  7115.   VESA|MCGA,[W:<width>],[H:<height>],[B:<bits/pixel>],[M:<mode number>]
  7116.  
  7117.  If the environment variable specifies an unavailable mode or resolution, 
  7118.  DOSGfx will fail to initialise and return an error message. 
  7119.  
  7120.  7.1.2  Functions 
  7121.  
  7122.  7.1.2.1  DOSGfxBegin 
  7123.  
  7124.  Syntax 
  7125.  
  7126.   br_pixelmap * DOSGfxBegin(char *setup_string);
  7127.  
  7128.  Description 
  7129.  
  7130.  Create a pixelmap which represents the graphics hardware screen. 
  7131.  
  7132.  Subsequently, the BrPixelmapMatch function can be used to create a second 
  7133.  screen, and the BrPixelmapDoubleBuffer function can be used to swap between 
  7134.  them. 
  7135.  
  7136.  Arguments 
  7137.  
  7138.  *setup_string 
  7139.            An options string, given in the following format: 
  7140.  
  7141.   VESA|MCGA,[W:<width>],[H:<height>],[B:<bits/pixel>],[M:<mode number>]
  7142.  
  7143.  The default string 'MCGA,W:320,H:200,B:8' is used if NULL is passed and the 
  7144.  BRENDER_DOS_GFX environment variable has not been set. 
  7145.  
  7146.  If the environment variable has been set, any options given here that differ 
  7147.  will be used instead. 
  7148.  
  7149.  Return value 
  7150.  
  7151.  Returns a pointer to a pixelmap representing the graphics hardware screen. 
  7152.  
  7153.  7.1.2.2  DOSGfxEnd 
  7154.  
  7155.  Syntax 
  7156.  
  7157.   void DOSGfxEnd(void);
  7158.  
  7159.  Description 
  7160.  
  7161.  Close down DOSGfx. 
  7162.  
  7163.  7.1.2.3 DOSGfxPaletteSet 
  7164.  
  7165.  Syntax 
  7166.  
  7167.   void DOSGfxPaletteSet(br_pixelmap *pm);
  7168.  
  7169.  Description 
  7170.  
  7171.  Set the VGA/VESA hardware palette with the contents of a given pixelmap. 
  7172.  
  7173.  Arguments 
  7174.  
  7175.  pm 
  7176.            A pointer to a 1x256 BR_PMT_RGBX_888 pixelmap containing the 
  7177.            palette. 
  7178.  
  7179.  7.1.2.4  DOSGfxPaletteSetEntry 
  7180.  
  7181.  Syntax 
  7182.  
  7183.   void DOSGfxPaletteSetEntry(int I, br_colour colour);
  7184.  
  7185.  Description 
  7186.  
  7187.  Set a single colour in the VGA/VESA hardware palette. 
  7188.  
  7189.  Arguments 
  7190.  
  7191.  I 
  7192.            Colour number. 
  7193.  colour 
  7194.            New colour. 
  7195.  
  7196.  7.2  Appendix B - The GEOCONV tool 
  7197.  
  7198.  GEOCONV is a command-line tool which converts models from one geometry format 
  7199.  to another, allowing models generated with 3D modelling packages to be used 
  7200.  within BRender. 
  7201.  
  7202.  Usage:   geoconv {options} 
  7203.  
  7204.  The options are treated as commands executed in left-to-right order: 
  7205.  
  7206.  <input-file> 
  7207.            Load a file into current data 
  7208.  -I <input-type> 
  7209.            Set input file type 
  7210.  -o <file> 
  7211.            Generate output file from current data 
  7212.  -O <output-type> 
  7213.            Set type of data to generate 
  7214.  -n 
  7215.            Normalise models to radius of 1.0 
  7216.  -c 
  7217.            Centre models on 0,0,0 
  7218.  -f 
  7219.            Flip face normals 
  7220.  -w 
  7221.            Fix wrapped texture coordinates 
  7222.  -F <flag> 
  7223.            Set or clear a model flag 
  7224.  -p 
  7225.            Remove identical vertices 
  7226.  -P < float> 
  7227.            Merge vertices within a given tolerance 
  7228.  -C 
  7229.            Remove degenerate faces, unused vertices and duplicate faces 
  7230.  -m 
  7231.            Collapse current data to one actor and one model 
  7232.  -r <pattern> 
  7233.            Restrict subsequent operations to things matching <pattern> 
  7234.  -l 
  7235.            List current data 
  7236.  -g 
  7237.            Set each model to a different smoothing group 
  7238.  -S <sort-type> 
  7239.            Set sorting on output 
  7240.  -N <material-name> 
  7241.            Set all models to use named material 
  7242.  -M <map-type>,<axis>,<axis> 
  7243.            Apply a default U,V mapping to models 
  7244.  -s <float> 
  7245.            Uniform scale applied to models 
  7246.  -s <float>,<float>,<float> 
  7247.            Non-uniform scale applied to models 
  7248.  -t <float>,<float>,<float> 
  7249.            Translation applied to models 
  7250.  -a <axis>,<axis>,<axis> 
  7251.            Remap axes 
  7252.  -D <name> 
  7253.            Rename models 
  7254.  -L <name> 
  7255.            Rename materials 
  7256.  
  7257.  
  7258.  <input-type> = 
  7259.  
  7260.     dat 
  7261.            BRender model files 
  7262.     nff 
  7263.            Eric Haines' Neutral File Format 
  7264.     asc 
  7265.            3D Studio .ASC file 
  7266.  
  7267.  If a type is not specified, it will be guessed from the extension of the 
  7268.  filename. 
  7269.  
  7270.  <output-type> = 
  7271.  
  7272.  models 
  7273.            (.dat or .brm ) 
  7274.  c-models 
  7275.            Source code for model data structures 
  7276.  
  7277.   <axis> =
  7278.  
  7279.        x  y  z  positive input axes
  7280.       +x +y +z  positive input axes
  7281.       -x -y -z  negative input axes
  7282.  
  7283.   <map-type> =
  7284.  
  7285.       none
  7286.       disc
  7287.       plane
  7288.       cylinder
  7289.       sphere
  7290.  
  7291.   <material-name> =
  7292.  
  7293.       <string>
  7294.       default
  7295.  
  7296.   <sort-type> =
  7297.  
  7298.       none
  7299.       name
  7300.  
  7301.   <flag> =
  7302.       +d   Set   BR_MODF_DONT_WELD
  7303.       -d   Clear BR_MODF_DONT_WELD
  7304.       +o   Set   BR_MODF_KEEP_ORIGNAL
  7305.       -o   Clear BR_MODF_KEEP_ORIGNAL
  7306.       +t   Set   BR_MODF_GENERATE_TAGS
  7307.       -t   Clear BR_MODF_GENERATE_TAGS
  7308.       +q   Set   BR_MODF_QUICK_UPDATE
  7309.       -q   Clear BR_MODF_QUICK_UPDATE
  7310.  
  7311.  There are three related points worth noting: 
  7312.  
  7313.      3D Studio saves models with their longest axis down Z, and may need to be 
  7314.       re-oriented with the remap axis option (-a). 
  7315.  
  7316.      For the sake of consistency, it is advisable to pre-scale models as 
  7317.       necessary with this tool, rather than scale them within a BRender 
  7318.       application. 
  7319.  
  7320.      By default, if there are many models in a source file, they will be 
  7321.       separated into individual models (but saved as a single file). 
  7322.  
  7323.  7.3  Appendix C - The TEXCONV tool 
  7324.  
  7325.  This is a command-line tool which provides texture import, scaling, quantizing 
  7326.  and remapping functions. 
  7327.  
  7328.  Usage:   texconv {options} 
  7329.  
  7330.  Texconv options are treated as commands, performed in left-to-right order: 
  7331.  
  7332.  <input-file> 
  7333.            Load a file into current data 
  7334.  -I <input-type> 
  7335.            Set input file type 
  7336.  -O <output-type> 
  7337.            Set output file type 
  7338.  
  7339.  
  7340.  -a 
  7341.            Toggle current 32 bit pixelmaps to exclude/include alpha data 
  7342.            (default exclude) 
  7343.  -c <pixelmap-type>[,t] 
  7344.            Convert to pixelmap type, may involve quantizing.  't' is the alpha 
  7345.            channel threshold (0-255) for conversions involving 32 bit 
  7346.            pixelmaps. 
  7347.  -f 
  7348.            'Forget' all current data 
  7349.  -n <name> 
  7350.            Assign identifier 'name' to data 
  7351.  -o <file> 
  7352.            Generate output file from current data 
  7353.  -r <file>,<pixelmap-type>, offset,x,y[,P] 
  7354.            Load raw data file as pixelmap-type, with pixel dimensions x,y, from 
  7355.            offset into file. P is specified to load as a palette 
  7356.  -v 
  7357.            View snapshot of current data (only BR_PMT_INDEX_8) 
  7358.  -P <name>[,RAW] 
  7359.            Apply palette from a file to all current indexed pixelmaps. If RAW 
  7360.            is specified, the palette file is 768 byte RGB, otherwise pixelmap 
  7361.            format 
  7362.  -Q <name>[,b,r] 
  7363.            Quantize to palette supplied (pixelmap format) using (b)ase and 
  7364.            (r)ange palette entries 
  7365.  -R b,r 
  7366.            Quantize and remap to (b)ase,(r)ange colours (both values in the 
  7367.            range 0 to 255) 
  7368.  -S x,y[,<float>] 
  7369.            Scale to new x,y dimensions using optional filter size (default 3.0) 
  7370.  @file 
  7371.            Perform all operation contained within <file> 
  7372.  
  7373.  
  7374.  <input-type> = 
  7375.  
  7376.            pix 
  7377.                           BRender Pixelmap format 
  7378.            bmp 
  7379.                           Windows BMP format  (4, 8, 24, RLE4, RLE8) 
  7380.            gif 
  7381.                           CompuServ GIF format (1 to 8 bit) 
  7382.            tga 
  7383.                           Targa TGA format   (8, 15, 16, 24, 32 bit) 
  7384.            iff 
  7385.                           Amiga IFF/LBM format (1 to 8 bit) 
  7386.  
  7387.  If a type is not specified, it will be guessed from the extension of the 
  7388.  filename. 
  7389.  
  7390.   <output-type> =
  7391.  
  7392.  
  7393.            palette 
  7394.                           Palette information stripped from bitmap (.pix) 
  7395.            image 
  7396.                           Pixelmap without palette (.pix) 
  7397.            pixelmap 
  7398.                           Image with any palette information (.pix) 
  7399.  
  7400.  If a type is not specified, the default is pixelmap 
  7401.  
  7402.   <pixelmap-type> =
  7403.  
  7404.  
  7405.            BR_PMT_INDEX_8 
  7406.                           (8 bit indexed) 
  7407.            BR_PMT_RGB_555 
  7408.                           (RGB 16 bit 5 bits per colour) 
  7409.            BR_PMT_RGB_565 
  7410.                           (RGB 16 bit 5, 6, 5 bits per colour) 
  7411.            BR_PMT_RGB_888 
  7412.                           (RGB 24 bit 8 bits per pixel) 
  7413.            BR_PMT_RGBX_888 
  7414.                           (RGB 32 bit 8 bits per pixel) 
  7415.            BR_PMT_RGBA_8888 
  7416.                           (RGBA 32 bit 8 bits per component) 
  7417.  
  7418.  7.4  Appendix D - The MKSHADES tool 
  7419.  
  7420.  MKSHADES is a command-line tool which takes a source palette (usually a 1 by n 
  7421.  BR_PMT_RGBX_888 pixelmap generated by TEXCONV), and generates an indexed shade 
  7422.  table. The shade table is used when rendering into an 8 bit indexed pixelmap, 
  7423.  to perform shading across a lit textured material. Normally, the range of the 
  7424.  shade table corresponds to the current hardware palette and the indices in the 
  7425.  texture itself. 
  7426.  
  7427.  Usage:   mkshades (options) 
  7428.  
  7429.  <pallete> 
  7430.            Source BRender palette 
  7431.  -o <shade-table> 
  7432.            Output shade table pixelmap 
  7433.  [-d <dest-palette>] 
  7434.            Destination BRender palette if different from source 
  7435.  [-n <num_shades>] 
  7436.            Number of shades to generate (default 64) 
  7437.  [-r <base>,<size>] 
  7438.            Range of colours in output palette (default 0, 256) 
  7439.