Initial commit: Final state of the master project

This commit is contained in:
2017-09-16 09:41:37 +02:00
commit 696180d43b
832 changed files with 169717 additions and 0 deletions

View File

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