void PlaceOccludingObjects(
        GameObject[] objectsToPlace, Camera camera, PlacementStatics statics, NativeList <PlacedObject> placedObjects)
    {
        var textures = statics.BackgroundImages;

        if (m_OccludingObjectCache == null)
        {
            m_OccludingObjectCache = new GameObjectOneWayCache(m_ParentOccluding.transform, objectsToPlace);
        }

        m_OccludingObjectCache.ResetAllObjects();
        var occludingObjectBounds = ComputeObjectBounds(objectsToPlace);

        var materialPropertyBlock  = new MaterialPropertyBlock();
        var placedOccludingObjects = new NativeArray <PlacedObject>(placedObjects.Length, Allocator.TempJob);
        var placementRegion        = ObjectPlacementUtilities.ComputePlacementRegion(camera, k_OccludingLayerDistance);

        using (s_ComputePlacements.Auto())
        {
            var job = new ComputeOccludingObjectPlacements()
            {
                OccludingObjectBounds   = occludingObjectBounds,
                ImageCoordinates        = placementRegion,
                Transformer             = new WorldToScreenTransformer(camera),
                PlacedForegroundObjects = placedObjects,
                RandomSeed             = m_Rand.NextUInt(),
                PlacedOccludingObjects = placedOccludingObjects,
                ScalingMin             = statics.ScalingMin,
                ScalingSize            = statics.ScalingSize
            };
            job.Schedule(placedObjects.Length, 10).Complete();
        }

        using (s_SetupObjects.Auto())
        {
            foreach (var placedOccludingObject in placedOccludingObjects)
            {
                if (placedOccludingObject.PrefabIndex < 0)
                {
                    continue;
                }

                var prefab        = objectsToPlace[placedOccludingObject.PrefabIndex];
                var objectToPlace = m_OccludingObjectCache.GetOrInstantiate(prefab);
                objectToPlace.layer = m_OccludingLayer;

                var meshRenderer = objectToPlace.GetComponentInChildren <MeshRenderer>();
                meshRenderer.GetPropertyBlock(materialPropertyBlock);
                ObjectPlacementUtilities.CreateRandomizedHue(materialPropertyBlock, statics.OccludingHueMaxOffset, ref m_Rand);
                materialPropertyBlock.SetTexture("_BaseMap", textures[m_Rand.NextInt(textures.Length)]);
                meshRenderer.SetPropertyBlock(materialPropertyBlock);

                objectToPlace.transform.localPosition = placedOccludingObject.Position;
                objectToPlace.transform.localRotation = placedOccludingObject.Rotation;
                objectToPlace.transform.localScale    = Vector3.one * placedOccludingObject.Scale;
            }
        }
        placedOccludingObjects.Dispose();
        occludingObjectBounds.Dispose();
    }
 protected override void OnAwake()
 {
     m_Container = new GameObject("Background Distractors");
     m_Container.transform.parent = scenario.transform;
     m_GameObjectOneWayCache      = new GameObjectOneWayCache(m_Container.transform,
                                                              prefabs.categories.Select((element) => element.Item1).ToArray());
 }
 /// <inheritdoc/>
 protected override void OnCreate()
 {
     m_Container = new GameObject("Foreground Objects");
     m_Container.transform.parent = scenario.transform;
     m_GameObjectOneWayCache      = new GameObjectOneWayCache(
         m_Container.transform, prefabs.categories.Select(element => element.Item1).ToArray());
 }
        protected override void OnAwake()
        {
            m_SpawnedObjects = new List <GameObject>();
            m_Container      = new GameObject("Foreground Objects");
            var transform = scenario.transform;

            m_Container.transform.parent = transform;
            m_GameObjectOneWayCache      = new GameObjectOneWayCache(m_Container.transform, prefabs.categories.Select(element => element.Item1).ToArray());
        }
Exemple #5
0
    protected void Initialize()
    {
        m_Rand            = new Random(2);
        m_CurriculumQuery = EntityManager.CreateEntityQuery(typeof(CurriculumState));

        const string globalInitParamsName      = "Management";
        var          globalInitParamsContainer = GameObject.Find(globalInitParamsName);

        if (globalInitParamsContainer == null)
        {
            Debug.Log($"Cannot find a {globalInitParamsName} object to init parameters from.");
            return;
        }

        var init = globalInitParamsContainer.GetComponent <ProjectInitialization>();

        m_AppParams = init.AppParameters;
        var perceptionCamera = init.PerceptionCamera;

        camera             = perceptionCamera.GetComponentInParent <Camera>();
        m_ForegroundCenter =
            camera.transform.position + m_CameraForward * ForegroundObjectPlacer.k_ForegroundLayerDistance;
        // Compute the bottom left corner of the view frustum
        // IMPORTANT: We're assuming the camera is facing along the positive z-axis
        container = new GameObject("BackgroundContainer");
        container.transform.SetPositionAndRotation(
            m_CameraForward * k_PlacementDistance + camera.transform.position,
            Quaternion.identity);
        var statics = EntityManager.GetComponentObject <PlacementStatics>(m_CurriculumQuery.GetSingletonEntity());

        objectCache = new GameObjectOneWayCache(container.transform, statics.BackgroundPrefabs);

        backgroundHueMaxOffset = init.AppParameters.BackgroundHueMaxOffset;
        initialized            = true;

        m_ScaleRangeMetric = DatasetCapture.RegisterMetricDefinition("background scale range", "The range of scale factors used to place background objects each frame", k_BackgroundScaleMetricId);
    }
    protected override JobHandle OnUpdate(JobHandle inputDeps)
    {
        if (m_CameraContainer == null)
        {
            m_CameraContainer = GameObject.Find("MainCamera");
            if (m_CameraContainer == null)
            {
                return(inputDeps);
            }
            var tfCamera = m_CameraContainer.transform;
            m_ParentForeground.transform.SetPositionAndRotation(
                tfCamera.position + tfCamera.forward * k_ForegroundLayerDistance, Quaternion.identity);
            m_ParentBackgroundInForeground.transform.SetPositionAndRotation(
                tfCamera.position + tfCamera.forward * k_ForegroundLayerDistance, Quaternion.identity);
            m_ParentOccluding.transform.SetPositionAndRotation(
                tfCamera.position + tfCamera.forward * k_OccludingLayerDistance, Quaternion.identity);
        }

        using (s_ClearGameObjects.Auto())
        {
            for (var i = 0; i < m_ParentForeground.transform.childCount; i++)
            {
                var gameObject = m_ParentForeground.transform.GetChild(i).gameObject;
                ObjectPlacementUtilities.SetMeshRenderersEnabledRecursive(gameObject, false);
            }
        }

        var singletonEntity = m_CurriculumQuery.GetSingletonEntity();
        var curriculumState = EntityManager.GetComponentData <CurriculumState>(singletonEntity);
        var statics         = EntityManager.GetComponentObject <PlacementStatics>(singletonEntity);

        if (statics.ForegroundPrefabs == null || statics.ForegroundPrefabs.Length == 0)
        {
            return(inputDeps);
        }
        if (statics.BackgroundPrefabs == null || statics.BackgroundPrefabs.Length == 0)
        {
            return(inputDeps);
        }

        if (curriculumState.ScaleIndex >= statics.ScaleFactors.Length)
        {
            return(inputDeps);
        }

        var perceptionCamera = m_CameraContainer.GetComponent <PerceptionCamera>();

        if (perceptionCamera != null)
        {
            perceptionCamera.SetPersistentSensorData("scale", statics.ScaleFactors[curriculumState.ScaleIndex]);
        }

        var camera = m_CameraContainer.GetComponent <Camera>();
        NativeList <PlacedObject> placedObjectBoundingBoxes;
        var occludingObjects      = statics.BackgroundPrefabs;
        var occludingObjectBounds = ComputeObjectBounds(occludingObjects);

        if (m_OccludingObjectCache == null)
        {
            m_OccludingObjectCache = new GameObjectOneWayCache(m_ParentOccluding.transform, occludingObjects);
        }
        if (m_BackgroundInForegroundObjectCache == null)
        {
            m_BackgroundInForegroundObjectCache = new GameObjectOneWayCache(m_ParentBackgroundInForeground.transform, occludingObjects);
        }

        m_OccludingObjectCache.ResetAllObjects();
        m_BackgroundInForegroundObjectCache.ResetAllObjects();

        using (s_PlaceObjects.Auto())
            placedObjectBoundingBoxes = PlaceObjects(camera, statics, occludingObjectBounds, ref curriculumState);

        ReportObjectStats(statics, placedObjectBoundingBoxes, m_CameraContainer);

        using (s_PlaceOccludingObjects.Auto())
        {
            PlaceOccludingObjects(occludingObjects, occludingObjectBounds, camera, statics, placedObjectBoundingBoxes);
        }

        EntityManager.SetComponentData(singletonEntity, curriculumState);

        placedObjectBoundingBoxes.Dispose();

        return(inputDeps);
    }