<?xml version="1.0" encoding="UTF-8"?>

<screensaver name="etruscanvenus" _label="Etruscan Venus" gl="yes">

  <video href="https://www.youtube.com/watch?v=p3MgGyie6-I"/>

  <command arg="--root"/>

  <hgroup>
    <select id="view-mode">
      <option id="walk"      _label="Random motion"/>
      <option id="walk"      _label="Walk"      arg-set="--view-mode walk"/>
      <option id="turn"      _label="Turn"      arg-set="--view-mode turn"/>
    </select>

    <boolean id="orientation-marks" _label="Show orientation marks"
              arg-set="--orientation-marks"/>
  </hgroup>

  <hgroup>
    <boolean id="deform" _label="Deform the surface"
              arg-unset="--no-deform"/>

    <number id="deform-speed" type="slider" arg="--deformation-speed %"
            _label="Deformation speed"
            _low-label="1.0" _high-label="100.0"
            low="1.0" high="100.0" default="10.0"/>

    <number id="init-deform" type="slider" arg="--initial-deformation %"
            _label="Initial deformation"
            _low-label="0.0" _high-label="3999.0"
            low="0.0" high="3999.0" default="0.0"/>
  </hgroup>


  <hgroup>

    <vgroup>
      <select id="display-mode">
        <option id="random"      _label="Random surface"/>
        <option id="wire"        _label="Wireframe mesh"      arg-set="--mode wireframe"/>
        <option id="surface"     _label="Solid surface"       arg-set="--mode surface"/>
        <option id="transparent" _label="Transparent surface" arg-set="--mode transparent"/>
      </select>

      <select id="appearance">
        <option id="random" _label="Random pattern"/>
        <option id="solid"  _label="Solid object"    arg-set="--appearance solid"/>
        <option id="bands"  _label="Distance bands"  arg-set="--appearance distance-bands"/>
        <option id="bands"  _label="Direction bands" arg-set="--appearance direction-bands"/>
      </select>

      <select id="colors">
        <option id="random"   _label="Random coloration"/>
        <option id="twosided" _label="One-sided"        arg-set="--colors one-sided"/>
        <option id="twosided" _label="Two-sided"        arg-set="--colors two-sided"/>
        <option id="rainbow"  _label="Distance colors"  arg-set="--colors distance"/>
        <option id="rainbow"  _label="Direction colors" arg-set="--colors direction"/>
      </select>

      <boolean id="change-colors" _label="Change colors"
                arg-unset="--no-change-colors"/>

      <select id="projection">
        <option id="random"       _label="Random Projection"/>
        <option id="perspective"  _label="Perspective"  arg-set="--projection perspective"/>
        <option id="orthographic" _label="Orthographic" arg-set="--projection orthographic"/>
      </select>
    </vgroup>

    <vgroup>
      <number id="speed-x" type="slider" arg="--speed-x %"
              _label="X rotation speed"
              _low-label="-4.0" _high-label="4.0"
              low="-4.0" high="4.0" default="1.1"/>

      <number id="speed-y" type="slider" arg="--speed-y %"
              _label="Y rotation speed"
              _low-label="-4.0" _high-label="4.0"
              low="-4.0" high="4.0" default="1.3"/>

      <number id="speed-z" type="slider" arg="--speed-z %"
              _label="Z rotation speed"
              _low-label="-4.0" _high-label="4.0"
              low="-4.0" high="4.0" default="1.5"/>
    </vgroup>

    <vgroup>
     <number id="walk-direction" type="slider" arg="--walk-direction %"
             _label="Walking direction"
             _low-label="-180.0" _high-label="180.0"
             low="-180.0" high="180.0" default="83.0"/>

     <number id="walk-speed" type="slider" arg="--walk-speed %"
             _label="Walking speed"
             _low-label="1.0" _high-label="100.0"
             low="1.0" high="100.0" default="20.0"/>

     <number id="delay" type="slider" arg="--delay %"
             _label="Frame rate" _low-label="Low" _high-label="High"
             low="0" high="100000" default="25000"
             convert="invert"/>
    </vgroup>

    <vgroup>
     <xscreensaver-updater />
     <boolean id="showfps" _label="Show frame rate" arg-set="--fps"/>
    </vgroup>

  </hgroup>

  <_description>
A 3D immersion of a Klein bottle that smoothly deforms between the
Etruscan Venus surface, the Roman surface, the Boy surface, and the
Ida surface.

Topologically, all surfaces are Klein bottles, even the Roman and Boy
surfaces, which are doubly covered and therefore appear to be an immersed
real projective plane.

You can walk on the Klein bottle or rotate it in 3D.  Since all the
surfaces except the Ida surfaces have points where the surface normal
is not well defined for some points, walking is performed on the Ida
surface.  Furthermore, it is possible to smoothly deform the surface
between the Etruscan Venus surface, the Roman surface, the Boy
surface, and the Ida surface surface while turning it.

Inspired by George K. Francis's book "A Topological Picturebook",
Springer, 1987, George K. Francis's paper "The Etruscan Venus" in
P. Concus, R. Finn, and D. A. Hoffman: "Geometric Analysis and
Computer Graphics", Springer, 1991, and a video entitled "The Etruscan
Venus" by Donna J. Cox, George K. Francis, and Raymond L. Idaszak,
presented at SIGGRAPH 1989.

https://en.wikipedia.org/wiki/Boy%27s_surface
https://en.wikipedia.org/wiki/Roman_surface
https://en.wikipedia.org/wiki/Klein_bottle
https://mathworld.wolfram.com/BoySurface.html
https://mathworld.wolfram.com/RomanSurface.html
https://mathworld.wolfram.com/EtruscanVenusSurface.html
https://mathworld.wolfram.com/IdaSurface.html

Written by Carsten Steger; 2020.
  </_description>
</screensaver>
