Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/kooparse/mogwai

Graphic utility used to manipulate objects in 3D for scene editing (commonly called Gizmo).
https://github.com/kooparse/mogwai

game-engine gamedev gizmo graphics-engine scene-editor zig

Last synced: 26 days ago
JSON representation

Graphic utility used to manipulate objects in 3D for scene editing (commonly called Gizmo).

Awesome Lists containing this project

README

        

# Mogwai

Graphic utility used to manipulate objects in 3D for scene editing (commonly called Gizmo).

It's a straightforward and simple Gizmo, all the manipulation is computed in this library
while it gives you all the verticies for your renderer; At the end,
you'll get a decomposed matrix (three vec3 for translation/rotation/scale).

This library uses only [zalgebra](https://github.com/kooparse/zalgebra) and the `std`!

preview

## Examples

```zig
usingnamespace @import("mogwai");

pub fn main () void {
var gizmo = Mogwai(.{
.screen_width = 800,
.screen_height = 600,
.snap_axis = 0.5,
.snap_angle = 5
});

// Get all vertices for your renderer.
const xy_panel = gizmo.meshes.move_panels.xy;
const yz_panel = gizmo.meshes.move_panels.yz
// See https://github.com/kooparse/mogwai/blob/master/exemples/_glfw_opengl.zig#L62-L73
// for all meshes.

// Mode is an enum containing all different modes
// for the gizmo (move, rotate, scale, none).
var gizmo_mode = Mode.Move;

while(true) {
// After pulling cursor state and positions:
gizmo.setCursor(pos_x, pos_y, is_pressed);
// After updating the view matrix (camera moving...).
gizmo.setCamera(view, proj);

// You just have to pass a mode and the model matrix from the
// selected object from your scene.
if (gizmo.manipulate(target_model_matrix, gizmo_mode)) |result| {
switch (result.mode) {
Mode.Move => {
target.transform.position = result.position;
},
Mode.Rotate => {
target.transform.rotation = result.rotation.extractRotation();
},
Mode.Scale => {
target.transform.scale = result.scale;
},
else => {},
}
}

// Draw all the meshes
your_renderer.draw(&yz_panel, gizmo.is_hover(GizmoItem.PanelYZ));
}
}
```
See https://github.com/kooparse/mogwai/blob/master/exemples/_glfw_opengl.zig for a real exemple.

## Documentation

### Config

Field | Type | Description
------------ | ------------- | -------------
screen_width | i32 | Width of the screen (required)
screen_height | i32 | Height of the screen (required)
dpi | i32 | Pixel ratio of your monitor
snap | ?f32 | Snap when dragging gizmo, value is equals to floor factor
arcball_radius | f32 | Radius of the rotation circles
arcball_thickness | f32 | Width of the rotation circle borders
panel_size| f32 | The width/height of panels
panel_offset| f32 | Offset of the panels from the origin position
panel_width| f32 | Plans width for panels
axis_length | f32 | Length of arrows
axis_size | f32 | The width/height of arrows
scale_box_size | f32 | Size of the scaler boxes

## Contributing to the project

Don’t be shy about shooting any questions you may have. If you are a beginner/junior, don’t hesitate, I will always encourage you. It’s a safe place here. Also, I would be very happy to receive any kind of pull requests, you will have (at least) some feedback/guidance rapidly.

Behind screens, there are human beings, living any sort of story. So be always kind and respectful, because we all sheer to learn new things.

## Thanks
This project is inspired by [tinygizmo](https://github.com/ddiakopoulos/tinygizmo) and [ImGuizmo](https://github.com/CedricGuillemet/ImGuizmo).