gauche-gl (0.4.4-5) debian-changes-0.4.4-4

Summary

 doc/gauche-gl-refe.texi |  240 +++++++++++++++++++++++++++++++++++++++++++-----
 doc/gauche-gl-refj.texi |  240 +++++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 436 insertions(+), 44 deletions(-)

    
download this patch

Patch contents

Description: Upstream changes introduced in version 0.4.4-4
 This patch has been created by dpkg-source during the package build.
 Here's the last changelog entry, hopefully it gives details on why
 those changes were made:
 .
 gauche-gl (0.4.4-4) unstable; urgency=low
 .
   * debian/gauche-gl.info: New file.
   * debian/patches/00_new_api_0.9.patch: New file for new Gauche 0.9.
   * debian/patches/01_no_path_xtra.patch: New file from diff of 0.4.4-3.
   * debian/{rules,source,patches,README.source}: Use 3.0 (quilt) format.
   * debian/compat: Updated.
   * debian/control (Section): It's now lisp.
     (Homepage): New field.
     (Depends): Added ${misc:Depends}.
     (Build-Depends): This is for new gauche-dev (>= 0.9).
     Added autoconf and texinfo.
 .
 The person named in the Author field signed this changelog entry.
Author: NIIBE Yutaka <gniibe@fsij.org>

---
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:

Origin: <vendor|upstream|other>, <url of original patch>
Bug: <url in upstream bugtracker>
Bug-Debian: http://bugs.debian.org/<bugnumber>
Forwarded: <no|not-needed|url proving that it has been forwarded>
Reviewed-By: <name and email of someone who approved the patch>
Last-Update: <YYYY-MM-DD>

--- gauche-gl-0.4.4.orig/doc/gauche-gl-refe.texi
+++ gauche-gl-0.4.4/doc/gauche-gl-refe.texi
@@ -46,7 +46,7 @@ This manual is for version 0.4.4.
 * OpenGL API::                  
 * GLUT API::                    
 * Vectors and matrices::        
-* Simple image handling::       
+* Simple utilities::            
 * Indices::                     
 @end menu
 
@@ -71,13 +71,12 @@ optimized for 3D homogeneous coordinates
 The vector and matrix objects here can be directly passed to
 Gauche-gl functions.
 The functions are descrbied in @ref{Vectors and matrices}.
-@item gl.simple-image
-OpenGL doesn't provide any means of reading/writing image data, and
-it should be covered by other Gauche extensions.  However,
-it is sometimes handy to have simple means to handle external
-image data, so that you can do some experiment with Gauche-gl alone.
-This module provides minimal support for that.
-The functions are descrbied in @ref{Simple image handling}.
+@item gl.simple.*
+These modules provide simple APIs for programmers to
+hack up a very simple OpenGL application.  They are by no
+means intended for general application development, but
+would be handy for throwaway script.
+See @ref{Simple utilities} for the details.
 @end table
 
 @c ======================================================================
@@ -2905,7 +2904,7 @@ f64vector of size 4 or @code{<vector4f>}
 
 
 @c ======================================================================
-@node Vectors and matrices, Simple image handling, GLUT API, Top
+@node Vectors and matrices, Simple utilities, GLUT API, Top
 @chapter Vectors and matrices
 
 @deftp {Module} gl.math3d
@@ -3102,6 +3101,10 @@ Returns a cross product of two vector4fs
 (@var{w} element is ignored).
 @end defun
 
+@defun vector4f-norm v
+Returns the norm (length) of the vector @var{v}.
+@end defun
+
 @defun vector4f-normalize x
 @defunx vector4f-normalize! x
 Returns a normalized vector of vector4f @var{x}.
@@ -3326,6 +3329,12 @@ it specifies the start offset in vector
 initial values.  The f32vector @var{v} must have enough length.
 @end defun
 
+@defun f32vector->matrix4f! m v &optional (start 0)
+Extract 16 flonums in the f32vector @var{v} starting from the
+index @var{start}, and fill the matrix4f @var{m} with them.
+The f32vector @var{v} must have enough length.
+@end defun
+
 @defun matrix4f->f32vector m
 Returns a new f32vector that has elements from matrix4f @var{m}.
 @end defun
@@ -3455,8 +3464,8 @@ rotation is represented by a quaternion
 @xref{Quaternions}, for more details about quaternions.
 @end defun
 
-@defun euler-angle->matrxi4f xangle yangle zangle &optional order
-@defunx euler-angle->matrxi4f! m xangle yangle zangle &optional order
+@defun euler-angle->matrix4f xangle yangle zangle &optional order
+@defunx euler-angle->matrix4f! m xangle yangle zangle &optional order
 Returns a matrix that represents rotation along x, y and z axis
 by @var{xangle}, @var{yangle}, and @var{zangle}, respectively.
 
@@ -3513,12 +3522,23 @@ and @var{s}.  The return value is a bool
 @var{m} is non-singular or not.
 @end defun
 
+@defun matrix4f->translation m
+Extract the translation component from the given TRS matrix @var{m}
+and returns it as a @code{<vector4f>}.
+@end defun
+
+@defun matrix4f->translation! v m
+Extract the translation component from the given TRS matrix @var{m}
+and stores the result into a @code{<vector4f>} @var{v}.
+Returns @var{v}.
+@end defun
+
 @defun matrix4f->rotation m
 From given orthogonal matrix @var{m}, extracts and returns
 and rotation axis and angle, as a vector4f and a real number.
 @end defun
 
-@defun matrix4f->rotation! m v
+@defun matrix4f->rotation! v m
 Same as above, except the storage of vector4f @var{v} is reused
 to store the result axis.
 @end defun
@@ -3594,6 +3614,25 @@ around a unit vector @var{axis} by angle
 a f32vector (only first three component is used).
 @end defun
 
+@defun vectors->quatf v w
+@defunx vectors->quatf! q v w
+Given two unit vectors @var{v} and @var{w}, calculates and returns
+a quaternion that represents a rotation from @var{v} to @var{w}.
+The destructive version @code{vectors->quatf!} modifies @var{q}.
+@end defun
+
+@defun axes->quatf v1 v2 w1 w2
+@defunx axes->quatf! q v1 v2 w1 w2
+The arguments must be all unit vectors,
+@var{v1} and @var{v2} must be perpendicular, 
+and also @var{w1} and @var{w2} must be perpendicular.
+
+Calculates and returns a quaternion that represents a rotation
+which transforms @var{v1} to @var{w1}, and @var{v2} to @var{w2},
+respectively.  The destructive version stores the result
+into @var{q}.
+@end defun
+
 @defun quatf-add p q
 @defunx quatf-add! p q
 @defunx quatf-sub p q
@@ -3611,11 +3650,13 @@ The destructive version modifies @var{q}
 @defun quatf-mul p q
 @defunx quatf-mul! p q
 Multiply two quaternions @var{p} and @var{q}.
-The destructive version modifies @var{p}.
+The destructive version modifies @var{p} as well.
 @end defun
 
-@defun quatf-conjugate q
-Returns a conjugate of a quaternion @var{q}.
+@defun quatf-conjugate p
+@defunx quatf-conjugate! q p
+Returns a conjugate of a quaternion @var{p}.
+The destructive version modifies @var{q} as well.
 @end defun
 
 @defun quatf-transform q p
@@ -3647,22 +3688,47 @@ The behavior is undefined if @var{q} is
 The destructive version modifies @var{m}.
 @end defun
 
+@defun matrix4f->quatf m
+@defunx matrix4f->quatf! q m
+Extracts the rotation component of a matrix @var{m} and
+returns a quaterion that represents the rotation.
+@code{Matrix4f->quatf!} also uses @var{q} as the storage
+to store the result.
+@end defun
+
 @defun quatf-slerp p q t
 @defunx quatf-slerp! r p q t
 Returns a quaternion that interpolates between two
 unit quaternions @var{p} and @var{q}, by a scalar value @var{t}.
-The destructive version modifies @var{t}.
+The destructive version modifies @var{r}.
 @end defun
 
+@c ======================================================================
+@node Simple utilities, Indices, Vectors and matrices, Top
+@chapter Simple utilities
 
+This chapter covers @code{gl.simple.*} modules.  They are
+provided for the convenience of those who wants quick experiment
+with Gauche-gl alone, without a hassle to install a bunch of
+other modules.  Their features are pretty limited, but you
+may find them handy when you need to hack up some throwaway
+script that need to show some graphics on the screen.
 
+@menu
+* Simple image handling::       
+* Simple viewer::               
+@end menu
 
-@c ======================================================================
-@node Simple image handling, Indices, Vectors and matrices, Top
-@chapter Simple image handling
+@node Simple image handling, Simple viewer, Simple utilities, Simple utilities
+@section Simple image handling
+
+@deftp {Module} gl.simple.image
+@mdindex gl.simple.image
+OpenGL doesn't provide any means of reading/writing image data, and
+it should be covered by other Gauche extensions.  However,
+it is sometimes handy to have simple means to handle external
+image data, so that you can do some experiment with Gauche-gl alone.
 
-@deftp {Module} gl.simple-image
-@mdindex gl.simple-image
 This module provides a minimal support to handle external image
 data, so that one can do some experiment in Gauche-gl alone.
 
@@ -3691,10 +3757,140 @@ image data vector is usually huge, and y
 for the REPL to display the entire result.
 @end defun
 
+@node Simple viewer,  , Simple image handling, Simple utilities
+@section Simple viewer
+
+@deftp {Module} gl.simple.viewer
+@mdindex gl.simple.viewer
+This module packages common operations to allow users to
+view 3D objects, controlling the camera by the mouse,
+and have some interactions with the keyboard.
+
+A typical way of using the viewer is like the following:
+
+@example
+(use gl)
+(use gl.glut)
+(use gl.simple.viewer)
+
+(define (main args)
+  (glut-init args)
+  (simple-viewer-display <your-display-thunk>)
+  (simple-viewer-set-key! <key> <handler> ...)
+  (simple-viewer-window <name> :title <title> ...)
+  (simple-viewer-run) ; loop forever.  type ESC to exit.
+  0)
+@end example
+
+The viewer handles mouse drag (to move the camera),
+and also draws reference grid and axes by default for
+your convenience.  You have to provide a thunk, which
+must draw your 3D object.
+
+For the keyboard events, you can use a convenient API
+to associate handler to the key (character for normal keys,
+and constants like @code{GL_LEFT_ARROW} for special keys).
+
+The reshape event is handled implicitly, though you can
+override it.
+
+If you call @code{simple-viewer-run}, it enters the event
+loop and never returns.  If you wish to keep REPL and/or
+other parts of your application run concurrently, 
+the convenient way is to run @code{simple-viewer-run}
+in a separate thread.
+
+@example
+(use gauche.threads)
+
+(define (run-viewer)
+  (thread-start! (make-thread simple-viewer-run #f)))
+@end example
+
+See also the code under @file{examples/simple} directory
+of the source tree for more examples.
+@end deftp
+
+@defun simple-viewer-window name &key title mode parent width height x y
+Creates a new GL window with @var{name}, which must be a symbol
+to identify the window later in the simple viewer framework.
+The window won't be shown until @code{simple-viewer-run} is called.
+
+Each window 
+@end defun
+
+
+@defun simple-viewer-display &optional display-thunk
+Gets/sets the display thunk, which is called every time
+the GL window is redrawn.  You can change the display thunk
+any time, even while the viewer thread is running.
+
+If no argument is given, returns the current display thunk.
+It can be @code{#f} if no display thunk is set.
+
+When the display thunk is called, the matrix mode is 
+@code{MODELVIEW} and the camera transformation is already applied.
+The grid and axes are also drawn, unless you've customized them.
+
+In the display thunk you can just write your model in the
+world coordinate system.  It is guaranteed that
+the current color is white and line width is 1.0, but
+the states of other GL contexts are undefined,
+so you have to set them explicitly.
+@end defun
+
+@defun simple-viewer-reshape &optional reshape-proc
+Gets/sets the reshape procedure which is called every
+time the GL window configuration is changed.  (It is
+also called when the GL window is shown first time.)
+You can change the reshape procedure any time,
+even while the viewer thread is running.
+
+If no argument is given, returns the current reshape proc.
+
+A reshape procedure is called with two arguments,
+the width and the height (in pixels) of the new GL
+window configuration.  By default, @code{gl.simple.viewer}
+sets a procedure that changes viewport and
+projection matrix apopropriately; you need to change
+it only if you want a different behavior.
+@end defun
+
+@defun simple-viewer-grid &optional grid-proc
+@defunx simple-viewer-axis &optional axis-proc
+Gets/sets a procedure to draw a grid and axes.  
+You can change these procedures
+any time, even while the viewer thread is running.
+
+The @var{grid-proc} and @var{axis-proc} are called with no arguments
+every time the GL window is redrawn, before the display thunk
+is invoked.
+The matrix mode is @code{MODELVIEW}, the camera transformation
+is already applied, and lighting is disabled.
+
+The default grid proc draws 10x10 grid
+on X-Z plane centered at the origin.  The default axis proc
+draws a red line from origin to +X, a green line from origin to +Y,
+and a blue line from origin to +Z.  
+
+You can pass @code{#f} to disable grid and/or axis display.
+
+If no argument is given, returns the current grid/axis proc,
+respectively.
+@end defun
+
+@defun simple-viewer-set-key! key handler @dots{}
+Even number of arguments must be given; the first of
+every two specifies the key, and the next one
+specifies the action when the key is pressed.
+@end defun
+
+
+
 
 
 @c ======================================================================
-@node Indices,  , Simple image handling, Top
+@node Indices,  , Simple utilities, Top
 @appendix Indices
 @c NODE 索引
 
--- gauche-gl-0.4.4.orig/doc/gauche-gl-refj.texi
+++ gauche-gl-0.4.4/doc/gauche-gl-refj.texi
@@ -46,7 +46,7 @@ This manual is for version 0.4.4.
 * OpenGL API::  
 * GLUT API::  
 * Vectors and matrices::  
-* Simple image handling::  
+* Simple utilities::  
 * º÷°ú::  
 @end menu
 
@@ -71,13 +71,12 @@ optimized for 3D homogeneous coordinates
 The vector and matrix objects here can be directly passed to
 Gauche-gl functions.
 The functions are descrbied in @ref{Vectors and matrices}.
-@item gl.simple-image
-OpenGL doesn't provide any means of reading/writing image data, and
-it should be covered by other Gauche extensions.  However,
-it is sometimes handy to have simple means to handle external
-image data, so that you can do some experiment with Gauche-gl alone.
-This module provides minimal support for that.
-The functions are descrbied in @ref{Simple image handling}.
+@item gl.simple.*
+These modules provide simple APIs for programmers to
+hack up a very simple OpenGL application.  They are by no
+means intended for general application development, but
+would be handy for throwaway script.
+See @ref{Simple utilities} for the details.
 @end table
 
 @c ======================================================================
@@ -2905,7 +2904,7 @@ f64vector of size 4 or @code{<vector4f>}
 
 
 @c ======================================================================
-@node Vectors and matrices,  Simple image handling,  GLUT API,  Top
+@node Vectors and matrices,  Simple utilities,  GLUT API,  Top
 @chapter Vectors and matrices
 
 @deftp {Module} gl.math3d
@@ -3102,6 +3101,10 @@ Returns a cross product of two vector4fs
 (@var{w} element is ignored).
 @end defun
 
+@defun vector4f-norm v
+Returns the norm (length) of the vector @var{v}.
+@end defun
+
 @defun vector4f-normalize x
 @defunx vector4f-normalize! x
 Returns a normalized vector of vector4f @var{x}.
@@ -3326,6 +3329,12 @@ it specifies the start offset in vector
 initial values.  The f32vector @var{v} must have enough length.
 @end defun
 
+@defun f32vector->matrix4f! m v &optional (start 0)
+Extract 16 flonums in the f32vector @var{v} starting from the
+index @var{start}, and fill the matrix4f @var{m} with them.
+The f32vector @var{v} must have enough length.
+@end defun
+
 @defun matrix4f->f32vector m
 Returns a new f32vector that has elements from matrix4f @var{m}.
 @end defun
@@ -3455,8 +3464,8 @@ rotation is represented by a quaternion
 @xref{Quaternions}, for more details about quaternions.
 @end defun
 
-@defun euler-angle->matrxi4f xangle yangle zangle &optional order
-@defunx euler-angle->matrxi4f! m xangle yangle zangle &optional order
+@defun euler-angle->matrix4f xangle yangle zangle &optional order
+@defunx euler-angle->matrix4f! m xangle yangle zangle &optional order
 Returns a matrix that represents rotation along x, y and z axis
 by @var{xangle}, @var{yangle}, and @var{zangle}, respectively.
 
@@ -3513,12 +3522,23 @@ and @var{s}.  The return value is a bool
 @var{m} is non-singular or not.
 @end defun
 
+@defun matrix4f->translation m
+Extract the translation component from the given TRS matrix @var{m}
+and returns it as a @code{<vector4f>}.
+@end defun
+
+@defun matrix4f->translation! v m
+Extract the translation component from the given TRS matrix @var{m}
+and stores the result into a @code{<vector4f>} @var{v}.
+Returns @var{v}.
+@end defun
+
 @defun matrix4f->rotation m
 From given orthogonal matrix @var{m}, extracts and returns
 and rotation axis and angle, as a vector4f and a real number.
 @end defun
 
-@defun matrix4f->rotation! m v
+@defun matrix4f->rotation! v m
 Same as above, except the storage of vector4f @var{v} is reused
 to store the result axis.
 @end defun
@@ -3594,6 +3614,25 @@ around a unit vector @var{axis} by angle
 a f32vector (only first three component is used).
 @end defun
 
+@defun vectors->quatf v w
+@defunx vectors->quatf! q v w
+Given two unit vectors @var{v} and @var{w}, calculates and returns
+a quaternion that represents a rotation from @var{v} to @var{w}.
+The destructive version @code{vectors->quatf!} modifies @var{q}.
+@end defun
+
+@defun axes->quatf v1 v2 w1 w2
+@defunx axes->quatf! q v1 v2 w1 w2
+The arguments must be all unit vectors,
+@var{v1} and @var{v2} must be perpendicular, 
+and also @var{w1} and @var{w2} must be perpendicular.
+
+Calculates and returns a quaternion that represents a rotation
+which transforms @var{v1} to @var{w1}, and @var{v2} to @var{w2},
+respectively.  The destructive version stores the result
+into @var{q}.
+@end defun
+
 @defun quatf-add p q
 @defunx quatf-add! p q
 @defunx quatf-sub p q
@@ -3611,11 +3650,13 @@ The destructive version modifies @var{q}
 @defun quatf-mul p q
 @defunx quatf-mul! p q
 Multiply two quaternions @var{p} and @var{q}.
-The destructive version modifies @var{p}.
+The destructive version modifies @var{p} as well.
 @end defun
 
-@defun quatf-conjugate q
-Returns a conjugate of a quaternion @var{q}.
+@defun quatf-conjugate p
+@defunx quatf-conjugate! q p
+Returns a conjugate of a quaternion @var{p}.
+The destructive version modifies @var{q} as well.
 @end defun
 
 @defun quatf-transform q p
@@ -3647,22 +3688,47 @@ The behavior is undefined if @var{q} is
 The destructive version modifies @var{m}.
 @end defun
 
+@defun matrix4f->quatf m
+@defunx matrix4f->quatf! q m
+Extracts the rotation component of a matrix @var{m} and
+returns a quaterion that represents the rotation.
+@code{Matrix4f->quatf!} also uses @var{q} as the storage
+to store the result.
+@end defun
+
 @defun quatf-slerp p q t
 @defunx quatf-slerp! r p q t
 Returns a quaternion that interpolates between two
 unit quaternions @var{p} and @var{q}, by a scalar value @var{t}.
-The destructive version modifies @var{t}.
+The destructive version modifies @var{r}.
 @end defun
 
+@c ======================================================================
+@node Simple utilities, º÷°ú,  Vectors and matrices,  Top
+@chapter Simple utilities
 
+This chapter covers @code{gl.simple.*} modules.  They are
+provided for the convenience of those who wants quick experiment
+with Gauche-gl alone, without a hassle to install a bunch of
+other modules.  Their features are pretty limited, but you
+may find them handy when you need to hack up some throwaway
+script that need to show some graphics on the screen.
 
+@menu
+* Simple image handling::  
+* Simple viewer::  
+@end menu
 
-@c ======================================================================
-@node Simple image handling, º÷°ú,  Vectors and matrices,  Top
-@chapter Simple image handling
+@node Simple image handling,  Simple viewer,  Simple utilities,  Simple utilities
+@section Simple image handling
+
+@deftp {Module} gl.simple.image
+@mdindex gl.simple.image
+OpenGL doesn't provide any means of reading/writing image data, and
+it should be covered by other Gauche extensions.  However,
+it is sometimes handy to have simple means to handle external
+image data, so that you can do some experiment with Gauche-gl alone.
 
-@deftp {Module} gl.simple-image
-@mdindex gl.simple-image
 This module provides a minimal support to handle external image
 data, so that one can do some experiment in Gauche-gl alone.
 
@@ -3691,10 +3757,140 @@ image data vector is usually huge, and y
 for the REPL to display the entire result.
 @end defun
 
+@node Simple viewer,   ,  Simple image handling,  Simple utilities
+@section Simple viewer
+
+@deftp {Module} gl.simple.viewer
+@mdindex gl.simple.viewer
+This module packages common operations to allow users to
+view 3D objects, controlling the camera by the mouse,
+and have some interactions with the keyboard.
+
+A typical way of using the viewer is like the following:
+
+@example
+(use gl)
+(use gl.glut)
+(use gl.simple.viewer)
+
+(define (main args)
+  (glut-init args)
+  (simple-viewer-display <your-display-thunk>)
+  (simple-viewer-set-key! <key> <handler> ...)
+  (simple-viewer-window <name> :title <title> ...)
+  (simple-viewer-run) ; loop forever.  type ESC to exit.
+  0)
+@end example
+
+The viewer handles mouse drag (to move the camera),
+and also draws reference grid and axes by default for
+your convenience.  You have to provide a thunk, which
+must draw your 3D object.
+
+For the keyboard events, you can use a convenient API
+to associate handler to the key (character for normal keys,
+and constants like @code{GL_LEFT_ARROW} for special keys).
+
+The reshape event is handled implicitly, though you can
+override it.
+
+If you call @code{simple-viewer-run}, it enters the event
+loop and never returns.  If you wish to keep REPL and/or
+other parts of your application run concurrently, 
+the convenient way is to run @code{simple-viewer-run}
+in a separate thread.
+
+@example
+(use gauche.threads)
+
+(define (run-viewer)
+  (thread-start! (make-thread simple-viewer-run #f)))
+@end example
+
+See also the code under @file{examples/simple} directory
+of the source tree for more examples.
+@end deftp
+
+@defun simple-viewer-window name &key title mode parent width height x y
+Creates a new GL window with @var{name}, which must be a symbol
+to identify the window later in the simple viewer framework.
+The window won't be shown until @code{simple-viewer-run} is called.
+
+Each window 
+@end defun
+
+
+@defun simple-viewer-display &optional display-thunk
+Gets/sets the display thunk, which is called every time
+the GL window is redrawn.  You can change the display thunk
+any time, even while the viewer thread is running.
+
+If no argument is given, returns the current display thunk.
+It can be @code{#f} if no display thunk is set.
+
+When the display thunk is called, the matrix mode is 
+@code{MODELVIEW} and the camera transformation is already applied.
+The grid and axes are also drawn, unless you've customized them.
+
+In the display thunk you can just write your model in the
+world coordinate system.  It is guaranteed that
+the current color is white and line width is 1.0, but
+the states of other GL contexts are undefined,
+so you have to set them explicitly.
+@end defun
+
+@defun simple-viewer-reshape &optional reshape-proc
+Gets/sets the reshape procedure which is called every
+time the GL window configuration is changed.  (It is
+also called when the GL window is shown first time.)
+You can change the reshape procedure any time,
+even while the viewer thread is running.
+
+If no argument is given, returns the current reshape proc.
+
+A reshape procedure is called with two arguments,
+the width and the height (in pixels) of the new GL
+window configuration.  By default, @code{gl.simple.viewer}
+sets a procedure that changes viewport and
+projection matrix apopropriately; you need to change
+it only if you want a different behavior.
+@end defun
+
+@defun simple-viewer-grid &optional grid-proc
+@defunx simple-viewer-axis &optional axis-proc
+Gets/sets a procedure to draw a grid and axes.  
+You can change these procedures
+any time, even while the viewer thread is running.
+
+The @var{grid-proc} and @var{axis-proc} are called with no arguments
+every time the GL window is redrawn, before the display thunk
+is invoked.
+The matrix mode is @code{MODELVIEW}, the camera transformation
+is already applied, and lighting is disabled.
+
+The default grid proc draws 10x10 grid
+on X-Z plane centered at the origin.  The default axis proc
+draws a red line from origin to +X, a green line from origin to +Y,
+and a blue line from origin to +Z.  
+
+You can pass @code{#f} to disable grid and/or axis display.
+
+If no argument is given, returns the current grid/axis proc,
+respectively.
+@end defun
+
+@defun simple-viewer-set-key! key handler @dots{}
+Even number of arguments must be given; the first of
+every two specifies the key, and the next one
+specifies the action when the key is pressed.
+@end defun
+
+
+
 
 
 @c ======================================================================
-@node º÷°ú,   ,  Simple image handling,  Top
+@node º÷°ú,   ,  Simple utilities,  Top
 @appendix º÷°ú
 @c NODE º÷°ú