plGBufferGroup::plGBufferGroup( uint8_t format, bool vertsVolatile, bool idxVolatile, int LOD ) { fVertBuffStorage.Reset(); fIdxBuffStorage.Reset(); fColorBuffStorage.Reset(); fVertexBufferRefs.Reset(); fIndexBufferRefs.Reset(); fCells.Reset(); fNumVerts = fNumIndices = 0; fFormat = format; fStride = ICalcVertexSize( fLiteStride ); fVertsVolatile = vertsVolatile; fIdxVolatile = idxVolatile; fLOD = LOD; }
void plGBufferGroup::Read( hsStream *s ) { uint32_t totalDynSize, i, count, temp = 0, j; uint8_t *vData; uint16_t *iData; plGBufferColor *cData; s->ReadLE( &fFormat ); totalDynSize = s->ReadLE32(); fStride = ICalcVertexSize( fLiteStride ); fVertBuffSizes.Reset(); fVertBuffStarts.Reset(); fVertBuffEnds.Reset(); fColorBuffCounts.Reset(); fIdxBuffCounts.Reset(); fIdxBuffStarts.Reset(); fIdxBuffEnds.Reset(); fVertBuffStorage.Reset(); fIdxBuffStorage.Reset(); plVertCoder coder; /// Create buffers and read in as we go count = s->ReadLE32(); for( i = 0; i < count; i++ ) { if( fFormat & kEncoded ) { const uint16_t numVerts = s->ReadLE16(); const uint32_t size = numVerts * fStride; fVertBuffSizes.Append(size); fVertBuffStarts.Append(0); fVertBuffEnds.Append(-1); vData = new uint8_t[size]; fVertBuffStorage.Append( vData ); plProfile_NewMem(MemBufGrpVertex, temp); coder.Read(s, vData, fFormat, fStride, numVerts); fColorBuffCounts.Append(0); fColorBuffStorage.Append(nil); } else { temp = s->ReadLE32(); fVertBuffSizes.Append( temp ); fVertBuffStarts.Append(0); fVertBuffEnds.Append(-1); vData = new uint8_t[ temp ]; hsAssert( vData != nil, "Not enough memory to read in vertices" ); s->Read( temp, (void *)vData ); fVertBuffStorage.Append( vData ); plProfile_NewMem(MemBufGrpVertex, temp); temp = s->ReadLE32(); fColorBuffCounts.Append( temp ); if( temp > 0 ) { cData = new plGBufferColor[ temp ]; s->Read( temp * sizeof( plGBufferColor ), (void *)cData ); plProfile_NewMem(MemBufGrpVertex, temp * sizeof(plGBufferColor)); } else cData = nil; fColorBuffStorage.Append( cData ); } } count = s->ReadLE32(); for( i = 0; i < count; i++ ) { temp = s->ReadLE32(); fIdxBuffCounts.Append( temp ); fIdxBuffStarts.Append(0); fIdxBuffEnds.Append(-1); iData = new uint16_t[ temp ]; hsAssert( iData != nil, "Not enough memory to read in indices" ); s->ReadLE16( temp, (uint16_t *)iData ); fIdxBuffStorage.Append( iData ); plProfile_NewMem(MemBufGrpIndex, temp * sizeof(uint16_t)); } /// Read in cell arrays, one per vBuffer for( i = 0; i < fVertBuffStorage.GetCount(); i++ ) { temp = s->ReadLE32(); fCells.Append( new hsTArray<plGBufferCell> ); fCells[ i ]->SetCount( temp ); for( j = 0; j < temp; j++ ) (*fCells[ i ])[ j ].Read( s ); } }
plGBufferGroup::plGBufferGroup(uint8_t format, bool vertsVolatile, bool idxVolatile, int LOD) : fNumVerts(0), fNumIndices(0), fFormat(format), fVertsVolatile(vertsVolatile), fIdxVolatile(idxVolatile), fLOD(LOD) { fStride = ICalcVertexSize(fLiteStride); }