Files
CDAG/Research/scene/Octree/LeafMaterialMultiRootTree.h

42 lines
1.2 KiB
C++

#pragma once
#include "MultiRootTree.h"
#include "MaterialNode.h"
template<typename T>
class LeafMaterialMultiRootTree : public MultiRootTree<MaterialNode<T>>
{
public:
LeafMaterialMultiRootTree(unsigned8 maxLevel, unsigned32 slaveRootCount)
: MultiRootTree(maxLevel, slaveRootCount) { mLeafsAreEqual = false; }
~LeafMaterialMultiRootTree() override {}
unsigned8 GetAdditionalBytesPerNode(unsigned8 level) const override
{
if (level == GetMaxLevel()) return sizeof(T);
else return Tree<MaterialNode<T>>::GetAdditionalBytesPerNode(level);
}
std::vector<unsigned8> GetAdditionalNodeBytes(const Node* node) const override
{
if (node->GetLevel() == GetMaxLevel())
{
auto matNode = (MaterialNode<T>*)node;
return matNode->GetMaterial().Serialize();
}
else
return Tree<MaterialNode<T>>::GetAdditionalNodeBytes(node);
}
void AddLeafNode(glm::uvec3 coordinate, unsigned32 slaveRootID, T material)
{
MaterialNode<T>* node = MultiRootTree<MaterialNode<T>>::AddLeafNode(coordinate, slaveRootID);
node->SetMaterial(material);
}
void AddLeafNode(glm::uvec3 coordinate, T material)
{
MaterialNode<T>* node = MultiRootTree<MaterialNode<T>>::AddLeafNode(coordinate);
node->SetMaterial(material);
}
};