project-aster/samples/03_model_render/nodes.h

56 lines
1.5 KiB
C++

// =============================================
// Aster: nodes.h
// Copyright (c) 2020-2025 Anish Bhobe
// =============================================
#pragma once
#include "aster/aster.h"
#include <EASTL/vector.h>
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<mat4> m_Transforms;
eastl::vector<Transform> m_GlobalTransforms;
/// Parents are also used for bookkeeping
eastl::vector<u32> 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();
};