-----------------------------------------------------------------------
-- An example of Actor Prolog program.                               --
-- (c) 2012 IRE RAS Alexei A. Morozov                                --
--                                                                   --
-- This is a demonstration of using the keyboard for interaction     --
-- in a Java 3D scene.                                               --
-----------------------------------------------------------------------

import .. from "morozov/Java3D";

class 'Main' (specialized 'Canvas3D'):
--
constant:
--
        y       = 0;
        height  = 22;
--
internal:
--
angle   = ('Counter');
--
con     = ('Console',
                y= 22,
                height= 3);
--
[
goal:-!,
        show([
                'TransformGroup'({
                        allowTransformWrite: 'yes',
                        allowTransformRead: 'yes',
                        branches: [
                                'ColorCube'({
                                        scale: 0.4
                                        }),
                                'CustomizedBehavior'({
                                        name: "UserInput",
                                        wakeupOn: 'KEY_PRESSED',
                                        schedulingBounds: 'BoundingSphere'({})
                                        })
                                ],
                        label: "TargetObject"
                        })
                ]),
        con ? writeln(  "Double click on the cube and strike "
                        "any key to rotate it.").
--
action("UserInput"):-!,
        Angle== angle ? increase(),
        set_transform("TargetObject",'Transform3D'({rotY:Angle})).
]

class 'Counter' (specialized 'Database'):
[
DOMAINS:
--
Target  = Angle.
--
PREDICATES:
--
imperative:
--
increase = Target;
--
'+'(Angle,Angle) = Angle        - (i,i);
--
CLAUSES:
--
increase() = V2 :-
        retract(V1),!,
        V2== V1 + 0.1,
        insert(V2).
increase() = V2 :-
        V2== 0.1,
        insert(V2).
]