parse_face_line Subroutine

public subroutine parse_face_line(line, nvert, idx, ntok)

f 行の頂点参照を抽出し、v/vt/vn 形式から頂点インデックスのみを取り出す。

Arguments

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

OBJ面行(f i j k ...)。

integer(kind=i32), intent(in) :: nvert

負インデックス解決に使う現在有効な頂点数。

integer(kind=i32), intent(out) :: idx(:)
integer(kind=i32), intent(out) :: ntok

抽出した頂点参照トークン数。


Called by

proc~~parse_face_line~~CalledByGraph proc~parse_face_line parse_face_line proc~parse_obj parse_obj proc~parse_obj->proc~parse_face_line proc~load_obj_mesh load_obj_mesh proc~load_obj_mesh->proc~parse_obj proc~build_mesh_from_config build_mesh_from_config proc~build_mesh_from_config->proc~load_obj_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_face_line(line, nvert, idx, ntok)
    character(len=*), intent(in) :: line
    integer(i32), intent(in) :: nvert
    integer(i32), intent(out) :: idx(:)
    integer(i32), intent(out) :: ntok
    character(len=1024) :: s, tok
    integer :: pos, n, slash, i
    integer(i32) :: vi

    s = trim(adjustl(line))
    pos = 3
    n = len_trim(s)
    ntok = 0

    do while (pos <= n)
      do while (pos <= n .and. s(pos:pos) == ' ')
        pos = pos + 1
      end do
      if (pos > n) exit
      tok = ''
      do i = pos, n
        if (s(i:i) == ' ') then
          tok = s(pos:i - 1)
          pos = i + 1
          exit
        end if
        if (i == n) then
          tok = s(pos:n)
          pos = n + 1
        end if
      end do

      slash = index(tok, '/')
      if (slash > 0) tok = tok(1:slash - 1)
      read (tok, *) vi
      if (vi < 0) vi = nvert + vi + 1
      if (vi <= 0 .or. vi > nvert) error stop "OBJ face index out of range"
      ntok = ntok + 1
      idx(ntok) = vi
    end do
  end subroutine parse_face_line