/**
**/
:-object rgb : [bcilib].
var url = 'rgb.wrl'.
main :-
format('Loading RGB example from ~w~n', [url]),
format('Please wait ...~n'),
loadURL(url),
sleep(3000),
init_RGBs(board),
eventObserverQueue(cylR, isOver, cyl_queue),
eventObserverQueue(cylG, isOver, cyl_queue),
eventObserverQueue(cylB, isOver, cyl_queue),
eventObserverQueue(cylR, isActive, cyl_queue),
eventObserverQueue(cylG, isActive, cyl_queue),
eventObserverQueue(cylB, isActive, cyl_queue),
new(event(cyl_queue), _).
init_RGBs(BoardName) :-
getSFVec3f(cylR, boxposition, X1, _, _),
getSFVec3f(cylG, boxposition, X2, _, _),
getSFVec3f(cylB, boxposition, X3, _, _),
event <- rgb_value(cylR, X1, R),
event <- rgb_value(cylG, X2, G),
event <- rgb_value(cylB, X3, B),
setSFColor(cylR, boxcolor, R, 0.0, 0.0),
setSFColor(cylG, boxcolor, 0.0, G, 0.0),
setSFColor(cylB, boxcolor, 0.0, 0.0, B),
setSFColor(cube, boxcolor, R,G,B),
event <- update_board(BoardName, R,G,B).
:-end_object rgb.
:-object event : [bcilib].
var is_over.
var is_active.
event(Queue) :-
repeat,
get_queue(Queue, Event),
format('event : ~w~n', [Event]),
mouse_event(Event),
fail.
mouse_event(isOver(sfbool(Value),_Time, CylName)) :-
!,
is_over := Value,
mouse_click(is_active, is_over, CylName).
mouse_event(isActive(sfbool(Value),_Time, CylName)) :-
!,
is_active := Value,
mouse_click(is_active, is_over, CylName).
mouse_event(Event) :-
format('unknown event ~w~n', [Event]).
mouse_click(true, true, CylName) :-
!,
getSFVec3f(CylName, hitPoint_changed, XHit, _YHit, _ZHit),
getSFVec3f(CylName, boxposition, _XBox, YBox, ZBox),
setSFVec3f(CylName, boxposition, XHit, YBox, ZBox),
rgb_value(CylName, XHit, RGB),
getSFColor(cube, boxcolor, RC,GC,BC),
update_color(CylName, cube, board, RGB, RC,GC,BC).
mouse_click( _dont_let, _mouse_click, _fail).
update_color(cylR, CubeName, BoardName, RGB, _RC,GC,BC) :-
!,
setSFColor(cylR, boxcolor, RGB, 0.0, 0.0),
setSFColor(CubeName, boxcolor, RGB,GC,BC),
update_board(BoardName, RGB,GC,BC).
update_color(cylG, CubeName, BoardName, RGB, RC,_GC,BC) :-
!,
setSFColor(cylG, boxcolor, 0.0, RGB, 0.0),
setSFColor(CubeName, boxcolor, RC,RGB,BC),
update_board(BoardName, RC,RGB,BC).
update_color(cylB, CubeName, BoardName, RGB, RC,GC,_BC) :-
setSFColor(cylB, boxcolor, 0.0, 0.0, RGB),
setSFColor(CubeName, boxcolor, RC,GC,RGB),
update_board(BoardName, RC,GC,RGB).
rgb_value(CylName, X, RGB) :-
getSFFloat(CylName, height, H),
RGB is X / H + 0.5 .
update_board(BoardName, RC,GC,BC) :-
format_to_atom(Rtext, 'R = ~w', [RC]),
format_to_atom(Gtext, 'G = ~w', [GC]),
format_to_atom(Btext, 'B = ~w', [BC]),
setMFString(BoardName, text, [Rtext,Gtext,Btext]).
:-end_object event.
/**
**/