scan_obj Subroutine

public subroutine scan_obj(path, nvert, ntri)

OBJを行走査して頂点数と三角形分割後の面数を事前計数する。

Arguments

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

走査対象のOBJファイルパス。

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

頂点行 v の総数。

integer(kind=i32), intent(out) :: ntri

頂点行 v の総数。 面行を扇形分割した後の三角形総数。


Calls

proc~~scan_obj~~CallsGraph proc~scan_obj scan_obj proc~count_face_tokens count_face_tokens proc~scan_obj->proc~count_face_tokens proc~is_face_line is_face_line proc~scan_obj->proc~is_face_line proc~is_vertex_line is_vertex_line proc~scan_obj->proc~is_vertex_line proc~strip_cr strip_cr proc~scan_obj->proc~strip_cr

Called by

proc~~scan_obj~~CalledByGraph proc~scan_obj scan_obj proc~load_obj_mesh load_obj_mesh proc~load_obj_mesh->proc~scan_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 scan_obj(path, nvert, ntri)
    character(len=*), intent(in) :: path
    integer(i32), intent(out) :: nvert, ntri
    character(len=1024) :: line
    integer :: u, ios, ntok

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

    do
      read (u, '(A)', iostat=ios) line
      if (ios /= 0) exit
      call strip_cr(line)
      if (is_vertex_line(line)) nvert = nvert + 1
      if (is_face_line(line)) then
        ntok = count_face_tokens(line)
        if (ntok >= 3) ntri = ntri + (ntok - 2)
      end if
    end do
    close (u)
  end subroutine scan_obj