summaryrefslogtreecommitdiffstats
path: root/src/Blocks/MetaRotater.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Blocks/MetaRotater.h')
-rw-r--r--src/Blocks/MetaRotater.h82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/Blocks/MetaRotater.h b/src/Blocks/MetaRotater.h
new file mode 100644
index 000000000..f1656f1bd
--- /dev/null
+++ b/src/Blocks/MetaRotater.h
@@ -0,0 +1,82 @@
+
+#pragma once
+
+template<class Base, NIBBLETYPE BitFilter, NIBBLETYPE North, NIBBLETYPE East, NIBBLETYPE South, NIBBLETYPE West>
+class cMetaRotater : public Base
+{
+public:
+
+ cMetaRotater(BLOCKTYPE a_BlockType) :
+ Base(a_BlockType)
+ {}
+
+ virtual ~cMetaRotater() {}
+
+ virtual NIBBLETYPE MetaRotateCCW(NIBBLETYPE a_Meta) override;
+ virtual NIBBLETYPE MetaRotateCW(NIBBLETYPE a_Meta) override;
+ virtual NIBBLETYPE MetaMirrorXY(NIBBLETYPE a_Meta) override;
+ virtual NIBBLETYPE MetaMirrorYZ(NIBBLETYPE a_Meta) override;
+};
+
+
+template<class Base, NIBBLETYPE BitFilter, NIBBLETYPE North, NIBBLETYPE East, NIBBLETYPE South, NIBBLETYPE West>
+NIBBLETYPE cMetaRotater<Base, BitFilter, North, East, South, West>::MetaRotateCW(NIBBLETYPE a_Meta)
+{
+NIBBLETYPE OtherMeta = a_Meta & (~BitFilter);
+switch (a_Meta & BitFilter)
+{
+case South: return West | OtherMeta;
+case West: return North | OtherMeta;
+case North: return East | OtherMeta;
+case East: return South | OtherMeta;
+}
+ASSERT(!"Invalid Meta value");
+return a_Meta;
+}
+
+
+template<class Base, NIBBLETYPE BitFilter, NIBBLETYPE North, NIBBLETYPE East, NIBBLETYPE South, NIBBLETYPE West>
+NIBBLETYPE cMetaRotater<Base, BitFilter, North, East, South, West>::MetaRotateCCW(NIBBLETYPE a_Meta)
+{
+NIBBLETYPE OtherMeta = a_Meta & (~BitFilter);
+switch (a_Meta & BitFilter)
+{
+case South: return East | OtherMeta;
+case East: return North | OtherMeta;
+case North: return West | OtherMeta;
+case West: return South | OtherMeta;
+}
+ASSERT(!"Invalid Meta value");
+return a_Meta;
+}
+
+
+
+template<class Base, NIBBLETYPE BitFilter, NIBBLETYPE North, NIBBLETYPE East, NIBBLETYPE South, NIBBLETYPE West>
+NIBBLETYPE cMetaRotater<Base, BitFilter, North, East, South, West>::MetaMirrorXY(NIBBLETYPE a_Meta)
+{
+NIBBLETYPE OtherMeta = a_Meta & (~BitFilter);
+switch (a_Meta & BitFilter)
+{
+case South: return North | OtherMeta;
+case North: return South | OtherMeta;
+}
+// Not Facing North or South; No change.
+return a_Meta;
+}
+
+
+
+
+template<class Base, NIBBLETYPE BitFilter, NIBBLETYPE North, NIBBLETYPE East, NIBBLETYPE South, NIBBLETYPE West>
+NIBBLETYPE cMetaRotater<Base, BitFilter, North, East, South, West>::MetaMirrorYZ(NIBBLETYPE a_Meta)
+{
+NIBBLETYPE OtherMeta = a_Meta & (~BitFilter);
+switch (a_Meta & BitFilter)
+{
+case West: return East | OtherMeta;
+case East: return West | OtherMeta;
+}
+// Not Facing East or West; No change.
+return a_Meta;
+}