18 changed files with 130296 additions and 181 deletions
			
			
		@ -1,4 +1,6 @@ | 
				
			|||
cmake-*/ | 
				
			|||
.idea/ | 
				
			|||
stl/ | 
				
			|||
output/ | 
				
			|||
*.und/ | 
				
			|||
path_config.h | 
				
			|||
engine.json | 
				
			|||
 | 
				
			|||
								
									
										File diff suppressed because it is too large
									
								
							
						
					@ -0,0 +1,3 @@ | 
				
			|||
# replace the absolute path to the local directory with a relative one | 
				
			|||
set(LOCAL_DIR_PATH ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH "PATH TO LOCAL DIR") | 
				
			|||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/engine.json.in  ${CMAKE_CURRENT_SOURCE_DIR}/engine.json @ONLY) | 
				
			|||
@ -0,0 +1 @@ | 
				
			|||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/path_config.h.in  ${CMAKE_CURRENT_SOURCE_DIR}/path_config.h @ONLY) | 
				
			|||
@ -0,0 +1,7 @@ | 
				
			|||
#ifndef PATH_CONFIG_H_IN | 
				
			|||
#define PATH_CONFIG_H_IN | 
				
			|||
 | 
				
			|||
#cmakedefine CMAKE_SOURCE_DIR "@CMAKE_SOURCE_DIR@" | 
				
			|||
 | 
				
			|||
#endif | 
				
			|||
 | 
				
			|||
@ -0,0 +1,10 @@ | 
				
			|||
//
 | 
				
			|||
// Created by cflin on 4/7/23.
 | 
				
			|||
//
 | 
				
			|||
 | 
				
			|||
#include "UIStaticSimState.h" | 
				
			|||
 | 
				
			|||
namespace ipc { | 
				
			|||
    namespace rigid { | 
				
			|||
    } // ipc
 | 
				
			|||
} // rigid
 | 
				
			|||
@ -0,0 +1,169 @@ | 
				
			|||
//
 | 
				
			|||
// Created by cflin on 4/7/23.
 | 
				
			|||
//
 | 
				
			|||
 | 
				
			|||
#ifndef RIGIDIPC_UISTATICSIMSTATE_H | 
				
			|||
#define RIGIDIPC_UISTATICSIMSTATE_H | 
				
			|||
 | 
				
			|||
#include <memory> // shared_ptr | 
				
			|||
 | 
				
			|||
#include <spdlog/spdlog.h> | 
				
			|||
 | 
				
			|||
#include <igl/Timer.h> | 
				
			|||
#include <igl/opengl/glfw/Viewer.h> | 
				
			|||
#include <igl/opengl/glfw/imgui/ImGuiMenu.h> | 
				
			|||
#include <igl/png/render_to_png.h> | 
				
			|||
#include <igl/png/writePNG.h> | 
				
			|||
#include <igl/jet.h> | 
				
			|||
#include <viewer/igl_viewer_ext.hpp> | 
				
			|||
 | 
				
			|||
#include "UISimState.hpp" | 
				
			|||
#include "path_config.h" | 
				
			|||
#include "../../static_sim/StaticSim.h" | 
				
			|||
 | 
				
			|||
namespace ipc { | 
				
			|||
    namespace rigid { | 
				
			|||
        struct GUICtrl { | 
				
			|||
            bool mesh_visible = true; | 
				
			|||
            bool single_color = false; | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
        class UIStaticSimState : public UISimState { | 
				
			|||
            typedef igl::opengl::glfw::imgui::ImGuiMenu Super; | 
				
			|||
        public: | 
				
			|||
            UIStaticSimState(std::shared_ptr<ssim::StaticSim> sp_StaticSim) : UISimState(),sp_StaticSim_(sp_StaticSim),display_target(ssim::SimTargetOption::U_NORM) { | 
				
			|||
                // set gui_ctrl_;
 | 
				
			|||
                gui_ctrl_.single_color = true; | 
				
			|||
                gui_ctrl_.mesh_visible = true; | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            virtual ~UIStaticSimState() override {} | 
				
			|||
 | 
				
			|||
            virtual void init(igl::opengl::glfw::Viewer *_viewer) override { | 
				
			|||
                Super::init(_viewer); | 
				
			|||
                ImGuiIO &io = ImGui::GetIO(); | 
				
			|||
                io.Fonts->Clear(); | 
				
			|||
                io.Fonts->AddFontFromFileTTF( | 
				
			|||
                        CMAKE_SOURCE_DIR "/src/viewer/Arial Unicode MS.TTF", | 
				
			|||
                        14.0f, nullptr, io.Fonts->GetGlyphRangesChineseFull()); | 
				
			|||
 | 
				
			|||
                viewer->data().clear(); | 
				
			|||
                load_scene(); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
//            virtual void draw_menu() override;
 | 
				
			|||
            void load_scene() { | 
				
			|||
                ssim::Model model = sp_StaticSim_->get_mesh(); | 
				
			|||
                const Eigen::MatrixXd &V = model.V; | 
				
			|||
                const Eigen::MatrixXi &F = model.F; | 
				
			|||
                Eigen::MatrixXd Target = sp_StaticSim_->EvaluateTarget(display_target); | 
				
			|||
 | 
				
			|||
                // plot
 | 
				
			|||
                viewer->data().set_mesh(V, F); | 
				
			|||
                //  colormap
 | 
				
			|||
                Eigen::MatrixXd C; | 
				
			|||
                igl::jet(Target, true, C); | 
				
			|||
                viewer->data().set_colors(C); | 
				
			|||
 | 
				
			|||
 | 
				
			|||
                m_has_scene = true; | 
				
			|||
 | 
				
			|||
                int dim = V.cols(); | 
				
			|||
                m_viewer.core().trackball_angle.setIdentity(); | 
				
			|||
                m_viewer.core().set_rotation_type( | 
				
			|||
                        dim == 2 ? igl::opengl::ViewerCore::ROTATION_TYPE_NO_ROTATION | 
				
			|||
                                 : igl::opengl::ViewerCore:: | 
				
			|||
                        ROTATION_TYPE_TWO_AXIS_VALUATOR_FIXED_UP); | 
				
			|||
                m_viewer.core().orthographic = dim == 2; | 
				
			|||
                m_viewer.core().lighting_factor = 0.0; // dim == 2 ? 0.0 : 1.0;
 | 
				
			|||
                // mesh_data->data().set_face_based(true);
 | 
				
			|||
                assert(dim == 3.0); | 
				
			|||
                m_viewer.core().align_camera_center( | 
				
			|||
                        V, F); | 
				
			|||
 | 
				
			|||
                // Default colors
 | 
				
			|||
                m_viewer.core().background_color << 0.9f, 0.9f, 0.9f, 0.4f; | 
				
			|||
                // background_color << 0.3f, 0.3f, 0.5f, 1.0f;
 | 
				
			|||
 | 
				
			|||
                // Camera parameters
 | 
				
			|||
                m_viewer.core().camera_zoom = 1.0f; | 
				
			|||
                m_viewer.core().camera_translation << 0, 0, 0; | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            void launch(const std::string &inital_scene) override { | 
				
			|||
                m_viewer.plugins.push_back(this); | 
				
			|||
                m_viewer.core().set_rotation_type( | 
				
			|||
                        igl::opengl::ViewerCore::ROTATION_TYPE_NO_ROTATION); | 
				
			|||
                m_viewer.core().orthographic = true; | 
				
			|||
                m_viewer.core().is_animating = true; | 
				
			|||
                m_viewer.core().lighting_factor = 0.0; | 
				
			|||
                m_viewer.core().animation_max_fps = 120.0; | 
				
			|||
//                this->inital_scene = inital_scene;
 | 
				
			|||
                m_viewer.callback_pre_draw = [&](igl::opengl::glfw::Viewer &) { | 
				
			|||
                    return pre_draw_loop(); | 
				
			|||
                }; | 
				
			|||
                m_viewer.callback_post_draw = [&](igl::opengl::glfw::Viewer &) { | 
				
			|||
                    return post_draw_loop(); | 
				
			|||
                }; | 
				
			|||
                m_viewer.callback_key_pressed = [&](igl::opengl::glfw::Viewer &, | 
				
			|||
                                                    unsigned int unicode_key, | 
				
			|||
                                                    int modifiers) { | 
				
			|||
                    return custom_key_pressed(unicode_key, modifiers); | 
				
			|||
                }; | 
				
			|||
                m_viewer.launch( | 
				
			|||
                        /*resizable=*/true, /*fullscreen=*/false, | 
				
			|||
                        /*name=*/"静力学仿真"); | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
 | 
				
			|||
//            void load_scene();
 | 
				
			|||
 | 
				
			|||
            void redraw_scene() { | 
				
			|||
                ssim::Model model = sp_StaticSim_->get_mesh(); | 
				
			|||
                const Eigen::MatrixXd &V = model.V; | 
				
			|||
                const Eigen::MatrixXi &F = model.F; | 
				
			|||
 | 
				
			|||
                Eigen::MatrixXd Target = sp_StaticSim_->EvaluateTarget(display_target); | 
				
			|||
 | 
				
			|||
                // plot
 | 
				
			|||
                viewer->data().set_mesh(V, F); | 
				
			|||
 | 
				
			|||
                if (!gui_ctrl_.mesh_visible) { | 
				
			|||
                    viewer->data().show_overlay = false; | 
				
			|||
                    viewer->data().show_lines = false; | 
				
			|||
                } | 
				
			|||
 | 
				
			|||
                if (!gui_ctrl_.single_color) { | 
				
			|||
                    //  colormap
 | 
				
			|||
                    Eigen::MatrixXd C; | 
				
			|||
                    igl::jet(Target, true, C); | 
				
			|||
                    viewer->data().set_colors(C); | 
				
			|||
                } else { | 
				
			|||
                    // single color
 | 
				
			|||
                    viewer->data().set_colors(Eigen::RowVector3d(1, 0, 0)); | 
				
			|||
                } | 
				
			|||
 | 
				
			|||
 | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            bool pre_draw_loop() { | 
				
			|||
                redraw_scene(); | 
				
			|||
                return false; | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            bool post_draw_loop() { | 
				
			|||
                return false; | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            std::shared_ptr<ssim::StaticSim> sp_StaticSim_; | 
				
			|||
            ssim::SimTargetOption::Target display_target; | 
				
			|||
            GUICtrl gui_ctrl_; | 
				
			|||
 | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
    } // ipc
 | 
				
			|||
} // rigid
 | 
				
			|||
 | 
				
			|||
#endif //RIGIDIPC_UISTATICSIMSTATE_H
 | 
				
			|||
@ -0,0 +1,16 @@ | 
				
			|||
# Static Simulation Project | 
				
			|||
add_library(StaticSim STATIC StaticSim.cpp) | 
				
			|||
# eigen | 
				
			|||
target_link_libraries(StaticSim PUBLIC Eigen3::Eigen) | 
				
			|||
 | 
				
			|||
# igl | 
				
			|||
include(libigl) | 
				
			|||
target_link_libraries(StaticSim PUBLIC | 
				
			|||
        igl::core | 
				
			|||
        igl::predicates | 
				
			|||
        ) | 
				
			|||
target_link_libraries(StaticSim PUBLIC spdlog::spdlog) | 
				
			|||
 | 
				
			|||
 | 
				
			|||
# IPC link static simulation | 
				
			|||
target_link_libraries(rigid_ipc_sim PUBLIC StaticSim) | 
				
			|||
@ -0,0 +1,46 @@ | 
				
			|||
//
 | 
				
			|||
// Created by cflin on 4/7/23.
 | 
				
			|||
//
 | 
				
			|||
 | 
				
			|||
#ifndef RIGIDIPC_SIMTARGETOPTION_H | 
				
			|||
#define RIGIDIPC_SIMTARGETOPTION_H | 
				
			|||
 | 
				
			|||
namespace ssim { | 
				
			|||
 | 
				
			|||
    class SimTargetOption { | 
				
			|||
    public: | 
				
			|||
        static const int NUM_TARGETS = 10; | 
				
			|||
        enum Target{ | 
				
			|||
            U_NORM = 0,S_NORM, S_X, S_Y, S_Z | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
        SimTargetOption(int init_state=0) : state(init_state) {} | 
				
			|||
 | 
				
			|||
        void set_option(int option) { | 
				
			|||
            state |= (1 << option); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        void unset_option(int option) { | 
				
			|||
            state &= ~(1 << option); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        bool is_option_set(int option) const { | 
				
			|||
            return state & (1 << option); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        void clear() { | 
				
			|||
            state = 0; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        void set() { | 
				
			|||
            state = INT_MAX; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
    private: | 
				
			|||
        int state; | 
				
			|||
    }; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
} // ssim
 | 
				
			|||
 | 
				
			|||
#endif //RIGIDIPC_SIMTARGETOPTION_H
 | 
				
			|||
@ -0,0 +1,8 @@ | 
				
			|||
//
 | 
				
			|||
// Created by cflin on 4/7/23.
 | 
				
			|||
//
 | 
				
			|||
 | 
				
			|||
#include "StaticSim.h" | 
				
			|||
 | 
				
			|||
namespace ssim { | 
				
			|||
} // ssim
 | 
				
			|||
@ -0,0 +1,107 @@ | 
				
			|||
//
 | 
				
			|||
// Created by cflin on 4/7/23.
 | 
				
			|||
//
 | 
				
			|||
 | 
				
			|||
#ifndef RIGIDIPC_STATICSIM_H | 
				
			|||
#define RIGIDIPC_STATICSIM_H | 
				
			|||
 | 
				
			|||
#include <igl/readOBJ.h> | 
				
			|||
#include <Eigen/Dense> | 
				
			|||
#include <spdlog/spdlog.h> | 
				
			|||
#include "SimTargetOption.h" | 
				
			|||
namespace ssim { | 
				
			|||
    struct Model { | 
				
			|||
        Eigen::MatrixX3d V; | 
				
			|||
        Eigen::MatrixX3i F; | 
				
			|||
 | 
				
			|||
        Model() = default; | 
				
			|||
 | 
				
			|||
        Model(const Eigen::MatrixX3d &V, const Eigen::MatrixX3i &F) : V(V), F(F) {} | 
				
			|||
        int NumVertex() const{ | 
				
			|||
            return V.rows(); | 
				
			|||
        }; | 
				
			|||
    }; | 
				
			|||
 | 
				
			|||
    class StaticSim { | 
				
			|||
        using MeshModel = Model; | 
				
			|||
        using StlModel = Model; | 
				
			|||
    public: | 
				
			|||
 | 
				
			|||
        StaticSim(const SimTargetOption &option,const std::string & obj_path){ | 
				
			|||
            igl::readOBJ(obj_path,mesh_.V,mesh_.F); | 
				
			|||
            // set option
 | 
				
			|||
            option_=option; | 
				
			|||
            map_target_to_evaluated_.resize(option_.NUM_TARGETS); | 
				
			|||
            for (int i = 0; i < option_.NUM_TARGETS; ++i) { | 
				
			|||
                if(option_.is_option_set(i)) | 
				
			|||
                    MapAppendTarget(i); | 
				
			|||
            } | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        StaticSim(const StlModel &stl, const SimTargetOption &option) : stl_(stl), option_(option) { | 
				
			|||
            map_target_to_evaluated_.resize(option_.NUM_TARGETS); | 
				
			|||
            // TODO: boundary condition && solve
 | 
				
			|||
 | 
				
			|||
            for (int i = 0; i < option_.NUM_TARGETS; ++i) { | 
				
			|||
                MapAppendTarget(i); | 
				
			|||
            } | 
				
			|||
            // ...
 | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        Eigen::MatrixXd EvaluateTarget(SimTargetOption::Target target) { | 
				
			|||
            if (!option_.is_option_set(target)) { | 
				
			|||
                // new target, update option_ and map_
 | 
				
			|||
                MapAppendTarget(target); | 
				
			|||
                option_.set_option(target); | 
				
			|||
            } | 
				
			|||
            return map_target_to_evaluated_[target]; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        void set_stl(const std::string &stl_path) { | 
				
			|||
            // TODO read stl file
 | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        Model get_mesh() const { | 
				
			|||
            return mesh_; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        Model get_stl() const { | 
				
			|||
            return stl_; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
    private: | 
				
			|||
        MeshModel mesh_; | 
				
			|||
        StlModel stl_; | 
				
			|||
        SimTargetOption option_; | 
				
			|||
        std::vector<Eigen::MatrixXd> map_target_to_evaluated_; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
        Eigen::MatrixXd EvaluateUNorm() const { | 
				
			|||
            // TODO
 | 
				
			|||
            return (Eigen::VectorXd::Random(mesh_.NumVertex()).array() + 1.0) * 50; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        Eigen::MatrixXd EvaluateSNorm() const { | 
				
			|||
            // TODO
 | 
				
			|||
            return (Eigen::VectorXd::Random(mesh_.NumVertex()).array() + 1.0) * 50; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        void MapAppendTarget(int target) { | 
				
			|||
            switch (target) { | 
				
			|||
                case SimTargetOption::U_NORM: | 
				
			|||
                    map_target_to_evaluated_[target] = EvaluateUNorm(); | 
				
			|||
                    break; | 
				
			|||
                case SimTargetOption::S_NORM: | 
				
			|||
                    map_target_to_evaluated_[target] = EvaluateSNorm(); | 
				
			|||
                    break; | 
				
			|||
                default: | 
				
			|||
                    spdlog::warn("Wrong target {:d} !(TODO)", target); | 
				
			|||
            } | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
 | 
				
			|||
    }; | 
				
			|||
 | 
				
			|||
} // ssim
 | 
				
			|||
 | 
				
			|||
#endif //RIGIDIPC_STATICSIM_H
 | 
				
			|||
					Loading…
					
					
				
		Reference in new issue