Code archives/3D Graphics - Mesh/Import Unreal T3d into Blitz3d

This code has been declared by its author to be Public Domain code.

Download source code

Import Unreal T3d into Blitz3d by Leon Drake2010
Alright i converted my code to blitz3d.

You can download the demo which includes executable, source and map+texture files.

http://www.vigilsoft.net/unrealt3d.zip

screenshot of Deck16][ loaded in blitz3d



In order for this to work in unrealed you need to create a large (preferably) cube brush that overlaps the entire level. then just simply hit intersect which should grab the entire geometry of the level. After that you just export brush.

Also for this to load properly you do need all the textures used in the map. You can easily batch export them all by running a command line to UCC.EXE in the system folder.
e.g.
UCC.EXE BATCHEXPORT Ancient.utx TEXTURE BMP C:\Unreal\Textures\Ancient

source code below
Type T3dSurface

	Field brush,texture,tw,th
	Field texfile$,flags
	Field surface
	Field u.T3dVector,v.T3dVector
	Field n.T3dVector,o.T3dVector
	;I believe i remember reading unrealed polygons never have more than 16 vertices.
	Field vert.T3dVector[16]
	Field vcount
	Field panu#,panv#
End Type


Type T3dVector

	Field x#,y#,z#
	Field id

End Type


Type T3d2dCoord

	Field x#,y#

End Type

Function LoadT3dMesh(file$,ext$=".bmp")

	Local newmesh,tmpim
	Local fstream
	Local fline$
	
	Local mysurf.T3dSurface
	
	If file$ = "" Or ext$ = "" Then Return -1
	
	fstream = ReadFile(file$)
		
	newmesh = CreateMesh()	
		
	While Not Eof(fstream)
	
		
		fline$ = ReadLine(fstream)	
		If Instr(fline$,"Begin Polygon") <> 0 Then
			DebugLog "Found Polygon"
			mysurf = New T3dSurface
			mysurf\surface = CreateSurface(newmesh)	
		
			If Instr(fline$, "Texture") <> 0 Then
			
				mysurf\texfile$ = gett3dval$(fline$,"Texture")
				If mysurf\texfile$ <> "" Then 
					DebugLog extractdir$(file$)+mysurf\texfile$+ext$
					mysurf\texture = LoadTexture(extractdir$(file$)+mysurf\texfile$+ext$)
					tmpim = LoadImage(extractdir$(file$)+mysurf\texfile$+ext$)
					If tmpim <> 0 Then
						mysurf\tw = ImageWidth(tmpim)
						mysurf\th = ImageHeight(tmpim)
						FreeImage(tmpim)
						mysurf\brush = CreateBrush()
						BrushTexture(mysurf\brush,mysurf\texture)
					EndIf
				EndIf
			
			EndIf
			If Instr(fline$, "Flags") <> 0 Then
			
				mysurf\flags = gett3dval$(fline$,"Flags")
			
			EndIf
			
			buildt3dsurface(mysurf,newmesh,fstream)
					
		
		EndIf
	
	Wend
	
	;mesh is really big and rotated differently
	RotateEntity(newmesh,90,0,0)
	ScaleEntity(newmesh,0.5,0.5,0.5)

	CloseFile(fstream)
	
	Delete Each T3dVector
	Delete Each T3dSurface
	


End Function


Function buildt3dsurface(s.T3dSurface,mesh,fstream)

	
	Local fline$
	If s = Null Or mesh = 0 Or fstream = 0 Then Return -1
	
	While Instr(fline$,"End Polygon") = 0 
		
		fline$ = ReadLine(fstream)
		
		If Instr(fline$, "Origin") <> 0 Then
		
			s\o = gett3dxyz(fline$,"Origin")
		
		
		EndIf
		If Instr(fline$, "Normal") <> 0 Then
		
			s\n = gett3dxyz(fline$,"Normal")
		
		EndIf	
		
		If Instr(fline$, "TextureU") <> 0 Then
		
			s\u = gett3dxyz(fline$,"TextureU")
		
		EndIf	
		
		If Instr(fline$, "TextureV") <> 0 Then
		
			s\v = gett3dxyz(fline$,"TextureV")
		
		EndIf
			
		If Instr(fline$, "Pan") <> 0 Then
		
			s\panu# = Float(gett3dval$(fline$,"U"))
			s\panv# = Float(gett3dval$(fline$,"V")) 
		
			DebugLog "Pan vals U: "+s\panu#+" V: "+s\panv#
		
		EndIf	
					
		If Instr(fline$, "Vertex") <> 0 Then
		
			s\vert[s\vcount] = gett3dxyz(fline$,"Vertex")
			s\vcount = s\vcount + 1
			
		EndIf		


		
	
	Wend
	buildt3dpolygon(s,mesh)
	If s\brush <> 0 Then
		PaintSurface(s\surface,s\brush)
	EndIf
	



End Function


Function buildt3dpolygon(s.T3dSurface,mesh)

	If s = Null Or mesh = 0 Then Return -1

	Local uv.T3d2dCoord

	For i = 0 To s\vcount-1
	
		uv = GenUV(s,i)
		s\vert[i]\id = AddVertex(s\surface,s\vert[i]\x#,s\vert[i]\y#,s\vert[i]\z#,uv\x#,uv\y#,1)
		Delete uv	
	
	Next
	For i = 0 To s\vcount-3
	
	AddTriangle(s\surface,s\vert[0]\id,s\vert[i+1]\id,s\vert[i+2]\id)

	
	Next

End Function


Function DotProduct#(ax#,ay#,az#,bx#,by#,bz#)
	
	Return ((ax# * bx#) + (ay# * by#) + (az# * bz#))	
	
End Function

Function GenUV.T3d2dCoord(s.T3dSurface,vindex)
	


	If s = Null Then Return Null
	
	If s\vert[vindex] = Null Then Return Null
	
	Local uv.T3d2dCoord = New T3d2dCoord

	uu# = DotProduct#(s\vert[vindex]\x#-s\o\x#,s\vert[vindex]\y#-s\o\y#,s\vert[vindex]\z#-s\o\z#,s\u\x#,s\u\y#,s\u\z#)
	vv# = DotProduct#(s\vert[vindex]\x#-s\o\x#,s\vert[vindex]\y#-s\o\y#,s\vert[vindex]\z#-s\o\z#,s\v\x#,s\v\y#,s\v\z#)
	uv\x# = (uu#+s\panu#)*(1.0/s\tw)
	uv\y# = (vv#+s\panv#)*(1.0/s\th)
	
	Return uv
	

End Function

Function gett3dxyz.T3dVector(fline$,item$)

	Local xyz.T3dVector
	Local tcoords$[3]
	Local nextone = 0
	
	fline$ = Replace(fline$,item$,"")
	fline$ = Replace(fline$," ","")
	For getpos = 1 To Len(fline$)
										
		tcoords[nextone] = tcoords[nextone] + Mid(fline$,getpos,1)
		If Mid(fline$,getpos,1) = "," Then 
			tcoords[nextone] = Replace(tcoords[nextone],",","")
			nextone = nextone + 1
		EndIf	
	Next	
	
	xyz.T3dVector = New T3dVector
	
	xyz\x# = Float(tcoords[0])
	xyz\y# = Float(tcoords[1])
	xyz\z# = Float(tcoords[2])
	
	Return xyz

End Function

Function gett3dval$(fline$,item$)

	Local newval$,i
	Local offset = Instr(fline$, item$)+Len(item$)
	
	For i = offset To Len(fline$)
	
		newval$ = newval$ + Mid(fline$,i,1)
		If Mid(fline$,i,1) = " " Then 
			newval$ = Replace(newval$,"=","")
			newval$ = Replace(newval$," ","")
			
			Return newval$
		EndIf
	Next
	Return newval$


End Function


Function extractdir$(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
		
			
			Return Left(filename$,i)
		
		EndIf
	
	Next
	Return ""


End Function










;*******************************************************************************************************************
;DEMO
;*******************************************************************************************************************




Graphics3D 640,480,16,2 

Global player=CreatePivot()
Global floorpivot=CreatePivot()
Global camera=CreateCamera(player)
Global campitch;,mvx,mvy,mvz

Text 0,0,"Loading map... please wait."
Flip	
LoadT3dMesh("deck16.t3d",".BMP")
AmbientLight(200,200,200)

Repeat
Cls
freelook()
UpdateWorld()
RenderWorld()

Flip
Until KeyHit(1)
End


Function freelook()

	mxspd#=MouseXSpeed()*0.25
	myspd#=MouseYSpeed()*0.25
	
	
		
	MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

	campitch=campitch+myspd
	If campitch<-85 Then campitch=-85
	If campitch>85 Then campitch=85
	RotateEntity player,campitch,EntityYaw(player)-mxspd,0
	
	If KeyDown(203) Then mvx=-2
	If KeyDown(205) Then mvx=+2
	If KeyDown(200) Then mvz=+2
	If KeyDown(208) Then mvz=-2
	
	If KeyDown(30) Then mvx=-2
	If KeyDown(32) Then mvx=+2
	If KeyDown(17) Then mvz=+2
	If KeyDown(31) Then mvz=-2
	
	

	
	MoveEntity player,mvx,0,mvz
	TranslateEntity player,0,mvy,0
	
End Function

;*******************************************************************************************************************
;*******************************************************************************************************************

Comments

*2010
Amazing stuff :P


Code Archives Forum