@ -5,6 +5,7 @@
# include <unordered_map>
# include <unordered_map>
# include "bsp.h"
# include "bsp.h"
# include "rectpack/finders_interface.h"
# include "rectpack/finders_interface.h"
# include "ps1types.h"
# include "ps1bsp.h"
# include "ps1bsp.h"
static char path [ _MAX_PATH ] ;
static char path [ _MAX_PATH ] ;
@ -262,6 +263,13 @@ static void export_lightmap(const world_t* world, const face_t* face, const Boun
fclose ( flm ) ;
fclose ( flm ) ;
}
}
template < class TData > size_t writeMapData ( const std : : vector < TData > & data , ps1bsp_dentry_t & dentry , FILE * f )
{
dentry . offset = ( unsigned int ) ftell ( f ) ;
dentry . size = sizeof ( TData ) * data . size ( ) ;
return fwrite ( data . data ( ) , sizeof ( TData ) , data . size ( ) , f ) ;
}
int process_faces ( const world_t * world )
int process_faces ( const world_t * world )
{
{
// Write some data to a file
// Write some data to a file
@ -271,22 +279,13 @@ int process_faces(const world_t* world)
return 0 ;
return 0 ;
ps1bsp_header_t outHeader = { 0 } ; // Write an empty placeholder header first
ps1bsp_header_t outHeader = { 0 } ; // Write an empty placeholder header first
outHeader . version = 1 ;
fwrite ( & outHeader , sizeof ( ps1bsp_header_t ) , 1 , fbsp ) ;
fwrite ( & outHeader , sizeof ( ps1bsp_header_t ) , 1 , fbsp ) ;
// TODO: convert vertices and group them by material properties (texture, lightmap) and floating origin zone (based on leaf data), duplicate where necessary
short zone [ 3 ] ;
for ( int leafIdx = 0 ; leafIdx < world - > numLeaves ; + + leafIdx )
{
dleaf_t * leaf = & world - > leaves [ leafIdx ] ;
leaf_zone ( leaf , zone ) ;
//printf("Leaf %d zone (%d, %d, %d) %d face(s)\n", leafIdx, zone[0], zone[1], zone[2], leaf->lface_num);
}
// Write vertex data to a file (no vertex splitting yet)
// Write vertex data to a file (no vertex splitting yet)
std : : vector < ps1bsp_vertex_t > outVertices ;
std : : vector < ps1bsp_vertex_t > outVertices ;
for ( unsigned short i = 0 ; i < world - > numVertices ; + + i )
for ( unsigned short i = 0 ; i < world - > numVertices ; + + i )
{
{
// TODO: we should respect the ordering from vertexRef->index here but meh, problem for later
vertex_t * inVertex = & world - > vertices [ i ] ;
vertex_t * inVertex = & world - > vertices [ i ] ;
ps1bsp_vertex_t outVertex = { 0 } ;
ps1bsp_vertex_t outVertex = { 0 } ;
@ -297,6 +296,12 @@ int process_faces(const world_t* world)
outVertex . y = ( short ) ( inVertex - > Y * 4 ) ;
outVertex . y = ( short ) ( inVertex - > Y * 4 ) ;
outVertex . z = ( short ) ( inVertex - > Z * 4 ) ;
outVertex . z = ( short ) ( inVertex - > Z * 4 ) ;
}
}
else
{
printf ( " Error: vertices found outside of acceptable range: (%f, %f, %f) \n " , inVertex - > X , inVertex - > Y , inVertex - > Z ) ;
fclose ( fbsp ) ;
return 0 ;
}
outVertices . push_back ( outVertex ) ;
outVertices . push_back ( outVertex ) ;
}
}
@ -368,22 +373,17 @@ int process_faces(const world_t* world)
( * iter ) . r = 0 ;
( * iter ) . r = 0 ;
}
}
// Write triangle and face data to file
fwrite ( outVertices . data ( ) , sizeof ( ps1bsp_vertex_t ) , outVertices . size ( ) , fbsp ) ;
fwrite ( outFaceVertices . data ( ) , sizeof ( ps1bsp_facevertex_t ) , outFaceVertices . size ( ) , fbsp ) ;
fwrite ( outFaces . data ( ) , sizeof ( ps1bsp_face_t ) , outFaces . size ( ) , fbsp ) ;
// Update header information
outHeader . numVertices = ( unsigned short ) outVertices . size ( ) ;
outHeader . numFaceVertices = ( unsigned short ) outFaceVertices . size ( ) ;
outHeader . numFaces = ( unsigned short ) outFaces . size ( ) ;
// Write collected data to file and update header info
writeMapData ( outVertices , outHeader . vertices , fbsp ) ;
writeMapData ( outFaces , outHeader . faces , fbsp ) ;
writeMapData ( outFaceVertices , outHeader . faceVertices , fbsp ) ;
// Write final header
// Write final header
fseek ( fbsp , 0 , SEEK_SET ) ;
fseek ( fbsp , 0 , SEEK_SET ) ;
fwrite ( & outHeader , sizeof ( ps1bsp_header_t ) , 1 , fbsp ) ;
fwrite ( & outHeader , sizeof ( ps1bsp_header_t ) , 1 , fbsp ) ;
fclose ( fbsp ) ;
fclose ( fbsp ) ;
printf ( " PS1BSP: wrote %d vertices, %d indices, %d faces \n " , outHeader . numVertices , outHeader . numFaceVertices , outHeader . numFaces ) ;
printf ( " PS1BSP: wrote %d vertices, %d indices, %d faces \n " , outVertices . size ( ) , outFaceVertices . size ( ) , outFaces . size ( ) ) ;
return 1 ;
return 1 ;
}
}