shadow_build_contents Subroutine

private subroutine shadow_build_contents(self, viewer, group)

A switch with a mesh for each region (vertices written at each change of shape), under group.

Type Bound

ShadowCones

Arguments

Type IntentOptional Attributes Name
class(ShadowCones), 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


Calls

proc~~shadow_build_contents~~CallsGraph proc~shadow_build_contents ShadowCones%shadow_build_contents interface~vkf_mesh_create vkf_mesh_create proc~shadow_build_contents->interface~vkf_mesh_create interface~vkf_node_add_child vkf_node_add_child proc~shadow_build_contents->interface~vkf_node_add_child interface~vkf_switch_create vkf_switch_create proc~shadow_build_contents->interface~vkf_switch_create interface~vkf_switch_set vkf_switch_set proc~shadow_build_contents->interface~vkf_switch_set proc~apply_color apply_color proc~shadow_build_contents->proc~apply_color proc~check_status check_status proc~shadow_build_contents->proc~check_status proc~mesh_arrays mesh_arrays proc~shadow_build_contents->proc~mesh_arrays proc~apply_color->proc~check_status proc~mesh_set_material mesh_set_material proc~apply_color->proc~mesh_set_material interface~vkf_mesh_array vkf_mesh_array proc~mesh_arrays->interface~vkf_mesh_array interface~vkf_mesh_material vkf_mesh_material proc~mesh_set_material->interface~vkf_mesh_material interface~vkf_mesh_material_changed vkf_mesh_material_changed proc~mesh_set_material->interface~vkf_mesh_material_changed

Source Code

    subroutine shadow_build_contents(self, viewer, group)
        class(ShadowCones), 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
        real(c_float), dimension(:,:), pointer :: v, normals, uv
        integer(c_int32_t), dimension(:), pointer :: indices
        integer :: k, i, j, n
        n = n_around
        do k = 1, n_regions
            associate (g => self%region(k))
                g%mesh = vkf_mesh_create(int(2 * n, c_int), int(6 * n, c_int), [1.0_c_float, 1.0_c_float, 1.0_c_float, &
                                         1.0_c_float], c_null_ptr, c_null_ptr, 5_c_int)    ! unlit, transparent; vertices change
                if (.not. c_associated(g%mesh)) cycle
                call mesh_arrays(g%mesh, 2 * n, 6 * n, v, normals, uv, indices)
                v = 0.0_c_float
                normals = 0.0_c_float
                normals(3, :) = 1.0_c_float
                uv = 0.0_c_float
                do i = 1, n                                 ! ring 0: vertices 0..n-1; ring 1: n..2n-1
                    j = modulo(i, n)
                    indices(6*i-5:6*i) = int([i - 1, j, n + i - 1, j, n + j, n + i - 1], c_int32_t)
                end do
                call apply_color(g)
                g%switch = vkf_switch_create()
                call check_status(vkf_node_add_child(g%switch, g%mesh), 'shadow')
                call check_status(vkf_switch_set(g%switch, 0_c_int), 'shadow')      ! (until shaped)
                call check_status(vkf_node_add_child(group, g%switch), 'shadow')
            end associate
        end do
        self%shaped = -1.0_wp                               ! (shaped at the next update)
    end subroutine shadow_build_contents