[bb] Truespace 2 importer. by David Bird(Birdie) [ 1+ years ago ]

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

Previous topic - Next topic

BlitzBot

Title : Truespace 2 importer.
Author : David Bird(Birdie)
Posted : 1+ years ago

Description : A little buggy but works ok. I'll be looking into this a little more but heres a start.

Code :
Code: blitzbasic
;
;	Cob File Loader
;	ASCII only
;	(c)2002 David Bird
;	enquire@davebird.fsnet.co.uk
;
;Rules for use.
;truespace2 objects must be rotated to 0,0,0 in the editer before saving
;No children support. but multiple surfaces can be applied
;textures must be in the root dir of exe
;You get better results if you triangulate the mesh in ts
Graphics3D 640,480,0,2

cam=CreateCamera()
CameraRange cam,.1,300
PositionEntity cam,0,0,-8


mesh=LoadCobASCII("test.cob")	;Can be run without triangulation but not very well.

lit=CreateLight()
While Not KeyDown(1)
	If KeyHit(17) Then w=1-w
	If KeyDown(30) Then MoveEntity cam,0,0,.1
	If KeyDown(44) Then MoveEntity cam,0,0,-.1
	If KeyDown(200) Then TurnEntity cam,1,0,0
	If KeyDown(208) Then TurnEntity cam,-1,0,0
	If KeyDown(203) Then TurnEntity cam,0,1,0
	If KeyDown(205) Then TurnEntity cam,0,-1,0
	WireFrame w
	UpdateWorld
	RenderWorld
	Text 0,0,vecx
	Text 0,15,vecy
	Text 0,30,vecz
	Flip
Wend


ClearWorld
EndGraphics
End

;
;	Cob File Loader
;	ASCII only
;	(c)2002 David Bird
;
Type vrt
	Field ind
	Field x#,y#,z#
End Type

Type tex
	Field ind
	Field u#,v#
End Type
	
Type face
	Field count
	Field i[20]
	Field matid
	Field t[20]
End Type

Function GetVert.vrt(index)
	For v.vrt=Each vrt
		If vind=index Then Return v
	Next
End Function

Function Gettex.tex(index)
	For t.tex=Each tex
		If tind=index Then Return t
	Next
End Function

Function LoadCobASCII(filename$)
	file=ReadFile(filename$)
	If file=0 Then Return 0
	
	mesh=CreateMesh()
	dum$=ReadLine(file)	;strip 2 info lines
	dum=ReadLine(file)
	NameEntity mesh,Trim$(Mid$(ReadLine$(file),5))	;Read in entities name
	dum=ReadLine(file)
	vecx$=Mid$(ReadLine(file),8)
	vecy$=Mid$(ReadLine(file),8)
	vecz$=Mid$(ReadLine(file),8)
	dum=ReadLine(file)
	tmat1$=Mid$(ReadLine(file),1)
	tmat2$=Mid$(ReadLine(file),1)
	tmat3$=Mid$(ReadLine(file),1)
	tmat4$=Mid$(ReadLine(file),1)
	ratfish$=Trim$(Mid$(ReadLine(file),15))
	vertcount=ratfish
	indexc=0
	For a=1 To vertcount
		v.vrt=New vrt
		vind=indexc
		indexc=indexc+1
		st$=Trim$(ReadLine$(file))
		vx=Mid$(st,1,Instr(st," ")-1)
		vx=vx
		st=Mid$(st,Instr(st," ")+1)
		vy=Mid$(st,1,Instr(st," ")-1)
		vy=vy
		st=Mid$(st,Instr(st," ")+1)
		vz=st
	Next
	texcount=Trim$(Mid$(ReadLine(file),17))
	indext=0
	For a=1 To texcount
		t.Tex=New tex
		tind=indext
		indext=indext+1
		st=Trim$(ReadLine$(file))
		tu=Mid$(st,1,Instr(st," "))
		tv=Mid$(st,Instr(st," "))
	Next
	facecount=Trim$(Mid$(ReadLine(file),6))
	surfcount=0
	For a=1 To facecount
		f.face=New face
		tmp$=Trim$(ReadLine$(file))		;surface id last indent
		fcount=Mid$(tmp,11,2)
		If Lower$(Left$(tmp,4))="face" Then 
			Repeat
				tmp$=Mid$(tmp$,Instr(tmp$," ")+1)
			Until Instr(tmp$," ")=0
			fmatid=tmp
			fmatid=fmatid+1
		Else
			fmatid=1	;;todo Hole face describes how to cut out the next face
		End If
		If fmatid>surfcount Then surfcount=fmatid
		tmp$=Trim$(ReadLine$(file))
		For b=0 To fcount-1
			tp$=Mid$(tmp$,Instr(tmp$,"<")+1,Instr(tmp$,">")-2)	;<vertindex , texture index>
			If Right$(tp$,1)=">" Then tp=Left$(tp,Len(tp)-1)
			tmp$=Mid$(tmp$,Instr(tmp$,">")+1)
			fi[b]=Left$(tp,Instr(tp,","))
			f	[b]=Mid$(tp,Instr(tp,",")+1)
		Next
	Next
	dum=ReadLine(file)
	;Once loaded all vert/face and tex coord info setup surfaces
	dum=ReadLine(file)
	For a=1 To surfcount
		Repeat
			t4$=ReadLine$(file)
			If Lower$(Left$(t4,3))="end" Then Goto misstexture
		Until Lower$(Left$(t4,3))="rgb"
		;rgb
		t4=Mid$(t4,4)
		red#=Left$(t4,Instr(t4,",")-1)
		t4=Mid$(t4,Instr(t4,",")+1)
		green#=Left$(t4,Instr(t4,",")-1)
		blue#=Mid$(t4,Instr(t4,",")+1)
		;alpha info
		t5$=ReadLine$(file)
		alpha$=Trim$(Mid$(t5,6))
		alpha=Mid$(alpha,1,Instr(alpha," ")-1)
		;shininess
		t5=Trim$(Mid$(t5,Instr(t5,"ks")-12))
		shiny#=Mid$(t5,1,Instr(t5," ")-1)
		;texture info
		;filename cull must be in main directory sorry
		BFile$=ReadLine$(file)
		Repeat
			bfile=Mid$(bfile,1+Instr(bfile,""))
		Until Instr(bfile,"")=0
		brush=LoadBrush(bfile)
		If brush=0 Then 
			brush=CreateBrush(red*255,green*255,blue*255)
			BrushColor brush,red*255,green*255,blue*255
			texxx=LoadTexture(bfile)
			If texxx<>0 Then
				BrushTexture brush,texxx
			End If
		Else
			BrushColor brush,red*255,green*255,blue*255
		End If
		BrushAlpha brush,alpha
		BrushShininess brush,shiny
		surf=CreateSurface(mesh,brush)
		dum=ReadLine(file)
	Next
	.misstexture
	Local vv.vrt[20]
	Local tt.tex[20]
	
	CloseFile file
	;Now add the mesh information
	For f=Each face
		If fmatid>=0 Then
			surf=GetSurface(mesh,fmatid)
			For b=1 To fcount
				vv[b-1]=getvert(fi[b-1])
				
				tt[b-1]=gettex(f	[b-1])
			Next
	
			vrtst=AddVertex(surf,vv[0]x,vv[0]y,vv[0]z,tt[0]u,tt[0]v)
			For b=1 To fcount-1
				AddVertex surf,vv[b]x,vv[b]y,vv[b]z,tt[b]u,tt[b]v
			Next
			
			AddTriangle surf,vrtst,vrtst+1,vrtst+2
			For b=3 To fcount-1
				AddTriangle surf,vrtst,vrtst+b-1,vrtst+b
			Next
		Else

		End If
	Next
	Delete Each vrt
	Delete Each tex
	Delete Each face
	UpdateNormals mesh
	m11#=Mid$(tmat1,1,Instr(tmat1," ")-1)
	tmat1=Mid$(tmat1,Instr(tmat1," ")+1)
	m12#=Mid$(tmat1,1,Instr(tmat1," ")-1)
	tmat1=Mid$(tmat1,Instr(tmat1," ")+1)
	m13#=Mid$(tmat1,1,Instr(tmat1," ")-1)
	tmat1=Mid$(tmat1,Instr(tmat1," ")+1)
	m14#=tmat1
	m21#=Mid$(tmat2,1,Instr(tmat2," ")-1)
	tmat2=Mid$(tmat2,Instr(tmat2," ")+1)
	m22#=Mid$(tmat2,1,Instr(tmat2," ")-1)
	tmat2=Mid$(tmat2,Instr(tmat2," ")+1)
	m23#=Mid$(tmat2,1,Instr(tmat2," ")-1)
	tmat2=Mid$(tmat2,Instr(tmat2," ")+1)
	m24#=tmat2
	m31#=Mid$(tmat3,1,Instr(tmat3," ")-1)
	tmat3=Mid$(tmat3,Instr(tmat3," ")+1)
	m32#=Mid$(tmat3,1,Instr(tmat3," ")-1)
	tmat3=Mid$(tmat3,Instr(tmat3," ")+1)
	m33#=Mid$(tmat3,1,Instr(tmat3," ")-1)
	tmat3=Mid$(tmat3,Instr(tmat3," ")+1)
	m34#=tmat3

	For ss=1 To CountSurfaces(mesh)
		surf=GetSurface(mesh,ss)
		For vt=0 To CountVertices(surf)-1
			x#=VertexX(surf,vt)
			y#=VertexY(surf,vt)
			z#=VertexZ(surf,vt)
			ny#=(m11*x)+(m12*y)+(m13*z)+m14
			nx#=(m21*x)+(m22*y)+(m23*z)+m24
			nz#=(m31*x)+(m32*y)+(m33*z)+m34
			VertexCoords surf,vt,nx,ny,nz
		Next
	Next
	RotateMesh mesh,-90,0,0

;	vx1#=Mid$(vecx,1,Instr(vecx," "))
;	vecx=Mid$(vecx,Instr(vecx," ")+1)
;	vx2#=Mid$(vecx,1,Instr(vecx," "))
;	vecx=Mid$(vecx,Instr(vecx," ")+1)
;	vx3#=vecx

;	vz1#=Mid$(vecy,1,Instr(vecy," "))
;	vecy=Mid$(vecy,Instr(vecy," ")+1)
;	vz2#=Mid$(vecy,1,Instr(vecy," "))
;	vecy=Mid$(vecy,Instr(vecy," ")+1)
;	vz3#=vecy

;	vy1#=Mid$(vecz,1,Instr(vecz," "))
;	vecz=Mid$(vecz,Instr(vecz," ")+1)
;	vy2#=Mid$(vecz,1,Instr(vecz," "))
;	vecz=Mid$(vecz,Instr(vecz," ")+1)
;	vy3#=vecz
;	AlignToVector mesh,vx1,vx2,vx3,2
;	AlignToVector mesh,vy1,vy2,vy3,1
;	AlignToVector mesh,vz1,vz2,vz3,3
;	Stop
	Delete Each face
	Delete Each vrt
	Delete Each tex
	Return mesh
End Function


Comments : none...