Problem with Decorator

Community Forums/Developer Stations/Problem with Decorator

jfk EO-11110(Posted 2003) [#1]
Hi Terabit!

I had the following Problem: I was working with a Maplet Level that used the oldbric.bmp. This worked fine, and it even used to load the Texture from its original Location while I was texturing the Level in Decorator. But then I saved the Level and ended Decorator. Some time later I started it again and wanted to continue the Work, but now this Texture has disappeared. It was the second Texture, right after the Lightmap in the B3D File.

I checked the File, and it seems there is no longer the String "oldbric.bmp" in the File, instead there is an empty String ("") where it should be.

The problem is when I try to load it in Blitz it shows up without Lightmap. If I reload it in Decorator and save it after reassigning the Lightmap using F3, it produces an illegal Memory error in Blitz.

I tried to manually insert the "oldbric.bmp" in the File, but I wasn't successful for some reason.

Now I have a simple Question: how are the Textures stored in the File? Is there a way to replace a Texture with another Texturename? (In this case replace "" by "oldbric.bmp") ?


jfk EO-11110(Posted 2003) [#2]
Ok, I was able to solve the Problem myself. if anybody wonders how I did it, here is a B3D Mesh-Save Routine that will allow to replace a missing texturepath (as described above) with any name and explicitly define a lightmap texture, then save it includng Lightmap. Decorator will then be capable of loading it.

Of course, this Source can also be used to save any Mesh in B3D Format, as long as it has no Children. ATM it expects the Presence of a Lightmap and a 2nd Texture Coordinates Set, but this can be modified relatively easy.

ATM it uses Texture Index 0 for the Lightmap and 1 to n for the other Textures. The Index of the Brushes (1 to n) is similar to the index of the first Layer Textures (not the Lightmap)

Graphics3D 640,480,32,2
SetBuffer BackBuffer()

Include "b3dfile.bb"

cam=CreateCamera()
MoveEntity cam,0,0,-50

mesh=LoadMesh("eg8de2c.b3d")
EntityFX mesh,1

Global c_surfs=CountSurfaces(mesh)

Print "Nr. of Surfaces: "+ c_surfs

Dim c_surf(1000)
Dim c_brush(1000)
Dim c_tex(1000)
Dim c_tex_name$(1000)

For i=1 To c_surfs
 c_surf(i)= GetSurface(mesh,i)
 c_brush(i)=GetSurfaceBrush( c_surf(i) )
 c_tex(i)=GetBrushTexture( c_brush(i) )
 te$=TextureName$( c_tex(i) )
 ; this is used to replace an "empty" Path that prouced me Errors...
 If te$="" Then te$=CurrentDir$()+"oldbric.bmp"
 ; now cut off the path and leave the filename only
 wo=Len(te$)
 While Mid$(te$,wo,1)<>"\" And wo >1
  wo=wo-1
 Wend
 te$=Right$(te$,Len(te$)-wo)
 c_tex_name$(i)=te$
 Print c_tex_name$(i)
Next



li=LoadTexture("eg8_lm.bmp")
TextureCoords li,1
EntityTexture mesh,li,0,1
c_tex_name$(0)="eg8_lm.bmp"

RenderWorld()
Flip

WaitKey()


;End

WriteBB3D( "temp2.b3d",mesh )


End


Function WriteBB3D( f_name$,mesh )

	file=WriteFile( f_name$ )

	b3dSetFile( file )
	
	b3dBeginChunk( "BB3D" )
		b3dWriteInt( 1 )	;version

		b3dBeginChunk( "TEXS" )
		For i=0 To c_surfs
			b3dWriteString( c_tex_name$(i) ) ; textur nr 0
			If i<>0 Then
			b3dWriteInt( 1 )					;flags
			Else
			b3dWriteInt( 1 Or 65536)					;flags
			EndIf
			b3dWriteInt( 2 )					;blend
			b3dWriteFloat( 0 )					;x in tex 0
			b3dWriteFloat( 0 )					;y in tex 0
			b3dWriteFloat( 1 )					;x scale 1
			b3dWriteFloat( 1 )					;y scale 1
			b3dWriteFloat( 0 )					;rotation 0
			
		Next
		b3dEndChunk()	;end of TEXS chunk

		
		For i=1 To c_surfs
			b3dBeginChunk( "BRUS" )
		
			b3dWriteInt( 2 )					;textures per brush ; eg 2 with lightmap
			b3dWriteString( "brush"+(i) )		;name
			b3dWriteFloat( 1 )					;red
			b3dWriteFloat( 1 )					;green
			b3dWriteFloat( 1 )					;blue
			b3dWriteFloat( 1 )					;alpha
			b3dWriteFloat( 0 )				;shininess
			b3dWriteInt( 2 )					;blend
			b3dWriteInt( 1 )					;FX
			b3dWriteInt( i )					;texture index ?
			b3dWriteInt( 0 )					;lightmap texture index ?

			b3dEndChunk()	;end of BRUS chunk
		Next
		
		b3dBeginChunk( "NODE" )
			b3dWriteString( "entity_name_here!" )
			b3dWriteFloat( 0 )	;x_pos
			b3dWriteFloat( 0 )	;y_pos
			b3dWriteFloat( 0 )	;y_pos
			b3dWriteFloat( 1 )	;x_scale
			b3dWriteFloat( 1 )	;y_scale
			b3dWriteFloat( 1 )	;z_scale
			b3dWriteFloat( 1 )	;rot_w
			b3dWriteFloat( 0 )	;rot_x
			b3dWriteFloat( 0 )	;rot_y
			b3dWriteFloat( 0 )	;rot_z
			WriteMESH( mesh )
		b3dEndChunk()	;end of NODE chunk
		
	b3dEndChunk()	;end of BB3D chunk
	
	CloseFile file
End Function

Function WriteMESH( mesh )

	n_surfs=CountSurfaces( mesh )
	
	b3dBeginChunk( "MESH" )
		b3dWriteInt( -1 )				;no 'entity' brush -1
		
		b3dBeginChunk( "VRTS" )
			b3dWriteInt( 0 )			;flags - 0=no normal/color
			b3dWriteInt( 2 )			;number of tex_coord sets (eg: 2 with lightmap)
			b3dWriteInt( 2 )			;coords per set (u,v,w?) 2 in uv, 3 in uvw
			
			For k=1 To n_surfs
				surf=GetSurface( mesh,k )
				n_verts=CountVertices( surf )-1
				
				For j=0 To n_verts
					b3dWriteFloat( VertexX( surf,j ) )
					b3dWriteFloat( VertexY( surf,j ) )
					b3dWriteFloat( VertexZ( surf,j ) )
					b3dWriteFloat( VertexU#( surf,j,0 ) )
					b3dWriteFloat( VertexV#( surf,j,0 ) )
;					b3dWriteFloat( VertexW#( surf,j,0 ) )
					b3dWriteFloat( VertexU#( surf,j,1 ) ) ; lightmap uv
					b3dWriteFloat( VertexV#( surf,j,1 ) ) ; lightmap uv
;					b3dWriteFloat( VertexW#( surf,j,1 ) )
				Next
			Next
		b3dEndChunk()	;end of VRTS chunk
		
		first_vert=0
		For k=1 To n_surfs
			surf=GetSurface( mesh,k )
			n_tris=CountTriangles( surf )-1
			
			b3dBeginChunk( "TRIS" )
				b3dWriteInt( k-1 )		;brush for these triangles (surf -1 !!!)
				
				For j=0 To n_tris
					b3dWriteInt( first_vert+TriangleVertex( surf,j,0 ) )
					b3dWriteInt( first_vert+TriangleVertex( surf,j,1 ) )
					b3dWriteInt( first_vert+TriangleVertex( surf,j,2 ) )
				Next
				
			b3dEndChunk()	;end of TRIS chunk
			
			first_vert=first_vert+CountVertices( surf )
			
		Next
		
	b3dEndChunk()	;end of MESH chunk
	
End Function


;-------------------------------------------------------------------------------------------------




And this is the include File, taken from the B3D Format SDK:

;
;b3d file utils to be included
;

Dim b3d_stack(100)
Global b3d_file,b3d_tos

Function b3dSetFile( file )
	b3d_tos=0
	b3d_file=file
End Function

;***** functions for reading from B3D files *****

Function b3dReadByte()
	Return ReadByte( b3d_file )
End Function

Function b3dReadInt()
	Return ReadInt( b3d_file )
End Function

Function b3dReadFloat#()
	Return ReadFloat( b3d_file )
End Function

Function b3dReadString$()
	Repeat
		ch=b3dReadByte()
		If ch=0 Return t$
		t$=t$+Chr$(ch)
	Forever
End Function

Function b3dReadChunk$()
	For k=1 To 4
		tag$=tag$+Chr$(b3dReadByte())
	Next
	sz=ReadInt( b3d_file )
	b3d_tos=b3d_tos+1
	b3d_stack(b3d_tos)=FilePos( b3d_file )+sz
	Return tag$
End Function

Function b3dExitChunk()
	SeekFile b3d_file,b3d_stack(b3d_tos)
	b3d_tos=b3d_tos-1
End Function

Function b3dChunkSize()
	Return b3d_stack(b3d_tos)-FilePos( b3d_file )
End Function

;***** Functions for writing to B3D files *****

Function b3dWriteByte( n )
	WriteByte( b3d_file,n )
End Function

Function b3dWriteInt( n )
	WriteInt( b3d_file,n )
End Function

Function b3dWriteFloat( n# )
	WriteFloat( b3d_file,n )
End Function

Function b3dWriteString( t$ )
	For k=1 To Len( t$ )
		ch=Asc(Mid$(t$,k,1))
		b3dWriteByte(ch)
		If ch=0 Return
	Next
	b3dWriteByte( 0 )
End Function

Function b3dBeginChunk( tag$ )
	b3d_tos=b3d_tos+1
	For k=1 To 4
		b3dWriteByte(Asc(Mid$( tag$,k,1 )))
	Next
	b3dWriteInt( 0 )
	b3d_stack(b3d_tos)=FilePos( b3d_file )
End Function

Function b3dEndChunk()
	n=FilePos( b3d_file )
	SeekFile b3d_file,b3d_stack(b3d_tos)-4
	b3dWriteInt( n-b3d_stack(b3d_tos) )
	SeekFile b3d_file,n
	b3d_tos=b3d_tos-1
End Function