Code archives/3D Graphics - Misc/B3D - > XML -> B3D
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| B3D text file format | |||||
;--------------------------------------------------------------
; Date: 2003.05.02
; B3D text file (xml) format Rev 0.3 by Peter Scheutz
; Based on the official Sample Blitz code for the B3D format
;
;
; This is a rough version, expect cleanups in the near future...
;
;--------------------------------------------------------------
Include "b3dfile.bb" ; get this file from www.blitzbasic.com ->
; Community -> Specs And utils -> Sample Blitz code
;OSB: in b3dfile.bb change "Function b3dReadFloat()" to "Function b3dReadFloat#()"
Const B3DXML_ERROR_NONE=True
Const B3DXML_ERROR_NOFILE=-1
Const B3DXML_ERROR_FILENOTVALID =-2
Const B3DXML_ERROR_WRONGVERSION =-3
Const B3DXML_FLAG_StripTexturePaths=1
Const B3DXML_FLAG_StripBrushPaths=2
Const B3DXML_FLAG_StripNodePaths=4
Const B3DXML_FLAG_SkipVertices=8
Const B3DXML_FLAG_SkipTriangles=16
Const B3DXML_FLAG_SkipKeys=32
Const B3DXML_FLAG_SkipWeights=64
Global b3dxml_emf
Global b3dxml_xml$
Global b3dxml_xmlpos
Global b3dxml_xmlpos2
Global b3dxml_xmlpos3
Global b3dxml_kflags
Global b3dxml_brushtexcount
Global b3dxml_vflags
Global b3dxml_vtexsets
Global b3dxml_vtexsize
;retval=b3d2xml( "man.b3d" ,"maplet.xml",127)
; convert a b3d to xml
retval=b3d2xml( "robot2.b3d" ,"robot.xml")
; path stripping version:
;retval=b3d2xml( "robot2.b3d" ,"robot.xml",7)
If retval= B3DXML_ERROR_NONE Then
msg$ = "File successfully converted"
Else
Select retval
Case B3DXML_ERROR_NOFILE
msg$ = "Input file not found"
Case B3DXML_ERROR_FILENOTVALID
msg$ = "This is not a valid B3D file"
Case B3DXML_ERROR_WRONGVERSION
msg$ = "Wrong B3D version"
End Select
EndIf
; convert xml back to b3d
retval = xml2B3d( "robot.xml" ,"test.b3d")
If retval= B3DXML_ERROR_NONE Then
msg$ = "File successfully converted"
Else
Select retval
Case B3DXML_ERROR_NOFILE
msg$ = "Input file not found"
Case B3DXML_ERROR_FILENOTVALID
msg$ = "This is not a valid B3D file"
Case B3DXML_ERROR_WRONGVERSION
msg$ = "Wrong B3D version"
End Select
EndIf
; convert to xml again
retval=b3d2xml( "test.b3d" ,"test.xml")
If retval= B3DXML_ERROR_NONE Then
msg$ = "File successfully converted"
Else
Select retval
Case B3DXML_ERROR_NOFILE
msg$ = "Input file not found"
Case B3DXML_ERROR_FILENOTVALID
msg$ = "This is not a valid B3D file"
Case B3DXML_ERROR_WRONGVERSION
msg$ = "Wrong B3D version"
End Select
EndIf
;ExecFile "test.xml" ;uncomment to view in default xml viewer (usually IE)
Print msg$
DebugLog msg$
WaitKey
End
Function xml2B3d(xmlfile$,b3dfile$)
Local xbank=CreateBank(FileSize(xmlfile$))
file=ReadFile(xmlfile$)
If Not file Return B3DXML_ERROR_NOFILE
;ret=ReadBytes(xbank,file,0,BankSize(xbank))
While Not Eof(file)
b3dxml_xml$=b3dxml_xml$ + ReadLine(file)
Wend
CloseFile file
; DebugLog b3dxml_xml$
; DebugLog "*************************************************"
b3dxml_xml$ = Replace (b3dxml_xml$," >",">")
b3dxml_xml$ = Replace (b3dxml_xml$," />","/>")
; DebugLog b3dxml_xml$
; WaitKey
; End
file=WriteFile( b3dfile$ )
b3dSetFile( file )
b3dxml_xmlpos=Instr(b3dxml_xml$,"<BB3D")-1
TransChunks
CloseFile file
Return B3DXML_ERROR_NONE
End Function
Function bankToString$(bank)
Local ret$
For n=0 To BankSize(bank)-1
ret$=ret$ + Chr$(PeekByte(bank,n))
Next
Return ret$
End Function
Function xmlReadTag$()
Local pos2
b3dxml_xmlpos=Instr(b3dxml_xml$,"<",b3dxml_xmlpos+1)
If b3dxml_xmlpos>0 Then
b3dxml_xmlpos2=Instr(b3dxml_xml$," ",b3dxml_xmlpos+1)
pos3=Instr(b3dxml_xml$,">",b3dxml_xmlpos+1)
If pos3<>0
If b3dxml_xmlpos2<>0
If pos3<b3dxml_xmlpos2 Then b3dxml_xmlpos2=pos3
Else
b3dxml_xmlpos2=pos3
EndIf
EndIf
If b3dxml_xmlpos2<>0
b3dxml_xmlpos3=Instr(b3dxml_xml$,">",b3dxml_xmlpos2)
Return Mid$(b3dxml_xml$,b3dxml_xmlpos+1,b3dxml_xmlpos2-b3dxml_xmlpos-1)
EndIf
EndIf
End Function
Function xmlReadInt(attrib$,defval=0)
Local pos1,pos2
Local lookfor$=attrib$ + "=" + Chr$(34)
pos1=Instr(b3dxml_xml$,lookfor$,b3dxml_xmlpos)
If Not pos1 Return defval
pos1=pos1+Len(lookfor$)
pos2=Instr(b3dxml_xml$,Chr$(34),pos1+1)
Return Int(Mid$(b3dxml_xml$,pos1,pos2-pos1))
End Function
Function xmlReadString$(attrib$)
Local pos1,pos2
Local lookfor$=attrib$ + "=" + Chr$(34)
pos1=Instr(b3dxml_xml$,lookfor$,b3dxml_xmlpos)
If Not pos1 Return
pos1=pos1+Len(lookfor$)
pos2=Instr(b3dxml_xml$,Chr$(34),pos1+1)
Return Mid$(b3dxml_xml$,pos1,pos2-pos1)
End Function
Function xmlReadFloat#(attrib$,defval#=0)
Local pos1,pos2
Local lookfor$=attrib$ + "=" + Chr$(34)
pos1=Instr(b3dxml_xml$,lookfor$,b3dxml_xmlpos)
If Not pos1 Return defval
pos1=pos1+Len(lookfor$)
pos2=Instr(b3dxml_xml$,Chr$(34),pos1+1)
;DebugLog "here. " + Mid$(b3dxml_xml$,pos1,pos2-pos1)
;DebugLog "****" + Mid$(b3dxml_xml$,pos1,pos2-pos1) + "****"
Return Float(Mid$(b3dxml_xml$,pos1,pos2-pos1))
End Function
Function TransChunks()
Local closing
While b3dxml_xmlpos
closing=False
chunk$=xmlReadTag$()
Select chunk$
Case "BB3D"
b3dBeginChunk(chunk$)
b3dWriteInt xmlReadInt("version")
Case "/BB3D"
b3dEndChunk
Case "ANIM"
b3dBeginChunk(chunk$)
b3dWriteInt xmlReadInt("version")
b3dWriteInt xmlReadInt("frames")
b3dWritefloat xmlReadFloat("fps")
b3dEndChunk
Case "KEYS"
b3dBeginChunk(chunk$)
b3dxml_kflags=xmlReadInt("flags")
b3dWriteInt b3dxml_kflags
Case "/KEYS"
b3dEndChunk
Case "KEY"
b3dWriteInt xmlReadInt("frame")
If b3dxml_kflags And 1
b3dWritefloat xmlReadFloat("xpos")
b3dWritefloat xmlReadFloat("ypos")
b3dWritefloat xmlReadFloat("zpos")
EndIf
If b3dxml_kflags And 2
b3dWritefloat xmlReadFloat("xscale")
b3dWritefloat xmlReadFloat("yscale")
b3dWritefloat xmlReadFloat("zscale")
EndIf
If b3dxml_kflags And 4
b3dWritefloat xmlReadFloat("wrot")
b3dWritefloat xmlReadFloat("xrot")
b3dWritefloat xmlReadFloat("yrot")
b3dWritefloat xmlReadFloat("zrot")
EndIf
Case "TEXS"
b3dBeginChunk(chunk$)
Case "/TEXS"
b3dEndChunk
Case "TEXTURE"
b3dWriteString xmlReadString("name")
b3dWriteInt xmlReadInt("flags")
b3dWriteInt xmlReadInt("blend")
b3dWritefloat xmlReadFloat("xpos")
b3dWritefloat xmlReadFloat("ypos")
b3dWritefloat xmlReadFloat("xscale")
b3dWritefloat xmlReadFloat("yscale")
b3dWritefloat xmlReadFloat("rot")
Case "BRUS"
b3dBeginChunk(chunk$)
b3dxml_brushtexcount=xmlReadInt("count")
b3dWriteInt b3dxml_brushtexcount
Case "/BRUS"
b3dEndChunk
Case "BRUSH"
b3dWriteString xmlReadString("name")
b3dWritefloat xmlReadFloat("red")
b3dWritefloat xmlReadFloat("green")
b3dWritefloat xmlReadFloat("blue")
b3dWritefloat xmlReadFloat("alpha")
b3dWritefloat xmlReadFloat("shininess")
b3dWriteInt xmlReadInt("blend")
b3dWriteInt xmlReadInt("fx")
For n=0 To b3dxml_brushtexcount-1
b3dWriteInt xmlReadInt("texture" + n)
Next
Case "NODE"
b3dBeginChunk(chunk$)
b3dWriteString xmlReadString("name")
; DebugLog "*" + xmlReadString("name") + "*"
; DebugLog "*" + xmlReadFloat("xscale") + "*"
b3dWritefloat xmlReadFloat("xpos")
b3dWritefloat xmlReadFloat("ypos")
b3dWritefloat xmlReadFloat("zpos")
b3dWritefloat xmlReadFloat("xscale")
b3dWritefloat xmlReadFloat("yscale")
b3dWritefloat xmlReadFloat("zscale")
b3dWritefloat xmlReadFloat("wrot")
b3dWritefloat xmlReadFloat("xrot")
b3dWritefloat xmlReadFloat("yrot")
b3dWritefloat xmlReadFloat("zrot")
Case "/NODE"
b3dEndChunk
Case "MESH"
b3dBeginChunk(chunk$)
b3dWriteInt xmlReadInt("brush")
Case "/MESH"
b3dEndChunk
Case "BONE"
b3dBeginChunk(chunk$)
Case "/BONE"
b3dEndChunk
Case "WEIGHT"
b3dWriteInt xmlReadInt("vertex")
b3dWritefloat xmlReadFloat("weight")
Case "VRTS"
b3dBeginChunk(chunk$)
b3dxml_vflags=xmlReadInt("flags")
b3dxml_vtexsets=xmlReadInt("texturecoordsets")
b3dxml_vtexsize=xmlReadInt("texturecoordsize")
b3dWriteInt b3dxml_vflags
b3dWriteInt b3dxml_vtexsets
b3dWriteInt b3dxml_vtexsize
Case "/VRTS"
b3dEndChunk
Case "VERTEX"
b3dWritefloat xmlReadFloat("x")
b3dWritefloat xmlReadFloat("y")
b3dWritefloat xmlReadFloat("z")
If b3dxml_vflags And 1
b3dWritefloat xmlReadFloat("nx")
b3dWritefloat xmlReadFloat("ny")
b3dWritefloat xmlReadFloat("nz")
EndIf
If b3dxml_vflags And 2
b3dWritefloat xmlReadFloat("r")
b3dWritefloat xmlReadFloat("g")
b3dWritefloat xmlReadFloat("b")
b3dWritefloat xmlReadFloat("a")
EndIf
For j=1 To b3dxml_vtexsets
If b3dxml_vtexsize>0 Then b3dWritefloat xmlReadFloat("u"+(j-1))
If b3dxml_vtexsize>1 Then b3dWritefloat xmlReadFloat("v"+(j-1))
If b3dxml_vtexsize>2 Then b3dWritefloat xmlReadFloat("w"+(j-1))
Next
Case "TRIS"
b3dBeginChunk(chunk$)
b3dWriteInt xmlReadInt("brush")
Case "/TRIS"
b3dEndChunk
Case "TRI"
b3dWriteInt xmlReadInt("v0")
b3dWriteInt xmlReadInt("v1")
b3dWriteInt xmlReadInt("v2")
End Select
; TransChunks() ;dump any subchunks
; If closing Then b3dEndChunk ;exit this chunk
; DebugLog "- " + Mid$(b3dxml_xml$,b3dxml_xmlpos3-1,1)
; If chunk$<>"ANIM" Then emit "</" + chunk$ + ">"
Wend
End Function
Function b3d2xml(b3dfile$,xmlfile$,dumpflags=0)
Local file
file=ReadFile( b3dfile$)
If Not file Return B3DXML_ERROR_NOFILE
b3dSetFile( file )
If b3dReadChunk$()<>"BB3D" Return B3DXML_ERROR_FILENOTVALID ;RuntimeError "Invalid b3d file"
version=b3dReadInt()
If version/100>0 Return Return B3DXML_ERROR_WRONGVERSION ;RuntimeError "Invalid b3d file version"
emitfile$=xmlfile$
b3dxml_emf=WriteFile(emitfile$)
emit "<?xml version=" + Chr$(34) + "1.0" + Chr$(34) + "?>"
emit "<BB3D version=" + Chr$(34) + version +Chr$(34) + " exporter=" + Chr$(34) + "dumpb3dasxml version 0.1" + Chr$(34) +">"
DumpChunks(dumpflags,"*")
b3dExitChunk()
emit "</BB3D>"
If b3dxml_emf Then CloseFile b3dxml_emf
CloseFile file
Return B3DXML_ERROR_NONE
End Function
Function DumpChunks(dumpflags, tab$="" )
tt$=tab$
tab$=tab$+" "
While b3dChunkSize()
chunk$=b3dReadChunk$()
Select chunk$
Case "ANIM"
flags=b3dReadInt()
n_frames=b3dReadInt()
fps=b3dReadFloat()
out$=BeginTag$("ANIM")
out$=AddIntegerAttrib(out$,"flags",flags)
out$=AddIntegerAttrib(out$,"frames",n_frames)
out$=AddFloatAttrib(out$,"fps",fps)
out$ = CloseAndEndTag(out$)
emit out$
Case "KEYS"
flags=b3dReadInt()
out$=BeginTag$("KEYS")
out$=AddIntegerAttrib(out$,"flags",flags)
out$ = CloseTag(out$)
emit out$
sz=4
If flags And 1 sz=sz+12
If flags And 2 sz=sz+12
If flags And 4 sz=sz+16
n_keys=b3dChunkSize()/sz
If n_keys*sz=b3dChunkSize()
While b3dChunkSize()
frame=b3dReadInt()
out$=BeginTag$("KEY")
out$=AddIntegerAttrib(out$,"frame",frame)
If flags And 1
key_px#=b3dReadFloat()
key_py#=b3dReadFloat()
key_pz#=b3dReadFloat()
out$=AddFloatAttrib(out$,"xpos",key_px)
out$=AddFloatAttrib(out$,"ypos",key_py)
out$=AddFloatAttrib(out$,"zpos",key_pz)
EndIf
If flags And 2
key_sx#=b3dReadFloat()
key_sy#=b3dReadFloat()
key_sz#=b3dReadFloat()
out$=AddFloatAttrib(out$,"xscale",key_sx)
out$=AddFloatAttrib(out$,"yscale",key_sy)
out$=AddFloatAttrib(out$,"zscale",key_sz)
EndIf
If flags And 4
key_rw#=b3dReadFloat()
key_rx#=b3dReadFloat()
key_ry#=b3dReadFloat()
key_rz#=b3dReadFloat()
out$=AddFloatAttrib(out$,"wrot",key_rw)
out$=AddFloatAttrib(out$,"xrot",key_rx)
out$=AddFloatAttrib(out$,"yrot",key_ry)
out$=AddFloatAttrib(out$,"zrot",key_rz)
EndIf
out$ = CloseAndEndTag(out$)
If Not (dumpflags And B3DXML_FLAG_SkipKeys )
emit out$
EndIf
Wend
Else
;;;DebugLog tab$+"***** Illegal number of keys *****"
EndIf
Case "TEXS"
emit "<" + chunk$ + ">"
While b3dChunkSize()
name$=b3dReadString$()
flags=b3dReadInt()
blend=b3dReadInt()
x_pos#=b3dReadFloat()
y_pos#=b3dReadFloat()
x_scl#=b3dReadFloat()
y_scl#=b3dReadFloat()
rot#=b3dReadFloat()
If dumpflags And B3DXML_FLAG_StripTexturePaths Then name$=StripPath(name$)
out$=BeginTag$("TEXTURE")
out$=AddStringAttrib(out$,"name",name$)
out$=AddIntegerAttrib(out$,"flags",flags)
out$=AddIntegerAttrib(out$,"blend",blend)
out$=AddFloatAttrib(out$,"xpos",x_pos) ; Changed from xoffset to xpos
out$=AddFloatAttrib(out$,"ypos",y_pos) ; Changed from yoffset to ypos
out$=AddFloatAttrib(out$,"xscale",x_scl)
out$=AddFloatAttrib(out$,"yscale",y_scl)
out$=AddFloatAttrib(out$,"rot",rot)
out$ = CloseAndEndTag(out$)
emit out$
Wend
Case "BRUS"
n_texs=b3dReadInt()
out$=BeginTag$("BRUS")
out$=AddIntegerAttrib(out$,"count",n_texs)
out$ = CloseTag(out$)
emit out$
;read all brushes in chunk...
While b3dChunkSize()
name$=b3dReadString$()
red#=b3dReadFloat()
grn#=b3dReadFloat()
blu#=b3dReadFloat()
alp#=b3dReadFloat()
shi#=b3dReadFloat()
blend=b3dReadInt()
fx=b3dReadInt()
If dumpflags And B3DXML_FLAG_StripBrushPaths Then name$=StripPath(name$)
out$=BeginTag$("BRUSH")
out$=AddStringAttrib(out$,"name",name$)
out$=AddFloatAttrib(out$,"red",red)
out$=AddFloatAttrib(out$,"green",grn)
out$=AddFloatAttrib(out$,"blue",blu)
out$=AddFloatAttrib(out$,"alpha",alp)
out$=AddFloatAttrib(out$,"shininess",shi)
out$=AddIntegerAttrib(out$,"blend",blend)
out$=AddIntegerAttrib(out$,"fx",fx)
For k=0 To n_texs-1
tex_id=b3dReadInt()
out$ = AddIntegerAttrib(out$,"texture" + k ,tex_id)
Next
out$ = CloseAndEndTag(out$)
emit out$
Wend
Case "VRTS"
flags=b3dReadInt()
tc_sets=b3dReadInt()
tc_size=b3dReadInt()
sz=12+tc_sets*tc_size*4
If flags And 1 Then sz=sz+12
If flags And 2 Then sz=sz+16
n_verts=b3dChunkSize()/sz
out$=BeginTag$("VRTS")
out$=AddIntegerAttrib(out$,"count",n_verts)
out$=AddIntegerAttrib(out$,"flags",flags)
out$=AddIntegerAttrib(out$,"texturecoordsets",tc_sets)
out$=AddIntegerAttrib(out$,"texturecoordsize",tc_size)
out$ = CloseTag(out$)
emit out$
If n_verts*sz=b3dChunkSize()
;read all verts in chunk
While b3dChunkSize()
x#=b3dReadFloat()
y#=b3dReadFloat()
z#=b3dReadFloat()
out$=BeginTag$("VERTEX")
out$=AddFloatAttrib(out$,"x",x)
out$=AddFloatAttrib(out$,"y",y)
out$=AddFloatAttrib(out$,"z",z)
If flags And 1
nx#=b3dReadFloat()
ny#=b3dReadFloat()
nz#=b3dReadFloat()
out$=AddFloatAttrib(out$,"nx",nx)
out$=AddFloatAttrib(out$,"ny",ny)
out$=AddFloatAttrib(out$,"nz",nz)
EndIf
If flags And 2
r#=b3dReadFloat()
g#=b3dReadFloat()
b#=b3dReadFloat()
a#=b3dReadFloat()
out$=AddFloatAttrib(out$,"r",r)
out$=AddFloatAttrib(out$,"g",g)
out$=AddFloatAttrib(out$,"b",b)
out$=AddFloatAttrib(out$,"a",a)
EndIf
coordnameindex=0
set=0
;read tex coords...
For j=1 To tc_sets*tc_size
uvw#=b3dReadFloat()
coordnameindex=coordnameindex + 1
If coordnameindex>tc_size Then
coordnameindex =1
set=set+1
EndIf
If coordnameindex=1
cn$="u"
ElseIf coordnameindex=2
cn$="v"
Else
cn$="w"
EndIf
out$=AddFloatAttrib(out$,cn$ + Str$(set),uvw)
Next
out$ = CloseAndEndTag(out$)
If Not (dumpflags And B3DXML_FLAG_SkipVertices )
emit out$
EndIf
Wend
Else
;;;DebugLog tab$+"***** Illegal number of vertices *****"
EndIf
Case "TRIS"
brush_id=b3dReadInt()
sz=12
n_tris=b3dChunkSize()/sz
out$=BeginTag$("TRIS")
out$=AddIntegerAttrib(out$,"count",n_tris) ; trianglecount changed to count
out$=AddIntegerAttrib(out$,"brush",brush_id)
out$ = CloseTag(out$)
emit out$
If n_tris*sz=b3dChunkSize()
;read all tris in chunk
While b3dChunkSize()
v0=b3dReadInt()
v1=b3dReadInt()
v2=b3dReadInt()
If Not (dumpflags And B3DXML_FLAG_SkipTriangles )
out$=BeginTag$("TRI")
out$=AddIntegerAttrib(out$,"v0",v0)
out$=AddIntegerAttrib(out$,"v1",v1)
out$=AddIntegerAttrib(out$,"v2",v2)
out$ = CloseAndEndTag(out$)
emit out$
EndIf
Wend
Else
;;;DebugLog tab$+"***** Illegal number of triangles *****"
EndIf
Case "MESH"
brush_id=b3dReadInt()
out$=BeginTag$("MESH")
out$=AddIntegerAttrib(out$,"brush",brush_id)
out$ = CloseTag(out$)
emit out$
Case "BONE"
emit "<" + chunk$ + ">"
sz=8
n_weights=b3dChunkSize()/sz
If n_weights*sz=b3dChunkSize()
;read all weights
While b3dChunkSize()
vertex_id=b3dReadInt()
weight#=b3dReadFloat()
If Not (dumpflags And B3DXML_FLAG_SkipWeights )
out$=BeginTag$("WEIGHT")
out$=AddIntegerAttrib(out$,"vertex",vertex_id)
out$=AddFloatAttrib(out$,"weight",weight)
out$ = CloseAndEndTag(out$)
emit out$
EndIf
Wend
Else
;;;DebugLog tab$+"***** Illegal number of bone weights *****"
EndIf
Case "NODE"
name$=b3dReadString$()
x_pos#=b3dReadFloat()
y_pos#=b3dReadFloat()
z_pos#=b3dReadFloat()
x_scl#=b3dReadFloat()
y_scl#=b3dReadFloat()
z_scl#=b3dReadFloat()
w_rot#=b3dReadFloat()
x_rot#=b3dReadFloat()
y_rot#=b3dReadFloat()
z_rot#=b3dReadFloat()
If dumpflags And B3DXML_FLAG_StripNodePaths Then name$=StripPath(name$)
out$=BeginTag$("NODE")
out$=AddStringAttrib(out$,"name",name$)
out$=AddFloatAttrib(out$,"xpos",x_pos)
out$=AddFloatAttrib(out$,"ypos",y_pos)
out$=AddFloatAttrib(out$,"zpos",z_pos)
out$=AddFloatAttrib(out$,"xscale",x_scl)
out$=AddFloatAttrib(out$,"yscale",y_scl)
out$=AddFloatAttrib(out$,"zscale",z_scl)
out$=AddFloatAttrib(out$,"wrot",w_rot)
out$=AddFloatAttrib(out$,"xrot",x_rot)
out$=AddFloatAttrib(out$,"yrot",y_rot)
out$=AddFloatAttrib(out$,"zrot",z_rot)
out$ = CloseTag(out$)
emit out$
Default
; OBS untested!
; out$=BeginTag$(chunk$)
; out$=AddIntegerAttrib(out$,"size",b3dChunkSize())
; out$ = CloseTag(out$)
; emit out$
; out$="<![CDATA["
; While b3dChunkSize()
; out$=out$ + Chr$(b3dReadByte())
; Wend
; out$=out$ + "]]>"
; emit out$
End Select
DumpChunks(dumpflags, tab$ ) ;dump any subchunks
b3dExitChunk() ;exit this chunk
If chunk$<>"ANIM" Then emit "</" + chunk$ + ">"
Wend
End Function
Function StripPath$(name$)
Local pos
For pos=Len(name$) To 1 Step -1
If Mid$(name$,pos,1)="\" Or Mid$(name$,pos,1)="/" Then Exit
Next
Return Right$(name$,Len(name$)-pos)
End Function
Function emit(out$)
;DebugLog out$
If b3dxml_emf Then WriteLine b3dxml_emf,out$
End Function
Function AddFloatAttrib$(tag$,name$,value#)
If Right$(tag$,1)<>" " Then
Return tag$ + " " + name$ + "=" + Chr$(34) + value# + Chr$(34)
Else
Return tag$ + name$ + "=" + Chr$(34) + value# + Chr$(34)
EndIf
End Function
Function AddStringAttrib$(tag$,name$,value$)
If Right$(tag$,1)<>" " Then
Return tag$ + " " + name$ + "=" + Chr$(34) + value$ + Chr$(34)
Else
Return tag$ + name$ + "=" + Chr$(34) + value$ + Chr$(34)
EndIf
End Function
Function AddIntegerAttrib$(tag$,name$,value%)
If Right$(tag$,1)<>" " Then
Return tag$ + " " + name$ + "=" + Chr$(34) + value% + Chr$(34)
Else
Return tag$ + name$ + "=" + Chr$(34) + value% + Chr$(34)
EndIf
End Function
Function BeginTag$(tag$)
Return "<" + tag$
End Function
Function CloseTag$(tag$)
Return tag$ + ">"
End Function
Function CloseAndEndTag$(tag$)
Return tag$ + "/>"
End Function |
Comments
None.
Code Archives Forum