write_ribbon Subroutine

private subroutine write_ribbon(self, i1, i2)

Write the pairs of trajectory points i1 .. i2 into the chain, with their colors (and upload the chunks written to).

Type Bound

RibbonArtist

Arguments

Type IntentOptional Attributes Name
class(RibbonArtist), intent(inout) :: self
integer, intent(in) :: i1

the trajectory points

integer, intent(in) :: i2

the trajectory points


Calls

proc~~write_ribbon~~CallsGraph proc~write_ribbon RibbonArtist%write_ribbon color_slice color_slice proc~write_ribbon->color_slice colors colors proc~write_ribbon->colors is_colored is_colored proc~write_ribbon->is_colored num_chunks num_chunks proc~write_ribbon->num_chunks num_colors num_colors proc~write_ribbon->num_colors proc~art_points art_points proc~write_ribbon->proc~art_points proc~split_points split_points proc~write_ribbon->proc~split_points slice slice proc~write_ribbon->slice written written proc~write_ribbon->written proc~points Trajectory%points proc~art_points->proc~points proc~to_shown_at to_shown_at proc~art_points->proc~to_shown_at proc~to_shown to_shown proc~to_shown_at->proc~to_shown proc~transformed transformed proc~to_shown_at->proc~transformed proc~data_to_shown data_to_shown proc~to_shown->proc~data_to_shown proc~moves moves proc~to_shown->proc~moves proc~rigid_inverse rigid_inverse proc~data_to_shown->proc~rigid_inverse proc~world_matrix_at ReferenceFrame%world_matrix_at proc~data_to_shown->proc~world_matrix_at proc~moves->proc~moves proc~is_following ReferenceFrame%is_following proc~moves->proc~is_following proc~num_parents ReferenceFrame%num_parents proc~moves->proc~num_parents proc~parent ReferenceFrame%parent proc~moves->proc~parent proc~num_trajectories TrajectoryFollower%num_trajectories proc~is_following->proc~num_trajectories proc~world_matrix_at->proc~world_matrix_at proc~local_matrix_at ReferenceFrame%local_matrix_at proc~world_matrix_at->proc~local_matrix_at proc~followed_pose followed_pose proc~local_matrix_at->proc~followed_pose proc~frame_matrix frame_matrix proc~local_matrix_at->proc~frame_matrix proc~followed_pose->proc~rigid_inverse proc~followed_pose->proc~world_matrix_at proc~quat_from_matrix quat_from_matrix proc~followed_pose->proc~quat_from_matrix proc~quat_multiply quat_multiply proc~followed_pose->proc~quat_multiply proc~quat_normalize quat_normalize proc~followed_pose->proc~quat_normalize proc~state_at TrajectoryFollower%state_at proc~followed_pose->proc~state_at proc~quat_to_matrix quat_to_matrix proc~frame_matrix->proc~quat_to_matrix proc~chosen_trajectory chosen_trajectory proc~state_at->proc~chosen_trajectory proc~data_valid TrajectoryFollower%data_valid proc~state_at->proc~data_valid proc~interpolate_attitude interpolate_attitude proc~state_at->proc~interpolate_attitude proc~interpolate_position interpolate_position proc~state_at->proc~interpolate_position proc~time_index Trajectory%time_index proc~state_at->proc~time_index proc~wrapped_time wrapped_time proc~state_at->proc~wrapped_time proc~time_distance Trajectory%time_distance proc~chosen_trajectory->proc~time_distance proc~verify_data Trajectory%verify_data proc~data_valid->proc~verify_data proc~attitude~3 Trajectory%attitude proc~interpolate_attitude->proc~attitude~3 proc~num_attitudes Trajectory%num_attitudes proc~interpolate_attitude->proc~num_attitudes proc~quat_slerp quat_slerp proc~interpolate_attitude->proc~quat_slerp proc~num_points Trajectory%num_points proc~interpolate_position->proc~num_points proc~point_between Trajectory%point_between proc~interpolate_position->proc~point_between proc~point~2 Trajectory%point proc~interpolate_position->proc~point~2 proc~time_index->proc~time_distance proc~time_range~3 Trajectory%time_range proc~wrapped_time->proc~time_range~3 proc~point_between->proc~num_points proc~point_between->proc~point~2 proc~time_fraction Trajectory%time_fraction proc~point_between->proc~time_fraction

Source Code

    subroutine write_ribbon(self, i1, i2)
        class(RibbonArtist), intent(inout) :: self
        integer, intent(in) :: i1, i2                       !! the trajectory points
        real(c_float), dimension(:,:,:), pointer :: p
        real(c_float), dimension(:,:), pointer :: c, col
        real(c_float) :: own(4)
        real(wp), allocatable :: v(:,:)
        integer :: j, lo, hi, ia, ib, m, k
        do j = 1, self%chain%num_chunks()
            call self%chain%slice(j, 2 * i1 - 1, 2 * i2, lo, hi, p)  ! chunks hold whole pairs
            if (.not. associated(p)) cycle
            ia = (lo + 1) / 2                             ! the trajectory points of the pairs
            ib = hi / 2
            allocate(v(3, ib - ia + 1))
            call art_points(self, ia, ib, self%start_, v)
            call split_points(v, p(:, :, 1:hi-lo+1:2))
            call art_points(self, ia, ib, self%end_, v)
            call split_points(v, p(:, :, 2:hi-lo+1:2))
            deallocate(v)
        end do
        if (self%chain%is_colored()) then                 ! each pair in its point's color
            call self%traj%colors(col)
            m = self%traj%num_colors()
            own = real(self%color_, c_float)
            own(4) = 1.0_c_float                          ! (the style has the alpha)
            do j = 1, self%chain%num_chunks()
                call self%chain%color_slice(j, 2 * i1 - 1, 2 * i2, lo, hi, c)
                if (.not. associated(c)) cycle
                do k = (lo + 1) / 2, hi / 2
                    if (k <= m) then
                        c(:, 2*k-lo:2*k-lo+1) = spread(col(:, k), 2, 2)
                    else
                        c(:, 2*k-lo:2*k-lo+1) = spread(own, 2, 2)
                    end if
                end do
            end do
            self%n_colored = min(m, i2)
        end if
        call self%chain%written(2 * i1 - 1, 2 * i2)
    end subroutine write_ribbon