Blitz3D code for loading Cartography Shop 4 maps

Community Forums/Developer Stations/Blitz3D code for loading Cartography Shop 4 maps

JoshK(Posted 2003) [#1]
I recommend using this method rather than .X or .b3d, because you get direct access to all the information the editor saves. Entity properties are stored in the entity name. You can use KeyValue$(entity,keyname$) to retrieve keyvalues. For example, KeyValue$(entity,"classname") might return "light".

If Windowed3D() Graphics3D 640,480,16,2 Else Graphics 640,480,16,1
SetBuffer BackBuffer()

cam=CreateCamera()
CameraRange cam,1,10000
TurnEntity cam,0,35,0
MoveEntity cam,0,200,-1500
CameraZoom cam,1.5

CreateLight()

map=LoadCSM("..\..\maps\bedroom.csm",CurrentDir()+"..\..\textures\")

While Not KeyHit(1)
	RotateEntity map,0,MilliSecs()/100.0,0
	RenderWorld
	Flip
	Wend
End

;=================================================
;=================================================
Function LoadCSM(file$,texturepath$="")

f=ReadFile(file)
If Not f Return

ChangeDir FileDir(file)

lightmapbank=CreateBank()
texturebank=CreateBank()

;Version
version=ReadInt(f)
If version<>4
	CloseFile f
	Return
	EndIf

map=CreatePivot()

;Groups
DebugLog groupcount+" groups"
groupcount=ReadInt(f)
For n=1 To groupcount
	flags=ReadInt(f)
	group=ReadInt(f)
	Properties$=readstringn(f)
	r=ReadInt(f)
	g=ReadInt(f)
	b=ReadInt(f)
	Next

;Lightmaps
lightmapcount=ReadInt(f)
DebugLog lightmapcount+" lightmaps"
For n=1 To lightmapcount
	w=ReadInt(f)
	h=ReadInt(f)
	texture=CreateTexture(w,h)
	TextureCoords texture,1
	ResizeBank lightmapbank,BankSize(lightmapbank)+4
	PokeInt lightmapbank,BankSize(lightmapbank)-4,texture
	LockBuffer TextureBuffer(texture)
	For ty=0 To h-1
		For tx=0 To w-1
			hue=ReadInt(f)
			WritePixelFast tx,ty,hue,TextureBuffer(texture)
			Next
		Next
	UnlockBuffer TextureBuffer(texture)
	Next

;Meshes
meshcount=ReadInt(f)
DebugLog meshcount+" meshes"
For n=1 To meshcount
	flags=ReadInt(f)
	group=ReadInt(f)
	properties$=readstringn(f)
	r=ReadInt(f)
	g=ReadInt(f)
	b=ReadInt(f)
	x#=ReadFloat(f)
	y#=ReadFloat(f)
	z#=ReadFloat(f)
	facecount=ReadInt(f)
	DebugLog facecount+" surfaces."
	
	mesh=CreateMesh(map)
	NameEntity mesh,properties
	PositionEntity mesh,x,y,z

	;Surfaces
	For s=1 To facecount
		flags=ReadInt(f)
		texturefile$=readstringn(f)
		lightmapindex=ReadInt(f)
		offsetu#=ReadFloat(f)
		offsetv#=ReadFloat(f)
		scaleu#=ReadFloat(f)
		scalev#=ReadFloat(f)
		rotation#=ReadFloat(f)
		vertexcount=ReadInt(f)
		DebugLog vertexcount+" vertices"
		trianglecount=ReadInt(f)
		DebugLog trianglecount+" triangles"
		linecount=ReadInt(f)

		surf=CreateSurface(mesh)
		brush=CreateBrush()
		BrushFX brush,2
		texturefile=Lower(texturefile)
		texture=retrievetexture(texturepath+texturefile,texturebank)
		If texture BrushTexture brush,texture
		If lightmapindex>0 And lightmapindex*4<=BankSize(lightmapbank)
			lightmap=PeekInt(lightmapbank,(lightmapindex-1)*4)
			If lightmap
				BrushTexture brush,lightmap,0,1
				BrushFX brush,3
				EndIf
			EndIf
		PaintSurface surf,brush
		FreeBrush brush
		
		;Vertices
		For v=0 To vertexcount-1
			x#=ReadFloat(f)
			y#=ReadFloat(f)
			z#=ReadFloat(f)
			nx#=ReadFloat(f)
			ny#=ReadFloat(f)
			nz#=ReadFloat(f)
			r=ReadInt(f)
			g=ReadInt(f)
			b=ReadInt(f)
			u0#=ReadFloat(f)
			v0#=ReadFloat(f)
			w0#=ReadFloat(f)
			u1#=ReadFloat(f)
			v1#=ReadFloat(f)
			w1#=ReadFloat(f)
			
			TFormPoint x,y,z,0,mesh
			AddVertex surf,TFormedX(),TFormedY(),TFormedZ(),u0,-v0
			VertexColor surf,v,r,g,b
			VertexTexCoords surf,v,u1,-v1,0,1
			VertexNormal surf,v,nx,ny,nz
				
			Next
		
		;Triangles
		For t=0 To trianglecount-1 
			a=ReadInt(f)
			b=ReadInt(f)
			c=ReadInt(f)
			AddTriangle surf,a,c,b		
			Next

		For l=0 To linecount-1
			a=ReadInt(f)
			b=ReadInt(f)		
			Next

		Next
	Next

;Point Entities
entitycount=ReadInt(f)
DebugLog entitycount+" entities"
For n=1 To entitycount
	flags=ReadInt(f)
	group=ReadInt(f)
	properties$=readstringn(f)
	x#=ReadFloat(f)
	y#=ReadFloat(f)
	z#=ReadFloat(f)
	entity=CreatePivot(map)
	NameEntity entity,properties
	PositionEntity entity,x,y,z
	Next

;Free textures
For n=0 To BankSize(lightmapbank)-1 Step 4
	FreeTexture PeekInt(lightmapbank,n)
	Next
FreeBank lightmapbank
For n=0 To BankSize(texturebank)-1 Step 8
	FreeBank PeekInt(texturebank,n)
	FreeTexture PeekInt(texturebank,n+4)
	Next
FreeBank texturebank

CloseFile f
Return map
End Function

;Read a null-terminated string
Function ReadStringN$(f,maxlength=0)
Repeat
	ch=ReadByte(f)
	If ch=0 Return t$
	If maxlength
		If Len(t$)=maxlength Return t$+Chr(ch)
		EndIf
	t$=t$+Chr$(ch)
	Forever
End Function

;Return a loaded texture
Function RetrieveTexture(file$,bank)
For n=0 To BankSize(bank)-1 Step 8
	namebank=PeekInt(bank,n)
	s$=""
	For b=0 To BankSize(namebank)-1
		s=s+Chr(PeekByte(namebank,b))
		Next
	If s=file Return PeekInt(bank,n+4)
	Next
ResizeBank bank,BankSize(bank)+8
namebank=CreateBank(Len(file))
For b=0 To BankSize(namebank)-1
	PokeByte namebank,b,Asc(Mid(file,b+1))
	Next
DebugLog "Loading texture "+Chr(34)+CurrentDir()+file+Chr(34)
PokeInt bank,BankSize(bank)-8,namebank
texture=LoadTexture(file)
If Not texture DebugLog "Failed to load texture "+Chr(34)+CurrentDir()+file+Chr(34)
PokeInt bank,BankSize(bank)-4,texture
Return texture
End Function

;Get the file part of a file path
Function FileName$(file$,ext=1)
file=Replace(file,"/","\")
Repeat
	p=Instr(file,"\")
	If p
		file=Right(file,Len(file)-p)
		Else
		Exit
		EndIf
	Forever
If Not ext
	p=Instr(file,".")
	If p file=Left(file,p-1)
	EndIf
Return file
End Function

;Get the directory of a file path
Function FileDir$(file$)
file=Replace(file,"/","\")
oldp=1
Repeat
	p=Instr(file,"\",oldp)
	If p
		oldp=p+1
		Else
		file=Left(file,oldp-1)
		Exit
		EndIf
	Forever
Return file
End Function

;Parsing function
Function Piece$(s$,entry,char$=" ")
While Instr(s,char+char)
	s=Replace(s,char+char,char)
	Wend
For n=1 To entry-1
	p=Instr(s,char)
	s=Right(s,Len(s)-p)
	Next
p=Instr(s,char)
If p<1
	a$=s
	Else
	a=Left(s,p-1)
	EndIf
Return a
End Function

;Function for retrieving entity properties
;[ "light"=KeyValue(entity,"classname") ]
Function KeyValue$(entity,key$)
properties$=EntityName(entity)
key$=Lower(key)
Repeat
	p=Instr(properties,Chr(10))
	If p test$=(Left(properties,p-1)) Else test=properties
	testkey$=Piece(test,1,"=")
	testkey=Trim(testkey)
	testkey=Replace(testkey,Chr(34),"")
	testkey=Lower(testkey)
	If testkey=key 
		value$=Piece(test,2,"=")
		value$=Trim(value$)
		value$=Replace(value$,Chr(34),"")
		Return value	
		EndIf
	If Not p Return
	properties=Right(properties,Len(properties)-p)	
	Forever
End Function



Beaker(Posted 2003) [#2]
Is Cart Shop 4 out now? Or just some test maps?


Gabriel(Posted 2003) [#3]
Er.. right.. wasn't there gonna be a 3.5 first?


JoshK(Posted 2003) [#4]
Version 4 will be out next week...free upgrade.

www.leadwerks.com


TheMan(Posted 2003) [#5]
Yeah I tried it, and it works great, but your code show only the list of groups properties text-line, without pointing to meshes that create this groups. so what are your suggestions

Thanks


TheMan(Posted 2003) [#6]
[edit] Sorry Double Post


JoshK(Posted 2003) [#7]
Groups aren't loaded at this time, but I'll add it.


Gabriel(Posted 2003) [#8]
Version 4 will be out next week...free upgrade.


Oh cool. Thanks for the Heads-Up.


Beaker(Posted 2003) [#9]
What are its new features?