  /*
  Keyboard and Mouse controls:
  hold down key then point and left-click with mouse
  '
  implemented:
  ============

  'hold down key, point and click
  -------------------------------
  M    move
  N    node / point
  L    line (point to point)
  P    polygon (point series)
  C    set color
  G    show grid (toggle)
  Q    show OBJ format
  Z    consolidate / pack / remove deleted items
  Del  delete

  ctrl P    screen snapshot

  hold down keys
  --------------
  ctrl +    zoom in
  ctrl -    zoom out
  

  '
  proposed:
  =========

  keyboard tier keys (2 key system)
  ---------------------------------
  ctrl
  shift
  tab
  space


  I    insert point on line / polygon
  '
  D         draw straight lines
  F         free form draw

  shift G   grid lock

  ctrl C    copy
  ctrl X    cut
  ctrl V    paste
  ctrl E    edit obj file
  ctrl O    open file
  ctrl S    save file
  ctrl I    include obj file
  ctrl Z    undo

  other actions
  -------------
  Drag and Drop

  */

  /*
  ==========
  obj format
  ==========
  '
  https://en.wikipedia.org/wiki/Wavefront_.obj_file
  https://paulbourke.net/dataformats/mtl/
  https://www.turbosquid.com/Search/3D-Models/free/obj

  # this is a comment
  List of geometric vertices, with (x, y, z, [w]) coordinates,
 w is optional and defaults to 1.0.
  v 0.123 0.234 0.345 1.0
  v ...
  # List of texture coordinates, in (u, [v, w]) coordinates,
  these will vary between 0 and 1. v, w are optional and default to 0.
  vt 0.500 1 [0]
  vt ...
  ...
  # List of vertex normals in (x,y,z) form; normals might
   not be unit vectors.
  vn 0.707 0.000 0.707
  vn ...
  ...
  # Parameter space vertices in (u, [v, w]) form; free form
  geometry statement (see below)
  vp 0.310000 3.210000 2.100000
  vp ...
  ...
  # Polygonal face element (see below)
  f 1 2 3
  f 3/1 4/2 5/3
  f 6/4/1 3/5/3 7/6/5
  f 7//1 8//2 9//3
  f ...
  ...
  f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 ...


  # Line element (see below)
  l 5 8 1 2 4 9

  materials:
  mtllib [external .mtl file name]
  ...

  usemtl [material name]
  ...

  o [object name]
  ...
  g [group name]
  ...

  s 1
  ...
  # Smooth shading can be disabled as well.
  s off
  ...

  # define a material named 'Colored'
  newmtl Colored
  The ambient color of the material is declared using Ka. Color definitions
  are in RGB where each channel's value is between 0 and 1.
 
  # white
  Ka 1.000 1.000 1.000
  Similarly, the diffuse color is declared using Kd.

  # white
  Kd 1.000 1.000 1.000
  The specular color is declared using Ks, and weighted using the
  specular exponent Ns.

  # black (off)
  Ks 0.000 0.000 0.000

  # ranges between 0 and 1000
  Ns 10.000

  # some implementations use 'd'
  d 0.9
  # others use 'Tr' (inverted: Tr = 1 - d)
  Tr 0.1
  Transparent materials can additionally have a Transmission Filter
  Color, specified with "Tf".

  # Transmission Filter Color (using R G B)
  Tf 1.0 0.5 0.5 
  # Transmission Filter Color (using CIEXYZ) - y and z values are
  optional and assumed to be equal to x if omitted
  Tf xyz 1.0 0.5 0.5 
  # Transmission Filter Color from spectral curve file (not commonly used)
  Tf spectral <filename>.rfl <optional factor>

  A material can also have an optical density for its surface.
  This is also known as index of refraction.

  # optical density
  Ni 1.45000
  illumination models
  0. Color on and Ambient off
  1. Color on and Ambient on
  2. Highlight on
  3. Reflection on and Ray trace on
  4. Transparency: Glass on, Reflection: Ray trace on
  5. Reflection: Fresnel on and Ray trace on
  6. Transparency: Refraction on, Reflection: Fresnel off and Ray trace on
  7. Transparency: Refraction on, Reflection: Fresnel on and Ray trace on
  8. Reflection on and Ray trace off
  9. Transparency: Glass on, Reflection: Ray trace off
  10. Casts shadows onto invisible surfaces
  illum 2


  */

