Macro aframe::geometry_def

source ·
macro_rules! geometry_def {
    (
        $(schema: $schema:expr,)?
        $(init: $init:expr)?
    ) => { ... };
}
Expand description

Top-level macro to define custom geometries. Syntax resemles but is simpler than the component_def! macro. The js! macro is available for writing inline javascript, and returns a js_sys::Function object. This macro calls into on expressions passed into the fields expecting function, allowing the js! macro to be used as a catch-all. Takes the optional fields described in the table below.

fieldsyntax explanationdescription
schemaA hashmap containing string keys and GeometryProperty values. Recommend the maplit crateDescribes custom geometry properties
initJsValue created from a js_sys::Function()Called on initialization

All parameteres are optional, although leaving either out may not result in a meaningful geometry definition.

// Example (this is an exact replica of the builtin `box` geometry): 
let newbox = geometry_def!
{
    schema: hashmap!
    {
        "depth" => GeometryProperty::new(AframeVal::Float(1.0), Some(AframeVal::Float(0.0)), None, None),
        "height" => GeometryProperty::new(AframeVal::Float(1.0), Some(AframeVal::Float(0.0)), None, None),
        "width" => GeometryProperty::new(AframeVal::Float(1.0), Some(AframeVal::Float(0.0)), None, None),
        "segmentsHeight" => GeometryProperty::new(AframeVal::Int(1), Some(AframeVal::Int(1)), Some(AframeVal::Int(20)), Some("int")),
        "segmentsWidth" => GeometryProperty::new(AframeVal::Int(1), Some(AframeVal::Int(1)), Some(AframeVal::Int(20)), Some("int")),
        "segmentsDepth" => GeometryProperty::new(AframeVal::Int(1), Some(AframeVal::Int(1)), Some(AframeVal::Int(20)), Some("int")),
    },
    init: js!(data =>> this.geometry = new THREE.BoxGeometry(data.width, data.height, data.depth);)
};
unsafe
{
    newbox.register("newbox");
}