Program Listing for File SceneLoader.h

Return to documentation for file (Utils/SceneLoader.h)

#ifndef __SCENELOADER_H__
#define __SCENELOADER_H__

#include <string>
#include "extern/json/json.hpp"
#include "Common/Common.h"
#include "ParameterObject.h"

namespace Utilities
{
    class SceneLoader
    {
    protected:
        nlohmann::json m_json;

    public:
        enum CollisionObjectTypes {
            No_Collision_Object = 0, Sphere, Box, Cylinder, Torus, SDF, HollowSphere, HollowBox
        };

        struct RigidBodyData
        {
            unsigned int m_id;
            std::string m_modelFile;
            bool m_flatShading;
            bool m_isDynamic;
            Real m_density;
            Vector3r m_x;
            Quaternionr m_q;
            Vector3r m_scale;
            Vector3r m_v;
            Vector3r m_omega;
            Real m_restitutionCoeff;
            Real m_frictionCoeff;
            int m_collisionObjectType;
            std::string m_collisionObjectFileName;
            bool m_testMesh;
            Vector3r m_collisionObjectScale;
            bool m_invertSDF;
            Real m_thicknessSDF;
            Eigen::Matrix<unsigned int, 3, 1, Eigen::DontAlign> m_resolutionSDF;

            nlohmann::json m_json;
        };

        struct TriangleModelData
        {
            unsigned int m_id;
            std::string m_modelFile;
            Vector3r m_x;
            Quaternionr m_q;
            Vector3r m_scale;
            std::vector<unsigned int> m_staticParticles;
            Real m_restitutionCoeff;
            Real m_frictionCoeff;
            nlohmann::json m_json;
        };

        struct TetModelData
        {
            unsigned int m_id;
            std::string m_modelFileTet;
            std::string m_modelFileNodes;
            std::string m_modelFileElements;
            std::string m_modelFileVis;
            Vector3r m_x;
            Quaternionr m_q;
            Vector3r m_scale;
            std::vector<unsigned int> m_staticParticles;
            Real m_restitutionCoeff;
            Real m_frictionCoeff;
            int m_collisionObjectType;
            std::string m_collisionObjectFileName;
            bool m_testMesh;
            Vector3r m_collisionObjectScale;
            bool m_invertSDF;
            Real m_thicknessSDF;
            Eigen::Matrix<unsigned int, 3, 1, Eigen::DontAlign> m_resolutionSDF;
            nlohmann::json m_json;
        };

        struct BallJointData
        {
            unsigned int m_bodyID[2];
            Vector3r m_position;
        };

        struct BallOnLineJointData
        {
            unsigned int m_bodyID[2];
            Vector3r m_position;
            Vector3r m_axis;
        };

        struct HingeJointData
        {
            unsigned int m_bodyID[2];
            Vector3r m_position;
            Vector3r m_axis;
        };

        struct UniversalJointData
        {
            unsigned int m_bodyID[2];
            Vector3r m_position;
            Vector3r m_axis[2];
        };

        struct SliderJointData
        {
            unsigned int m_bodyID[2];
            Vector3r m_axis;
        };

        struct RigidBodyParticleBallJointData
        {
            unsigned int m_bodyID[2];
        };

        struct RigidBodySpringData
        {
            unsigned int m_bodyID[2];
            Vector3r m_position1;
            Vector3r m_position2;
            Real m_stiffness;
        };

        struct DistanceJointData
        {
            unsigned int m_bodyID[2];
            Vector3r m_position1;
            Vector3r m_position2;
        };

        struct TargetAngleMotorHingeJointData
        {
            unsigned int m_bodyID[2];
            Vector3r m_position;
            Vector3r m_axis;
            Real m_target;
            std::vector<Real> m_targetSequence;
            bool m_repeat;
        };

        struct TargetVelocityMotorHingeJointData
        {
            unsigned int m_bodyID[2];
            Vector3r m_position;
            Vector3r m_axis;
            Real m_target;
            std::vector<Real> m_targetSequence;
            bool m_repeat;
        };

        struct TargetPositionMotorSliderJointData
        {
            unsigned int m_bodyID[2];
            Vector3r m_axis;
            Real m_target;
            std::vector<Real> m_targetSequence;
            bool m_repeat;
        };

        struct TargetVelocityMotorSliderJointData
        {
            unsigned int m_bodyID[2];
            Vector3r m_axis;
            Real m_target;
            std::vector<Real> m_targetSequence;
            bool m_repeat;
        };

        struct DamperJointData
        {
            unsigned int m_bodyID[2];
            Vector3r m_axis;
            Real m_stiffness;
        };

        struct SceneData
        {
            std::string m_sceneName;
            Vector3r m_camPosition;
            Vector3r m_camLookat;

            Real m_timeStepSize;
            Vector3r m_gravity;

            std::vector<RigidBodyData> m_rigidBodyData;
            std::vector<TriangleModelData> m_triangleModelData;
            std::vector<TetModelData> m_tetModelData;
            std::vector<BallJointData> m_ballJointData;
            std::vector<BallOnLineJointData> m_ballOnLineJointData;
            std::vector<HingeJointData> m_hingeJointData;
            std::vector<UniversalJointData> m_universalJointData;
            std::vector<SliderJointData> m_sliderJointData;
            std::vector<RigidBodyParticleBallJointData> m_rigidBodyParticleBallJointData;
            std::vector<TargetAngleMotorHingeJointData> m_targetAngleMotorHingeJointData;
            std::vector<TargetVelocityMotorHingeJointData> m_targetVelocityMotorHingeJointData;
            std::vector<TargetPositionMotorSliderJointData> m_targetPositionMotorSliderJointData;
            std::vector<TargetVelocityMotorSliderJointData> m_targetVelocityMotorSliderJointData;
            std::vector<DamperJointData> m_damperJointData;
            std::vector<RigidBodySpringData> m_rigidBodySpringData;
            std::vector<DistanceJointData> m_distanceJointData;
        };

        virtual ~SceneLoader() {}
        void readScene(const std::string &fileName, SceneData &sceneData);
        void readSimulation(const nlohmann::json &child, const std::string &key, SceneData &sceneData);
        void readRigidBodies(const nlohmann::json &child, const std::string &key, const std::string &basePath, SceneData &sceneData);
        void readTriangleModels(const nlohmann::json &child, const std::string &key, const std::string &basePath, SceneData &sceneData);
        void readTetModels(const nlohmann::json &child, const std::string &key, const std::string &basePath, SceneData &sceneData);
        void readBallJoints(const nlohmann::json &child, const std::string &key, SceneData &sceneData);
        void readBallOnLineJoints(const nlohmann::json &child, const std::string &key, SceneData &sceneData);
        void readHingeJoints(const nlohmann::json &child, const std::string &key, SceneData &sceneData);
        void readUniversalJoints(const nlohmann::json &child, const std::string &key, SceneData &sceneData);
        void readSliderJoints(const nlohmann::json &child, const std::string &key, SceneData &sceneData);
        void readRigidBodyParticleBallJoints(const nlohmann::json &child, const std::string &key, SceneData &sceneData);
        void readTargetAngleMotorHingeJoints(const nlohmann::json &child, const std::string &key, SceneData &sceneData);
        void readTargetVelocityMotorHingeJoints(const nlohmann::json &child, const std::string &key, SceneData &sceneData);
        void readTargetPositionMotorSliderJoints(const nlohmann::json &child, const std::string &key, SceneData &sceneData);
        void readTargetVelocityMotorSliderJoints(const nlohmann::json &child, const std::string &key, SceneData &sceneData);
        void readRigidBodySprings(const nlohmann::json &j, const std::string &key, SceneData &sceneData);
        void readDistanceJoints(const nlohmann::json &j, const std::string &key, SceneData &sceneData);
        void readDamperJoints(const nlohmann::json &child, const std::string &key, SceneData &sceneData);

        template <typename T>
        static bool readValue(const nlohmann::json &j, const std::string &key, T &v)
        {
            if (j.find(key) == j.end())
                return false;

            v = j[key].get<T>();
            return true;
        }

        template <typename T, int size>
        static bool readVector(const nlohmann::json &j, const std::string &key, Eigen::Matrix<T, size, 1, Eigen::DontAlign> &vec)
        {
            if (j.find(key) == j.end())
                return false;

            std::vector<T> values = j[key].get<std::vector<T>>();
            for (unsigned int i = 0; i < values.size(); i++)
                vec[i] = values[i];
            return true;
        }

        void readParameterObject(GenParam::ParameterObject *paramObj);
    };

    template <>
    bool SceneLoader::readValue<bool>(const nlohmann::json &j, const std::string &key, bool &v);
}

#endif