#pragma once #include "MultiRootTree.h" #include "MaterialNode.h" template> class MultiRootMaterialNode : public MaterialNode { private: bool mIsGeometry; public: MultiRootMaterialNode(BaseTree* root, unsigned8 level = 0) : MaterialNode(root, level) {} MultiRootMaterialNode(BaseTree* root, T material, unsigned8 level = 0) : MaterialNode(root, material, level) {} MultiRootMaterialNode(BaseTree* root, T material, bool isGeometry, unsigned8 level = 0) : MultiRootMaterialNode(root, material, level) { mIsGeometry = isGeometry; } MultiRootMaterialNode(MultiRootMaterialNode&& node) : MaterialNode(std::move(node)) // Move ctor { mIsGeometry = std::move(node.mIsGeometry); } ~MultiRootMaterialNode() {} MultiRootMaterialNode& operator=(MultiRootMaterialNode&& node) // Move assignment operator { mIsGeometry = std::move(node.mIsGeometry); MaterialNode::operator=(std::move(node)); return *this; } bool GetIsGeometry() const { return mIsGeometry; } void SetIsGeometry(bool value) { mIsGeometry = value; } bool Compare(const MultiRootMaterialNode& node) const { if (this->mIsGeometry != node.mIsGeometry) return !mIsGeometry; return MaterialNode::Compare(node); } bool Equals(const MultiRootMaterialNode& node) const { return node.mIsGeometry == this->mIsGeometry && MaterialNode::Equals(node); } void WriteProperties(std::ostream& file) { Serializer::Serialize(mIsGeometry, file); MaterialNode::WriteProperties(file); } void ReadProperties(std::istream& file) { Serializer::Deserialize(mIsGeometry, file); MaterialNode::ReadProperties(file); } void CopyProperties(MultiRootMaterialNode* node) { this->SetIsGeometry(node->GetIsGeometry()); MaterialNode::CopyProperties(node); } }; template> class HierarchicalMaterialMultiRoot : public MultiRootTree> { private: T mMaterial; // Material for the root public: HierarchicalMaterialMultiRoot(unsigned8 maxLevel, unsigned32 slaveRootCount) : MultiRootTree>(maxLevel, slaveRootCount) { mLeafsAreEqual = false; } ~HierarchicalMaterialMultiRoot() override {} T GetMaterial(unsigned32 nodeIndex) const { return GetTypedNode(nodeIndex)->GetMaterial(); } virtual unsigned8 GetAdditionalBytesPerNode(unsigned8 level) const override { return sizeof(T); } virtual std::vector GetAdditionalNodeBytes(const Node* node) const override { return GetMaterial(node->GetIndex()).Serialize(); } MultiRootMaterialNode* AddLeafNode(glm::uvec3 coordinate) { MultiRootMaterialNode* node = MultiRootTree>::AddLeafNode(coordinate); node->SetIsGeometry(true); return node; // TODO: Mark all nodes along the path as "IsGeometry" = True } MultiRootMaterialNode* AddLeafNode(glm::uvec3 coordinate, size_t slaveRootID, T material) { MultiRootMaterialNode* node = MultiRootTree>::AddLeafNode(coordinate, slaveRootID); node->SetMaterial(material); node->SetIsGeometry(false); return node; // TODO: Mark all nodes along the path as "IsGeometry" = False } };