Problem with Decorator
Community Forums/Developer Stations/Problem with Decorator
| ||
| 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") ? |
| ||
| 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 |