public GeometricTransformAttributeElement(Stream stream)
            : base(stream)
        {
            StoredValuesMask = StreamUtils.ReadUInt16(stream);

            var elementValueList = new List <Single>(16);

            var storedValuesMask = StoredValuesMask;

            for (int i = 0, c = 16; i < c; ++i)
            {
                if ((storedValuesMask & 0x8000) > 0)
                {
                    var value = StreamUtils.ReadFloat(stream);

                    elementValueList.Add(value);

                    TransformationMatrix[i] = value;
                }

                storedValuesMask = (UInt16)(storedValuesMask << 1);
            }

            ElementValues = elementValueList.ToArray();
        }
        public MaterialAttributeElement(Stream stream)
            : base(stream)
        {
            DataFlags = StreamUtils.ReadUInt16(stream);

            var patternBitsAreUsed = (DataFlags & 0x0001) > 0;

            if (patternBitsAreUsed && (DataFlags & 0x0002) > 0)
            {
                AmbientCommonRGBValue = StreamUtils.ReadFloat(stream);
            }

            else
            {
                AmbientColour = new RGBA(stream);
            }

            DiffuseColour = new RGBA(stream);

            if (patternBitsAreUsed && (DataFlags & 0x0008) > 0)
            {
                SpecularCommonRGBValue = StreamUtils.ReadFloat(stream);
            }

            else
            {
                SpecularColour = new RGBA(stream);
            }

            if (patternBitsAreUsed && (DataFlags & 0x0004) > 0)
            {
                EmissionCommonRGBValue = StreamUtils.ReadFloat(stream);
            }

            else
            {
                EmissionColour = new RGBA(stream);
            }

            Shininess = StreamUtils.ReadFloat(stream);
        }