Guest User

Untitled

a guest
Jun 22nd, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Type Vert3D
  2.     x As Single
  3.     y As Single
  4.     z As Single
  5. End Type
  6.  
  7. Type Tex2D
  8.     u As Single
  9.     v As Single
  10. End Type
  11.  
  12. Type Tri3D
  13.     v1 As Vert3D
  14.     t1 As Tex2D
  15.     v2 As Vert3D
  16.     t2 As Tex2D
  17.     v3 As Vert3D
  18.     t3 As Tex2D
  19. End Type
  20.  
  21. Type ModelStatic3D
  22.     v_cnt As Integer
  23.     t_cnt As Integer
  24.     f_cnt As Integer
  25.     m_verts As Vert3D Ptr
  26.     m_texts As Tex2D Ptr
  27.     m_faces As Tri3D Ptr
  28. End Type
  29.  
  30. Sub LoadOBJ(filename As String, m As ModelStatic3D Ptr)
  31.     Dim fh As Integer
  32.     Dim txt As String
  33.     Dim cmd As String
  34.     Dim arg As String
  35.     Dim temp As String
  36.     Dim set1 As String
  37.     Dim set1a As String
  38.     Dim set2 As String
  39.     Dim set2a As String
  40.     Dim set3 As String
  41.     Dim set3a As String
  42.     Dim i As Integer = 0
  43.     Dim j As Integer = 0
  44.     Dim k As Integer = 0
  45.     fh = FreeFile()
  46.     Open filename For Input As #fh
  47.    
  48.     Do Until Eof(fh)
  49.         Line Input #fh, txt
  50.         cmd = Trim(Left(txt, InStr(txt, " ")))
  51.         If cmd = "v" Then
  52.             m->v_cnt = m->v_cnt + 1
  53.         EndIf
  54.         If cmd = "vt" Then
  55.             m->t_cnt = m->t_cnt + 1
  56.         EndIf
  57.         If cmd = "f" Then
  58.             m->f_cnt = m->f_cnt + 1
  59.         EndIf
  60.     Loop
  61.    
  62.     Close #fh
  63.    
  64.     m->m_verts = Allocate(m->v_cnt * SizeOf(Vert3D))
  65.     m->m_faces = Allocate(m->f_cnt * SizeOf(Tri3D))
  66.     m->m_texts = Allocate(m->t_cnt * SizeOf(Tex2D))
  67.    
  68.     Open filename For Input As #fh
  69.    
  70.     Do Until Eof(fh)
  71.         Line Input #fh, txt
  72.         cmd = Trim(Left(txt, InStr(txt, " ")))
  73.         If cmd = "v" Then
  74.             'Store vertices in memory
  75.             arg = Trim(Mid(txt, InStr(txt, " ")))
  76.             temp = Trim(Mid(arg, InStr(arg, " ")))
  77.            
  78.             m->m_verts[i].x = Val(Trim(Left(arg,InStr(arg, " "))))
  79.             m->m_verts[i].y = Val(Trim(Left(temp, InStr(temp, " "))))
  80.             m->m_verts[i].z = Val(Trim(Mid(temp, InStr(temp, " "))))
  81.             i = i + 1
  82.         EndIf
  83.         If cmd = "vt" Then
  84.             'Store tex-coords in memory
  85.             arg = Trim(Mid(txt, InStr(txt, " ")))
  86.            
  87.             m->m_texts[j].u = Val(Trim(Left(arg, InStr(arg, " "))))
  88.             m->m_texts[j].v = Val(Trim(Mid(arg, InStr(arg, " "))))
  89.             j = j + 1
  90.         EndIf
  91.         If cmd = "f" Then
  92.             'Store faces in memory
  93.             arg = Trim(Mid(txt, InStr(txt, " ")))
  94.             temp = Trim(Mid(arg, InStr(arg, " ")))
  95.            
  96.             set1 = Trim(Left(arg,InStr(arg, " ")))
  97.             set1a = Trim(Mid(set1, InStr(set1, "/")), "/")
  98.            
  99.             set2 = Trim(Left(temp, InStr(temp, " ")))
  100.             set2a = Trim(Mid(set2, InStr(set2, "/")), "/")
  101.            
  102.             set3 = Trim(Mid(temp, InStr(temp, " ")))
  103.             set3a = Trim(Mid(set3, InStr(set3, "/")), "/")
  104.            
  105.             'In .OBJ format, faces are stored as follows:
  106.             ' f v/vt/vn v/vt/vn v/vt/vn ; hence the "set<n>" variables
  107.             m->m_faces[k].v1 = m->m_verts[ValInt(Trim(Left(set1, InStr(set1, "/")), "/")) - 1]
  108.             m->m_faces[k].t1 = m->m_texts[ValInt(Trim(Left(set1a, InStr(set1a, "/")), "/")) - 1]
  109.            
  110.             m->m_faces[k].v2 = m->m_verts[ValInt(Trim(Left(set2, InStr(set2, "/")), "/")) - 1]
  111.             m->m_faces[k].t2 = m->m_texts[ValInt(Trim(Left(set2a, InStr(set2a, "/")), "/")) - 1]
  112.            
  113.             m->m_faces[k].v3 = m->m_verts[ValInt(Trim(Left(set3, InStr(set3, "/")), "/")) - 1]
  114.             m->m_faces[k].t3 = m->m_texts[ValInt(Trim(Left(set3a, InStr(set3a, "/")), "/")) - 1]
  115.            
  116.             k = k + 1          
  117.         EndIf
  118.     Loop
  119.    
  120.     Close #fh
  121. End Sub
Add Comment
Please, Sign In to add comment