
CraneSystemComponentNoVisuals is Physics3D.System:
    with Traits.CraneComponent # The with keyword extends a model with a trait

    body is Physics3D.Bodies.RigidBody:
        kinematics.local_transform.position.x: 0

    snap_drive.redirected_parent: body
    snap_ground.redirected_parent: body
    snap_guide.redirected_parent: body
    snap_input.redirected_parent: body
    snap_output.redirected_parent: body

    input_bearing_left.redirected_parent: body
    input_bearing_right.redirected_parent: body
    output_bearing_left.redirected_parent: body
    output_bearing_right.redirected_parent: body
    ground_bearing_left.redirected_parent: body
    ground_bearing_right.redirected_parent: body
    guide_bearing_left.redirected_parent: body
    guide_bearing_right.redirected_parent: body
    drive_bearing_left.redirected_parent: body
    drive_bearing_right.redirected_parent: body

CraneSystemComponent is CraneSystemComponentNoVisuals:
    body becomes CraneBodyVisuals:
        # Visuals for axles
        drive_axle_visual.local_transform.position: snap_drive.position
        ground_axle_visual.local_transform.position: snap_ground.position
        guide_axle_visual.local_transform.position: snap_guide.position
        output_axle_visual.local_transform.position: snap_output.position

        # Visuals for bearings
        input_bearing_left_visual.local_transform.position: input_bearing_left.position
        input_bearing_right_visual.local_transform.position: input_bearing_right.position

        visual.vertices: [snap_drive.position -body.narrow_offset, snap_ground.position -body.narrow_offset, snap_guide.position -body.narrow_offset,
                    snap_input.position -body.wide_offset, snap_output.position -body.wide_offset, snap_drive.position +body.narrow_offset,
                    snap_ground.position +body.narrow_offset, snap_guide.position +body.narrow_offset, snap_input.position +body.wide_offset,
                    snap_output.position +body.wide_offset]
        convex.vertices: body.visual.vertices
