Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }