void CustomGeometry::SetGeometryDataAttr(const PODVector<unsigned char>& value) { if (value.Empty()) return; MemoryBuffer buffer(value); SetNumGeometries(buffer.ReadVLE()); elementMask_ = VertexMaskFlags(buffer.ReadUInt()); for (unsigned i = 0; i < geometries_.Size(); ++i) { unsigned numVertices = buffer.ReadVLE(); vertices_[i].Resize(numVertices); primitiveTypes_[i] = (PrimitiveType)buffer.ReadUByte(); for (unsigned j = 0; j < numVertices; ++j) { if (elementMask_ & MASK_POSITION) vertices_[i][j].position_ = buffer.ReadVector3(); if (elementMask_ & MASK_NORMAL) vertices_[i][j].normal_ = buffer.ReadVector3(); if (elementMask_ & MASK_COLOR) vertices_[i][j].color_ = buffer.ReadUInt(); if (elementMask_ & MASK_TEXCOORD1) vertices_[i][j].texCoord_ = buffer.ReadVector2(); if (elementMask_ & MASK_TANGENT) vertices_[i][j].tangent_ = buffer.ReadVector4(); } } Commit(); }
void VertexBuffer::UpdateOffsets() { unsigned elementOffset = 0; elementHash_ = 0; elementMask_ = MASK_NONE; for (PODVector<VertexElement>::Iterator i = elements_.Begin(); i != elements_.End(); ++i) { i->offset_ = elementOffset; elementOffset += ELEMENT_TYPESIZES[i->type_]; elementHash_ <<= 6; elementHash_ += (((int)i->type_ + 1) * ((int)i->semantic_ + 1) + i->index_); for (unsigned j = 0; j < MAX_LEGACY_VERTEX_ELEMENTS; ++j) { const VertexElement& legacy = LEGACY_VERTEXELEMENTS[j]; if (i->type_ == legacy.type_ && i->semantic_ == legacy.semantic_ && i->index_ == legacy.index_) elementMask_ |= VertexMaskFlags(1u << j); } } vertexSize_ = elementOffset; }