diff --git a/Projects/Engine/CMakeLists.txt b/Projects/Engine/CMakeLists.txt index 476af75..8b60705 100644 --- a/Projects/Engine/CMakeLists.txt +++ b/Projects/Engine/CMakeLists.txt @@ -2,6 +2,7 @@ add_library(Engine STATIC Header/Helpers/Name.hpp Header/Helpers/Strings.hpp Header/Helpers/XML.hpp + Header/Helpers/NormalId.hpp Header/App/Script/ReflectionProperty.hpp Header/App/GUI/GuiBase3d.hpp Header/App/GUI/InstanceAdornment.hpp @@ -11,6 +12,7 @@ add_library(Engine STATIC Header/App/V8/DataModel/Camera.hpp Header/App/V8/DataModel/ForceField.hpp Header/App/V8/DataModel/PartInstance.hpp + Header/App/V8/DataModel/FaceInstance.hpp Header/App/V8/DataModel/Workspace.hpp Header/App/V8/Tree/Instance.hpp Header/App/V8/Tree/PVInstance.hpp @@ -24,6 +26,7 @@ add_library(Engine STATIC Source/Helpers/Name.cpp Source/Helpers/Strings.cpp Source/Helpers/XML.cpp + Source/Helpers/NormalId.cpp Source/App/Script/ReflectionProperty.cpp Source/App/GUI/GuiBase3d.cpp Source/App/GUI/InstanceAdornment.cpp @@ -33,6 +36,7 @@ add_library(Engine STATIC Source/App/V8/DataModel/Camera.cpp Source/App/V8/DataModel/ForceField.cpp Source/App/V8/DataModel/PartInstance.cpp + Source/App/V8/DataModel/FaceInstance.cpp Source/App/V8/DataModel/Workspace.cpp Source/App/V8/Tree/Instance.cpp Source/App/V8/Tree/PVInstance.cpp diff --git a/Projects/Engine/Header/App/V8/DataModel/FaceInstance.hpp b/Projects/Engine/Header/App/V8/DataModel/FaceInstance.hpp new file mode 100644 index 0000000..9195cc3 --- /dev/null +++ b/Projects/Engine/Header/App/V8/DataModel/FaceInstance.hpp @@ -0,0 +1,4 @@ +#pragma once + +#include + diff --git a/Projects/Engine/Header/Helpers/NormalId.hpp b/Projects/Engine/Header/Helpers/NormalId.hpp new file mode 100644 index 0000000..3832735 --- /dev/null +++ b/Projects/Engine/Header/Helpers/NormalId.hpp @@ -0,0 +1,45 @@ +#pragma once + +namespace RNR { + Ogre::Vector3 normalIdVectors[] = { + Ogre::Vector3(1, 0, 0), + Ogre::Vector3(0, 1, 0), + Ogre::Vector3(0, 0, 1), + Ogre::Vector3(-1, 0, 0), + Ogre::Vector3(0, -1, 0), + Ogre::Vector3(0, 0, -1), + Ogre::Vector3(0, 0, 0) + }; + + enum NormalId + { + NORM_X, + NORM_Y, + NORM_Z, + NORM_X_NEG, + NORM_Y_NEG, + NORM_Z_NEG, + NORM_UNDEFINED + }; + + bool validNormalId(NormalId normalId); + + NormalId normalIdOpposite(NormalId normalId); + NormalId normalIdToU(NormalId normalId); + NormalId normalIdToV(NormalId normalId); + + const Ogre::Vector3& normalIdToVector3(NormalId normalId); + const Ogre::Matrix3& normalIdToMatrix3(NormalId normalId); + + NormalId Vector3ToNormalId(const Ogre::Vector3& vector); + NormalId Matrix3ToNormalId(const Ogre::Matrix3& matrix); + NormalId intToNormalId(int i); + + Ogre::Vector3 uvwToObject(const Ogre::Vector3& uvw, NormalId faceId); + Ogre::Vector3 objectToUvw(const Ogre::Vector3& object, NormalId faceId); + + template + Ogre::Vector3 uvwToObject(const Ogre::Vector3& vector); + template + Ogre::Vector3 objectToUvw(const Ogre::Vector3& vector); +} \ No newline at end of file diff --git a/Projects/Engine/Source/App/V8/DataModel/FaceInstance.cpp b/Projects/Engine/Source/App/V8/DataModel/FaceInstance.cpp new file mode 100644 index 0000000..cfdf680 --- /dev/null +++ b/Projects/Engine/Source/App/V8/DataModel/FaceInstance.cpp @@ -0,0 +1,4 @@ +#pragma once + +#include +#include \ No newline at end of file diff --git a/Projects/Engine/Source/Helpers/NormalId.cpp b/Projects/Engine/Source/Helpers/NormalId.cpp new file mode 100644 index 0000000..1031405 --- /dev/null +++ b/Projects/Engine/Source/Helpers/NormalId.cpp @@ -0,0 +1,178 @@ +#include + +#include + +namespace RNR { + bool validNormalId(NormalId normalId) { + return ((normalId >= 0) && (normalId < 6)); + } + + NormalId intToNormalId(int i) + { + return static_cast(i); + } + + NormalId normalIdOpposite(NormalId normalId) + { + return (NormalId)((normalId + 3) % 6); + } + + NormalId normalIdToU(NormalId normalId) + { + switch (normalId) + { + case NORM_X: + return NORM_Z; + case NORM_Y: + return NORM_X; + case NORM_Z: + return NORM_Y; + case NORM_X_NEG: + return NORM_Z_NEG; + case NORM_Y_NEG: + return NORM_X_NEG; + case NORM_Z_NEG: + return NORM_Y_NEG; + default: + return NORM_Y; + } + } + + NormalId normalIdToV(NormalId normalId) + { + switch (normalId) + { + case NORM_X: + return NORM_Y; + case NORM_Y: + return NORM_Z; + case NORM_Z: + return NORM_X; + case NORM_X_NEG: + return NORM_Y_NEG; + case NORM_Y_NEG: + return NORM_Z_NEG; + case NORM_Z_NEG: + return NORM_X_NEG; + default: + return NORM_Y; + } + } + + + // UVW to Object + template<> + Ogre::Vector3 uvwToObject(const Ogre::Vector3& vector) + { + return Ogre::Vector3(vector.z, vector.y, -vector.x); + } + + template<> + Ogre::Vector3 uvwToObject(const Ogre::Vector3& vector) + { + return Ogre::Vector3(-vector.x, vector.z, vector.y); + } + + template<> + Ogre::Vector3 uvwToObject(const Ogre::Vector3& vector) + { + return Ogre::Vector3(vector.x, vector.y, vector.z); + } + + template<> + Ogre::Vector3 uvwToObject(const Ogre::Vector3& vector) + { + return Ogre::Vector3(-vector.z, vector.y, vector.x); + } + + template<> + Ogre::Vector3 uvwToObject(const Ogre::Vector3& vector) + { + return Ogre::Vector3(vector.x, -vector.z, vector.y); + } + + template<> + Ogre::Vector3 uvwToObject(const Ogre::Vector3& vector) + { + return Ogre::Vector3(-vector.x, vector.y, -vector.z); + } + + // Object to UVW + template<> + Ogre::Vector3 objectToUvw(const Ogre::Vector3& vector) + { + return Ogre::Vector3(-vector.z, vector.y, vector.x); + } + + template<> + Ogre::Vector3 objectToUvw(const Ogre::Vector3& vector) + { + return Ogre::Vector3(-vector.x, vector.z, vector.y); + } + + template<> + Ogre::Vector3 objectToUvw(const Ogre::Vector3& vector) + { + return Ogre::Vector3(vector.x, vector.y, vector.z); + } + + template<> + Ogre::Vector3 objectToUvw(const Ogre::Vector3& vector) + { + return Ogre::Vector3(vector.z, vector.y, -vector.x); + } + + template<> + Ogre::Vector3 objectToUvw(const Ogre::Vector3& vector) + { + return Ogre::Vector3(vector.x, vector.z, -vector.y); + } + + template<> + Ogre::Vector3 objectToUvw(const Ogre::Vector3& vector) + { + return Ogre::Vector3(-vector.x, vector.y, -vector.z); + } + + Ogre::Vector3 uvwToObject(const Ogre::Vector3& uvw, NormalId faceId) + { + switch (faceId) + { + case NORM_X: + return uvwToObject(uvw); + case NORM_Y: + return uvwToObject(uvw); + case NORM_Z: + return uvwToObject(uvw); + case NORM_X_NEG: + return uvwToObject(uvw); + case NORM_Y_NEG: + return uvwToObject(uvw); + case NORM_Z_NEG: + return uvwToObject(uvw); + default: + return Ogre::Vector3::UNIT_X; + } + } + + Ogre::Vector3 objectToUvw(const Ogre::Vector3& object, NormalId faceId) + { + switch (faceId) + { + case NORM_X: + return objectToUvw(object); + case NORM_Y: + return objectToUvw(object); + case NORM_Z: + return objectToUvw(object); + case NORM_X_NEG: + return objectToUvw(object); + case NORM_Y_NEG: + return objectToUvw(object); + case NORM_Z_NEG: + return objectToUvw(object); + default: + return Ogre::Vector3::UNIT_X; + } + } +}; \ No newline at end of file