bool PackedNormalAttribute::merge(void*& parent, void* children[], bool postRead) const { QRgb firstValue = decodeInline<QRgb>(children[0]); glm::vec3 total = unpackNormal(firstValue) * (float)qAlpha(firstValue); bool allChildrenEqual = true; for (int i = 1; i < Attribute::MERGE_COUNT; i++) { QRgb value = decodeInline<QRgb>(children[i]); total += unpackNormal(value) * (float)qAlpha(value); allChildrenEqual &= (firstValue == value); } float length = glm::length(total); parent = encodeInline(length < EPSILON ? QRgb() : packNormal(total / length)); return allChildrenEqual; }
void MeshUtility::unpackNormals(UINT8* source, Vector3* destination, UINT32 count, UINT32 stride) { UINT8* ptr = source; for (UINT32 i = 0; i < count; i++) { destination[i] = unpackNormal(ptr); ptr += stride; } }
bool SpannerPackedNormalAttribute::merge(void*& parent, void* children[], bool postRead) const { if (postRead) { for (int i = 0; i < MERGE_COUNT; i++) { if (qAlpha(decodeInline<QRgb>(children[i])) != 0) { return false; } } return true; } QRgb parentValue = decodeInline<QRgb>(parent); glm::vec3 total = unpackNormal(parentValue) * (float)(qAlpha(parentValue) * Attribute::MERGE_COUNT); bool allChildrenTransparent = true; for (int i = 0; i < Attribute::MERGE_COUNT; i++) { QRgb value = decodeInline<QRgb>(children[i]); int alpha = qAlpha(value); total += unpackNormal(value) * (float)alpha; allChildrenTransparent &= (alpha == 0); } float length = glm::length(total); parent = encodeInline(length < EPSILON ? QRgb() : packNormal(total / length)); return allChildrenTransparent; }
void* PackedNormalAttribute::blend(void* source, void* dest) const { QRgb sourceValue = decodeInline<QRgb>(source); QRgb destValue = decodeInline<QRgb>(dest); float alpha = qAlpha(sourceValue) / EIGHT_BIT_MAXIMUM; return encodeInline(packNormal(glm::normalize(glm::mix(unpackNormal(destValue), unpackNormal(sourceValue), alpha)))); }
void* PackedNormalAttribute::mix(void* first, void* second, float alpha) const { glm::vec3 firstNormal = unpackNormal(decodeInline<QRgb>(first)); glm::vec3 secondNormal = unpackNormal(decodeInline<QRgb>(second)); return encodeInline(packNormal(glm::normalize(glm::mix(firstNormal, secondNormal, alpha)))); }