Polyhedron Derived Type

type, public, extends(ReferenceFrame) :: Polyhedron

A surface fixed in its frame (not in OpenFrames): vertices and faces, given as polygons (set_faces: e.g. a polyhedron's), triangles (set_triangles) or a grid of points (set_grid: e.g. a tube of trajectories, an invariant manifold). Drawn as faces, edges (the polygons' outlines, the triangles' sides, or the grid's lines) and vertices (set_draw_mode).

Faces: lit by the scene's lights (the default; flat, or smooth across the vertices with set_smooth) or unlit (as a cone's sides); in the face color, or a color per vertex (set_vertex_colors); opaque, or translucent (set_opacity, or the colors' alpha: drawn after the opaque scene, sorted by depth, writing none); seen from both sides (the default, for open surfaces; set_two_sided(.false.) for a closed one, whose back faces are then not drawn through it).

Vertices are single precision on the GPU, relative to the frame: for a shape far from the frame's origin, put it in a frame placed near it.


Inherits

type~~polyhedron~~InheritsGraph type~polyhedron Polyhedron type~referenceframe ReferenceFrame type~polyhedron->type~referenceframe type~shapenodes ShapeNodes type~polyhedron->type~shapenodes nodes type~referenceframe->type~referenceframe follow_frame_ c_ptr c_ptr type~referenceframe->c_ptr light_node, light_switch, node_, contents_node, axis_node, axis_label_node, axis_arrow, axis_text, name_label_node, name_text type~framepointer FramePointer type~referenceframe->type~framepointer children, parents type~trajectoryfollower TrajectoryFollower type~referenceframe->type~trajectoryfollower follower_ type~shapenodes->c_ptr contents, shape type~framepointer->type~referenceframe p type~datasource DataSource type~trajectoryfollower->type~datasource sources_ type~trajectorypointer TrajectoryPointer type~trajectoryfollower->type~trajectorypointer trajs type~trajectory Trajectory type~trajectorypointer->type~trajectory p

Components

Type Visibility Attributes Name Initial
integer, private, allocatable :: edge(:,:)

edges (2, k), vertex numbers

real(kind=wp), private :: face_color_(4) = 1.0_wp

faces' color [r, g, b, a]

real(kind=wp), private :: line_color_(4) = 1.0_wp

edges' color

logical, private :: lit_ = .true.

lit by the scene's lights (else unlit, transparent)

integer, private :: mode = ior(POLY_FACES, POLY_EDGES)

an ior of POLY_FACES, POLY_EDGES, POLY_VERTICES

type(ShapeNodes), private :: nodes

the drawing

real(kind=wp), private :: opacity_ = 1.0_wp

the faces' (times their colors' alpha)

real(kind=wp), private :: point_color_(4) = 1.0_wp

vertices' color

real(kind=wp), private :: point_size_ = 6.0_wp

vertices' size (window units)

logical, private :: smooth_ = .false.

normals smooth across the vertices (else flat faces)

integer, private, allocatable :: tri(:,:)

triangles (3, m), vertex numbers (1-based)

logical, private :: two_sided_ = .true.

both sides drawn (and lit)

real(kind=wp), private, allocatable :: v(:,:)

vertices (3, n), frame coordinates

real(kind=wp), private, allocatable :: vertex_colors_(:,:)

a color per vertex (4, n) (none: the face color)

real(kind=wp), private :: width_ = 1.0_wp

edges' width (window units)


Constructor

public interface Polyhedron

The Polyhedron constructor: Polyhedron(...) makes one (see new_polyhedron for its arguments).

  • private function new_polyhedron(name, color) result(p)

    A polyhedron named name, of color color (its faces, edges and vertices), with no faces yet (set_faces, set_triangles or set_grid).

    Arguments

    Type IntentOptional Attributes Name
    character(len=*), intent(in) :: name

    the frame's name

    real(kind=wp), intent(in), optional :: color(:)

    [r, g, b] or [r, g, b, a] (0 to 1)

    Return Value type(Polyhedron)


Type-Bound Procedures

procedure, public :: add_child

  • private function add_child(self, child) result(ok)

    Add child to this frame's children. Returns false (and does nothing) for this frame itself or an ancestor of it; true if it is already a child.

    Read more…

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout), target :: self
    class(ReferenceFrame), intent(inout), target :: child

    the frame to add (not owned)

    Return Value logical

procedure, public :: attitude

  • private pure function attitude(self) result(q)

    Attitude relative to the parent frame, a quaternion [x, y, z, w].

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value real(kind=wp), (4)

procedure, public :: axes_labels_shown

procedure, public :: axes_shown

  • private pure function axes_shown(self)

    Which axes vectors are shown (NO_AXES, or X_AXIS, Y_AXIS, Z_AXIS combined).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value integer

procedure, public :: axis_label

  • private function axis_label(self, axis) result(text)

    The label text of axis X_AXIS, Y_AXIS or Z_AXIS.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self
    integer, intent(in) :: axis

    X_AXIS, Y_AXIS or Z_AXIS (else: '')

    Return Value character(len=:), allocatable

procedure, public :: bound => poly_bound

  • private subroutine poly_bound(self, center, radius)

    The bounding sphere: about the vertices' box's center.

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(in) :: self
    real(kind=wp), intent(out) :: center(3)

    the bounding sphere, frame coordinates (scene units)

    real(kind=wp), intent(out) :: radius

    the bounding sphere, frame coordinates (scene units)

procedure, public :: build_contents => poly_build_contents

  • private subroutine poly_build_contents(self, viewer, group)

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    type(c_ptr), intent(in) :: viewer

    a window's viewer (null: headless)

    type(c_ptr), intent(in) :: group

    the frame's contents group

procedure, public :: child

  • private function child(self, i) result(c)

    Child i (1 to num_children).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self
    integer, intent(in) :: i

    1 to num_children

    Return Value class(ReferenceFrame), pointer

procedure, public :: child_index

  • private function child_index(self, frame)

    Index of frame among the children, or 0.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self
    class(ReferenceFrame), intent(in), target :: frame

    the frame to find

    Return Value integer

procedure, public :: color

  • private pure function color(self) result(c)

    The color of the frame's decorations, [r, g, b, a] (0 to 1).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value real(kind=wp), (4)

procedure, public :: contents_shown

  • private pure function contents_shown(self)

    Whether what the frame draws is shown (show_contents).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value logical

procedure, public :: detach

  • private subroutine detach(self)

    Remove this frame from all its parents and children (before it goes out of scope or is deallocated while in a tree).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout), target :: self

procedure, public :: draw_mode => poly_draw_mode

  • private pure function poly_draw_mode(self)

    What is drawn: an ior of POLY_FACES, POLY_EDGES, POLY_VERTICES.

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(in) :: self

    Return Value integer

procedure, public :: face_color

  • private pure function face_color(self) result(c)

    The faces' color [r, g, b, a].

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(in) :: self

    Return Value real(kind=wp), (4)

procedure, public :: follow

  • private subroutine follow(self, traj, data, mode, add, data_frame)

    Follow traj (in addition to trajectories already followed, if add is true), with what to follow (data: FOLLOW_POSITION and/or FOLLOW_ATTITUDE; default both) and how (mode: FOLLOW_LOOP, the default, or FOLLOW_LIMIT). traj must stay alive while followed.

    Read more…

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    type(Trajectory), intent(in), target :: traj

    the trajectory to follow (not owned)

    integer, intent(in), optional :: data

    FOLLOW_POSITION/FOLLOW_ATTITUDE; FOLLOW_LOOP/FOLLOW_LIMIT

    integer, intent(in), optional :: mode

    FOLLOW_POSITION/FOLLOW_ATTITUDE; FOLLOW_LOOP/FOLLOW_LIMIT

    logical, intent(in), optional :: add

    (true: in addition to those followed (default false))

    class(ReferenceFrame), intent(in), optional, target :: data_frame

    the frame the data are in (default: the parent)

procedure, public :: follow_frame

  • private function follow_frame(self) result(f)

    The frame the followed data are in (follow's data_frame; null: the parent).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value class(ReferenceFrame), pointer

procedure, public :: follower

  • private function follower(self) result(f)

    The frame's trajectory follower, for finer control (data sources, time offset, ...).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in), target :: self

    Return Value type(TrajectoryFollower), pointer

procedure, public :: frame_info => poly_frame_info

  • private function poly_frame_info(self) result(info)

    What kind of frame this is: 'Polyhedron'.

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(in) :: self

    Return Value character(len=:), allocatable

procedure, public :: frame_string

  • private recursive function frame_string(self, prefix) result(str)

    The tree below this frame, one line per frame ("name (info)"), in OpenFrames' createFrameString format: children are prefixed "|-->".

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self
    character(len=*), intent(in), optional :: prefix

    before this frame's line (default ' ')

    Return Value character(len=:), allocatable

procedure, public :: has_light_source

  • private recursive function has_light_source(self) result(has)

    Whether this frame or one of its descendants has a light source enabled.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value logical

procedure, public :: has_vertex_colors

  • private pure function has_vertex_colors(self)

    Whether the faces have a color per vertex.

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(in) :: self

    Return Value logical

procedure, public :: is_following

  • private pure function is_following(self)

    Whether the frame follows trajectories (at least one, since follow).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value logical

procedure, public :: label_alignment

  • private pure function label_alignment(self)

    The labels' alignment (ALIGN_*).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value integer

procedure, public :: label_font

  • private function label_font(self) result(font)

    The labels' font as set ('' for the renderer's default).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value character(len=:), allocatable

procedure, public :: label_size

  • private pure function label_size(self)

    The labels' size in pixels.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value integer

procedure, public :: late_update

  • private recursive subroutine late_update(self, t)

    After the whole tree's update for time t (all frames at their positions for t): for contents that depend on other frames' positions, e.g. CustomLineSegments between spacecraft. Here, only the descendants'.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    real(kind=wp), intent(in) :: t

    simulation time

procedure, public :: light_ambient

  • private pure function light_ambient(self) result(rgb)

    The light source's ambient color [r, g, b].

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value real(kind=wp), (3)

procedure, public :: light_diffuse

  • private pure function light_diffuse(self) result(rgb)

    The light source's diffuse color [r, g, b].

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value real(kind=wp), (3)

procedure, public :: light_source_enabled

  • private pure function light_source_enabled(self)

    Whether this frame carries a light source.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value logical

procedure, public :: light_specular

  • private pure function light_specular(self) result(rgb)

    The light source's specular color [r, g, b].

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value real(kind=wp), (3)

procedure, public :: line_color => poly_line_color

  • private pure function poly_line_color(self) result(c)

    The edges' color [r, g, b, a].

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(in) :: self

    Return Value real(kind=wp), (4)

procedure, public :: line_width => poly_line_width

  • private pure function poly_line_width(self)

    The edges' width (window units).

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(in) :: self

    Return Value real(kind=wp)

procedure, public :: lit

  • private pure function lit(self)

    Whether the faces are lit.

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(in) :: self

    Return Value logical

procedure, public :: local_matrix

  • private pure function local_matrix(self) result(m)

    The transform from this frame to its parent (4x4).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value real(kind=wp), (4,4)

procedure, public :: local_matrix_at

  • private recursive function local_matrix_at(self, t) result(m)

    The transform from this frame to its parent at simulation time t: its fixed position and attitude, with what it follows at time t (the followed trajectories' state then, in the parent's coordinates). The same as local_matrix after update at time t, for any t, without changing anything.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self
    real(kind=wp), intent(in) :: t

    simulation time

    Return Value real(kind=wp), (4,4)

procedure, public :: motion_key

  • private recursive subroutine motion_key(self, stamp, data)

    What the frame's motion depends on, for drawings that depend on it to know when to redraw: stamp, the latest change of the motion of it and its ancestors (through first parents), and of the frames their followed data are in (poses set, parents changed, what is followed and how); and data, the followed trajectories' revisions summed. Either changes when the frame's motion over time changes.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self
    integer, intent(out) :: stamp

    the latest change; the followed data's revisions

    integer, intent(out) :: data

    the latest change; the followed data's revisions

procedure, public :: move_x_axis

  • private subroutine move_x_axis(self, base, length, head_ratio, body_radius, head_radius)

    Place the x axis vector: from base, length long, with a head of head_ratio of the length (default 0.3) and body and head radii (default 0.05 and 0.1 of the length); its label is at the tip, 0.4 of the length tall (at most label_size pixels). As OpenFrames' moveXAxis. Set before the frame is first shown.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    real(kind=wp), intent(in) :: base(3)

    (base: frame's coordinates)

    real(kind=wp), intent(in) :: length

    (base: frame's coordinates)

    real(kind=wp), intent(in), optional :: head_ratio

    defaults: 0.3; 0.05 and 0.1 of the length

    real(kind=wp), intent(in), optional :: body_radius

    defaults: 0.3; 0.05 and 0.1 of the length

    real(kind=wp), intent(in), optional :: head_radius

    defaults: 0.3; 0.05 and 0.1 of the length

procedure, public :: move_y_axis

  • private subroutine move_y_axis(self, base, length, head_ratio, body_radius, head_radius)

    Place the y axis vector (as move_x_axis; OpenFrames' moveYAxis).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    real(kind=wp), intent(in) :: base(3)

    (base: frame's coordinates)

    real(kind=wp), intent(in) :: length

    (base: frame's coordinates)

    real(kind=wp), intent(in), optional :: head_ratio

    defaults: 0.3; 0.05 and 0.1 of the length

    real(kind=wp), intent(in), optional :: body_radius

    defaults: 0.3; 0.05 and 0.1 of the length

    real(kind=wp), intent(in), optional :: head_radius

    defaults: 0.3; 0.05 and 0.1 of the length

procedure, public :: move_z_axis

  • private subroutine move_z_axis(self, base, length, head_ratio, body_radius, head_radius)

    Place the z axis vector (as move_x_axis; OpenFrames' moveZAxis).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    real(kind=wp), intent(in) :: base(3)

    (base: frame's coordinates)

    real(kind=wp), intent(in) :: length

    (base: frame's coordinates)

    real(kind=wp), intent(in), optional :: head_ratio

    defaults: 0.3; 0.05 and 0.1 of the length

    real(kind=wp), intent(in), optional :: body_radius

    defaults: 0.3; 0.05 and 0.1 of the length

    real(kind=wp), intent(in), optional :: head_radius

    defaults: 0.3; 0.05 and 0.1 of the length

procedure, public :: name

  • private function name(self) result(n)

    The frame's name ('' if none).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value character(len=:), allocatable

procedure, public :: name_label_on_top

procedure, public :: name_label_shown

  • private pure function name_label_shown(self)

    Whether the name label is shown.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value logical

procedure, public :: node

  • private function node(self) result(n)

    The frame's transform node (null until realized).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value type(c_ptr)

procedure, public :: num_children

  • private pure function num_children(self)

    Number of children.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value integer

procedure, public :: num_edges

  • private pure function num_edges(self)

    The number of edges.

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(in) :: self

    Return Value integer

procedure, public :: num_parents

  • private pure function num_parents(self)

    Number of parents.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value integer

procedure, public :: num_triangles

  • private pure function num_triangles(self)

    The number of triangles drawn (polygons: as fans).

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(in) :: self

    Return Value integer

procedure, public :: num_vertices

  • private pure function num_vertices(self)

    The number of vertices.

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(in) :: self

    Return Value integer

procedure, public :: opacity => poly_opacity

  • private pure function poly_opacity(self)

    The faces' opacity.

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(in) :: self

    Return Value real(kind=wp)

procedure, public :: parent

  • private function parent(self, i) result(p)

    Parent i (1 to num_parents).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self
    integer, intent(in) :: i

    1 to num_parents

    Return Value class(ReferenceFrame), pointer

procedure, public :: parent_index

  • private function parent_index(self, frame)

    Index of frame among the parents, or 0.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self
    class(ReferenceFrame), intent(in), target :: frame

    the frame to find

    Return Value integer

procedure, public :: pick

  • private subroutine pick(self, cam, to_root, hits, n)

    Pick what the frame draws (see the module documentation): to_root is its transform to the root frame; hits are added to hits(1:n). A plain frame: its origin, if it shows axes or its name label.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in), target :: self
    type(PickCamera), intent(in) :: cam

    the cursor's ray and the pick's settings

    real(kind=wp), intent(in) :: to_root(4,4)

    the frame's transform to the root frame

    type(PickHit), intent(inout), allocatable :: hits(:)

    hits so far (grown as needed)

    integer, intent(inout) :: n

    number of hits in hits

procedure, public :: pickable

  • private pure function pickable(self)

    Whether pick tests what this frame draws (set_pickable).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value logical

procedure, public :: point_color

  • private pure function point_color(self) result(c)

    The vertices' color [r, g, b, a].

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(in) :: self

    Return Value real(kind=wp), (4)

procedure, public :: point_size

  • private pure function point_size(self)

    The vertices' size (window units).

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(in) :: self

    Return Value real(kind=wp)

procedure, public :: position

  • private pure function position(self) result(p)

    Position relative to the parent frame.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value real(kind=wp), (3)

procedure, public :: position_of

  • private function position_of(self, other) result(p)

    The origin of other (a frame of the same tree) in this frame's coordinates, from both frames' transforms to the root (through their first parents).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    (other: a frame of the same tree)

    class(ReferenceFrame), intent(in) :: other

    (other: a frame of the same tree)

    Return Value real(kind=wp), (3)

procedure, public :: realize

  • private recursive subroutine realize(self, viewer)

    Create the render nodes of this frame and its descendants (once; for viewer, a window's viewer handle, which some contents need while they are built (not kept); null: headless).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    type(c_ptr), intent(in) :: viewer

    a window's viewer handle (null: headless)

procedure, public :: remove_child

  • private function remove_child(self, child) result(ok)

    Remove child from this frame's children. Returns false if it is not one.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout), target :: self
    class(ReferenceFrame), intent(inout), target :: child

    the child to remove

    Return Value logical

procedure, public :: remove_vertex_colors

  • private subroutine remove_vertex_colors(self)

    The face color again, for every vertex.

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self

procedure, public :: reposition_axes

  • private subroutine reposition_axes(self)

    Place the axes for what the frame draws, when it is first shown (unless move_*_axis was called): at its bound's surface, half the bound's radius long (as OpenFrames' Sphere and Model do); at the origin, 1 long, for a frame that draws nothing.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self

procedure, public :: set_attitude

  • private subroutine set_attitude(self, q)

    Attitude relative to the parent frame, a quaternion [x, y, z, w] (normalized here; overridden by a followed trajectory).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    real(kind=wp), intent(in) :: q(4)

    attitude quaternion [x, y, z, w] (normalized here)

procedure, public :: set_color

  • private subroutine set_color(self, color)

    The color of the frame's decorations: [r, g, b] (alpha unchanged) or [r, g, b, a].

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    real(kind=wp), intent(in) :: color(:)

    [r, g, b] (alpha unchanged) or [r, g, b, a] (0 to 1)

procedure, public :: set_draw_mode => poly_set_draw_mode

  • private subroutine poly_set_draw_mode(self, mode)

    What to draw: an ior of POLY_FACES, POLY_EDGES, POLY_VERTICES (default faces and edges).

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    integer, intent(in) :: mode

    an ior of POLY_FACES, POLY_EDGES, POLY_VERTICES

procedure, public :: set_edges

  • private subroutine set_edges(self, edges)

    The edges drawn (2, k) (vertex numbers), in place of the faces' (after set_faces, set_triangles or set_grid).

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    integer, intent(in) :: edges(:,:)

    (2, k) vertex numbers (1-based)

procedure, public :: set_face_color

  • private subroutine set_face_color(self, color)

    The faces' color (the alpha times the opacity).

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    real(kind=wp), intent(in) :: color(:)

    [r, g, b] or [r, g, b, a] (0 to 1)

procedure, public :: set_faces

  • private subroutine set_faces(self, vertices, faces, sizes)

    Faces given as polygons: faces the vertex numbers (1-based) of each polygon in turn, sizes how many each has (>= 3; convex, or at least star-shaped from its first vertex: drawn as a fan of triangles from it); the edges are the polygons' sides. E.g. a cube: 8 vertices, 6 faces of 4. A face's front: its vertices counterclockwise.

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    real(kind=wp), intent(in) :: vertices(:,:)

    (3, n), frame coordinates

    integer, intent(in) :: faces(:)

    (sum(sizes)) vertex numbers

    integer, intent(in) :: sizes(:)

    each face's number of vertices

procedure, public :: set_grid

  • private subroutine set_grid(self, points, closed_u, closed_v, lines)

    Faces given as a grid of points (3, nu, nv): quadrilaterals between neighbours (two triangles each), joined around if closed_u (the last point i to the first, for each j; e.g. a tube's circumference) or closed_v. The edges: the grid's lines, those of constant i (along j) every lines(1) and of constant j (along i) every lines(2) (default: every one; 0 for none).

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    real(kind=wp), intent(in) :: points(:,:,:)

    (3, nu, nv), frame coordinates

    logical, intent(in), optional :: closed_u

    joined around in i, in j (default false)

    logical, intent(in), optional :: closed_v

    joined around in i, in j (default false)

    integer, intent(in), optional :: lines(2)

    edges every lines(1) in i, lines(2) in j (default 1; 0: none)

procedure, public :: set_label_alignment

  • private subroutine set_label_alignment(self, alignment)

    The alignment of the labels relative to their positions (ALIGN_*; default ALIGN_LEFT_BASE_LINE).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    integer, intent(in) :: alignment

    ALIGN_* (default ALIGN_LEFT_BASE_LINE)

procedure, public :: set_label_font

  • private subroutine set_label_font(self, font)

    The font of the labels: a font file name (found on the data search path) or a full path; default: the renderer's default font.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    character(len=*), intent(in) :: font

    a font file name (on the data search path) or a full path

procedure, public :: set_label_size

  • private subroutine set_label_size(self, size)

    The size of the labels in pixels (default 20): the name label's size, and the maximum size of the axes labels (which shrink with distance).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    integer, intent(in) :: size

    pixels (default 20)

procedure, public :: set_light_ambient

  • private subroutine set_light_ambient(self, rgb)

    The light source's ambient, diffuse and specular colors ([r, g, b], 0 to 1; defaults 0.05, 0.8 and 0.05 gray).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    real(kind=wp), intent(in) :: rgb(3)

    ambient color [r, g, b] (0 to 1; default 0.05 gray)

procedure, public :: set_light_diffuse

  • private subroutine set_light_diffuse(self, rgb)

    The light source's diffuse color (see set_light_ambient).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    real(kind=wp), intent(in) :: rgb(3)

    diffuse color [r, g, b] (0 to 1; default 0.8 gray)

procedure, public :: set_light_source_enabled

  • private subroutine set_light_source_enabled(self, enable)

    Whether this frame carries a light source: a point light at its origin (e.g. the Sun), not dimmed with distance (default false; OpenFrames' setLightSourceEnabled). While any frame of a window's scene has one, the window's own light (WindowProxy%set_light_*) is off.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    logical, intent(in) :: enable

    (true: a point light at the frame's origin)

procedure, public :: set_light_specular

  • private subroutine set_light_specular(self, rgb)

    The light source's specular color (see set_light_ambient).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    real(kind=wp), intent(in) :: rgb(3)

    specular color [r, g, b] (0 to 1; default 0.05 gray)

procedure, public :: set_line_color => poly_set_line_color

  • private subroutine poly_set_line_color(self, color)

    The edges' color.

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    real(kind=wp), intent(in) :: color(:)

    [r, g, b] or [r, g, b, a] (0 to 1)

procedure, public :: set_line_width => poly_set_line_width

  • private subroutine poly_set_line_width(self, width)

    The edges' width (window units; default 1).

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    real(kind=wp), intent(in) :: width

    window units

procedure, public :: set_lit

  • private subroutine set_lit(self, lit)

    Faces lit by the scene's lights (the default), or unlit (their color as is, transparent as a cone's sides: writing no depth).

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    logical, intent(in) :: lit

    true: lit; false: unlit and transparent

procedure, public :: set_name

  • private subroutine set_name(self, name)

    The frame's name, shown by its name label (also once shown: e.g. a readout that follows the frame).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    character(len=*), intent(in) :: name

    the name (shown by the name label)

procedure, public :: set_name_label_on_top

  • private subroutine set_name_label_on_top(self, on_top)

    Draw the name label on top of the scene (true: not hidden by bodies in front of it, as HUD text; e.g. a readout) or depth-tested (false, the default, as OpenFrames').

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    logical, intent(in) :: on_top

    (true: drawn on top of the scene; false: depth-tested)

procedure, public :: set_opacity => poly_set_opacity

  • private subroutine poly_set_opacity(self, opacity)

    The faces' opacity (0 to 1; default 1, opaque): below 1 translucent.

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    real(kind=wp), intent(in) :: opacity

    0 to 1 (1: opaque)

procedure, public :: set_pickable

  • private subroutine set_pickable(self, pickable)

    Whether pick tests what this frame draws (default true; e.g. false for an overlay such as a selection marker). Its children are picked or not by their own setting.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    logical, intent(in) :: pickable

    (true: tested by pick)

procedure, public :: set_point_color

  • private subroutine set_point_color(self, color)

    The vertices' color (POLY_VERTICES).

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    real(kind=wp), intent(in) :: color(:)

    [r, g, b] or [r, g, b, a] (0 to 1)

procedure, public :: set_point_size

  • private subroutine set_point_size(self, size_)

    The vertices' size (window units; default 6).

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    real(kind=wp), intent(in) :: size_

    window units

procedure, public :: set_position

  • private subroutine set_position(self, position)

    Position relative to the parent frame (overridden by a followed trajectory).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    real(kind=wp), intent(in) :: position(3)

    parent frame's coordinates

procedure, public :: set_smooth

  • private subroutine set_smooth(self, smooth)

    Shading smooth across the vertices (normals averaged over the faces around each: a curved surface, e.g. a grid's), or flat faces (the default: a polyhedron's).

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    logical, intent(in) :: smooth

    true: smooth shading; false: flat faces

procedure, public :: set_triangles

  • private subroutine set_triangles(self, vertices, triangles)

    Faces given as triangles (3, m) of vertex numbers (1-based); the edges are their sides (each once).

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    real(kind=wp), intent(in) :: vertices(:,:)

    (3, n), frame coordinates

    integer, intent(in) :: triangles(:,:)

    (3, m)

procedure, public :: set_two_sided

  • private subroutine set_two_sided(self, two_sided)

    Both sides of the faces drawn and lit (the default: open surfaces), or only their fronts (a closed surface, its faces counterclockwise seen from outside: translucent, its far side isn't drawn through it).

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    logical, intent(in) :: two_sided

    true: both sides; false: fronts only

procedure, public :: set_vertex_colors

  • private subroutine set_vertex_colors(self, colors)

    A color per vertex (4, n) or (3, n) ([r, g, b(, a)], 0 to 1), for the faces, blended across them (in place of the face color; the opacity still applies). Dropped when the faces are set again.

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    real(kind=wp), intent(in) :: colors(:,:)

    (4, n) or (3, n): [r, g, b(, a)] (0 to 1)

procedure, public :: set_vertices

  • private subroutine set_vertices(self, vertices)

    Move the vertices (3, n), keeping the faces and edges (as many as before; e.g. a surface changing in time).

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(inout) :: self
    real(kind=wp), intent(in) :: vertices(:,:)

    (3, n), frame coordinates (as many as before)

procedure, public :: set_x_label

  • private subroutine set_x_label(self, text)

    The text of the x-axis label (default 'X').

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    character(len=*), intent(in) :: text

    the x-axis label (default 'X')

procedure, public :: set_y_label

  • private subroutine set_y_label(self, text)

    The text of the y-axis label (default 'Y').

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    character(len=*), intent(in) :: text

    the y-axis label (default 'Y')

procedure, public :: set_z_label

  • private subroutine set_z_label(self, text)

    The text of the z-axis label (default 'Z').

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    character(len=*), intent(in) :: text

    the z-axis label (default 'Z')

procedure, public :: show_axes

  • private subroutine show_axes(self, axes)

    Which axes vectors to show: NO_AXES, or X_AXIS, Y_AXIS, Z_AXIS combined with ior.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    integer, intent(in) :: axes

    NO_AXES, or X_AXIS, Y_AXIS, Z_AXIS combined with ior

procedure, public :: show_axes_labels

  • private subroutine show_axes_labels(self, labels)

    Which axes labels to show (as show_axes).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    integer, intent(in) :: labels

    NO_AXES, or X_AXIS, Y_AXIS, Z_AXIS combined with ior

procedure, public :: show_contents

  • private subroutine show_contents(self, show)

    Show or hide what the frame draws (its sphere, model, ...), but not its axes, labels or children.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    logical, intent(in) :: show

    (true: shown)

procedure, public :: show_decorations

  • private subroutine show_decorations(self, show)

    Show (true) or hide all the frame's decorations at once: its axes, their labels and its name label (show_axes, show_axes_labels, show_name_label).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    logical, intent(in) :: show

    true: all axes, axes labels and the name label

procedure, public :: show_name_label

  • private subroutine show_name_label(self, show)

    Show or hide the name label (at the frame's origin; default shown).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self
    logical, intent(in) :: show

    (true: shown)

procedure, public :: smooth

  • private pure function smooth(self)

    Whether the shading is smooth.

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(in) :: self

    Return Value logical

procedure, public :: sync

  • private recursive subroutine sync(self)

    Copy the positions and attitudes of this frame and its descendants to their transform nodes (only those that changed since the last sync).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self

procedure, public :: two_sided

  • private pure function two_sided(self)

    Whether both sides are drawn.

    Arguments

    Type IntentOptional Attributes Name
    class(Polyhedron), intent(in) :: self

    Return Value logical

procedure, public :: unfollow

  • private subroutine unfollow(self)

    Stop following trajectories (the frame keeps its last position and attitude).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout) :: self

procedure, public :: update

  • private recursive subroutine update(self, t)

    Update this frame and its descendants for simulation time t (followed trajectories set positions and attitudes).

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(inout), target :: self
    real(kind=wp), intent(in) :: t

    simulation time

procedure, public :: world_matrix

  • private recursive function world_matrix(self) result(m)

    The transform from this frame to the root of its tree, through the first parent at each level.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self

    Return Value real(kind=wp), (4,4)

procedure, public :: world_matrix_at

  • private recursive function world_matrix_at(self, t) result(m)

    The transform from this frame to the root of its tree at simulation time t (through the first parent at each level): each frame's local_matrix_at time t. The same as world_matrix after the tree's update at time t, for any t, without changing anything.

    Arguments

    Type IntentOptional Attributes Name
    class(ReferenceFrame), intent(in) :: self
    real(kind=wp), intent(in) :: t

    simulation time

    Return Value real(kind=wp), (4,4)

Source Code

    type, extends(ReferenceFrame), public :: Polyhedron
        private
        real(wp), allocatable :: v(:,:)                     !! vertices (3, n), frame coordinates
        integer, allocatable :: tri(:,:)                    !! triangles (3, m), vertex numbers (1-based)
        integer, allocatable :: edge(:,:)                   !! edges (2, k), vertex numbers
        real(wp), allocatable :: vertex_colors_(:,:)        !! a color per vertex (4, n) (none: the face color)
        real(wp) :: face_color_(4) = 1.0_wp                 !! faces' color [r, g, b, a]
        real(wp) :: line_color_(4) = 1.0_wp                 !! edges' color
        real(wp) :: point_color_(4) = 1.0_wp                !! vertices' color
        real(wp) :: opacity_ = 1.0_wp                       !! the faces' (times their colors' alpha)
        real(wp) :: width_ = 1.0_wp                         !! edges' width (window units)
        real(wp) :: point_size_ = 6.0_wp                    !! vertices' size (window units)
        integer :: mode = ior(POLY_FACES, POLY_EDGES)       !! an ior of POLY_FACES, POLY_EDGES, POLY_VERTICES
        logical :: lit_ = .true.                            !! lit by the scene's lights (else unlit, transparent)
        logical :: smooth_ = .false.                        !! normals smooth across the vertices (else flat faces)
        logical :: two_sided_ = .true.                      !! both sides drawn (and lit)
        type(ShapeNodes) :: nodes                           !! the drawing
    contains
        procedure :: set_faces, set_triangles, set_grid, set_edges, set_vertices
        procedure :: num_vertices, num_triangles, num_edges
        procedure :: set_vertex_colors, remove_vertex_colors, has_vertex_colors
        procedure :: set_face_color, face_color
        procedure :: set_line_color => poly_set_line_color, line_color => poly_line_color
        procedure :: set_point_color, point_color
        procedure :: set_opacity => poly_set_opacity, opacity => poly_opacity
        procedure :: set_line_width => poly_set_line_width, line_width => poly_line_width
        procedure :: set_point_size, point_size
        procedure :: set_draw_mode => poly_set_draw_mode, draw_mode => poly_draw_mode
        procedure :: set_lit, lit, set_smooth, smooth, set_two_sided, two_sided
        procedure :: frame_info => poly_frame_info
        procedure :: bound => poly_bound
        procedure :: build_contents => poly_build_contents
    end type Polyhedron