-----------------------------------------------------------------------
-- An example of Actor Prolog program.                               --
-- (c) 2012 IRE RAS Alexei A. Morozov                                --
-----------------------------------------------------------------------

import .. from "morozov/Java3D";

class 'Main' (specialized 'Canvas3D'):
--
background_color        = 'White';
--
[
PREDICATES:
--
imperative:
--
phi(Numerical)                          - (o);
vertices(Vertices)                      - (o);
--
'/'(Numerical,Numerical) = Numerical    - (i,i);
'-'(Numerical) = Numerical              - (i);
--
CLAUSES:
--
goal:-!,
        vertices(Vertices),
        Indices== [
                00,01,05,06,02, 00,02,07,08,03, 00,03,09,04,01,
                01,04,10,11,05, 02,06,12,13,07, 03,08,14,15,09,
                05,11,16,12,06, 07,13,18,14,08, 09,15,17,10,04,
                19,16,11,10,17, 19,17,15,14,18, 19,18,13,12,16],
        StripCounts== [5,5,5,5,5,5,5,5,5,5,5,5],
        Bounds== 'BoundingSphere'({}),
        show([
                'TransformGroup'({
                        allowTransformWrite: 'yes',
                        branches: [
                                'TransformGroup'({
                                        transform3D: 'Transform3D'({
                                                scale: 0.25
                                                }),
                                        branches: [
                                                'Shape3D'({
                                                        geometry: geometryArray(
                                                                'GeometryInfo'({
                                                                        primitive: 'POLYGON_ARRAY',
                                                                        coordinates: Vertices,
                                                                        coordinateIndices: Indices,
                                                                        stripCounts: StripCounts,
                                                                        generateNormals: 'yes'
                                                                        })
                                                                ),
                                                        appearance: 'Appearance'({
                                                                material: 'Material'({})
                                                                })
                                                        })
                                                ]
                                        }),
                                'RotationInterpolator'({
                                        alpha: 'Alpha3D'({
                                                loopCount: -1,
                                                increasingAlphaDuration: 4000
                                                }),
                                        schedulingBounds: Bounds
                                        })
                                ]
                        }),
                'Background'({
                        color: color3(1.0,1.0,1.0),
                        applicationBounds: Bounds
                        }),
                'AmbientLight'({
                        lightOn: 'yes',
                        color: 'Red',
                        influencingBounds: Bounds
                        }),
                'PointLight'({
                        color: 'Green',
                        position: p(3,3,3),
                        attenuation: a(1,0,0),
                        influencingBounds: Bounds
                        }),
                'PointLight'({
                        color: 'Orange',
                        position: p(-2,2,2),
                        attenuation: a(1,0,0),
                        influencingBounds: Bounds
                        })
                ]).
--
phi(Value):-
        Value== 0.5*(?sqrt(5)+1).
--
vertices(Vertices):-
        phi(Phi),
        Vertices== [
                p(1,1,1),
                p(0,1/Phi,Phi),
                p(Phi,0,1/Phi),
                p(1/Phi,Phi,0),
                p(-1,1,1),
                p(0,-1/Phi,Phi),
                p(1,-1,1),
                p(Phi,0,-1/Phi),
                p(1,1,-1),
                p(-1/Phi,Phi,0),
                p(-(Phi),0,1/Phi),
                p(-1,-1,1),
                p(1/Phi,-(Phi),0),
                p(1,-1,-1),
                p(0,1/Phi,-(Phi)),
                p(-1,1,-1),
                p(-1/Phi,-(Phi),0),
                p(-(Phi),0,-1/Phi),
                p(0,-1/Phi,-(Phi)),
                p(-1,-1,-1)
                ].
]