Merge pull request #77 from BSzili/master

Big endian fixes
This commit is contained in:
ptitSeb 2025-09-05 07:46:44 +02:00 committed by GitHub
commit ad5841d319
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
28 changed files with 359 additions and 80 deletions

View File

@ -458,15 +458,15 @@ void CAnimData::Write_t( CTStream *ostrFile) // throw char *
// First we save main ID // First we save main ID
ostrFile->WriteID_t( CChunkID( "ADAT")); ostrFile->WriteID_t( CChunkID( "ADAT"));
// Then we save number of how many animations do we have and then save them all // Then we save number of how many animations do we have and then save them all
ostrFile->Write_t( &ad_NumberOfAnims, sizeof( INDEX)); (*ostrFile)<<ad_NumberOfAnims;
for( i=0; i<ad_NumberOfAnims; i++) for( i=0; i<ad_NumberOfAnims; i++)
{ {
// Next block saves all data for one animation // Next block saves all data for one animation
ostrFile->Write_t( &ad_Anims[i].oa_Name, sizeof( NAME)); ostrFile->Write_t( &ad_Anims[i].oa_Name, sizeof( NAME));
ostrFile->Write_t( &ad_Anims[i].oa_SecsPerFrame, sizeof( TIME)); (*ostrFile)<<ad_Anims[i].oa_SecsPerFrame;
ostrFile->Write_t( &ad_Anims[i].oa_NumberOfFrames, sizeof( INDEX)); (*ostrFile)<<ad_Anims[i].oa_NumberOfFrames;
ostrFile->Write_t( ad_Anims[i].oa_FrameIndices, for (SLONG j = 0; j < ad_Anims[i].oa_NumberOfFrames; j++)
ad_Anims[i].oa_NumberOfFrames * sizeof( INDEX)); (*ostrFile)<<ad_Anims[i].oa_FrameIndices[j];
} }
} }

View File

@ -498,6 +498,7 @@ SLONG CTStream::GetSize_t(void) // throws char *
SLONG chunkSize; SLONG chunkSize;
Read_t( (char *) &chunkSize, sizeof( SLONG)); Read_t( (char *) &chunkSize, sizeof( SLONG));
BYTESWAP(chunkSize);
return( chunkSize); return( chunkSize);
} }

View File

@ -246,7 +246,7 @@ void CBrushPolygonTexture::Read_t( CTStream &strm) // throw char *
void CBrushPolygonTexture::Write_t( CTStream &strm) // throw char * void CBrushPolygonTexture::Write_t( CTStream &strm) // throw char *
{ {
strm<<bpt_toTexture.GetName(); strm<<bpt_toTexture.GetName();
strm.Write_t(&bpt_mdMapping, sizeof(bpt_mdMapping)); strm<<bpt_mdMapping;
strm<<s.bpt_ubScroll; strm<<s.bpt_ubScroll;
strm<<s.bpt_ubBlend; strm<<s.bpt_ubBlend;
strm<<s.bpt_ubFlags; strm<<s.bpt_ubFlags;
@ -280,7 +280,7 @@ void CBrushSector::Write_t( CTStream *postrm) // throw char *
// for each vertex // for each vertex
{FOREACHINSTATICARRAY(bsc_abvxVertices, CBrushVertex, itbvx) { {FOREACHINSTATICARRAY(bsc_abvxVertices, CBrushVertex, itbvx) {
// write precise vertex coordinates // write precise vertex coordinates
postrm->Write_t(&itbvx->bvx_vdPreciseRelative, sizeof(DOUBLE3D)); (*postrm)<<itbvx->bvx_vdPreciseRelative;
}} }}
(*postrm).WriteID_t("PLNs"); // 'planes' (*postrm).WriteID_t("PLNs"); // 'planes'
@ -289,7 +289,7 @@ void CBrushSector::Write_t( CTStream *postrm) // throw char *
// for each plane // for each plane
{FOREACHINSTATICARRAY(bsc_abplPlanes, CBrushPlane, itbpl) { {FOREACHINSTATICARRAY(bsc_abplPlanes, CBrushPlane, itbpl) {
// write precise plane coordinates // write precise plane coordinates
postrm->Write_t(&itbpl->bpl_pldPreciseRelative, sizeof(DOUBLEplane3D)); (*postrm)<<itbpl->bpl_pldPreciseRelative;
}} }}
(*postrm).WriteID_t("EDGs"); // 'edges' (*postrm).WriteID_t("EDGs"); // 'edges'
@ -320,7 +320,7 @@ void CBrushSector::Write_t( CTStream *postrm) // throw char *
bpo.bpo_abptTextures[1].Write_t(*postrm); bpo.bpo_abptTextures[1].Write_t(*postrm);
bpo.bpo_abptTextures[2].Write_t(*postrm); bpo.bpo_abptTextures[2].Write_t(*postrm);
// write other polygon properties // write other polygon properties
(*postrm).Write_t(&bpo.bpo_bppProperties, sizeof(bpo.bpo_bppProperties)); (*postrm)<<bpo.bpo_bppProperties;
// write number of polygon edges // write number of polygon edges
(*postrm)<<bpo.bpo_abpePolygonEdges.Count(); (*postrm)<<bpo.bpo_abpePolygonEdges.Count();
@ -350,7 +350,9 @@ void CBrushSector::Write_t( CTStream *postrm) // throw char *
(*postrm)<<ctElements; (*postrm)<<ctElements;
// write all element indices // write all element indices
if (ctElements>0) { if (ctElements>0) {
(*postrm).Write_t(&bpo.bpo_aiTriangleElements[0], ctElements*sizeof(INDEX)); for (INDEX i = 0; i < ctElements; i++) {
(*postrm)<<bpo.bpo_aiTriangleElements[i];
}
} }
// write the shadow-map (if it exists) // write the shadow-map (if it exists)

View File

@ -3405,7 +3405,7 @@ void CEntity::Write_t( CTStream *ostr) // throw char *
<<en_ulCollisionFlags <<en_ulCollisionFlags
<<en_ulSpawnFlags <<en_ulSpawnFlags
<<en_ulFlags; <<en_ulFlags;
(*ostr).Write_t(&en_mRotation, sizeof(en_mRotation)); (*ostr)<<en_mRotation;
// if this is a brush // if this is a brush
if ( en_RenderType == RT_BRUSH || en_RenderType == RT_FIELDBRUSH) { if ( en_RenderType == RT_BRUSH || en_RenderType == RT_FIELDBRUSH) {
// write brush index in world's brush archive // write brush index in world's brush archive

View File

@ -124,6 +124,12 @@ BOOL CompareChroma( COLOR col1, COLOR col2)
SLONG slR2=0, slG2=0, slB2=0; SLONG slR2=0, slG2=0, slB2=0;
ColorToRGB( col1, (UBYTE&)slR1, (UBYTE&)slG1, (UBYTE&)slB1); ColorToRGB( col1, (UBYTE&)slR1, (UBYTE&)slG1, (UBYTE&)slB1);
ColorToRGB( col2, (UBYTE&)slR2, (UBYTE&)slG2, (UBYTE&)slB2); ColorToRGB( col2, (UBYTE&)slR2, (UBYTE&)slG2, (UBYTE&)slB2);
BYTESWAP(slR1);
BYTESWAP(slG1);
BYTESWAP(slB1);
BYTESWAP(slR2);
BYTESWAP(slG2);
BYTESWAP(slB2);
SLONG slMax1 = Max(Max(slR1,slG1),slB1); SLONG slMax1 = Max(Max(slR1,slG1),slB1);
SLONG slMax2 = Max(Max(slR2,slG2),slB2); SLONG slMax2 = Max(Max(slR2,slG2),slB2);
// trivial? // trivial?

View File

@ -462,6 +462,7 @@ void CDrawPort::DrawPoint( PIX pixI, PIX pixJ, COLOR col, PIX pixRadius/*=1*/) c
if( eAPI==GAT_OGL) { if( eAPI==GAT_OGL) {
const FLOAT fI = pixI+0.5f; const FLOAT fI = pixI+0.5f;
const FLOAT fJ = pixJ+0.5f; const FLOAT fJ = pixJ+0.5f;
BYTESWAP(col);
glCOLOR(col); glCOLOR(col);
pglPointSize(fR); pglPointSize(fR);
pglBegin(GL_POINTS); pglBegin(GL_POINTS);
@ -508,6 +509,7 @@ void CDrawPort::DrawPoint3D( FLOAT3D v, COLOR col, FLOAT fRadius/*=1.0f*/) const
// OpenGL // OpenGL
if( eAPI==GAT_OGL) { if( eAPI==GAT_OGL) {
BYTESWAP(col);
glCOLOR(col); glCOLOR(col);
pglPointSize(fRadius); pglPointSize(fRadius);
pglBegin(GL_POINTS); pglBegin(GL_POINTS);
@ -569,6 +571,7 @@ void CDrawPort::DrawLine( PIX pixI0, PIX pixJ0, PIX pixI1, PIX pixJ1, COLOR col,
if( eAPI==GAT_OGL) { if( eAPI==GAT_OGL) {
const FLOAT fI0 = pixI0+0.5f; const FLOAT fJ0 = pixJ0+0.5f; const FLOAT fI0 = pixI0+0.5f; const FLOAT fJ0 = pixJ0+0.5f;
const FLOAT fI1 = pixI1+0.5f; const FLOAT fJ1 = pixJ1+0.5f; const FLOAT fI1 = pixI1+0.5f; const FLOAT fJ1 = pixJ1+0.5f;
BYTESWAP(col);
glCOLOR(col); glCOLOR(col);
pglBegin( GL_LINES); pglBegin( GL_LINES);
pglTexCoord2f( 0,0); pglVertex2f(fI0,fJ0); pglTexCoord2f( 0,0); pglVertex2f(fI0,fJ0);
@ -615,6 +618,7 @@ void CDrawPort::DrawLine3D( FLOAT3D v0, FLOAT3D v1, COLOR col) const
col = AdjustColor( col, _slTexHueShift, _slTexSaturation); col = AdjustColor( col, _slTexHueShift, _slTexSaturation);
// OpenGL // OpenGL
if( eAPI==GAT_OGL) { if( eAPI==GAT_OGL) {
BYTESWAP(col);
glCOLOR(col); glCOLOR(col);
pglBegin( GL_LINES); pglBegin( GL_LINES);
pglVertex3f( v0(1),v0(2),v0(3)); pglVertex3f( v0(1),v0(2),v0(3));
@ -680,6 +684,7 @@ void CDrawPort::DrawBorder( PIX pixI, PIX pixJ, PIX pixWidth, PIX pixHeight, COL
// OpenGL // OpenGL
if( eAPI==GAT_OGL) { if( eAPI==GAT_OGL) {
BYTESWAP(col);
glCOLOR(col); glCOLOR(col);
pglBegin( GL_LINES); pglBegin( GL_LINES);
pglTexCoord2f(0,0); pglVertex2f(fI0,fJ0); pglTexCoord2f(fD,0); pglVertex2f(fI1, fJ0); // up pglTexCoord2f(0,0); pglVertex2f(fI0,fJ0); pglTexCoord2f(fD,0); pglVertex2f(fI1, fJ0); // up

View File

@ -109,7 +109,11 @@ pixLoop:
DWORD* dst = (DWORD*)(pubTexture+pixTextureSize); DWORD* dst = (DWORD*)(pubTexture+pixTextureSize);
for (int i=0; i<pixTextureSize; i++) { for (int i=0; i<pixTextureSize; i++) {
const DWORD tmp = ((DWORD)*src) | 0xFFFFFF00; const DWORD tmp = ((DWORD)*src) | 0xFFFFFF00;
#if PLATFORM_LITTLEENDIAN
*dst = BYTESWAP32_unsigned((ULONG)tmp); *dst = BYTESWAP32_unsigned((ULONG)tmp);
#else
*dst = tmp;
#endif
src++; src++;
dst++; dst++;
} }

View File

@ -372,6 +372,10 @@ STUBBED("Byte swapping TGA data");
// TGA header starts at the begining of the TGA file // TGA header starts at the begining of the TGA file
pTGAHdr = (struct TGAHeader*)pTGABuffer; pTGAHdr = (struct TGAHeader*)pTGABuffer;
BYTESWAP(pTGAHdr->Width);
BYTESWAP(pTGAHdr->Height);
BYTESWAP(pTGAHdr->Xorigin);
BYTESWAP(pTGAHdr->Yorigin);
// TGA image bytes definition follows up // TGA image bytes definition follows up
pTGAImage = pTGABuffer + sizeof(struct TGAHeader) + pTGAHdr->IdLength; pTGAImage = pTGABuffer + sizeof(struct TGAHeader) + pTGAHdr->IdLength;
@ -475,9 +479,13 @@ void CImageInfo::SaveTGA_t( const CTFileName &strFileName) const // throw char *
// set TGA picture size dimensions // set TGA picture size dimensions
memset( pTGABuffer, 0x0, sizeof(struct TGAHeader)); memset( pTGABuffer, 0x0, sizeof(struct TGAHeader));
pTGAHdr->Width = (UWORD)ii_Width; pTGAHdr->Width = (UWORD)ii_Width;
BYTESWAP(pTGAHdr->Width);
pTGAHdr->Height = (UWORD)ii_Height; pTGAHdr->Height = (UWORD)ii_Height;
BYTESWAP(pTGAHdr->Height);
pTGAHdr->BitsPerPixel = (UBYTE)ii_BitsPerPixel; pTGAHdr->BitsPerPixel = (UBYTE)ii_BitsPerPixel;
pTGAHdr->ImageType = 2; pTGAHdr->ImageType = 2;
BYTESWAP(pTGAHdr->Xorigin);
BYTESWAP(pTGAHdr->Yorigin);
// flip image vertically // flip image vertically
BOOL bAlphaChannel = (slBytesPerPixel==4); BOOL bAlphaChannel = (slBytesPerPixel==4);

View File

@ -752,8 +752,9 @@ void CTextureData::Read_t( CTStream *inFile)
// alloc memory block and read mip-maps // alloc memory block and read mip-maps
inFile->Read_t( td_pulFrames, slTexSize); inFile->Read_t( td_pulFrames, slTexSize);
#if PLATFORM_BIGENDIAN #if PLATFORM_BIGENDIAN
for (SLONG i = 0; i < slTexSize/4; i++) UWORD *uwptr = (UWORD *)td_pulFrames;
BYTESWAP(td_pulFrames[i]); for (SLONG i = 0; i < slTexSize/2; i++)
BYTESWAP(uwptr[i]);
#endif #endif
} }
// if current version // if current version
@ -765,10 +766,6 @@ void CTextureData::Read_t( CTStream *inFile)
if( bAlphaChannel) { if( bAlphaChannel) {
// read texture with alpha channel from file // read texture with alpha channel from file
inFile->Read_t( pulCurrentFrame, pixFrameSizeOnDisk *4); inFile->Read_t( pulCurrentFrame, pixFrameSizeOnDisk *4);
#if PLATFORM_BIGENDIAN
for (SLONG i = 0; i < pixFrameSizeOnDisk; i++)
BYTESWAP(pulCurrentFrame[i]);
#endif
} else { } else {
// read texture without alpha channel from file // read texture without alpha channel from file
inFile->Read_t( pulCurrentFrame, pixFrameSizeOnDisk *3); inFile->Read_t( pulCurrentFrame, pixFrameSizeOnDisk *3);
@ -825,6 +822,15 @@ void CTextureData::Read_t( CTStream *inFile)
ULONG ulSize = AllocEffectBuffers(this); ULONG ulSize = AllocEffectBuffers(this);
inFile->Read_t( td_pubBuffer1, ulSize); inFile->Read_t( td_pubBuffer1, ulSize);
inFile->Read_t( td_pubBuffer2, ulSize); inFile->Read_t( td_pubBuffer2, ulSize);
#if PLATFORM_BIGENDIAN
SWORD* pNew = (SWORD*)td_pubBuffer1;
SWORD* pOld = (SWORD*)td_pubBuffer2;
for (int i = 0; i < ulSize / 2; i++)
{
BYTESWAP(pNew[i]);
BYTESWAP(pOld[i]);
}
#endif
} }
// if this is chunk containing effect data // if this is chunk containing effect data
else if( idChunk == CChunkID("FXDT")) else if( idChunk == CChunkID("FXDT"))
@ -1008,10 +1014,6 @@ void CTextureData::Read_t( CTStream *inFile)
// writes texutre to file // writes texutre to file
void CTextureData::Write_t( CTStream *outFile) // throw char * void CTextureData::Write_t( CTStream *outFile) // throw char *
{ {
#if PLATFORM_BIGENDIAN
STUBBED("Byte swapping");
#endif
// cannot write textures that have been mangled somehow // cannot write textures that have been mangled somehow
_bExport = FALSE; _bExport = FALSE;
if( td_ptegEffect==NULL && IsModified()) throw( TRANS("Cannot write texture that has modified frames.")); if( td_ptegEffect==NULL && IsModified()) throw( TRANS("Cannot write texture that has modified frames."));
@ -1084,14 +1086,15 @@ void CTextureData::Write_t( CTStream *outFile) // throw char *
{ // write type of effect source { // write type of effect source
*outFile << itEffectSource->tes_ulEffectSourceType; *outFile << itEffectSource->tes_ulEffectSourceType;
// write structure holding effect source properties // write structure holding effect source properties
outFile->Write_t( &itEffectSource->tes_tespEffectSourceProperties, sizeof( struct TextureEffectSourceProperties)); *outFile >> itEffectSource->tes_tespEffectSourceProperties;
INDEX ctEffectSourcePixels = itEffectSource->tes_atepPixels.Count(); INDEX ctEffectSourcePixels = itEffectSource->tes_atepPixels.Count();
// write count of effect pixels // write count of effect pixels
*outFile << ctEffectSourcePixels; *outFile << ctEffectSourcePixels;
// if there are any effect pixels // if there are any effect pixels
if( ctEffectSourcePixels>0) { if( ctEffectSourcePixels>0) {
// write all effect pixels in one block // write all effect pixels in one block
outFile->Write_t( &itEffectSource->tes_atepPixels[0], sizeof(struct TextureEffectPixel)*ctEffectSourcePixels); for (INDEX i = 0; i < ctEffectSourcePixels; i++)
*outFile >> itEffectSource->tes_atepPixels[i];
} }
} }
// if effect buffers are valid // if effect buffers are valid

View File

@ -143,21 +143,48 @@ static inline void IncrementColorWithClip( UBYTE &ubR, UBYTE &ubG, UBYTE &ubB,
// add the intensity to the pixel // add the intensity to the pixel
inline void CLayerMixer::AddToCluster( UBYTE *pub) inline void CLayerMixer::AddToCluster( UBYTE *pub)
{ {
#if PLATFORM_LITTLEENDIAN
IncrementByteWithClip(pub[0], ((UBYTE*)&lm_colLight)[3]); IncrementByteWithClip(pub[0], ((UBYTE*)&lm_colLight)[3]);
IncrementByteWithClip(pub[1], ((UBYTE*)&lm_colLight)[2]); IncrementByteWithClip(pub[1], ((UBYTE*)&lm_colLight)[2]);
IncrementByteWithClip(pub[2], ((UBYTE*)&lm_colLight)[1]); IncrementByteWithClip(pub[2], ((UBYTE*)&lm_colLight)[1]);
#else
IncrementByteWithClip(pub[0], ((UBYTE*)&lm_colLight)[0]);
IncrementByteWithClip(pub[1], ((UBYTE*)&lm_colLight)[1]);
IncrementByteWithClip(pub[2], ((UBYTE*)&lm_colLight)[2]);
IncrementByteWithClip(pub[3], ((UBYTE*)&lm_colLight)[3]);
#endif
} }
inline void CLayerMixer::AddAmbientToCluster( UBYTE *pub) inline void CLayerMixer::AddAmbientToCluster( UBYTE *pub)
{ {
#if PLATFORM_LITTLEENDIAN
IncrementByteWithClip(pub[0], ((UBYTE*)&lm_colAmbient)[3]); IncrementByteWithClip(pub[0], ((UBYTE*)&lm_colAmbient)[3]);
IncrementByteWithClip(pub[1], ((UBYTE*)&lm_colAmbient)[2]); IncrementByteWithClip(pub[1], ((UBYTE*)&lm_colAmbient)[2]);
IncrementByteWithClip(pub[2], ((UBYTE*)&lm_colAmbient)[1]); IncrementByteWithClip(pub[2], ((UBYTE*)&lm_colAmbient)[1]);
#else
IncrementByteWithClip(pub[0], ((UBYTE*)&lm_colAmbient)[0]);
IncrementByteWithClip(pub[1], ((UBYTE*)&lm_colAmbient)[1]);
IncrementByteWithClip(pub[2], ((UBYTE*)&lm_colAmbient)[2]);
IncrementByteWithClip(pub[3], ((UBYTE*)&lm_colAmbient)[3]);
#endif
} }
inline void CLayerMixer::AddToCluster( UBYTE *pub, SLONG slIntensity) inline void CLayerMixer::AddToCluster( UBYTE *pub, SLONG slIntensity)
{ {
#if PLATFORM_LITTLEENDIAN
IncrementByteWithClip(pub[0], (long) (((UBYTE*)&lm_colLight)[3] *slIntensity)>>16); IncrementByteWithClip(pub[0], (long) (((UBYTE*)&lm_colLight)[3] *slIntensity)>>16);
IncrementByteWithClip(pub[1], (long) (((UBYTE*)&lm_colLight)[2] *slIntensity)>>16); IncrementByteWithClip(pub[1], (long) (((UBYTE*)&lm_colLight)[2] *slIntensity)>>16);
IncrementByteWithClip(pub[2], (long) (((UBYTE*)&lm_colLight)[1] *slIntensity)>>16); IncrementByteWithClip(pub[2], (long) (((UBYTE*)&lm_colLight)[1] *slIntensity)>>16);
#else
UBYTE r, g, b, a;
ColorToRGBA(lm_colLight, r, g, b, a);
SLONG dR = ((SLONG)r * (SLONG)slIntensity) >> 16;
SLONG dG = ((SLONG)g * (SLONG)slIntensity) >> 16;
SLONG dB = ((SLONG)b * (SLONG)slIntensity) >> 16;
IncrementByteWithClip(pub[0], dR);
IncrementByteWithClip(pub[1], dG);
IncrementByteWithClip(pub[2], dB);
#endif
} }
@ -1406,6 +1433,12 @@ rowDone:
SLONG slR1=0,slG1=0,slB1=0; SLONG slR1=0,slG1=0,slB1=0;
ColorToRGB( col0, (UBYTE&)slR0,(UBYTE&)slG0,(UBYTE&)slB0); ColorToRGB( col0, (UBYTE&)slR0,(UBYTE&)slG0,(UBYTE&)slB0);
ColorToRGB( col1, (UBYTE&)slR1,(UBYTE&)slG1,(UBYTE&)slB1); ColorToRGB( col1, (UBYTE&)slR1,(UBYTE&)slG1,(UBYTE&)slB1);
BYTESWAP(slR0);
BYTESWAP(slG0);
BYTESWAP(slB0);
BYTESWAP(slR1);
BYTESWAP(slG1);
BYTESWAP(slB1);
if( gp.gp_bDark) { if( gp.gp_bDark) {
slR0 = -slR0; slG0 = -slG0; slB0 = -slB0; slR0 = -slR0; slG0 = -slG0; slB0 = -slB0;
slR1 = -slR1; slG1 = -slG1; slB1 = -slB1; slR1 = -slR1; slG1 = -slG1; slB1 = -slB1;
@ -1813,10 +1846,7 @@ void CLayerMixer::MixOneMipmap(CBrushShadowMap *pbsm, INDEX iMipmap)
// Forces C fallback; BYTESWAP itself is a no-op on little endian. // Forces C fallback; BYTESWAP itself is a no-op on little endian.
ULONG swapped = BYTESWAP32_unsigned(colAmbient); ULONG swapped = BYTESWAP32_unsigned(colAmbient);
#else #else
STUBBED("actually need byteswap?");
// (uses inline asm on MacOS PowerPC)
ULONG swapped = colAmbient; ULONG swapped = colAmbient;
BYTESWAP(swapped);
#endif #endif
for (ULONG *ptr = this->lm_pulShadowMap; count; count--) for (ULONG *ptr = this->lm_pulShadowMap; count; count--)
@ -1964,7 +1994,11 @@ __forceinline void CLayerMixer::FillShadowLayer( COLOR col)
#else #else
DWORD* dst = (DWORD*)lm_pulShadowMap; DWORD* dst = (DWORD*)lm_pulShadowMap;
int n = lm_pixCanvasSizeU*lm_pixCanvasSizeV; int n = lm_pixCanvasSizeU*lm_pixCanvasSizeV;
#if PLATFORM_LITTLEENDIAN
DWORD color = BYTESWAP32_unsigned(col); DWORD color = BYTESWAP32_unsigned(col);
#else
DWORD color = col;
#endif
while(n--) {*(dst++)=color;} while(n--) {*(dst++)=color;}
#endif #endif
} }

View File

@ -68,11 +68,38 @@ public:
friend __forceinline CTStream &operator>>(CTStream &strm, Matrix<Type, iRows, iColumns> &matrix) friend __forceinline CTStream &operator>>(CTStream &strm, Matrix<Type, iRows, iColumns> &matrix)
{ {
strm.Read_t(&matrix, sizeof(matrix)); strm.Read_t(&matrix, sizeof(matrix));
#if PLATFORM_BIGENDIAN
for (int i = 0; i < iRows; i++)
{
for (int j = 0; j < iColumns; j++)
{
BYTESWAP(matrix.matrix[i][j]);
}
}
#endif
return strm; return strm;
} }
friend __forceinline CTStream &operator<<(CTStream &strm, Matrix<Type, iRows, iColumns> &matrix) friend __forceinline CTStream &operator<<(CTStream &strm, Matrix<Type, iRows, iColumns> &matrix)
{ {
#if PLATFORM_BIGENDIAN
for (int i = 0; i < iRows; i++)
{
for (int j = 0; j < iColumns; j++)
{
BYTESWAP(matrix.matrix[i][j]);
}
}
#endif
strm.Write_t(&matrix, sizeof(matrix)); strm.Write_t(&matrix, sizeof(matrix));
#if PLATFORM_BIGENDIAN
for (int i = 0; i < iRows; i++)
{
for (int j = 0; j < iColumns; j++)
{
BYTESWAP(matrix.matrix[i][j]);
}
}
#endif
return strm; return strm;
} }
}; };

View File

@ -1178,10 +1178,6 @@ void CModelData::Write_t( CTStream *pFile) // throw char *
// Save flags // Save flags
(*pFile) << md_Flags; (*pFile) << md_Flags;
#if PLATFORM_BIGENDIAN
STUBBED("byte order");
#endif
// Save vertices and frames ct // Save vertices and frames ct
pFile->WriteFullChunk_t( CChunkID("IVTX"), &md_VerticesCt, sizeof(INDEX)); pFile->WriteFullChunk_t( CChunkID("IVTX"), &md_VerticesCt, sizeof(INDEX));
pFile->WriteFullChunk_t( CChunkID("IFRM"), &md_FramesCt, sizeof(INDEX)); pFile->WriteFullChunk_t( CChunkID("IFRM"), &md_FramesCt, sizeof(INDEX));
@ -1689,6 +1685,7 @@ void CModelData::Read_t( CTStream *pFile) // throw char *
// Read color names (Read count, read existing names) // Read color names (Read count, read existing names)
INDEX iValidColorsCt; INDEX iValidColorsCt;
pFile->ReadFullChunk_t( CChunkID("ICLN"), &iValidColorsCt, sizeof(INDEX)); pFile->ReadFullChunk_t( CChunkID("ICLN"), &iValidColorsCt, sizeof(INDEX));
BYTESWAP(iValidColorsCt);
for( i=0; i<iValidColorsCt; i++) for( i=0; i<iValidColorsCt; i++)
{ {
INDEX iExistingColorName; INDEX iExistingColorName;
@ -1935,9 +1932,9 @@ void CModelObject::Write_t( CTStream *pFile) // throw char *
pFile->WriteID_t( CChunkID( "MODT")); pFile->WriteID_t( CChunkID( "MODT"));
*pFile << mo_colBlendColor; *pFile << mo_colBlendColor;
pFile->Write_t( &mo_PatchMask, sizeof(ULONG)); *pFile << mo_PatchMask;
pFile->Write_t( &mo_Stretch, sizeof(FLOAT3D)); *pFile << mo_Stretch;
pFile->Write_t( &mo_ColorMask, sizeof(ULONG)); *pFile << mo_ColorMask;
} }
//------------------------------------------ READ //------------------------------------------ READ
void CModelObject::Read_t( CTStream *pFile) // throw char * void CModelObject::Read_t( CTStream *pFile) // throw char *

View File

@ -915,7 +915,13 @@ CNetworkMessage &operator<<(CNetworkMessage &nm, const CPlayerAction &pa)
} else { } else {
UBYTE ub=1; UBYTE ub=1;
nm.WriteBits(&ub, 1); nm.WriteBits(&ub, 1);
#if PLATFORM_BIGENDIAN
ULONG tmp = *pul;
BYTESWAP(tmp);
nm.WriteBits(&tmp, 32);
#else
nm.WriteBits(pul, 32); nm.WriteBits(pul, 32);
#endif
} }
pul++; pul++;
} }
@ -933,27 +939,57 @@ CNetworkMessage &operator<<(CNetworkMessage &nm, const CPlayerAction &pa)
} else if (ulFlags <= 3) { } else if (ulFlags <= 3) {
UBYTE ub=4; UBYTE ub=4;
nm.WriteBits(&ub, 3); nm.WriteBits(&ub, 3);
#if PLATFORM_BIGENDIAN
ULONG tmp = ulFlags;
BYTESWAP(tmp);
nm.WriteBits(&tmp, 1);
#else
nm.WriteBits(&ulFlags, 1); nm.WriteBits(&ulFlags, 1);
#endif
// (4-15) 0001 = 4 bit value follows // (4-15) 0001 = 4 bit value follows
} else if (ulFlags <= 15) { } else if (ulFlags <= 15) {
UBYTE ub=8; UBYTE ub=8;
nm.WriteBits(&ub, 4); nm.WriteBits(&ub, 4);
#if PLATFORM_BIGENDIAN
ULONG tmp = ulFlags;
BYTESWAP(tmp);
nm.WriteBits(&tmp, 4);
#else
nm.WriteBits(&ulFlags, 4); nm.WriteBits(&ulFlags, 4);
#endif
// (16-255) 00001 = 8 bit value follows // (16-255) 00001 = 8 bit value follows
} else if (ulFlags <= 255) { } else if (ulFlags <= 255) {
UBYTE ub=16; UBYTE ub=16;
nm.WriteBits(&ub, 5); nm.WriteBits(&ub, 5);
#if PLATFORM_BIGENDIAN
ULONG tmp = ulFlags;
BYTESWAP(tmp);
nm.WriteBits(&tmp, 8);
#else
nm.WriteBits(&ulFlags, 8); nm.WriteBits(&ulFlags, 8);
#endif
// (256-65535) 000001 = 16 bit value follows // (256-65535) 000001 = 16 bit value follows
} else if (ulFlags <= 65535) { } else if (ulFlags <= 65535) {
UBYTE ub=32; UBYTE ub=32;
nm.WriteBits(&ub, 6); nm.WriteBits(&ub, 6);
#if PLATFORM_BIGENDIAN
ULONG tmp = ulFlags;
BYTESWAP(tmp);
nm.WriteBits(&tmp, 16);
#else
nm.WriteBits(&ulFlags, 16); nm.WriteBits(&ulFlags, 16);
#endif
// (65536-) 000000 = 32 bit value follows // (65536-) 000000 = 32 bit value follows
} else { } else {
UBYTE ub=0; UBYTE ub=0;
nm.WriteBits(&ub, 6); nm.WriteBits(&ub, 6);
#if PLATFORM_BIGENDIAN
ULONG tmp = ulFlags;
BYTESWAP(tmp);
nm.WriteBits(&tmp, 32);
#else
nm.WriteBits(&ulFlags, 32); nm.WriteBits(&ulFlags, 32);
#endif
} }
return nm; return nm;
} }
@ -970,6 +1006,7 @@ CNetworkMessage &operator>>(CNetworkMessage &nm, CPlayerAction &pa)
*pul = 0; *pul = 0;
} else { } else {
nm.ReadBits(pul, 32); nm.ReadBits(pul, 32);
BYTESWAP(*pul);
} }
pul++; pul++;
} }
@ -995,23 +1032,28 @@ CNetworkMessage &operator>>(CNetworkMessage &nm, CPlayerAction &pa)
} else if (iZeros==2) { } else if (iZeros==2) {
ulFlags = 0; ulFlags = 0;
nm.ReadBits(&ulFlags, 1); nm.ReadBits(&ulFlags, 1);
BYTESWAP(ulFlags);
ulFlags |= 2; ulFlags |= 2;
// (4-15) 0001 = 4 bit value follows // (4-15) 0001 = 4 bit value follows
} else if (iZeros==3) { } else if (iZeros==3) {
ulFlags = 0; ulFlags = 0;
nm.ReadBits(&ulFlags, 4); nm.ReadBits(&ulFlags, 4);
BYTESWAP(ulFlags);
// (16-255) 00001 = 8 bit value follows // (16-255) 00001 = 8 bit value follows
} else if (iZeros==4) { } else if (iZeros==4) {
ulFlags = 0; ulFlags = 0;
nm.ReadBits(&ulFlags, 8); nm.ReadBits(&ulFlags, 8);
// (256-65535) 000001 = 16 bit value follows // (256-65535) 000001 = 16 bit value follows
BYTESWAP(ulFlags);
} else if (iZeros==5) { } else if (iZeros==5) {
ulFlags = 0; ulFlags = 0;
nm.ReadBits(&ulFlags, 16); nm.ReadBits(&ulFlags, 16);
BYTESWAP(ulFlags);
// (65536-) 000000 = 32 bit value follows // (65536-) 000000 = 32 bit value follows
} else { } else {
ulFlags = 0; ulFlags = 0;
nm.ReadBits(&ulFlags, 32); nm.ReadBits(&ulFlags, 32);
BYTESWAP(ulFlags);
} }
pa.pa_ulButtons = ulFlags; pa.pa_ulButtons = ulFlags;
return nm; return nm;

View File

@ -160,23 +160,24 @@ public:
void WriteBits(const void *pvBuffer, INDEX ctBits); void WriteBits(const void *pvBuffer, INDEX ctBits);
/* Read an object from message. */ /* Read an object from message. */
inline CNetworkMessage &operator>>(float &f) { Read( &f, sizeof( f)); return *this; } inline CNetworkMessage &operator>>(float &f) { Read( &f, sizeof( f)); BYTESWAP(f); return *this; }
inline CNetworkMessage &operator>>(ULONG &ul) { Read(&ul, sizeof(ul)); return *this; } inline CNetworkMessage &operator>>(double &d) { Read( &d, sizeof( d)); BYTESWAP(d); return *this; }
inline CNetworkMessage &operator>>(UWORD &uw) { Read(&uw, sizeof(uw)); return *this; } inline CNetworkMessage &operator>>(ULONG &ul) { Read(&ul, sizeof(ul)); BYTESWAP(ul); return *this; }
inline CNetworkMessage &operator>>(UWORD &uw) { Read(&uw, sizeof(uw)); BYTESWAP(uw); return *this; }
inline CNetworkMessage &operator>>(UBYTE &ub) { Read(&ub, sizeof(ub)); return *this; } inline CNetworkMessage &operator>>(UBYTE &ub) { Read(&ub, sizeof(ub)); return *this; }
inline CNetworkMessage &operator>>(SLONG &sl) { Read(&sl, sizeof(sl)); return *this; } inline CNetworkMessage &operator>>(SLONG &sl) { Read(&sl, sizeof(sl)); BYTESWAP(sl); return *this; }
inline CNetworkMessage &operator>>(SWORD &sw) { Read(&sw, sizeof(sw)); return *this; } inline CNetworkMessage &operator>>(SWORD &sw) { Read(&sw, sizeof(sw)); BYTESWAP(sw); return *this; }
inline CNetworkMessage &operator>>(SBYTE &sb) { Read(&sb, sizeof(sb)); return *this; } inline CNetworkMessage &operator>>(SBYTE &sb) { Read(&sb, sizeof(sb)); return *this; }
inline CNetworkMessage &operator>>(MESSAGETYPE &mt) { Read(&mt, sizeof(mt)); return *this; } inline CNetworkMessage &operator>>(MESSAGETYPE &mt) { Read(&mt, sizeof(mt)); return *this; }
CNetworkMessage &operator>>(CTString &str); CNetworkMessage &operator>>(CTString &str);
/* Write an object into message. */ /* Write an object into message. */
inline CNetworkMessage &operator<<(const float &f) { Write( &f, sizeof( f)); return *this; } inline CNetworkMessage &operator<<(const float &f) { float zf = f; BYTESWAP( zf); Write( &zf, sizeof( zf)); return *this; }
inline CNetworkMessage &operator<<(const double &d) { Write( &d, sizeof( d)); return *this; } inline CNetworkMessage &operator<<(const double &d) { double zd = d; BYTESWAP( zd); Write( &zd, sizeof( zd)); return *this; }
inline CNetworkMessage &operator<<(const ULONG &ul) { Write(&ul, sizeof(ul)); return *this; } inline CNetworkMessage &operator<<(const ULONG &ul) { ULONG zul = ul; BYTESWAP(zul); Write(&zul, sizeof(zul)); return *this; }
inline CNetworkMessage &operator<<(const UWORD &uw) { Write(&uw, sizeof(uw)); return *this; } inline CNetworkMessage &operator<<(const UWORD &uw) { UWORD zuw = uw; BYTESWAP(zuw); Write(&zuw, sizeof(zuw)); return *this; }
inline CNetworkMessage &operator<<(const UBYTE &ub) { Write(&ub, sizeof(ub)); return *this; } inline CNetworkMessage &operator<<(const UBYTE &ub) { Write(&ub, sizeof(ub)); return *this; }
inline CNetworkMessage &operator<<(const SLONG &sl) { Write(&sl, sizeof(sl)); return *this; } inline CNetworkMessage &operator<<(const SLONG &sl) { SLONG zsl = sl; BYTESWAP(zsl); Write(&zsl, sizeof(zsl)); return *this; }
inline CNetworkMessage &operator<<(const SWORD &sw) { Write(&sw, sizeof(sw)); return *this; } inline CNetworkMessage &operator<<(const SWORD &sw) { SWORD zsw = sw; BYTESWAP(zsw); Write(&zsw, sizeof(zsw)); return *this; }
inline CNetworkMessage &operator<<(const SBYTE &sb) { Write(&sb, sizeof(sb)); return *this; } inline CNetworkMessage &operator<<(const SBYTE &sb) { Write(&sb, sizeof(sb)); return *this; }
inline CNetworkMessage &operator<<(const MESSAGETYPE &mt) { Write(&mt, sizeof(mt)); return *this; } inline CNetworkMessage &operator<<(const MESSAGETYPE &mt) { Write(&mt, sizeof(mt)); return *this; }
CNetworkMessage &operator<<(const CTString &str); CNetworkMessage &operator<<(const CTString &str);

View File

@ -71,6 +71,7 @@ void CPlayerBuffer::ReceiveActionPacket(CNetworkMessage *pnm, INDEX iMaxBuffer)
// read sendbehind // read sendbehind
INDEX iSendBehind = 0; INDEX iSendBehind = 0;
pnm->ReadBits(&iSendBehind, 2); pnm->ReadBits(&iSendBehind, 2);
BYTESWAP(iSendBehind);
// foreach resent action // foreach resent action
for(INDEX i=0; i<iSendBehind; i++) { for(INDEX i=0; i<iSendBehind; i++) {
CPlayerAction paOld; CPlayerAction paOld;

View File

@ -199,9 +199,21 @@ void CPlayerSource::WriteActionPacket(CNetworkMessage &nm)
// write all in the message // write all in the message
BOOL bActive = 1; BOOL bActive = 1;
#if PLATFORM_BIGENDIAN
SLONG tmp = bActive;
BYTESWAP(tmp);
nm.WriteBits(&tmp, 1);
tmp = pls_Index;
BYTESWAP(tmp);
nm.WriteBits(&tmp, 4);
tmp = iPing;
BYTESWAP(tmp);
nm.WriteBits(&tmp, 10);
#else
nm.WriteBits(&bActive, 1); nm.WriteBits(&bActive, 1);
nm.WriteBits(&pls_Index, 4); // your index nm.WriteBits(&pls_Index, 4); // your index
nm.WriteBits(&iPing, 10); // your ping nm.WriteBits(&iPing, 10); // your ping
#endif
nm<<pls_paAction; // action nm<<pls_paAction; // action
//CPrintF("%.2f - written: %d\n", _pTimer->GetRealTimeTick(), SLONG(pls_paAction.pa_llCreated)); //CPrintF("%.2f - written: %d\n", _pTimer->GetRealTimeTick(), SLONG(pls_paAction.pa_llCreated));
@ -217,7 +229,13 @@ void CPlayerSource::WriteActionPacket(CNetworkMessage &nm)
} }
// save sendbehind if needed // save sendbehind if needed
#if PLATFORM_BIGENDIAN
tmp = iSendBehind;
BYTESWAP(tmp);
nm.WriteBits(&tmp, 2);
#else
nm.WriteBits(&iSendBehind, 2); nm.WriteBits(&iSendBehind, 2);
#endif
for(INDEX i=0; i<iSendBehind; i++) { for(INDEX i=0; i<iSendBehind; i++) {
nm<<pls_apaLastActions[i]; nm<<pls_apaLastActions[i];
} }

View File

@ -510,11 +510,26 @@ void CServer::SendGameStreamBlocks(INDEX iClient)
CPlayerBuffer &plb = srv_aplbPlayers[i]; CPlayerBuffer &plb = srv_aplbPlayers[i];
if (plb.IsActive()) { if (plb.IsActive()) {
BOOL b = 1; BOOL b = 1;
#if PLATFORM_BIGENDIAN
SLONG tmp = b;
BYTESWAP(tmp);
nmPings.WriteBits(&tmp, 1);
tmp = plb.plb_iPing;
BYTESWAP(tmp);
nmPings.WriteBits(&tmp, 10);
#else
nmPings.WriteBits(&b, 1); nmPings.WriteBits(&b, 1);
nmPings.WriteBits(&plb.plb_iPing, 10); nmPings.WriteBits(&plb.plb_iPing, 10);
#endif
} else { } else {
BOOL b = 0; BOOL b = 0;
#if PLATFORM_BIGENDIAN
SLONG tmp = b;
BYTESWAP(tmp);
nmPings.WriteBits(&tmp, 1);
#else
nmPings.WriteBits(&b, 1); nmPings.WriteBits(&b, 1);
#endif
} }
} }
_pNetwork->SendToClient(iClient, nmPings); _pNetwork->SendToClient(iClient, nmPings);
@ -1354,11 +1369,13 @@ void CServer::Handle(INDEX iClient, CNetworkMessage &nmMessage)
// see if saved in the message // see if saved in the message
BOOL bSaved = 0; BOOL bSaved = 0;
nmMessage.ReadBits(&bSaved, 1); nmMessage.ReadBits(&bSaved, 1);
BYTESWAP(bSaved);
// if saved // if saved
if (bSaved) { if (bSaved) {
// read client index // read client index
INDEX iPlayer = 0; INDEX iPlayer = 0;
nmMessage.ReadBits(&iPlayer, 4); nmMessage.ReadBits(&iPlayer, 4);
BYTESWAP(iPlayer);
CPlayerBuffer &plb = srv_aplbPlayers[iPlayer]; CPlayerBuffer &plb = srv_aplbPlayers[iPlayer];
// if the player is not on that client // if the player is not on that client
if (plb.plb_iClient!=iClient) { if (plb.plb_iClient!=iClient) {
@ -1369,6 +1386,7 @@ void CServer::Handle(INDEX iClient, CNetworkMessage &nmMessage)
// read ping // read ping
plb.plb_iPing = 0; plb.plb_iPing = 0;
nmMessage.ReadBits(&plb.plb_iPing, 10); nmMessage.ReadBits(&plb.plb_iPing, 10);
BYTESWAP(plb.plb_iPing);
// let the corresponding client buffer receive the message // let the corresponding client buffer receive the message
INDEX iMaxBuffer = sso.sso_sspParams.ssp_iBufferActions; INDEX iMaxBuffer = sso.sso_sspParams.ssp_iBufferActions;
extern INDEX cli_bPredictIfServer; extern INDEX cli_bPredictIfServer;

View File

@ -43,6 +43,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <Engine/Templates/StaticArray.cpp> #include <Engine/Templates/StaticArray.cpp>
#include <Engine/Base/ListIterator.inl> #include <Engine/Base/ListIterator.inl>
#include <Engine/Base/CRC.h> #include <Engine/Base/CRC.h>
#include <GameMP/SessionProperties.h>
#define SESSIONSTATEVERSION_OLD 1 #define SESSIONSTATEVERSION_OLD 1
#define SESSIONSTATEVERSION_WITHBULLETTIME 2 #define SESSIONSTATEVERSION_WITHBULLETTIME 2
@ -1614,6 +1615,46 @@ void CSessionState::Read_t(CTStream *pstr) // throw char *
// read session properties from stream // read session properties from stream
(*pstr)>>_pNetwork->ga_strSessionName; (*pstr)>>_pNetwork->ga_strSessionName;
pstr->Read_t(_pNetwork->ga_aubProperties, NET_MAXSESSIONPROPERTIES); pstr->Read_t(_pNetwork->ga_aubProperties, NET_MAXSESSIONPROPERTIES);
CSessionProperties* psp = (CSessionProperties*)_pNetwork->ga_aubProperties;
BYTESWAP(psp->sp_ctMaxPlayers);
BYTESWAP(psp->sp_bWaitAllPlayers);
BYTESWAP(psp->sp_bQuickTest);
BYTESWAP(psp->sp_bCooperative);
BYTESWAP(psp->sp_bSinglePlayer);
BYTESWAP(psp->sp_bUseFrags);
BYTESWAP((INDEX&)psp->sp_gmGameMode);
BYTESWAP((INDEX&)psp->sp_gdGameDifficulty);
BYTESWAP(psp->sp_ulSpawnFlags);
BYTESWAP(psp->sp_bMental);
BYTESWAP(psp->sp_iScoreLimit);
BYTESWAP(psp->sp_iFragLimit);
BYTESWAP(psp->sp_iTimeLimit);
BYTESWAP(psp->sp_bTeamPlay);
BYTESWAP(psp->sp_bFriendlyFire);
BYTESWAP(psp->sp_bWeaponsStay);
BYTESWAP(psp->sp_bAmmoStays);
BYTESWAP(psp->sp_bHealthArmorStays);
BYTESWAP(psp->sp_bPlayEntireGame);
BYTESWAP(psp->sp_bAllowHealth);
BYTESWAP(psp->sp_bAllowArmor);
BYTESWAP(psp->sp_bInfiniteAmmo);
BYTESWAP(psp->sp_bRespawnInPlace);
BYTESWAP(psp->sp_fEnemyMovementSpeed);
BYTESWAP(psp->sp_fEnemyAttackSpeed);
BYTESWAP(psp->sp_fDamageStrength);
BYTESWAP(psp->sp_fAmmoQuantity);
BYTESWAP(psp->sp_fManaTransferFactor);
BYTESWAP(psp->sp_iInitialMana);
BYTESWAP(psp->sp_fExtraEnemyStrength);
BYTESWAP(psp->sp_fExtraEnemyStrengthPerPlayer);
BYTESWAP(psp->sp_ctCredits);
BYTESWAP(psp->sp_ctCreditsLeft);
BYTESWAP(psp->sp_tmSpawnInvulnerability);
BYTESWAP(psp->sp_iBlood);
BYTESWAP(psp->sp_bGibs);
BYTESWAP(psp->sp_bEndOfGame);
BYTESWAP(psp->sp_ulLevelsMask);
BYTESWAP(psp->sp_bUseExtraEnemies);
// read world and its state // read world and its state
ReadWorldAndState_t(pstr); ReadWorldAndState_t(pstr);
@ -1764,7 +1805,48 @@ void CSessionState::Write_t(CTStream *pstr) // throw char *
(*pstr)<<ses_fRealTimeFactor; (*pstr)<<ses_fRealTimeFactor;
// write session properties to stream // write session properties to stream
(*pstr)<<_pNetwork->ga_strSessionName; (*pstr)<<_pNetwork->ga_strSessionName;
pstr->Write_t(_pNetwork->ga_aubProperties, NET_MAXSESSIONPROPERTIES); CUniversalSessionProperties sp;
memcpy(&sp, _pNetwork->ga_aubProperties, NET_MAXSESSIONPROPERTIES);
BYTESWAP(sp.usp_sp.sp_ctMaxPlayers);
BYTESWAP(sp.usp_sp.sp_bWaitAllPlayers);
BYTESWAP(sp.usp_sp.sp_bQuickTest);
BYTESWAP(sp.usp_sp.sp_bCooperative);
BYTESWAP(sp.usp_sp.sp_bSinglePlayer);
BYTESWAP(sp.usp_sp.sp_bUseFrags);
BYTESWAP((INDEX&)sp.usp_sp.sp_gmGameMode);
BYTESWAP((INDEX&)sp.usp_sp.sp_gdGameDifficulty);
BYTESWAP(sp.usp_sp.sp_ulSpawnFlags);
BYTESWAP(sp.usp_sp.sp_bMental);
BYTESWAP(sp.usp_sp.sp_iScoreLimit);
BYTESWAP(sp.usp_sp.sp_iFragLimit);
BYTESWAP(sp.usp_sp.sp_iTimeLimit);
BYTESWAP(sp.usp_sp.sp_bTeamPlay);
BYTESWAP(sp.usp_sp.sp_bFriendlyFire);
BYTESWAP(sp.usp_sp.sp_bWeaponsStay);
BYTESWAP(sp.usp_sp.sp_bAmmoStays);
BYTESWAP(sp.usp_sp.sp_bHealthArmorStays);
BYTESWAP(sp.usp_sp.sp_bPlayEntireGame);
BYTESWAP(sp.usp_sp.sp_bAllowHealth);
BYTESWAP(sp.usp_sp.sp_bAllowArmor);
BYTESWAP(sp.usp_sp.sp_bInfiniteAmmo);
BYTESWAP(sp.usp_sp.sp_bRespawnInPlace);
BYTESWAP(sp.usp_sp.sp_fEnemyMovementSpeed);
BYTESWAP(sp.usp_sp.sp_fEnemyAttackSpeed);
BYTESWAP(sp.usp_sp.sp_fDamageStrength);
BYTESWAP(sp.usp_sp.sp_fAmmoQuantity);
BYTESWAP(sp.usp_sp.sp_fManaTransferFactor);
BYTESWAP(sp.usp_sp.sp_iInitialMana);
BYTESWAP(sp.usp_sp.sp_fExtraEnemyStrength);
BYTESWAP(sp.usp_sp.sp_fExtraEnemyStrengthPerPlayer);
BYTESWAP(sp.usp_sp.sp_ctCredits);
BYTESWAP(sp.usp_sp.sp_ctCreditsLeft);
BYTESWAP(sp.usp_sp.sp_tmSpawnInvulnerability);
BYTESWAP(sp.usp_sp.sp_iBlood);
BYTESWAP(sp.usp_sp.sp_bGibs);
BYTESWAP(sp.usp_sp.sp_bEndOfGame);
BYTESWAP(sp.usp_sp.sp_ulLevelsMask);
BYTESWAP(sp.usp_sp.sp_bUseExtraEnemies);
pstr->Write_t(&sp, NET_MAXSESSIONPROPERTIES);
// write world and its state // write world and its state
WriteWorldAndState_t(pstr); WriteWorldAndState_t(pstr);
@ -2003,10 +2085,12 @@ void CSessionState::SessionStateLoop(void)
CPlayerTarget &plt = ses_apltPlayers[i]; CPlayerTarget &plt = ses_apltPlayers[i];
BOOL bHas = 0; BOOL bHas = 0;
nmMessage.ReadBits(&bHas, 1); nmMessage.ReadBits(&bHas, 1);
BYTESWAP(bHas);
if (bHas) { if (bHas) {
if (plt.IsActive() && plt.plt_penPlayerEntity!=NULL) { if (plt.IsActive() && plt.plt_penPlayerEntity!=NULL) {
INDEX iPing = 0; INDEX iPing = 0;
nmMessage.ReadBits(&iPing, 10); nmMessage.ReadBits(&iPing, 10);
BYTESWAP(iPing);
plt.plt_penPlayerEntity->en_tmPing = iPing/1000.0f; plt.plt_penPlayerEntity->en_tmPing = iPing/1000.0f;
} }
} }

View File

@ -396,7 +396,10 @@ void CAnimSet::Write_t(CTStream *ostrFile)
// write bone envelope ID // write bone envelope ID
(*ostrFile)<<pstrNameID; (*ostrFile)<<pstrNameID;
// write default pos(matrix12) // write default pos(matrix12)
ostrFile->Write_t(&be.be_mDefaultPos[0],sizeof(FLOAT)*12); for(int i = 0; i < 12; i++)
{
(*ostrFile)<<be.be_mDefaultPos[i];
}
// count positions // count positions
INDEX ctp = be.be_apPos.Count(); INDEX ctp = be.be_apPos.Count();
// write position count // write position count
@ -405,7 +408,7 @@ void CAnimSet::Write_t(CTStream *ostrFile)
for(INDEX ip=0;ip<ctp;ip++) for(INDEX ip=0;ip<ctp;ip++)
{ {
// write position // write position
ostrFile->Write_t(&be.be_apPos[ip],sizeof(AnimPos)); (*ostrFile)<<be.be_apPos[ip];
} }
// count rotations // count rotations
INDEX ctRotations = be.be_arRot.Count(); INDEX ctRotations = be.be_arRot.Count();
@ -415,7 +418,7 @@ void CAnimSet::Write_t(CTStream *ostrFile)
{ {
// write rotation // write rotation
AnimRot &arRot = be.be_arRot[ir]; AnimRot &arRot = be.be_arRot[ir];
ostrFile->Write_t(&arRot,sizeof(AnimRot)); (*ostrFile)<<arRot;
} }
INDEX ctOptRotations = be.be_arRotOpt.Count(); INDEX ctOptRotations = be.be_arRotOpt.Count();
if(ctOptRotations>0) if(ctOptRotations>0)
@ -439,7 +442,10 @@ void CAnimSet::Write_t(CTStream *ostrFile)
// write morph factors count // write morph factors count
INDEX ctmf = me.me_aFactors.Count(); INDEX ctmf = me.me_aFactors.Count();
(*ostrFile)<<ctmf; (*ostrFile)<<ctmf;
ostrFile->Write_t(&me.me_aFactors[0],sizeof(FLOAT)*ctmf); for(int i = 0; i < ctmf; i++)
{
(*ostrFile)<<me.me_aFactors[i];
}
} }
} }
} }

View File

@ -546,9 +546,9 @@ void CMesh::Write_t(CTStream *ostrFile)
// write wertex count // write wertex count
(*ostrFile)<<ctVx; (*ostrFile)<<ctVx;
// write wertices // write wertices
ostrFile->Write_t(&mLod.mlod_aVertices[0],sizeof(MeshVertex)*ctVx); for (int i = 0; i < ctVx; i++) (*ostrFile)<<(MeshVertex)mLod.mlod_aVertices[i];
// write normals // write normals
ostrFile->Write_t(&mLod.mlod_aNormals[0],sizeof(MeshNormal)*ctVx); for (int i = 0; i < ctVx; i++) (*ostrFile)<<(MeshNormal)mLod.mlod_aNormals[i];
// write uvmaps count // write uvmaps count
(*ostrFile)<<ctUV; (*ostrFile)<<ctUV;
@ -558,11 +558,11 @@ void CMesh::Write_t(CTStream *ostrFile)
CTString strNameID = ska_GetStringFromTable(mLod.mlod_aUVMaps[iuv].muv_iID); CTString strNameID = ska_GetStringFromTable(mLod.mlod_aUVMaps[iuv].muv_iID);
(*ostrFile)<<strNameID; (*ostrFile)<<strNameID;
// write uvmaps texcordinates // write uvmaps texcordinates
ostrFile->Write_t(&mLod.mlod_aUVMaps[iuv].muv_aTexCoords[0],sizeof(MeshTexCoord)*ctVx); for (int i = 0; i < ctVx; i++) (*ostrFile)<<(MeshTexCoord)mLod.mlod_aUVMaps[iuv].muv_aTexCoords[i];
} }
// write surfaces count // write surfaces count
ostrFile->Write_t(&ctSf,sizeof(INDEX)); (*ostrFile)<<ctSf;
// write surfaces // write surfaces
for(INDEX isf=0;isf<ctSf;isf++) { for(INDEX isf=0;isf<ctSf;isf++) {
MeshSurface &msrf = mLod.mlod_aSurfaces[isf]; MeshSurface &msrf = mLod.mlod_aSurfaces[isf];
@ -577,7 +577,7 @@ void CMesh::Write_t(CTStream *ostrFile)
// write tris count // write tris count
(*ostrFile)<<ctTris; (*ostrFile)<<ctTris;
// write triangles // write triangles
ostrFile->Write_t(&mLod.mlod_aSurfaces[isf].msrf_aTriangles[0],sizeof(MeshTriangle)*ctTris); for (int i = 0; i < ctTris; i++) (*ostrFile)<<(MeshTriangle)mLod.mlod_aSurfaces[isf].msrf_aTriangles[i];
// write bool that this surface has a shader // write bool that this surface has a shader
INDEX bShaderExists = (msrf.msrf_pShader!=NULL); INDEX bShaderExists = (msrf.msrf_pShader!=NULL);
@ -652,7 +652,7 @@ void CMesh::Write_t(CTStream *ostrFile)
// write wertex weights count // write wertex weights count
(*ostrFile)<<ctWw; (*ostrFile)<<ctWw;
// write wertex weights // write wertex weights
ostrFile->Write_t(&mLod.mlod_aWeightMaps[iwm].mwm_aVertexWeight[0],sizeof(MeshVertexWeight)*ctWw); for (int i = 0; i < ctWw; i++) (*ostrFile)<<(MeshVertexWeight)mLod.mlod_aWeightMaps[ctWw].mwm_aVertexWeight[i];
} }
// write morphmaps count // write morphmaps count
@ -667,9 +667,9 @@ void CMesh::Write_t(CTStream *ostrFile)
(*ostrFile)<<mLod.mlod_aMorphMaps[imm].mmp_bRelative; (*ostrFile)<<mLod.mlod_aMorphMaps[imm].mmp_bRelative;
//ostrFile->Write_t(&mLod.mlod_aMorphMaps[imm].mmp_bRelative,sizeof(BOOL)); //ostrFile->Write_t(&mLod.mlod_aMorphMaps[imm].mmp_bRelative,sizeof(BOOL));
// write morph sets count // write morph sets count
ostrFile->Write_t(&ctms,sizeof(INDEX)); (*ostrFile)<<ctms;
// write morph sets // write morph sets
ostrFile->Write_t(&mLod.mlod_aMorphMaps[imm].mmp_aMorphMap[0],sizeof(MeshVertexMorph)*ctms); for (int i = 0; i < ctms; i++) (*ostrFile)<<mLod.mlod_aMorphMaps[imm].mmp_aMorphMap[i];
} }
} }
} }

View File

@ -46,7 +46,7 @@ static inline CTStream &operator>>(CTStream &strm, MeshVertex &mv)
return(strm); return(strm);
} }
static inline CTStream &operator>>(CTStream &strm, const MeshVertex &mv) static inline CTStream &operator<<(CTStream &strm, const MeshVertex &mv)
{ {
strm<<mv.x; strm<<mv.x;
strm<<mv.y; strm<<mv.y;
@ -70,7 +70,7 @@ static inline CTStream &operator>>(CTStream &strm, MeshNormal &mn)
return(strm); return(strm);
} }
static inline CTStream &operator>>(CTStream &strm, const MeshNormal &mn) static inline CTStream &operator<<(CTStream &strm, const MeshNormal &mn)
{ {
strm<<mn.nx; strm<<mn.nx;
strm<<mn.ny; strm<<mn.ny;
@ -193,7 +193,7 @@ static inline CTStream &operator>>(CTStream &strm, MeshVertexMorph &mwm)
return(strm); return(strm);
} }
static inline CTStream &operator>>(CTStream &strm, const MeshVertexMorph &mwm) static inline CTStream &operator<<(CTStream &strm, const MeshVertexMorph &mwm)
{ {
strm<<mwm.mwm_iVxIndex; strm<<mwm.mwm_iVxIndex;
strm<<mwm.mwm_x; strm<<mwm.mwm_x;

View File

@ -192,9 +192,9 @@ void CSkeleton::Write_t(CTStream *ostrFile)
(*ostrFile)<<strParentID; (*ostrFile)<<strParentID;
//(*ostrFile)<<slod.slod_aBones[ib].sb_iParentIndex; //(*ostrFile)<<slod.slod_aBones[ib].sb_iParentIndex;
// write AbsPlacement matrix // write AbsPlacement matrix
ostrFile->Write_t(&sb.sb_mAbsPlacement,sizeof(FLOAT)*12); for (int i = 0; i < 12; i++) (*ostrFile)<<sb.sb_mAbsPlacement[i];
// write RelPlacement Qvect stuct // write RelPlacement Qvect stuct
ostrFile->Write_t(&sb.sb_qvRelPlacement,sizeof(QVect)); (*ostrFile)<<sb.sb_qvRelPlacement;
// write offset len // write offset len
(*ostrFile)<<sb.sb_fOffSetLen; (*ostrFile)<<sb.sb_fOffSetLen;
// write bone length // write bone length

View File

@ -583,7 +583,7 @@ INDEX CSoundDecoder::Decode(void *pvDestBuffer, INDEX ctBytesToDecode)
long iRes = pov_read(sdc_pogg->ogg_vfVorbisFile, pch, ctBytesToDecode-ctDecoded, &iCurrrentSection); long iRes = pov_read(sdc_pogg->ogg_vfVorbisFile, pch, ctBytesToDecode-ctDecoded, &iCurrrentSection);
#else #else
long iRes = pov_read(sdc_pogg->ogg_vfVorbisFile, pch, ctBytesToDecode-ctDecoded, long iRes = pov_read(sdc_pogg->ogg_vfVorbisFile, pch, ctBytesToDecode-ctDecoded,
0, 2, 1, &iCurrrentSection); PLATFORM_BIGENDIAN, 2, 1, &iCurrrentSection);
#endif #endif
if (iRes<=0) { if (iRes<=0) {
return ctDecoded; return ctDecoded;

View File

@ -219,9 +219,9 @@ static BOOL StartUp_SDLaudio( CSoundLibrary &sl, BOOL bReport=TRUE)
if (bps <= 8) if (bps <= 8)
desired.format = AUDIO_U8; desired.format = AUDIO_U8;
else if (bps <= 16) else if (bps <= 16)
desired.format = AUDIO_S16LSB; desired.format = AUDIO_S16SYS;
else if (bps <= 32) else if (bps <= 32)
desired.format = AUDIO_S32LSB; desired.format = AUDIO_S32SYS;
else { else {
CPrintF(TRANSV("Unsupported bits-per-sample: %d\n"), bps); CPrintF(TRANSV("Unsupported bits-per-sample: %d\n"), bps);
return FALSE; return FALSE;

View File

@ -1972,10 +1972,12 @@ void CTerrain::Write_t( CTStream *ostrFile)
INDEX iShadingMapSize = GetShadingMapWidth() * GetShadingMapHeight() * sizeof(UWORD); INDEX iShadingMapSize = GetShadingMapWidth() * GetShadingMapHeight() * sizeof(UWORD);
// Write shadow map // Write shadow map
ASSERT(tr_tdShadowMap.td_pulFrames!=NULL); ASSERT(tr_tdShadowMap.td_pulFrames!=NULL);
ostrFile->Write_t(&tr_tdShadowMap.td_pulFrames[0],iShadowMapSize); for (INDEX i = 0; i < iShadowMapSize; i++)
(*ostrFile)<<tr_tdShadowMap.td_pulFrames[i];
// Write shading map // Write shading map
ASSERT(tr_auwShadingMap!=NULL); ASSERT(tr_auwShadingMap!=NULL);
ostrFile->Write_t(&tr_auwShadingMap[0],iShadingMapSize); for (INDEX i = 0; i < iShadingMapSize; i++)
(*ostrFile)<<tr_auwShadingMap[i];
ostrFile->WriteID_t("TSEN"); // 'Terrain shadowmap end' ostrFile->WriteID_t("TSEN"); // 'Terrain shadowmap end'
@ -1989,7 +1991,7 @@ void CTerrain::Write_t( CTStream *ostrFile)
(*ostrFile).WriteID_t("TRHM"); // 'Terrain heightmap' (*ostrFile).WriteID_t("TRHM"); // 'Terrain heightmap'
// write height map // write height map
(*ostrFile).Write_t(&tr_auwHeightMap[0],sizeof(UWORD)*tr_pixHeightMapWidth*tr_pixHeightMapHeight); for (int i = 0; i < (tr_pixHeightMapWidth * tr_pixHeightMapHeight); i++) (*ostrFile)<<tr_auwHeightMap[i];
(*ostrFile).WriteID_t("THEN"); // 'Terrain heightmap end' (*ostrFile).WriteID_t("THEN"); // 'Terrain heightmap end'
(*ostrFile).WriteID_t("TRLR"); // 'Terrain layers' (*ostrFile).WriteID_t("TRLR"); // 'Terrain layers'

View File

@ -95,6 +95,26 @@ struct DECL_DLL PlayerStats {
PlayerStats(void): ps_iScore(0), ps_iKills(0), ps_iDeaths(0), ps_iSecrets(0), ps_tmTime(0.0f){} PlayerStats(void): ps_iScore(0), ps_iKills(0), ps_iDeaths(0), ps_iSecrets(0), ps_tmTime(0.0f){}
}; };
static inline CTStream &operator>>(CTStream &strm, PlayerStats &ps)
{
strm>>ps.ps_iScore;
strm>>ps.ps_iKills;
strm>>ps.ps_iDeaths;
strm>>ps.ps_iSecrets;
strm>>ps.ps_tmTime;
return strm;
}
static inline CTStream &operator<<(CTStream &strm, const PlayerStats &ps)
{
strm<<ps.ps_iScore;
strm<<ps.ps_iKills;
strm<<ps.ps_iDeaths;
strm<<ps.ps_iSecrets;
strm<<ps.ps_tmTime;
return strm;
}
// get info position for entity // get info position for entity
DECL_DLL void GetEntityInfoPosition(CEntity *pen, FLOAT *pf, FLOAT3D &vPos); DECL_DLL void GetEntityInfoPosition(CEntity *pen, FLOAT *pf, FLOAT3D &vPos);
// get source and target positions for ray cast // get source and target positions for ray cast

View File

@ -1280,10 +1280,10 @@ functions:
for(INDEX iMsg=0; iMsg<ctMsg; iMsg++) { for(INDEX iMsg=0; iMsg<ctMsg; iMsg++) {
m_acmiMessages[iMsg].Write_t(*ostr); m_acmiMessages[iMsg].Write_t(*ostr);
} }
ostr->Write_t(&m_psLevelStats, sizeof(m_psLevelStats)); (*ostr)<<m_psLevelStats;
ostr->Write_t(&m_psLevelTotal, sizeof(m_psLevelTotal)); (*ostr)<<m_psLevelTotal;
ostr->Write_t(&m_psGameStats , sizeof(m_psGameStats )); (*ostr)<<m_psGameStats;
ostr->Write_t(&m_psGameTotal , sizeof(m_psGameTotal )); (*ostr)<<m_psGameTotal;
} }
/* Read from stream. */ /* Read from stream. */
void Read_t( CTStream *istr) // throw char * void Read_t( CTStream *istr) // throw char *
@ -1307,10 +1307,10 @@ functions:
} }
} }
istr->Read_t(&m_psLevelStats, sizeof(m_psLevelStats)); (*istr)>>m_psLevelStats;
istr->Read_t(&m_psLevelTotal, sizeof(m_psLevelTotal)); (*istr)>>m_psLevelTotal;
istr->Read_t(&m_psGameStats , sizeof(m_psGameStats )); (*istr)>>m_psGameStats;
istr->Read_t(&m_psGameTotal , sizeof(m_psGameTotal )); (*istr)>>m_psGameTotal;
// set your real appearance if possible // set your real appearance if possible
ValidateCharacter(); ValidateCharacter();

View File

@ -1530,10 +1530,10 @@ functions:
for(INDEX iMsg=0; iMsg<ctMsg; iMsg++) { for(INDEX iMsg=0; iMsg<ctMsg; iMsg++) {
m_acmiMessages[iMsg].Write_t(*ostr); m_acmiMessages[iMsg].Write_t(*ostr);
} }
ostr->Write_t(&m_psLevelStats, sizeof(m_psLevelStats)); (*ostr)<<m_psLevelStats;
ostr->Write_t(&m_psLevelTotal, sizeof(m_psLevelTotal)); (*ostr)<<m_psLevelTotal;
ostr->Write_t(&m_psGameStats , sizeof(m_psGameStats )); (*ostr)<<m_psGameStats;
ostr->Write_t(&m_psGameTotal , sizeof(m_psGameTotal )); (*ostr)<<m_psGameTotal;
} }
/* Read from stream. */ /* Read from stream. */
void Read_t( CTStream *istr) // throw char * void Read_t( CTStream *istr) // throw char *