; lephisto-planet.creator.scm
; Creates a planet.
;
; The script will create its own menu in the toolbox.

(define (lephisto-planet-creator planetSize planetColor sunAngle sunTilt glowSize)

 (let*

     (
      	; 1/10th of the planet size
      	(tenth (/ planetSize 10) )
      	
	; Image size 10% bigger than the planet
      	(imgSize (+ planetSize (* tenth 2)) )

      	; Getting the inverse of the glowSize so it makes more sense to the user
	(glowSizeInv (/ 1 glowSize))
      
      	(theImage (car (gimp-image-new imgSize  imgSize RGB) ))
      	(layerbase (car (gimp-layer-new theImage imgSize imgSize 0 "planet base" 100 NORMAL) ) )
      	(layeratmosph (car (gimp-layer-new theImage imgSize imgSize 0 "planet atmosphere" 100 NORMAL) ) )
      	(layershadow (car (gimp-layer-new theImage imgSize imgSize 0 "planet shadow" 100 NORMAL) ) )
      	(layerglow (car (gimp-layer-new theImage imgSize imgSize 0 "planet glow" 100 NORMAL) ) )
      	(angleRad (/ (* sunAngle *pi*) 180))
      	(transX (* (sin angleRad) -1))
      	(transY (cos angleRad))
     )

   	(gimp-context-push)
   	(gimp-image-undo-disable theImage)

   	(gimp-layer-add-alpha layerbase )
   	(gimp-layer-add-alpha layeratmosph )
   	(gimp-layer-add-alpha layershadow )
   	(gimp-layer-add-alpha layerglow )

   	(gimp-image-add-layer theImage layerglow 0)
   	(gimp-image-add-layer theImage layerbase 0)
   	(gimp-image-add-layer theImage layeratmosph 0)
   	(gimp-image-add-layer theImage layershadow 0)

   	(gimp-selection-all theImage)
   	(gimp-edit-clear layerbase)
   	(gimp-edit-clear layeratmosph)
   	(gimp-edit-clear layershadow)
   	(gimp-edit-clear layerglow)
   	(gimp-selection-none theImage)


   	(gimp-ellipse-select theImage tenth tenth planetSize planetSize 2 0 0 0 )
   	(gimp-context-set-foreground planetColor)
   
	; Fill selection with the planet color
   	(gimp-edit-bucket-fill layerbase 0 0 100 0 FALSE 0 0 )
   	(gimp-edit-bucket-fill layeratmosph 0 0 100 0 FALSE 0 0 )
   
	; Shrink and blur for the shadow
   	(gimp-selection-feather theImage (* 1.5 tenth) )
   	(gimp-context-set-background '(0 0 0) )
   	(gimp-edit-bucket-fill layershadow 1 0 100 0 FALSE 0 0 );;
   
	; Add the light around the planet for the atmosphere
   	(gimp-selection-layer-alpha layeratmosph)
   	(gimp-selection-shrink theImage tenth)
  	(gimp-selection-feather theImage (* 2 tenth))
   	(gimp-layer-set-preserve-trans layeratmosph 1)
   	(gimp-selection-invert theImage)
   	(gimp-context-set-background '(255 255 255) )
   	(gimp-edit-bucket-fill layeratmosph 1 5 90 0 FALSE 0 0 )
   	(gimp-selection-invert theImage)
   	(gimp-context-set-foreground '(0 0 0) )
   	(gimp-edit-bucket-fill layeratmosph 0 0 100 0 FALSE 0 0 )
   	(gimp-selection-layer-alpha layeratmosph)
   	(gimp-selection-shrink theImage (/ tenth 3))
   	(gimp-selection-feather theImage tenth)
   	(gimp-selection-invert theImage)
   	(gimp-edit-bucket-fill layeratmosph 1 0 85 0 FALSE 0 0 )
   	(gimp-layer-set-mode layeratmosph 4) 
   
   	; Move,resize the shadow layer
   	(gimp-layer-scale layershadow (* (+ 1.5 (/ sunTilt 10)) imgSize)  (* (+ 1.5 (/ sunTilt 10)) imgSize) 1 )
   	(gimp-layer-translate layershadow (* (* transX tenth) (+ 3 sunTilt) ) (* (* transY tenth) (+ 3 sunTilt) ) )

   	; And now the glow...
   	(gimp-selection-layer-alpha layerbase)
   	(gimp-selection-grow theImage (/ tenth glowSizeInv))
   	(gimp-selection-feather theImage tenth)
   	(gimp-context-set-background planetColor )
   	(gimp-edit-bucket-fill layerglow  1 0 100 0 FALSE 0 0 )
   	(gimp-edit-bucket-fill layerglow  1 7 100 0 FALSE 0 0 )
   	(gimp-edit-bucket-fill layerglow  1 7 100 0 FALSE 0 0 )
   
   	; Mask a part of the glow
   	(set! glowmask (car (gimp-layer-create-mask layerglow 0)))
   	(gimp-image-add-layer-mask theImage layerglow glowmask)
   	(gimp-selection-layer-alpha layershadow)
   	(gimp-edit-bucket-fill glowmask  0 0 100 0 FALSE 0 0 )
   	(gimp-selection-all theImage)
   	(gimp-fuzzy-select layerbase (/ imgSize 2) (/ imgSize 2) 15 1 1 0 0 0)
   	(gimp-edit-cut layershadow)
   	(gimp-layer-resize-to-image-size layershadow)

   	(gimp-image-clean-all theImage)
   	(gimp-image-undo-enable theImage)
   	(gimp-display-new theImage)
   	(gimp-context-pop)
	)
)

(script-fu-register "lephisto-planet-creator"
                   _"Lephisto Planet Creator"
                   "Creates a planet. (For use in Lephisto)"
                   "http://saracraft.net"
                   "10/02/2013"
                   ""
                   SF-ADJUSTMENT "Planet Size (pixels)" '(80 40 2000 1 10 0 1)
                   SF-COLOR "Planet Color" '(10 70 100)
                   SF-ADJUSTMENT _"Sun Orientation (degrees) " '(0 0 360 1 10 1 0) 
		   SF-ADJUSTMENT _"Sun Tilt " '(1 0 25 1 10 1 0)
		   SF-ADJUSTMENT _"Glow Size" '(.25 .1 .6667 1 2 1 0) 
		   )
(script-fu-menu-register "script-fu-lephisto-planet-render2"
                        _"<Toolbox>/Lephiso/")