parse_obj Subroutine

public subroutine parse_obj(path, vertices, faces)

OBJの頂点/面行を解析し、負インデックス対応で配列へ格納する。

Arguments

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

読み込み対象のOBJファイルパス。

real(kind=dp), intent(out) :: vertices(:,:)
integer(kind=i32), intent(out) :: faces(:,:)

Calls

proc~~parse_obj~~CallsGraph proc~parse_obj parse_obj proc~is_face_line is_face_line proc~parse_obj->proc~is_face_line proc~is_vertex_line is_vertex_line proc~parse_obj->proc~is_vertex_line proc~parse_face_line parse_face_line proc~parse_obj->proc~parse_face_line proc~parse_vertex_line parse_vertex_line proc~parse_obj->proc~parse_vertex_line proc~read_obj_line read_obj_line proc~parse_obj->proc~read_obj_line proc~count_face_tokens count_face_tokens proc~parse_face_line->proc~count_face_tokens proc~next_face_token next_face_token proc~parse_face_line->proc~next_face_token proc~strip_cr strip_cr proc~read_obj_line->proc~strip_cr proc~count_face_tokens->proc~next_face_token

Called by

proc~~parse_obj~~CalledByGraph proc~parse_obj parse_obj proc~load_obj_mesh load_obj_mesh proc~load_obj_mesh->proc~parse_obj proc~build_parts_mesh build_parts_mesh proc~build_parts_mesh->proc~load_obj_mesh proc~build_mesh_from_config build_mesh_from_config proc~build_mesh_from_config->proc~build_parts_mesh proc~load_or_init_run_state load_or_init_run_state proc~load_or_init_run_state->proc~build_mesh_from_config program~main main program~main->proc~load_or_init_run_state

Source Code

  subroutine parse_obj(path, vertices, faces)
    character(len=*), intent(in) :: path
    real(dp), intent(out) :: vertices(:, :)
    integer(i32), intent(out) :: faces(:, :)
    character(len=:), allocatable :: line
    integer :: u, ios, i
    integer(i32) :: iv, itri
    integer(i32), allocatable :: idx(:)

    iv = 0
    itri = 0
    open (newunit=u, file=path, status='old', action='read', iostat=ios)
    if (ios /= 0) error stop "failed to open OBJ"

    do
      call read_obj_line(u, line, ios)
      if (ios /= 0) exit
      if (is_vertex_line(line)) then
        iv = iv + 1
        call parse_vertex_line(line, vertices(:, iv))
      else if (is_face_line(line)) then
        call parse_face_line(line, iv, idx)
        do i = 2, size(idx) - 1
          itri = itri + 1
          faces(:, itri) = [idx(1), idx(i), idx(i + 1)]
        end do
      end if
    end do
    close (u)
  end subroutine parse_obj