f 行の頂点参照を抽出し、v/vt/vn 形式から頂点インデックスのみを取り出す。
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| character(len=*), | intent(in) | :: | line |
OBJ面行( |
||
| integer(kind=i32), | intent(in) | :: | nvert |
負インデックス解決に使う現在有効な頂点数。 |
||
| integer(kind=i32), | intent(out) | :: | idx(:) | |||
| integer(kind=i32), | intent(out) | :: | ntok |
抽出した頂点参照トークン数。 |
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