void plVertCoder::IEncode(hsStream* S, unsigned int vertsLeft, const unsigned char*& src, unsigned int stride, unsigned char format) { int i; // The X, Y, Z coordinates of this vertex IEncodeFloat(S, vertsLeft, kPosition, 0, src, stride); IEncodeFloat(S, vertsLeft, kPosition, 1, src, stride); IEncodeFloat(S, vertsLeft, kPosition, 2, src, stride); // Weights int count = (format & plGBufferGroup::kSkinWeightMask) >> 4; if (count > 0) { for (i=0; i<count; i++) IEncodeFloat(S, vertsLeft, kWeight, i, src, stride); if (format & kSkinIndices) { S->writeInt(*(int*)src); src += sizeof(int); } } // Normal IEncodeNormal(S, src); IEncodeColor(S, vertsLeft, src, stride); src += sizeof(int); // UVW Coordinates for (i=0; i<(format & kUVCountMask); i++) { IEncodeFloat(S, vertsLeft, kUVW+i, 0, src, stride); IEncodeFloat(S, vertsLeft, kUVW+i, 1, src, stride); IEncodeFloat(S, vertsLeft, kUVW+i, 2, src, stride); } }
inline void plVertCoder::IEncode(hsStream* s, const uint32_t vertsLeft, const uint8_t*& src, const uint32_t stride, const uint8_t format) { IEncodeFloat(s, vertsLeft, kPosition, 0, src, stride); IEncodeFloat(s, vertsLeft, kPosition, 1, src, stride); IEncodeFloat(s, vertsLeft, kPosition, 2, src, stride); // Weights and indices? const int numWeights = INumWeights(format); if( numWeights ) { int j; for( j = 0; j < numWeights; j++ ) IEncodeFloat(s, vertsLeft, kWeight, j, src, stride); if( format & plGBufferGroup::kSkinIndices ) { const uint32_t idx = *(uint32_t*)src; s->WriteLE32(idx); src += 4; } } IEncodeNormal(s, src, stride); IEncodeColor(s, vertsLeft, src, stride); // COLOR2 src += 4; const int numUVWs = format & plGBufferGroup::kUVCountMask; int i; for( i = 0; i < numUVWs; i++ ) { IEncodeFloat(s, vertsLeft, kUVW + i, 0, src, stride); IEncodeFloat(s, vertsLeft, kUVW + i, 1, src, stride); IEncodeFloat(s, vertsLeft, kUVW + i, 2, src, stride); } }