public IEnumerator SegmentationPassProducesCorrectValuesEachFrame( [Values(SegmentationKind.Instance, SegmentationKind.Semantic)] SegmentationKind segmentationKind) { int timesSegmentationImageReceived = 0; Dictionary <int, object> expectedLabelAtFrame = null; //TestHelper.LoadAndStartRenderDocCapture(out var gameView); void OnSegmentationImageReceived <T>(int frameCount, NativeArray <T> data, RenderTexture tex) where T : struct { if (expectedLabelAtFrame == null || !expectedLabelAtFrame.ContainsKey(frameCount)) { return; } timesSegmentationImageReceived++; Debug.Log($"Segmentation image received. FrameCount: {frameCount}"); try { CollectionAssert.AreEqual(Enumerable.Repeat(expectedLabelAtFrame[frameCount], data.Length), data.ToArray()); } // ReSharper disable once RedundantCatchClause catch (Exception) { //uncomment to get RenderDoc captures while this check is failing //UnityEditorInternal.RenderDoc.EndCaptureRenderDoc(gameView); throw; } } var cameraObject = segmentationKind == SegmentationKind.Instance ? SetupCameraInstanceSegmentation(OnSegmentationImageReceived) : SetupCameraSemanticSegmentation((a) => OnSegmentationImageReceived(a.frameCount, a.data, a.sourceTexture), false); //object expectedPixelValue = segmentationKind == SegmentationKind.Instance ? (object) new Color32(0, 74, 255, 255) : k_SemanticPixelValue; var expectedPixelValue = segmentationKind == SegmentationKind.Instance ? (object)k_InstanceSegmentationPixelValue : k_SemanticPixelValue; expectedLabelAtFrame = new Dictionary <int, object> { { Time.frameCount, expectedPixelValue }, { Time.frameCount + 1, expectedPixelValue }, { Time.frameCount + 2, expectedPixelValue } }; GameObject planeObject; //Put a plane in front of the camera planeObject = TestHelper.CreateLabeledPlane(); yield return(null); //UnityEditorInternal.RenderDoc.EndCaptureRenderDoc(gameView); Object.DestroyImmediate(planeObject); planeObject = TestHelper.CreateLabeledPlane(); //TestHelper.LoadAndStartRenderDocCapture(out gameView); yield return(null); //UnityEditorInternal.RenderDoc.EndCaptureRenderDoc(gameView); Object.DestroyImmediate(planeObject); planeObject = TestHelper.CreateLabeledPlane(); yield return(null); Object.DestroyImmediate(planeObject); yield return(null); //destroy the object to force all pending segmented image readbacks to finish and events to be fired. DestroyTestObject(cameraObject); Assert.AreEqual(3, timesSegmentationImageReceived); }
public IEnumerator SegmentationPassTestsWithEnumeratorPasses( [Values(RendererType.MeshRenderer, RendererType.SkinnedMeshRenderer, RendererType.Terrain)] RendererType rendererType, [Values(SegmentationKind.Instance, SegmentationKind.Semantic)] SegmentationKind segmentationKind) { int timesSegmentationImageReceived = 0; int? frameStart = null; GameObject cameraObject = null; object expectedPixelValue; void OnSegmentationImageReceived <T>(int frameCount, NativeArray <T> data, RenderTexture tex) where T : struct { if (frameStart == null || frameStart > frameCount) { return; } timesSegmentationImageReceived++; CollectionAssert.AreEqual(Enumerable.Repeat(expectedPixelValue, data.Length), data.ToArray()); } switch (segmentationKind) { case SegmentationKind.Instance: expectedPixelValue = k_InstanceSegmentationPixelValue; cameraObject = SetupCameraInstanceSegmentation(OnSegmentationImageReceived); break; case SegmentationKind.Semantic: expectedPixelValue = k_SemanticPixelValue; cameraObject = SetupCameraSemanticSegmentation(a => OnSegmentationImageReceived(a.frameCount, a.data, a.sourceTexture), false); break; } //Put a plane in front of the camera GameObject planeObject; if (rendererType == RendererType.Terrain) { var terrainData = new TerrainData(); AddTestObjectForCleanup(terrainData); //look down because terrains cannot be rotated cameraObject.transform.rotation = Quaternion.LookRotation(Vector3.down, Vector3.forward); planeObject = Terrain.CreateTerrainGameObject(terrainData); planeObject.transform.SetPositionAndRotation(new Vector3(-10, -10, -10), Quaternion.identity); } else { planeObject = GameObject.CreatePrimitive(PrimitiveType.Plane); if (rendererType == RendererType.SkinnedMeshRenderer) { var oldObject = planeObject; planeObject = new GameObject(); var meshFilter = oldObject.GetComponent <MeshFilter>(); var meshRenderer = oldObject.GetComponent <MeshRenderer>(); var skinnedMeshRenderer = planeObject.AddComponent <SkinnedMeshRenderer>(); skinnedMeshRenderer.sharedMesh = meshFilter.sharedMesh; skinnedMeshRenderer.material = meshRenderer.material; Object.DestroyImmediate(oldObject); } planeObject.transform.SetPositionAndRotation(new Vector3(0, 0, 10), Quaternion.Euler(90, 0, 0)); planeObject.transform.localScale = new Vector3(10, -1, 10); } var labeling = planeObject.AddComponent <Labeling>(); labeling.labels.Add("label"); frameStart = Time.frameCount; AddTestObjectForCleanup(planeObject); yield return(null); yield return(null); yield return(null); yield return(null); //destroy the object to force all pending segmented image readbacks to finish and events to be fired. DestroyTestObject(cameraObject); DestroyTestObject(planeObject); Assert.AreEqual(4, timesSegmentationImageReceived); }
public IEnumerator SegmentationPassTestsWithEnumeratorPasses( [Values(false, true)] bool useSkinnedMeshRenderer, [Values(SegmentationKind.Instance, SegmentationKind.Semantic)] SegmentationKind segmentationKind) { int timesSegmentationImageReceived = 0; int? frameStart = null; GameObject cameraObject = null; object expectedPixelValue; void OnSegmentationImageReceived <T>(int frameCount, NativeArray <T> data, RenderTexture tex) where T : struct { if (frameStart == null || frameStart > frameCount) { return; } timesSegmentationImageReceived++; CollectionAssert.AreEqual(Enumerable.Repeat(expectedPixelValue, data.Length), data); } switch (segmentationKind) { case SegmentationKind.Instance: expectedPixelValue = 1; cameraObject = SetupCameraInstanceSegmentation(OnSegmentationImageReceived); break; case SegmentationKind.Semantic: expectedPixelValue = k_SemanticPixelValue; cameraObject = SetupCameraSemanticSegmentation(a => OnSegmentationImageReceived(a.frameCount, a.data, a.sourceTexture), false); break; } // // // Arbitrary wait for 5 frames for shaders to load. Workaround for issue with Shader.WarmupAllShaders() // for (int i=0 ; i<5 ; ++i) // yield return new WaitForSeconds(1); frameStart = Time.frameCount; //Put a plane in front of the camera var planeObject = GameObject.CreatePrimitive(PrimitiveType.Plane); if (useSkinnedMeshRenderer) { var oldObject = planeObject; planeObject = new GameObject(); var meshFilter = oldObject.GetComponent <MeshFilter>(); var meshRenderer = oldObject.GetComponent <MeshRenderer>(); var skinnedMeshRenderer = planeObject.AddComponent <SkinnedMeshRenderer>(); skinnedMeshRenderer.sharedMesh = meshFilter.sharedMesh; skinnedMeshRenderer.material = meshRenderer.material; Object.DestroyImmediate(oldObject); } planeObject.transform.SetPositionAndRotation(new Vector3(0, 0, 10), Quaternion.Euler(90, 0, 0)); planeObject.transform.localScale = new Vector3(10, -1, 10); var labeling = planeObject.AddComponent <Labeling>(); labeling.labels.Add("label"); AddTestObjectForCleanup(planeObject); yield return(null); yield return(null); yield return(null); yield return(null); //destroy the object to force all pending segmented image readbacks to finish and events to be fired. DestroyTestObject(cameraObject); DestroyTestObject(planeObject); Assert.AreEqual(4, timesSegmentationImageReceived); }