Here is a coding for loading MD2.
I used it to test my exporter for C4D, so it's quick and dirty.
I used it to test my exporter for C4D, so it's quick and dirty.
Const c_model$ = "gargoyle.md2" Const C_DIV# = 1.0 Dim mesh(255) Dim surface(255) Dim texU#(4047) Dim texV#(4047) Dim CheckTriangle(1023) Graphics3D 640,480,32,2 SetBuffer BackBuffer() camera=CreateCamera() CameraClsColor camera, 128,128,128 light=CreateLight() PositionEntity camera,0,30,-80 brush=CreateBrush(255,255,255) CameraRange camera, 1, 1000 datei = ReadFile(c_model$) If Not datei RuntimeError "Datei nicht gefunden" Print int2text$(ReadInt(datei)) ;identifier Print ReadInt(datei) ;version skinwidth = ReadInt(datei) ;SkinWidth skinheight = ReadInt(datei) ;SkinHeight FrameSize = ReadInt(datei) ;FrameSize numSkins = ReadInt(datei) ;numSkins numVertex = ReadInt(datei) ;numVertices numTexCoords = ReadInt(datei) ;numTexCoords numTriangle = ReadInt(datei) ;numTriangles numGl = ReadInt(datei) ;numGlCommands numFrames = ReadInt(datei) ;numFrames offSkins = ReadInt(datei) ;offsetSkins offTexCoords = ReadInt(datei) ;offsetTexCoords offTriangle = ReadInt(datei) ;offsetTriangles offFrames = ReadInt(datei) ;offsetFrames offGl = ReadInt(datei) ;offsetGlCommands Print ReadInt(datei) ;offsetEnd Print offFrames Print numTexCoords Print numVertex ; read frames SeekFile(datei, offFrames) For Frame = 1 To numFrames mesh(Frame)=CreateMesh() surface(Frame)=CreateSurface(mesh(Frame),brush) scalez# = ReadFloat#(datei) ;scalez scalex# = ReadFloat#(datei) ;scalex scaley# = ReadFloat#(datei) ;scaley posz# = ReadFloat#(datei) ;posz posx# = ReadFloat#(datei) ;posx posy# = ReadFloat#(datei) ;poxy Print int2text$(ReadInt(datei)) ;tex1 Print int2text$(ReadInt(datei)) ;tex2 Print int2text$(ReadInt(datei)) ;tex3 Print int2text$(ReadInt(datei)) ;tex4 ; read vertices For Vertex = 1 To numVertex z# = (ReadByte(datei) * scalez# + posz#) / C_DIV# ;z x# = (ReadByte(datei) * scalex# + posx#) / C_DIV# ;x y# = (ReadByte(datei) * scaley# + posy#) / C_DIV# ;y light = ReadByte(datei) v0 = AddVertex(surface(Frame),x#,y#,z#) Next Next ; read UV SeekFile(datei, offTexCoords) For uv_coord = 0 To numTexCoords-1 texU#(uv_coord) = ReadShort(datei) / Float(skinwidth) ;U texV#(uv_coord) = ReadShort(datei) / Float(skinheight) ;V Next ; read triangles and build surface SeekFile(datei, offTriangle) For tri = 1 To numTriangle v0 = ReadShort(datei) ;vertex-index 1 v1 = ReadShort(datei) ;vertex-index 2 v2 = ReadShort(datei) ;vertex-index 3 t0 = ReadShort(datei) ;UV-Index 1 t1 = ReadShort(datei) ;UV-Index 2 t2 = ReadShort(datei) ;UV-Index 3 For Frame = 1 To numFrames AddTriangle(surface(Frame),v1,v0,v2) VertexTexCoords surface(Frame), v0, texU#(t0), texV#(t0) VertexTexCoords surface(Frame), v1, texU#(t1), texV#(t1) VertexTexCoords surface(Frame), v2, texU#(t2), texV#(t2) Next Next ; GL lesen SeekFile(datei, offGl) For gl_group = 1 To numGl num_UV = Abs(ReadInt(Datei)) For gl_uv = 1 To num_UV coord_U# = ReadFloat(Datei) coord_V# = ReadFloat(Datei) index_tri = ReadInt(Datei) For Frame = 1 To numFrames ; VertexTexCoords surface(Frame), index_tri, coord_U#, coord_V# Next Next Next ; Skins lesen SeekFile datei, offSkins Print "------" For skin = 1 To numSkins For i = 1 To 16 Print int2text$(ReadInt(datei)) ;tex1 Next Print "------" Next Print SkinWidth CloseFile(datei) Print "FrameSize:" + FrameSize Print "NumFrames:" + numFrames For Frame = 1 To numFrames UpdateNormals mesh(Frame) Next ; load model with b3d-loader for easy comparison mesh(0) = LoadMD2(c_model) If tex <> 0 Then EntityTexture mesh(0), tex Print "Hit Enter to continue" WaitKey() WireFrame 0 auswahl = 1 AnimateMD2 mesh(0),2,2;,1,0,10 While Not KeyHit(1) For Frame = 0 To numFrames HideEntity mesh(Frame) Next ShowEntity mesh(auswahl) RotateEntity mesh(auswahl),hpitch#,hyaw#,hroll# TurnEntity mesh(auswahl),KeyDown(203)-KeyDown(205),KeyDown(200)-KeyDown(208),KeyDown(44)-KeyDown(45) hpitch# = EntityPitch(mesh(auswahl)) hyaw# = EntityYaw(mesh(auswahl)) hroll# = EntityRoll(mesh(auswahl)) If KeyHit(201) Then auswahl = auswahl - 1 If KeyHit(209) Then auswahl = auswahl + 1 If auswahl < 0 Then auswahl = numFrames If auswahl > numFrames Then auswahl = 0 MoveEntity camera, 0,0,KeyDown(78)-KeyDown(74) UpdateWorld RenderWorld Text 5, 5, "Use Page Up/Down to switch between animation frames" Text 5, 20, auswahl Flip 1 Wend End Function int2text$(I) Local txt$ Local l For l = 0 To 3 txt$ = txt$ + Chr$((i Shr l*8) And $FF) Next Return txt$ End Function