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()); }
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); }