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);
    }
}
Exemple #2
0
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);
    }
}