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

import .. from "morozov/Java3D";

class 'Main' (specialized 'Canvas3D'):
--
enable_scene_antialiasing       = 'yes';
--
[
goal:-!,
        Bounds== 'BoundingSphere'({}),
        show([
                'TransformGroup'({
                        allowTransformWrite: 'yes',
                        branches: [
                                'TransformGroup'({
                                        transform3D: 'Transform3D'({
                                                scale: 0.2
                                                }),
                                        branches: [
                                                'Box'({
                                                        xdim: 1.2,
                                                        ydim: 0.3,
                                                        zdim: 0.8,
                                                        generateNormals: 'yes',
                                                        generateNormalsInward: 'yes',
                                                        appearance: 'Appearance'({
                                                                material: 'Material'({})
                                                                })
                                                        }),
                                                'TransformGroup'({
                                                        transform3D: 'Transform3D'({
                                                                translation: [0,1.5,0]
                                                                }),
                                                        branches: [
                                                                'Sphere'({
                                                                        radius: 1.0,
                                                                        generateNormals: 'yes',
                                                                        divisions: 100
                                                                        })
                                                                ]
                                                        }),
                                                'TransformGroup'({
                                                        transform3D: 'Transform3D'({
                                                                translation: [-1,-1.5,0]
                                                                }),
                                                        branches: [
                                                                'Cylinder'({
                                                                        radius: 1.0,
                                                                        height: 2.0,
                                                                        generateNormals: 'yes',
                                                                        xdivisions: 100,
                                                                        ydivisions: 1,
                                                                        appearance: 'Appearance'({
                                                                                material: 'Material'({}),
                                                                                transparencyAttributes: 'TransparencyAttributes'({
                                                                                        transparency: 0.5,
                                                                                        transparencyMode: 'NICEST'
                                                                                        })
                                                                                })
                                                                        })
                                                                ]
                                                        }),
                                                'TransformGroup'({
                                                        transform3D: 'Transform3D'({
                                                                translation: [1,-1.5,0]
                                                                }),
                                                        branches: [
                                                                'Cone'({
                                                                        radius: 1.0,
                                                                        height: 2.0,
                                                                        generateNormals: 'yes',
                                                                        xdivisions: 100,
                                                                        ydivisions: 1
                                                                        })
                                                                ]
                                                        })
                                                ]
                                        }),
                                'RotationInterpolator'({
                                        alpha: 'Alpha3D'({
                                                increasingEnable: 'yes',
                                                decreasingEnable: 'yes',
                                                increasingAlphaDuration: 4500,
                                                decreasingAlphaDuration: 4500,
                                                alphaAtZeroDuration: 300,
                                                alphaAtOneDuration: 300,
                                                increasingAlphaRampDuration: 500,
                                                decreasingAlphaRampDuration: 500,
                                                loopCount: -1
                                                }),
                                        schedulingBounds: 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
                        })
                ]).
]