mittens-engine 0.7.0

A Vulkan and OpenXR scene engine with ECS, reactive signals, and Meow Meow scripting
// camera-toggle.mms
//
// MMS-authored camera toggle demo using the shared button component.
//
// Notes:
// - Turning Camera3D off blanks the desktop scene view by design when there is
//   no other active Camera3D/Camera2D.
// - CameraXR toggling updates the XR rig selection path while VR stays live.

RendererSettings {
    window_size(1280, 960)
}

BGC.rgba(0.10, 0.11, 0.14, 1.0)
AL.rgb(0.32, 0.32, 0.35)

T.position(2.4, 3.8, 3.0) {
    DL {
        intensity(0.95)
        color(1.0, 0.97, 0.92)
    }
}

T.position(-2.0, 2.2, 1.5) {
    DL {
        intensity(0.35)
        color(0.85, 0.90, 1.0)
    }
}

// Desktop camera + pointer.
let desktop_cam = C3D.enabled(true) {
    Pointer {}
}

I.speed(2.5) {
    InputTransformMode.forward_z() {
        fps_rotation()
        roll_axis_y()
    }

    T.position(0.0, 1.25, 5.0) {
        name = "desktop_rig"
        desktop_cam
    }
}

// XR rig selection target.
let xr_cam = CXR.on()

InputXR.on() {
    InputXRGamepad {
        locomotion()
        speed(1.5)
    }
    T.position(0.0, 1.55, 0.0) {
        xr_cam {
            Pointer {}
        }
    }
}

XR.on()

// Simple scene reference so toggling the desktop camera has an obvious effect.
T.position(0.0, -0.15, 0.0).scale(12.0, 0.2, 12.0) {
    R.cube() { C.rgba(0.74, 0.74, 0.78, 1.0) }
}

T.position(-1.7, 0.55, -0.8).scale(0.7, 1.1, 0.7) {
    R.cube() {
        C.rgba(0.92, 0.48, 0.24, 1.0)
        EM.on()
    }
}

T.position(0.0, 1.0, -1.6).scale(0.65, 1.7, 0.65) {
    R.cube() {
        C.rgba(0.22, 0.74, 0.96, 1.0)
        EM.on()
    }
}

T.position(1.8, 1.45, -2.6).scale(0.8, 0.8, 0.8) {
    R.cube() {
        C.rgba(0.96, 0.86, 0.22, 1.0)
        EM.on()
    }
}

import { button } from "../assets/components/button.mms"

let cam3d_toggle_btn = button("toggle Camera3D")
let xr_toggle_btn = button("toggle CameraXR")

let cam3d_status_wrap = T {
    Style {
        display("inline-block")
        padding_xy(0.6, 0.6)
        text_align("center")
    }
    T.position(0.0, 0.0, 0.05) {
        Text {
            name = "cam3d_status"
            "Camera3D: on"
        }
    }
}

let xr_status_wrap = T {
    Style {
        display("inline-block")
        padding_xy(0.6, 0.6)
        text_align("center")
    }
    T.position(0.0, 0.0, 0.05) {
        Text {
            name = "xr_status"
            "CameraXR: on"
        }
    }
}

let note_wrap = T {
    Style {
        display("inline-block")
        padding_xy(0.6, 0.6)
        text_align("center")
        font_size(0.07wu)
    }
    T.position(0.0, 0.0, 0.05) {
        Text {
            name = "camera_toggle_note"
            "desktop off => window scene draw stops\nuse REPL or XR path to recover if needed"
        }
    }
}

let control_panel = T.position(-4.6, 3.1, 0.0).scale(0.28, 0.28, 0.28) {
    LayoutRoot {
        name = "camera_toggle_panel"
        available_width(36.0)
        available_height(20.0)
        cam3d_toggle_btn
        cam3d_status_wrap
        xr_toggle_btn
        xr_status_wrap
        note_wrap
    }
}
control_panel

let cam3d_status = control_panel.query("#cam3d_status")
let xr_status = control_panel.query("#xr_status")

on(cam3d_toggle_btn, "Click", fn(e) {
    let enabled = desktop_cam.enabled()
    desktop_cam.enabled(!enabled)
    if enabled {
        cam3d_status.set_text("Camera3D: off")
        print("Camera3D.enabled(false)")
    } else {
        cam3d_status.set_text("Camera3D: on")
        desktop_cam.make_active_camera()
        print("Camera3D.enabled(true)")
    }
})

on(xr_toggle_btn, "Click", fn(e) {
    let enabled = xr_cam.enabled()
    xr_cam.enabled(!enabled)
    if enabled {
        xr_status.set_text("CameraXR: off")
        print("CameraXR.enabled(false)")
    } else {
        xr_status.set_text("CameraXR: on")
        xr_cam.make_active_camera()
        print("CameraXR.enabled(true)")
    }
})