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