Prototyp snehuliaka v Úlohe 2

Pre model snehuliaka je vytvorený všeobecný prototyp SNOWMAN s interfacom

  PROTO SNOWMAN [
    field SFInt32 tex 1  # textures ON/OFF
    field SFInt32 det 1  # details ON/OFF
    field SFInt32 sph 1  # spheres/boxes
  ] {...}
ktorý umožňuje jednotlivými prepínačmi nezávisle zapnúť/vypnúť (1/0) textúry, malé detaily a použitie gúľ/kvádrov. Ten je využívaný prototypom SNOWMALE, ktorý má navyše špecifické doplnky (činky, hrniec) a umožňuje nastaviť farbu a textúru hrnca. Snehuliak má 5 úrovní detailu: plný, potom zmiznú textúry, potom aj detaily, potom sa oblé primitívy zmenia na kvádre a nakoniec jediný snehový kváder, ktorý pri ešte väčšej vzdialenosti zmizne. Jednotlivé úrovne detailu sú samostatnými prototypmi full, medium, draft, boxed a onebox určujúcimi príslušné nastavenia prepínačov, napr.
  PROTO full [
    exposedField SFColor pot_color .1 .15 .5
    exposedField MFString pot_texture "granitetex.png"
  ]
  { SNOWMALE { tex 1, det 1, sph 1, pot_color IS pot_color, pot_texture IS pot_texture } }
  
  PROTO medium [
    exposedField SFColor pot_color .1 .15 .5
  ]
  { SNOWMALE { tex 0, det 1, sph 1, pot_color IS pot_color } }

  PROTO draft [
    exposedField SFColor pot_color .1 .15 .5
  ]
  { SNOWMALE { tex 0, det 0, sph 1, pot_color IS pot_color } }
  
  ...
atď. Tieto implementačné záležitosti sú skryté v pomocnom súbore snowman_proto.wrl. Aplikačný súbor snowman.wrl definujúci časť sveta so snehuliakmi má k dispozícii len jednotlivé úrovne modelu ako
  EXTERNPROTO FullSnowman [
    exposedField SFColor pot_color
    exposedField MFString pot_texture
  ]
    "snowman_proto.wrl#full"
  ...
atď. a sám určí v akých vzdialenostiach sa tieto úrovne použijú pomocou range[...] (alebo nastaví vždy plný model ak lod=0) v konečnom prototype snehuliaka
  PROTO Snowman [
    field SFInt32 lod 1
    exposedField SFColor pot_color .1 .15 .5
    exposedField MFString pot_texture "granitetex.png"
  ]
  {
    Switch {
      whichChoice IS lod
      choice [
        FullSnowman { pot_color IS pot_color, pot_texture IS pot_texture }
        LOD {
          level [
            FullSnowman { pot_color IS pot_color, pot_texture IS pot_texture }
            MediumSnowman { pot_color IS pot_color }
            DraftSnowman { pot_color IS pot_color }
            BoxedSnowman { pot_color IS pot_color }
            SnowBox {}
            Group {}
          ]
          range [ 10 20 40 70 110 ]
        }
      ]
    }
  }


Update: J. Semančík, 19. 11. 2002