Problem bei md2 loader (Erledigt)

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

klepto2

Betreff: Problem bei md2 loader (Erledigt)

BeitragMo, Okt 30, 2006 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
hi

ich habe ein kleines problem mit einem md2 loader, den ich im Moment schreibe. ich weiß nicht warum, aber irgendwie scheint er mir falsche Vertices und falsche Triangle daten zu geben.
Vielleicht kann ja mal jemand einen Blick auf den Code werfen und mir helfen den Fehler zufinden.

Danke

Code: [AUSKLAPPEN]

Const MAGIC:Int = 0
Const VERSION:Int = 1
Const SKIN_WIDTH:Int = 2
Const SKIN_HEIGHT:Int = 3
Const FRAME_SIZE:Int = 4
Const COUNT_SKIN:Int = 5
Const COUNT_VERTEX:Int = 6
Const COUNT_TEXCOORD:Int = 7
Const COUNT_TRIS:Int = 8
Const COUNT_OGLCOM:Int = 9
Const COUNT_FRAME:Int = 10
Const OFF_SKIN:Int = 11
Const OFF_TEXCOORDS:Int = 12
Const OFF_TRIS:Int = 13
Const OFF_FRAME:Int = 14
Const OFF_OGLCOM:Int = 15
Const OFF_EOF:Int = 16

Type TMD2Loader
   Field File:TBank
   Field Header:Int[17]
   Field Frames:TList = CreateList()
   Field TrisIndices:TMD2Triangle[]
   Field TEXCoords:TMD2TExCoords[]
   Field Mesh:TMesh
   
   Function LoadMD2:TMesh(Url:Object)
      Local MD2:TMD2Loader = New TMD2Loader
      If FileType(String(url)) <> 0 Then
         MD2.File = LoadBank(url)
      Else
         Throw("File does not exist!")
      EndIf
      
      MD2.GetHeader()
      MD2.TrisIndices = New TMD2Triangle[MD2.HEADER[COUNT_TRIS]]
      MD2.TexCoords = New TMD2TexCoords[MD2.HEADER[COUNT_TEXCOORD]]
      MD2.GetFrames()
      MD2.GetTriangles()
      Md2.GetTexCoords()
      MD2.Mesh = CreateMesh()
      MD2.BuildMesh()
      'MD2.ShowFrameData()
      Return MD2.Mesh
      
   End Function
   
   Method GetHeader()
      For Local I:Int = 0 To 16
         Header[I] = PeekInt(File , I*4)
      Next
      For Local H:Int = EachIn Header
         Print H
      Next
      
      Print "Number of Frames : " + Header[COUNT_FRAME]
   End Method
   
   Method GetFrames()
      Local F:TMD2Frame
      Local _Step:Int = HEADER[FRAME_SIZE]
      For Local X:Int = 0 To HEADER[COUNT_FRAME] - 1
         f = New TMD2Frame
         f.Vertices = New TMD2VERTEX[HEADER[COUNT_VERTEX]]
      '   Print F.Vertices.Length
         
         Local OFF:Int = HEADER[OFF_FRAME] + (X * _Step)
         For Local B:Int = 0 To 2
            F.Scale[B] = PeekFloat(File,OFF + (4*B))
         Next   
         For Local B:Int = 0 To 2
            F.Trans[B] = PeekFloat(File,OFF+12+ 4*B)
         Next      
         F.Name = PeekString(File , OFF + 4 * 6 , 16)
         Local Counter:Int = 0
         For Local I:Int = 0 To HEADER[COUNT_VERTEX]-1
            Local V:TMD2Vertex = New TMD2Vertex
            V.Vertices[0] = File.PeekByte(40+I*4) * F.Scale[0] + F.Trans[0]
            V.Vertices[1] = File.PeekByte(40+I*4+1)* F.Scale[1] + F.Trans[1]
            V.Vertices[2] = File.PeekByte(40+I*4+2)* F.Scale[2] + F.Trans[2]
            V.NormalIndex = File.PeekByte(40+I*4+3)
            F.Vertices[I] = V
            Counter:+1
         Next
         Frames.Addlast(F)
      Next   
      
   End Method   
   
   Method GetTriangles()
      Local OFF:Int = HEADER[OFF_TRIS]
      For Local X:Int = 0 To Header[COUNT_TRIS]-1
         Local TC:TMD2TRIANGLE = New TMD2Triangle
         TC.VIndex[0] = File.PeekShort(Off + X * 12)
         TC.VIndex[1] = File.PeekShort(Off + X * 12+2)
         TC.VIndex[2] = File.PeekShort(Off + X * 12+4)
         TC.TIndex[0] = File.PeekShort(Off + X * 12+6)
         TC.TIndex[1] = File.PeekShort(Off + X * 12+8)
         TC.TIndex[2] = File.PeekShort(Off + X * 12 + 10)
         TrisIndices[X] = TC
      Next
   End Method
   
   Method GetTexCoords()
      For Local X:Int = 0 To Header[COUNT_TEXCOORD] Step 4
         Local T:TMD2TexCoords = New TMd2TexCoords
         T.U = PeekShort(File , Header[OFF_TEXCOORDS] + X) / HEADER[SKIN_WIDTH]
         T.V = PeekShort(File , Header[OFF_TEXCOORDS] + X + 2) / HEADER[SKIN_HEIGHT]
         TexCoords[X / 4] = T
      Next
   End Method         
   
   Method ShowFrameData()
      For Local F:TMD2Frame = EachIn Frames
         Print "Name  : " + F.NAme   
         Print "Scale : " + F.Scale[0] + "," + F.Scale[1] + "," + F.Scale[2]
         Print "Trans : " + F.Trans[0] + "," + F.Trans[1] + "," + F.Trans[2]
         Print "VERTICES : "
         For Local V:TMD2VERTEX = EachIn F.Vertices
            Print V.Vertices[0] + "," + V.Vertices[1] + "," + V.Vertices[2] + "->" + V.NormalIndex
         Next
      Next
   End Method
   
   Method BuildMesh()
      Local Surface:TSurface = Createsurface(Mesh)
      Local Frame:TMD2Frame = TMD2Frame(Frames.First())
      Local Counter:Int = 0
      For Local V:TMD2Vertex = EachIn Frame.Vertices
         Surface.AddVertex(V.Vertices[0] , V.Vertices[1] , V.Vertices[2] , TexCoords[Counter].U , TexCoords[Counter].V)
      Next
      For Local T:TMD2Triangle = EachIn TrisIndices
         Surface.AddTriangle(T.Vindex[0] , T.Vindex[1] , T.Vindex[2])
      Next
      Mesh.UpdateNormals()
      Mesh.UpdateBuffer()
   End Method
      
      
End Type

Function PeekString:String(Bank:TBank , Offset:Int , Length:Int)
   Local Back:String = ""
   For Local X:Int = Offset To Offset + Length - 1
      Back:+ Chr(PeekByte(Bank , X) )
   Next
   Return Back
End Function

Type TMD2Vertex
   Field Vertices:Float[3]
   Field NormalIndex:Byte
End Type

Type TMD2Triangle
   Field VIndex:Short[3]
   Field TIndex:Short[3]
End Type

Type TMD2TexCoords
   Field U:Float
   Field V:Float
End Type

   
Type TMD2Frame
   Field Name:String
   Field Scale:Float[3]
   Field Trans:Float[3]
   Field Vertices:TMD2Vertex[]   
End Type


[Edit] Hat sich erledigt, haut jetzt alles soweit hin (sogar texturierung)
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group