OBJ importer?

Blitz3D Forums/Blitz3D Programming/OBJ importer?

The Forum Archive is locked. These are the original blitzbasic.com forums, kept so their posts can still be read and searched. No new topics, replies or edits can be made here. To join the conversation, head over to the Blitz3D+ forums.

Sorry it took so long. A Simple function which returns a mesh, as pulled from Tattoo. :)


Function LoadObj(file$)
	Local infile, intex$, cmd$, themesh, blanksurf, ek, its
	Local P1$, P2$, P3$, P4$, vtx1#, vtx2#, vtx3#, vtx4#
	Local tx1#, tx2#, tx3#, tx4#, retmesh, v, uvo	
	If FileType(file$)=0 Then Return -1
	infile = ReadFile(file$)
	
	themesh = CreateMesh()
	tempvert = CreateMesh()

	retmesh = CreateMesh()
	
	TempVertSurf = CreateSurface(tempvert)
	blanksurf = CreateSurface(themesh)
	
	While Not Eof(infile)
	intex$ = ReadLine$(infile)
	cmd$ = ParseEntry(intex$,0)
	its = CountIt(intex$," ")
	
	If its>1 Then P1$ = ParseEntry(Intex$,1) Else p1$=""

	If its>2 Then P2$ = ParseEntry(Intex$,2) Else p2$=""

	If its>3 Then P3$ = ParseEntry(Intex$,3) Else p3$=""

	If its>4 Then P4$ = ParseEntry(Intex$,4) Else p4$=""
	
	;DebugLog "Command: "+cmd$+" P1: "+p1$+" P2: "+p2$+" P3: "+p3$+" P4: "+p4$
	
	Select cmd$
	Case "V"
	AddVertex blanksurf,Float(P1$),Float(P2$),Float(P3$)*-1
	Case "VT"
	AddVertex TempVertSurf,Rand(10),Rand(10),Rand(10)
	VertexTexCoords TempVertSurf,vtx,Float(P1$),1-Float(P2$)
	;DebugLog "P1$="+p1$+" P2$= "+p2$

	;DebugLog "U = "+P1$+" V = "+P2$
	vtx = vtx + 1
	Case "USEMTL"
	DebugLog "Hoot "+P1$
	currentsurf = CreateSurface(retmesh) 
	If Trim$(P1$)<>"" Then
		If Instr(p1$,".")<>0 And FileType(modelpath$+p1$)<>0 Then sometex = LoadTexture(modelpath$+p1$,1+VRAM) : Goto passway
		If FileType(modelpath$+p1$+".PNG")<>0 Then sometex = LoadTexture(modelpath$+p1$+".PNG",1+VRAM) : Goto passway
		If FileType(modelpath$+p1$+".BMP")<>0 Then sometex = LoadTexture(modelpath$+p1$+".BMP",1+VRAM) : Goto passway
		If FileType(modelpath$+p1$+".TGA")<>0 Then sometex = LoadTexture(modelpath$+p1$+".TGA",1+VRAM) : Goto passway
		If FileType(modelpath$+p1$+".JPG")<>0 Then sometex = LoadTexture(modelpath$+p1$+".JPG",1+VRAM) : Goto passway

		sometex = CreateTexture(512,512,1+VRAM)
		SetBuffer TextureBuffer(sometex)
		ClsColor 128,128,128
		Cls
		SetBuffer BackBuffer()
		savetex(p1$+".PNG",sometex)
		FreeTexture sometex
		sometex = LoadTexture(modelpath$+p1$+".PNG",1+VRAM)
.passway
			If sometex<>0 Then
				somebrush = CreateBrush(255,255,255)
				BrushTexture somebrush,sometex
				PaintSurface currentsurf,somebrush
			EndIf
		EndIf
	Case "F"
	If currentsurf = 0 Then 
		currentsurf = CreateSurface(retmesh)
		sometex = CreateTexture(512,512,1+VRAM)
		SetBuffer TextureBuffer(sometex)
		ClsColor 128,128,128
		Cls
		SetBuffer BackBuffer()
		somebrush = CreateBrush(255,255,255)
		BrushTexture somebrush,sometex
		PaintSurface currentsurf,somebrush
	EndIf
	
		Vtx1# = -65535 : TX1# = -65535 
		Vtx2# = -65535 : TX2# = -65535 
		Vtx3# = -65535 : TX3# = -65535 
		Vtx4# = -65535 : TX4# = -65535 
			
		If its>1 Then
			ug = CountIT(P1$,"/")
			If ug>0 Then
			Vtx1#=Float(ParseEntry(p1$,0,"/"))-1
			EndIf
	
			If ug>1 Then
			tx1# = Float(ParseEntry(p1$,1,"/"))-1
			EndIf
		EndIf

		If its>2 Then
			ug = CountIT(P2$,"/")
			If ug>0 Then
			Vtx2#=Float(ParseEntry(p2$,0,"/"))-1
			EndIf
	
			If ug>1 Then
			tx2# = Float(ParseEntry(p2$,1,"/"))-1
			EndIf
		EndIf

		If its>3 Then
			ug = CountIT(P3$,"/")
			If ug>0 Then
			Vtx3#=Float(ParseEntry(p3$,0,"/"))-1
			EndIf
	
			If ug>1 Then
			tx3# = Float(ParseEntry(p3$,1,"/"))-1
			EndIf
		EndIf
		
		
		If its>4 Then
			ug = CountIT(P4$,"/")
			If ug>0 Then
			Vtx4#=Float(ParseEntry(p4$,0,"/"))-1
			EndIf
	
			If ug>1 Then
			tx4# = Float(ParseEntry(p4$,1,"/"))-1
			EndIf
		EndIf

		If vtx1<0 Then vtx1 = 0
		If vtx2<0 Then vtx2 = 0
		If vtx3<0 Then vtx3 = 0
		If vtx4<0 Then vtx4 = 0
		
		If vtx1>CountVertices(blanksurf)-1 Then vtx1 = CountVertices(blanksurf)-1
		If vtx2>CountVertices(blanksurf)-1 Then vtx2 = CountVertices(blanksurf)-1
		If vtx3>CountVertices(blanksurf)-1 Then vtx3 = CountVertices(blanksurf)-1
		If vtx4>CountVertices(blanksurf)-1 Then vtx4 = CountVertices(blanksurf)-1
		
		If tx1>CountVertices(tempvertsurf)-1 Then tx1 = CountVertices(tempvertsurf)-1
		If tx2>CountVertices(tempvertsurf)-1 Then tx2 = CountVertices(tempvertsurf)-1
		If tx3>CountVertices(tempvertsurf)-1 Then tx3 = CountVertices(tempvertsurf)-1
		If tx4>CountVertices(tempvertsurf)-1 Then tx4 = CountVertices(tempvertsurf)-1
		
		v = CountVertices(currentsurf)
		
		If its>1 Then
			
			If tx1<0 Then tx1 = tx1 + vtx+1 
			
			UVO = TX1
			If CountVertices(TempVertSurf)=0 Then
				AddVertex currentsurf,VertexX(blanksurf,vtx1),VertexY(blanksurf,vtx1),VertexZ(blanksurf,vtx1)
			Else
				AddVertex currentsurf,VertexX(blanksurf,vtx1),VertexY(blanksurf,vtx1),VertexZ(blanksurf,vtx1),VertexU(TempVertSurf,UVO),VertexV(TempVertSurf,UVO)
			EndIf
		EndIf
		If its>2 Then
			If tx2<0 Then tx2 = tx2 + vtx+1   		
			UVO = TX2
			;DebugLog "TX2= "+tx2
			If CountVertices(TempVertSurf)=0 Then
				AddVertex currentsurf,VertexX(blanksurf,vtx2),VertexY(blanksurf,vtx2),VertexZ(blanksurf,vtx2)
			Else
				AddVertex currentsurf,VertexX(blanksurf,vtx2),VertexY(blanksurf,vtx2),VertexZ(blanksurf,vtx2),VertexU(TempVertSurf,UVO),VertexV(TempVertSurf,UVO)
			EndIf
		EndIf
		If its>3 Then
			If tx3<0 Then tx3 = tx3 + vtx+1
			UVO = TX3
			;DebugLog "TX3= "+tx3
			If CountVertices(TempVertSurf)=0 Then
			AddVertex currentsurf,VertexX(blanksurf,vtx3),VertexY(blanksurf,vtx3),VertexZ(blanksurf,vtx3)
			Else
			AddVertex currentsurf,VertexX(blanksurf,vtx3),VertexY(blanksurf,vtx3),VertexZ(blanksurf,vtx3),VertexU(TempVertSurf,UVO),VertexV(TempVertSurf,UVO)
			EndIf
		EndIf
		If its>4 Then
			If tx4<0 Then tx4 = tx4 + vtx+1  		
			UVO = TX4
			If CountVertices(TempVertSurf)=0 Then
			AddVertex currentsurf,VertexX(blanksurf,vtx4),VertexY(blanksurf,vtx4),VertexZ(blanksurf,vtx4)
			Else
			AddVertex currentsurf,VertexX(blanksurf,vtx4),VertexY(blanksurf,vtx4),VertexZ(blanksurf,vtx4),VertexU(TempVertSurf,UVO),VertexV(TempVertSurf,UVO)
			EndIf
		EndIf
		
		AddTriangle currentsurf,v,v+1,v+2
		
		If its>4 Then
			AddTriangle currentsurf,v+2,v+3,v
		EndIf
				
	End Select
	
	Wend
	CloseFile infile
	FitMesh retmesh,0,0,0,1,1,1,True
	FlipMesh retmesh
	centermesh (retmesh)
	UpdateNormals retmesh
	FreeEntity tempvert
	FreeEntity themesh
	
	Return retmesh
End Function

Function ParseEntry$( Message$, Item, Sep$ = " ")
	Local fas, count, spos, epos, num#, epon#,pos
	
	Repeat
		fas = Instr(message$,sep$,fas+1)
		count = count + 1 
	Until fas = 0 Or count = item
	
	spos = fas+1
	epos = Instr(message$+sep$,sep$,fas+1)
	grub$ = Upper$(Trim$(Mid$(message$,spos,(epos-spos))))
	If Instr(grub$,"E-") Then 
		pos = Instr(grub$,"E-")
		;1.41e-02 = 1.41 * (10 ^ -2)
		num# = Left$(grub$,pos-1)
		epon# = Mid$(grub$,pos+1,Len(grub$)-(pos))
		;'DebugLog "Total: "+grub$
		;'DebugLog "Num: "+num#
		;'DebugLog "etex: "+Mid$(grub$,pos+1,Len(grub$)-(pos))
		;'DebugLog "Exp: "+epon#
		num# = num# * (10 ^ epon#)
		Return num#
		Return "0.0"
	Else 
		Return grub$
	EndIf
End Function

Function CountIt( Message$, Sep$=" ")
	message$=Trim$(message$)
	Local fas, count
	Repeat
	fas = Instr(message$,sep$,fas+1)
		If fas<>0 Then count = count + 1 
	Until fas = 0
	
	Return count+1
End Function
Function CenterMesh (entity)
    FitMesh entity, -(MeshWidth (entity) / 2), -(MeshHeight (entity) / 2), -(MeshDepth (entity) / 2), MeshWidth (entity), MeshHeight (entity), MeshDepth (entity)
End Function


This one handles scientific notation in the text of the .OBJ file. Caught me out that one!