Code archives/3D Graphics - Mesh/VRML Mesh Exporter
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| (Ver 1.1, updated Apr 04) Takes a normal blitz3D mesh, and outputs it into the "standard" VRML format. It can then be loaded into any other graphics programs that support VRML import - like 3D Studio Max. My uses for it: Just to export custom blitz geometry in editable format.. Or to convert a .B3D or .X into something editable... | |||||
;
; VRML Exporter
; (c) Braneloc, Feb 2003
; Just to export mesh geometry into max
;
; Usage:
; Feel free to use it ! Please send me any changes,
; don't claim you wrote it (!)
; Add as new file to project
;
; Good bits:
; Correctly exports single and multi-surface static meshes
; Preserves UVs
; Well, it works !!
;
; Limitations:
; No animation support
;
; History:
; 1.0 Feb 2003
; First release to Blitz code archives.
; (Protean is my code editor of choice, check it out)
; 1.0 July 2003
; First release to Protean code archives
; 1.1 Apr 2004
; Removed brush & texture information limitation :)
; Now exports correct filenames for textures.
;
; Omissions: (might add if there is sufficiant/any demand)
; (it's just an exporter, not a world creator !)
; Vertex colouring
; normals
vrml_demo()
;;; <summary>just create/load an object, and then export it.
;;; it should load nicely into 3D Studio Max and anything that
;;; can handle VRML files.</summary>
;;; <subsystem>vrml</subsystem>
Function vrml_demo()
Graphics3D 640,480,0,2
c=CreateCube()
NameEntity c,"Cube"
vrml_export("cube.wrl",c)
End Function
;;; <summary>Converts a mesh into a vrml file</summary>
;;; <param name="file">The file to export, presumably ending .wrl</param>
;;; <param name="mesh">Blitz's mesh handle</param>
;;; <remarks>Preserves as much as possible</remarks>
;;; <subsystem>vrml</subsystem>
Function vrml_export(file$,mesh)
o=WriteFile(file$)
WriteLine o,"#VRML V1.0 ascii"
WriteLine o,"# Blitz mesh to VRML converted on "+CurrentDate$()
WriteLine o,"# Braneloc's BlitzVRML Exporter 1.1 (Apr 2004)"
WriteLine o,"#"
If EntityName(mesh)
WriteLine o,"# "+EntityName(mesh)
EndIf
For n=1 To CountSurfaces(mesh)
;WriteLine o,"DEF surface"+n
WriteLine o,"Separator { # surface "+n
vrml_tex(o,vrml_surfacename$(mesh,n)) ; you have a better idea?
WriteLine o," Coordinate3 {"
WriteLine o," point ["
vrml_verts(o,mesh,n)
WriteLine o," ]"
WriteLine o," }"
WriteLine o," TextureCoordinate2 {"
WriteLine o," point ["
vrml_UVs(o,mesh,n)
WriteLine o," ]"
WriteLine o," }"
WriteLine o," IndexedFaceSet {"
WriteLine o," coordIndex ["
vrml_faces(o,mesh,n)
WriteLine o," ]"
WriteLine o," }"
WriteLine o,"}"
Next
CloseFile o
End Function
;;; <summary>Get texture name of mesh surface</summary>
;;; <param name="mesh">Mesh to analyse</param>
;;; <param name="surfacenumber">Surface number in question</param>
;;; <returns>Texture name of specified surface on mesh</returns>
;;; <subsystem>vrml</subsystem>
Function vrml_surfacename$(mesh,surfacenumber)
surf=GetSurface(mesh,surfacenumber)
br=GetSurfaceBrush(surf)
te=GetBrushTexture(br)
tn$=vrml_StripPath(TextureName(te))
If tn$<>""
Return tn$
Else
Return surfacenumber+".bmp"
EndIf
End Function
;#Region vrml fragments
;;; <summary>Rips the path from a full filename</summary>
;;; <param name="file"></param>
;;; <remarks></remarks>
;;; <returns>File part of filename</returns>
;;; <subsystem>vrml</subsystem>
;;; <example></example>
Function vrml_StripPath$(file$)
If Len(file$)>0
For i=Len(file$) To 1 Step -1
mi$=Mid$(file$,i,1)
If mi$="\" Or mi$="/" Then Return name$ Else name$=mi$+name$
Next
EndIf
Return name$
End Function
;;; <summary>outputs vrml fragment for the vertices</summary>
;;; <param name="file"></param>
;;; <param name="mesh"></param>
;;; <param name="surf"></param>
;;; <remarks></remarks>
;;; <returns></returns>
;;; <subsystem>vrml</subsystem>
;;; <example></example>
Function vrml_verts(file,mesh, surf=1)
s=GetSurface(mesh,surf)
For n=0 To CountVertices(s)-1
WriteLine file," "+VertexX(s,n)+" "+VertexY(s,n)+" "+VertexZ(s,n)+","
Next
End Function
;;; <summary>outputs vrml fragment for the triangles in the mesh</summary>
;;; <param name="file"></param>
;;; <param name="mesh"></param>
;;; <param name="surf"></param>
;;; <remarks></remarks>
;;; <returns></returns>
;;; <subsystem>vrml</subsystem>
;;; <example></example>
Function vrml_faces(file,mesh,surf=1)
s=GetSurface(mesh,surf)
For n=0 To CountTriangles (s)-1
a$=" "
For m=0 To 2
a$=a$+TriangleVertex(s,n,m)+","
Next
a$=a$+"-1,"
WriteLine file,a$
Next
End Function
;;; <summary>outputs vrml fragment for UV coordinates</summary>
;;; <param name="file"></param>
;;; <param name="mesh"></param>
;;; <param name="surf"></param>
;;; <remarks></remarks>
;;; <returns></returns>
;;; <subsystem>vrml</subsystem>
;;; <example></example>
Function vrml_UVs(file,mesh,surf=1)
s=GetSurface(mesh,surf)
; not sure how/if extra sets are handled.
For n=0 To CountVertices(s)-1
WriteLine file," "+VertexU(s,n)+" "+VertexV(s,n)+","
Next
End Function
;;; <summary>outputs vrml fragment for textures</summary>
;;; <param name="file"></param>
;;; <param name="name"></param>
;;; <remarks></remarks>
;;; <returns></returns>
;;; <subsystem>vrml</subsystem>
;;; <example></example>
Function vrml_tex(file,name$)
o=file
WriteLine o," Texture2 {"
WriteLine o," filename "+Chr$(34)+name$+Chr$(34)
WriteLine o," wrapS REPEAT"
WriteLine o," wrapT REPEAT"
WriteLine o," }"
WriteLine o," Texture2Transform {"
WriteLine o," rotation 0"
WriteLine o," center 0 0"
WriteLine o," translation 0 0"
WriteLine o," scaleFactor 1 1"
WriteLine o," }"
End Function
;#End Region |
Comments
| ||
| This is genius. I use it loads :O) Thanks Braneloc! :O) |
Code Archives Forum