Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Type Vert3D
- x As Single
- y As Single
- z As Single
- End Type
- Type Tex2D
- u As Single
- v As Single
- End Type
- Type Tri3D
- v1 As Vert3D
- t1 As Tex2D
- v2 As Vert3D
- t2 As Tex2D
- v3 As Vert3D
- t3 As Tex2D
- End Type
- Type ModelStatic3D
- v_cnt As Integer
- t_cnt As Integer
- f_cnt As Integer
- m_verts As Vert3D Ptr
- m_texts As Tex2D Ptr
- m_faces As Tri3D Ptr
- End Type
- Sub LoadOBJ(filename As String, m As ModelStatic3D Ptr)
- Dim fh As Integer
- Dim txt As String
- Dim cmd As String
- Dim arg As String
- Dim temp As String
- Dim set1 As String
- Dim set1a As String
- Dim set2 As String
- Dim set2a As String
- Dim set3 As String
- Dim set3a As String
- Dim i As Integer = 0
- Dim j As Integer = 0
- Dim k As Integer = 0
- fh = FreeFile()
- Open filename For Input As #fh
- Do Until Eof(fh)
- Line Input #fh, txt
- cmd = Trim(Left(txt, InStr(txt, " ")))
- If cmd = "v" Then
- m->v_cnt = m->v_cnt + 1
- EndIf
- If cmd = "vt" Then
- m->t_cnt = m->t_cnt + 1
- EndIf
- If cmd = "f" Then
- m->f_cnt = m->f_cnt + 1
- EndIf
- Loop
- Close #fh
- m->m_verts = Allocate(m->v_cnt * SizeOf(Vert3D))
- m->m_faces = Allocate(m->f_cnt * SizeOf(Tri3D))
- m->m_texts = Allocate(m->t_cnt * SizeOf(Tex2D))
- Open filename For Input As #fh
- Do Until Eof(fh)
- Line Input #fh, txt
- cmd = Trim(Left(txt, InStr(txt, " ")))
- If cmd = "v" Then
- 'Store vertices in memory
- arg = Trim(Mid(txt, InStr(txt, " ")))
- temp = Trim(Mid(arg, InStr(arg, " ")))
- m->m_verts[i].x = Val(Trim(Left(arg,InStr(arg, " "))))
- m->m_verts[i].y = Val(Trim(Left(temp, InStr(temp, " "))))
- m->m_verts[i].z = Val(Trim(Mid(temp, InStr(temp, " "))))
- i = i + 1
- EndIf
- If cmd = "vt" Then
- 'Store tex-coords in memory
- arg = Trim(Mid(txt, InStr(txt, " ")))
- m->m_texts[j].u = Val(Trim(Left(arg, InStr(arg, " "))))
- m->m_texts[j].v = Val(Trim(Mid(arg, InStr(arg, " "))))
- j = j + 1
- EndIf
- If cmd = "f" Then
- 'Store faces in memory
- arg = Trim(Mid(txt, InStr(txt, " ")))
- temp = Trim(Mid(arg, InStr(arg, " ")))
- set1 = Trim(Left(arg,InStr(arg, " ")))
- set1a = Trim(Mid(set1, InStr(set1, "/")), "/")
- set2 = Trim(Left(temp, InStr(temp, " ")))
- set2a = Trim(Mid(set2, InStr(set2, "/")), "/")
- set3 = Trim(Mid(temp, InStr(temp, " ")))
- set3a = Trim(Mid(set3, InStr(set3, "/")), "/")
- 'In .OBJ format, faces are stored as follows:
- ' f v/vt/vn v/vt/vn v/vt/vn ; hence the "set<n>" variables
- m->m_faces[k].v1 = m->m_verts[ValInt(Trim(Left(set1, InStr(set1, "/")), "/")) - 1]
- m->m_faces[k].t1 = m->m_texts[ValInt(Trim(Left(set1a, InStr(set1a, "/")), "/")) - 1]
- m->m_faces[k].v2 = m->m_verts[ValInt(Trim(Left(set2, InStr(set2, "/")), "/")) - 1]
- m->m_faces[k].t2 = m->m_texts[ValInt(Trim(Left(set2a, InStr(set2a, "/")), "/")) - 1]
- m->m_faces[k].v3 = m->m_verts[ValInt(Trim(Left(set3, InStr(set3, "/")), "/")) - 1]
- m->m_faces[k].t3 = m->m_texts[ValInt(Trim(Left(set3a, InStr(set3a, "/")), "/")) - 1]
- k = k + 1
- EndIf
- Loop
- Close #fh
- End Sub
Add Comment
Please, Sign In to add comment