Parse the Blossom action
authorJoachim Breitner <mail@joachim-breitner.de>
Sat, 30 May 2009 12:57:29 +0000 (14:57 +0200)
committerJoachim Breitner <mail@joachim-breitner.de>
Sat, 30 May 2009 12:58:53 +0000 (14:58 +0200)
src/Lseed/Data.hs
src/Lseed/Grammar.hs
src/Lseed/Grammar/Compile.hs
src/Lseed/Grammar/Parse.hs
src/Lseed/LSystem.hs
src/Lseed/Renderer/Cairo.hs

index 5fbe6b4..5285037 100644 (file)
@@ -64,6 +64,7 @@ type AnnotatedPlant = Plant StipeInfo
 data LRuleAction
        = EnlargeStipe UserTag Double -- ^ Extend this Stipe to the given length
         | ForkStipe UserTag Double [(Angle, Double, UserTag)] -- ^ Branch this stipe at the given fraction and angles and let it grow to the given lengths
+       | DoBlossom -- ^ Start a to grow a new seed
        deriving (Show)
 
 -- | A (compiled) rule of an L-system, with a matching function returning an action and weight
index 1036e78..89f80fd 100644 (file)
@@ -55,6 +55,7 @@ data Condition
 data GrammarAction
        = SetLength (Maybe UserTag) LengthDescr
        | AddBranches (Maybe UserTag) Double [(Angle, Double, Maybe UserTag)]
+       | Blossom
        deriving (Read,Show)
 
 data LengthDescr = Absolute Double
index 07d1d9c..1d8f3a1 100644 (file)
@@ -43,6 +43,8 @@ grToLAction (SetLength mut ld) (Plant { pLength = l, pUserTag = oldUt })
 grToLAction (AddBranches mut frac branches) (Plant { pLength = l, pUserTag = oldUt })
        = ForkStipe (fromMaybe oldUt mut) frac $
                map (\(a,b,c) -> (a,b,fromMaybe oldUt c)) branches
+grToLAction Blossom _ 
+       = DoBlossom
 
 -- | Length reductions are silenty turned into no-ops
 calcLengthDescr :: LengthDescr -> Double -> Double
index 5708ca4..6228a90 100644 (file)
@@ -12,7 +12,7 @@ import Lseed.Grammar
 lexer       = P.makeTokenParser $ javaStyle
        { P.reservedNames = ["RULE", "WHEN", "SET", "Tag", "Light", "Branch", "At",
                             "Length", "Light", "Sublength", "Sublight", "Direction", "Angle",
-                            "BY", "TO", "IMPORTANCE", "WEIGHT"]
+                            "BY", "TO", "IMPORTANCE", "WEIGHT", "Blossom"]
        }
 
 parens      = P.parens lexer
@@ -80,7 +80,7 @@ pTagTest = do
        return (UserTagIs value)
 
 pAction :: Parser GrammarAction
-pAction = pBranch <|> pGrow
+pAction = pBranch <|> pGrow <|> pBlossom
 
 pBranch :: Parser GrammarAction
 pBranch = do
@@ -133,7 +133,12 @@ pGrow = do
                reserved "TO"
                value <- pFloat
                return (Absolute value)
-               
+
+pBlossom :: Parser GrammarAction
+pBlossom = do
+       reserved "BLOSSOM"
+       return Blossom
+
 pMatchable =
        choice $ map (\(a,b) -> const b `fmap` reserved a) $
                [ ("LIGHT", MatchLight)
index f508bdf..d315ea8 100644 (file)
@@ -11,6 +11,9 @@ import Data.List
 applyLSystem :: RandomGen g => g -> LSystem -> AnnotatedPlant -> GrowingPlant
 applyLSystem rgen rules plant = go plant
   where applyAction :: AnnotatedPlant -> LRuleAction -> GrowingPlant
+       applyAction (Plant _ oldSize ang ut ps) DoBlossom
+               = Plant (GrowingSeed 0) oldSize ang ut $
+                  map go ps
        applyAction (Plant _ oldSize ang _ ps) (EnlargeStipe ut newSize) 
                = Plant (EnlargingTo newSize) oldSize ang ut $
                   map go ps
index dc21f26..2786a33 100644 (file)
@@ -153,7 +153,7 @@ renderInfo angle garden = do
                let text1 = printf "Light: %.2f" $
                                siSubLight . pData . phenotype $ planted
                let text2 = printf "Size: %.2f" $
-                               siSubSize . pData . phenotype $ planted
+                               siSubLength . pData . phenotype $ planted
                preserve $ do
                        scale 1 (-1)
                        setSourceRGB 0 0 0