import @"bulldozer_chassis_CAT_D10.agx" as agxVehicle.AgxBulldozer_import:
    .discard_rigid_body_positions: true
    .expose_bodies_as_traits: true

import @"bulldozer_blade.agx" as agxBladeWithPushbars.AgxBulldozer_import:
    .discard_rigid_body_positions: true
    .expose_bodies_as_traits: true

import @"bulldozer_ripper.agx" as agxRipper.AgxBulldozer_import:
    .discard_rigid_body_positions: true
    .expose_bodies_as_traits: true

Base is Vehicles.Bulldozer.Rigid.PushBars.Base:


    # Give the default chassis both equalizer and ripper connectors
    chassis becomes MachineModeling.Components.Primitive.Base with Vehicles.Bulldozer.Interfaces.Chassis.BaseConnectors, Vehicles.Bulldozer.Interfaces.Chassis.Outputs, Vehicles.Bulldozer.Interfaces.Chassis.EqualizerBarConnector, Vehicles.Bulldozer.Interfaces.Chassis.RipperConnectors:
        local_transform.position: {0,0,0}
        body becomes Physics3D.Bodies.RigidBody with agxVehicle.Hull
        left_lift_connector: chassis.body.mc_LiftCylAttachment_L
        right_lift_connector: chassis.body.mc_LiftCylAttachment_R
        right_bogie_connector: chassis.body.mc_HullBogiePivot_R
        left_bogie_connector: chassis.body.mc_HullBogiePivot_L
        right_pushbar_connector: chassis.body.mc_PushBar_R
        left_pushbar_connector: chassis.body.mc_PushBar_L
        # Asset trait has the wrong sign
        body.mc_HullSprocket_L.main_axis: -Math.Vec3.Y_AXIS()

    undercarriage:
        left_bogie:
            body becomes Physics3D.Bodies.RigidBody with agxVehicle.Bogie_L
            chassis_connector: undercarriage.left_bogie.body.mc_BogiePivot_L

        right_bogie:
            body becomes Physics3D.Bodies.RigidBody with agxVehicle.Bogie_R
            chassis_connector: undercarriage.right_bogie.body.mc_BogiePivot_R


    left_track becomes CAT_D10.Assets.Components.Track:
        chassis_body: chassis.body

    right_track becomes CAT_D10.Assets.Components.Track:
        chassis_body: chassis.body

    left_track_connection is Vehicles.TrackSystem.Connections.Base with Vehicles.TrackSystem.Connections.Traits.FiveWheels:
        track_system: left_track
        connectors: [
            chassis.body.mc_HullSprocket_L,
            undercarriage.left_bogie.body.mc_BogieIdlerRear_L,
            undercarriage.left_bogie.body.mc_BogieRoller1_L,
            undercarriage.left_bogie.body.mc_BogieRoller8_L,
            undercarriage.left_bogie.body.mc_BogieIdlerFront_L
        ]

    right_track_connection is Vehicles.TrackSystem.Connections.Base with Vehicles.TrackSystem.Connections.Traits.FiveWheels:
        track_system: right_track
        connectors: [
            chassis.body.mc_HullSprocket_R,
            undercarriage.right_bogie.body.mc_BogieIdlerRear_R,
            undercarriage.right_bogie.body.mc_BogieRoller1_R,
            undercarriage.right_bogie.body.mc_BogieRoller8_R,
            undercarriage.right_bogie.body.mc_BogieIdlerFront_R
        ]

    blade:
        body becomes Physics3D.Bodies.RigidBody with agxBladeWithPushbars.Blade
        left_upper_connector: blade.body.mc_Attachment_Upper_L
        right_upper_connector: blade.body.mc_Attachment_Upper_R
        left_mid_connector: blade.body.mc_Attachment_Mid_L
        right_mid_connector: blade.body.mc_Attachment_Mid_R
        left_lower_connector: blade.body.mc_Attachment_Lower_L
        right_lower_connector: blade.body.mc_Attachment_Lower_R

    right_push_bar:
        body becomes Physics3D.Bodies.RigidBody with agxBladeWithPushbars.PushBar_R
        rear_connector: right_push_bar.body.mc_PushBarRear_R
        front_connector: right_push_bar.body.mc_PushBarFront_R
        cylinder_connector: right_push_bar.body.mc_PushBarMid_R


    left_push_bar:
        body becomes Physics3D.Bodies.RigidBody with agxBladeWithPushbars.PushBar_L
        rear_connector: left_push_bar.body.mc_PushBarRear_L
        front_connector: left_push_bar.body.mc_PushBarFront_L
        cylinder_connector: left_push_bar.body.mc_PushBarMid_L

    # Limit the blade angle for snap
    blade_connection:
        left_push_bar_connection:
            range is Physics3D.Interactions.RotationalRange:
                connectors: blade_connection.left_push_bar_connection.hinge.connectors
                enabled: false
                start: -1
                end: 1
        right_push_bar_connection:
            range is Physics3D.Interactions.RotationalRange:
                connectors: blade_connection.right_push_bar_connection.hinge.connectors
                enabled: false
                start: -1
                end: 1


    drive_train becomes CAT_D10.Assets.Components.Drivetrain:
        left_actuator becomes DriveTrain.HingeActuator:
            mate_3d: left_track_connection.hinge_1.hinge
        right_actuator becomes DriveTrain.HingeActuator:
            mate_3d: right_track_connection.hinge_1.hinge

    d10_group is Simulation.CollisionGroup:
        systems: [this]

    disable_internal is Simulation.DisableCollisionPair:
        group1: d10_group
        group2: d10_group
