{"id":19190274,"url":"https://github.com/seigtm/meov","last_synced_at":"2025-05-08T04:48:09.184Z","repository":{"id":39618148,"uuid":"451142465","full_name":"seigtm/meov","owner":"seigtm","description":"Minimalistic Easy Object Viewer: lightweight, fast and easy-to-use 3D object viewer","archived":false,"fork":false,"pushed_at":"2024-05-12T20:41:16.000Z","size":16328,"stargazers_count":43,"open_issues_count":1,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-05-08T04:48:03.036Z","etag":null,"topics":["3d","3d-model-viewer","3d-models","3d-viewer","assimp","cpp","dear-imgui","dear-imgui-cpp","dearimgui","diploma","diploma-project","graphics","imgui","imgui-sdl","opengl","pet-project","sdl","sdl2","viewer"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/seigtm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-01-23T15:15:11.000Z","updated_at":"2025-02-26T12:50:43.000Z","dependencies_parsed_at":"2024-05-12T21:45:00.132Z","dependency_job_id":null,"html_url":"https://github.com/seigtm/meov","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seigtm%2Fmeov","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seigtm%2Fmeov/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seigtm%2Fmeov/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seigtm%2Fmeov/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/seigtm","download_url":"https://codeload.github.com/seigtm/meov/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253002844,"owners_count":21838637,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["3d","3d-model-viewer","3d-models","3d-viewer","assimp","cpp","dear-imgui","dear-imgui-cpp","dearimgui","diploma","diploma-project","graphics","imgui","imgui-sdl","opengl","pet-project","sdl","sdl2","viewer"],"created_at":"2024-11-09T11:33:34.600Z","updated_at":"2025-05-08T04:48:09.157Z","avatar_url":"https://github.com/seigtm.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# **_MEOV_**\n\n**Minimalistic Easy Object Viewer**: fast, lightweight, powerful and easy-to-use 3D object viewer.\n\n\u003c/div\u003e\n\n## Reason\n\nMost of the services and programs for viewing 3D objects occupy a lot of space on the drive, piled with a lot of functionality, not required for a simple model viewer, are inconvenient or even paid.\n\nThe main goal of this project is to design, create and release a universal application for viewing 3D models, which does not take up a lot of disk space and supports a large number of model formats.\n\n## Requirements\n\nAt this stage of development, the software product has been tested on the operating systems of the `Microsoft Windows` family and functions correctly.\nThere was no testing on `Linux`, but it is a goal for the foreseeable future.\n\nThe application will require the latest version of the `Microsoft Visual C++ Redistributable` to be installed on the computer.\n\n## Clone \u0026\u0026 Build process\n\n```bash\n# 1. Clone the repository with it's submodules:\ngit clone --recurse-submodules -j8 'https://github.com/seigtm/meov.git'\n\n# 2. Configure and build with CMake:\ncd meov\nmkdir build\ncmake -S . -B build\ncmake --build build\n\n# 3. Enjoy :)\n```\n\n## Usage\n\nTo change the direction of view you need to `hold the computer mouse wheel`.\n\nMovement on the scene is done using the `WASDQE` keys.\n\nTo open your own model files you need to put them in the «`assets`» directory. Change the `model component` of the «`Test object`» and it will be ready to go!\n\n![Kurumi :3](./pics/screenshots/kurumi.png)\n\n## Scope\n\nAny spheres connected with the use of 3D models:\n\n- modeling and design;\n- computer graphics;\n- development of game applications;\n- research and development;\n- biological and scientific modeling;\n- architectural/construction modeling;\n- education;\n- cinematography;\n- animation;\n- advertising agencies and many others.\n\n## Languages\n\n- The main program code of the application is implemented with `C++`;\n- shaders - `GLSL`;\n- automated build - `CMake Language`.\n\n## Logs\n\nThe program generates logs containing records in chronological order about all important status changes, certain user and application actions, in the embedded widget, in the file and in the terminal window.\n\n## Dependencies\n\nExternal dependencies are connected to the project using the `Git submodules`.\n\nThe project is stand-alone application that does not need any dependencies to install and use it (except `Microsoft Visual C++ Redistributable`).\n\nAll necessary libraries are linked `statically`.\n\n## Components\n\n- `transform component` sets object on stage and their scale;\n- `move component` adds ability to change position of object by pressing keyboard key;\n- `camera component` creates an observer on the stage. You can configure its:\n  - `sensitivity`;\n  - `zoom`;\n  - `near` and `far`;\n  - `pitch`;\n  - `view matrix`;\n  - `projection matrix`.\n- `skybox component` sets the object photorealistic textures of the sky, informs about the name and status of the texture, and allows you to reboot the mesh of the object;\n- `model component` adds model to object, informs about the name and path to model file, displays all its meshes and their textures, and allows you to replace the model using the file selection dialog box;\n- `shader component` adds the ability of the object to have its own vertex and geometric shaders, allows them to be turned on and off if necessary, and informs about the status of their functioning;\n- `directional light`, `spot light` and `point light` components make the object an appropriate source of lighting on the stage and allows you to adjust all the necessary parameters depending on its type.\n\n## Classes\n\n`Core` is the fundamental class within the project. This class is used for the main cycle (the \"Game Loop\" design pattern). This entity is responsible for updating all objects and their components by using the the \"Update Method\" design pattern. On each frame, the application updates all objects from this collection. Together with the update of individual blocks, the main loop monitors input data from the user and operating system.\n\nThe basic components of the application are initialized and de-initialized using the class `Initializer`.\n\n![Core and Initializer classes](./pics/schemes/core.png)\n\nThe entity of the `scene` in the application source code is represented as configurable object `components`. For the design and creation of `components` the «Component» pattern is used. Configuration is possible by inheritance between the `Holder` and `Object` classes. `Holder` provides a mechanism for creating, removing, and accessing `components` that determine the behavior of an object.\n\n![Objects container in the Scene class](./pics/schemes/objects_on_scene.png)\n\nEach component implements the methods it needs and adds new features.\n\n![Components](./pics/schemes/component.png)\n\nTo obtain resources, the `Loader` class and its specific implementation for Assimp (`AssimpLoader`) are used. The `Loader` object provides methods for loading resources to the program by the given path.\n\n![Resources](./pics/schemes/resource.png)\n\nThe `Manager` class is a resource manager that is implemented using the singleton application design pattern.\n\n![Resource manager](./pics/schemes/manager.png)\n\nThe project also has an event manager, divided into two static classes - a mouse manager (`MouseManager`) and a keyboard manager (`KeyboardManager`).\n\n![KeyboardManager](./pics/schemes/keyboard_manager.png)\n\n![MouseManager](./pics/schemes/mouse_manager.png)\n\nThe `FrameBuffer` class is a set of buffers used as a destination for rendering.\n\n![FrameBuffer](./pics/schemes/framebuffer.png)\n\nThe `Graphics` class encapsulates and implements graphical content, providing unified access to GPU resources.\n\n![Graphics](./pics/schemes/graphics.png)\n\nThe `Base` class is a basic window interface from which classes that implement a specific interface are inherited.\n\n## Widgets\n\n- `Scene` on which the objects of the model, light sources and skybox are located;\n- `Scene tree` is a widget that displays all objects on the stage and allows you to click on the objects to open their properties in a separate widget;\n- `Properties` contains the components of the objects selected in the tree;\n- `Git information` provides information about the current version of Git commit (hash, message, and commit date);\n- `Logger` displays real-time records about important changes in the state of the application, successful or unsuccessful loading of models, textures, shaders, critical application errors and others.\n\nAll widgets use `docking` technology, allowing them to attach to each other and to the main graphical window of the application in any order and location.\n\n![](./pics/schemes/windows.png)\n\n![GitHub](https://img.shields.io/github/license/seigtm/meov)\n![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/seigtm/meov)\n![GitHub Repo stars](https://img.shields.io/github/stars/seigtm/meov)\n![GitHub top language](https://img.shields.io/github/languages/top/seigtm/meov)\n![GitHub contributors](https://img.shields.io/github/contributors/seigtm/meov)\n\n\u003c/div\u003e\n\n\n**‼️ Note**: this project is currently under development.\n\n## **Diagrams:**\n\n### Object components system:\n\n```mermaid\nclassDiagram\ndirection TB\n\nObject --|\u003e Holder\nObject --|\u003e Named\n\nHolder \"1\" o--\u003e \"*\" Component\nComponent \"1\" o..\u003e \"1\" Holder : contains\nComponent \u003c|-- TransformComponent\nComponent \u003c|-- ModelComponent\nComponent \u003c|-- LightingComponent\nComponent \u003c|-- MoveComponent\nComponent \u003c|-- ShaderComponent\nComponent \u003c|-- SkyboxComponent\n\nclass Named {\n    -string mName\n\n    +Named(string\u0026\u0026 name) ctor\n    +Name() string\n    +Rename(string\u0026\u0026 name) void\n}\n\nclass Component {\n    \u003c\u003cvirtual\u003e\u003e\n    # weak_ptr~Holder~ mHolder\n\n    +Component(string\u0026\u0026 name) ctor\n    +PreDraw(Graphics\u0026 g)* void\n    +Draw(Graphics\u0026 g)* void\n    +PostDraw(Graphics\u0026 g)* void\n    +PreUpdate(double delta)* void\n    +Update(double delta)* void\n    +PostUpdate(double delta)* void\n    +Serialize()* void\n    +SetHolder(weak_ptr~Holder~\u0026\u0026 holder) void\n}\n\nclass TransformComponent\nclass ModelComponent\nclass LightingComponent\nclass MoveComponent\nclass ShaderComponent\nclass SkyboxComponent\n\nclass Holder {\n    -GetTypeName()$ string\n    -unordered_map~string, Component::Shared~ mComponents\n\n    +GetComponent() T ptr\n    +RemoveComponent() bool\n    +AddComponent(Args\u0026\u0026... args) T ptr\n    +ForEachComponent(function~void(Component::Shared\u0026)~\u0026\u0026 method)\n}\n\nclass Object {\n    \u003c\u003cvirtual\u003e\u003e\n    -bool mEnabled\n\n    +Object(string\u0026\u0026 name) ctor\n    +PreDraw(Graphics\u0026 g)* void\n    +Draw(Graphics\u0026 g)* void\n    +PostDraw(Graphics\u0026 g)* void\n    +PreUpdate(double delta)* void\n    +Update(double delta)* void\n    +PostUpdate(double delta)* void\n    +Serialize()* void\n    +Enabled() bool\n    +Enable() void\n    +Disable() void\n}\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseigtm%2Fmeov","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseigtm%2Fmeov","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseigtm%2Fmeov/lists"}