Improve povray examples.

Former-commit-id: b1101fe5b3a7b9bec0b6b92f303d42be8114d128
This commit is contained in:
David Himmelstrup 2019-12-05 17:17:22 +08:00
commit 8333d3d4f1
6 changed files with 370 additions and 39 deletions

View file

@ -5,80 +5,83 @@
module Main (main) where
import Reanimate
import Reanimate.Scene
import Reanimate.Animation
import Reanimate.Povray
import Reanimate.Raster
import Reanimate.Effect
import Data.String.Here
import Graphics.SvgTree hiding (Text)
import Data.Text (Text)
import Codec.Picture
import System.Random
import System.Random.Shuffle
import Control.Lens ((^.))
import Data.Monoid
import Control.Monad
import Codec.Picture.Types
main :: IO ()
main = reanimate $ mkAnimation 10 $ \t ->
let s = fromToS 0 4 t in
let rot = fromToS 0 (360) t in
mkGroup
[ mkBackground "black"
, povraySlow [] (script (svgAsPngFile (texture $ oscillateS t)) s rot)
-- , texture $ oscillateS t
]
main = reanimate $ parA bg $ sceneAnimation $ do
zPos <- newVar 0
xRot <- newVar 0
zRot <- newVar 0
s <- newSprite $ do
transZ <- freezeVar zPos
getX <- freezeVar xRot
getZ <- freezeVar zRot
return $ \real_t dur t ->
povraySlow [] $
script (svgAsPngFile (texture (t/dur))) (transZ real_t) (getX real_t) (getZ real_t)
wait 2
tweenVar zPos 9 (\t v -> fromToS v 8 (t/9))
tweenVar xRot 9 (\t v -> fromToS v 360 $ curveS 2 (t/9))
tweenVar zRot 9 (\t v -> fromToS v 360 $ curveS 2 (t/9))
wait 10
tweenVar zPos 2 (\t v -> fromToS v 0 $ curveS 3 (t/2))
wait 2
where
bg = animate $ const $ mkBackgroundPixel $ PixelRGBA8 252 252 252 0xFF
texture :: Double -> SVG
texture t = mkGroup
[ checker 10 10
, translate (screenWidth/2) 0 $
translate (-screenWidth*t) 0 $
withFillColor "red" $ mkCircle 3 ]
, frameAt (t*duration latexExample) latexExample ]
script :: FilePath -> Double -> Double -> Text
script png s rot = [iTrim|
//EXAMPLE OF SPHERE
//Files with predefined colors and textures
script :: FilePath -> Double -> Double -> Double -> Text
script png transZ rotX rotZ = [iTrim|
#include "colors.inc"
#include "glass.inc"
#include "golds.inc"
#include "metals.inc"
#include "stones.inc"
#include "woods.inc"
#include "shapes3.inc"
//Place the camera
camera {
perspective
//location <0,0,-9-${s*2}>
location <0,0,-9>
look_at <0,0,0>
up y
right x*16/9
}
//Ambient light to "brighten up" darker pictures
global_settings { ambient_light White*3 }
//Set a background color
//background { color White }
//background { color rgbt <0.1, 0, 0, 0> } // red
background { color rgbt <0, 0, 0, 1> } // transparent
polygon {
4,
//<-9, -4.5>, <-9, 4.5>, <9, 4.5>, <9, -4.5>
<0, 0>, <0, 1>, <1, 1>, <1, 0>
texture {
//pigment{ color rgb <0,1,0> }
pigment{
image_map{ png ${png} }
}
}
translate <-1/2,-1/2>
scale <16,9>
rotate <0,${rot},${rot}>
translate <0,0,${s*2}>
rotate <0,${rotX},${rotZ}>
translate <0,0,${transZ}>
}
|]
|]
checker :: Int -> Int -> SVG
checker w h =
@ -105,3 +108,81 @@ checker w h =
stepY = screenHeight/fromIntegral h
offsetX = screenWidth/2
offsetY = screenHeight/2
-----------------------------------
-- COPIED FROM tut_glue_latex.hs --
latexExample :: Animation
latexExample = sceneAnimation $ do
-- Draw equation
play $ drawAnimation strokedSvg
sprites <- forM glyphs $ \(fn, _, elt) ->
newSpriteA $ animate $ const $ fn elt
-- Yoink each glyph
forM_ (reverse sprites) $ \sprite -> do
spriteE sprite (overBeginning 1 $ aroundCenterE $ highlightE)
wait 0.5
-- Flash glyphs randomly with color
forM_ (shuffleList (sprites++sprites)) $ \sprite -> do
spriteE sprite (overBeginning 0.5 $ aroundCenterE $ flashE)
wait 0.1
wait 0.5
mapM_ destroySprite sprites
-- Undraw equations
play $ drawAnimation' (Just 0xdeadbeef) 1 0.1 strokedSvg
# reverseA
where
glyphs = svgGlyphs svg
strokedSvg =
withStrokeWidth (defaultStrokeWidth*0.5) $
withStrokeColor "black" svg
svg = lowerTransformations $ simplify $ scale 2 $ center $
latexAlign "\\sum_{k=1}^\\infty {1 \\over k^2} = {\\pi^2 \\over 6}"
shuffleList lst = shuffle' lst (length lst) (mkStdGen 0xdeadbeef)
highlightE :: Effect
highlightE d t =
scale (1 + bellS 2 (t/d)*0.5) . rotate (wiggleS (t/d) * 20)
flashE :: Effect
flashE d t =
withStrokeColor "black" .
withStrokeWidth (defaultStrokeWidth*0.5*bellS 2 (t/d)) .
withFillColorPixel (promotePixel $ turbo (t/d))
-- s-curve, sin, s-curve
wiggleS :: Signal
wiggleS t
| t < 0.25 = curveS 2 (t*4)
| t < 0.75 = sin ((t-0.25)*2*pi+pi/2)
| otherwise = curveS 2 ((t-0.75)*4)-1
--
drawAnimation :: SVG -> Animation
drawAnimation = drawAnimation' Nothing 0.5 0.3
drawAnimation' :: Maybe Int -> Double -> Double -> SVG -> Animation
drawAnimation' mbSeed fillDur step svg = sceneAnimation $ do
forM_ (zip [0..] $ shuf $ svgGlyphs svg) $ \(n, (fn, attr, tree)) -> do
let sWidth =
case toUserUnit defaultDPI <$> getLast (attr ^. strokeWidth) of
Just (Num d) -> d
_ -> defaultStrokeWidth
fork $ do
wait (n*step)
play $ mapA fn $ (animate (\t -> withFillOpacity 0 $ partialSvg t tree)
# applyE (overEnding fillDur $ fadeLineOutE sWidth))
fork $ do
wait (n*step+(1-fillDur))
newSprite $ do
return $ \_real_t _d t ->
withStrokeWidth 0 $ fn $ withFillOpacity (min 1 $ t/fillDur) tree
where
shuf lst =
case mbSeed of
Nothing -> lst
Just seed -> shuffle' lst (length lst) (mkStdGen seed)