Skip to content

Commit aef71a1

Browse files
committed
utils: By default export JMF to Valve220 MAP; Backport MAP serializer changes from vpHalfLifeAlpha
1 parent beeaf02 commit aef71a1

7 files changed

Lines changed: 168 additions & 27 deletions

File tree

‎utils/jmftools/main.cpp‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ static qWorld_s *Global_GetCurrentWorld()
5555
BuildPackageList
5656
===============
5757
*/
58-
static bool BuildPackageList( qWorld_s *worldDef, char **outBuf, bool listSeparator, int removeVolumePrefix )
58+
static bool BuildPackageList( qWorld_s *worldDef, char **outBuf, char listSeparator, int removeVolumePrefix )
5959
{
6060
if ( !worldDef )
6161
{
@@ -189,9 +189,9 @@ int main( int argc, char **argv )
189189
}
190190

191191
#if JACK_API_VERSION >= API_VERSION_STEAM_BETA
192-
JMFSerializer mapSerializer( s_outputFile, 0, 0, s_currentWorld );
192+
MAPSerializer mapSerializer( s_outputFile, 0, 0, s_currentWorld, FMODE_STDIO );
193193
#else
194-
JMFSerializer mapSerializer( s_outputFile, s_currentWorld );
194+
MAPSerializer mapSerializer( s_outputFile, s_currentWorld, FMODE_STDIO );
195195
#endif // JACK_API_VERSION >= API_VERSION_STEAM_BETA
196196
if ( !mapSerializer.Export() )
197197
{

‎utils/jmftools/mapworld.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ void CMapWorld::pushGroup( qGroup_s *groupDef )
140140
buildPackageList
141141
===============
142142
*/
143-
bool CMapWorld::buildPackageList( char **outBuf, bool listSeparator, int removeVolumePrefix )
143+
bool CMapWorld::buildPackageList( char **outBuf, char listSeparator, int removeVolumePrefix )
144144
{
145145
if ( !outBuf )
146146
{

‎utils/jmftools/mapworld.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class CMapWorld : public qWorld_s
2929

3030
void pushGroup( qGroup_s *groupDef );
3131

32-
bool buildPackageList( char **outBuf, bool listSeparator, int removeVolumePrefix );
32+
bool buildPackageList( char **outBuf, char listSeparator, int removeVolumePrefix );
3333

3434
public:
3535
void clear();

‎utils/jmftools/serializer_jmf.cpp‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -436,11 +436,11 @@ bool JMFSerializer::WriteString( const char *data )
436436
ReadString
437437
===============
438438
*/
439-
bool JMFSerializer::ReadString( char **outBuf )
439+
bool JMFSerializer::ReadString( char **outBuf, bool showerror /*= true*/ )
440440
{
441441
int length = -1;
442442

443-
if ( !ReadData( &length, sizeof( int ) ) || ( length == -1 ) )
443+
if ( !ReadData( &length, sizeof( int ), showerror ) || ( length == -1 ) )
444444
{
445445
*outBuf = NULL;
446446
return false;
@@ -484,11 +484,11 @@ bool JMFSerializer::WriteStringVersion( const char *data, int jmfVersion )
484484
ReadStringVersion
485485
===============
486486
*/
487-
bool JMFSerializer::ReadStringVersion( char **outBuf, int jmfVersion )
487+
bool JMFSerializer::ReadStringVersion( char **outBuf, int jmfVersion, bool showerror /*= true*/ )
488488
{
489489
if ( m_jmfVersion >= jmfVersion )
490490
{
491-
return ReadString( outBuf );
491+
return ReadString( outBuf, showerror );
492492
}
493493

494494
return false;
@@ -1179,7 +1179,7 @@ bool JMFSerializer::SerializeEntity( qEntity_s *entityDef )
11791179
else
11801180
{
11811181
char *classname = NULL;
1182-
ReadString( &classname );
1182+
ReadString( &classname, false ); // We don't want to show an error about file read fail when we reach EOF
11831183

11841184
if ( !classname || !classname[0] )
11851185
{

‎utils/jmftools/serializer_jmf.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ class JMFSerializer : public Serializer
3434

3535
protected:
3636
bool WriteString( const char *data );
37-
bool ReadString( char **outBuf );
37+
bool ReadString( char **outBuf, bool showerror = true );
3838

3939
bool WriteStringVersion( const char *data, int jmfVersion );
40-
bool ReadStringVersion( char **outBuf, int jmfVersion );
40+
bool ReadStringVersion( char **outBuf, int jmfVersion, bool showerror = true );
4141

4242
protected:
4343
bool ProcessHeader();

‎utils/jmftools/serializer_map.cpp‎

Lines changed: 155 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -836,40 +836,181 @@ bool MAPSerializer::SerializeEntities( struct qEntity_s *entityDef )
836836
SerializePathNodes
837837
===============
838838
*/
839-
bool MAPSerializer::SerializePathNodes( struct qPath_s *pathList )
839+
bool MAPSerializer::SerializePathNodes( struct qPath_s *pathDef )
840840
{
841841
if ( !m_writeMode )
842842
{
843843
return true;
844844
}
845845

846-
qNode_t *nodeList = pathList->m_nodeList;
847-
if ( !nodeList )
846+
if ( !pathDef->m_nodeList )
848847
return true;
849848

850-
const char *pathClassname = pathList->m_pathClassname;
851-
if ( !pathClassname || !pathClassname[0] )
849+
if ( !pathDef->m_pathClassname || !pathDef->m_pathClassname[0] )
852850
return true;
853851

854-
if ( m_cordon && (
855-
( pathList->m_bboxMin.x > m_worldDef->m_vecCordonMax.x - 0.001 ) || ( pathList->m_bboxMin.y > m_worldDef->m_vecCordonMax.y - 0.001 ) || ( pathList->m_bboxMin.z > m_worldDef->m_vecCordonMax.z - 0.001 ) ||
856-
( pathList->m_bboxMax.x > m_worldDef->m_vecCordonMin.x + 0.001 ) || ( pathList->m_bboxMax.y > m_worldDef->m_vecCordonMin.y + 0.001 ) || ( pathList->m_bboxMax.z > m_worldDef->m_vecCordonMin.z + 0.001 ) ) )
852+
if ( m_cordon )
857853
{
858-
return true;
859-
}
854+
const vec3_t &bbmin = pathDef->m_bboxMin;
855+
const vec3_t &bbmax = pathDef->m_bboxMax;
856+
857+
if (( bbmin.x > m_worldDef->m_vecCordonMax.x - 0.001 ) || ( bbmin.y > m_worldDef->m_vecCordonMax.y - 0.001 ) || ( bbmin.z > m_worldDef->m_vecCordonMax.z - 0.001 ) ||
858+
( bbmax.x < m_worldDef->m_vecCordonMin.x + 0.001 ) || ( bbmax.y < m_worldDef->m_vecCordonMin.y + 0.001 ) || ( bbmax.z < m_worldDef->m_vecCordonMin.z + 0.001 ))
859+
{
860+
return true;
861+
}
860862

861-
// TODO: Per-node cordon check
863+
for ( qNode_s *nodeDef = pathDef->m_nodeList; nodeDef != NULL; nodeDef = nodeDef->next )
864+
{
865+
const vec3_t &org = nodeDef->m_vecOrigin;
866+
867+
if (( org.x >= m_worldDef->m_vecCordonMin.x + 0.001f && org.y >= m_worldDef->m_vecCordonMin.y + 0.001f && org.z >= m_worldDef->m_vecCordonMin.z + 0.001f ) &&
868+
( org.x <= m_worldDef->m_vecCordonMax.x - 0.001f && org.y <= m_worldDef->m_vecCordonMax.y - 0.001f && org.z <= m_worldDef->m_vecCordonMax.z - 0.001f ))
869+
{
870+
return true;
871+
}
872+
}
873+
}
862874

863-
for ( qNode_t *nodeDef = nodeList; nodeDef != NULL; nodeDef = nodeDef->next )
875+
int nodeIdx = 0;
876+
for ( qNode_t *nodeDef = pathDef->m_nodeList; nodeDef != NULL; nodeDef = nodeDef->next )
864877
{
865878
fprintf( m_fileHandle, "%s\n", "{" );
866879

867-
// TODO
880+
fprintf( m_fileHandle, "\"classname\" \"%s\"\n", pathDef->m_pathClassname );
881+
882+
if ( nodeDef->m_nameOverride && nodeDef->m_nameOverride[0] )
883+
{
884+
fprintf( m_fileHandle, "\"targetname\" \"%s\"\n", nodeDef->m_nameOverride );
885+
886+
if ( nodeDef == pathDef->m_nodeList )
887+
{
888+
++nodeIdx;
889+
}
890+
}
891+
else
892+
{
893+
if ( nodeIdx != 0 )
894+
{
895+
fprintf( m_fileHandle, "\"targetname\" \"%s_%i\"\n", pathDef->m_pathName, nodeIdx );
896+
}
897+
else
898+
{
899+
fprintf( m_fileHandle, "\"targetname\" \"%s\"\n", pathDef->m_pathName );
900+
}
901+
902+
++nodeIdx;
903+
}
904+
905+
if ( nodeDef->next )
906+
{
907+
if ( nodeDef->next->m_nameOverride && nodeDef->next->m_nameOverride[0] )
908+
{
909+
fprintf( m_fileHandle, "\"target\" \"%s\"\n", nodeDef->next->m_nameOverride );
910+
}
911+
else
912+
{
913+
fprintf( m_fileHandle, "\"target\" \"%s_%i\"\n", pathDef->m_pathName, nodeIdx );
914+
}
915+
}
916+
else if ( pathDef->m_pathDirection == 1 )
917+
{
918+
const char *target = pathDef->m_nodeList->m_nameOverride;
919+
920+
if ( !target || !target[0] )
921+
{
922+
target = pathDef->m_pathName;
923+
}
924+
925+
fprintf( m_fileHandle, "\"target\" \"%s\"\n", target );
926+
}
927+
else if ( pathDef->m_pathDirection == 2 && nodeDef->prev )
928+
{
929+
fprintf( m_fileHandle, "\"target\" \"%s_%i\"\n", pathDef->m_pathName, nodeIdx );
930+
}
931+
932+
for ( epair_s *epairs = nodeDef->epairs; epairs != NULL; epairs = epairs->next )
933+
{
934+
if ( epairs->key && epairs->value )
935+
{
936+
fprintf( m_fileHandle, "\"%s\" \"%s\"\n", epairs->key, epairs->value );
937+
}
938+
}
939+
940+
#if JACK_API_VERSION >= API_VERSION_STEAM_BETA
941+
fprintf( m_fileHandle, "\"origin\" \"%s %s %s\"\n", Sys_PrintMapCoordVector3D( nodeDef->m_vecOrigin ) );
942+
#else
943+
fprintf( m_fileHandle, "\"origin\" \"%g %g %g\"\n", Sys_PrintVector3D( nodeDef->m_vecOrigin ) );
944+
#endif // JACK_API_VERSION >= API_VERSION_STEAM_BETA
945+
946+
const vec3_t &ang = nodeDef->m_vecAngles;
947+
if ( ang.x != 0.f || ang.y != 0.f || ang.z != 0.f )
948+
{
949+
fprintf( m_fileHandle, "\"angles\" \"%.0f %.0f %.0f\"\n", Sys_PrintVector3D( ang ) );
950+
}
951+
952+
if ( nodeDef->m_fireEntityOnPass && nodeDef->m_fireEntityOnPass[0] )
953+
{
954+
fprintf( m_fileHandle, "\"message\" \"%s\"\n", nodeDef->m_fireEntityOnPass );
955+
}
868956

869957
fprintf( m_fileHandle, "%s\n", "}" );
870958
}
871959

872-
// TODO
960+
if ( pathDef->m_pathDirection == 2 )
961+
{
962+
for ( qNode_s *nodeDef = pathDef->m_lastNode->prev; nodeDef != NULL; nodeDef = nodeDef->prev )
963+
{
964+
fprintf( m_fileHandle, "%s\n", "{" );
965+
966+
fprintf( m_fileHandle, "\"classname\" \"%s\"\n", pathDef->m_pathClassname );
967+
968+
fprintf( m_fileHandle, "\"targetname\" \"%s_%i\"\n", pathDef->m_pathName, nodeIdx++ );
969+
970+
if ( nodeDef->prev->prev != NULL )
971+
{
972+
fprintf( m_fileHandle, "\"target\" \"%s_%i\"\n", pathDef->m_pathName, nodeIdx );
973+
}
974+
else
975+
{
976+
const char *target = pathDef->m_nodeList->m_nameOverride;
977+
978+
if ( !target || !target[0] )
979+
{
980+
target = pathDef->m_pathName;
981+
}
982+
983+
fprintf( m_fileHandle, "\"target\" \"%s\"\n", target );
984+
}
985+
986+
for ( epair_s *epairs = nodeDef->epairs; epairs != NULL; epairs = epairs->next )
987+
{
988+
if ( epairs->key && epairs->value )
989+
{
990+
fprintf( m_fileHandle, "\"%s\" \"%s\"\n", epairs->key, epairs->value );
991+
}
992+
}
993+
994+
#if JACK_API_VERSION >= API_VERSION_STEAM_BETA
995+
fprintf( m_fileHandle, "\"origin\" \"%s %s %s\"\n", Sys_PrintMapCoordVector3D( nodeDef->m_vecOrigin ) );
996+
#else
997+
fprintf( m_fileHandle, "\"origin\" \"%g %g %g\"\n", Sys_PrintVector3D( nodeDef->m_vecOrigin ) );
998+
#endif // JACK_API_VERSION >= API_VERSION_STEAM_BETA
999+
1000+
const vec3_t &ang = nodeDef->m_vecAngles;
1001+
if ( ang.x != 0.f || ang.y != 0.f || ang.z != 0.f )
1002+
{
1003+
fprintf( m_fileHandle, "\"angles\" \"%.0f %.0f %.0f\"\n", Sys_PrintVector3D( ang ) );
1004+
}
1005+
1006+
if ( nodeDef->m_fireEntityOnPass && nodeDef->m_fireEntityOnPass[0] )
1007+
{
1008+
fprintf( m_fileHandle, "\"message\" \"%s\"\n", nodeDef->m_fireEntityOnPass );
1009+
}
1010+
1011+
fprintf( m_fileHandle, "%s\n", "}" );
1012+
}
1013+
}
8731014

8741015
return true;
8751016
}

‎utils/jmftools/serializer_map.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class MAPSerializer : public Serializer
3838
bool SerializeBrushFaces( struct qFace_s *faceDef, struct qBrush_s *brushDef );
3939
bool SerializeBrushes( struct qBrush_s *brushDef, struct qEntity_s *entityDef );
4040
bool SerializeEntities( struct qEntity_s *entityDef );
41-
bool SerializePathNodes( struct qPath_s *pathList );
41+
bool SerializePathNodes( struct qPath_s *pathDef );
4242

4343
protected:
4444
int m_mapVersion;

0 commit comments

Comments
 (0)