-----------------------------------------------------------------------
-- An example of Actor Prolog program. --
-- (c) 2012 IRE RAS Alexei A. Morozov --
-----------------------------------------------------------------------
import .. from "morozov/Java3D";
class 'Main' (specialized 'Canvas3D'):
--
bounds : BoundingSphere
= 'BoundingSphere'({});
--
wireframe : Appearance
= 'Appearance'({
polygonAttributes: 'PolygonAttributes'({
rasterizationMode: 'POLYGON_LINE',
cullFace: 'CULL_BACK',
polygonOffsetBias: 0
}),
coloringAttributes: 'ColoringAttributes'({
color: color3(0,0,0),
shadeModel: 'SHADE_FLAT'
})
});
solid : Appearance
= 'Appearance'({
material: 'Material'({})
});
glass : Appearance
= 'Appearance'({
material: 'Material'({}),
transparencyAttributes: 'TransparencyAttributes'({
transparency: 0.5,
transparencyMode: 'NICEST'
})
});
--
background_color = 'White';
enable_scene_antialiasing = 'yes';
--
width = 40;
--
internal:
--
con = ('Console',
x= 40,
width= 40);
--
[
PREDICATES:
--
imperative:
--
create_tetrahedron = Shape3D;
--
create_dodecahedron = Shape3D;
dodecahedron_vertices(Vertices) - (o);
dodecahedron_phi(Numerical) - (o);
--
update_appearance(NodeLabels,Appearance) - (i,i);
--
'/'(Numerical,Numerical) = Numerical - (i,i);
'-'(Numerical) = Numerical - (i);
--
CLAUSES:
--
goal:-!,
SimpleNodes== [
'Sphere'({
label: "MySphere1",
radius: 0.7,
divisions: 100,
enableGeometryPicking: 'yes',
enableAppearanceModify: 'yes',
generateNormals: 'yes',
appearance: wireframe
}),
'Box'({
label: "MyBox",
xdim: 1.2,
ydim: 0.3,
zdim: 0.8,
enableGeometryPicking: 'yes',
enableAppearanceModify: 'yes',
generateNormals: 'yes',
appearance: wireframe
}),
'TransformGroup'({
transform3D: 'Transform3D'({
translation: [0,1.5,0]
}),
branches: [
'Sphere'({
label: "MySphere2",
radius: 1.0,
divisions: 100,
enableGeometryPicking: 'yes',
enableAppearanceModify: 'yes',
generateNormals: 'yes',
appearance: wireframe
})
]
}),
'TransformGroup'({
transform3D: 'Transform3D'({
translation: [-1,-1.5,0]
}),
branches: [
'Cylinder'({
label: "MyCylinder",
radius: 1.0,
height: 2.0,
xdivisions: 100,
ydivisions: 1,
enableGeometryPicking: 'yes',
enableAppearanceModify: 'yes',
generateNormals: 'yes',
appearance: wireframe
})
]
}),
'TransformGroup'({
transform3D: 'Transform3D'({
translation: [1,-1.5,0]
}),
branches: [
'Cone'({
label: "MyCone",
radius: 1.0,
height: 2.0,
xdivisions: 100,
ydivisions: 1,
enableGeometryPicking: 'yes',
enableAppearanceModify: 'yes',
generateNormals: 'yes',
appearance: wireframe
})
]
})
],
Tetrahedron== ?create_tetrahedron(),
Dodecahedron== ?create_dodecahedron(),
show([
'TransformGroup'({
allowTransformWrite: 'yes',
branches: [
'TransformGroup'({
transform3D: 'Transform3D'({
scale: 0.2
}),
branches: SimpleNodes
}),
'TransformGroup'({
transform3D: 'Transform3D'({
scale: 0.12,
translation: [0,0,-0.4]
}),
branches: [
Tetrahedron
]
}),
'TransformGroup'({
transform3D: 'Transform3D'({
scale: 0.12,
translation: [0,0,0.4]
}),
branches: [
Dodecahedron
]
}),
'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
}),
'PickCanvas'({
handleMouseClicked: 'yes',
handleMouseEntered: 'yes',
handleMouseExited: 'yes',
handleMousePressed: 'no',
handleMouseReleased: 'no',
handleMouseDragged: 'no',
handleMouseMoved: 'no',
isPassive: 'no',
period: 150,
tolerance: 3,
mode: 'GEOMETRY'
})
]).
--
create_tetrahedron =
'Shape3D'({
label: "MyTetrahedron",
geometry: 'IndexedTriangleArray'({
vertexCount: 4,
includeVertexPositions: 'yes', -- COORDINATES
includePerVertexNormals: 'yes', -- NORMALS
indexCount: 12,
coordinates: [
p(1,1,1),
p(1,-1,-1),
p(-1,1,-1),
p(-1,-1,1)
],
coordinateIndices: [
0,1,2,0,3,1,
1,3,2,2,3,0
],
normals: [
[N,N,-(N)],
[N,-(N),N],
[-(N),-(N),-(N)],
[-(N),N,N]
],
normalIndices: [
0,0,0,1,1,1,
2,2,2,3,3,3
]
}),
appearance: wireframe,
allowAppearanceWrite: 'yes',
pickingDetailLevel: 'INTERSECT_TEST'
}) :-
N== 1.0/?sqrt(3).
--
create_dodecahedron =
'Shape3D'({
label: "MyDodecahedron",
geometry: geometryArray(
'GeometryInfo'({
primitive: 'POLYGON_ARRAY',
coordinates: Vertices,
coordinateIndices: Indices,
stripCounts: StripCounts,
generateNormals: 'yes'
})
),
appearance: wireframe,
allowAppearanceWrite: 'yes',
pickingDetailLevel: 'INTERSECT_TEST'
}) :-
dodecahedron_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].
--
dodecahedron_vertices(Vertices):-
dodecahedron_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)
].
--
dodecahedron_phi(Value):-
Value== 0.5*(?sqrt(5)+1).
--
mouse_clicked(NodeLabels):-!,
con ? writeln("Mouse clicked: ",NodeLabels),
update_appearance(NodeLabels,solid).
--
mouse_entered(NodeLabels):-!,
con ? writeln("Mouse entered: ",NodeLabels),
update_appearance(NodeLabels,glass).
--
mouse_exited(NodeLabels):-!,
con ? writeln("Mouse exited: ",NodeLabels),
update_appearance(NodeLabels,wireframe).
--
mouse_pressed(NodeLabels):-!,
con ? writeln("Mouse pressed: ",NodeLabels).
--
mouse_released(NodeLabels):-!,
con ? writeln("Mouse released: ",NodeLabels).
--
mouse_dragged(NodeLabels):-!,
con ? writeln("Mouse dragged: ",NodeLabels).
--
mouse_moved(NodeLabels):-!,
con ? writeln("Mouse moved: ",NodeLabels).
--
update_appearance([NodeLabel|Rest],Appearance):-
set_appearance(NodeLabel,Appearance),
update_appearance(Rest,Appearance).
update_appearance([],_).
]
|