kooparse/mogwai
Graphic utility used to manipulate objects in 3D for scene editing (commonly called Gizmo).
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 and the std!
Examples
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.
