Routine de chargement des Objets "LWO" (LightWave Objet)
Publié : jeu. 20/nov./2014 12:47
Bonjour,
Voila une petite routine qui permet de chargement des objets lightwave. Cette routine envois pour le moment les informations du ficher dans le debugger (j'espère pouvoir faire une routine de visualisation d'ici quelque temps ^^).
J'avais déjà posté a ce sujet mais je m'été aperçu d'un bug au niveau de redimensionnement de l'espace mémoire.
Pour le zip > http://www.pbfrance.com/?url=source&cmd=viewer&val=52
pour le parser > http://www.pbfrance.com/php/form_source ... php?num=52
Le code-source pour ceux qui ne veulent aller sur PBFrance ^^ :
Cordialement,
GallyHC
Voila une petite routine qui permet de chargement des objets lightwave. Cette routine envois pour le moment les informations du ficher dans le debugger (j'espère pouvoir faire une routine de visualisation d'ici quelque temps ^^).
J'avais déjà posté a ce sujet mais je m'été aperçu d'un bug au niveau de redimensionnement de l'espace mémoire.
Pour le zip > http://www.pbfrance.com/?url=source&cmd=viewer&val=52
pour le parser > http://www.pbfrance.com/php/form_source ... php?num=52
Le code-source pour ceux qui ne veulent aller sur PBFrance ^^ :
Code : Tout sélectionner
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
EnableExplicit
EnableASM
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
Structure lwo_header
form.s{4}
flen.l
lwo2.s{4}
EndStructure
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
Procedure.w BigEndianToWord(*address.WORD)
; ROUTINE DE CONVERSION BIG ENDIAN VERS WORD.
CompilerIf #PB_Processor_x86
EnableASM
XOr eax, eax
MOV ax,word [p.p_address]
XCHG ah,al
ProcedureReturn
DisableASM
CompilerElseIf #PB_Processor_x64
EnableASM
XOr rax, rax
MOV ax,word [p.p_address]
XCHG ah,al
ProcedureReturn
DisableASM
CompilerElse
Protected result.w
PokeB(@result + 1, PeekB(*address ) & $ff)
PokeB(@result , PeekB(*address + 1) & $ff)
ProcedureReturn result
CompilerEndIf
EndProcedure
Procedure.l BigEndianToLong(number.l)
; ROUTINE DE CONVERSION BIG ENDIAN VERS LONG.
CompilerIf #PB_Processor_x86
EnableASM
mov eax, [p.v_number]
BSWAP eax
ProcedureReturn
DisableASM
CompilerElseIf #PB_Processor_x64
EnableASM
mov rax, [p.v_number]
BSWAP rax
ProcedureReturn
DisableASM
CompilerElse
ProcedureReturn (number & $ff) << 24 + (number & $ff00) << 8 + (number >> 8) & $ff00 + (number >> 24) & $ff
CompilerEndIf
EndProcedure
Procedure.f BigEndianToFloat(number.l)
; ROUTINE DE CONVERSION BIG ENDIAN VERS FLOAT.
Define fvalue.f
CompilerIf #PB_Processor_x86
EnableASM
mov eax, [p.v_number]
BSWAP eax
mov [p.v_fvalue], eax
DisableASM
CompilerElseIf #PB_Processor_x64
EnableASM
mov rax, [p.v_number]
BSWAP rax
mov [p.v_fvalue], rax
DisableASM
CompilerElse
number = ((number >> 8) & $00ff00ff) | ((number << 8) & $ff00ff00)
number = ((number >> 16) & $0000ffff) | ((number << 16) & $ffff0000)
MoveMemory(@number, @fvalue, 4)
CompilerEndIf
ProcedureReturn fvalue
EndProcedure
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
Procedure loader_lwo(filename.s, factor.f = 1)
; ROUTINE DE CHARGEMENT DES FICHIERS LIGHTWAVE
Protected *buffer
Protected fprogress.f
Protected.s stemp, svalu
Protected.i i, j, k, ifile, iflen, itlen, imlen, iface, inobjet, inpoint, inbnbox
Protected header.lwo_header
ifile = ReadFile(#PB_Any, filename)
If ifile <> 0
iflen = Lof(ifile)
header\form = ReadString(ifile, #PB_Ascii, 4)
header\flen = ReadLong (ifile )
header\lwo2 = ReadString(ifile, #PB_Ascii, 4)
;
; VERIFICATION DES INFORMATIONS DU HEADER.
;
If header\form = "FORM" And header\lwo2 = "LWO2" And BigEndianToLong(header\flen) + 8 = iflen
;
While Eof(ifile) = #Null
;
; ROUTINE DE RECHERCHE DU TAG DU FICHIER.
;
*buffer = ReAllocateMemory(*buffer, 4)
ReadData(ifile, *buffer, MemorySize(*buffer)) ; "TAG" DU FICHIER.
stemp = PeekS(*buffer, MemorySize(*buffer), #PB_Ascii)
;
; RECUPERATION DES INFORMATIONS DU TAG.
;
itlen = BigEndianToLong(ReadLong(ifile)) ; INFORMATION DU TAG.
*buffer = ReAllocateMemory(*buffer, itlen + 1)
ReadData(ifile, *buffer, itlen)
;
; ANALYSE ET RECUPERATION DES INFORAMTIONS.
;
Select stemp
Case "TAGS"
Debug ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
Debug ">>>>>>>> TAGS >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
Debug ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
stemp = #NULL$
For i = 0 To itlen - 1 Step 1
If PeekA(*buffer + i) <> 0
stemp + PeekS(*buffer + i, 1, #PB_Ascii)
Else
If LCase(stemp) <> "dkblu" And LCase(stemp) <> "model" And stemp <> #NULL$
inobjet + 1
Debug "COLOR NAME" + Str(inobjet) + " = " + stemp
EndIf
stemp = #NULL$
EndIf
Next i
Debug "TOTAL COLOR(S) : " + Str(inobjet)
Case "LAYR"
Debug ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
Debug ">>>>>>>> LAYR >>>>>>>> NOUVELLE OBJET >>>>>>>>>>>>>>>>"
Debug ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
imlen = BigEndianToLong(PeekL(*buffer))
Debug "OBJET : " + Str(imlen)
Case "PNTS"
Debug ">>>>>>>> PNTS"
For i = 0 To itlen - 11 Step 12
inpoint + 1
Debug "X" + Str(inpoint) + " = " + StrF(BigEndianToFloat(PeekL(*buffer + i )) * factor)
Debug "Y" + Str(inpoint) + " = " + StrF(BigEndianToFloat(PeekL(*buffer + i + 4)) * factor)
Debug "Z" + Str(inpoint) + " = " + StrF(BigEndianToFloat(PeekL(*buffer + i + 8)) * factor)
Next i
Debug "TOTAL POINT(s) : " + Str(inpoint)
Case "BBOX"
Debug ">>>>>>>> BBOX"
For i = 0 To itlen - 11 Step 12
inbnbox + 1
Debug "X" + Str(inbnbox) + " = " + StrF(BigEndianToFloat(PeekL(*buffer + i )) * factor)
Debug "Y" + Str(inbnbox) + " = " + StrF(BigEndianToFloat(PeekL(*buffer + i + 4)) * factor)
Debug "Z" + Str(inbnbox) + " = " + StrF(BigEndianToFloat(PeekL(*buffer + i + 8)) * factor)
Next i
Debug "TOTAL POINT(s) : " + Str(inbnbox)
Case "POLS"
Debug ">>>>>>>> POLS"
If PeekS(*buffer, 4, #PB_Ascii) = "FACE"
iface = 0
For i = 5 To itlen Step 2
k = PeekC(*buffer + i)
Debug k
Select k
Case 2
iface + 1
Debug "Face 1 = " + Str(PeekC(*buffer + i + 2))
Debug "Face 2 = " + Str(PeekC(*buffer + i + 4))
Debug "----"
i + (k * 2)
Case 3
iface + 1
Debug "Face 1 = " + Str(PeekC(*buffer + i + 2))
Debug "Face 2 = " + Str(PeekC(*buffer + i + 4))
Debug "Face 3 = " + Str(PeekC(*buffer + i + 6))
Debug "----"
i + (k * 2)
Case 4
iface + 1
Debug "Face 1 = " + Str(PeekC(*buffer + i + 2))
Debug "Face 2 = " + Str(PeekC(*buffer + i + 4))
Debug "Face 3 = " + Str(PeekC(*buffer + i + 6))
Debug "Face 4 = " + Str(PeekC(*buffer + i + 8))
Debug "----"
i + (k * 2)
Default
iface + 1
For j = 1 To k Step 1
Debug "Face " + Str(j) + " = " + Str(PeekC(*buffer + i + (j * 2)))
Next j
Debug "----"
i + (k * 2)
EndSelect
Next i
Debug "TOTAL FACE(S) = " + Str(iface)
EndIf
Case "PTAG"
Debug ">>>>>>>> PTAG"
If PeekS(*buffer, 4, #PB_Ascii) = "SURF"
Debug "Find SURF"
For i = 7 To itlen Step 4
Debug "COLOR FACE " + Str((i / 4)) + " = " + Str(PeekC(*buffer + i))
Next i
EndIf
Case "VMPA"
Debug ">>>>>>>> VMPA"
Case "VMAD"
Debug ">>>>>>>> VMAD"
Case "CLIP"
Debug ">>>>>>>> CLIP"
Case "SURF"
Debug ">>>>>>>> SURF"
svalu = PeekS(*buffer, -1, #PB_Ascii)
j = Len(svalu) + 1
Debug "NAME = " + svalu
For i = j To itlen Step 1
stemp = PeekS(*buffer + i, -1, #PB_Ascii)
i + Len(stemp)
Select stemp
Case "COLR"
Debug "Find COLR"
imlen = BigEndianToWord(*buffer + i)
Debug "R: " + Str(BigEndianToFloat(PeekL(*buffer + i + 2 )) * 255)
Debug "G: " + Str(BigEndianToFloat(PeekL(*buffer + i + 6 )) * 255)
Debug "B: " + Str(BigEndianToFloat(PeekL(*buffer + i + 10)) * 255)
i + imlen
Case "DIFF"
Debug "Find DIFF"
imlen = BigEndianToWord(*buffer + i)
i + imlen
Case "SPEC"
Debug "Find SPEC"
imlen = BigEndianToWord(*buffer + i)
i + imlen
Case "SMAN"
Debug "Find SMAN"
imlen = BigEndianToWord(*buffer + i)
i + imlen
EndSelect
Next i
EndSelect
;
; PROGRESSION DE CHARGEMENT DU FICHIER.
;
fprogress = Int((100 / iflen) * Loc(ifile))
;Debug "CHARGEMENT : " + Str(fprogress) + "%"
;
; PROGRESSION DE CHARGEMENT DU FICHIER.
;
Wend
EndIf
CloseFile(ifile)
EndIf
EndProcedure
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
;
; EXEMPLE DE CHARGEMENT D'UN FICHIER LWO.
;
loader_lwo("cube.lwo")
GallyHC