# MoonEngine
**Repository Path**: yushiuy/MoonEngine
## Basic Information
- **Project Name**: MoonEngine
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-06-23
- **Last Updated**: 2025-06-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# MoonEngine
A toy DCC software implemented based on OpenGL and imgui
## Feature List
- PBR viewport / HDRI IBL
- Split view / Multiple display mode
- Interactive mesh creation
- Hierarcial transform
- Import and view .OBJ mesh
- Basic viewport interaction
- SEM Shader (ZBRush style outlook)
- Post-Processing supported
- Operation stack (Something like the modifiers in 3ds Max)
- Volume rendering supported
- Procedural texture generation
- RABBIT RENDERER: a basic raytracing renderer
- MOON CAKE: procedural modeling tools
- MOON NN: node based interactive neural network training platform
## Quick tutorial
### viewport hotkeys
|Operation |Hotkey |
|:- |:-: |
|Gizmo::Move |w |
|Gizmo::Rotate |e |
|Gizmo::Scale |r |
|Camera::Pan |middle mouse (hold)|
|Camera::Zoom |mouse wheel |
|Camera::Rotate |alt + middle mouse |
|Select Object |left click |
|Delete Object |delete |
|Select Multiple Object |ctrl + left click |
|Centering Selected Object |z |
|Flow Menu |right click (hold) |
|Open Material Editor |m |
|Open MOON NN Editor |n |
|Search Node |s |
|Change Shading Mode |F1-F4 |
|Switch Split/Single View |space |
### Load OBJ model
```
auto boxes = MOON_ModelManager::LoadModel("Assets\\Models\\box_stack.obj");
```
### Transform an object
```
boxes->transform.Translate(Vector3(0.0f, 1.0f, 0.0f), LOCAL);
boxes->transform.Rotate(Quaternion(Vector3(90.0f, 0, 0)), WORLD);
boxes->transform.Scale(Vector3(0.2f, 0.2f, 0.2f));
```
### Create SmartMesh
```
Model* sphere = MOON_ModelManager::CreateSmartMesh(SmartMesh::sphere, "sphere");
```
### Set parent
```
boxes->transform.SetParent(&sphere->transform);
```
### Create Light
```
auto light = MOON_LightManager::CreateLight(point_light, "pointLight", Vector3(-10.0f, 10.0f, 10.0f));
```
### Create Volume object
```
auto cloud = MOON_VolumeManager::CreateVolume(
"cloud", false, Vector3::ZERO(),
Vector3::ONE() * -5, Vector3::ONE() * 5
);
```
### Create a material
```
auto newMat = MaterialManager::CreateMaterial("MoonMtl", "new_mat");
```
### Assign material to mesh
```
// a model may contain multiple sub-meshes
// *each mesh corresponds to a material
boxes->meshList[0].material = newMat;
```
### Add post effect to stack
```
Graphics::postStack.push_back(new FXAA());
Graphics::postStack.push_back(new DepthOfField());
```
### Raytracing current viewport
```
Renderer::StartRendering();
```
### Abort rendering
```
Renderer::isAbort = true;
```
### Create an nn via script
```
// graph: a container to hold all created neurons
auto graph = new NGraph("newGraph");
// n-dimensional input vector, not participating in training
// input_size: dimension of input feature
auto feature = new NVariable(Vector2(input_size, 1), graph, false, false);
// m-dimensional output vector, not participating in training
// output_size: dimension of input feature
auto label = new NVariable(Vector2(output_size, 1), graph, false, false);
// construct full connection layer
// y = wx+b
// hsize: number of neuron
auto output = new NAdd({
new NMatMul({
new NVariable(Vector2(hsize, input_size), graph, true),
feature
}, graph),
new NVariable(Vector2(hsize, 1), graph, true)
}, graph);
// activation function
output = ReLU(output, graph);
// output neural node
auto predict = new NAdd({
new NMatMul({
new NVariable(Vector2(output_size, input_size), graph, true),
input_vec
}, graph),
new NVariable(Vector2(output_size, 1), graph, true)
}, graph);
// loss function
auto loss = MSE({predict, label}, graph);
// optimizer
auto opt = Adam(graph, loss);
```
### Do one step training
```
// set input feature
feature->SetVal(...);
// set label for calculate loss
label->SetVal(...);
// calculate predict vector based on input feature
opt->Forward();
// calculate gradient map
opt->Backward();
// update weight and bias
opt->Update();
// clear gradient map
opt->ClearGrad();
```
## Video links
:full_moon: MOON ENGINE v0.20:[Youtube](https://youtu.be/y4HRC0XTYNI)/[Bilibili](https://www.bilibili.com/video/BV1Ti4y1j7Bd)
:full_moon: [MOON ENGINE v0.03](https://www.bilibili.com/video/BV1iK4y1C7h7)
:new_moon: [MOON NN](https://www.bilibili.com/video/BV1GT4y137kx)
## Screen shots
---
Welcome to visit my homepage: https://huanime.com.cn/.