[bb] OBJ Exporter by Leon Drake [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:42

Previous topic - Next topic

BlitzBot

Title : OBJ Exporter
Author : Leon Drake
Posted : 1+ years ago

Description : I couldn't find one of these anywhere on the forums or in the archives so i wrote a simple one, i'm sure it could be improved but it works..

Code :
Code: blitzbasic
Function SaveMeshOBJ(mesh,filename$)


	Local file,surfcount,syrf,si,brush,brushtex,texname$,nov,facedef$,offset,vi
	If mesh = 0 Return False
	
	file=WriteFile(stripext$(filename$)+".mtl")
	If Not file Return False ;fail code
	
	WriteLine(file,"#  Wavefront material file")
	WriteLine(file,"#  Converted from b3d by Landon Ritchie")
	
	;get a list of materials
	surfcount = CountSurfaces(mesh)
	
	For si = 1 To CountSurfaces(mesh)
	
		surf=GetSurface(mesh,si)
	brush = GetSurfaceBrush(surf)
		brushtex = GetBrushTexture(brush)
		texname$ = TextureName$(brushtex)
			WriteLine(file,"newmtl "+stripext$(stripdir$(texname$))+"1073741824")
			WriteLine(file,"Ka 1 1 1")
			WriteLine(file,"Ns 8")
			WriteLine(file,"illum 2")
			WriteLine(file,"map_Kd "+stripdir$(texname$))
			
			
	
	Next
	CloseFile(file)
	file=WriteFile(filename$)
	If Not file Return False ;fail code	
	
	
	WriteLine(file,"#  Wavefront object file")	
	WriteLine(file,"#  Converted from b3d by Landon Ritchie")	
	WriteLine(file,"mtllib "+stripdir$(stripext$(filename$)+".mtl"))
	offset = 1
	For si = 1 To CountSurfaces(mesh)
	
		surf=GetSurface(mesh,si)
	brush = GetSurfaceBrush(surf)
		brushtex = GetBrushTexture(brush)
		texname$ = TextureName$(brushtex)
			WriteLine(file,"usemtl "+stripext$(stripdir$(texname$))+"1073741824")
			
			facedef$ = "f"
			nov=CountVertices(surf)
			For vi = 0 To CountVertices(surf)-1
			
				facedef$ = facedef$ + " "+Str(vi+offset)+"/"+Str(vi+offset)+"/"+Str(vi+offset)
			
			Next
			
			WriteLine(file,facedef$)

			For vi = 0 To CountVertices(surf)-1
			
				WriteLine(file,"v "+VertexX(surf,vi)+" "+VertexY(surf,vi)+" "+VertexZ(surf,vi))
			
			Next
			For vi = 0 To CountVertices(surf)-1
			
				WriteLine(file,"vt "+(-VertexU(surf,vi))+" "+(-VertexV(surf,vi))+" "+VertexW(surf,vi))
			
			Next
			For vi = 0 To CountVertices(surf)-1
			
				WriteLine(file,"vn "+Abs(VertexNX(surf,vi))+" "+Abs(VertexNY(surf,vi))+" "+Abs(VertexNZ(surf,vi)))
			
			Next
						
			offset = offset + CountVertices(surf)
	
	Next		
	
	CloseFile(file)
	DebugLog "Exported OBJ"
	
	

End Function


Function stripdir$(filename$)

	If Len(filename$) = 0 Then Return filename$

	For i = Len(filename$) To 1 Step -1
	
		
	
		If Mid(filename$,i,1) = "" Or Mid(filename$,i,1) = "/" Then
		
			;DebugLog("WAT: "+Right(filename$,Len(filename$)-i))
			Return Right(filename$,Len(filename$)-i)
		
		EndIf
	
	Next
	Return filename$


End Function



Function stripext$(filename$)
	If Len(filename$) = 0 Then Return filename$
	For i = Len(filename$) To 1 Step -1
	
		If Mid(filename$,i,1) = "." Then
		
			Return Left(filename$,i-1)
		
		EndIf
	
	Next
	Return filename$


End Function


Function StripAll$(filename$)

If Len(filename$) = 0 Then Return filename$
Return stripext(stripdir(filename$))


End Function


Comments : none...

Filax

Another version

Code: BASIC
Function ExportMeshToOBJ(mesh, filename$)
    ; Ouvre le fichier en mode écriture
    Local file = WriteFile(filename$)
    If Not file Then Return False
	
    ; Écrit l'en-tête du fichier OBJ
    WriteLine(file, "# Exporté depuis Blitz3D")
    WriteLine(file, "# Date: " + CurrentDate$())
	
    ; Compte total des sommets, UVs et normales
    Local vertexCount = 0
    Local uvCount = 0
    Local normalCount = 0
	
    ; Parcours toutes les surfaces du mesh
    For surf = 1 To CountSurfaces(mesh)
        Local surface = GetSurface(mesh, surf)
		
        ; Écriture des sommets (vertices)
        For v = 0 To CountVertices(surface) - 1
            WriteLine(file, "v " + VertexX(surface, v) + " " + VertexY(surface, v) + " " + VertexZ(surface, v))
            vertexCount = vertexCount + 1
        Next
		
        ; Écriture des coordonnées de texture (UV)
        For v = 0 To CountVertices(surface) - 1
            WriteLine(file, "vt " + VertexU(surface, v) + " " + VertexV(surface, v))
            uvCount = uvCount + 1
        Next
		
        ; Écriture des normales
        For v = 0 To CountVertices(surface) - 1
            WriteLine(file, "vn " + VertexNX(surface, v) + " " + VertexNY(surface, v) + " " + VertexNZ(surface, v))
            normalCount = normalCount + 1
        Next
		
        ; Écriture des faces (triangles)
        WriteLine(file, "# Surface " + surf)
        For t = 0 To CountTriangles(surface) - 1
            Local v0 = TriangleVertex(surface, t, 0) + 1 + (surf - 1) * CountVertices(surface)
            Local v1 = TriangleVertex(surface, t, 1) + 1 + (surf - 1) * CountVertices(surface)
            Local v2 = TriangleVertex(surface, t, 2) + 1 + (surf - 1) * CountVertices(surface)
            WriteLine(file, "f " + v0 + "/" + v0 + "/" + v0 + " " + v1 + "/" + v1 + "/" + v1 + " " + v2 + "/" + v2 + "/" + v2)
        Next
    Next
	
    ; Ferme le fichier
    CloseFile(file)
    Return True
End Function

Matty

Thanks....this could come in quite handy for me.

Filax

Quote from: Matty on March 06, 2025, 18:40:16Thanks....this could come in quite handy for me.

Thansk! :) This version work better than the other.