Пример #1
0
        public override unsafe void OnAttachedToNode(Node node)
        {
            CameraTexture = new Texture2D();
            CameraTexture.SetCustomTarget(GL_TEXTURE_EXTERNAL_OES);
            CameraTexture.SetNumLevels(1);
            CameraTexture.FilterMode = TextureFilterMode.Bilinear;
            CameraTexture.SetAddressMode(TextureCoordinate.U, TextureAddressMode.Clamp);
            CameraTexture.SetAddressMode(TextureCoordinate.V, TextureAddressMode.Clamp);
            CameraTexture.SetSize(Application.Graphics.Width, Application.Graphics.Height, Graphics.Float32Format, TextureUsage.Dynamic);
            CameraTexture.Name = nameof(CameraTexture);
            Application.ResourceCache.AddManualResource(CameraTexture);

            Viewport = Application.Renderer.GetViewport(0);

            var videoRp = new RenderPathCommand(RenderCommandType.Quad);

            videoRp.PixelShaderName  = (UrhoString)"ARCore";            //see CoreData/Shaders/GLSL/ARCore.glsl
            videoRp.VertexShaderName = (UrhoString)"ARCore";
            videoRp.SetOutput(0, "viewport");
            videoRp.SetTextureName(TextureUnit.Diffuse, CameraTexture.Name);
            Viewport.RenderPath.InsertCommand(1, videoRp);

            var activity = (Activity)Urho.Application.CurrentWindow.Target;

            activity.RunOnUiThread(() =>
            {
                var cameraAllowed = activity.CheckSelfPermission(Manifest.Permission.Camera);
                if (cameraAllowed != Permission.Granted)
                {
                    throw new InvalidOperationException("Camera permission: Denied");
                }

                var session = new Session(activity);
                session.SetCameraTextureName((int)CameraTexture.AsGPUObject().GPUObjectName);
                session.SetDisplayGeometry((int)SurfaceOrientation.Rotation0 /*windowManager.DefaultDisplay.Rotation*/,
                                           Application.Graphics.Width, Application.Graphics.Height);

                Config = new Config(session);
                Config.SetLightEstimationMode(Config.LightEstimationMode.AmbientIntensity);
                //Config.SetUpdateMode(Config.UpdateMode.LatestCameraImage);
                Config.SetPlaneFindingMode(Config.PlaneFindingMode.Horizontal);
                ConfigRequested?.Invoke(Config);
                if (!session.IsSupported(Config))
                {
                    throw new Exception("AR is not supported on this device with given config");
                }

                paused = false;
                session.Resume();
                Session = session;
            });

            Application.Paused  += OnPause;
            Application.Resumed += OnResume;
        }
Пример #2
0
        public override unsafe void OnAttachedToNode(Node node)
        {
            CameraTexture = new Texture2D();
            CameraTexture.SetCustomTarget(GL_TEXTURE_EXTERNAL_OES);
            CameraTexture.SetNumLevels(1);
            CameraTexture.FilterMode = TextureFilterMode.Bilinear;
            CameraTexture.SetAddressMode(TextureCoordinate.U, TextureAddressMode.Clamp);
            CameraTexture.SetAddressMode(TextureCoordinate.V, TextureAddressMode.Clamp);
            CameraTexture.SetSize(Application.Graphics.Width, Application.Graphics.Height, Graphics.Float32Format, TextureUsage.Dynamic);
            CameraTexture.Name = nameof(CameraTexture);
            Application.ResourceCache.AddManualResource(CameraTexture);

            Viewport = Application.Renderer.GetViewport(0);

            var videoRp = new RenderPathCommand(RenderCommandType.Quad);

            videoRp.PixelShaderName  = (UrhoString)"ARCore";
            videoRp.VertexShaderName = (UrhoString)"ARCore";
            videoRp.SetOutput(0, "viewport");
            videoRp.SetTextureName(TextureUnit.Diffuse, CameraTexture.Name);
            Viewport.RenderPath.InsertCommand(1, videoRp);

            var activity = (Activity)Urho.Application.CurrentWindow.Target;

            activity.RunOnUiThread(() =>
            {
                var session = new Session(activity);
                session.SetCameraTextureName((int)CameraTexture.AsGPUObject().GPUObjectName);
                session.SetDisplayGeometry(Application.Graphics.Width, Application.Graphics.Height);

                if (Config == null)
                {
                    Config = Config.CreateDefaultConfig();
                    Config.SetLightingMode(Config.LightingMode.AmbientIntensity);
                    //Config.SetUpdateMode(Config.UpdateMode.LatestCameraImage);
                    Config.SetPlaneFindingMode(Config.PlaneFindingMode.Horizontal);
                }
                paused = false;
                //TODO: check Camera permissions?
                session.Resume(Config);
                Session = session;
            });

            Application.Paused  += OnPause;
            Application.Resumed += OnResume;
        }
Пример #3
0
        public Task Run(Camera camera = null)
        {
            if (CameraTexture != null)
            {
                throw new InvalidOperationException("ARCore component is already initialized, if you want to re-configure ARCore session - use Session property.");
            }

            Camera = camera;
            if (Camera == null)
            {
                Camera = base.Scene.GetComponent <Camera>(true);
            }

            if (Camera == null)
            {
                throw new InvalidOperationException("Camera component was not found.");
            }

            CameraTexture = new Texture2D();
            CameraTexture.SetCustomTarget(GL_TEXTURE_EXTERNAL_OES);
            CameraTexture.SetNumLevels(1);
            CameraTexture.FilterMode = TextureFilterMode.Bilinear;
            CameraTexture.SetAddressMode(TextureCoordinate.U, TextureAddressMode.Clamp);
            CameraTexture.SetAddressMode(TextureCoordinate.V, TextureAddressMode.Clamp);
            CameraTexture.SetSize(Application.Graphics.Width, Application.Graphics.Height, Graphics.Float32Format, TextureUsage.Dynamic);
            CameraTexture.Name = nameof(CameraTexture);
            Application.ResourceCache.AddManualResource(CameraTexture);

            Viewport = Application.Renderer.GetViewport(0);

            if (base.Application is SimpleApplication simpleApp)
            {
                simpleApp.MoveCamera = false;
            }

            var videoRp = new RenderPathCommand(RenderCommandType.Quad);

            videoRp.PixelShaderName  = (UrhoString)ARCoreShader;            //see CoreData/Shaders/GLSL/ARCore.glsl
            videoRp.VertexShaderName = (UrhoString)ARCoreShader;
            videoRp.SetOutput(0, "viewport");
            videoRp.SetTextureName(TextureUnit.Diffuse, CameraTexture.Name);
            Viewport.RenderPath.InsertCommand(1, videoRp);

            var tcs      = new TaskCompletionSource <bool>();
            var activity = (Activity)Urho.Application.CurrentWindow.Target;

            activity.RunOnUiThread(() =>
            {
                var cameraAllowed = activity.CheckSelfPermission(Manifest.Permission.Camera);
                if (cameraAllowed != Permission.Granted)
                {
                    throw new InvalidOperationException("Camera permission: Denied");
                }

                var session = new Session(activity);
                session.SetCameraTextureName((int)CameraTexture.AsGPUObject().GPUObjectName);
                session.SetDisplayGeometry((int)SurfaceOrientation.Rotation0 /*windowManager.DefaultDisplay.Rotation*/,
                                           Application.Graphics.Width, Application.Graphics.Height);

                Config = new Config(session);
                Config.SetLightEstimationMode(Config.LightEstimationMode.AmbientIntensity);
                Config.SetUpdateMode(Config.UpdateMode.LatestCameraImage);
                Config.SetPlaneFindingMode(Config.PlaneFindingMode.Horizontal);
                ConfigRequested?.Invoke(Config);

                if (!session.IsSupported(Config))
                {
                    throw new Exception("AR is not supported on this device with given config");
                }
                session.Configure(Config);

                paused = false;
                session.Resume();
                Session = session;
                Urho.Application.InvokeOnMain(() => tcs.TrySetResult(true));
            });
            return(tcs.Task);
        }