#usda 1.0
(
    "Savanna Detector Scene. "
)

def Xform "Scene"
{
    def FrameSampler "RandomRotation"
    {
        float3[] rotation = [(-90, -180, -180), (90, 180, 180)]
    }

    def Xform "ObjectsRoot"
    {
        def Xform "ObjectsPlaceholder"
        {
        }

        def Xform "DefaultObjectPrim"
        {
            def FrameSampler "RandomPoseInFOV"
            {
                float border_region = 0.18
                rel ref_cameras = </Scene/main_cam>
                bool inverse_z_sampling = true
                float3[] rotation = [(-90, -180, -180), (90, 180, 180)]
                float[] z_range = [0.2, 0.8]
            }

            # A PoseLocalToWorld label request will be added after centering and scale
        }
    }

    def Camera "main_cam"
    {
        float camera:field_of_view = 160
        float2 clippingRange = (0.0001, 1000)
        custom token image:lens_mode = "f-theta"
        custom float image:crop_ratio = 0.99
        custom int image:super_sampling_factor = 3

        string[] image:output = ["color", "mask"]

        def FrameSampler "ImageProcessing"
        {
            float[] bloom = [0.0, 0.005]
            float[] camera_noise = [0.0, 0.4]
            float[] tint_hue = [0.0, 1.0]
            float[] tint_strength = [0.0, 0.3]
            float[] exposure = [-6.0, 0.0]
            float[] gaussian_range = [0.0, 1.0]
            float[] motion_blur_strength = [0.0, 0.01]
            float[] motion_blur_angle = [0.0, 180.0]
        }

        def LabelRequest "CameraLR"
        {
            string[] request:names = ["PoseLocalToWorld", "CameraIntrinsics"]
        }
    }


    def Xform "ForeObjectBase" ()
    {
        float model_diameter = 0.01
        int shader_mask_value = 0

        def FrameSampler "RandomPoseInFOV"
        {
            float border_region = 0.18
            rel ref_cameras = </Scene/main_cam>
            bool inverse_z_sampling = true
            float3[] rotation = [(-90, -180, -180), (90, 180, 180)]
            float[] z_range = [0.2, 0.8]
        }

        def FrameSampler "AdaptiveScale"
        {
            rel ref_model_diameter = </Scene/ObjectsRoot/ObjectsPlaceholder/ObjectContainer_000>
        }

    }

    def Xform "ForeCube1" (
        references = @../Cube.usda@
        inherits = </Scene/ForeObjectBase>
    )
    {
    }

    def Xform "ForeCone1" (
        references = @../Cone.usda@
        inherits = </Scene/ForeObjectBase>
    )
    {
    }

    def Xform "ForeCapsule1" (
        references = @../Capsule.usda@
        inherits = </Scene/ForeObjectBase>
    )
    {
    }

    def Xform "ForeSphere1" (
        references = @../Sphere.usda@
        inherits = </Scene/ForeObjectBase>
    )
    {
    }

    def Xform "AggressorBase" ()
    {
        float model_diameter = 0.01
        int shader_mask_value = 255

        def FrameSampler "RandomPoseInFOV"
        {
            float border_region = 0.18
            rel ref_cameras = </Scene/main_cam>
            rel ref_model_diameter = <..>
            bool inverse_z_sampling = true
            float3[] rotation = [(-90, -180, -180), (90, 180, 180)]
            float[] z_range = [0.2, 0.8]
        }
    }

    def Xform "Aggressors"
    {   
        def Xform "AggressorMarker1" (
            references = @../Marker.usda@
            inherits = </Scene/AggressorBase>
        )
        {
            double radius = 0.003
        }
        def Xform "AggressorMarker2" (
            references = @../Marker.usda@
            inherits = </Scene/AggressorBase>
        )
        {
            double radius = 0.004
        }
        def Xform "AggressorMarker3" (
            references = @../Marker.usda@
            inherits = </Scene/AggressorBase>
        )
        {
            double radius = 0.005
        }
        def Xform "AggressorMarker4" (
            references = @../Marker.usda@
            inherits = </Scene/AggressorBase>
        )
        {
            double radius = 0.006
        }
        def Xform "AggressorLED1" (
            references = @../EmissiveLED.usda@
            inherits = </Scene/AggressorBase>
        )
        {
            double radius = 0.003
        }
        def Xform "AggressorLED2" (
            references = @../EmissiveLED.usda@
            inherits = </Scene/AggressorBase>
        )
        {
            double radius = 0.004
        }
        def Xform "AggressorLED3" (
            references = @../EmissiveLED.usda@
            inherits = </Scene/AggressorBase>
        )
        {
            double radius = 0.005
        }
        def Xform "AggressorLED4" (
            references = @../EmissiveLED.usda@
            inherits = </Scene/AggressorBase>
        )
        {
            double radius = 0.006
        }
    }
}


def Xform "Lights"{
    def DomeLight "Background"
    {
        def FrameSampler "RandomRotation"
        {
            float3[] rotation = [(-90, -180,-180), (90, 180, 180)]
        }

        def FrameSampler "RandomBackground"
        {
            asset folder = @LeonaroTexturesAssets/TextureImages@
            string[] filenames = ["*.hdr", "*.exr", "*.jpg"]
        }

        float inputs:intensity = 1  # This is the default RE value for IBL intensity.
        def FrameSampler "RandomAttr_1" {
            string attr_name = "inputs:intensity"
            float[] range = [0.1, 1.9]
        }

        float inputs:skybox_intensity = 0  # This is the default RE value for skybox intensity.
        def FrameSampler "RandomAttr_2" {
            string attr_name = "inputs:skybox_intensity"
            float[] range = [-5.0, 5.0]
        }
    }

    def Xform "Lowlights" {
        def FrameSampler "RandomSwitch"
        {
        }

        def ClipSampler "RandomVisibility"
        {
            # Disable for now for further tuning
            float probability = 0.2
        }

        def DiskLight "SpotLight" (
        )
        {
            float inputs:angle = 0.53

            def FrameSampler "RandomAttr_1" {
                string attr_name = "inputs:intensity"
                float[] range = [10000, 100000000]
            }

            float inputs:shaping:cone:angle = 160
            float inputs:shaping:cone:softness = 0.1
        }

        def DistantLight "DirectionalLight" (
        )
        {
            def FrameSampler "RandomAttr_1" {
                string attr_name = "inputs:intensity"
                float[] range = [1000, 10000000]
            }

            float inputs:angle = 2.0 # angular size of directional light. 0.53 is the default for USD.
        }


        def FrameSampler "RandomTranslation"
        {
            float3[] translation = [(-2.0, -2.0, -2.0), (2.0, 2.0, 2.0)]
        }

        def FrameSampler "PointAtPrim"
        {
            float3 up_vector = (0, -1, 0)
            bool only_outplane_rotation = true
            bool use_previous_frame = false
            rel ref_target_prim = </Scene/ObjectsRoot/ObjectsPlaceholder>
        }
    }
}