home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Homebrewer's Handbook / vr.iso / avril / avrilapp.txt < prev    next >
Text File  |  1996-03-19  |  77KB  |  2,007 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.                        AVRIL Technical Reference -- Appendices
  11.                                      Version 2.0
  12.                                     March 28, 1995
  13.  
  14.                                      Bernie Roehl
  15.  
  16.  
  17.  
  18.           Note: These are the appendices for the technical reference
  19.           manual; the manual itself is kept in a separate file, as is the
  20.           Tutorial.
  21.  
  22.           Appendix A - REVISION HISTORY
  23.  
  24.           This is the second major release of AVRIL.  The changes made
  25.           since the first pre-release (0.9c) are listed below.
  26.  
  27.           Changes made in version 2.0:
  28.  
  29.           Added support for a number of new devices.
  30.  
  31.           The vrl_DevicePollAll() now returns non-zero if any of the
  32.           devices had new data.
  33.  
  34.           Added support for stereoscopic rendering.
  35.  
  36.           Added support for Gouraud shading, including the
  37.           vrl_RepComputeVertexNormals() function for computing vertex
  38.           normals as the average of polygon normals.
  39.  
  40.           Standardized the display (i.e. scan-converter) and video (frame
  41.           buffer) interfaces.
  42.  
  43.           Modified vrl_Palette type; it's no longer an array, it's now a
  44.           struct containing additional information about the palette
  45.           (specifically, the huemap).
  46.  
  47.           Provided vrl_malloc(), vrl_calloc() and vrl_free() functions as
  48.           "wrappers" around the system functions.
  49.  
  50.           Defined a "raster" type for bitmaps.
  51.  
  52.           The vrl_SurfaceInit() function no longer takes a hue parameter.
  53.  
  54.           The vrl_Surfacemap type is no longer just an array; it's a struct
  55.           containing additional information.  New functions have been added
  56.           for accessing that information.
  57.  
  58.           Surfaces are now kept in a list.
  59.  
  60.                              AVRIL Tech Ref -- Appendices                 1
  61.  
  62.  
  63.  
  64.  
  65.  
  66.           Surfacemaps are now kept in a list.
  67.  
  68.           Replaced vrl_ObjectGetX() and its sister functions with
  69.           vrl_ObjectGetWorldX() and vrl_ObjectGetRelativeX() and company;
  70.           the first returns absolute world coordinates, the second returns
  71.           coordinates relative to the object's parent.  Did the same for
  72.           vrl_ObjectGetLocation().
  73.  
  74.           Added a vrl_TransformVertexToScreen() function, to convert a
  75.           vertex from object space to screen space.
  76.  
  77.           All the file-loading functions now use the loadpath.
  78.  
  79.           Renamed some of the reading and loading functions; the "Read"
  80.           type functions now take a FILE *, the "Load" type functions now
  81.           take a filename.
  82.  
  83.           Fixed typo that caused the vrl_ShapeRescale() function to be
  84.           undefined.
  85.  
  86.           Modified joystick driver to not zero out buttons and nbuttons
  87.           when a buttonmap is being used.
  88.  
  89.           Changes made in version 1.1:
  90.  
  91.           Added support for the Polhemus Isotrak.
  92.  
  93.           Added the functions vrl_ObjectLookAt(), vrl_CameraLookAt() and
  94.           vrl_LightLookAt().
  95.  
  96.           Simplified the code in cfg.c; as several people pointed out, it
  97.           was a complicated solution to a simple problem.  Devices now have
  98.           "nicknames" by which they can be referenced by the application,
  99.           eliminating the need for the cfg.c code to keep track of that
  100.           information.  The configuration file is read after (not before)
  101.           vrl_SystemStartup() is called, and a "display" statement will
  102.           simply re-initialize the display to use the new driver and/or
  103.           mode.
  104.  
  105.           Fixed a bug in the horizon routine that had caused sky to be
  106.           displayed when looking straight down, and ground to be displayed
  107.           when looking straight up.
  108.  
  109.           Changes made in version 0.9c:
  110.  
  111.           Added support for multi-channel input devices.
  112.  
  113.           Added support for serial communications.
  114.  
  115.           Renamed all the types to begin with the "vrl_" prefix; the types
  116.           affected are Scalar, Factor, Angle, Vector and Matrix.  Also
  117.           changed UNITY to VRL_UNITY.  There are #defines at the end of
  118.  
  119.                              AVRIL Tech Ref -- Appendices                 2
  120.  
  121.  
  122.  
  123.  
  124.  
  125.           avril.h to ease the transition; they'll be removed for version
  126.           2.00.
  127.  
  128.           Added vrl_Boolean and vrl_Time types.
  129.  
  130.           Modified avril.h to #include <stdio.h> and #include <mem.h> (for
  131.           memcpy()).
  132.  
  133.           Added #defines for XROT, YROT and ZROT for indexing device
  134.           channels.
  135.  
  136.           Added various additional vector and matrix functions such as
  137.           vrl_VectorNegate() and vrl_VectorEqual().  Also added a new
  138.           global variable, the null vector vrl_VectorNULL.
  139.  
  140.           Added a "leftside" parameter to the vrl_MatrixRotX(),
  141.           vrl_MatrixRotY(), vrl_MatrixRotZ(), and vrl_MatrixRotVector()
  142.           functions.
  143.  
  144.           Removed the vrl_List structure and put names into the structs for
  145.           vrl_Lights, vrl_Cameras, and vrl_Objects.  Added functions for
  146.           accessing those names, and for finding entities based on their
  147.           name.  Also added routines for traversing and iterating over the
  148.           linked lists of vrl_Lights and vrl_Cameras.
  149.  
  150.           Added vrl_ObjectRotate() and vrl_ObjectTranslate() routines, and
  151.           modified several older movement and rotation functions to make
  152.           calls to those two.
  153.  
  154.           Made surface maps into a struct, rather than just an array of
  155.           vrl_Surface pointers.  This allows for additional information
  156.           about a surface map to be kept, and for the surface maps to be
  157.           kept in a linked list.
  158.  
  159.           Added the notions of a world having "bounds" and a "radius", and
  160.           routines for supporting those notions.
  161.  
  162.           The RVD drivers are now searched for along the PATH, as well as
  163.           in the current directory.
  164.  
  165.           Renamed all the vrl_New* functions to make their naming
  166.           consistent with everything else.  For example, vrl_NewObject() is
  167.           now vrl_ObjectCreate().  Again, #defines were added to the end of
  168.           avril.h to ease the transition; these will be removed as of the
  169.           2.00 release.
  170.  
  171.           Added a vrl_WorldUpdate() macro.
  172.  
  173.           Added application-specific data to vrl_Objects, vrl_Lights and
  174.           vrl_Cameras.
  175.  
  176.           Added functions to vrl_Objects, which get called during world updating.
  177.  
  178.                              AVRIL Tech Ref -- Appendices                 3
  179.  
  180.  
  181.  
  182.  
  183.  
  184.           Added ID numbers to facets.
  185.  
  186.           Renamed vrl_SetFigurePartArray() to vrl_SetReadFIGpartArray() to
  187.           be more consistent.
  188.  
  189.           Switched to using standard the DOS timer (at an accelerated rate,
  190.           and chaining to the old one periodically) because the RTC timer
  191.           interfered with Turbo Debugger.
  192.  
  193.           Standardized on a tick rate of 1000 per second.
  194.  
  195.           Eliminated the vrl_TimerAddHandler() routine, since there was too
  196.           much risk that handler routines would do things that ought not be
  197.           done inside an interrupt handler; a bug in Borland C 3.1 bug also
  198.           forced all routines called from within an interrupt to be
  199.           assembled without 386 instructions.
  200.  
  201.           Added a call to directly query the frames per second rate.
  202.  
  203.           Renamed the vrl_DrawCompass() and vrl_DropText() routines to
  204.           vrl_UserInterfaceDrawCompass() and vrl_UserInterfaceDropText() to
  205.           make it clear that they're a part of the user interface family of
  206.           functions.
  207.  
  208.           Modified the vrl_PrimitiveSphere() routine to accept separate
  209.           counts of the number of longitudinal and latitudinal sides.
  210.  
  211.           Add support for configuration files.
  212.  
  213.           Added the additional mouse routines vrl_MouseGetUsage(),
  214.           vrl_MouseSetUsage(), vrl_MouseSetPointer(), vrl_MouseGetPointer()
  215.           and vrl_MouseGetLimits().
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.                              AVRIL Tech Ref -- Appendices                 4
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.           Appendix B - CFG FILE FORMAT
  245.  
  246.           A CFG file is a platform-specific ascii file used to describe the
  247.           user's preferred configuration.  It contains a series of
  248.           statements, one per line; anything after a '#' character on any
  249.           given line is taken as a comment, and blank lines are ignored. 
  250.           At the moment, there are only a few statement types defined; this
  251.           is expected to change.
  252.  
  253.           COMPASS state
  254.                If state is "on", then the compass should be displayed on
  255.                the screen.
  256.  
  257.           FRAMERATE state
  258.                If state is "on", then the frame rate should be displayed on
  259.                the screen.
  260.  
  261.           POSITION state
  262.                If state is "on", then the current X,Z position should be
  263.                displayed on the screen.
  264.  
  265.           CURSOR state
  266.                If state is "on", then the cursor should be visible; this is
  267.                the default state.
  268.  
  269.           DEVICE name type mode address irq buffsize
  270.                Sets up a device driver, and assigns it a symbolic name that
  271.                can be referenced by the application.  The type field is the
  272.                name of a device type, like "Cyberman" or "Spaceball".  The
  273.                mode is passed to the device using vrl_DeviceSetMode(), and
  274.                the address, irq and buffsize fields are just passed to the
  275.                call to vrl_SerialOpen(); see the section on Serial Ports
  276.                for details.  All parameters except the name and type are
  277.                optional; devices that are not interfaced over a serial port
  278.                do not need the address, irq or buffsize parameters, and
  279.                devices all have a default mode.  The name can be anything
  280.                you like; however, it should be something that's referenced
  281.                by the application.  For example,
  282.  
  283.                     device headtracker Redbaron 0 0x2F8 3 2000 
  284.  
  285.                would set up the Logitech Red Baron ultrasonic tracking
  286.                device; the device would be hooked up to COM2 (address =
  287.                0x2F8, irq = 3) with a 2000 byte buffer.  The application
  288.                would simply look up the device called "headtracker" and use
  289.                the values it returns without having to worry about what
  290.                kind of device it actually is.
  291.  
  292.           DEVCONFIG name channel scale deadzone
  293.                Sets the scale and deadzone parameters for a particular
  294.                channel of a particular device.  The name must match the
  295.  
  296.                              AVRIL Tech Ref -- Appendices                 5
  297.  
  298.  
  299.  
  300.  
  301.  
  302.                name of a device already specified with a DEVICE statement. 
  303.                The channel can be either a number or one of the special
  304.                values X, Y, Z, XROT, YROT or ZROT.  The scale can be either
  305.                a number (in which case it's taken to be a scalar distance)
  306.                or a number with an 'a' or 'A' in front of it (in which case
  307.                it's taken to be an angle).  The deadzone value is a number,
  308.                specified in device coordinates.  The deadzone is optional,
  309.                and defaults to zero.
  310.  
  311.                For example,
  312.  
  313.                     devconfig headtracker 2 15
  314.  
  315.                would cause channel 2 (the Z channel) to have a scale factor
  316.                of 15 and a deadzone of zero, while
  317.  
  318.                     devconfig headtracker YROT a45 10
  319.  
  320.                would cause channel 4 (the Y rotation channel) to have an
  321.                angular scale factor of 45 degrees and a deadzone of 10
  322.                device units.
  323.  
  324.           DISPLAYDRIVER name
  325.                Specifies which display driver to use.  Currently the only
  326.                values are "ModeY" or "default".  See also the description
  327.                for VIDEODRIVER, and the technical reference manual.
  328.  
  329.           INCLUDE file
  330.                Includes the contents of the specified file as if they
  331.                appeared in the current file in place of the INCLUDE.
  332.  
  333.           LOADPATH path
  334.                Specifies the path from which all subsequent files should be
  335.                loaded.  The path is effectively prepended to any filename
  336.                that does not begin with a '/' or '\'.
  337.  
  338.           STEREOTYPE type
  339.                Specifies which type of stereoscopic viewing to use.  The
  340.                type can be any of the following: 
  341.                     NONE, SEQUENTIAL, ANAGLYPH_SEQUENTIAL,
  342.                     ANAGLYPH_WIRE_ALTERNATE, ENIGMA, FRESNEL,
  343.                     CYBERSCOPE, CRYSTALEYES, CHROMADEPTH, SIRDS,
  344.                     TWOCARDS, ANAGLYPH_SOLID_ALTERNATE
  345.                See Appendix I for descriptions of each of the types; note
  346.                that not all of them are implemented yet in version 2.0 of
  347.                AVRIL.
  348.  
  349.           STEREOPARAMS params
  350.                Sets parameters for the stereo viewing mode.  The params
  351.                will differ from one type of stereo viewing to another.  For
  352.                CHROMADEPTH, the parameters are the ChromaNear and ChromaFar
  353.                distances, in world units.  For all other currently
  354.  
  355.                              AVRIL Tech Ref -- Appendices                 6
  356.  
  357.  
  358.  
  359.  
  360.  
  361.                supported modes, the parameters are the eyespacing and
  362.                (optionally) the convergence distance, both as floating-
  363.                point numbers.  They must be in the same units (e.g. millimeters).
  364.  
  365.           STEREOLEFT shift [rotation]
  366.           STEREORIGHT shift [rotation]
  367.                Specifies the shift and (optionally) the rotation for the
  368.                left or right eye.  See the section on stereoscopic viewing
  369.                in the technical reference manual for details.
  370.  
  371.           VERSION nn
  372.                Indicates which version of this specification the
  373.                configuration conforms to.  This can be omitted; if present,
  374.                it should be set to 1.
  375.  
  376.           VIDEODRIVER name [mode]
  377.                Specifies the name of the low-level video driver to use;
  378.                currently the only values are "Mode13", "ModeY" and
  379.                "7thSense".  The mode indicates the graphics sub-mode to
  380.                use; it's passed directly to the driver function, in the
  381.                initialization call.  See also the description for
  382.                DISPLAYDRIVER, and the technical reference manual.
  383.  
  384.           Note the difference between the VIDEODRIVER and the
  385.           DISPLAYDRIVER.  The VIDEODRIVER deals with the hardware, the
  386.           DISPLAYDRIVER with the scan-conversion module; see the technical
  387.           reference manual for details.  You can, for example, have the
  388.           following:
  389.  
  390.                videodriver mode13
  391.                           displaydriver default
  392.  
  393.           in which case mode 0x13 will be used throughout, or
  394.  
  395.                videodriver modeY
  396.                           displaydriver modeY
  397.  
  398.           in which case mode Y will be used throughout.  Alternatively, you
  399.           can mix them:
  400.  
  401.                videodriver modeY
  402.                           displaydriver default
  403.  
  404.           in which case rendering will be done to an offscreen buffer, and
  405.           the completed screen image copied to the current draw page in
  406.           mode Y.
  407.  
  408.  
  409.  
  410.  
  411.  
  412.  
  413.  
  414.                              AVRIL Tech Ref -- Appendices                 7
  415.  
  416.  
  417.  
  418.  
  419.  
  420.  
  421.           Appendix C - PLG FILE FORMAT
  422.  
  423.           I originally designed PLG files for use with REND386; for better
  424.           or worse, they seem to have become something of a standard. 
  425.           REND386, AVRIL, VR386 and Jon Blossom's Gossamer all use them for
  426.           object geometry description; there are also translators that turn
  427.           other formats into PLG, and the NorthCAD-3D program can generate
  428.           PLG files as output.  The PLG in the name stands for "polygon".
  429.  
  430.                There will soon be a file format for the interchange of
  431.           virtual objects and virtual worlds between VR systems; at that
  432.           point, support for the PLG file format will diminish.  Conversion
  433.           programs will be made available to convert PLG files to the new
  434.           format.
  435.  
  436.                A PLG file basically has three parts: a header line, a list
  437.           of vertices and a list of facets.
  438.  
  439.                The header line has the object name, the number of vertices,
  440.           and the number of facets; for example:
  441.  
  442.                kitchen_table 100 35
  443.  
  444.           which would mean that the object "kitchen_table" has 100 vertices
  445.           and 35 facets.
  446.  
  447.                The number of facets can optinally be followed by two
  448.           numbers; the first is ignored, and should be set to zero (it's
  449.           for compatability with VR386), and the second is the sorting
  450.           type.  It should be set to zero if (and only if) you know the
  451.           object is convex (i.e. no part of the object can hide any other
  452.           part).  Anything after those two numbers should be ignored, since
  453.           it may be used for future expansion.
  454.  
  455.                Following this line are the vertices, one x,y,z triplet per
  456.           line (each value is a floating-point number, and they're
  457.           separated by spaces).  For example:
  458.  
  459.                18027 23025 98703
  460.  
  461.           Vertex normals may optionally be specified after the vertex
  462.           coordinates.  Anything after the vertex normals is ignored (for
  463.           future expansion).
  464.  
  465.                This is followed by the facet information, one line per
  466.           facet; each of these lines is of the form
  467.  
  468.                surfacedesc n v1 v2 v3 ...
  469.  
  470.           The surfacedesc is described below.  The n is the number of
  471.           vertices in the facet.  The v1, v2, v3 and so on are indices into
  472.  
  473.                              AVRIL Tech Ref -- Appendices                 8
  474.  
  475.  
  476.  
  477.  
  478.  
  479.           the array of vertices; the vertices are listed in a counter-
  480.           clockwise order as seen from the "front" (i.e. visible side) of
  481.           the facet.  Note that the vertices are counted "origin zero",
  482.           i.e. the first vertex is vertex number 0, not vertex number 1.
  483.  
  484.           For example:
  485.  
  486.                0x8002 4 8 27 5 12
  487.  
  488.                  would mean a four-sided facet bounded by vertices 8, 27, 5 and
  489.           12.  This facet has a surface descriptor of 0x8002.
  490.  
  491.                Anything after the list of vertex indices should be ignored.
  492.  
  493.                The PLG format supports comments.  Anything after a # should
  494.           be ignored by any program that parses PLG files.  In addition,
  495.           lines beginning with a '*' should be ignored.
  496.  
  497.                PLG files can have multiple copies of an object at different
  498.           resolutions.  PLG files containing such multiple-resolution
  499.           versions of objects must have "#MULTI" as their first line.
  500.  
  501.                For each object defined in such a file, the object name
  502.           includes a number specifying the pixel size of the object on the
  503.           screen.  The object names for each representation must be
  504.  
  505.                <name>_####
  506.  
  507.           where #### is the smallest pixel width to use this representation
  508.           for. For example, TABLE_15 would be a valid name.
  509.  
  510.                If the smallest rep size is zero, then that representation
  511.           will be used no matter how small the object gets.  If the
  512.           smallest rep size is 1 or greater, then the object will vanish if
  513.           it gets too small.
  514.  
  515.                The surface descriptor can either be a decimal integer or a
  516.           0x or 0X followed by a hexadecimal integer value.  The surface
  517.           descriptor is a 16-bit value which is interpreted as follows:
  518.  
  519.                H SSS CCCC BBBBBBBB
  520.  
  521.           If the H bit is set, it indicates that this is a "mapped" surface
  522.           descriptor; the bottom 14 bits are taken to be an index into a
  523.           surface map.
  524.  
  525.           If the H bit is clear, the SSS bits are interpreted as follows:
  526.  
  527.                000 --    This facet is "solid shaded"; i.e. it should be
  528.                          drawn in a fixed color, with no special effects.
  529.                          If the CCCC bits are zero, then the BBBBBBBB bits
  530.                          directly specify one of the 256 available colors;
  531.  
  532.                              AVRIL Tech Ref -- Appendices                 9
  533.  
  534.  
  535.  
  536.  
  537.  
  538.                          if the CCCC bits are non-zero, then they specify
  539.                          one of sixteen hues and the top four bits of
  540.                          BBBBBBBB specify which shade of that hue to use.
  541.  
  542.                001 --    This facet is "flat shaded"; i.e. it should be
  543.                          drawn with a constant shading that is determined
  544.                          by the angle at which light is striking it; thus,
  545.                          as the facet moves around, its apparent brightness
  546.                          will change.  The CCCC bits specify one of sixteen
  547.                          hues, and the bottom 8 bits BBBBBBBB represent the
  548.                          "brightness" of the color.  This brightness value
  549.                          is multiplied by the cosine of the angle between
  550.                          the facet's normal vector and the vector from the
  551.                          facet to the light source; the result is used to
  552.                          specify an offset into the given color's array of
  553.                          shades.  Note that if the CCCC value is 0, the
  554.                          color will always be black.
  555.  
  556.                010 --    This facet should be treated as being "metallic";
  557.                          the CCCC bits (which should be non-zero) specify
  558.                          one of the 16 hues, and the top 5 bits of the
  559.                          BBBBBBBB value are used as an offset into a range
  560.                          of shades to cycle through to give the metallic
  561.                          effect, i.e. a starting offset into the color
  562.                          cycle.
  563.  
  564.                011 --    This facet should be treated as being
  565.                          "transparent"; it is just like surface type 10,
  566.                          except that alternating rows of dots are used
  567.                          instead of solid colors, allowing you to "see
  568.                          through" the facet.
  569.  
  570.                100 --    This facet should be Gouraud shaded; the meaning
  571.                          of the other bits is the same as for flat shading.
  572.  
  573.           Other values of SSS are reserved and should not be used.
  574.  
  575.  
  576.  
  577.  
  578.  
  579.  
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.                              AVRIL Tech Ref -- Appendices                10
  592.  
  593.  
  594.  
  595.  
  596.  
  597.  
  598.           Appendix D - FIG FILE FORMAT
  599.  
  600.           FIG files are a way of representing multi-segmented, hierarchical
  601.           entities.
  602.  
  603.                     This format will soon be considered obsolete.
  604.  
  605.                There will soon be a file format for the interchange of
  606.           virtual objects and virtual worlds between VR systems; at that
  607.           point, support for the FIG file format will diminish.  Conversion
  608.           programs will be made available to convert FIG files to the new
  609.           format.
  610.  
  611.                The syntax of a figure file is simple, and very C-like.  It
  612.           consists of a series of segments, each of which can possess a set
  613.           of attributes, as well as child segments.  Each segment is
  614.           bounded by braces.  Attributes are arbitrary text strings ending
  615.           in a semicolon.
  616.  
  617.                The list of possible attributes is open-ended and
  618.           extensible; programs that read figure files should ignore any
  619.           attributes they don't recognize.
  620.  
  621.           An example will make all this clearer.
  622.  
  623.                {
  624.                           comment = a human body;
  625.                           name = pelvis;  comment = this is the name of the root segment;
  626.                                   {
  627.                                   name = chest;
  628.                                            { name = left upper arm; { name = left lower arm; } }
  629.                                            { name = right upper arm; { name = right lower arm; } }
  630.                                            { name = head; }
  631.                                   }
  632.                                   { name = left upper leg; { name = right lower leg; } }
  633.                                   { name = right upper leg; { name = right lower leg; } }
  634.                                   }
  635.                           }
  636.  
  637.                  In general, attributes are of the form "keyword = value;", though
  638.           this is not a requirement.  The attributes used above are name
  639.           and comment.  Note that no program ever has to recognize a
  640.           comment attribute, since by definition comments should be
  641.           ignored.
  642.  
  643.           The attributes currently defined are as follows:
  644.  
  645.                name = somestring;
  646.                           pos = x,y,z;
  647.                           rot = x,y,z;
  648.                           plgfile = filename scale x,y,z shift X,Y,Z sort type map filename;
  649.  
  650.                                                  AVRIL Tech Ref -- Appendices                11
  651.  
  652.  
  653.  
  654.  
  655.  
  656.                           segnum = someinteger;
  657.  
  658.           The pos is the x,y,z displacement of the origin of this segment
  659.           relative to the parent's coordinate system.  The rot is the
  660.           rotation of this segment relative to the parent.  For root
  661.           objects (which have no parent) these values are the absolute
  662.           location and rotation of the entire figure in world coordinates.
  663.  
  664.                The plgfile gives the name of a .plg file containing a
  665.           geometric representation of the segment.  Note that the figure
  666.           file format does not strictly depend on .plg files; the reason
  667.           the syntax is "plgfile = " rather than just "file =" is because a
  668.           segment may have a large number of different representations and
  669.           an application can choose whichever one it likes.
  670.  
  671.                The scale, shift, sort and map values are all optional, but
  672.           in order to specify any of them you must specify all the
  673.           preceding ones (i.e. you cannot simply omit the scale parameter). 
  674.           The scale values represent the amount by which the object should
  675.           be scaled along each of its axes when it's loaded.  The shift
  676.           value is the amount by which to shift the object's origin at load
  677.           time.  The sort value is the type of depth-sorting to use for
  678.           this segment's representation (the default is zero).  The map
  679.           value is the name of a file containing a list of unsigned values
  680.           that are to be used in surface remapping for this segment.  If
  681.           the top bit of a color value is set in a plg file, the bottom
  682.           fourteen bits are used as an index into this map.
  683.  
  684.                The difference between shift and pos is important.  The
  685.           shift value is used to shift an object relative to its "native"
  686.           origin, while the pos value is the amount by which the new origin
  687.           should be displaced from the parent node's origin.
  688.  
  689.                For example, suppose you want to represent the head of a
  690.           human figure with a cube.  The cube may, in the .plg file, be
  691.           defined with its (0,0,0) point at one corner.  Clearly, this
  692.           origin is inconvenient for the head, since if the origin is
  693.           centered over the neck of the figure then the head will be
  694.           displaced to one side.
  695.  
  696.                Alternatively, the cube might be defined with its (0,0,0)
  697.           point at its geometric center.  However, this is also
  698.           impractical; your head should not rotate freely about its center. 
  699.           If it does, stop reading this document immediately and seek
  700.           medical attention.
  701.  
  702.                What you do is shift the cube so that its origin lies below
  703.           the center of the cube, where your "neck joint" is.  That's what
  704.           the shift value in the plgfile attribute specifies.
  705.  
  706.           Important note: objects rotate about their [0,0,0] point as
  707.           loaded.
  708.  
  709.                              AVRIL Tech Ref -- Appendices                12
  710.  
  711.  
  712.  
  713.  
  714.  
  715.                The pos attribute specifies where this neck joint is in
  716.           relation to the origin of the chest segment.  If your chest were
  717.           longer vertically, then the pos attribute of the head segment
  718.           should be increased in the Y direction (for example).
  719.  
  720.                The segnum attribute associates a simple integer value with
  721.           a segment, which can subsequently be used to refer to the segment
  722.           when manipulating it.
  723.  
  724.                Note that a figure file can in fact contain a series of
  725.           segments; each of these is a root segment, so a figure file can
  726.           in effect store a complete scene description (excluding lights
  727.           and cameras).
  728.  
  729.  
  730.  
  731.  
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.  
  740.  
  741.  
  742.  
  743.  
  744.  
  745.  
  746.  
  747.  
  748.  
  749.  
  750.  
  751.  
  752.  
  753.  
  754.  
  755.  
  756.  
  757.  
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.                              AVRIL Tech Ref -- Appendices                13
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.           Appendix E - WLD FILE FORMAT
  776.  
  777.           WLD files were designed to store information about the layout of
  778.           objects in a virtual world.
  779.  
  780.                     This format will soon be considered obsolete.
  781.  
  782.           There will soon be a file format for the interchange of virtual
  783.           objects and virtual worlds between VR systems; at that point,
  784.           support for the WLD file format will diminish.  Conversion
  785.           programs will be made available to convert WLD files to the new
  786.           format.
  787.  
  788.           A WLD file is entirely ascii.  Each statement is one line;
  789.           anything after the first '#' is treated as a comment and ignored. 
  790.           Blank lines are also ignored.  The format is intended to be
  791.           highly extensible; any line which cannot be recognized should
  792.           simply be ignored.  Each statement contains some information
  793.           about the scene; the possible types of statements are listed
  794.           below.  Everything is case-insensitive; keywords are shown below
  795.           in uppercase, but are generally entered in lowercase.
  796.  
  797.           LOADPATH path
  798.                Specifies a path prefix for loading files.  Any files
  799.                (whether specified in the world file itself, subsequent
  800.                world files, or in referenced FIG files) will be loaded from
  801.                the specified directory.  However, if a filename begins with
  802.                the '\' or '/' characters, it is used verbatim (i.e. the
  803.                LOADPATH setting is ignored).
  804.  
  805.           PALETTE filename
  806.                Loads a 256-entry binary palette file (3 bytes (R,G,B) for
  807.                each entry).  Note that alternate palettes may not handle
  808.                shading as well as the default one does.  If there are more
  809.                that 768 bytes (256 times 3) in the file, the remaining
  810.                values are interpreted as a hue map; pairs of bytes are
  811.                starting indices (origin 0) and number of shades.
  812.  
  813.           SKYCOLOR index
  814.                Specifies which of the 256 available colors should be used
  815.                for the "sky".
  816.  
  817.           GROUNDCOLOR index
  818.                Specifies which of the 256 available colors should be used
  819.                for the "ground". If the sky and ground color are identical,
  820.                a solid screen clear is used; this is a bit faster.
  821.  
  822.           SCREENCLEAR value
  823.                If the specified value is non-zero, then the screen will be
  824.                cleared before each frame; if it's zero, the screen clearing
  825.                is not done (this is useful if you know that the entire
  826.  
  827.                              AVRIL Tech Ref -- Appendices                14
  828.  
  829.  
  830.  
  831.  
  832.  
  833.                window will be covered by the image, and that no background
  834.                will show through; in such a situation, specifying this
  835.                option will improve performance).
  836.  
  837.           AMBIENT value
  838.                Specifies the level of the ambient light; 76 is the default,
  839.                and a good value to use.
  840.  
  841.           LIGHT x,y,z
  842.                Specifies the location of a light source in world
  843.                coordinates.
  844.  
  845.           CAMERA x,y,z tilt,pan,roll zoom
  846.                Specifies your starting location, viewing direction and zoom
  847.                factor.  The x,y,z values are floating-point numbers giving
  848.                coordinates, the tilt,pan,roll values are floating-point
  849.                angles, and the zoom is a floating-point number giving the
  850.                zoom factor.  Remember that the order of rotations is pan,
  851.                tilt, roll.
  852.  
  853.           HITHER value
  854.                Specifies the near clipping distance in world coordinates. 
  855.                The value should typically be 10 or more.
  856.  
  857.           YON value
  858.                Specifies the far clipping distance in world coordinates. 
  859.                The value should typically be 1000000 or more.
  860.  
  861.           OBJECT [objname=]filename sx,sy,sz rx,ry,rz tx,ty,tz depthtype
  862.           mappings parent
  863.                Loads an object from a .plg file with the given filename. 
  864.                If the objname= is present, it assigns the newly-loaded
  865.                object that name for future reference.  The sx,sy,sz values
  866.                are floating-point scale factors to increase or decrease the
  867.                size of the object as it's loaded.  The rx,ry,rz values are
  868.                the angles to rotate the object around in each of the three
  869.                axes; ry is done first, then rx and finally rz.  The
  870.                tx,ty,tz values translate (move) the object to a new
  871.                location; this is done after the scaling and rotation.  The
  872.                depthtype field is not currently used.  The mappings feature
  873.                is explained below.  The parent field is the name of the
  874.                object that this object is attached to; if omitted, the
  875.                child moves independently.  If parent is the word "fixed",
  876.                then the object is fixed in space and cannot be moved.  All
  877.                fields are optional, but you must include all the fields
  878.                prior to the last one you wish to use (i.e. you can only
  879.                leave things off the end, not off the beginning or out of
  880.                the middle).
  881.  
  882.           FIGURE [figname=]filename sx,sy,sz rx,ry,rz tx,ty,tz parent
  883.  
  884.  
  885.  
  886.                              AVRIL Tech Ref -- Appendices                15
  887.  
  888.  
  889.  
  890.  
  891.  
  892.                Loads a segmented figure from a FIG file with the given
  893.                filename.  All the parameters have the same meaning as for
  894.                the OBJECT statement described above.
  895.  
  896.           POLYOBJ npts surface x1,y1,z1 x2,y2,z2 [...] x8,y8,z8
  897.                Directly specifies a facet to be placed in the scene.  The
  898.                value npts is the number of points (maximum 8), the surface
  899.                is a surface name (see below on surfaces) and the vertices
  900.                are given in world coordinates.
  901.  
  902.           POLYOBJ2 npts surface1,surface2 x1,y1,z1 x2,y2,z2 [...] x8,y8,z8
  903.                Directly specifies a double-sided facet to be placed in the
  904.                scene.  The value npts is the number of points (maximum 8),
  905.                surface1 and surface2 are surface names (see below on
  906.                surfaces) and the vertices are given in world coordinates.
  907.  
  908.           INCLUDE filename
  909.                Includes the specified file as if its contents appeared at
  910.                the current point in the current file.
  911.  
  912.           POSITION objname x,y,z
  913.                Moves (i.e. translates) the specified object to the given
  914.                x,y,z location.
  915.  
  916.           ROTATE objname rx,ry,rz
  917.                Rotates the specified object to the given angles about each
  918.                of the axes.  The angles are specified in floating point,
  919.                and are measured in degrees.  The rotation order is Y then X
  920.                then Z.
  921.  
  922.           VERSION number
  923.                Allows you to define a version number.  Not currently used
  924.                for anything; can be omitted.
  925.  
  926.           TITLE text
  927.                Allows you to define a title for your world.
  928.  
  929.           About Mapping
  930.  
  931.           A PLG file can contain indexed color values (such as 0x8002)
  932.           which are used to index a surface map.  Entries in surface maps
  933.           refer to surfaces.  Surfaces are created using the SURFACEDEF
  934.           statement, surface maps are created with the SURFACEMAP
  935.           statement, and entries are placed in them with the SURFACE
  936.           statement.  The statement formats are as follows:
  937.  
  938.           SURFACEDEF name value
  939.                Defines a new surface; maps a surface name (such as "wood")
  940.                to a numeric surface descriptor (value) of the type
  941.                described in Appendix C.
  942.  
  943.           SURFACEMAP name maxentries
  944.  
  945.                              AVRIL Tech Ref -- Appendices                16
  946.  
  947.  
  948.  
  949.  
  950.  
  951.                Marks the start of a new surface map.  All subsequent
  952.                SURFACE entries will be placed in this map.  The maxentries
  953.                field gives the maximum number of entries this surface map
  954.                will have; if omitted, it defaults to 10.
  955.  
  956.           SURFACE index name
  957.                Defines an entry in the current surface map, which takes an
  958.                index value (the bottom 14 bits of the value in the .plg
  959.                file) and maps it into a surface name (which is in turn
  960.                mapped to a 16-bit color value).
  961.  
  962.           USEMAP mapname
  963.                Causes all subsequently loaded objects that don't have a
  964.                mapname on their OBJECT statements to use the specified
  965.                mapname.
  966.  
  967.  
  968.  
  969.  
  970.  
  971.  
  972.  
  973.  
  974.  
  975.  
  976.  
  977.  
  978.  
  979.  
  980.  
  981.  
  982.  
  983.  
  984.  
  985.  
  986.  
  987.  
  988.  
  989.  
  990.  
  991.  
  992.  
  993.  
  994.  
  995.  
  996.  
  997.  
  998.  
  999.  
  1000.  
  1001.  
  1002.  
  1003.  
  1004.                              AVRIL Tech Ref -- Appendices                17
  1005.  
  1006.  
  1007.  
  1008.  
  1009.  
  1010.  
  1011.           Appendix F - WRITING DEVICE DRIVERS
  1012.  
  1013.           Writing device drivers for AVRIL is easy.  You basically create a
  1014.           single function with a unique name; for example, if you want to
  1015.           support a (mythical) RealTronics Atomic Tracking System, your
  1016.           function might be
  1017.  
  1018.                int vrl_ATSDevice(vrl_DeviceCommand cmd, vrl_Device *device)
  1019.                                   {
  1020.                                   [...]
  1021.                                   }
  1022.  
  1023.           You should add an entry for your new function to the list in
  1024.           avrildrv.h, and possibly to the cfg.c file.
  1025.  
  1026.                Your driver routine will get called periodically by the
  1027.           application.  The vrl_Device struct is pre-allocated by AVRIL, so
  1028.           you just have to fill in the various fields.  The cmd is one of
  1029.           VRL_DEVICE_INIT, VRL_DEVICE_RESET, VRL_DEVICE_SET_RANGE,
  1030.           VRL_DEVICE_POLL, or VRL_DEVICE_QUIT.
  1031.  
  1032.                When a device is first opened, AVRIL will set all the fields
  1033.           in the vrl_Device struct to reasonable values.  The
  1034.           VRL_DEVICE_INIT call should fill in the following fields with
  1035.           driver-specific information:
  1036.  
  1037.                char *desc;                 /* user-readable device description */
  1038.                           int nchannels;              /* number of input channels the device has */
  1039.                           vrl_DeviceChannel *channels;   /* pointer to array of channels */
  1040.  
  1041.           The desc is a string describing the device, the nchannels value
  1042.           is the number of input channels the device has (should be at
  1043.           least 6) and the channels field is set to point to an array of
  1044.           vrl_DeviceChannel structs, one per channel.  These channels
  1045.           should be dynamically allocated, rather than using a static
  1046.           struct; this is to allow for multiple instances of the same type
  1047.           of device (for example, a Cyberman on each of COM1 and COM2, each
  1048.           with its own channel-specific data).  For this same reason, your
  1049.           driver shouldn't use any global variables; you should instead
  1050.           dynamically allocate memory for any additional per-device-
  1051.           instance data and store the pointer to that data in the localdata
  1052.           field of the vrl_Device struct.  The VRL_DEVICE_INIT call should
  1053.           also fill in the appropriate values for all the channels.
  1054.  
  1055.           The VRL_DEVICE_INIT call may also choose to fill in some or all
  1056.           of the following:
  1057.  
  1058.                int nbuttons;               /* number of buttons the device has */
  1059.                           int noutput_channels;       /* number of output channels */
  1060.                           vrl_DeviceOutputFunction *outfunc;  /* function to call to generate output */
  1061.                           vrl_DeviceMotionMode rotation_mode;     /* rotation mode for this device */
  1062.  
  1063.                                                  AVRIL Tech Ref -- Appendices                18
  1064.  
  1065.  
  1066.  
  1067.  
  1068.  
  1069.                           vrl_DeviceMotionMode translation_mode;  /* translation mode for this device */
  1070.                           vrl_Buttonmap *buttonmap;   /* button mapping table for 2D devices */
  1071.                           int version;                /* device struct version number */
  1072.                           int mode;                   /* mode of operation */
  1073.                           vrl_Time period;            /* milliseconds between reads */
  1074.  
  1075.           The number of buttons the device has is assumed to be zero unless
  1076.           you set it otherwise, as is the number of output channels.  The
  1077.           outfunc field is a pointer to a function (probably declared
  1078.           static in the same source file as your driver function) that
  1079.           handles output to the device; this is described in more detail
  1080.           below.  If your device doesn't do output, leave this field at its
  1081.           default value of NULL.
  1082.  
  1083.                The meaning of the two vrl_DeviceMotionMode type fields is
  1084.           described in the main part of the technical reference manual, in
  1085.           the section on Devices.  They both default to
  1086.           VRL_MOTION_RELATIVE.  The mode is driver-specific, and can be
  1087.           initialized to whatever value you like (since the value is only
  1088.           interpreted by your driver).  The version field should be left at
  1089.           its default value of zero by drivers following this version of
  1090.           the driver specification; as the driver specification evolves,
  1091.           this value will increase.
  1092.  
  1093.                The period defaults to zero, meaning that a call to
  1094.           vrl_DevicePoll() will always result in your driver function being
  1095.           called with a cmd of VRL_DEVICE_POLL.  If you don't want to be
  1096.           polled every cycle, set the period to the minimum number of ticks
  1097.           (usually milliseconds) that should elapse between polls.  Note
  1098.           that this is a minimum value; the delay between polls may be even
  1099.           longer if the system is busy doing other things.
  1100.  
  1101.                The VRL_DEVICE_RESET command is very similar to
  1102.           VRL_DEVICE_INIT, and may in fact be the same for some devices. 
  1103.           The difference is that VRL_DEVICE_INIT does one-time
  1104.           initializations (such as taking over interrupt vectors).
  1105.  
  1106.                On receiving the VRL_DEVICE_RESET command, the driver should
  1107.           note the current values of each channel and make them the
  1108.           centerpoint for that channel.  On receiving a
  1109.           VRL_DEVICE_SET_RANGE command, it should make the current values
  1110.           the range for that channel.  See the notes below about
  1111.           centerpoint and range.
  1112.  
  1113.                The VRL_DEVICE_QUIT command should "shut down" the device,
  1114.           putting it in a quiescent state and undoing anything that was
  1115.           done in VRL_DEVICE_INIT and VRL_DEVICE_RESET (for example,
  1116.           restoring interrupt vectors).  It's also responsible for
  1117.           releasing any memory that was dynamically allocated by
  1118.           VRL_DEVICE_INIT, including that pointed to by the channels field
  1119.           and the localdata field if it was used.
  1120.  
  1121.  
  1122.                              AVRIL Tech Ref -- Appendices                19
  1123.  
  1124.  
  1125.  
  1126.  
  1127.  
  1128.                Serial devices can assume that when VRL_DEVICE_INIT is
  1129.           called, the port they'll be using is already open, and that the
  1130.           port field is set; the driver also does not need to (and should
  1131.           not) close the port.  However, devices that actually use the port
  1132.           should check that it's not NULL, and return -4 if it is.
  1133.  
  1134.                The VRL_DEVICE_POLL command should read the raw data from
  1135.           the hardware (for example, by calling vrl_DeviceGetPacket()) and
  1136.           decode the values into the rawdata fields of the appropriate
  1137.           channels.  You should be sure to set the changed field for any
  1138.           channels that you update.
  1139.  
  1140.           There are a number of values associated with each channel; they
  1141.           are as follows:
  1142.  
  1143.           struct _vrl_device_channel
  1144.                           {
  1145.                           vrl_32bit centerpoint;        /* value of center point in raw device coords */
  1146.                           vrl_32bit deadzone;           /* minimum acceptable value in device coords */
  1147.                           vrl_32bit range;              /* maximum absolute value relative to zero */
  1148.                           vrl_Scalar scale;             /* maximum returned value */
  1149.                           vrl_Boolean accumulate : 1;   /* if set, accumulate values */
  1150.                           vrl_Boolean changed : 1;      /* set if rawvalue has changed */
  1151.                           vrl_32bit rawvalue;           /* current value in raw device coordinates */
  1152.                           vrl_32bit oldvalue;           /* previous value in raw device coordinates */
  1153.                           vrl_Scalar value;             /* current value (processed) */
  1154.                           };
  1155.  
  1156.           The only fields you must set are centerpoint, deadzone, range,
  1157.           scale and accumulate.  The centerpoint is the current "zero"
  1158.           value of the device; for example, the value an analog joystick on
  1159.           a PC-compatible reports when the stick is at rest can be
  1160.           considered its centerpoint.
  1161.  
  1162.                The deadzone has two different interpretations.  If the
  1163.           accumulate flag is set, then the deadzone is the minimum
  1164.           displacement from the centerpoint that will be recognized.  If
  1165.           the accumulate flag is clear, then the value is the minimum
  1166.           change from the previous value (as stored in oldvalue by the
  1167.           higher-level routines) that will be recognized.
  1168.  
  1169.                The scale and range values are used to convert the rawvalue
  1170.           into units more suitable for the application.  The scale is the
  1171.           number of world-space units corresponding to the range in device
  1172.           units.  The scale and deadzone should both be positive values,
  1173.           and can be changed by the application.  The range value can be
  1174.           negative; this is useful for reversing the direction of a device
  1175.           axis.  The range value is only ever set by your driver.
  1176.  
  1177.                The accumulate flag, in addition to controlling how the
  1178.           deadzone is interpreted, causes the value to be scaled by the
  1179.           elapsed time in seconds since the last poll.
  1180.  
  1181.                              AVRIL Tech Ref -- Appendices                20
  1182.  
  1183.  
  1184.  
  1185.  
  1186.  
  1187.                The best way to understand all this is to consider what
  1188.           happens when you read new values from the device in response to a
  1189.           VRL_DEVICE_POLL command.  First, you store the data for each
  1190.           channel in the corresponding channel's rawvalue field.  You can
  1191.           re-map axes at this point (device coordinate Y goes into the Z
  1192.           channel, for example); you may want to use the buttonmap (see
  1193.           below) for this purpose.  You should set the changed flag, to
  1194.           indicate there's a new value there.
  1195.  
  1196.                Next, the higher-level code takes your rawvalue and
  1197.           subtracts the centerpoint.  If the channel is in accumulate mode,
  1198.           it checks if the absolute value of the data is less than
  1199.           deadzone; if it is, it truncates it to zero.  If the channel is
  1200.           not in accumulate mode, the data is compared to the oldvalue
  1201.           field; if it's within plus or minus deadzone of it, the data is
  1202.           ignored.
  1203.  
  1204.                Once the value has been centered and deadzoned, it is
  1205.           multiplied by the scale and divided by the range.  If accumulate
  1206.           is set, the resulting value is multiplied by the elapsed time in
  1207.           milliseconds and then divided by 1000 to convert to seconds.
  1208.  
  1209.           Buttonmaps
  1210.  
  1211.                Some 2D devices (such as mice and joysticks) can be used as
  1212.           6D devices, by using their buttons to map their input axes to the
  1213.           6 possible degrees of freedom.  Such devices should set their
  1214.           nbuttons field to zero (or at least to the number of buttons that
  1215.           will not be used for mapping).  They should also set their
  1216.           buttonmap field to point to a default set of axis mappings.
  1217.  
  1218.                The buttonmap field is a pointer to a two-dimensional array. 
  1219.           Each row of the array corresponds to a button combination; on a
  1220.           two-button device, row 0 is for no buttons down, row 1 is for the
  1221.           first button down, row 2 is for the second button down and row
  1222.           three is for both buttons down.  There are two columns in the
  1223.           array, the first of which contains the index of the channel that
  1224.           the input device's X value should be stored in, and the second of
  1225.           which contains the index of the Y channel.
  1226.  
  1227.           For example,
  1228.  
  1229.                static vrl_Buttonmap default_map =
  1230.                                   { { YROT, Z }, { X, Y }, { ZROT, XROT }, { X, Y }};
  1231.  
  1232.           Would mean that when no buttons are down, the device's X axis
  1233.           corresponds to a Y rotation, and its Y channel to a Z
  1234.           translation.  When the first button is down, the device's X axis
  1235.           corresponds to an X translation, and its Y axis to a Y
  1236.           translation, and so on.
  1237.  
  1238.  
  1239.  
  1240.                              AVRIL Tech Ref -- Appendices                21
  1241.  
  1242.  
  1243.  
  1244.  
  1245.  
  1246.                The application can change the buttonmap field (using
  1247.           vrl_DeviceSetButtonmap()) to point to a different set of
  1248.           mappings.
  1249.  
  1250.                One thing to watch out for: since only two channels at a
  1251.           time are active, the others should have their rawvalue set equal
  1252.           to their centerpoint, and their changed flags set; otherwise,
  1253.           they'll retain whatever values they had the last time a
  1254.           particular button combination was active.
  1255.  
  1256.           Output
  1257.  
  1258.                Some devices are capable of tactile or auditory feedback;
  1259.           those that are should set the outfunc field in the vrl_Device
  1260.           struct to point to a function that does the actual work, and set
  1261.           the noutput_channels field to the number of output channels the
  1262.           device has.  Such a function for our mythical ATS device might
  1263.           look like this:
  1264.  
  1265.                int vrl_ATSOutput(vrl_Device *dev, int parm1, vrl_Scalar parm2)
  1266.                                   {
  1267.                                   [...]
  1268.                                   }
  1269.  
  1270.                  The parm1 parameter is the output channel number, and parm2 is
  1271.           the value to output (in the range 0 to 255).  The routine should
  1272.           return 0 on success and non-zero on failure, although those
  1273.           values are not currently used or reported.
  1274.  
  1275.  
  1276.  
  1277.  
  1278.  
  1279.  
  1280.  
  1281.  
  1282.  
  1283.  
  1284.  
  1285.  
  1286.  
  1287.  
  1288.  
  1289.  
  1290.  
  1291.  
  1292.  
  1293.  
  1294.  
  1295.  
  1296.  
  1297.  
  1298.  
  1299.                              AVRIL Tech Ref -- Appendices                22
  1300.  
  1301.  
  1302.  
  1303.  
  1304.  
  1305.  
  1306.           Appendix G - WRITING VIDEO DRIVERS
  1307.  
  1308.           The low-level interface to the video hardware is handled by video
  1309.           drivers.  Each video driver is simply a function of the form
  1310.  
  1311.           vrl_32bit vrl_VideoDriverFunction(vrl_VideoCommand cmd, vrl_32bit lparm, void *pparm1);
  1312.  
  1313.           The lparm is a 32 bit value, the pparm is a pointer to somewhere
  1314.           in system memory, and the return value of the function is a 32-
  1315.           bit value.
  1316.  
  1317.           You can implement your own video driver by writing a function of
  1318.           the form above (giving it a unique name) and setting it as the
  1319.           driver function using
  1320.  
  1321.                           vrl_VideoSetDriver(YourDriver);
  1322.  
  1323.           The application (and AVRIL itself) will call your function,
  1324.           passing it a cmd to tell it what to do.  Any commands you don't
  1325.           want to deal with, you can ignore; however, be sure to return
  1326.           zero as the value of the function.  For example, if you only have
  1327.           one physical page in your display adapter, you could ignore the
  1328.           VRL_VIDEO_SET_DRAW_PAGE and VRL_VIDEO_SET_VIEW_PAGE calls.
  1329.  
  1330.           The values for cmd, and the behaviour your function should
  1331.           exhibit for each, are as follows:
  1332.  
  1333.           VRL_VIDEO_GET_VERSION
  1334.                Return the version number; for this specification, return 1.
  1335.  
  1336.           VRL_VIDEO_GET_DESCRIPTION
  1337.                The pparm parameter points to a buffer in system memory;
  1338.                fill that buffer with anything you like (preferably,
  1339.                something that describes your driver).  The lparm parameter
  1340.                gives the size of the buffer; don't write past the end.
  1341.  
  1342.           VRL_VIDEO_SETUP
  1343.                Enter graphics mode; the lparm parameter indicates which
  1344.                submode to use.  Return zero, unless for some reason you
  1345.                can't enter graphics mode (in which case, return a non-zero
  1346.                value).  You should, if possible, save the current mode
  1347.                before entering graphics mode.  You should also set the
  1348.                internal cursor flag to -1, and position the cursor at the
  1349.                center of the screen.
  1350.  
  1351.           VRL_VIDEO_SHUTDOWN
  1352.                Exit graphics mode, and if possible, return to the mode that
  1353.                was in effect before the last call to VRL_VIDEO_SETUP.
  1354.  
  1355.           VRL_VIDEO_GET_MODE
  1356.                Return the current graphics mode (zero is an acceptable value).
  1357.  
  1358.                              AVRIL Tech Ref -- Appendices                23
  1359.  
  1360.  
  1361.  
  1362.  
  1363.  
  1364.           VRL_VIDEO_SET_DRAW_PAGE
  1365.                Set the current drawing page to the value of lparm.
  1366.  
  1367.           VRL_VIDEO_SET_VIEW_PAGE
  1368.                Set the currently visible page to the value of lparm.
  1369.  
  1370.           VRL_VIDEO_GET_NPAGES
  1371.                Return the number of pages.  If you only have one page,
  1372.                return 1.
  1373.  
  1374.           VRL_VIDEO_HAS_PALETTE
  1375.                Return non-zero if your hardware uses a palette, or zero if
  1376.                it doesn't (i.e., 15, 16 or 24 bit color).
  1377.  
  1378.           VRL_VIDEO_SET_PALETTE
  1379.                The top 16 bits of lparm are the starting index, the bottom
  1380.                16 bits are the ending index, and pparm points to the entire
  1381.                256-entry palette.  Values from the starting index through
  1382.                the ending index (inclusive) should be copied from the
  1383.                palette in system memory to the physical palette.  The
  1384.                starting and ending indexes are "origin zero", i.e. the
  1385.                first entry in the palette is zero, not one.
  1386.  
  1387.           VRL_VIDEO_CHECK_RETRACE
  1388.                Return non-zero if a vertical retrace is taking place.
  1389.  
  1390.           VRL_VIDEO_GET_RASTER
  1391.                Return a pointer to a vrl_Raster describing your display
  1392.                hardware.  It's important that the height, width and depth
  1393.                fields are correct.
  1394.  
  1395.           VRL_VIDEO_BLIT
  1396.                Copy the contents of the vrl_Raster pointed to by pparm into
  1397.                the current draw page.  If pparm points to our raster (i.e.,
  1398.                the one that references the physical framebuffer) don't
  1399.                bother doing the copy.
  1400.  
  1401.           VRL_VIDEO_CURSOR_HIDE
  1402.                If the internal cursor flag is greater than or equal to
  1403.                zero, erase the cursor (by restoring what was under it).  In
  1404.                any case, decrement the internal cursor flag.
  1405.  
  1406.           VRL_VIDEO_CURSOR_SHOW
  1407.                Increment the internal cursor flag; if it's equal to zero,
  1408.                draw the cursor (saving what was under it).
  1409.  
  1410.           VRL_VIDEO_CURSOR_RESET
  1411.                Center the cursor on the screen, and set the internal cursor
  1412.                flag to -1.
  1413.  
  1414.  
  1415.  
  1416.  
  1417.                              AVRIL Tech Ref -- Appendices                24
  1418.  
  1419.  
  1420.  
  1421.  
  1422.  
  1423.           VRL_VIDEO_CURSOR_MOVE
  1424.                The top 16 bits of lparm contain the new X coordinate, and
  1425.                the bottom 16 bits contain the new Y coordinate.  Move the
  1426.                cursor to that location (restoring what was under it, and
  1427.                saving what's under the new location).
  1428.  
  1429.           VRL_VIDEO_CURSOR_SET_APPEARANCE
  1430.                Set the cursor appearance to the data pointed to by pparm.
  1431.  
  1432.           You should add an entry for your new function to the list in
  1433.           avrildrv.h, and possibly to the cfg.c file.
  1434.  
  1435.           If you wind up writing video drivers to support additional modes,
  1436.           drop me some email (broehl@sunee.uwaterloo.ca).  I'll happily
  1437.           include your driver in the main AVRIL release, and give you full
  1438.           credit for having written your driver.
  1439.  
  1440.  
  1441.  
  1442.  
  1443.  
  1444.  
  1445.  
  1446.  
  1447.  
  1448.  
  1449.  
  1450.  
  1451.  
  1452.  
  1453.  
  1454.  
  1455.  
  1456.  
  1457.  
  1458.  
  1459.  
  1460.  
  1461.  
  1462.  
  1463.  
  1464.  
  1465.  
  1466.  
  1467.  
  1468.  
  1469.  
  1470.  
  1471.  
  1472.  
  1473.  
  1474.  
  1475.  
  1476.                              AVRIL Tech Ref -- Appendices                25
  1477.  
  1478.  
  1479.  
  1480.  
  1481.  
  1482.  
  1483.           Appendix H - WRITING DISPLAY DRIVERS
  1484.  
  1485.           The interface to the display driver (i.e. scan-converter) is a
  1486.           function of the form
  1487.  
  1488.                vrl_32bit vrl_DisplayDriverFunction(vrl_DisplayCommand cmd, vrl_32bit lparm,
  1489.                                   void *pparm1);
  1490.  
  1491.           The lparm is a 32 bit value, the pparm is a pointer to somewhere
  1492.           in system memory, and the return value of the function is a 32-
  1493.           bit value.
  1494.  
  1495.           You can implement your own display driver by writing a function
  1496.           of the form above (giving it a unique name) and setting it as the
  1497.           driver function using
  1498.  
  1499.                           vrl_DisplaySetDriver(YourDriver);
  1500.  
  1501.           The application (and AVRIL itself) will call your function,
  1502.           passing it a cmd to tell it what to do.  Any commands you don't
  1503.           want to deal with, you can ignore; however, be sure to return
  1504.           zero as the value of the function.  For example, if your driver
  1505.           doesn't do Z-buffering, you could ignore the
  1506.           VRL_DISPLAY_CLEAR_Z_BUFFER call.  (Note that version 2.0 of AVRIL
  1507.           does not yet support Z-buffering, so for now you can just ignore
  1508.           all those calls).
  1509.  
  1510.           The values for cmd, and the behaviour your function should
  1511.           exhibit for each, are as follows:
  1512.  
  1513.           VRL_DISPLAY_GET_VERSION
  1514.                Return the version number; for this specification, return 1.
  1515.  
  1516.           VRL_DISPLAY_GET_DESCRIPTION
  1517.                The pparm parameter points to a buffer in system memory;
  1518.                fill that buffer with anything you like (preferably,
  1519.                something that describes your driver).  The lparm parameter
  1520.                gives the length of the buffer; don't write past the end.
  1521.  
  1522.           VRL_DISPLAY_INIT
  1523.                Initialize the display subsystem.  The pparm parameter
  1524.                points to a raster you should use.
  1525.  
  1526.           VRL_DISPLAY_QUIT
  1527.                De-initialize the display subsystem.
  1528.  
  1529.           VRL_DISPLAY_CLEAR
  1530.                Clear the display; lparm is the color to use.
  1531.  
  1532.           VRL_DISPLAY_POINT
  1533.  
  1534.  
  1535.                              AVRIL Tech Ref -- Appendices                26
  1536.  
  1537.  
  1538.  
  1539.  
  1540.  
  1541.                The pparm parameter points to a linked list of output
  1542.                vertices; set those points on the current draw page.
  1543.  
  1544.           VRL_DISPLAY_LINE
  1545.                The pparm parameter points to a linked list of output
  1546.                vertices; they should be connected sequentially by a series
  1547.                of lines.  The color of each line should be set from the
  1548.                starting vertex of the line.
  1549.  
  1550.           VRL_DISPLAY_CLOSED_LINE
  1551.                The pparm parameter points to a linked list of output
  1552.                vertices; they should be connected sequentially by a series
  1553.                of lines.  The last point should be connected back to the
  1554.                first point.  The color of each line should be set from the
  1555.                starting vertex of the line.
  1556.  
  1557.           VRL_DISPLAY_BOX
  1558.                The pparm parameter points to a two-element linked list of
  1559.                output vertices; the first output vertex is the top-left
  1560.                corner of the box, and the second is the bottom-right
  1561.                corner.  The box should be filled with the color of the
  1562.                first output vertex.
  1563.  
  1564.           VRL_DISPLAY_TEXT
  1565.                Display the text pointed to by pparm in the color specified
  1566.                by lparm.
  1567.  
  1568.           VRL_DISPLAY_TEXT_POSITION
  1569.                The top 16 bits of lparm give the new X position for drawing
  1570.                text, and the bottom 16 bits give the new Y position.  The
  1571.                text position marks the location where the top left corner
  1572.                of the first character of a string will appear.
  1573.  
  1574.           VRL_DISPLAY_GET_TEXTWIDTH
  1575.                Return the width in pixels of the string pointed to by
  1576.                pparm.
  1577.  
  1578.           VRL_DISPLAY_GET_TEXTHEIGHT
  1579.                Return the height in pixels of the string pointed to by
  1580.                pparm.
  1581.  
  1582.           VRL_DISPLAY_CAN_GOURAUD
  1583.                Return non-zero if you support Gouraud shading.
  1584.  
  1585.           VRL_DISPLAY_CAN_XY_CLIP
  1586.                Return non-zero if you are willing to do all the X-Y
  1587.                clipping.
  1588.  
  1589.           VRL_DISPLAY_UPDATE_PALETTE
  1590.                Do whatever you need to do when the palette changes; pparm
  1591.                points to the new palette.
  1592.  
  1593.  
  1594.                              AVRIL Tech Ref -- Appendices                27
  1595.  
  1596.  
  1597.  
  1598.  
  1599.  
  1600.           VRL_DISPLAY_BEGIN_FRAME
  1601.                Do whatever you need to do at the beginning of a frame.
  1602.  
  1603.           VRL_DISPLAY_END_FRAME
  1604.                Do whatever you need to do at the end of a frame.
  1605.  
  1606.           VRL_DISPLAY_SET_RASTER
  1607.                The pparm parameter points to a vrl_Raster, which should be
  1608.                used for all subsequent drawing.
  1609.  
  1610.           VRL_DISPLAY_GET_RASTER
  1611.                The pparm parameter is a pointer to a pointer to a
  1612.                vrl_Raster; in other words, you should do the equivalent of:
  1613.                     *((vrl_Raster **) pparm1) = our_raster;
  1614.  
  1615.           VRL_DISPLAY_SET_Z_BUFFER
  1616.                The pparm parameter points to a vrl_Raster that you should
  1617.                use as the new Z-buffer.
  1618.  
  1619.           VRL_DISPLAY_GET_Z_BUFFER
  1620.                The pparm parameter is a pointer to a pointer to a
  1621.                vrl_Raster; in other words, you should do the equivalent of:
  1622.                     *((vrl_Raster **) pparm1) = our_z_raster;
  1623.  
  1624.           VRL_DISPLAY_USE_Z_BUFFER
  1625.                If lparm is non-zero, enable use of the Z-buffer; if lparm
  1626.                is zero, disable the Z-buffer.  Return 0 if you can't Z-
  1627.                buffer, 1 if you do it in software, or 2 if you do it in
  1628.                hardware.
  1629.  
  1630.           VRL_DISPLAY_CLEAR_Z_BUFFER
  1631.                Clear the Z-buffer, if you have one.  Fill it with the value
  1632.                of lparm (if possible).
  1633.  
  1634.           VRL_DISPLAY_SET_SHADING
  1635.                The lparm parameter is a hint from the user; the higher the
  1636.                number, the more time you should spend on shading.
  1637.  
  1638.           VRL_DISPLAY_POLY
  1639.                This is where the action is.  The pparm parameter points to
  1640.                an output facet; draw it into the current framebuffer. 
  1641.                Easy, right?
  1642.  
  1643.           The two data types used by the display driver are
  1644.           vrl_OutputVertex and vrl_OutputFacet.  A vrl_OutputVertex looks
  1645.           like this:
  1646.  
  1647.           struct _vrl_outvertex
  1648.                           {
  1649.                           vrl_ScreenCoord x,y,z;            /* X, Y screen coordinates and Z-depth */
  1650.                           vrl_16bit red, green, blue;       /* components of the color */
  1651.                           vrl_OutputVertex *next, *prev;    /* doubly-linked circular list */
  1652.  
  1653.                                                  AVRIL Tech Ref -- Appendices                28
  1654.  
  1655.  
  1656.  
  1657.  
  1658.  
  1659.                           };
  1660.  
  1661.           The vrl_ScreenCoord values are fractional; the number of bits to
  1662.           the right of the binary point is specified by
  1663.           VRL_SCREEN_FRACT_BITS.
  1664.  
  1665.           The colors are in 8.8 format (i.e. 8 bits of color, 8 bits of
  1666.           fraction).  For paletted systems, only the red value is used;
  1667.           it's interpreted as a palette index.
  1668.           Note that future versions of AVRIL may support additional
  1669.           information per vertex, such as texture map coordinates.
  1670.  
  1671.           A vrl_OutputFacet looks like this:
  1672.  
  1673.           struct _vrl_outfacet
  1674.                           {
  1675.                           vrl_OutputVertex *points;     /* doubly-linked list of vertices for this facet */
  1676.                           vrl_Surface *surface;         /* surface properties */
  1677.                           vrl_Color color;              /* color of this facet (flat shading only) */
  1678.                           };
  1679.  
  1680.           The list of points is doubly linked, with the next field pointing
  1681.           at the next (clockwise) vertex and the prev field pointing back
  1682.           to the previous (counterclockwise) vertex.  The vrl_Surface
  1683.           struct is the same one used throughout AVRIL; see the technical
  1684.           reference manual for information about accessing the various
  1685.           fields, especially the type (flat, Gouraud, etc).
  1686.  
  1687.           For 8-bit systems, the vrl_Color value is a palette index (i.e.
  1688.           only the bottom 8 bits of the 32-bit color field are used).  For
  1689.           15-, 16- and 32-bit systems, the actual color is stored in the 32
  1690.           bit word; the bottom byte is red, the next one up is green, and
  1691.           the next one up is blue.  The top byte may be used as an "alpha"
  1692.           channel; if not, it should be zero.  Current versions of AVRIL
  1693.           are 8-bit (paletted) only.
  1694.  
  1695.           Note that future versions of AVRIL may provide additional
  1696.           information for output vertices and output facets.
  1697.  
  1698.           If you write display drivers, especially ones which support the
  1699.           new 3D graphics accelerators coming on the market, please drop me
  1700.           some email (broehl@sunee.uwaterloo.ca).  Since I'm giving AVRIL
  1701.           away for free, I can't afford to buy every card that comes out,
  1702.           so I'm counting on other people to create drivers.  I'll be happy
  1703.           to include your drivers with the main AVRIL release, with full
  1704.           credit.
  1705.  
  1706.  
  1707.  
  1708.  
  1709.  
  1710.  
  1711.  
  1712.                              AVRIL Tech Ref -- Appendices                29
  1713.  
  1714.  
  1715.  
  1716.  
  1717.  
  1718.  
  1719.           Appendix I - STEREOSCOPIC VIEWING TYPES
  1720.  
  1721.           A number of stereoscopic viewing types are supported in AVRIL. 
  1722.           The current version doesn't implement all of them, but all of
  1723.           them are described here.
  1724.  
  1725.           VRL_STEREOTYPE_NONE
  1726.                Monoscopic; no stereo.
  1727.  
  1728.           VRL_STEREOTYPE_ANAGLYPH_SEQUENTIAL
  1729.                Field sequential, with alternate frames using red and blue
  1730.                palettes.  View with anaglyph (red-blue) glasses.  Not yet
  1731.                implemented.
  1732.  
  1733.           VRL_STEREOTYPE_ANAGLYPH_WIRE_ALTERNATE
  1734.                Wireframe anaglyph, with left-eye image on even scanlines
  1735.                and right-eye image on odd scanlines.  View with anaglyph
  1736.                (red-blue) glasses.
  1737.  
  1738.           VRL_STEREOTYPE_ANAGLYPH_SOLID_ALTERNATE
  1739.                Similar to wireframe anaglyph, but solid instead of
  1740.                wireframe.
  1741.  
  1742.           VRL_STEREOTYPE_ENIGMA
  1743.                Alternate scanline encoding, for use with CyberMaxx HMD.
  1744.  
  1745.           VRL_STEREOTYPE_FRESNEL
  1746.                Left-right split screen, for use with Fresnel viewer such as
  1747.                the one described in Virtual Reality Creations.
  1748.  
  1749.           VRL_STEREOTYPE_CYBERSCOPE
  1750.                Left-eye image on left half of screen, right-eye image on
  1751.                right half of screen, both rotated 90 degrees; should work
  1752.                with Cyberscope from Simsalabim Systems Inc, but so far
  1753.                untested (since I don't have one!).
  1754.  
  1755.           VRL_STEREOTYPE_CRYSTALEYES
  1756.                Puts left-eye image on top of screen, right-eye image on
  1757.                bottom of screen, for eventual support of CrystalEyes
  1758.                shutter glasses from StereoGraphics (can't do any real
  1759.                development on this, since I don't have them!).
  1760.  
  1761.           VRL_STEREOTYPE_CHROMADEPTH
  1762.                Single-image system, mapping depth into red through blue
  1763.                shades; view with Chromadepth glasses (which you can get at
  1764.                most laser light shows, or with certain Valiant comic
  1765.                books).
  1766.  
  1767.           VRL_STEREOTYPE_SIRDS
  1768.                Single-Image Random Dot Stereogram.  Not yet implemented.
  1769.  
  1770.  
  1771.                              AVRIL Tech Ref -- Appendices                30
  1772.  
  1773.  
  1774.  
  1775.  
  1776.  
  1777.           VRL_STEREOTYPE_TWOCARDS
  1778.                Assumes two video cards, separate outputs going to the two
  1779.                displays of an HMD.
  1780.  
  1781.           VRL_STEREOTYPE_SEQUENTIAL
  1782.                Field sequential, with shutter glasses; not yet supported in
  1783.                AVRIL (as of version 2.0).
  1784.  
  1785.           If you know of some way to produce stereoscopic images that I
  1786.           haven't mentioned here, please drop me some email
  1787.           (broehl@sunee.uwaterloo.ca).
  1788.  
  1789.  
  1790.  
  1791.  
  1792.  
  1793.  
  1794.  
  1795.  
  1796.  
  1797.  
  1798.  
  1799.  
  1800.  
  1801.  
  1802.  
  1803.  
  1804.  
  1805.  
  1806.  
  1807.  
  1808.  
  1809.  
  1810.  
  1811.  
  1812.  
  1813.  
  1814.  
  1815.  
  1816.  
  1817.  
  1818.  
  1819.  
  1820.  
  1821.  
  1822.  
  1823.  
  1824.  
  1825.  
  1826.  
  1827.  
  1828.  
  1829.  
  1830.                              AVRIL Tech Ref -- Appendices                31
  1831.  
  1832.  
  1833.  
  1834.  
  1835.  
  1836.  
  1837.           Appendix J - INPUT DEVICES
  1838.  
  1839.           The following devices are supported in AVRIL, as of version 2.0:
  1840.  
  1841.           vrl_MouseDevice
  1842.                Standard mouse; buttons are used to map two axes into six. 
  1843.                It works like this:
  1844.                     No buttons down:    left-right causes Y rotation,
  1845.                forward-back moves in Z
  1846.                     Left button down:   left-right moves in X, forward-back
  1847.                moves in Y
  1848.                     Right button down:  left-right rotates around Z,
  1849.                forward-back rotates around X
  1850.  
  1851.           vrl_GlobalDevice
  1852.                Global Devices Controller; not currently being manufactured. 
  1853.                Has tactile stimulation.
  1854.  
  1855.           vrl_CybermanDevice
  1856.                Logitech Cyberman.  Has cheesy tactile feedback.
  1857.  
  1858.           vrl_RedbaronDevice
  1859.                Logitech ultrasonic mouse.  Was originally code-named the
  1860.                "Red Baron".
  1861.  
  1862.           vrl_CTMDevice
  1863.                CyberMaxx Tracking Module, in the CyberMaxx HMD.
  1864.  
  1865.           vrl_VIODevice
  1866.                Head tracker in the i-glasses! HMD from Virtual i/o.
  1867.  
  1868.           vrl_SpaceballDevice
  1869.                Original Spatial Systems Spaceball.
  1870.  
  1871.           vrl_IsotrakDevice
  1872.                Original Polhemus Isotrak.  I'd add support for newer
  1873.                versions, but I don't have them.
  1874.  
  1875.           The ones below are PC-specific:
  1876.  
  1877.           vrl_KeypadDevice
  1878.                Uses keypad arrows, the PgUp and PgDn keys, and shifted
  1879.                versions of each.   It works like this:
  1880.                     no shift down: left-right arrows rotate in Y, up-down
  1881.                arrows move in Z
  1882.                     left shift down:    left-right arrows move in X, up-
  1883.                down arrows move in Y
  1884.                     right shift down:   left-right arrows rotate in Z, up-
  1885.                down arrows rotate in X
  1886.                     PGUP and PGDN: move in Y (same as up and down arrows
  1887.                with left shift)
  1888.  
  1889.                              AVRIL Tech Ref -- Appendices                32
  1890.  
  1891.  
  1892.  
  1893.  
  1894.  
  1895.           vrl_JoystickDevice
  1896.                Ordinary analog joystick; buttons are used to map two axes
  1897.                into six.  Also supports joystick-compatable devices such as
  1898.                the popular PC gamepads (some of which are available in a
  1899.                wireless version, which is good if you're in an HMD and
  1900.                don't want to trip over the wire!).  The buttons map like
  1901.                this:
  1902.                     no buttons down:    tilt left-right rotates in Y,
  1903.                forward-back moves in Z
  1904.                     trigger button down:     tilt left-right moves in X,
  1905.                forward-back moves in Y
  1906.                     thumb down button:  tilt left-right rotates around Z,
  1907.                forward-back around X
  1908.  
  1909.           vrl_FifthDevice
  1910.                The FifthGlove, from Fifth Dimension Technologies (5DT). 
  1911.                The finger positions are mapped into channels 6 through 10
  1912.                (channels 0 through 5 are not used, since the glove has no
  1913.                built-in tracker).
  1914.  
  1915.           vrl_CyberwandDevice
  1916.                The CyberWand, from InWorld VR.  The "hat" controller's axes
  1917.                are mapped using the "pinky" and "grip" buttons (the grip
  1918.                button being the one on the side of the stick, halfway up).
  1919.                     no buttons down:    hat moves forward/backward,
  1920.                sideways
  1921.                     pinky button down:  hat rotates around X, Y
  1922.                     grip button down:   hat moves up/down, rotates around Z
  1923.  
  1924.  
  1925.           vrl_7thSenseDevice
  1926.                Head tracker in the 7th Sense HMD from All-Pro.
  1927.  
  1928.           vrl_PadDevice
  1929.                A Nintendo-style gamepad, using the cable from the July 1990
  1930.                Byte magazine.  Works well with the Grip-It free-flying
  1931.                joystick (which uses mercury switches for two-axis tilt
  1932.                information).
  1933.  
  1934.           Sorry, no PowerGlove driver yet.  The timing stuff is hairy, and
  1935.           I've got lots of other things to add to AVRIL.  They're also not
  1936.           manufacturing PowerGloves anymore.  If someone else would like to
  1937.           write one, go for it!  I'll help if I can.
  1938.  
  1939.           In fact, if you write a driver for any device, drop me some email
  1940.           (broehl@sunee.uwaterloo.ca); since I'm giving AVRIL away for
  1941.           free, I can't afford to buy every different input device on the
  1942.           market, so adding support for them is difficult.
  1943.  
  1944.           If you write drivers for AVRIL, I'll be happy to include them in
  1945.           the main release and give you full credit for having written
  1946.           them.
  1947.  
  1948.                              AVRIL Tech Ref -- Appendices                33
  1949.  
  1950.  
  1951.  
  1952.  
  1953.  
  1954.  
  1955.  
  1956.  
  1957.  
  1958.  
  1959.  
  1960.  
  1961.  
  1962.  
  1963.  
  1964.  
  1965.  
  1966.  
  1967.  
  1968.  
  1969.  
  1970.  
  1971.  
  1972.  
  1973.  
  1974.  
  1975.  
  1976.  
  1977.  
  1978.  
  1979.  
  1980.  
  1981.  
  1982.  
  1983.  
  1984.  
  1985.  
  1986.  
  1987.  
  1988.  
  1989.  
  1990.  
  1991.  
  1992.  
  1993.  
  1994.  
  1995.  
  1996.  
  1997.  
  1998.  
  1999.  
  2000.  
  2001.  
  2002.  
  2003.  
  2004.  
  2005.  
  2006.  
  2007.                              AVRIL Tech Ref -- Appendices                34