# This file sets up a model of a lunar cruiser with 6 wheels using obj files and visual materials
# read from png-files. It contains the CruiserBase which sets up the vehicle, but without
# anything for driving or steering the wheels. For full version where it is possible to drive,
# see the CruiserSixMotors or CruiserOneMotor.
#
# Note: This vehicle is tuned to be driving in moon gravity
import @"visuals/AlgoryxLunarCruiser_Chassi.obj" as ChassisVisual
import @"visuals/AlgoryxLunarCruiser_Mudguard6w.obj" as MudguardVisual
import @"visuals/ChassiDiffuse.png" as ChassisDiffuse

const ChassiVisualMaterial is Visuals.Materials.Material:
    with Visuals.Materials.SurfaceFeatures.BaseColor
    base_color_map: ChassisDiffuse

const WheelMaterial is Physics.Geometries.Material:
    unique_name: "WheelMaterial"
    density: 1000

ChassisWheelConnector is Physics3D.Interactions.MateConnector:
    with Vehicles.Interfaces.UpForwardVectors
    with Vehicles.Suspensions.Properties.WheelAxisFromUpForward
    .agx_debug_render_frame: true
    up_vector: {0, 0, 1}
    forward_vector: {0, 1, 0}

# Define the chassis as a rigid body with visual and collision properties
Chassis is Physics3D.Bodies.RigidBody:
    collision_box1 is Physics3D.Geometries.Box:
        size:
            x: 2.5
            y: 5.95
            z: 2.2
        local_transform.position:
            y: 0.25
            z: 0.65 + collision_box1.size.z*0.5
    collision_box2 is Physics3D.Geometries.Box:
        size:
            x: 1.65
            y: 4.85
            z: 0.5
        local_transform.position:
            y: 0.25
            z: collision_box1.local_transform.position.z - collision_box1.size.z*0.5 - collision_box2.size.z*0.5

    chassis_visual is ChassisVisual with Visuals.Materials.VisualMaterialOverrideTrait:
        material_override: ChassiVisualMaterial
    mudguard_visual is MudguardVisual

    inertia.mass: 9000  # Set chassis mass
    kinematics.local_cm_transform.position: {0,0,0.7}

    # Connectors needed for connecting wheels
    front_left_connector is ChassisWheelConnector:
        position:
            x: -1.7
            y: 2.5
            z: 0.2

    rear_left_connector is ChassisWheelConnector:
        position:
           x: -1.7
           y: -2.0
           z: 0.2

    front_right_connector is ChassisWheelConnector:
        position:
            x: 1.7
            y: 2.5
            z: 0.2

    rear_right_connector is ChassisWheelConnector:
        position:
            x: 1.7
            y: -2.0
            z: 0.2

    mid_left_connector is ChassisWheelConnector:
        position:
            x: -1.7
            y: -0.3
            z: 0.2

    mid_right_connector is ChassisWheelConnector:
        position:
            x: 1.7
            y: -0.3
            z: 0.2

# Base model for the Lunar Cruiser with 6 wheels.
# Does not contain anything do drive or steer the wheels.
CruiserBase is Physics3D.System:
    chassis is Vehicles.Chassis.Rigid.Base:
        body becomes Chassis
        local_transform.position.z: 1.1  # Set initial height

    # Define wheel instances with suspension
    front_left_wheel is Components.WheelSystem:
        chassis_connector: chassis.body.front_left_connector
    front_right_wheel is Components.WheelSystem:
        chassis_connector: chassis.body.front_right_connector
    rear_left_wheel is Components.WheelSystem:
        chassis_connector: chassis.body.rear_left_connector
    rear_right_wheel is Components.WheelSystem:
        chassis_connector: chassis.body.rear_right_connector
    mid_left_wheel is Components.WheelSystem:
        chassis_connector: chassis.body.mid_left_connector
    mid_right_wheel is Components.WheelSystem:
        chassis_connector: chassis.body.mid_right_connector

    # Define collision group to handle chassis and wheel collisions
    chassis_collision_group is Simulation.CollisionGroup:
        bodies: [chassis.body]

    wheels_collision_group is Simulation.CollisionGroup:
        bodies: [front_left_wheel.wheel.rim, rear_left_wheel.wheel.rim, front_right_wheel.wheel.rim,
                 rear_right_wheel.wheel.rim, mid_left_wheel.wheel.rim, mid_left_wheel.wheel.rim]

    disable_wheel_chassis_collisions is Simulation.DisableCollisionPair:
        group1: chassis_collision_group
        group2: wheels_collision_group

    # We create a signal interface we can add signals to
    signal_interface is Physics.Signals.SignalInterface:
        enable: true
