// ============================================= // Aster: nodes.h // Copyright (c) 2020-2025 Anish Bhobe // ============================================= #pragma once #include "aster/aster.h" #include struct Nodes { struct Transform { mat4 m_GlobalTransforms; mat4 m_NormalTransforms; explicit Transform(mat4 const &transform) : m_GlobalTransforms(transform) , m_NormalTransforms(transpose(inverse(mat3{transform}))) { } Transform & operator=(mat4 const &transform) { m_GlobalTransforms = transform; m_NormalTransforms = transpose(inverse(mat3{transform})); return *this; } }; eastl::vector m_Transforms; eastl::vector m_GlobalTransforms; /// Parents are also used for bookkeeping eastl::vector m_Parents_; bool m_Dirty = true; constexpr static u32 ROOT_BIT = 1u << 31; constexpr static u32 DIRTY_BIT = 1u << 30; constexpr static u32 PARENT_MASK = ~(ROOT_BIT | DIRTY_BIT); u32 Add(mat4 const &transform, i32 parent = -1); [[nodiscard]] mat4 const &Get(u32 index) const; void Set(u32 index, mat4 const &transform); [[nodiscard]] u32 Count() const; [[nodiscard]] mat4 const &operator[](u32 index) const; [[nodiscard]] mat4 &operator[](u32 index); [[nodiscard]] usize GetGlobalTransformByteSize() const; [[nodiscard]] Transform const *GetGlobalTransformPtr() const; bool Update(); };