/* CFDG Lesson */

startshape TOC
	// each grammar file must
	// have a "startshape"
	// statement to say which
	// shape to begin with

rule TOC {
	// a "rule" statement says how
	// to compose a shape out of
	// other shapes

    CHAPTER1 { x 0 y 0 }
    CHAPTER2 { x 10 y 0 }
    CHAPTER3 { x 0 y -10 }
    CHAPTER4 { x 10 y -10 }
	// each entry in the rule
	// names a shape to draw and
	// some "adjustments" in curly
	// braces

    TITLES { }
}

rule CHAPTER1 {
    ## BASIC SHAPES ##
    SQUARE { x 2 y 5 size 3 }
    CIRCLE { x 6 y 5 size 3 }
    TRIANGLE { x 4 y 2 size 3 }
	// these shapes are special:
	// they draw a shape into the
	// image, centered at the
	// current location
    SHAPES { y 1 size 3 }
	// This tells you the relative
	// sizes and positions of each
	// basic shape.
}

rule SHAPES {
	SQUARE {}
	CIRCLE {b 0.3}
	TRIANGLE {b 0.5}
	TRIANGLE {r 60 b 0.7}
}

rule CHAPTER2 {
    ## BASIC ADJUSTMENTS ##
    SQUARE { }
	// empty adjustments
	// this is the lone square in
	// chapter 2's area

    SQUARE { x 3 y 7 }
	// adjust location

	// even though adjustments
	// are written after the shape
	// they are applied before!

    SQUARE { x 5 y 7 rotate 30 }
	// adjust rotation
    SQUARE { x 3 y 5 size 0.75 }
	// adjust size

	// notice that rotation and size
	// are adjusted after location

    SQUARE { x 5 y 5
        brightness 0.5 }
	// adjust brightness

    SQUARE { x 7 y 6
	// shorthands:
        r 45 // for rotate
        s 0.7 // for size
        b 0.7 // for brightness
    }

    FOURSQUARE { x 5 y 1
        size 0.2 rotate 10 }
	// adjustments are cumulative
}
rule FOURSQUARE {
    SQUARE { x 0 y 0 size 5  3}
    SQUARE { x 0 y 5 size 2 4 }
    SQUARE { x 5 y 5 size 3 }
    SQUARE { x 5 y 0 size 2 }
	// even though these are
	// at locations and sizes
	// that seem big, they have
	// all been relocated, scaled
	// and rotated when the rule
	// for CHAPTER2 used
	// FOURSQUARE
	// Two SQUAREs have been
	// have been turned into
	// rectangles
}

rule CHAPTER3 {
    ## RECURSION ##
    SPIRAL { x 0 y 3 }
}
rule SPIRAL {
    CIRCLE { size 0.5 }
    SPIRAL { y 0.2
         rotate -3
         size 0.995 }
	// a shape can use itself so
	// long as it keeps getting
	// smaller

	// the system will stop the
	// recursion when the shapes
	// get too small to see
}

rule CHAPTER4 {
    ## RANDOMNESS ##
    TREE { x 1 y 0 }
    TREE { x 6 y 0 }
    TREE { x 1 y 4 }
    TREE { x 6 y 4 }
	// even though these are the
	// same shape used four
	// times, each looks different
}
rule TREE 20 {
	// first rule for TREE
    CIRCLE { size 0.25 }
    TREE { y 0.1 size 0.97 }
}
rule TREE 1.5 {
	// second rule for TREE
    BRANCH {  }
}
// When expanding a TREE, a
// rule is picked randomly.
// The first rule has been given a
// weight of 20, the second of 1.5,
// so the first will be picked
// proportionally more often

rule BRANCH {
    BRANCH_LEFT { }
    BRANCH_RIGHT { }
}
rule BRANCH_LEFT {
    TREE { rotate 20 }
}
rule BRANCH_LEFT {
    TREE { rotate 30 }
}
rule BRANCH_LEFT {
    TREE { rotate 40 }
}
rule BRANCH_LEFT {
	// empty rules are okay
}
// If no weight is given for a rule
// the weight is 1.  Hence, the
// above four rules are picked
// equally randomly

rule BRANCH_RIGHT {
    TREE { rotate -20 }
}
rule BRANCH_RIGHT {
    TREE { rotate -30 }
}
rule BRANCH_RIGHT {
    TREE { rotate -40 }
}
rule BRANCH_RIGHT {
	// empty rules are okay
}



## Utilities ##
include i_pix.cfdg
// The "include" statement reads
// in all the rules from another file.
// Any "startshape" in the included
// file is ignored.

rule TITLES {
	TITLE1 { x 0 y 8.5 }
	TITLE2 { x 10 y 8.5 }
	TITLE3 { x 0 y -1.5 }
	TITLE4 { x 10 y -1.5 }
}
rule TITLE1 {
	O_5by5 { x 0 }
	N_5by5 { x 1.2 }
	E_5by5 { x 2.4 }
}
rule TITLE2 {
	T_5by5 { x 0 }
	W_5by5 { x 1.2 }
	O_5by5 { x 2.4 }
}
rule TITLE3 {
	T_5by5 { x 0 }
	H_5by5 { x 1.2 }
	R_5by5 { x 2.4 }
	E_5by5 { x 3.6 }
	E_5by5 { x 4.8 }
}
rule TITLE4 {
	F_5by5 { x 0 }
	O_5by5 { x 1.2 }
	U_5by5 { x 2.4 }
	R_5by5 { x 3.6 }
}
