Here is a coding for loading MD2. 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
|