рдореИрдВ рдЕрдВрддрд░рд┐рдХреНрд╖ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рд╢реИрд▓реА рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЦреЗрд▓ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реВрдВред рдкреНрд░рдореБрдЦ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЧреЗрдо рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдЧреЗрдо рддрддреНрд╡реЛрдВ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреА рднрд╛рд╖рд╛ рдХрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдПрдХ рдЖрд╕рд╛рди рдХрд╛рдо рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреА "рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХрддрд╛" рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдФрд░ "рдкрд╛рдард╛рддреНрдордХ рдкреНрд░рдХреГрддрд┐" рдирд╣реАрдВ рд╣реИред рдпрд╣реА рд╣реИ, рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рд╡рд┐рднрд┐рдиреНрди рдЧреНрд░рд╛рдлрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЙрдирдХреЗ рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдХреЗ рд░реЗрдЦрд╛рдЪрд┐рддреНрд░ рдЦреАрдВрдЪрддреЗ рд╣реБрдП, рдореИрдВ рдЕрдЪрд╛рдирдХ рдЦреБрдж рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛ рдЧрдпрд╛ рдФрд░ рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рднрд╛рд╖рд╛ рдХреЗ рдмрдЬрд╛рдп рдореИрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рд▓рдЧрд╛ред рдпрд╣ рдЗрддрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рдирд┐рдХрд▓рд╛ рдХрд┐ рдореИрдВ рдХреЗрд╡рд▓ рд░реЗрдЦрд╛рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд░реЗрдЦрд╛рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдирд╣реАрдВ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рдерд╛ред рдЬрдирд╡рд░реА 2012 рдореЗрдВ, рдореИрдВрдиреЗ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдФрд░ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реБрдЖ ...

рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд╕рд╛рд░реНрдердХ рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдЧреНрд░рд╛рдлрд┐рдХ рддрддреНрд╡реЛрдВ рдХреЛ рдореИрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХреЛрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдРрд╕реА рдЗрдХрд╛рдЗрдпрд╛рдБ рднрд╛рд╖рд╛ рдХрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рддрддреНрд╡ рд╣реЛрдВрдЧреА, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рд╣рдореЗрдВ рдХреЛрдб рдХреЛ рдПрдХ рд╕рд╛рд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЯреНрд░реА (рдПрдПрд╕рдЯреА) рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬреАрдПрдЪрд╕реА рдХрдВрдкрд╛рдЗрд▓рд░ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕реЗ рдмрд╛рдВрдзрдиреЗ рд╡рд╛рд▓реЗ рднреА рд╣реИрдВ рдЬреЛ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдХреЛрди рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЬреАрдПрдЪрд╕реА рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕реНрдХреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдордХреНрдЦреА рдкрд░ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдФрд░ рддреНрд░реБрдЯрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХреНрд▓рд┐рдкреНрд╕ рдПрдлрдкреА рдореЗрдВред рдФрд░ рд╡рд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрд╕рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдЬреЛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╢реБрд░реБрдЖрддреА рдЪрд░рдгреЛрдВ рдореЗрдВ рдмреЗрдХрд╛рд░ рдерд╛ред рдореИрдВ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ, рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдерд╛, рд╕рд░рд▓ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд: Language.Haskell рдкреБрд╕реНрддрдХрд╛рд▓рдпред
Language.Haskell.Parser рдореЙрдбреНрдпреВрд▓, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмрд┐рдирд╛, Haskell'98 рдХреЛрдб (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рд▓рдЧрднрдЧ рдмрд┐рдирд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ) рд╕рд╛рдл рдХрд╛ рдПрдХ рдкрд╛рд░реНрд╕рд░ рд╣реИред "рдЙрдиреНрдирдд" рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢реБрд░реБрдЖрдд рдореЗрдВ Haskell'98 рд╣реА рдЖрдВрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдЦрд░рдЧреЛрд╢ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рднрд╛рдЬреНрдп рдЧрдгрдирд╛ рдХреЛрдб рд▓рд┐рдпрд╛:
рддрдереНрдп 'рдПрди | n == 0 = 1
| рдЕрдиреНрдпрдерд╛ = рддрдереНрдп ' ( n - 1 ) * n
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреНрд░рд╛рдердорд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рднрд╛рд╖рд╛ рдЖрдпрд╛рдд рдХрд░реЗрдВ ред рд╣рд╛рд╕реНрдХреЗрд▓ ред рдкрд╛рд░реНрд╕рд░
рдореБ рдп = рдХрд░рдирд╛
s <- readFile "Fact.hs"
рдЖрдЬреНрдЮрд╛ рджреЗрдирд╛ = рдкрд╛рд░рд╕реЗрдпреЛрджрдп рдХрд░рдирд╛
putStrLn ред $ рдкрд╛рд░реНрд╕ рджрд┐рдЦрд╛рдУ
ParseModule рдлрд╝рдВрдХреНрд╢рди рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ:
parseModule :: рд╕реНрдЯреНрд░рд┐рдВрдЧ -> ParseResult HsModule
рдЬрд╣рд╛рдБ рдкрд╣рд▓рд╛ рддрд░реНрдХ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛрдб рд╣реИ, рдФрд░ HsModule рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред HsModule рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Language.Haskell.Syntax рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреА рдкреНрд░рдХрд╛рд░ рд╕рдВрд░рдЪрдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдПрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рд╛рд╕реНрдХреЗрд▓'98 рд╕рдмрд╕реЗрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ:
ParseOk
( HsModule
( SrcLoc { srcFilename = "<рдЕрдЬреНрдЮрд╛рдд>" , srcLine = 3 , srcColumn = 1 } )
( рдореЙрдбреНрдпреВрд▓ "рдореБрдЦреНрдп" )
( рдмрд╕ ( HsEVar ( UnQual ( HsIdent "main" ) ) ) ) ]
[ ]
[ HsFunBind
[ HsMatch
( SrcLoc { srcFilename = "<рдЕрдЬреНрдЮрд╛рдд>" , srcLine = 3 , srcColumn = 1 } )
( HsIdent "fact '" )
[ HsPVar ( HsIdent "n" ) ]
( HsGuardedRhss
[ HsGuardedRhs
( SrcLoc { srcFilename = "<рдЕрдЬреНрдЮрд╛рдд>" , srcLine = 3 , srcColumn = 9 } )
( HsInfixApp
( HsVar ( UnQual ( HsIdent "n" ) ) )
( HsQVarOp ( UnQual ( HsSymbol "==" ) ) )
( HsLit ( HsInt 0 ) ) )
( HsLit ( HsInt 1 ) )
, HsGuardedRhs
( SrcLoc { srcFilename = "<рдЕрдЬреНрдЮрд╛рдд>" , srcLine = 4 , srcColumn = 9 } )
( HsVar ( UnQual ( HsIdent "рдЕрдиреНрдпрдерд╛" ) ) )
( HsInfixApp
( HsApp
( HsVar ( UnQual ( HsIdent "fact '" ) ) )
( рдПрдЪ.рдПрд╕ рдкрд╛рд░реЗрди
( HsInfixApp
( HsVar ( UnQual ( HsIdent "n" ) ) )
( HsQVarOp ( UnQual ( HsSymbol "-" ) ) ))
( HsLit ( HsInt 1 ) ) ) )
( HsQVarOp ( UnQual ( HsSymbol "*" ) ) )
( HsVar ( UnQual ( HsIdent "n" ) ) ) ) ]] [ ] ] ]
рдЧреНрд░рд╛рдлрд╕рд░реНрд╡рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдПрд╕рдЯреА рдкреЗрдбрд╝ рдХреЛ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ:
t1 = HsInfixApp ( HsVar ( UnQual ( HsIdent "n" ) ) )
( HsQVarOp ( UnQual ( HsSymbol "-" ) ) ))
( HsLit ( HsInt 1 ) )
t2 = HsApp ( HsVar ( UnQual ( HsIdent "fact '' ' ) ) ))
( HsParen t1 )
t3 = HsInfixApp t2
( HsQVarOp ( UnQual ( HsSymbol "*" ) ) )
( HsVar ( UnQual ( HsIdent "n" ) ) )
t4 = HsGuardedRhs ( SrcLoc { srcFilename = "<рдЕрдЬреНрдЮрд╛рдд>" , srcLine = 4 , srcColumn = 9 } )
( HsVar ( UnQual ( HsIdent "рдЕрдиреНрдпрдерд╛" ) ) )
t3
...
рдЬрдм рд╕рд░реНрд╡рд░ рд╕рд╛рдорд╛рдиреНрдп рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рддреЛ рдЗрд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рднреЗрдЬрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдПрдПрд╕рдЯреА рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм, рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рдХреНрд░рд┐рдп рдЪрд░рдг рдореЗрдВ, рд╕рд░реНрд╡рд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реИред рдореИрдВ рдмрд╕ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ "рдЯреА-рдлрд╝рдВрдХреНрд╢рди" рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╕рдВрдкреВрд░реНрдг рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ; рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд╕рд╛рджрдЧреА рдХреЗ рддрд╣рдд, рд╡рд┐рднрд┐рдиреНрди рддрдВрддреНрд░ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЫрд┐рдкреЗ рд╣реБрдП рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдЖрдк рддрд╕реНрд╡реАрд░ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

рдпрд╣рд╛рдБ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╣реА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд╕рд╛рде рд╕реБрд░рдХреНрд╖рд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВ:
| n == 0 = 1
| рдЕрдиреНрдпрдерд╛ = рддрдереНрдп ' ( n - 1 ) * n

рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЧреНрд░рд╛рдлрд┐рдХ рднрд╛рд╖рд╛ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдЕрд░реНрде рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗред рдЧрд╛рд░реНрдб рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ "рдирд┐рд╖реНрдкрд╛рджрди рдлрд┐рд▓реНрдЯрд░" рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП рд╣рдо рдПрдХ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рдпреЛрдЧ рдХреЗ рд╕рд╛рде рдлреНрд░реЗрдо рдХреА рдЧрд╣рдирддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдкреНрд░рдЧрддрд┐ рдПрдХ рдШрди рд╣реИ рдЬреЛ рдлреНрд░реЗрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЗрд╕рдХреЗ рдЖрдХрд╛рд░ ("рддрд╛рд░реНрдХрд┐рдХ рд╕реНрдерд┐рддрд┐") рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдКрдкрд░ рдХреА рдЫрд╡рд┐ рдореЗрдВ рддреАрд░ рдкреНрд░рдЧрддрд┐ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рдордЬрд╝реЗрджрд╛рд░ рдХреНрдпрд╛ рд╣реИ, рдлреНрд░реЗрдо, рдпрджрд┐ рдЖрдк рд╕рд╛рдордиреЗ рд╕реЗ рджреГрд╢реНрдп рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдмрд╣реБрдд рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд░реЗрдЦрд╛ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдХреЛрдб рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдСрдкрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╕реВрдЪреА рдХреНрдпрд╛ рджрд┐рдЦрддреА рд╣реИ: рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреЗ рдЕрдВрджрд░, рдФрд░ рдЕрдм рддрдХ рдореИрдВ рдЪрд┐рддреНрд░реЛрдВ рдореЗрдВ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛ред рдкрд╣рд▓рд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди (X1: x2: xs), рджреВрд╕рд░рд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди (X1: _: []) рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред "рдорд╣рддреНрд╡рд╣реАрди" рддрддреНрд╡ рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рд╕рдкрд╛рдЯ рдордВрдЪ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА - рдпрд╣ рдЦрд╛рд▓реА рд╣реИред рд╕рд╢рд░реНрдд рдпрджрд┐ рдХрдерди рдФрд░ рдХреЗрд╕-рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рднреА рдХреБрдЫ рд╣рдж рддрдХ рд╕рд╣рдЬ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдХрд╛рдЧрдЬ рдкрд░ рдЕрдиреНрдп рдореЛрдЯреЗ рд░реЗрдЦрд╛рдЪрд┐рддреНрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЕрднреА рднреА рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рднреА рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рдгрд╛рдУрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ, рдФрд░ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди, рдФрд░ рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рдмрдирд╛рдП рдЧрдП рд╕реНрдХреЗрдЪ рдХреЛ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ...

рдЗрд╕рд▓рд┐рдП, рдХрд╛рд░реНрдп рдпрд╣ рд╣реИ: рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдлрд┐рдХ рддрддреНрд╡реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рддрд░рд╣ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд┐рддрд┐ рджреЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рджреГрд╢реНрдп рдкрд░ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдбреНрд░рд╛ рдХрд░реЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдПрдХ рднрд╛рд╖рд╛ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЙрд╕реЗ рд╕рдВрдХрд▓рди рдХрд╣рддреЗ рд╣реИрдВред рдХрдИ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рдж, рдореИрдВ рдПрдХ рдЪрд░рдгрдмрджреНрдз рд╕рдВрдХрд▓рди рдореЗрдВ рдЖрдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдХреЛрдб рдЕрднреА рднреА рдПрдХ рдЧрдбрд╝рдмрдбрд╝ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпреЗ рдЪрд░рдг рд╣реИрдВ:
I. рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ AST рддрддреНрд╡ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдореВрд▓ рддрддреНрд╡ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛
рджреНрд╡рд┐рддреАрдпред рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдЖрджрд┐рдо рдХрд╛ рдирдХреНрд╢рд╛ рдХрд░реЗрдВ
рддреГрддреАрдпред рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ StructureObject рдХрд╛ рд╕рдВрдпреЛрдЬрди рдФрд░ рд╕реНрдерд┐рддрд┐
рдЪрддреБрд░реНрдеред рджреГрд╢реНрдп рддрддреНрд╡реЛрдВ рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХ рдЖрджрд┐рдо рдХрд╛ рд╕рдВрдХрд▓рди
рд╡реАред рдПрдХ рджреГрд╢реНрдп рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВ, рдЙрди рдореЙрдбреНрдпреВрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд┐рдирдореЗрдВ рд╕рд░реНрд╡рд░ рдХреЛрдб рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИред
рдЧреНрд░рд╛рдлрд╕рд░реНрд╡рд░ (рдореБрдЦреНрдп) - рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ред рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди, рд╕рд░реНрд╡рд░ рд▓реЙрдЬрд┐рдХ; рдЗрд╕рдореЗрдВ, рдУрдкрдирдЬреАрдПрд▓ рдХрд╛ рдЖрд░рдВрднреАрдХрд░рдг, рдПрдХ рдЦрд┐рдбрд╝рдХреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реЛрддреА рд╣реИрдВред рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓реВрдк рднреА рд╡рд╣рд╛рдВ рд╕реНрдерд┐рдд рд╣реИ, рдФрд░ рдбреНрд░рд╛.рдбреНрд░реЙрд╡ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдбреНрд░реЙ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕рдореЗрдВ рдХрддрд╛рдИ рдХрд░ рд░рд╣рд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп - рд╕рд╛рдорд╛рдиреНрдп рдбреЗрдЯрд╛ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдоред
рдХреЙрдорди рдХреЙрд╕реНрдЯреЗрдВрдЯреНрд╕ - рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рд░рд╛рдВрдХ, рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдирд┐рд╢реНрдЪрд┐рдд рдбреЗрдЯрд╛ред
Common.GLTypes - OpenGL рдкреНрд░рдХрд╛рд░ (рд╡реИрдХреНрдЯрд░, рдХреЛрдиреЗ, рдЖрджрд┐), рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрдиреНрдп рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБред
Common.TestData - "t-functions", рдкрд░реАрдХреНрд╖рдг рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ред
Common.Units - рдУрдкрди рдпреВрдирд┐рдЯ рд╡реИрдХреНрдЯрд░ рдФрд░ рдХреЛрдиреЗ рдХреЗ рд╕рд╛рде рдЕрдВрддрд░рд┐рдХреНрд╖ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рд╕рдВрд░рдЪрдирд╛ - рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдПрдХ рдПрдПрд╕рдЯреА рдЯреНрд░реА рдХреЛ рд╕реНрдЯреНрд░рдХреНрдЪреБрд░реЛрдмреЛрдЬреЗрдм рдЯреНрд░реА рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рд╕рдВрд░рдЪрдирд╛.рд╕рдВрдмрдВрдзреА - рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ рдЪрд░рдг I, II, III рд╕реЗ рдЬреБрдбрд╝реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ред
рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ред SructructObject - рд╕реНрдЯреНрд░рдХреНрдЪрд░рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХреЗрдВрджреНрд░реАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╡рд░рдгред
рд╕рдВрд░рдЪрдирд╛.рдЧреНрд░рд╛рдлрдСрдмреНрдЬреЗрдХреНрдЯ - рдЧреНрд░рд╛рдлрдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред
рд╕рдВрд░рдЪрдирд╛.рд╕рдВрдпрдо - рдЧреНрд░рд╛рдлрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рд╕рдВрд░рдЪрдирд╛ред I, II рдХреЗ рдЪрд░рдгреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред
рд╕рдВрд░рдЪрдирд╛.рд╕рдВрдХреЗрдд - рдХрдИ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕рдВрдмрдВрдзред рддреГрддреАрдп рдЪрд░рдг рдХреЗ рдЕрдиреБрд░реВрдкред
рд╕реНрдЯреНрд░рдХреНрдЪреЛрд░.рдЧреЙрдореНрдкреЗрд▓рд╛рдЗрд▓ - рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреГрд╢реНрдп рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХ рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡реНрд╕ (рдЧреНрд░рд╛рдлрдСрдмреНрдЬреЗрдХреНрдЯ) рдХрд╛ рд╕рдВрдХрд▓рдиред IV рдЪрд░рдг рдХреЗ рдЕрдиреБрд░реВрдкред
рд╕рдВрд░рдЪрдирд╛ .syntaxTools - рдПрдПрд╕рдЯреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рд╕рдВрд░рдЪрдирд╛ред рдкрд╛рда - рд╕рд╣рд╛рдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпред
рдбреНрд░рд╛ - рджреГрд╢реНрдп рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХрд╛рд░реНрдпред
рдбреНрд░рд╛.рдбреНрд░реЙрд╡ - рдбреНрд░реЙ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджреГрд╢реНрдп рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
Draw.GLInit - рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдУрдкрдирдЬреАрдПрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред
рдбреНрд░рд╛.рд░реЗрдВрдбрд░ - рдЗрд╕рдореЗрдВ рд░реЗрдВрдбрд░ рдлрдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИред рд╡реА рдХрджрдо рдХреЗ рдЕрдиреБрд░реВрдкред
Draw.TextureInit - рдмрдирд╛рд╡рдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпред
рд╡рд┐рд╡рд┐рдз - рдЕрдиреНрдп рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпред
Misc.BoxSide - HOpenGL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬрд┐рд╕рдореЗрдВ рдмрдХреНрд╕реЗ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИред
рдерд░реНрдбрдкрд╛рд░реНрдЯреА - рдерд░реНрдб рдкрд╛рд░реНрдЯреА рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдоред
ThirdParty.Frag - рдлреНрд░реИрдЧ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдХреЛрдбред рдЯреАрдЬреАрдП рдлрд╛рдЗрд▓реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдмрдирд╛рд╡рдЯ рдмрдирд╛рдПрдВред
ThirdParty.GLUtil - OpenGL рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВред
ThirdParty.ImageFormats - TGA рдлрд╝рд╛рдЗрд▓реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред

рдореИрдВ рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдбреНрд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВ:
рдбреНрд░рд╛ :: рдбреНрд░рд╛рдлрдВрдХреНрд╢рди
рдбреНрд░рд╛ GLResources texRes n = рдХрд░рддреЗ рд╣реИрдВ
putStr $ "рдХрд░рдВрдЯ n =" ++ рд╢реЛ n
рдЬреАрдПрд▓ред рд╕реНрдкрд╖реНрдЯ [ рдЬреАрдПрд▓ ред ColorBuffer , рдЬреАрдПрд▓ ред рдбреЗрдлреНрде рдмрдлрд╝рд░ ]
рдЬреАрдПрд▓ред loadIdentity
рдЬреАрдПрд▓ред 10 рдШреБрдорд╛рдПрдБ ( рд╡реЗрдХреНрдЯрд░ 3 0 1 0 )
рдЬреАрдПрд▓ред 20 рдШреБрдорд╛рдПрдБ ( рд╡реЗрдХреНрдЯрд░ 3 1 0 0 )
рдЬреАрдПрд▓ред рдЕрдиреБрд╡рд╛рдж ( рд╡реЗрдХреНрдЯрд░ 3 ( - 5 ) - ( 10 ) ( - 30 ) )
- StructureObject рд╕реЗ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг
Let c = constructFramedGRhss ( OcsGuardedRhss t6 )
- рдЧреНрд░рд╛рдлрд┐рдХ рдЖрджрд┐рдо рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рджреГрд╢реНрдп рддрддреНрд╡
- рдФрд░ рдПрдХ рджреГрд╢реНрдп рдбреНрд░рд╛
рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛
putStrLn "рдареАрдХ рд╣реИред"

ConstructFramedGRhss рдФрд░ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╕рднреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╣рдореЗрдВ рд╡реЗ рдЪрд┐рддреНрд░ рдорд┐рд▓рддреЗ рд╣реИрдВ рдЬреЛ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдирд┐рд░реНрдорд╛рдгFramedGRhss рдлрд╝рдВрдХреНрд╢рди (рдФрд░ рдЗрд╕рдХреЗ рдПрдирд╛рд▓реЙрдЧреНрд╕)ред рд╕рдВрд░рдЪрдирд╛ рдЕрд╡рд░реЛрдзрдХ рдЙрдкрдХрд░рдг рдЪрд░рдг I - III рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
constructFramedGRhss :: ObjectConstructSpec -> StructureObject
рдпрд╣ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд ObjectConstruct рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ StructureObject рд╕реЗ рдПрдХ рддреИрдпрд╛рд░-рдкрджрд╛рдиреБрдХреНрд░рдо рджреЗрддрд╛ рд╣реИред рдПрдХ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╕рд┐рд░реНрдл рдПрдХ рдПрдбреАрдЯреА рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ рд╡рд░реНрддрдиреА рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕ рд╕рд┐рдВрдереИрдЯрд┐рдХ рдпреВрдирд┐рдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
- рдореЙрдбреНрдпреВрд▓ рд╕рдВрд░рдЪрдирд╛ред SructructObject
рдбреЗрдЯрд╛ ObjectConstructSpec
= OcsApp HsExp
| OcsExpArgument HsExp
| OcsExpFuncName HsExp StructureObject
| OcsInfixOperator HsQOp
| OcsGuardedRhs HsGuardedRhs
| OcsFoundationExp StructureObject
| OcsGuardedRhss HsRhs
| OcsArrowBridge
| OcsEqualSignBridge
| рдУрдХреНрд╕рдореИрдЪ рдПрдЪрдПрд╕рдПрдордЪ
рдХрд┐рд╕реА рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП StructureObject рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдореЙрдбреНрдпреВрд▓ рд╕рдВрд░рдЪрдирд╛ред SructructObject
data StructureObject = рд╕реНрдЯреНрд░рдХреНрдЪрд░urebject
{ soObjectSpec :: ObjectSpec
, soGeometry :: рдЬреНрдпрд╛рдорд┐рддрд┐
, soGraphObjectSpec :: GraphObjectSpec
, soStructureObjects :: StructureObjects
} рд╡реНрдпреБрддреНрдкрдиреНрди ( рджрд┐рдЦрд╛рдПрдБ )
рдкреНрд░рдХрд╛рд░ StructureObjects = [ StructureObject ]
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, soStructureObjects рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЪрд╛рдЗрд▓реНрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдПрд╕рдЯреА рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рдВрдЪрдп рдХреЗ рд╕рд╛рде рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдкрджрд╛рдиреБрдХреНрд░рдо: рд╕реНрдерд┐рддрд┐, рдЖрдХрд╛рд░, рдЧреНрд░рд╛рдлрд┐рдХ рдЖрджрд┐рдо, рдмрдирд╛рд╡рдЯред рдПрдХ рдкреЗрдбрд╝ рд╕рдмрд╕реЗ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░реЛрдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдПрдХ рдЕрддрд┐рд╡реНрдпрд╛рдкреА рд╕реНрддрд░ рдХрд╛ рддрддреНрд╡ рдХрд╣рд╛рдБ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдпреЛрдЬрдирд╛ рдПрдХ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддреА рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░реИрдЪрд░ рд╕реНрдкреЗрд╕ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдкреВрд░реНрдг рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рддреБрд░рдВрдд рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ: рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдмрд╛рд▓ рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдмрдврд╝рддреЗ рд╣реБрдП, рд╣рдо рдХрд▓реНрдкрдирд╛ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореВрд▓ рддрддреНрд╡ рдХрд╣рд╛рдВ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рднреА рд╕реНрдЯреНрд░рдХреНрдЪрд░рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реА рддреИрдирд╛рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ; рд╡рд╣ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ StructureObject рдХреЗ рдкрд╛рд╕ OX, OY рдФрд░ OZ рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╢реВрдиреНрдп рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЕрдкрдиреА рдСрдлрд╝рд╕реЗрдЯ рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдЖрд░реЗрдЦ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рджреЛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╖рдп: рд╕рдлреЗрдж рдкреИрдирд▓ рдореВрд▓ рд╡рд╕реНрддреБ рдХреЗ рд╕реНрдерд╛рди рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рдИрдВрдЯ рдкреИрдирд▓ рдмрдЪреНрдЪреЗ рдХреЗ рд╕реНрдерд╛рди рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред рд╕реНрдЯреНрд░рдХреНрдЪреБрд░рдСрдмреНрдЬреЗрдХреНрдЯ рдЦреБрдж рдХреЛ рджреГрд╢реНрдп рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреНрд░рд╛рдлрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдХрдВрдЯреЗрдирд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЖрд░реЗрдЦ рдореЗрдВ рдиреАрд▓рд╛)ред рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╢реВрдиреНрдп рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдпрд╛рдо (рдЖрдпрд╛рдо) рд╕реНрдЯреНрд░рдХреНрдЪрд░рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рднреА рдЙрдкрдЧреНрд░рд╣реЛрдВ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЖрдпрд╛рдо рд╣реИрдВ рдФрд░ рдореВрд▓ рддрддреНрд╡ рдореЗрдВ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред SoGeometry рдлреАрд▓реНрдб, Geometry рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЗрд╕рдореЗрдВ рддреАрди-рдЖрдпрд╛рдореА рд╡реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╕реНрдерд╛рдкрди рдФрд░ рдЖрдпрд╛рдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рдХреЙрдорди.рдЬреАрдПрд▓рдЯрд╛рдЗрдкреНрд╕ рдореЙрдбреНрдпреВрд▓
рдкреНрд░рдХрд╛рд░ рдЬреНрдпрд╛рдорд┐рддрд┐ = ( рдЕрдиреБрд╡рд╛рдж , рдЖрдпрд╛рдо )
рдЯрд╛рдЗрдк рдХрд░реЗрдВ GLfVector3 = GL ред рд╡реЗрдХреНрдЯрд░ 3 рдЬреАрдПрд▓ ред GLfloat
рдкреНрд░рдХрд╛рд░ рдЕрдиреБрд╡рд╛рдж = GLfVector3
рдкреНрд░рдХрд╛рд░ рдЖрдпрд╛рдо = GLfVector3
рдЗрд╕реА рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛, рд╕рд╛рде рд╣реА рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ soGraphObjectSpec рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИ:
рдЧреНрд░рд╛рдлрдСрдмреНрдЬреЗрдХреНрдЯрд╕реНрдкреЗрдХ = ( рдЕрдиреБрд╡рд╛рдж , рдЖрдпрд╛рдо , рдЧреНрд░рд╛рдлрдСрдмреНрдЬреЗрдХреНрдЯ ) рдЯрд╛рдЗрдк рдХрд░реЗрдВ
рд╕реНрдЯреНрд░рдХреНрдЪреБрд░реЗрдмрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдб рд╡реНрдпрд╛рдкрдХ рд╣реИ рдФрд░ рдЗрд╕реЗ рджреЛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд┐рдВрдЯреИрдХреНрд╕ рддрддреНрд╡, рд╕рд░рд▓ рдФрд░ рдЬрдЯрд┐рд▓, рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, soGeometry рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдСрдлрд╕реЗрдЯ рдПрдХ рд╢реВрдиреНрдп рд╡реЗрдХреНрдЯрд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рд╣рдо рдмрд╕ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рдХрд┐ рдирд╡ рдирд┐рд░реНрдорд┐рдд рд╕реНрдЯреНрд░рдХреНрдЪреБрд░рдСрдмрдЬреЗрдХреНрдЯ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреИрд╕реЗ рд╕реНрдерд┐рдд рд╣реИ, рдФрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдЕрднреА рддрдХ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИред рдСрдлрд╕реЗрдЯ рдХреЛ рдмрд╛рдж рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕ рдХреЛрдб рдореЗрдВ рдЬреЛ рдмрдЪреНрдЪрд╛ рдмрдирд╛рддрд╛ рд╣реИ; рдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рд╢реВрдиреНрдп рд░рд╣рддрд╛ рд╣реИ - рдлрд┐рд░ рдпрд╣ рд╡рд╣ рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдЙрдк-рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛ред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ - рддреАрди рд╕рд░рд▓ рд╡рд╕реНрддреБрдУрдВ ("рдЪрд░", "рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо", "рдкреБрд▓") рдФрд░ рдПрдХ рдЬрдЯрд┐рд▓ (рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдиреНрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░) рдХрд╛ рдирд┐рд░реНрдорд╛рдг:
- рдПрдХ рд╡рд╕реНрддреБ рдПрдХ рдЪрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдИ рдЧрдИ рд╣реИ:
constructExp ( OcsExpArgument ( HsVar var ) ) = let
varText = makeName ред getHsQualName $ var
рд░реЙрдбрд┐рдо = рдЬреАрдПрд▓ ред рд╡реЗрдХреНрдЯрд░ 3 ( hsNameLength varText ) 2 2
рдордВрдж = рд╡реНрдпреБрддреНрдкрдиреНрдирддрд╛ ( рдлрдирдбрд┐рдореЗрдВрд╢рди рд╡реЗрд░рд┐рдПрдмрд▓рдмреЙрдХреНрд╕рдбрд┐рдореНрд╕ ) рд░реЙрдбрд┐рдо
graphObjSpec = variableBox varText dim
in рд╕реНрдЯреНрд░рдХреНрдЪрд░urebject рдСрд╕рд░реНрдЧреБрдореЗрдВрдЯ ( nullVector3 , dim ) graphObjSpec [ ]
- "рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдо" рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ:
constructFoundation :: ObjectConstructSpec -> StructureObject
constructFoundation ( OcsFoundationExp expSo ) = рдЪрд▓реЛ
expSoDim = geometryDim ред soGeometry $ expSo
рдордВрдж = рд╡реНрдпреБрддреНрдкрдиреНрди рдлрд╛рдЙрдВрдбреЗрд╢рдирдбрд┐рдореЗрдВрд╢рди рдПрдХреНрд╕рдкреЛрдЬрд╝рдбрд┐рдо
graphObjSpec = рдиреАрдВрд╡ рдмреЙрдХреНрд╕ рдордВрдж
in рд╕реНрдЯреНрд░рдХреНрдЪрд░ure рдСрдмрд╛рдЙрдВрдбреЗрд╢рди ( nullVector3 , dim ) рдЧреНрд░рд╛рдлрдСрдмреНрдЬреЗрд╕реНрдкреЗрдХ [ ]
- "рдкреБрд▓" рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ:
рдирд┐рд░реНрдорд╛рдгрдмреНрд░рд┐рдЬ :: ObjectConstructSpec -> StructureObject
constructBridge ocsBridgeType = рдЪрд▓реЛ
рдордВрдж = рд╡реЗрдХреНрдЯрд░ 3 2 0.25 2
( graphObjSpec , bType ) = рдорд╛рдорд▓рд╛ ocsBridgeType рдХрд╛
OcsArrowBridge -> ( рдРрд░реЛрдмреНрд░рд┐рдЬ рдордВрдж , OsArowrowBridge )
OcsEqualSignBridge -> ( equSignBridgeBox рдордВрдж , OsEqualSignBridge )
in рд╕реНрдЯреНрд░рдХреНрдЪрд░urebject bType ( nullVector3 , dim ) graphObjSpec [ ]
- рдПрдХ рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдиреНрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░:
constructExp ( OcsExpArgument ( HsInfixApp exp1 qOp exp2 ) ) = рдЪрд▓реЛ
exp1So = constructExp ( OcsExpArgument exp1 )
qOpSo = constructQOp ( OcsInfixOperator qOp )
exp2So = constructExp ( OcsExpArgument exp2 )
in connectStructureObjects OsInfixApp [ exp1So , qOpSo , exp2So ]
рдПрдХ рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБ рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕рдХреЗ рдмрдЪреНрдЪреЛрдВ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐ рд╣реЛрдЧреАред рд╣рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдСрдлрд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдФрд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдирд╡ рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдЕрднрд┐рднрд╛рд╡рдХ рдХреЛ рд╢реВрдиреНрдп рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЕрд░реНрдерд╛рдд, рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛), рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрднреА рддрдХ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рддрдирд╛ рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред Offsets рдХреА рдЧрдгрдирд╛ ConnectStructureObjects рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ Structure.SOConnect рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдпреВрдирд┐рдЯ рдХрд╛ рджреГрд╢реНрдп рдФрд░ рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП рд╕рдмрдЬреЗрдХреНрдЯ рдХреА рд╕реВрдЪреА рдХреЛ рдЗрд╕рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, ConnectStructureObjects рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреА рдЧрдгрдирд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред
connectStructureObjects :: ObjectSpec -> StructureObjects -> StructureObject
- рдЗрдирдлрд╝рд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдФрд░ рджреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ:
connectStructureObjects OsInfixApp ( exp1So: opSo: exp2So: [ ] ) / let
exp1SoDim @ ( GL ред рд╡реЗрдХреНрдЯрд░ 3 e1dl e1dh e1dw ) = рдЬрд┐рдпреЛрдореЗрдЯреНрд░реАрдбрд┐рдо ред soGeometry $ exp1So
exp2SoDim = рдЬреНрдпреЛрдореЗрдЯреНрд░реАрдбрд┐рдо ред soGeometry $ exp2So
opSoDim @ ( GL ред рд╡реЗрдХреНрдЯрд░ 3 opdl opdh opdw ) = geometryDim ред soGeometry $ opSo
exp1Trans = nullVector3 - рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 1 рдореВрд▓ рд╢реВрдиреНрдп рдкрд░ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ
opTrans = рд╡реЗрдХреНрдЯрд░ 3 e1dl 0 0 - рдСрдкрд░реЗрдЯрд░ рдХреЛ рдПрдХреНрд╕рдПрдХреНрд╕ 1 рдХреА рд▓рдВрдмрд╛рдИ 1 (рдЗрд╕рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд╕реНрдерд┐рдд) рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
exp2Trans = рд╡реЗрдХреНрдЯрд░ 3 ( e1dl + opdl ) 0 0 - рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 2 рдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 1 рдХреА рд▓рдВрдмрд╛рдИ рдФрд░ рдСрдкрд░реЗрдЯрд░ рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдУрдП рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
generalDim = generalizedDimension [ ( exp1Trans , exp1SoDim ) - рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЖрдпрд╛рдо
, ( exp2Trans , exp2SoDim )
, ( opTrans , opSoDim ) ]
newOpGoSpec = ( opTrans , opSoDim , graphObjectFromSpec ред soGraphObjectSpec $ opSo )
newExp1So = exp1So { soGeometry = ( exp1Trans , exp1SoDim ) }
newExp2So = exp2So { soGeometry = ( exp2Trans , exp2SoDim ) }
in StructureObject OsInfixApp ( nullVector3 , generalDim ) newOpGoSpec [ newExp1So , newExp2So ]
рд╕рдордиреНрд╡рдп рдЕрдХреНрд╖реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЦреАрдВрдЪреА рдЧрдИ рдПрдХ рдЦрд╛рд▓реА рдЬрдЧрд╣ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ - рд╢реВрдиреНрдпред рдорд╛рдирд╕рд┐рдХ рд░реВрдк рд╕реЗ рджреГрд╢реНрдп рдХреЛ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдмреЙрдХреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рджрд╛рдПрдВ-рдКрдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ред рдЕрдм рдПрдХ рдЕрд▓рдЧ рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рдмреЙрдХреНрд╕ рдЬреЛрдбрд╝реЗрдВ, рд╣рдореЗрдВ рдФрд░ рдмрд╛рдИрдВ рдУрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ред рдпрджрд┐ рдпреЗ рджреЛрдиреЛрдВ рдмреЙрдХреНрд╕ рдХреБрдЫ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдЙрдк-рд╡рд┐рд╖рдп рд╣реИрдВ, рддреЛ рдЙрдирдХреЗ рдХрд┐рдирд╛рд░реЗ рдЗрд╕рдХреА рдЬрдЧрд╣ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрдкрд░реЛрдХреНрдд рдЖрд░реЗрдЦ рдореЗрдВ, рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдСрд░рдмрдЬреЗрдХреНрдЯ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ: рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рд╕реНрдерд╛рди рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдХреБрд▓ рдЖрдпрд╛рдореЛрдВ рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ? рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЙрдк-рддрддреНрд╡ рдХреЗ рд╡рд┐рд╕реНрдерд╛рдкрди рдФрд░ рдЖрдХрд╛рд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдиреНрдпреВрдирддрдо, рдЕрдзрд┐рдХрддрдо рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░ рдЪрдврд╝рд╛рд╡ рдЙрдЪреНрдЪ рд╕реЗ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдордЧреНрд░ рдЖрдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдРрд╕рд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЪрд░рдо рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдорд╛рдиреЛрдВ рдХреЛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд╛рди рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдСрдлрд╝рд╕реЗрдЯреНрд╕ рдФрд░ рдЖрдХрд╛рд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкрд░ рджреГрдврд╝ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрддрдХрд░рдг рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдореЙрдбреНрдпреВрд▓ рд╕рдВрд░рдЪрдирд╛
generalizedDimension :: рдЬреНрдпрд╛рдорд┐рддрд┐ -> рдЖрдпрд╛рдо
рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рддрдирд╛рд╡ ( g: gs ) = рдЧрддрд┐ ( рдЧреБрдирд╛ f g gs )
рдЬрд╣рд╛рдБ
рдПрдл ( рдЬреАрдПрд▓ ред рд╡реЗрдХреНрдЯрд░ 3 рдбреАрдПрдХреНрд╕ 1 рдбрд╛рдЗ 1 рдбреАрдЬрд╝ 1 ) , ( рдЬреАрдПрд▓ рд╡реЗрдХреНрдЯрд░ 3 рдПрдХреНрд╕ 1 рдП 1 рдПрдЬрд╝ 1 )
( ( GL ред рд╡реЗрдХреНрдЯрд░ 3 dx2 dy2 dz2 ) , ( GL ред рд╡реЗрдХреНрдЯрд░ 3 ax2 ay2 az2 ) = )
( рд╡реЗрдХреНрдЯрд░ 3 ( рдиреНрдпреВрдирддрдо dx1 dx2 ) ( рдиреНрдпреВрдирддрдо рдбрд╛рдИ 1 рдбрд╛рдИ 2 ) ( рдиреНрдпреВрдирддрдо dz1 dz2 ) ,
рд╡реЗрдХреНрдЯрд░ 3 ( рдЕрдзрд┐рдХрддрдо ( dx1 + ax1 ) ( dx2 + ax2 ) )
( рдЕрдзрд┐рдХрддрдо ( dy1 + ay1 ) ( dy2 + ay2 ) )
( рдЕрдзрд┐рдХрддрдо ( dz1 + az1 ) ( dz2 + az2 ) )
рдЯреЗрдВрд╢рди ( ( GL ред рд╡реЗрдХреНрдЯрд░ 3 X1 y1 z1 ) , ( GL ред рд╡реЗрдХреНрдЯрд░ 3 x2 y2 z2 ) =
рд╡реЗрдХреНрдЯрд░ 3 ( рдПрдмреНрд╕ ( x2 - X1 ) ) ( рдПрдмреНрд╕ ( y2 - y1 ) ) ( рдПрдмреНрд╕ ( z2 - z1 ) )

рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕.рдХреЙрдиреНрд╕реНрдЯреНрд░рдХреНрдЯ рдПрдВрдб рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕.рдХреЙрдирдХрдиреЗрдХреНрдЯ рдореЙрдбреНрдпреВрд▓реНрд╕ рдореЗрдВ рдмреЛрдЭрд┐рд▓ рдлреАрдЪрд░реНрд╕ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдХреБрдЫ рднреА рдмреЗрд╣рддрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рд╕рдВрднрд╡рддрдГ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрдо рдХреЛрдб рд╣реЛрдЧрд╛ред рдРрд╕реЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рдПрдХрд▓ рдШреЛрд╖рдгрд╛ рдпреЛрдЬрдирд╛ рдореЗрдВ рдлрд┐рдЯ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ; рдЗрд╕рд▓рд┐рдП, рднрд╛рд╖рд╛ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдлрд╝рдВрдХреНрд╢рди рдКрдВрдЪрд╛рдИ рдореЗрдВ рдПрдХ рдЗрдХрд╛рдИ рдореЗрдВ рдПрдХ рдмреЙрдХреНрд╕ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рддрд░реНрдХ рдЙрд╕ рдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВред рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ рдХрд┐ рдмреЙрдХреНрд╕ рдХреА рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдЙрдирдХреЗ рдЖрдХрд╛рд░ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЧреНрд░рд╛рдлрд┐рдХ рднрд╛рд╖рд╛ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рдкрд┐рд░рд╛рдорд┐рдб рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкрд░рдд рдХреЗ рдкреНрд░реЛрдЯреНрд░реВрд╢рд┐рдпрдВрд╕ рд╕реЗ рдЬреБрдбрд╝реА рдЕрддрд┐рд░рд┐рдХреНрдд рдЧрдгрдирд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдПрдХ "рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рддрдВрддреНрд░" рдмрдирд╛рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдЖрдпрд╛рдоред рдЖрдпрд╛рдо рдореЙрдбреНрдпреВрд▓ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВред рдпрд╣ рддрддреНрд╡ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрдХрд╛рд░, рдЖрд╡рд╢реНрдпрдХ рдмрд╛рд▓ рддрддреНрд╡реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдирдП, "рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ" рдЖрдХрд╛рд░ рджреЗрддрд╛ рд╣реИред рдкреВрд░реНрд╡-рдкреВрд░реНрд╡-рд╕реВрдЪреА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдп рд╕реЗ рдирд┐рдореНрди рдХреЛрдб рд╕рд░рд▓ рд╣реИ:
рдЪрд▓реЛ
рд░реЙрдбрд┐рдо = рдЬреАрдПрд▓ ред рд╡реЗрдХреНрдЯрд░ 3 1 2 2
рдордВрдж = рд╡реНрдпреБрддреНрдкрдиреНрдирддрд╛ ( рдлрдирдбрд┐рдореЗрдВрд╢рди рд╡реЗрд░рд┐рдПрдмрд▓рдмреЙрдХреНрд╕рдбрд┐рдореНрд╕ ) рд░реЙрдбрд┐рдо
...
рдпрд╣рд╛рдВ, рдЪрд░ рдХреЗ рд▓рд┐рдП рд░реЙрдбрд┐рдо рдореВрд▓ рдмреЙрдХреНрд╕ рдЖрдХрд╛рд░ рд╣реИ, рдФрд░ рдордВрдж рдирдпрд╛, "рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛" рдЖрдХрд╛рд░ рд╣реИред FuncDimensions рдбреЗрдЯрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ DerivedDimensions рд╡рд┐рд╢реЗрд╖ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИ:
- рдореЙрдбреНрдпреВрд▓ рд╕рдВрд░рдЪрдирд╛
рдбреЗрдЯрд╛ рд╡реНрдпреБрддреНрдкрдиреНрдирддрд╛рдПрдВ = рдлрдирдбрд┐рдореЗрдВрд╢рдиреНрд╕ ( GLfVector3 -> GLfVector3 )
| FoundationDimensions
рд╡реНрдпреБрддреНрдкрдиреНрди рдФрд░ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- рдореЙрдбреНрдпреВрд▓ рд╕рдВрд░рдЪрдирд╛
рд╡реНрдпреБрддреНрдкрдиреНрди рддрдирд╛рд╡ :: рд╡реНрдпреБрддреНрдкрдиреНрди рддрдирд╛рд╡ -> GLfVector3 -> GLfVector3
рд╡реНрдпреБрддреНрдкрдиреНрди ( рдлрдирдбрд┐рдореЗрдВрд╢рди рдЪ ) рдордВрдж = рдПрдл рдордВрдж
рд╡реНрдпреБрддреНрдкрдиреНрдирддрд╛ рдлрд╛рдЙрдВрдбреЗрд╢рди рдлрд╛рдЙрдВрдбреЗрд╢рди ( GL ред рд╡реЗрдХреНрдЯрд░ 3 l h w ) = рд╡реЗрдХреНрдЯрд░ 3 ( l + 2 ) 0.25 ( w + 2 )
- рдХрд╛рд░реНрдп рд╡реНрдпреБрддреНрдкрдиреНрдирддрд╛ рдореЗрдВ рдЬрдЧрд╣ рдХреЗ рд▓рд┐рдП
- | рдлрд╝рдВрдХреНрд╢рди рдмреЙрдХреНрд╕ рдЖрдпрд╛рдореЛрдВ рдХреА рдЧрдгрдирд╛ рддрд░реНрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реЛрддреА рд╣реИ
funcBoxDerivedDims :: GLfVector3 -> GLfVector3 -> GLfVector3
funcBoxDerivedDims ( GL ред рд╡реЗрдХреНрдЯрд░ 3 рдУрдкрд▓ oph opw ) ( GL ред рд╡реЗрдХреНрдЯрд░ 3 fBoxl fBoxh fBoxw ) =
( GL ред рд╡реЗрдХреНрдЯрд░ 3 ( f opl fBoxh ) fBoxh ( рдЕрдзрд┐рдХрддрдо opw fBoxw ) )
рдЬрд╣рд╛рдБ
f рдСрдк рдмреЙрдХреНрд╕ | op > = рдмреЙрдХреНрд╕ = op + рез
| ( box - op ) < 1 = op + 1
| ( box - op ) > = 1 = рдмреЙрдХреНрд╕
- | рдЪрд░ рдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ
рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмреЙрдХреНрд╕ :: GLfVector3 -> GLfVector3
variableBoxDims ( GL ред рд╡реЗрдХреНрдЯрд░ 3 varl varh varw ) =
( GL ред рд╡реЗрдХреНрдЯрд░ рей ( рдпрджрд┐ varl < реи рддрдм 2 рдФрд░ varl ) varh varw )

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реНрдпреБрддреНрдкрдиреНрди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдлрд╛рдЙрдВрдбреЗрд╢рдирдбрд┐рдореЗрдВрдЯреНрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд░рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рдЖрдХрд╛рд░ рдмрд╕ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░рд╛рд╢рд┐ рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд▓рдВрдмрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ 2 рд╕реЗ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдКрдВрдЪрд╛рдИ 0.25 рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдХреЛ funcBoxDerivedDims рдФрд░ variableBoxDims рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрд╕ рд╕рд░рд▓реАрдХреГрдд рдХреЛрдб рд╕реЗ рдордВрдж GL.Vector3 2 2 2 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЧрдгрдирд╛ рд╡реЗрд░рд┐рдПрдмрд▓рдмреЙрдХреНрд╕рдбрдореНрд╕ (GL.Vector3 1 2 2) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреАред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк рдЕрдиреНрдп рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рднреА рдЕрдзрд┐рдХ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рдЧреНрд░рд╛рдлрд┐рдХ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╡рд┐рд╡рд┐рдзрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдПрдХ рдмреЙрдХреНрд╕ рдкрд░ рдЦрд╛рдВрдЪреЗ рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛; рдЦрд╛рд▓реА рд╕реНрд▓реЙрдЯреНрд╕ рдХрд░реА рдпрд╛ рдЕрдиреБрднрд╛рдЧ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред
рдмреЗрд╢рдХ, рдЕрдХреЗрд▓реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рдЖрдХрд╛рд░ рдХрд╛ рддрдВрддреНрд░ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдзрдордиреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рд╕рд░рд▓ рдЕрдкрдШрдЯрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдФрд░ рдХрд╣рд╛рдиреА рд╣реИ ...рдмрд╣реБрдд рд░реБрдЪрд┐ рд╣реИ рдЧреНрд░рд╛рдлрдСрдмреНрдЬреЗрдХреНрдЯ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ - рдПрдХ рднрд╡рд┐рд╖реНрдп рдХреЗ рджреГрд╢реНрдп рддрддреНрд╡ рдХрд╛ рдПрдХ рдЖрджрд┐рдо, рдЯреЗрдореНрдкрд▓реЗрдЯ, рд░рд┐рдХреНрдд, рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкред рд╕рдВрдХрд▓рди рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдгреЛрдВ рдореЗрдВ, рд╣рдореЗрдВ рдЖрджрд┐рдо рдХреЗ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдХреЗ рдкреВрд░реЗ рд╕рд░рдгреА рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдкрд╣рд▓реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рд┐рдХреНрдд рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдиреЗ, рд░реЗрдЦрд╛рдУрдВ, рдЪреЗрд╣рд░реЛрдВ рдкрд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЪрд┐рддреНрд░рдордп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реЗ рд╕рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕реЗ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред- рдореЙрдбреНрдпреВрд▓ рд╕рдВрд░рдЪрдирд╛ред GraphObjec
рдбреЗрдЯрд╛ рдЧреНрд░рд╛рдлрдСрдмреНрдЬреЗрдХреНрдЯ = NoGraphObject
| рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡рдмреЙрдХреНрд╕ GLfVertex3 TextureName
| TexturedBox GLfVertex3 ObjectTextureSpec
| GraphObjects [ GraphObjectSpec ]
deriving ( Show )
рдпрд╣ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдПрдХ рд╕реНрдЯреНрд░рдХреНрдЪреЛрд░рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрдИ рдЧреНрд░рд╛рдлрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (рдЧреНрд░рд╛рдлрдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░) рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ (рдиреЙрдЯрдЧреНрд░рд╛рдлрдСрдмреНрдЬреЗрдХреНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░)ред рдФрд░ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ: HsGuardedRhss рдХреЗ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП AST рдЯреНрд░реА рдореЗрдВ, рдЧреНрд░рд╛рдлрд┐рдХ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рдмрд▓реНрдХрд┐, рдпрд╣ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рддреН, рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╕рд╣реА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд▓рд┐рдП рдЧрд╛рд░реНрдб рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (Rhss - "рджрд╛рд╣рд┐рдиреЗ рд╣рд╛рде рдХреА рдУрд░")ред рдЙрд╕реА рд╕рдордп, рддрдерд╛рдХрдерд┐рдд "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рдЧреНрд░рд╛рдлрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдХреЗрд╡рд▓ рджреЛ рддрддреНрд╡реЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЖрджрд┐рдо рдмреЙрдХреНрд╕ PrimitiveBox рдФрд░ рдЙрдиреНрдирдд рдмреЙрдХреНрд╕ TexturedBoxред рджреЛрдиреЛрдВ рдмреЙрдХреНрд╕реЛрдВ рдореЗрдВ GLFVertex3 рдХрд╛ рдорд╛рди рд╣реЛрддрд╛ рд╣реИ - рдпреЗ рдХреЗрд╡рд▓ рдЖрдХрд╛рд░ рд╣реИрдВ рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рд╡рдЯ рд╡рд╛рд▓реЗ рдЪреЗрд╣рд░реЗ, рдЫрд╣ рдЯреБрдХрдбрд╝реЗ, рдЪрд░рдг IV рдореЗрдВ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗред рдПрдХ рдЖрджрд┐рдо рдмреЙрдХреНрд╕ рдореЗрдВ рдПрдХ рдмрдирд╛рд╡рдЯ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЯреЗрдХреНрд╕рдЪрд░реНрдбрдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЪреЗрд╣рд░реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдмрдирд╛рд╡рдЯ рд╕реЗрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред ObjectTextureSpec рдкреНрд░рдХрд╛рд░ рдЗрд╕ рддрд░рд╣ рд╕рдВрд░рдЪрд┐рдд рд╣реИ:-- Structure.Texture
data ObjectTextureSpec = BoxTextureSpec
{ quadSideTexes :: [ ( BoxSide , QuadColorSpec ) ]
, defQuadSideTex :: QuadColorSpec
} deriving ( Show )
data QuadColorSpec = QuadTexture TextureName
| QuadPlainColor GLfColor4
| NoQuadColorSpec
deriving ( Show )
-- BoxSide Common.GLTypes.
-- , :
data BoxSide = SideTop
| SideBottom
| SideLeft
| SideRight
| SideRear
|SideFront
рдкрд╛рдиреЗ ( рджрд┐рдЦрд╛рдПрдБ , Eq )
рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рддреАрд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрдирд╛рд╡рдЯ рд╡рд╛рд▓реЗ рд╣реИрдВ? рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ!
рдЬрд╛рдиреЗ TExES = [ ( SideTop , QuadTexture ARROWTEX ) ]
defaultTex = QuadTexture yellowBaseTex
boxTexSpec = BoxTextureSpec TExES defaultTex
рдпрд╛ рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл рджреЛ рдЪреЗрд╣рд░реЗ, рдФрд░ рдХреБрдЫ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдмрд╛рдХреА? рдФрд░ рдпрд╣ рд╕рдВрднрд╡ рд╣реИредрдЬрд╛рдиреЗ TExES = [ ( SideFront , QuadTexture ARROWTEX )
, ( SideRear , QuadTexture ARROWTEX ) ]
defaultTex = QuadPlainColor ( color3 1 0 0 )
boxTexSpec = BoxTextureSpec TExES defaultTex
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╖рдп рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдЧреНрд░рд╛рдлреЛрдордмрдЬреЗрдХреНрдЯ рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдореЗрдиреЗрдореЛрдирд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдирд┐рдореНрди рдХрд╛рд░реНрдп рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред GraphObject рдореЙрдбреНрдпреВрд▓: primitiveBox, variableBox, functionBox, рдиреАрдВрд╡ рдмреЙрдХреНрд╕, arrowBridgeBox, equSignBridgeBox, BridgeBox, рдФрд░ guardFrameред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рд╣реА рдХрд╛рд░реНрдп рджреВрдВрдЧрд╛:-- Structure.GraphObject
primitiveBox trans dim @ ( GL . Vector3 l h w ) texName = ( trans , dim , PrimitiveBox ( vertex3 l h w ) texName )
variableBox _ dim @ ( GL . Vector3 l h w ) = ( nullVector3 , dim , PrimitiveBox ( vertex3 l h w ) helloTex )
arrowBridgeBox dim = bridgeBox dim arrowTex
equalSignBridgeBox dim = bridgeBox dim equalSignTex
bridgeBox dim @ ( GL . Vector3 l h w ) texName =
( nullVector3 , dim , TexturedBox ( vertex3 l h w ) boxTexSpec )
where
boxTexSpec = BoxTextureSpec texes defTex
texes = [ ( SideTop , QuadTexture texName ) ]
defTex = QuadTexture yellowBaseTex
рд╣рдореЗрдВ рдкреНрд░рддрд┐рдкрд╛рджрди рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдмрд╛рдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдлрд┐рд▓рд╣рд╛рд▓, рдореИрдВ рдЧреНрд░рд╛рдлрд┐рдХ рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рдХреНрд╕ рдХреЛ рджреГрд╢реНрдп рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рддреБрд░рдВрдд рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдбреНрд░реЙ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реВрдк рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдШреВрдорддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдРрд╕рд╛ рдХреЛрдб рдЕрдХреНрд╖рдо рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдПрдХ рд╣реА рд╕реНрдЯреНрд░рдХреНрдЪреЛрд░ рдСрдмрдЬреЗрдХреНрдЯ рдЯреНрд░реА рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рджреГрд╢реНрдп рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдХреЛрдИ рдмрд╛рдзрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА [IO ()] рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдФрд░ рд╕рдВрдХрд▓рди рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:-- Draw.Render
render texRes ( StructureObject _ ( soTrans , _ ) goSpec objects ) = do
GL . translate soTrans --
mapM_ ( render texRes ) objects --
sequence_ $ compileGraphObjectSpec texRes goSpec -- OpenGL-
GL . translate . negateVector3 $ soTrans --
рд░реЗрдВрдбрд░рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╣реИред рд╡реГрдХреНрд╖ рдХреЛ рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдиреАрдЪреЗ рдЬрд╛рддреЗ рд╣реБрдП, рд╣рдо рдмрд╛рд▓ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдСрдлрд╕реЗрдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рд╣рдо рдкрд┐рдЫрд▓реЗ рд╕реНрддрд░ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрди рдСрдлрд╕реЗрдЯ рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВред CompileGraphObjectSpec рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдЧреНрд░рд╛рдлрд╝ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдЧреНрд░рд╛рдлрд╝рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдиреБрдХреНрд░рдо_ рдлрд╝рдВрдХреНрд╢рди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ [IO ()]ред рдЧреНрд░рд╛рдлрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдПрдХ рд░рд┐рд╢реНрддреЗрджрд╛рд░ рдСрдлрд╕реЗрдЯ рднреА рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдирд╛рд▓реЙрдЧ рдХреЛрдСрд░реНрдбрд┐рдиреЗрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рддреЗ рд╣реИрдВ:-- Structure.GOCompile
compileGraphObjectSpec texRes ( goTrans , _, go ) = let
forwardTrans = GL . translate goTrans
compiled = compileGraphObject texRes go
backwardTrans = GL . translate . negateVector3 $ goTrans
in ( forwardTrans : compiled ) ++ [ backwardTrans ]
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреЛрдб .GOCompile рдореЙрдбреНрдпреВрд▓ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рддрдХрдиреАрдХреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреГрдврд╝ рд╕рдВрдХрд▓реНрдк рдФрд░ рд╕реВрдЪреА рд╕рдордЭ) рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдмреЗрд╢рдХ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рд╕рдордЭрдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реБрдВрджрд░рддрд╛ рдФрд░ рдкреВрд░реНрдгрддрд╛ рд╣реИ, рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдореВрд▓реНрдпрд╡рд╛рди рд╣реИ:-- | Collects actions for specified box side drawings.
-- | It should be used only in this module.
f :: PreparedTextureObjects
-> GLfVertex3
-> ( BoxSide , QuadColorSpec )
-> ( [ BoxSide ] , [ IO ( ) ] )
-> ( [ BoxSide ] , [ IO ( ) ] )
f texRes boxDim ( side , qColorSpec ) ( sList , ioList ) = let
boxIO = do setQuadColorSpec texRes qColorSpec
GL . renderPrimitive GL . Quads ( boxSide boxDim side )
in ( side : sList , boxIO : ioList )
-- | Compiles GraphObject into action list structure, which is ready-to-eval. ([IO ()])
compileGraphObject :: PreparedTextureObjects -> GraphObject -> [ IO ( ) ]
compileGraphObject _ NoGraphObject = [ ]
compileGraphObject texRes ( GraphObjects gObjectSpecs ) =
concatMap ( compileGraphObjectSpec texRes ) gObjectSpecs
compileGraphObject texRes ( PrimitiveBox boxDim texName ) =
[ do GL . color colorWhite
GL . textureBinding GL . Texture2D GL .$= lookup texName texRes
GL . renderPrimitive GL . Quads ( allBoxSides boxDim ) ]
compileGraphObject texRes ( TexturedBox boxDim boxTexSpec ) = let
( BoxTextureSpec sideTexes defTex ) = boxTexSpec
( textedSides , textedSideDrawList ) = foldr ( f texRes boxDim ) ( [ ] , [ ] ) sideTexes
untextedSides = [ s | s <- boxSideList , s ` notElem ` textedSides ]
untextedQColor = setQuadColorSpec texRes defTex
untextedSidesDraw = GL ред рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ GL ред рдХреНрд╡рд╛рдбреНрд╕ ( рдмреЙрдХреНрд╕рд╕рд╛рдЗрдбреНрд╕ рдмреЙрдХреНрд╕рдбрд┐рдо рдЕрдирдЯреЗрдХреНрд╕реНрдЯреЗрдбрд╕рд╛рдЗрдбреНрд╕ ) рдЕрдирдЯреЗрдХреНрд╕реНрдЯреЗрдб рдХреНрдпреВрдХреНрд▓рд░
рдореЗрдВ : рдЕрдирдЯреЗрдХреНрд╕реНрдЯреЗрдбрд╕рд╛рдЗрдбрд╡рд╛рд░реНрдб: рдЯреЗрдХреНрд╕реНрдЯреЗрдбрд╕рд╛рдЗрдбрдбреНрд░рд╛рд▓рд┐рд╕реНрдЯ
рдмрдХреНрд╕реЗ рдЪреЗрд╣рд░реЗ рд╕реЗ рдмрдиреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдкрдХреНрд╖ рд░рдВрдЧ рдпрд╛ рдмрдирд╛рд╡рдЯ рд╕реЗ рднрд░реЗ рд╣реЛрддреЗ рд╣реИрдВред рдУрдкрдирдЬреАрдПрд▓ рдореЗрдВ, рдЖрдк рдХрд┐рд╕реА рднреА рдЖрдХрд╛рд░ рдХреЛ рд▓рдВрдмрд╡рдд рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреЗ рдЪрддреБрд░реНрднреБрдЬ рдХреЗ рдХреЛрдиреЗ рд╣реЛрдВрдЧреЗред рдХреЛрдиреЗ рдХреА рд▓рдВрдмрд╛рдИ, рдКрдВрдЪрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ рдордВрдж рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рд╢реВрдиреНрдп рдмрд┐рдВрджреБ рдмрд╛рдпрд╛рдБ-рдирд┐рдЪрд▓рд╛-рдмреИрдХ рдХреЗ рдХреЛрдиреЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ (рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐ OpenGL рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЕрдХреНрд╖реЛрдВ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: OX - рджрд╛рдИрдВ рдУрд░, рдУрдП - рд╢реАрд░реНрд╖ рдкрд░, OZ - рд╣рдорд╛рд░реЗ рд▓рд┐рдП) ред HOpenGL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Misc.BoxSide рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЪреЗрд╣рд░реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВредboxSide :: GLfVertex3 -> BoxSide -> IO ( )
boxSide ( GL . Vertex3 x y z ) SideTop = do
GL . texCoord texCoordDR >> GL . vertex ( vertex3 x y z )
GL . texCoord texCoordUR >> GL . vertex ( vertex3 x y 0 )
GL . texCoord texCoordUL >> GL . vertex ( vertex3 0 y 0 )
GL . texCoord texCoordDL >> GL . vertex ( vertex3 0 y z )
boxSide ( GL . Vertex3 x y z ) SideFront = do
GL . texCoord texCoordUR >> GL . vertex ( vertex3 x y z )
GL . texCoord texCoordUL >> GL . vertex ( vertex3 0 y z )
GL . texCoord texCoordDL >> GL . vertex ( vertex3 0 0 z )
GL . texCoord texCoordDR >> GL . vertex ( vertex3 x 0 z )
-- ... 6 .
boxSideList = [ SideTop , SideBottom , SideLeft , SideRight , SideRear , SideFront ]
boxSides boxDim = mapM_ ( boxSide boxDim )
allBoxSides boxDim = boxSides boxDim boxSideList
рдареАрдХ рд╣реИ, рд╣рдо рдмрд▓реНрдХрд┐ рд╕рддрд╣реА рд░реВрдк рд╕реЗ рдЧреНрд░рд╛рдлрд╕рд░реНрд╡рд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕рд░реНрд╡рд░ рднрд╛рдЧ рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдХреИрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЪрд┐рддреНрд░реЛрдВ рд╕реЗ рдмрдирд╛рд╡рдЯ рдХреИрд╕реЗ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдФрд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрднреА рднреА рдмрд╣реБрдд рдХрд╛рдо рд╣реИ, рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕рд░реНрд╡рд░ рд▓рдЧрднрдЧ 10 рдкреНрд░рддрд┐рд╢рдд рддреИрдпрд╛рд░ рд╣реИред рдХрд╛рдо рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐ рд╕рднреА рд╣рд╛рд╕реНрдХреЗрд▓ рднрд╛рд╖рд╛ рддрддреНрд╡ рд╕реНрдХреЗрдЪ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рд╣реИрдВ, рдЬреЛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ; рд╕рдм рдХреЗ рдмрд╛рдж, рдбрд┐рдмрдЧрд┐рдВрдЧ рдмрдирд╛рд╡рдЯ рдЖрджрд░реНрд╢ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИрдВред рдореИрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкрд╛рд░ рдмрдирд╛рд╡рдЯ рдХреЗ рдЦрд┐рдВрдЪрд╛рд╡ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╕рдЬрд╛рдиреЗ, рдХреБрдЫ рдЕрдзрд┐рдХ рд╕рд╛рдордВрдЬрд╕реНрдпрдкреВрд░реНрдг рдмрдирд╛рдирд╛, рдбрд┐рдЬрд╛рдЗрди рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ред рдЕрднреА рднреА рдлреЛрдВрдЯ рдФрд░ рд▓рд╛рдЗрди рдбреНрд░рд╛рдЗрдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдПрд░рд┐рдЯреА рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрд╣ рдПрдХ рдФрд░ рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ, рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЕрдиреНрдп рддрд░реАрдХреЗ рд╣реИрдВред рдФрд░ рдлрд┐рд░, рд╕реВрдХреНрд╖реНрдо рддрдХрдиреАрдХ, рдореБрд╢реНрдХрд┐рд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо,рд╕реНрдорд╛рд░реНрдЯ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ, рдЬреЛ рдЕрдХреЗрд▓реЗ рдУрд╣ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреА рдХрдард┐рди рд╣реИ ... рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╣реИ, рдЧрд╣рд░реА рдФрд░ рд╕реМрдВрджрд░реНрдп рдЖрдирдВрдж рд▓рд╛ рд░рд╣реА рд╣реИред рдореИрдВ рд╕рднреА рдХреЛ рдЙрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ: рдпрд╣ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЕрднреНрдпрд╛рд╕ рд╣реИ, рдФрд░ рдмрдбрд╝реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдореЗрдВ рдЕрдиреБрднрд╡, рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЗрдВ рдЬреНрдЮрд╛рди, рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЕрдзреНрдпрдпрдиред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдмрдврд╝рдХрд░, рдпрд╣ рдХрд▓рд╛ рдФрд░ рд░рдЪрдирд╛рддреНрдордХрддрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рдЬреАрд╡рди рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдмрдирд╛рддреА рд╣реИредрдХреЛрдб рдЦреБрд▓рд╛ рд╣реИ рдФрд░ GitHub рдкрд░ рд╕реНрдерд┐рдд рд╣реИ: github.com/graninas/GraphServerрдпрд╣ рдПрдХ рдХреНрд░реЙрд╕-рд▓реЗрдЦ рд╣реИред рдЧреНрд░рд╛рдлрд┐рдХ рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП, рд╣рд╛рд╕реНрдХреЗрд▓ - рдбрд┐рдЬрд╛рдЗрди рд▓реЗрдЦ рдкрдврд╝реЗрдВ редрдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреАрдПрд╕ рдЕрдиреБрд░реЛрдз: рдпрджрд┐ рдЖрдк рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдкреАрдПрдо рд╕реЗ, рдЖрдИрд╕реАрдХреНрдпреВ рдореЗрдВ рдпрд╛ рдореЗрд▓ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВред Google рдкрд░ рдореЗрд▓, рдЙрдкрдирд╛рдо Habr├й рдкрд░ рд╕рдорд╛рди рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдиреНрдп рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░реЗрдорд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ, рдпрд╛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рд▓реЗрдЦ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдХрд░ рдЗрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рд╛рдореВрд╣рд┐рдХ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдореИрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдкреЗрд╢реЗрд╡рд░ рддрд░реАрдХреЗ рд╕реЗ рдирд┐рднрд╛рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реВрдВред