? "=====================================================================\n",
  " A lake with a foreground shoreline with trees.  Hills and mountains\n",
  " with a rising moon in the background.\n",
  "=====================================================================\n";

!
! Setup our camera
!
CAMERA'POS = [10,-1000,50];
CAMERA'TARGET = [0,1000,0];

bark_tm     : texturemap( "bark1.ilbm" );
leaf_tm     : texturemap( "leaf2.ilbm" );

wavelets_bm : bumpmap( "wavelets2.ilbm" );


INTEGER
  REPLICAS = 1,

  LAKELEVEL = 6,
  HILLLEVEL = 5,
  SHORELEVEL = 5,
  MTNLEVEL = 5,

  MASTERSEED = 44,
  HILLSEED = MASTERSEED+100,
  SHORESEED = MASTERSEED+200,
  MTNSEED = MASTERSEED+300,
  TREESEED = MASTERSEED+401;

REAL
  HILLFACTOR = 0.25,
  SHOREFACTOR = 0.08,
  MTNFACTOR = 0.3,
  LIGHTNESS = 0.9;

!--------------------------------------------------------------------
!!-------------------------------------------------------------------
!!
!! Surfaces and colors
!!
!!-------------------------------------------------------------------
!--------------------------------------------------------------------

!                            ka   kd   ks    n    km   kr   ri   kb
SEASURFACE  : surface(PHONG, 0.2, 0.8, 0.2, 50.0, 0.5, 0.0, 0.0, 0.0, SILVER );
MOONSURFACE : surface(PHONG, 0.9, 0.2, 0.0,  0.0, 0.0, 0.0, 0.0, 0.0, TRANSLUCENT );
DULL        : surface(PHONG, 1.0, 1.0, 0.0,  0.0, 0.0, 0.0, 0.0, 0.0, 0 );


SEACOLOR    : COLOR( RGB, [0.30, 0.60, 0.75] );
LANDCOLOR   : COLOR( RGB, [0.30, 0.40, 0.00] );
SHORECOLOR  : COLOR( RGB, [0.50, 0.40, 0.00] );
MTNCOLOR1   : COLOR( RGB, [0.50, 0.45, 0.40]*0.7 );
MTNCOLOR2   : COLOR( RGB, [0.60, 0.50, 0.50] );
TREECOLOR   : COLOR( RGB, [0.35, 0.20, 0.10] );
LEAFCOLOR   : COLOR( RGB, [0.20, 0.40, 0.10] );
MOONCOLOR   : COLOR( RGB, [1.00, 0.90, 0.85] );


!--------------------------------------------------------------------
!!-------------------------------------------------------------------
!!
!! Specify our hill and mountain positions
!!
!!-------------------------------------------------------------------
!--------------------------------------------------------------------
 vector
   H1  = [  100, 1000,  80 ],      ! Hills
   H2  = [ -750,    0,  -1 ],
   H3  = [  350, -100, -10 ],

   H4  = [  500, 2000,  90 ],
   H5  = [ -400,  800,  -3 ],
   H6  = [ 1400, 1000,  -1 ],

   H7  = [ -800, 3000, 130 ],
   H8  = [    0,  800, -10 ],
   H9  = [-1600, 1000,  -1 ],

   SL1 = [    0,-1000,  30 ],   ! Shoreline
   SL2 = [  200, -700,  -1 ],
   SL3 = [ -200, -600,  -1 ],

   M1  = [  100, 2400,  50 ],   ! Mountains
   M2  = [-1200, 1900,  -1 ],
   M3  = [ 1000, 1900,  -1 ],

   M4  = [ 1000, 5000, 100 ],
   M5  = [ -200, 3000,  -1 ],
   M6  = [ 2800, 3000,  -1 ];


!--------------------------------------------------------------------
!!-------------------------------------------------------------------
!!
!! The lake surface
!!
!!-------------------------------------------------------------------
!--------------------------------------------------------------------
 real
   EDGE = 1.1 * CAMERA'WIDTH / (2 * CAMERA'FL);

 vector
   L0 = [         0, -1000, 0],
   L1 = [ EDGE*7000,  6000, 1],
   L2 = [-EDGE*7000,  6000, 1],
   L3 = [ EDGE*2000,  1000, 1],
   L4 = [-EDGE*2000,  1000, 1];

 polygon( @L1, @L2, @L4, @L3,  SEACOLOR, SEASURFACE, 0 );

 polygon( @[EDGE*2000,1000,1],
           @[-EDGE*2000,1000,1],
           @[-EDGE*2000,-1000,1],
           @[EDGE*2000,-1000,1 ],
           SEACOLOR,
           BUMP( SEASURFACE, wavelets_bm(1,1), 0, 3.5),
           0 );


!--------------------------------------------------------------------
!!-------------------------------------------------------------------
!!
!! Hillsides
!!
!!-------------------------------------------------------------------
!--------------------------------------------------------------------
 landscape( HILLSEED+101, HILLLEVEL, HILLFACTOR,
           H1, H2, H3,
           LANDCOLOR, DULL, PHONG|STRAIGHTEDGES );

 landscape( HILLSEED+105, HILLLEVEL, HILLFACTOR,
           H4, H5, H6,
           LANDCOLOR, DULL, PHONG|STRAIGHTEDGES );

 landscape( HILLSEED+125, HILLLEVEL, HILLFACTOR,
           H7, H8, H9,
           LANDCOLOR, DULL, PHONG|STRAIGHTEDGES );

!--------------------------------------------------------------------
!!-------------------------------------------------------------------
!!
!! Background mountains
!!
!!-------------------------------------------------------------------
!--------------------------------------------------------------------
 landscape( MTNSEED+2, MTNLEVEL, MTNFACTOR,
           M1, M2, M3,
           LANDCOLOR, DULL, PHONG|STRAIGHTEDGES );

 landscape( MTNSEED+31, MTNLEVEL, MTNFACTOR,
           M4, M5, M6,
           LANDCOLOR, DULL, PHONG|STRAIGHTEDGES );


!--------------------------------------------------------------------
!!-------------------------------------------------------------------
!!
!! Foreground shoreline
!!
!!-------------------------------------------------------------------
!--------------------------------------------------------------------
 landscape( SHORESEED+1,SHORELEVEL, SHOREFACTOR,
           SL1, SL2, SL3,
           SHORECOLOR, DULL, PHONG|STRAIGHTEDGES );

!
!!
!! Trees and shrubs
!!
!
 bark : texture(plane, bark_tm, CAMERA'POS, [0,1,0], [1,0,0],
     10,10,10, 1,1, SMOOTH3|REPEAT );

 treespec OAK;
  OAK'FLAGS       = PHONG|LEAVES;
  OAK'DROOP       = -0.13;
  OAK'TWIST       = 0.4;
  OAK'BEND        = 0.45;
  OAK'TAPER       = 0.995;
  OAK'GROWLEN     = 4.0;
  OAK'BRANCHODDS  = 0.80;
  OAK'BRANCHANGLE = 0.5;
  OAK'FORKDELAY   = 2;
  OAK'MINFORK     = 0.35;
  OAK'TWIGSIZE    = 0.29;
  OAK'LEAFSIZE	  = 1.2;
  OAK'LEAFRADIUS  = 2.2;
  OAK'TRUNKSURF   = DULL;
  OAK'TRUNKCOLOR  = bark;
  OAK'LEAFSURF    = DULL;
  OAK'LEAFCOLOR   = leaf_tm;

 root_tree : boundary([-5,-800,0])
   tree( TREESEED+12, [-5,-800,0], 5.1, OAK );
 endboundary

 if (REPLICAS) {
   replica( root_tree, [-50,-710,0], [0,0,50] );
   replica( root_tree, [65,-700,0], [0,0,120] );
 }

!--------------------------------------------------------------------
!!-------------------------------------------------------------------
!!
!! Sources of light
!!
!!-------------------------------------------------------------------
!--------------------------------------------------------------------

 vector  AMBIENTLIGHT = [0.2,0.2,0.2] * LIGHTNESS;

 star( [-80000,-100000,200000], [1.30,0.90,0.60]*LIGHTNESS, 100 );
 ambient( [0,0,10000], AMBIENTLIGHT, [0,0,1], 0.0, 0.0 );

!--------------------------------------------------------------------
!!-------------------------------------------------------------------
!!
!! Background stuff
!!
!!-------------------------------------------------------------------
!--------------------------------------------------------------------
 vector  SKYZEN = [0.01, 0.01, 0.20] * LIGHTNESS,
         SKYHOR = [0.70, 0.85, 0.90] * LIGHTNESS;

 background( SKY, SKYHOR, SKYZEN, SKYZEN, 0.8 );
 sethaze( BACKGROUND, 4000, 4000, 40000, 5.0 );

!--------------------------------------------------------------------
!!-------------------------------------------------------------------
!!
!! Background stuff
!!
!!-------------------------------------------------------------------
!--------------------------------------------------------------------
 render;

END
