diff --git a/src/ElectronBot.Braincase/App.xaml.cs b/src/ElectronBot.Braincase/App.xaml.cs index 656841b..4cfc411 100644 --- a/src/ElectronBot.Braincase/App.xaml.cs +++ b/src/ElectronBot.Braincase/App.xaml.cs @@ -140,6 +140,9 @@ public partial class App : Application services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddTransient(); diff --git a/src/ElectronBot.Braincase/Assets/Cubemap_Grandcanyon.dds b/src/ElectronBot.Braincase/Assets/Cubemap_Grandcanyon.dds new file mode 100644 index 0000000..0e16050 Binary files /dev/null and b/src/ElectronBot.Braincase/Assets/Cubemap_Grandcanyon.dds differ diff --git a/src/ElectronBot.Braincase/ElectronBot.Braincase.csproj b/src/ElectronBot.Braincase/ElectronBot.Braincase.csproj index 31c6db1..ed58621 100644 --- a/src/ElectronBot.Braincase/ElectronBot.Braincase.csproj +++ b/src/ElectronBot.Braincase/ElectronBot.Braincase.csproj @@ -36,6 +36,7 @@ + @@ -82,6 +83,7 @@ + @@ -171,6 +173,9 @@ + + PreserveNewest + PreserveNewest @@ -215,6 +220,9 @@ PreserveNewest + + MSBuild:Compile + MSBuild:Compile diff --git a/src/ElectronBot.Braincase/Helpers/ElectronBotHelper.cs b/src/ElectronBot.Braincase/Helpers/ElectronBotHelper.cs index cc2d5dd..bd77e61 100644 --- a/src/ElectronBot.Braincase/Helpers/ElectronBotHelper.cs +++ b/src/ElectronBot.Braincase/Helpers/ElectronBotHelper.cs @@ -29,6 +29,36 @@ public class ElectronBotHelper get; set; } = false; + public bool RightLock + { + get; + set; + } + + public bool LeftLock + { + get; + set; + } + + public bool LandLock + { + get; + set; + } + + public bool UpLock + { + get; + set; + } + + public bool ForwardLock + { + get; + set; + } + private static ElectronBotHelper? _instance; public static ElectronBotHelper Instance => _instance ??= new ElectronBotHelper(); diff --git a/src/ElectronBot.Braincase/Services/PageService.cs b/src/ElectronBot.Braincase/Services/PageService.cs index f19f8ef..8b8e1c7 100644 --- a/src/ElectronBot.Braincase/Services/PageService.cs +++ b/src/ElectronBot.Braincase/Services/PageService.cs @@ -5,6 +5,7 @@ using ElectronBot.Braincase.ViewModels; using ElectronBot.Braincase.Views; using Microsoft.UI.Xaml.Controls; +using ViewModels; using Views; namespace ElectronBot.Braincase.Services; @@ -24,6 +25,7 @@ public class PageService : IPageService Configure(); Configure(); Configure(); + Configure(); } public Type GetPageType(string key) diff --git a/src/ElectronBot.Braincase/Strings/en-us/Resources.resw b/src/ElectronBot.Braincase/Strings/en-us/Resources.resw index 45c9400..75e394d 100644 --- a/src/ElectronBot.Braincase/Strings/en-us/Resources.resw +++ b/src/ElectronBot.Braincase/Strings/en-us/Resources.resw @@ -717,4 +717,7 @@ Turn off the robot action first + + Gesture interaction + \ No newline at end of file diff --git a/src/ElectronBot.Braincase/Strings/ko-kr/Resources.resw b/src/ElectronBot.Braincase/Strings/ko-kr/Resources.resw index 6c80c6d..f7ab2f0 100644 --- a/src/ElectronBot.Braincase/Strings/ko-kr/Resources.resw +++ b/src/ElectronBot.Braincase/Strings/ko-kr/Resources.resw @@ -714,4 +714,7 @@ 로봇 작업 우선 순위 끄기 + + 제스처 상호 작용 + \ No newline at end of file diff --git a/src/ElectronBot.Braincase/Strings/zh-cn/Resources.resw b/src/ElectronBot.Braincase/Strings/zh-cn/Resources.resw index aedadc5..2e4f095 100644 --- a/src/ElectronBot.Braincase/Strings/zh-cn/Resources.resw +++ b/src/ElectronBot.Braincase/Strings/zh-cn/Resources.resw @@ -714,4 +714,7 @@ 关闭机器人动作优先 + + 手势互动 + \ No newline at end of file diff --git a/src/ElectronBot.Braincase/ViewModels/GestureInteractionViewModel.cs b/src/ElectronBot.Braincase/ViewModels/GestureInteractionViewModel.cs new file mode 100644 index 0000000..cd5b6ca --- /dev/null +++ b/src/ElectronBot.Braincase/ViewModels/GestureInteractionViewModel.cs @@ -0,0 +1,748 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Text; +using Windows.ApplicationModel; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Controls.CompactOverlay; +using ElectronBot.Braincase; +using ElectronBot.Braincase.Helpers; +using HelixToolkit.SharpDX.Core; +using HelixToolkit.WinUI; +using Microsoft.UI.Windowing; +using Microsoft.UI.Xaml; +using Models; +using SharpDX; +using Assimp; +using HelixToolkit.SharpDX.Core.Assimp; +using HelixToolkit.SharpDX.Core.Model.Scene; +using Microsoft.UI.Xaml.Media; +using BoundingBox = SharpDX.BoundingBox; +using Camera = HelixToolkit.WinUI.Camera; +using Matrix = SharpDX.Matrix; +using Microsoft.UI.Xaml.Controls; +using ElectronBot.Braincase.Services; +using Services; +using System.Diagnostics; +using Windows.Graphics.Imaging; +using Mediapipe.Net.Solutions; +using Microsoft.UI; +using Constants = ElectronBot.Braincase.Constants; + +namespace ElectronBot.Braincase.ViewModels; +public partial class GestureInteractionViewModel : ObservableRecipient +{ + public IEffectsManager EffectsManager + { + get; + } + + public SceneNodeGroupModel3D BodyModel + { + get; + } = new SceneNodeGroupModel3D(); + + public SceneNodeGroupModel3D LeftArmModel + { + get; + } = new SceneNodeGroupModel3D(); + + public SceneNodeGroupModel3D RightArmModel + { + get; + } = new SceneNodeGroupModel3D(); + + public SceneNodeGroupModel3D HeadModel + { + get; + } = new SceneNodeGroupModel3D(); + + public SceneNodeGroupModel3D BaseModel + { + get; + } = new SceneNodeGroupModel3D(); + + public DiffuseMaterial Material + { + private set; + get; + } + + [ObservableProperty] bool _showAxis = true; + + [ObservableProperty] + private Vector3 _modelCentroidPoint = default; + + [ObservableProperty] + private Vector3 _headModelCentroidPoint = default; + + [ObservableProperty] + private bool _showWireframe = false; + [ObservableProperty] + private BoundingBox _rightShoulderBoundingBox = default; + + [ObservableProperty] + private BoundingBox _leftShoulderBoundingBox = default; + + [ObservableProperty] + private BoundingBox _bodyBoundingBox = default; + + [ObservableProperty] + private BoundingBox _headBoundingBox = default; + + [ObservableProperty] + private BoundingBox _baseBoundingBox = default; + + private Matrix _bodyMt = default; + + private Matrix _leftArmMt = default; + + private Matrix _rightArmMt = default; + + private Matrix _headMt = default; + + private Matrix _baseMt = default; + + [ObservableProperty] private TextureModel _environmentMap; + + private bool _isInitialized = false; + + private readonly Importer _importer = new(); + + private readonly DiffuseMaterial _pinkModelMaterial = new() + { + Name = "Pink", + DiffuseColor = Color.LightPink// DiffuseMaterials.ToColor(255, 192, 203, 1.0), + }; + + [ObservableProperty] private SolidColorBrush _cameraBackground = new(Colors.Red); + + [ObservableProperty] + private Image _faceImage = new(); + + private static HandsCpuSolution? calculator; + public Camera Camera + { + get; + } = new OrthographicCamera() { NearPlaneDistance = 1e-2, FarPlaneDistance = 1e4 }; + + public GestureInteractionViewModel(IEffectsManager effectsManager) + { + EffectsManager = effectsManager; + + Material = new DiffuseMaterial() + { + EnableUnLit = false, + DiffuseMap = LoadTexture("eyes-closed.png") + }; + + calculator = new HandsCpuSolution(); + + var filePath = Package.Current.InstalledLocation.Path + "\\Assets\\Cubemap_Grandcanyon.dds"; + + EnvironmentMap = LoadTextureByFullPath(filePath); + } + + [RelayCommand] + public void PlayAction() + { + var playEmojisLock = ElectronBotHelper.Instance.PlayEmojisLock; + + if (!playEmojisLock) + { + //随机播放表情 + ElectronBotHelper.Instance.ToPlayEmojisRandom(); + } + + ElectronBotHelper.Instance.PlayEmojisLock = true; + } + + [ObservableProperty] + private string _resultLabel; + + [ObservableProperty] private Stack _menuStack = new(); + + private int _firstMenuIndex = 0; + + private int _secondMenuIndex = 0; + + private bool _isFirstMenu = true; + + [ObservableProperty] + private List _firstMenu = new() + { + "ClockMode", + "EmojisMode", + }; + + [ObservableProperty] + private Dictionary> _secondMenu = new() + { + {"ClockMode", new List() + { + "DefautView", + "LongShadowView", + "GooeyFooter", + "GradientsWithBlend", + "CustomView", + } }, + { "EmojisMode", new List() + { + "anger", + "disdain", + "excited", + "fear", + "sad", + } }, + }; + + [ObservableProperty] private string _firstMenuSelected; + + [ObservableProperty] private string _secondMenuSelected; + + private readonly string _modelPath = Package.Current.InstalledLocation.Path + $"\\Assets\\MLModel1.zip"; + + [RelayCommand] + public async void Loaded() + { + App.MainWindow.DispatcherQueue.TryEnqueue(async () => + { + try + { + var body = new List() + { + "Body1.obj", + "Body2.obj", + }; + + var head = new List() + { + "Head1.obj", + "Head2.obj", + "Head3.obj", + }; + + var leftArm = new List() + { + "LeftArm1.obj", + "LeftArm2.obj", + "LeftShoulder.obj", + }; + + var rightArm = new List() + { + "RightArm1.obj", + "RightArm2.obj", + "RightShoulder.obj" + }; + + + var baseBody = new List() + { + "Base.obj", + }; + + foreach (var modelName in head) + { + var modelPath = Package.Current.InstalledLocation.Path + $"\\Assets\\ElectronBotModel\\{modelName}"; + + var newScene = _importer.Load(modelPath); + + if (newScene != null && newScene.Root != null) + { + // Pre-attach and calculate all scene info in a separate task. + newScene.Root.Attach(EffectsManager); + + newScene.Root.UpdateAllTransformMatrix(); + + HeadModel.AddNode(newScene.Root); + + _headMt = HeadModel.HxTransform3D; + + if (modelName == "Head3.obj") + { + foreach (var node in newScene.Root.Traverse()) + { + if (node is MeshNode meshNode) + { + // this is face + meshNode.Material = Material; + } + } + } + else if (modelName == "Head1.obj") + { + if (newScene.Root.TryGetCentroid(out var centroid)) + { + // Must use UI thread to set value back. + HeadModelCentroidPoint = centroid; + } + + foreach (var node in newScene.Root.Traverse()) + { + if (node is MeshNode meshNode) + { + meshNode.Material = _pinkModelMaterial; + } + } + } + else if (modelName == "Head2.obj") + { + foreach (var node in newScene.Root.Traverse()) + { + if (node is MeshNode meshNode) + { + meshNode.Material = DiffuseMaterials.PureWhite; + } + } + } + } + } + + + foreach (var modelName in body) + { + var modelPath = Package.Current.InstalledLocation.Path + $"\\Assets\\ElectronBotModel\\{modelName}"; + + var newScene = _importer.Load(modelPath); + + if (newScene != null && newScene.Root != null) + { + // Pre-attach and calculate all scene info in a separate task. + newScene.Root.Attach(EffectsManager); + newScene.Root.UpdateAllTransformMatrix(); + + BodyModel.AddNode(newScene.Root); + + _bodyMt = BodyModel.HxTransform3D; + + if (modelName == "Body2.obj") + { + if (newScene.Root.TryGetCentroid(out var centroid)) + { + // Must use UI thread to set value back. + ModelCentroidPoint = centroid; + } + + foreach (var node in newScene.Root.Traverse()) + { + if (node is MeshNode meshNode) + { + meshNode.Material = DiffuseMaterials.PureWhite; + } + } + } + else if (modelName == "Body1.obj") + { + foreach (var node in newScene.Root.Traverse()) + { + if (node is MeshNode meshNode) + { + meshNode.Material = _pinkModelMaterial; + } + } + } + } + } + + foreach (var modelName in rightArm) + { + var modelPath = Package.Current.InstalledLocation.Path + $"\\Assets\\ElectronBotModel\\{modelName}"; + var newScene = _importer.Load(modelPath); + if (newScene != null && newScene.Root != null) + { + // Pre-attach and calculate all scene info in a separate task. + newScene.Root.Attach(EffectsManager); + newScene.Root.UpdateAllTransformMatrix(); + + RightArmModel.AddNode(newScene.Root); + + _rightArmMt = RightArmModel.HxTransform3D; + + if (newScene.Root.TryGetBound(out var bound)) + { + // Must use UI thread to set value back. + if (modelName == "RightShoulder.obj") + { + RightShoulderBoundingBox = bound; + } + + } + + if (modelName == "RightArm1.obj") + { + foreach (var node in newScene.Root.Traverse()) + { + if (node is MeshNode meshNode) + { + meshNode.Material = DiffuseMaterials.PureWhite; + } + } + } + else if (modelName == "RightArm2.obj") + { + foreach (var node in newScene.Root.Traverse()) + { + if (node is MeshNode meshNode) + { + meshNode.Material = _pinkModelMaterial; + } + } + } + } + } + + + foreach (var modelName in leftArm) + { + var modelPath = Package.Current.InstalledLocation.Path + $"\\Assets\\ElectronBotModel\\{modelName}"; + var newScene = _importer.Load(modelPath); + if (newScene != null && newScene.Root != null) + { + // Pre-attach and calculate all scene info in a separate task. + newScene.Root.Attach(EffectsManager); + newScene.Root.UpdateAllTransformMatrix(); + + LeftArmModel.AddNode(newScene.Root); + + _leftArmMt = LeftArmModel.HxTransform3D; + + if (newScene.Root.TryGetBound(out var bound)) + { + // Must use UI thread to set value back. + if (modelName == "LeftShoulder.obj") + { + LeftShoulderBoundingBox = bound; + } + + } + + if (modelName == "LeftArm1.obj") + { + foreach (var node in newScene.Root.Traverse()) + { + if (node is MeshNode meshNode) + { + meshNode.Material = DiffuseMaterials.PureWhite; + } + } + } + else if (modelName == "LeftArm2.obj") + { + foreach (var node in newScene.Root.Traverse()) + { + if (node is MeshNode meshNode) + { + meshNode.Material = _pinkModelMaterial; + } + } + } + } + } + + foreach (var modelName in baseBody) + { + var modelPath = Package.Current.InstalledLocation.Path + $"\\Assets\\ElectronBotModel\\{modelName}"; + var newScene = _importer.Load(modelPath); + if (newScene != null && newScene.Root != null) + { + // Pre-attach and calculate all scene info in a separate task. + newScene.Root.Attach(EffectsManager); + newScene.Root.UpdateAllTransformMatrix(); + + BaseModel.AddNode(newScene.Root); + + _baseMt = BaseModel.HxTransform3D; + + if (newScene.Root.TryGetBound(out var bound)) + { + // Must use UI thread to set value back. + if (modelName == "Base.obj") + { + BaseBoundingBox = bound; + } + + } + + if (modelName == "Base.obj") + { + foreach (var node in newScene.Root.Traverse()) + { + if (node is MeshNode meshNode) + { + meshNode.Material = DiffuseMaterials.PureWhite; + } + } + } + } + } + + FocusCameraToScene(); + + ElectronBotHelper.Instance.ModelActionFrame += Instance_ModelActionFrame; + + await InitAsync(); + } + catch (Exception) + { + ToastHelper.SendToast("模型加载失败", TimeSpan.FromSeconds(3)); + } + }); + } + + + private async Task InitAsync() + { + if (_isInitialized) + { + CameraFrameService.Current.SoftwareBitmapFrameCaptured -= Current_SoftwareBitmapFrameCaptured; + + CameraFrameService.Current.SoftwareBitmapFrameHandPredictResult -= Current_SoftwareBitmapFrameHandPredictResult; + await CameraFrameService.Current.CleanupMediaCaptureAsync(); + } + else + { + await InitializeScreenAsync(); + } + } + + private async Task InitializeScreenAsync() + { + await CameraFrameService.Current.PickNextMediaSourceWorkerAsync(FaceImage); + + CameraFrameService.Current.SoftwareBitmapFrameCaptured += Current_SoftwareBitmapFrameCaptured; + + CameraFrameService.Current.SoftwareBitmapFrameHandPredictResult += Current_SoftwareBitmapFrameHandPredictResult; + + _isInitialized = true; + + CameraBackground = new SolidColorBrush(Colors.Green); + } + + private void Current_SoftwareBitmapFrameHandPredictResult(object? sender, string e) + { + + App.MainWindow.DispatcherQueue.TryEnqueue(() => + { + ResultLabel = e; + + if (e == "right") + { + if (!ElectronBotHelper.Instance.RightLock) + { + ElectronBotHelper.Instance.RightLock = true; + ElectronBotHelper.Instance.LeftLock = false; + ElectronBotHelper.Instance.ForwardLock = false; + ElectronBotHelper.Instance.UpLock = false; + } + } + else if (e == "left") + { + if (!ElectronBotHelper.Instance.LeftLock) + { + ElectronBotHelper.Instance.LeftLock = true; + ElectronBotHelper.Instance.RightLock = false; + ElectronBotHelper.Instance.ForwardLock = false; + ElectronBotHelper.Instance.UpLock = false; + } + } + else if (e == "up") + { + if (!ElectronBotHelper.Instance.UpLock) + { + ElectronBotHelper.Instance.RightLock = false; + ElectronBotHelper.Instance.LeftLock = false; + ElectronBotHelper.Instance.ForwardLock = false; + ElectronBotHelper.Instance.UpLock = true; + } + + } + else if (e == "forward") + { + if (!ElectronBotHelper.Instance.ForwardLock) + { + ElectronBotHelper.Instance.RightLock = false; + ElectronBotHelper.Instance.LeftLock = false; + ElectronBotHelper.Instance.UpLock = false; + ElectronBotHelper.Instance.ForwardLock = true; + } + + } + }); + } + + private void Current_SoftwareBitmapFrameCaptured(object? sender, SoftwareBitmapEventArgs e) + { + if (e.SoftwareBitmap is not null) + { + + if (e.SoftwareBitmap.BitmapPixelFormat != BitmapPixelFormat.Bgra8 || + e.SoftwareBitmap.BitmapAlphaMode == BitmapAlphaMode.Straight) + { + e.SoftwareBitmap = SoftwareBitmap.Convert( + e.SoftwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied); + } + var service = App.GetService(); + + _ = service.HandPredictResultUnUseQueueAsync(calculator, _modelPath, e.SoftwareBitmap); + } + } + + public async void UnLoaded() + { + ElectronBotHelper.Instance.ModelActionFrame -= Instance_ModelActionFrame; + HeadModel.Dispose(); + BodyModel.Dispose(); + RightArmModel.Dispose(); + LeftArmModel.Dispose(); + BaseModel.Dispose(); + EffectsManager.Dispose(); + _importer.Dispose(); + + CameraFrameService.Current.SoftwareBitmapFrameCaptured -= Current_SoftwareBitmapFrameCaptured; + + CameraFrameService.Current.SoftwareBitmapFrameHandPredictResult -= Current_SoftwareBitmapFrameHandPredictResult; + var service = App.GetService(); + service.ClearQueue(); + await CleanUpAsync(); + } + + private void Instance_ModelActionFrame(object? sender, Verdure.ElectronBot.Core.Models.ModelActionFrame e) + { + App.MainWindow.DispatcherQueue.TryEnqueue(() => + { + BodyModel.HxTransform3D = _bodyMt * Matrix.RotationY(MathUtil.DegreesToRadians((e.J6))); + + Material = new DiffuseMaterial() + { + EnableUnLit = false, + DiffuseMap = LoadTextureByStream(e.FrameStream) + }; + + + var nodeList = HeadModel.GroupNode; + + foreach (var itemMode in nodeList.Items) + { + if (itemMode.Name == "Head3.obj") + { + foreach (var node in itemMode.Traverse()) + { + if (node is MeshNode meshNode) + { + meshNode.Material = Material; + } + } + } + } + + var rightList = RightShoulderBoundingBox.GetCorners(); + + var rightAverage = new SharpDX.Vector3( + (rightList[1].X + rightList[5].X) / 2f, + ((rightList[1].Y + rightList[5].Y) / 2f) - 8f, + (rightList[1].Z + rightList[5].Z) / 2f); + + var leftList = LeftShoulderBoundingBox.GetCorners(); + + var leftAverage = new SharpDX.Vector3( + (leftList[0].X + leftList[4].X) / 2f, + ((leftList[0].Y + leftList[4].Y) / 2f) - 8f, + (leftList[0].Z + leftList[4].Z) / 2f); + + var translationMatrix = Matrix.Translation(-rightAverage.X, -rightAverage.Y, -rightAverage.Z); + + var tr2 = _rightArmMt * translationMatrix; + + var tr3 = tr2 * Matrix.RotationZ(MathUtil.DegreesToRadians(-(e.J2))); + var tr4 = tr3 * Matrix.RotationX(MathUtil.DegreesToRadians(-(e.J3))); + + var tr5 = tr4 * Matrix.Translation(rightAverage.X, rightAverage.Y, rightAverage.Z); + + + var tr6 = tr5 * Matrix.RotationY(MathUtil.DegreesToRadians((e.J6))); + + RightArmModel.HxTransform3D = tr6; + + + var leftMatrix = Matrix.Translation(-leftAverage.X, -leftAverage.Y, -leftAverage.Z); + + var leftTr2 = _leftArmMt * leftMatrix; + + var leftTr3 = leftTr2 * Matrix.RotationZ(MathUtil.DegreesToRadians((e.J4))); + var leftTr4 = leftTr3 * Matrix.RotationX(MathUtil.DegreesToRadians(-(e.J5))); + + var leftTr5 = leftTr4 * Matrix.Translation(leftAverage.X, leftAverage.Y, leftAverage.Z); + + + var leftTr6 = leftTr5 * Matrix.RotationY(MathUtil.DegreesToRadians((e.J6))); + + LeftArmModel.HxTransform3D = leftTr6; + + var headMatrix = Matrix.Translation(-HeadModelCentroidPoint.X, -HeadModelCentroidPoint.Y, -HeadModelCentroidPoint.Z); + + var headTr2 = _headMt * headMatrix; + + var headTr3 = headTr2 * Matrix.RotationX(MathUtil.DegreesToRadians(-(e.J1))); + + var headTr4 = headTr3 * Matrix.Translation(HeadModelCentroidPoint.X, HeadModelCentroidPoint.Y, HeadModelCentroidPoint.Z); + + + var headTr5 = headTr4 * Matrix.RotationY(MathUtil.DegreesToRadians((e.J6))); + + HeadModel.HxTransform3D = headTr5; + }); + } + + private void FocusCameraToScene() + { + var maxWidth = Math.Max(Math.Max(RightShoulderBoundingBox.Width, RightShoulderBoundingBox.Height), BodyBoundingBox.Depth) + 240; + var pos = RightShoulderBoundingBox.Center + new Vector3(0, 0, maxWidth); + Camera.Position = pos; + Camera.LookDirection = RightShoulderBoundingBox.Center - pos; + Camera.UpDirection = Vector3.UnitY; + if (Camera is OrthographicCamera orthCam) + { + orthCam.Width = maxWidth; + } + } + + [RelayCommand] + public void CompactOverlay() + { + App.MainWindow.Show(); + } + + private TextureModel LoadTextureByFullPath(string filePath) + { + return TextureModel.Create(filePath); + } + + private TextureModel LoadTexture(string file) + { + var filePath = Package.Current.InstalledLocation.Path + $"\\Assets\\Emoji\\Pic\\{file}"; + + return TextureModel.Create(filePath); + } + + private TextureModel LoadTextureByStream(Stream data) + { + + return TextureModel.Create(data); + } + + private async Task CleanUpAsync() + { + try + { + _isInitialized = false; + + await CameraFrameService.Current.CleanupMediaCaptureAsync(); + } + catch (Exception) + { + + } + } +} \ No newline at end of file diff --git a/src/ElectronBot.Braincase/ViewModels/ModelLoadCompactOverlayViewModel.cs b/src/ElectronBot.Braincase/ViewModels/ModelLoadCompactOverlayViewModel.cs index 9139a3c..b9220a4 100644 --- a/src/ElectronBot.Braincase/ViewModels/ModelLoadCompactOverlayViewModel.cs +++ b/src/ElectronBot.Braincase/ViewModels/ModelLoadCompactOverlayViewModel.cs @@ -121,7 +121,7 @@ public partial class ModelLoadCompactOverlayViewModel : ObservableRecipient DiffuseMap = LoadTexture("eyes-closed.png") }; - var filePath = Package.Current.InstalledLocation.Path + "\\Assets\\model-backgroud.jpg"; + var filePath = Package.Current.InstalledLocation.Path + "\\Assets\\Cubemap_Grandcanyon.dds"; EnvironmentMap = LoadTextureByFullPath(filePath); } diff --git a/src/ElectronBot.Braincase/Views/CameraEmojisPage.xaml b/src/ElectronBot.Braincase/Views/CameraEmojisPage.xaml index 820caeb..fedd3ef 100644 --- a/src/ElectronBot.Braincase/Views/CameraEmojisPage.xaml +++ b/src/ElectronBot.Braincase/Views/CameraEmojisPage.xaml @@ -15,7 +15,7 @@ - + diff --git a/src/ElectronBot.Braincase/Views/GestureInteractionPage.xaml b/src/ElectronBot.Braincase/Views/GestureInteractionPage.xaml new file mode 100644 index 0000000..340245d --- /dev/null +++ b/src/ElectronBot.Braincase/Views/GestureInteractionPage.xaml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/ElectronBot.Braincase/Views/GestureInteractionPage.xaml.cs b/src/ElectronBot.Braincase/Views/GestureInteractionPage.xaml.cs new file mode 100644 index 0000000..5ffbb64 --- /dev/null +++ b/src/ElectronBot.Braincase/Views/GestureInteractionPage.xaml.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using ElectronBot.Braincase; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +using ViewModels; +using Windows.Foundation; +using Windows.Foundation.Collections; +using ElectronBot.Braincase.ViewModels; + +// To learn more about WinUI, the WinUI project structure, +// and more about our project templates, see: http://aka.ms/winui-project-info. + +namespace Views; +/// +/// An empty page that can be used on its own or navigated to within a Frame. +/// +public sealed partial class GestureInteractionPage : Page +{ + + public GestureInteractionViewModel ViewModel + { + get; + } + public GestureInteractionPage() + { + this.InitializeComponent(); + ViewModel = App.GetService(); + } + + private void ModelLoadCompactOverlayPage_OnLoaded(object sender, RoutedEventArgs e) + { + ModelProgressRing.IsActive = true; + ViewModel.Loaded(); + ModelProgressRing.IsActive = false; + } + + private async void ModelLoadCompactOverlayPage_OnUnloaded(object sender, RoutedEventArgs e) + { + ViewModel.UnLoaded(); + } +} diff --git a/src/ElectronBot.Braincase/Views/ShellPage.xaml b/src/ElectronBot.Braincase/Views/ShellPage.xaml index 0ea523d..994c720 100644 --- a/src/ElectronBot.Braincase/Views/ShellPage.xaml +++ b/src/ElectronBot.Braincase/Views/ShellPage.xaml @@ -66,6 +66,11 @@ + + + + +