浏览代码

Merge pull request #110 from Unity-Technologies/zxw/dev_ios_update_engine

Zxw/dev ios update engine
/siyaoH-1.17-PlatformMessage
GitHub 4 年前
当前提交
b548fa1e
共有 39 个文件被更改,包括 2252 次插入531 次删除
  1. 4
      Samples/UIWidgetsSamples_2019_4/Assets/Editor/EditorWindowSample/GalleryMain.cs
  2. 4
      Samples/UIWidgetsSamples_2019_4/Assets/Editor/EditorWindowSample/UIWidgetsEditorWindowSample.asmdef
  3. 52
      Samples/UIWidgetsSamples_2019_4/Assets/Scene/TextTest.unity
  4. 5
      Samples/UIWidgetsSamples_2019_4/Assets/UIWidgetsGallery/demo/material/backdrop_demo.cs
  5. 12
      Samples/UIWidgetsSamples_2019_4/Assets/UIWidgetsGallery/demo/material/search_demo.cs
  6. 5
      Samples/UIWidgetsSamples_2019_4/Assets/UIWidgetsGallery/gallery/backdrop.cs
  7. 14
      com.unity.uiwidgets/Runtime/engine/DisplayMetrics.cs
  8. 8
      com.unity.uiwidgets/Runtime/engine/UIWidgetsMessageManager.cs
  9. 4
      com.unity.uiwidgets/Runtime/engine2/UIWidgetsPanel.cs
  10. 4
      com.unity.uiwidgets/Runtime/engine2/UIWidgetsPanelWrapper.cs
  11. 34
      com.unity.uiwidgets/Runtime/material/animated_icons/animated_icons.cs
  12. 4
      com.unity.uiwidgets/Runtime/material/animated_icons/animated_icons_data.cs
  13. 261
      com.unity.uiwidgets/Runtime/material/animated_icons/data/add_event.g.cs
  14. 92
      com.unity.uiwidgets/Runtime/material/animated_icons/data/arrow_menu.g.cs
  15. 92
      com.unity.uiwidgets/Runtime/material/animated_icons/data/close_menu.g.cs
  16. 214
      com.unity.uiwidgets/Runtime/material/animated_icons/data/ellipsis_search.g.cs
  17. 260
      com.unity.uiwidgets/Runtime/material/animated_icons/data/event_add.g.cs
  18. 1
      com.unity.uiwidgets/Runtime/material/material_state.cs
  19. 10
      com.unity.uiwidgets/Runtime/services/keyboard.cs
  20. 4
      com.unity.uiwidgets/Runtime/services/text_input.cs
  21. 12
      com.unity.uiwidgets/Runtime/ui2/hooks.cs
  22. 257
      engine/Build.bee.cs
  23. 93
      engine/README.md
  24. 35
      engine/src/lib/ui/painting/color_filter.cc
  25. 8
      engine/src/shell/platform/unity/uiwidgets_system.h
  26. 26
      engine/src/external/ios/CustomAppController.m
  27. 106
      engine/src/shell/platform/unity/darwin/ios/cocoa_task_runner.cc
  28. 66
      engine/src/shell/platform/unity/darwin/ios/cocoa_task_runner.h
  29. 124
      engine/src/shell/platform/unity/darwin/ios/uiwidgets_panel.h
  30. 79
      engine/src/shell/platform/unity/darwin/ios/uiwidgets_system.h
  31. 106
      engine/src/shell/platform/unity/darwin/ios/uiwidgets_system.mm
  32. 54
      engine/src/shell/platform/unity/darwin/ios/unity_surface_manager.h
  33. 200
      engine/src/shell/platform/unity/darwin/ios/unity_surface_manager.mm
  34. 525
      engine/src/shell/platform/unity/darwin/ios/uiwidgets_panel.mm
  35. 8
      com.unity.uiwidgets/Runtime/Plugins.meta

4
Samples/UIWidgetsSamples_2019_4/Assets/Editor/EditorWindowSample/GalleryMain.cs


#if UNITY_EDITOR
using System.Collections.Generic;
using UIWidgetsGallery.gallery;
using Unity.UIWidgets.Editor;

ui_.runApp(new GalleryApp());
}
}
}
#endif
}

4
Samples/UIWidgetsSamples_2019_4/Assets/Editor/EditorWindowSample/UIWidgetsEditorWindowSample.asmdef


"UIWidgetsGallery"
],
"optionalUnityReferences": [],
"includePlatforms": [],
"includePlatforms": [
"Editor"
],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,

52
Samples/UIWidgetsSamples_2019_4/Assets/Scene/TextTest.unity


m_GameObject: {fileID: 847097468}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b7e1083a82b756840b36958a76a3e6f3, type: 3}
m_Script: {fileID: 11500000, guid: 9c5c86936ca864ae684720ddcd50d759, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}

m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Texture: {fileID: 0}
m_Texture: {fileID: 945944095}
m_UVRect:
serializedVersion: 2
x: 0

fonts:
- family: CupertinoIcons
fonts:
- asset: CupertinoIcons.ttf
weight: 0
fonts: []
--- !u!222 &847097471
CanvasRenderer:
m_ObjectHideFlags: 0

m_GameObject: {fileID: 847097468}
m_CullTransparentMesh: 0
--- !u!28 &945944095
Texture2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_ImageContentsHash:
serializedVersion: 2
Hash: 00000000000000000000000000000000
m_ForcedFallbackFormat: 4
m_DownscaleFallback: 0
serializedVersion: 2
m_Width: 0
m_Height: 0
m_CompleteImageSize: 0
m_TextureFormat: 0
m_MipCount: 1
m_IsReadable: 1
m_IgnoreMasterTextureLimit: 0
m_IsPreProcessed: 0
m_StreamingMipmaps: 0
m_StreamingMipmapsPriority: 0
m_AlphaIsTransparency: 0
m_ImageCount: 0
m_TextureDimension: 2
m_TextureSettings:
serializedVersion: 2
m_FilterMode: 1
m_Aniso: 1
m_MipBias: 0
m_WrapU: 0
m_WrapV: 0
m_WrapW: 0
m_LightmapFormat: 0
m_ColorSpace: 0
image data: 0
_typelessdata:
m_StreamData:
offset: 0
size: 0
path:
--- !u!1 &1548023132
GameObject:
m_ObjectHideFlags: 0

5
Samples/UIWidgetsSamples_2019_4/Assets/UIWidgetsGallery/demo/material/backdrop_demo.cs


{
new IconButton(
onPressed: this._toggleBackdropPanelVisibility,
icon: new Icon(
icon: Icons.close
icon: new AnimatedIcon(
icon: AnimatedIcons.close_menu,
progress: this._controller.view
)
)
}

12
Samples/UIWidgetsSamples_2019_4/Assets/UIWidgetsGallery/demo/material/search_demo.cs


appBar: new AppBar(
leading: new IconButton(
tooltip: "Navigation menu",
icon: new Icon(
icon: Icons.menu,
color: Colors.white
icon: new AnimatedIcon(
icon: AnimatedIcons.arrow_menu,
color: Colors.white,
progress: this._delegate.transitionAnimation
),
onPressed: () => { this._scaffoldKey.currentState.openDrawer(); }
),

public override Widget buildLeading(BuildContext context) {
return new IconButton(
tooltip: "Back",
icon: new Icon(
icon: Icons.menu
icon: new AnimatedIcon(
icon: AnimatedIcons.arrow_menu,
progress: this.transitionAnimation
),
onPressed: () => { this.close(context, null); }
);

5
Samples/UIWidgetsSamples_2019_4/Assets/UIWidgetsGallery/gallery/backdrop.cs


trailing: new IconButton(
onPressed: this._toggleFrontLayer,
tooltip: "Toggle options page",
icon: new Icon(
icon: Icons.close
icon: new AnimatedIcon(
icon: AnimatedIcons.close_menu,
progress: this._controller
)
)
),

14
com.unity.uiwidgets/Runtime/engine/DisplayMetrics.cs


#endif
#if UNITY_IOS
this._devicePixelRatio = IOSDeviceScaleFactor();
//this._devicePixelRatio = IOSDeviceScaleFactor();
#endif
if (_devicePixelRatio <= 0) {

padding_bottom = 0
};
#elif UNITY_IOS
viewMetrics metrics = IOSGetViewportPadding();
this._viewMetrics = metrics;
//viewMetrics metrics = IOSGetViewportPadding();
//this._viewMetrics = metrics;
#else
_viewMetrics = new viewMetrics {
insets_bottom = 0,

#endif
#if UNITY_IOS
[DllImport("__Internal")]
static extern float IOSDeviceScaleFactor();
//[DllImport("__Internal")]
//static extern float IOSDeviceScaleFactor();
[DllImport("__Internal")]
static extern viewMetrics IOSGetViewportPadding();
//[DllImport("__Internal")]
//static extern viewMetrics IOSGetViewportPadding();
#endif
}
}

8
com.unity.uiwidgets/Runtime/engine/UIWidgetsMessageManager.cs


void UpdateNameIfNeed() {
#if UNITY_IOS || UNITY_ANDROID || UNITY_WEBGL
var name = gameObject.name;
/*var name = gameObject.name;
if (name != _lastObjectName) {
if (!Application.isEditor) {

}
}*/
#endif
}

}
#if UNITY_IOS || UNITY_WEBGL
[DllImport("__Internal")]
static extern void UIWidgetsMessageSetObjectName(string objectName);
//[DllImport("__Internal")]
//static extern void UIWidgetsMessageSetObjectName(string objectName);
#elif UNITY_ANDROID
static void UIWidgetsMessageSetObjectName(string objectName) {

4
com.unity.uiwidgets/Runtime/engine2/UIWidgetsPanel.cs


#if !UNITY_EDITOR && UNITY_ANDROID
if (!IsAndroidInitialized()) {return ;}
#endif
#if !UNITY_EDITOR && UNITY_IOS
//the hook API cannot be automatically called on IOS, so we need try hook it here
Hooks.tryHook();
#endif
base.OnEnable();
D.assert(_wrapper == null);

4
com.unity.uiwidgets/Runtime/engine2/UIWidgetsPanelWrapper.cs


#endregion
#region Platform: MacOs Specific Functionalities
#region Platform: MacOs/iOS Specific Functionalities
#if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX
#if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX || UNITY_IOS
public partial class UIWidgetsPanelWrapper {
Texture _renderTexture;

34
com.unity.uiwidgets/Runtime/material/animated_icons/animated_icons.cs


namespace Unity.UIWidgets.material {
static class AnimatedIconUtils {
public static T _interpolate<T>(List<T> values, float progress, _Interpolator<T> interpolator) {
public static T _interpolate<T>(T[] values, float progress, _Interpolator<T> interpolator) {
if (values.Count == 1) {
if (values.Length == 1) {
float targetIdx = MathUtils.lerpNullableFloat(0, values.Count - 1, progress);
float targetIdx = MathUtils.lerpNullableFloat(0, values.Length - 1, progress);
int lowIdx = targetIdx.floor();
int highIdx = targetIdx.ceil();
float t = targetIdx - lowIdx;

class _AnimatedIconPainter : AbstractCustomPainter {
public _AnimatedIconPainter(
List<_PathFrames> paths = null,
_PathFrames[] paths = null,
Animation<float> progress = null,
Color color = null,
float? scale = null,

this.uiPathFactory = uiPathFactory;
}
public readonly List<_PathFrames> paths;
public readonly _PathFrames[] paths;
public readonly Animation<float> progress;
public readonly Color color;
public readonly float? scale;

class _PathFrames {
public _PathFrames(
List<_PathCommand> commands,
List<float> opacities
_PathCommand[] commands,
float[] opacities
public readonly List<_PathCommand> commands;
public readonly List<float> opacities;
public readonly _PathCommand[] commands;
public readonly float[] opacities;
public void paint(Canvas canvas, Color color, _UiPathFactory uiPathFactory, float progress) {
float opacity = AnimatedIconUtils._interpolate<float>(opacities, progress, MathUtils.lerpNullableFloat);

}
class _PathMoveTo : _PathCommand {
public _PathMoveTo(List<Offset> points) {
public _PathMoveTo(Offset[] points) {
public readonly List<Offset> points;
public readonly Offset[] points;
public override void apply(Path path, float progress) {
Offset offset = AnimatedIconUtils._interpolate<Offset>(points, progress, Offset.lerp);

class _PathCubicTo : _PathCommand {
public _PathCubicTo(List<Offset> controlPoints1, List<Offset> controlPoints2, List<Offset> targetPoints) {
public _PathCubicTo(Offset[] controlPoints1, Offset[] controlPoints2, Offset[] targetPoints) {
public readonly List<Offset> controlPoints2;
public readonly List<Offset> controlPoints1;
public readonly List<Offset> targetPoints;
public readonly Offset[] controlPoints2;
public readonly Offset[] controlPoints1;
public readonly Offset[] targetPoints;
public override void apply(Path path, float progress) {
Offset controlPoint1 = AnimatedIconUtils._interpolate<Offset>(controlPoints1, progress, Offset.lerp);

}
class _PathLineTo : _PathCommand {
public _PathLineTo(List<Offset> points) {
public _PathLineTo(Offset[] points) {
List<Offset> points;
Offset[] points;
public override void apply(Path path, float progress) {
Offset point = AnimatedIconUtils._interpolate<Offset>(points, progress, Offset.lerp);

4
com.unity.uiwidgets/Runtime/material/animated_icons/animated_icons_data.cs


}
class _AnimatedIconData : AnimatedIconData {
public _AnimatedIconData(Size size, List<_PathFrames> paths, bool matchTextDirection = false) {
public _AnimatedIconData(Size size, _PathFrames[] paths, bool matchTextDirection = false) {
this.size = size;
this.paths = paths;
this.matchTextDirection = matchTextDirection;

public readonly List<_PathFrames> paths;
public readonly _PathFrames[] paths;
public override bool matchTextDirection { get; }
}

261
com.unity.uiwidgets/Runtime/material/animated_icons/data/add_event.g.cs
文件差异内容过多而无法显示
查看文件

92
com.unity.uiwidgets/Runtime/material/animated_icons/data/arrow_menu.g.cs


partial class AnimatedIconsData {
public static readonly _AnimatedIconData _arrow_menu = new _AnimatedIconData(
new Size(48.0f, 48.0f),
new List<_PathFrames>{
new _PathFrames[]{
opacities: new List<float>{
opacities: new float[]{
1.0f,
1.0f,
1.0f,

1.0f,
1.0f,
},
commands: new List<_PathCommand>{
commands: new _PathCommand[]{
new List<Offset>{
new Offset[]{
new Offset(39.94921875f, 22.0f),
new Offset(39.999299444085175f, 22.321134814951655f),
new Offset(40.123697128128484f, 23.4571221977224f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(39.94921875f, 22.0f),
new Offset(39.999299444085175f, 22.321134814951655f),
new Offset(40.123697128128484f, 23.4571221977224f),

new Offset(6.000028695609693f, 26.000194701816614f),
new Offset(6.0f, 26.0f)
},
new List<Offset>{
new Offset[]{
new Offset(12.562500000000004f, 21.999999999999996f),
new Offset(12.563028263179644f, 21.76974679627851f),
new Offset(12.601915221773575f, 20.955868783506492f),

new Offset(41.99999903720365f, 25.999805298117412f),
new Offset(42.0f, 26.0f)
},
new List<Offset>{
new Offset[]{
new Offset(12.562500000000004f, 21.999999999999996f),
new Offset(12.563028263179644f, 21.76974679627851f),
new Offset(12.601915221773575f, 20.955868783506492f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(12.562500000000004f, 21.999999999999996f),
new Offset(12.563028263179644f, 21.76974679627851f),
new Offset(12.601915221773575f, 20.955868783506492f),

new Offset(41.99999903720365f, 25.999805298117412f),
new Offset(42.0f, 26.0f)
},
new List<Offset>{
new Offset[]{
new Offset(12.562500000000004f, 25.999999999999996f),
new Offset(12.482656306166858f, 25.76893925832956f),
new Offset(12.239876568700678f, 24.939451092644983f),

new Offset(41.99995577009031f, 21.99980529835142f),
new Offset(42.0f, 22.0f)
},
new List<Offset>{
new Offset[]{
new Offset(12.562500000000004f, 25.999999999999996f),
new Offset(12.482656306166858f, 25.76893925832956f),
new Offset(12.239876568700678f, 24.939451092644983f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(12.562500000000004f, 25.999999999999996f),
new Offset(12.482656306166858f, 25.76893925832956f),
new Offset(12.239876568700678f, 24.939451092644983f),

new Offset(41.99995577009031f, 21.99980529835142f),
new Offset(42.0f, 22.0f)
},
new List<Offset>{
new Offset[]{
new Offset(39.94921875f, 26.0f),
new Offset(39.91892748707239f, 26.320327277002704f),
new Offset(39.76165847505559f, 27.44070450686089f),

new Offset(5.999985428496359f, 22.00019470205062f),
new Offset(6.0f, 22.0f)
},
new List<Offset>{
new Offset[]{
new Offset(39.94921875f, 26.0f),
new Offset(39.91892748707239f, 26.320327277002704f),
new Offset(39.76165847505559f, 27.44070450686089f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(39.94921875f, 26.0f),
new Offset(39.91892748707239f, 26.320327277002704f),
new Offset(39.76165847505559f, 27.44070450686089f),

new Offset(5.999985428496359f, 22.00019470205062f),
new Offset(6.0f, 22.0f)
},
new List<Offset>{
new Offset[]{
new Offset(39.94921875f, 22.0f),
new Offset(39.999299444085175f, 22.321134814951655f),
new Offset(40.123697128128484f, 23.4571221977224f),

new Offset(6.000028695609693f, 26.000194701816614f),
new Offset(6.0f, 26.0f)
},
new List<Offset>{
new Offset[]{
new Offset(39.94921875f, 22.0f),
new Offset(39.999299444085175f, 22.321134814951655f),
new Offset(40.123697128128484f, 23.4571221977224f),

}
),
new _PathFrames(
opacities: new List<float>{
opacities: new float[]{
1.0f,
1.0f,
1.0f,

1.0f,
1.0f,
},
commands: new List<_PathCommand>{
commands: new _PathCommand[]{
new List<Offset>{
new Offset[]{
new Offset(24.00120242935725f, 7.98287044589657f),
new Offset(24.475307447859166f, 8.003617986907148f),
new Offset(26.126659093516306f, 8.177690670193112f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(24.00120242935725f, 7.98287044589657f),
new Offset(24.475307447859166f, 8.003617986907148f),
new Offset(26.126659093516306f, 8.177690670193112f),

new Offset(6.000171486902083f, 36.000208945476956f),
new Offset(6.0f, 36.0f)
},
new List<Offset>{
new Offset[]{
new Offset(8.389135783884633f, 23.59493709136918f),
new Offset(8.411539419733579f, 23.280020314446016f),
new Offset(8.535460203545142f, 22.174793784450976f),

new Offset(42.00012355171139f, 35.99972219110006f),
new Offset(42.0f, 36.0f)
},
new List<Offset>{
new Offset[]{
new Offset(8.389135783884633f, 23.59493709136918f),
new Offset(8.411539419733579f, 23.280020314446016f),
new Offset(8.535460203545142f, 22.174793784450976f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(8.389135783884633f, 23.59493709136918f),
new Offset(8.411539419733579f, 23.280020314446016f),
new Offset(8.535460203545142f, 22.174793784450976f),

new Offset(42.00012355171139f, 35.99972219110006f),
new Offset(42.0f, 36.0f)
},
new List<Offset>{
new Offset[]{
new Offset(11.217562908630821f, 26.423364216115367f),
new Offset(11.168037593988725f, 26.178591999833156f),
new Offset(11.026001684399013f, 25.304842207741935f),

new Offset(42.00006946781973f, 31.999722191465697f),
new Offset(42.0f, 32.0f)
},
new List<Offset>{
new Offset[]{
new Offset(11.217562908630821f, 26.423364216115367f),
new Offset(11.168037593988725f, 26.178591999833156f),
new Offset(11.026001684399013f, 25.304842207741935f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(11.217562908630821f, 26.423364216115367f),
new Offset(11.168037593988725f, 26.178591999833156f),
new Offset(11.026001684399013f, 25.304842207741935f),

new Offset(42.00006946781973f, 31.999722191465697f),
new Offset(42.0f, 32.0f)
},
new List<Offset>{
new Offset[]{
new Offset(26.829629554103438f, 10.811297570642758f),
new Offset(27.231805622114308f, 10.902189672294288f),
new Offset(28.61720057437018f, 11.307739093484066f),

new Offset(6.000117403010417f, 32.00020894584259f),
new Offset(6.0f, 32.0f)
},
new List<Offset>{
new Offset[]{
new Offset(26.829629554103438f, 10.811297570642758f),
new Offset(27.231805622114308f, 10.902189672294288f),
new Offset(28.61720057437018f, 11.307739093484066f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(26.829629554103438f, 10.811297570642758f),
new Offset(27.231805622114308f, 10.902189672294288f),
new Offset(28.61720057437018f, 11.307739093484066f),

new Offset(6.000117403010417f, 32.00020894584259f),
new Offset(6.0f, 32.0f)
},
new List<Offset>{
new Offset[]{
new Offset(24.00120242935725f, 7.98287044589657f),
new Offset(24.475307447859166f, 8.003617986907148f),
new Offset(26.126659093516306f, 8.177690670193112f),

new Offset(6.000171486902083f, 36.000208945476956f),
new Offset(6.0f, 36.0f)
},
new List<Offset>{
new Offset[]{
new Offset(24.00120242935725f, 7.98287044589657f),
new Offset(24.475307447859166f, 8.003617986907148f),
new Offset(26.126659093516306f, 8.177690670193112f),

}
),
new _PathFrames(
opacities: new List<float>{
opacities: new float[]{
1.0f,
1.0f,
1.0f,

1.0f,
1.0f,
},
commands: new List<_PathCommand>{
commands: new _PathCommand[]{
new List<Offset>{
new Offset[]{
new Offset(26.829629554103434f, 37.188702429357235f),
new Offset(26.70295401712204f, 37.21708146835027f),
new Offset(26.253437940457104f, 37.31668297706097f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(26.829629554103434f, 37.188702429357235f),
new Offset(26.70295401712204f, 37.21708146835027f),
new Offset(26.253437940457104f, 37.31668297706097f),

new Offset(5.9999443342489265f, 16.000180457509614f),
new Offset(6.0f, 16.0f)
},
new List<Offset>{
new Offset[]{
new Offset(11.2175487664952f, 21.576649926020245f),
new Offset(11.26591566746795f, 21.307620185014063f),
new Offset(11.473792301821605f, 20.377637880770784f),

new Offset(41.99989640116428f, 15.999888404883473f),
new Offset(42.0f, 16.0f)
},
new List<Offset>{
new Offset[]{
new Offset(11.2175487664952f, 21.576649926020245f),
new Offset(11.26591566746795f, 21.307620185014063f),
new Offset(11.473792301821605f, 20.377637880770784f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(11.2175487664952f, 21.576649926020245f),
new Offset(11.26591566746795f, 21.307620185014063f),
new Offset(11.473792301821605f, 20.377637880770784f),

new Offset(41.99989640116428f, 15.999888404883473f),
new Offset(42.0f, 16.0f)
},
new List<Offset>{
new Offset[]{
new Offset(8.38912164174901f, 24.405077050766437f),
new Offset(8.395184821848037f, 24.09310118692493f),
new Offset(8.459782153583708f, 23.007417876572518f),

new Offset(41.99986395082928f, 11.999888405015101f),
new Offset(42.0f, 12.0f)
},
new List<Offset>{
new Offset[]{
new Offset(8.38912164174901f, 24.405077050766437f),
new Offset(8.395184821848037f, 24.09310118692493f),
new Offset(8.459782153583708f, 23.007417876572518f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(8.38912164174901f, 24.405077050766437f),
new Offset(8.395184821848037f, 24.09310118692493f),
new Offset(8.459782153583708f, 23.007417876572518f),

new Offset(41.99986395082928f, 11.999888405015101f),
new Offset(42.0f, 12.0f)
},
new List<Offset>{
new Offset[]{
new Offset(24.001202429357242f, 40.01712955410343f),
new Offset(23.83222317150212f, 40.00256247026114f),
new Offset(23.23942779221921f, 39.946462972862705f),

new Offset(5.999911883913924f, 12.000180457641243f),
new Offset(6.0f, 12.0f)
},
new List<Offset>{
new Offset[]{
new Offset(24.001202429357242f, 40.01712955410343f),
new Offset(23.83222317150212f, 40.00256247026114f),
new Offset(23.23942779221921f, 39.946462972862705f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(24.001202429357242f, 40.01712955410343f),
new Offset(23.83222317150212f, 40.00256247026114f),
new Offset(23.23942779221921f, 39.946462972862705f),

new Offset(5.999911883913924f, 12.000180457641243f),
new Offset(6.0f, 12.0f)
},
new List<Offset>{
new Offset[]{
new Offset(26.829629554103434f, 37.188702429357235f),
new Offset(26.70295401712204f, 37.21708146835027f),
new Offset(26.253437940457104f, 37.31668297706097f),

new Offset(5.9999443342489265f, 16.000180457509614f),
new Offset(6.0f, 16.0f)
},
new List<Offset>{
new Offset[]{
new Offset(26.829629554103434f, 37.188702429357235f),
new Offset(26.70295401712204f, 37.21708146835027f),
new Offset(26.253437940457104f, 37.31668297706097f),

92
com.unity.uiwidgets/Runtime/material/animated_icons/data/close_menu.g.cs


partial class AnimatedIconsData {
public static readonly _AnimatedIconData _close_menu = new _AnimatedIconData(
new Size(48.0f, 48.0f),
new List<_PathFrames>{
new _PathFrames[]{
opacities: new List<float>{
opacities: new float[]{
1.0f,
1.0f,
1.0f,

1.0f,
1.0f,
},
commands: new List<_PathCommand>{
commands: new _PathCommand[]{
new List<Offset>{
new Offset[]{
new Offset(24.0f, 26.0f),
new Offset(23.959814021491162f, 25.999596231025475f),
new Offset(23.818980673456252f, 25.99179115456858f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(24.0f, 26.0f),
new Offset(23.959814021491162f, 25.999596231025475f),
new Offset(23.818980673456252f, 25.99179115456858f),

new Offset(41.99983686928147f, 21.999805299557877f),
new Offset(42.0f, 22.0f)
},
new List<Offset>{
new Offset[]{
new Offset(24.0f, 26.0f),
new Offset(23.959814021491162f, 25.999596231025475f),
new Offset(23.818980673456252f, 25.99179115456858f),

new Offset(6.000119863487498f, 22.00019470067613f),
new Offset(5.9999999999999964f, 22.000000000000007f)
},
new List<Offset>{
new Offset[]{
new Offset(24.0f, 26.0f),
new Offset(23.959814021491162f, 25.999596231025475f),
new Offset(23.818980673456252f, 25.99179115456858f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(24.0f, 26.0f),
new Offset(23.959814021491162f, 25.999596231025475f),
new Offset(23.818980673456252f, 25.99179115456858f),

new Offset(6.000119863487498f, 22.00019470067613f),
new Offset(5.9999999999999964f, 22.000000000000007f)
},
new List<Offset>{
new Offset[]{
new Offset(24.0f, 22.0f),
new Offset(24.040185978508838f, 22.000403768974525f),
new Offset(24.181019326543748f, 22.00820884543142f),

new Offset(6.000163130618532f, 26.000194700442123f),
new Offset(5.9999999999999964f, 26.000000000000007f)
},
new List<Offset>{
new Offset[]{
new Offset(24.0f, 22.0f),
new Offset(24.040185978508838f, 22.000403768974525f),
new Offset(24.181019326543748f, 22.00820884543142f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(24.0f, 22.0f),
new Offset(24.040185978508838f, 22.000403768974525f),
new Offset(24.181019326543748f, 22.00820884543142f),

new Offset(6.000163130618532f, 26.000194700442123f),
new Offset(5.9999999999999964f, 26.000000000000007f)
},
new List<Offset>{
new Offset[]{
new Offset(24.0f, 22.0f),
new Offset(24.040185978508838f, 22.000403768974525f),
new Offset(24.181019326543748f, 22.00820884543142f),

new Offset(41.9998801364125f, 25.99980529932387f),
new Offset(42.0f, 26.0f)
},
new List<Offset>{
new Offset[]{
new Offset(24.0f, 22.0f),
new Offset(24.040185978508838f, 22.000403768974525f),
new Offset(24.181019326543748f, 22.00820884543142f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(24.0f, 22.0f),
new Offset(24.040185978508838f, 22.000403768974525f),
new Offset(24.181019326543748f, 22.00820884543142f),

new Offset(41.9998801364125f, 25.99980529932387f),
new Offset(42.0f, 26.0f)
},
new List<Offset>{
new Offset[]{
new Offset(24.0f, 26.0f),
new Offset(23.959814021491162f, 25.999596231025475f),
new Offset(23.818980673456252f, 25.99179115456858f),

new Offset(41.99983686928147f, 21.999805299557877f),
new Offset(42.0f, 22.0f)
},
new List<Offset>{
new Offset[]{
new Offset(24.0f, 26.0f),
new Offset(23.959814021491162f, 25.999596231025475f),
new Offset(23.818980673456252f, 25.99179115456858f),

}
),
new _PathFrames(
opacities: new List<float>{
opacities: new float[]{
1.0f,
1.0f,
1.0f,

1.0f,
1.0f,
},
commands: new List<_PathCommand>{
commands: new _PathCommand[]{
new List<Offset>{
new Offset[]{
new Offset(9.857864376269049f, 12.68629150101524f),
new Offset(10.0286848752889f, 12.538401058257541f),
new Offset(10.632873267418944f, 12.039156238673812f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(9.857864376269049f, 12.68629150101524f),
new Offset(10.0286848752889f, 12.538401058257541f),
new Offset(10.632873267418944f, 12.039156238673812f),

new Offset(41.99987560677617f, 11.999888404963674f),
new Offset(42.0f, 12.000000000000002f)
},
new List<Offset>{
new Offset[]{
new Offset(35.31370849898477f, 38.14213562373095f),
new Offset(35.09801389245515f, 38.37497866886739f),
new Offset(34.30089322953512f, 39.165247572901634f),

new Offset(5.999875607960821f, 12.000180458137994f),
new Offset(5.9999999999999964f, 12.000000000000005f)
},
new List<Offset>{
new Offset[]{
new Offset(35.31370849898477f, 38.14213562373095f),
new Offset(35.09801389245515f, 38.37497866886739f),
new Offset(34.30089322953512f, 39.165247572901634f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(35.31370849898477f, 38.14213562373095f),
new Offset(35.09801389245515f, 38.37497866886739f),
new Offset(34.30089322953512f, 39.165247572901634f),

new Offset(5.999875607960821f, 12.000180458137994f),
new Offset(5.9999999999999964f, 12.000000000000005f)
},
new List<Offset>{
new Offset[]{
new Offset(38.14213562373095f, 35.31370849898476f),
new Offset(37.96874473807846f, 35.58949766696003f),
new Offset(37.314903377782656f, 36.53546757711095f),

new Offset(5.9999080583135225f, 16.000180458006366f),
new Offset(5.9999999999999964f, 16.000000000000007f)
},
new List<Offset>{
new Offset[]{
new Offset(38.14213562373095f, 35.31370849898476f),
new Offset(37.96874473807846f, 35.58949766696003f),
new Offset(37.314903377782656f, 36.53546757711095f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(38.14213562373095f, 35.31370849898476f),
new Offset(37.96874473807846f, 35.58949766696003f),
new Offset(37.314903377782656f, 36.53546757711095f),

new Offset(5.9999080583135225f, 16.000180458006366f),
new Offset(5.9999999999999964f, 16.000000000000007f)
},
new List<Offset>{
new Offset[]{
new Offset(12.68629150101524f, 9.857864376269049f),
new Offset(12.899415720912216f, 9.75292005635018f),
new Offset(13.64688341566648f, 9.409376242883125f),

new Offset(41.99990805712887f, 15.999888404832046f),
new Offset(42.0f, 16.0f)
},
new List<Offset>{
new Offset[]{
new Offset(12.68629150101524f, 9.857864376269049f),
new Offset(12.899415720912216f, 9.75292005635018f),
new Offset(13.64688341566648f, 9.409376242883125f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(12.68629150101524f, 9.857864376269049f),
new Offset(12.899415720912216f, 9.75292005635018f),
new Offset(13.64688341566648f, 9.409376242883125f),

new Offset(41.99990805712887f, 15.999888404832046f),
new Offset(42.0f, 16.0f)
},
new List<Offset>{
new Offset[]{
new Offset(9.857864376269049f, 12.68629150101524f),
new Offset(10.0286848752889f, 12.538401058257541f),
new Offset(10.632873267418944f, 12.039156238673812f),

new Offset(41.99987560677617f, 11.999888404963674f),
new Offset(42.0f, 12.000000000000002f)
},
new List<Offset>{
new Offset[]{
new Offset(9.857864376269049f, 12.68629150101524f),
new Offset(10.0286848752889f, 12.538401058257541f),
new Offset(10.632873267418944f, 12.039156238673812f),

}
),
new _PathFrames(
opacities: new List<float>{
opacities: new float[]{
1.0f,
1.0f,
1.0f,

1.0f,
1.0f,
},
commands: new List<_PathCommand>{
commands: new _PathCommand[]{
new List<Offset>{
new Offset[]{
new Offset(12.686291501015244f, 38.14213562373095f),
new Offset(12.335961696184835f, 37.78957826421869f),
new Offset(11.186164512970027f, 36.485148967548454f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(12.686291501015244f, 38.14213562373095f),
new Offset(12.335961696184835f, 37.78957826421869f),
new Offset(11.186164512970027f, 36.485148967548454f),

new Offset(42.00008112385512f, 31.999722191105658f),
new Offset(42.0f, 32.0f)
},
new List<Offset>{
new Offset[]{
new Offset(38.14213562373096f, 12.686291501015244f),
new Offset(38.423106864699406f, 12.98109469595424f),
new Offset(39.356600322670786f, 14.070275639966862f),

new Offset(6.000081127145819f, 32.000208946289966f),
new Offset(5.9999999999999964f, 32.00000000000001f)
},
new List<Offset>{
new Offset[]{
new Offset(38.14213562373096f, 12.686291501015244f),
new Offset(38.423106864699406f, 12.98109469595424f),
new Offset(39.356600322670786f, 14.070275639966862f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(38.14213562373096f, 12.686291501015244f),
new Offset(38.423106864699406f, 12.98109469595424f),
new Offset(39.356600322670786f, 14.070275639966862f),

new Offset(6.000081127145819f, 32.000208946289966f),
new Offset(5.9999999999999964f, 32.00000000000001f)
},
new List<Offset>{
new Offset[]{
new Offset(35.31370849898477f, 9.857864376269053f),
new Offset(35.6666086904478f, 10.082523010563733f),
new Offset(36.86605884182839f, 10.940227216666777f),

new Offset(6.000135211055188f, 36.00020894592433f),
new Offset(5.9999999999999964f, 36.00000000000001f)
},
new List<Offset>{
new Offset[]{
new Offset(35.31370849898477f, 9.857864376269053f),
new Offset(35.6666086904478f, 10.082523010563733f),
new Offset(36.86605884182839f, 10.940227216666777f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(35.31370849898477f, 9.857864376269053f),
new Offset(35.6666086904478f, 10.082523010563733f),
new Offset(36.86605884182839f, 10.940227216666777f),

new Offset(6.000135211055188f, 36.00020894592433f),
new Offset(5.9999999999999964f, 36.00000000000001f)
},
new List<Offset>{
new Offset[]{
new Offset(9.857864376269053f, 35.31370849898477f),
new Offset(9.579463521933231f, 34.89100657882818f),
new Offset(8.695623032127628f, 33.35510054424837f),

new Offset(42.00013520776449f, 35.99972219074003f),
new Offset(42.0f, 36.0f)
},
new List<Offset>{
new Offset[]{
new Offset(9.857864376269053f, 35.31370849898477f),
new Offset(9.579463521933231f, 34.89100657882818f),
new Offset(8.695623032127628f, 33.35510054424837f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(9.857864376269053f, 35.31370849898477f),
new Offset(9.579463521933231f, 34.89100657882818f),
new Offset(8.695623032127628f, 33.35510054424837f),

new Offset(42.00013520776449f, 35.99972219074003f),
new Offset(42.0f, 36.0f)
},
new List<Offset>{
new Offset[]{
new Offset(12.686291501015244f, 38.14213562373095f),
new Offset(12.335961696184835f, 37.78957826421869f),
new Offset(11.186164512970027f, 36.485148967548454f),

new Offset(42.00008112385512f, 31.999722191105658f),
new Offset(42.0f, 32.0f)
},
new List<Offset>{
new Offset[]{
new Offset(12.686291501015244f, 38.14213562373095f),
new Offset(12.335961696184835f, 37.78957826421869f),
new Offset(11.186164512970027f, 36.485148967548454f),

214
com.unity.uiwidgets/Runtime/material/animated_icons/data/ellipsis_search.g.cs


public static readonly _AnimatedIconData _ellipsis_search = new _AnimatedIconData(
new Size(96.0f, 96.0f),
new List<_PathFrames>{
new _PathFrames[]{
opacities: new List<float>{
opacities: new float[]{
0.0f,
0.0f,
0.0f,

1.0f,
1.0f
},
commands: new List<_PathCommand>{
commands: new _PathCommand[]{
new List<Offset>{
new Offset[]{
new Offset(57.62369742449878f, 56.510753652468935f),
new Offset(57.50386046799878f, 56.38647829016894f),
new Offset(57.38402351149878f, 56.26220292786894f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(59.11722254046772f, 54.78101039685442f),
new Offset(58.99738558396772f, 54.65673503455442f),
new Offset(58.877548627467725f, 54.532459672254426f),

new Offset(60.57565945470678f, 48.849785482535665f),
new Offset(60.57565945470678f, 48.849785482535665f)
},
new List<Offset>{
new Offset[]{
new Offset(60.01637695941208f, 52.53311272229554f),
new Offset(59.896540002912076f, 52.408837359995545f),
new Offset(59.77670304641208f, 52.28456199769555f),

new Offset(62.94942712071989f, 42.915335621700216f),
new Offset(62.94942712071989f, 42.915335621700216f)
},
new List<Offset>{
new Offset[]{
new Offset(60.01637695941208f, 50.07184435071208f),
new Offset(59.896540002912076f, 49.94756898841208f),
new Offset(59.77670304641208f, 49.82329362611208f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(60.01637695941208f, 44.60068993176772f),
new Offset(59.896540002912076f, 44.47641456946772f),
new Offset(59.77670304641208f, 44.352139207167724f),

new Offset(62.94942712071989f, 21.97373945470677f),
new Offset(62.94942712071989f, 21.97373945470677f)
},
new List<Offset>{
new Offset[]{
new Offset(55.58154300555442f, 40.16584435071208f),
new Offset(55.46170604905442f, 40.04156898841208f),
new Offset(55.341869092554425f, 39.917293626112084f),

new Offset(51.241465482535666f, 10.265747120719887f),
new Offset(51.241465482535666f, 10.265747120719887f)
},
new List<Offset>{
new Offset[]{
new Offset(50.11037695941208f, 40.16584435071208f),
new Offset(49.99054000291208f, 40.04156898841208f),
new Offset(49.87070304641208f, 39.917293626112084f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(44.63922254046772f, 40.16584435071208f),
new Offset(44.51938558396772f, 40.04156898841208f),
new Offset(44.39954862746772f, 39.917293626112084f),

new Offset(22.353739454706773f, 10.265747120719887f),
new Offset(22.353739454706773f, 10.265747120719887f)
},
new List<Offset>{
new Offset[]{
new Offset(40.20437695941208f, 44.60068993176772f),
new Offset(40.08454000291208f, 44.47641456946772f),
new Offset(39.96470304641208f, 44.352139207167724f),

new Offset(10.64574712071989f, 21.973739454706777f),
new Offset(10.64574712071989f, 21.973739454706777f)
},
new List<Offset>{
new Offset[]{
new Offset(40.20437695941208f, 50.07184435071208f),
new Offset(40.08454000291208f, 49.94756898841208f),
new Offset(39.96470304641208f, 49.82329362611208f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(40.20437695941208f, 55.54301039685442f),
new Offset(40.08454000291208f, 55.41873503455442f),
new Offset(39.96470304641208f, 55.294459672254426f),

new Offset(10.64574712071989f, 50.861465482535664f),
new Offset(10.64574712071989f, 50.861465482535664f)
},
new List<Offset>{
new Offset[]{
new Offset(44.63922254046772f, 59.97784435071208f),
new Offset(44.51938558396772f, 59.853568988412086f),
new Offset(44.39954862746772f, 59.72929362611209f),

new Offset(22.35373945470678f, 62.569427120719894f),
new Offset(22.35373945470678f, 62.569427120719894f)
},
new List<Offset>{
new Offset[]{
new Offset(50.11037695941208f, 59.97784435071208f),
new Offset(49.99054000291208f, 59.853568988412086f),
new Offset(49.87070304641208f, 59.72929362611209f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(52.571645330995544f, 59.97784435071208f),
new Offset(52.45180837449554f, 59.853568988412086f),
new Offset(52.33197141799555f, 59.72929362611209f),

new Offset(43.295335621700225f, 62.569427120719894f),
new Offset(43.295335621700225f, 62.569427120719894f)
},
new List<Offset>{
new Offset[]{
new Offset(54.81954300555442f, 59.07868993176772f),
new Offset(54.69970604905442f, 58.95441456946772f),
new Offset(54.579869092554425f, 58.830139207167726f),

new Offset(49.22978548253567f, 60.19565945470678f),
new Offset(49.22978548253567f, 60.19565945470678f)
},
new List<Offset>{
new Offset[]{
new Offset(56.549286261168945f, 57.59279225720884f),
new Offset(56.42944930466894f, 57.468516894908845f),
new Offset(56.30961234816895f, 57.34424153260885f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(56.549286261168945f, 57.59279225720884f),
new Offset(56.42944930466894f, 57.468516894908845f),
new Offset(56.30961234816895f, 57.34424153260885f),

new Offset(53.796307677358f, 56.272889593871334f),
new Offset(53.796307677358f, 56.272889593871334f)
},
new List<Offset>{
new Offset[]{
new Offset(57.62369742449878f, 56.51075365246894f),
new Offset(57.50386046799878f, 56.386478290168945f),
new Offset(57.38402351149878f, 56.26220292786895f),

new Offset(56.63275314854878f, 53.416307677358f),
new Offset(56.63275314854878f, 53.416307677358f)
},
new List<Offset>{
new Offset[]{
new Offset(57.62369742449878f, 56.51075365246894f),
new Offset(57.50386046799878f, 56.386478290168945f),
new Offset(57.38402351149878f, 56.26220292786895f),

new _PathClose(
),
new _PathMoveTo(
new List<Offset>{
new Offset[]{
new Offset(50.11037695941208f, 50.11515566052058f),
new Offset(49.99054000291208f, 49.99088029822058f),
new Offset(49.87070304641208f, 49.866604935920584f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(50.08645981463666f, 50.11515566052058f),
new Offset(49.96662285813666f, 49.99088029822058f),
new Offset(49.846785901636665f, 49.866604935920584f),

new Offset(26.80044951631057f, 54.52105121572243f),
new Offset(26.79953506506211f, 54.522707120719886f)
},
new List<Offset>{
new Offset[]{
new Offset(50.06706564959764f, 50.095761495481554f),
new Offset(49.947228693097635f, 49.97148613318156f),
new Offset(49.82739173659764f, 49.84721077088156f),

new Offset(18.69412305351876f, 46.41472475293062f),
new Offset(18.692467120719886f, 46.41563917637766f)
},
new List<Offset>{
new Offset[]{
new Offset(50.06706564959764f, 50.07184435070614f),
new Offset(49.947228693097635f, 49.94756898840614f),
new Offset(49.82739173659764f, 49.82329362610614f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(50.06706564959764f, 50.04792720593072f),
new Offset(49.947228693097635f, 49.92365184363072f),
new Offset(49.82739173659764f, 49.799376481330725f),

new Offset(18.69412305351876f, 26.42048018431182f),
new Offset(18.692467120719886f, 26.419565760864774f)
},
new List<Offset>{
new Offset[]{
new Offset(50.08645981463666f, 50.02853304089169f),
new Offset(49.96662285813666f, 49.90425767859169f),
new Offset(49.846785901636665f, 49.779982316291694f),

new Offset(26.80044951631057f, 18.314123053518756f),
new Offset(26.79953506506211f, 18.312467120719884f)
},
new List<Offset>{
new Offset[]{
new Offset(50.11037695941208f, 50.02853304089169f),
new Offset(49.99054000291208f, 49.90425767859169f),
new Offset(49.87070304641208f, 49.779982316291694f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(50.1342941041875f, 50.02853304089169f),
new Offset(50.014457147687494f, 49.90425767859169f),
new Offset(49.8946201911875f, 49.779982316291694f),

new Offset(46.79472475293062f, 18.314123053518756f),
new Offset(46.79563917637766f, 18.312467120719884f)
},
new List<Offset>{
new Offset[]{
new Offset(50.15368826922652f, 50.04792720593072f),
new Offset(50.033851312726526f, 49.92365184363072f),
new Offset(49.91401435622653f, 49.799376481330725f),

new Offset(54.90105121572243f, 26.42048018431182f),
new Offset(54.90270712071989f, 26.419565760864774f)
},
new List<Offset>{
new Offset[]{
new Offset(50.15368826922652f, 50.07184435070614f),
new Offset(50.033851312726526f, 49.94756898840614f),
new Offset(49.91401435622653f, 49.82329362610614f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(50.15368826922652f, 50.095761495481554f),
new Offset(50.033851312726526f, 49.97148613318156f),
new Offset(49.91401435622653f, 49.84721077088156f),

new Offset(54.90105121572243f, 46.41472475293062f),
new Offset(54.90270712071989f, 46.41563917637766f)
},
new List<Offset>{
new Offset[]{
new Offset(50.1342941041875f, 50.11515566052058f),
new Offset(50.014457147687494f, 49.99088029822058f),
new Offset(49.8946201911875f, 49.866604935920584f),

new Offset(46.79472475293062f, 54.52105121572244f),
new Offset(46.79563917637766f, 54.522707120719886f)
},
new List<Offset>{
new Offset[]{
new Offset(50.11037695941208f, 50.11515566052058f),
new Offset(49.99054000291208f, 49.99088029822058f),
new Offset(49.87070304641208f, 49.866604935920584f),

}
),
new _PathFrames(
opacities: new List<float>{
opacities: new float[]{
0.0f,
0.0f,
0.0f,

1.0f,
1.0f,
},
commands: new List<_PathCommand>{
commands: new _PathCommand[]{
new List<Offset>{
new Offset[]{
new Offset(60.937745291919896f, 54.52270224391989f),
new Offset(60.937745291919896f, 54.52270224391989f),
new Offset(60.937745291919896f, 54.52270224391989f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(60.937745291919896f, 54.52270224391989f),
new Offset(60.937745291919896f, 54.52270224391989f),
new Offset(60.937745291919896f, 54.52270224391989f),

new Offset(60.937745291919896f, 54.52270224391989f),
new Offset(60.937745291919896f, 54.52270224391989f)
},
new List<Offset>{
new Offset[]{
new Offset(57.739181458913336f, 54.52270224391989f),
new Offset(57.739181458913336f, 54.52270224391989f),
new Offset(57.739181458913336f, 54.52270224391989f),

new Offset(57.739181458913336f, 54.52270224391989f),
new Offset(57.739181458913336f, 54.52270224391989f)
},
new List<Offset>{
new Offset[]{
new Offset(57.739181458913336f, 54.52270224391989f),
new Offset(57.739181458913336f, 54.52270224391989f),
new Offset(57.739181458913336f, 54.52270224391989f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(57.739181458913336f, 54.52270224391989f),
new Offset(57.739181458913336f, 54.52270224391989f),
new Offset(57.739181458913336f, 54.52270224391989f),

new Offset(57.739181458913336f, 54.52270224391989f),
new Offset(57.739181458913336f, 54.52270224391989f)
},
new List<Offset>{
new Offset[]{
new Offset(56.04837809389354f, 52.900684331474906f),
new Offset(56.030300891829654f, 52.8847340126718f),
new Offset(56.01222368976779f, 52.86878369386669f),

new Offset(56.63216256650906f, 53.415804633292815f),
new Offset(56.632751319752806f, 53.41630280056001f)
},
new List<Offset>{
new Offset[]{
new Offset(56.04837809389354f, 52.900684331474906f),
new Offset(56.030300891829654f, 52.8847340126718f),
new Offset(56.01222368976779f, 52.86878369386669f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(56.04837809389354f, 52.9006440978749f),
new Offset(56.030300891829654f, 52.8846937790718f),
new Offset(56.01222368976779f, 52.868743460266685f),

new Offset(56.63216256650906f, 53.41576439969282f),
new Offset(56.632751319752806f, 53.41626256696001f)
},
new List<Offset>{
new Offset[]{
new Offset(53.21193262270276f, 55.75726624798824f),
new Offset(53.193855420638876f, 55.741315929185134f),
new Offset(53.17577821857701f, 55.725365610380024f),

new Offset(53.79571709531828f, 56.27238654980615f),
new Offset(53.79630584856203f, 56.272884717073346f)
},
new List<Offset>{
new Offset[]{
new Offset(53.21190192690009f, 55.75726624798824f),
new Offset(53.19382472483621f, 55.741315929185134f),
new Offset(53.17574752277434f, 55.725365610380024f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(53.21190192690009f, 55.75722601438824f),
new Offset(53.19382472483621f, 55.74127569558514f),
new Offset(53.17574752277434f, 55.72532537678002f),

new Offset(53.79568639951562f, 56.27234631620615f),
new Offset(53.796275152759364f, 56.27284448347334f)
},
new List<Offset>{
new Offset[]{
new Offset(54.902705291919894f, 57.379314856233876f),
new Offset(54.902705291919894f, 57.379314856233876f),
new Offset(54.902705291919894f, 57.37931485623388f),

new Offset(54.902705291919894f, 57.37931485623388f),
new Offset(54.902705291919894f, 57.379314856233876f)
},
new List<Offset>{
new Offset[]{
new Offset(54.902705291919894f, 57.379314856233876f),
new Offset(54.902705291919894f, 57.379314856233876f),
new Offset(54.902705291919894f, 57.37931485623388f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(54.902705291919894f, 57.379314856233876f),
new Offset(54.902705291919894f, 57.379314856233876f),
new Offset(54.902705291919894f, 57.37931485623388f),

new Offset(54.902705291919894f, 57.37931485623388f),
new Offset(54.902705291919894f, 57.379314856233876f)
},
new List<Offset>{
new Offset[]{
new Offset(54.902705291919894f, 60.557742243937994f),
new Offset(54.902705291919894f, 60.557742243937994f),
new Offset(54.902705291919894f, 60.557742243937994f),

new Offset(54.902705291919894f, 60.557742243937994f),
new Offset(54.902705291919894f, 60.557742243937994f)
},
new List<Offset>{
new Offset[]{
new Offset(54.902705291919894f, 60.557742243937994f),
new Offset(54.902705291919894f, 60.557742243937994f),
new Offset(54.902705291919894f, 60.557742243937994f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(54.902705291919894f, 60.557742243937994f),
new Offset(54.902705291919894f, 60.557742243937994f),
new Offset(54.902705291919894f, 60.557742243937994f),

new Offset(54.902705291919894f, 60.557742243937994f),
new Offset(54.902705291919894f, 60.557742243937994f)
},
new List<Offset>{
new Offset[]{
new Offset(55.016985758228515f, 60.536592837199635f),
new Offset(55.016985758228515f, 60.536592837199635f),
new Offset(55.016985758228515f, 60.536592837199635f),

new Offset(75.01766421117493f, 80.63248087806039f),
new Offset(75.0195052919199f, 80.63433074491833f)
},
new List<Offset>{
new Offset[]{
new Offset(55.016985758228515f, 60.536592837199635f),
new Offset(55.016985758228515f, 60.536592837199635f),
new Offset(55.016985758228515f, 60.536592837199635f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(55.016985758228515f, 60.536592837199635f),
new Offset(55.016985758228515f, 60.536592837199635f),
new Offset(55.016985758228515f, 60.536592837199635f),

new Offset(75.01766421117493f, 80.63248087806039f),
new Offset(75.0195052919199f, 80.63433074491833f)
},
new List<Offset>{
new Offset[]{
new Offset(61.01181425920885f, 54.5417643362193f),
new Offset(61.01181425920885f, 54.5417643362193f),
new Offset(61.01181425920885f, 54.5417643362193f),

new Offset(81.01249268435384f, 74.63765240488146f),
new Offset(81.01433379290023f, 74.639502243938f)
},
new List<Offset>{
new Offset[]{
new Offset(61.01181425920885f, 54.5417643362193f),
new Offset(61.01181425920885f, 54.5417643362193f),
new Offset(61.01181425920885f, 54.5417643362193f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(61.01181425920885f, 54.5417643362193f),
new Offset(61.01181425920885f, 54.5417643362193f),
new Offset(61.01181425920885f, 54.5417643362193f),

new Offset(81.01249268435384f, 74.63765240488146f),
new Offset(81.01433379290023f, 74.639502243938f)
},
new List<Offset>{
new Offset[]{
new Offset(60.93774529192372f, 54.52270224393415f),
new Offset(60.93774529192372f, 54.52270224393415f),
new Offset(60.93774529192372f, 54.52270224393415f),

new Offset(60.937745291919896f, 54.52270224393799f),
new Offset(60.93774529191989f, 54.52270224393799f)
},
new List<Offset>{
new Offset[]{
new Offset(60.93774529192372f, 54.52270224393415f),
new Offset(60.93774529192372f, 54.52270224393415f),
new Offset(60.93774529192372f, 54.52270224393415f),

}
),
new _PathFrames(
opacities: new List<float>{
opacities: new float[]{
1.0f,
1.0f,
1.0f,

0.0f,
0.0f,
},
commands: new List<_PathCommand>{
commands: new _PathCommand[]{
new List<Offset>{
new Offset[]{
new Offset(48.0f, 31.90656f),
new Offset(48.0f, 31.90656f),
new Offset(48.0f, 31.90656f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(52.445826306158004f, 31.90656f),
new Offset(52.445826306158004f, 31.90656f),
new Offset(52.445826306158004f, 31.90656f),

new Offset(52.445826306158004f, 55.9765324848f),
new Offset(52.445826306158004f, 55.9765324848f)
},
new List<Offset>{
new Offset[]{
new Offset(56.04672f, 28.305635610355335f),
new Offset(56.04672f, 28.305635610355335f),
new Offset(56.04672f, 28.305635610355335f),

new Offset(56.04672f, 52.37560809515534f),
new Offset(56.04672f, 52.37560809515534f)
},
new List<Offset>{
new Offset[]{
new Offset(56.04672f, 23.85984f),
new Offset(56.04672f, 23.85984f),
new Offset(56.04672f, 23.85984f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(56.04672f, 19.414013693841998f),
new Offset(56.04672f, 19.414013693841998f),
new Offset(56.04672f, 19.414013693841998f),

new Offset(56.04672f, 43.483986178642f),
new Offset(56.04672f, 43.483986178642f)
},
new List<Offset>{
new Offset[]{
new Offset(52.445826306158004f, 15.813119999999998f),
new Offset(52.445826306158004f, 15.813119999999998f),
new Offset(52.445826306158004f, 15.813119999999998f),

new Offset(52.445826306158004f, 39.8830924848f),
new Offset(52.445826306158004f, 39.8830924848f)
},
new List<Offset>{
new Offset[]{
new Offset(48.0f, 15.813119999999998f),
new Offset(48.0f, 15.813119999999998f),
new Offset(48.0f, 15.813119999999998f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(43.554173693841996f, 15.813119999999998f),
new Offset(43.554173693841996f, 15.813119999999998f),
new Offset(43.554173693841996f, 15.813119999999998f),

new Offset(43.554173693841996f, 39.8830924848f),
new Offset(43.554173693841996f, 39.8830924848f)
},
new List<Offset>{
new Offset[]{
new Offset(39.95328f, 19.414013693841998f),
new Offset(39.95328f, 19.414013693841998f),
new Offset(39.95328f, 19.414013693841998f),

new Offset(39.95328f, 43.483986178642f),
new Offset(39.95328f, 43.483986178642f)
},
new List<Offset>{
new Offset[]{
new Offset(39.95328f, 23.85984f),
new Offset(39.95328f, 23.85984f),
new Offset(39.95328f, 23.85984f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(39.95328f, 28.305635610355335f),
new Offset(39.95328f, 28.305635610355335f),
new Offset(39.95328f, 28.305635610355335f),

new Offset(39.95328f, 52.37560809515534f),
new Offset(39.95328f, 52.37560809515534f)
},
new List<Offset>{
new Offset[]{
new Offset(43.554173693841996f, 31.90656f),
new Offset(43.554173693841996f, 31.90656f),
new Offset(43.554173693841996f, 31.90656f),

new Offset(43.554173693841996f, 55.9765324848f),
new Offset(43.554173693841996f, 55.9765324848f)
},
new List<Offset>{
new Offset[]{
new Offset(48.0f, 31.90656f),
new Offset(48.0f, 31.90656f),
new Offset(48.0f, 31.90656f),

}
),
new _PathFrames(
opacities: new List<float>{
opacities: new float[]{
1.0f,
1.0f,
1.0f,

0.0f,
0.0f,
},
commands: new List<_PathCommand>{
commands: new _PathCommand[]{
new List<Offset>{
new Offset[]{
new Offset(48.0f, 39.95328f),
new Offset(48.0f, 39.95328f),
new Offset(48.0f, 39.95328f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(43.554173693841996f, 39.95328f),
new Offset(43.554173693841996f, 39.95328f),
new Offset(43.554173693841996f, 39.95328f),

new Offset(43.554173693841996f, 39.95328f),
new Offset(43.554173693841996f, 39.95328f)
},
new List<Offset>{
new Offset[]{
new Offset(39.95328f, 43.554173693841996f),
new Offset(39.95328f, 43.554173693841996f),
new Offset(39.95328f, 43.554173693841996f),

new Offset(39.95328f, 43.554173693841996f),
new Offset(39.95328f, 43.554173693841996f)
},
new List<Offset>{
new Offset[]{
new Offset(39.95328f, 48.0f),
new Offset(39.95328f, 48.0f),
new Offset(39.95328f, 48.0f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(39.95328f, 52.445826306158004f),
new Offset(39.95328f, 52.445826306158004f),
new Offset(39.95328f, 52.445826306158004f),

new Offset(39.95328f, 52.445826306158004f),
new Offset(39.95328f, 52.445826306158004f)
},
new List<Offset>{
new Offset[]{
new Offset(43.554173693841996f, 56.04672f),
new Offset(43.554173693841996f, 56.04672f),
new Offset(43.554173693841996f, 56.04672f),

new Offset(43.554173693841996f, 56.04672f),
new Offset(43.554173693841996f, 56.04672f)
},
new List<Offset>{
new Offset[]{
new Offset(48.0f, 56.04672f),
new Offset(48.0f, 56.04672f),
new Offset(48.0f, 56.04672f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(52.445826306158004f, 56.04672f),
new Offset(52.445826306158004f, 56.04672f),
new Offset(52.445826306158004f, 56.04672f),

new Offset(52.445826306158004f, 56.04672f),
new Offset(52.445826306158004f, 56.04672f)
},
new List<Offset>{
new Offset[]{
new Offset(56.04672f, 52.445826306158004f),
new Offset(56.04672f, 52.445826306158004f),
new Offset(56.04672f, 52.445826306158004f),

new Offset(56.04672f, 52.445826306158004f),
new Offset(56.04672f, 52.445826306158004f)
},
new List<Offset>{
new Offset[]{
new Offset(56.04672f, 48.0f),
new Offset(56.04672f, 48.0f),
new Offset(56.04672f, 48.0f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(56.04672f, 43.554173693841996f),
new Offset(56.04672f, 43.554173693841996f),
new Offset(56.04672f, 43.554173693841996f),

new Offset(56.04672f, 43.554173693841996f),
new Offset(56.04672f, 43.554173693841996f)
},
new List<Offset>{
new Offset[]{
new Offset(52.445826306158004f, 39.95328f),
new Offset(52.445826306158004f, 39.95328f),
new Offset(52.445826306158004f, 39.95328f),

new Offset(52.445826306158004f, 39.95328f),
new Offset(52.445826306158004f, 39.95328f)
},
new List<Offset>{
new Offset[]{
new Offset(48.0f, 39.95328f),
new Offset(48.0f, 39.95328f),
new Offset(48.0f, 39.95328f),

}
),
new _PathFrames(
opacities: new List<float>{
opacities: new float[]{
1.0f,
1.0f,
1.0f,

0.0f,
0.0f,
},
commands: new List<_PathCommand>{
commands: new _PathCommand[]{
new List<Offset>{
new Offset[]{
new Offset(48.0f, 64.09344f),
new Offset(48.0f, 64.09344f),
new Offset(48.0f, 64.09344f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(43.554173693841996f, 64.09344f),
new Offset(43.554173693841996f, 64.09344f),
new Offset(43.554173693841996f, 64.09344f),

new Offset(43.554173693841996f, 40.0563383664f),
new Offset(43.554173693841996f, 40.0563383664f)
},
new List<Offset>{
new Offset[]{
new Offset(39.95328f, 67.69436438964466f),
new Offset(39.95328f, 67.69436438964466f),
new Offset(39.95328f, 67.69436438964466f),

new Offset(39.95328f, 43.65726275604466f),
new Offset(39.95328f, 43.65726275604466f)
},
new List<Offset>{
new Offset[]{
new Offset(39.95328f, 72.14016000000001f),
new Offset(39.95328f, 72.14016000000001f),
new Offset(39.95328f, 72.14016000000001f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(39.95328f, 76.585986306158f),
new Offset(39.95328f, 76.585986306158f),
new Offset(39.95328f, 76.585986306158f),

new Offset(39.95328f, 52.548884672558f),
new Offset(39.95328f, 52.548884672558f)
},
new List<Offset>{
new Offset[]{
new Offset(43.554173693841996f, 80.18688f),
new Offset(43.554173693841996f, 80.18688f),
new Offset(43.554173693841996f, 80.18688f),

new Offset(43.554173693841996f, 56.1497783664f),
new Offset(43.554173693841996f, 56.1497783664f)
},
new List<Offset>{
new Offset[]{
new Offset(48.0f, 80.18688f),
new Offset(48.0f, 80.18688f),
new Offset(48.0f, 80.18688f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(52.445826306158004f, 80.18688f),
new Offset(52.445826306158004f, 80.18688f),
new Offset(52.445826306158004f, 80.18688f),

new Offset(52.445826306158004f, 56.1497783664f),
new Offset(52.445826306158004f, 56.1497783664f)
},
new List<Offset>{
new Offset[]{
new Offset(56.04672f, 76.585986306158f),
new Offset(56.04672f, 76.585986306158f),
new Offset(56.04672f, 76.585986306158f),

new Offset(56.04672f, 52.548884672558f),
new Offset(56.04672f, 52.548884672558f)
},
new List<Offset>{
new Offset[]{
new Offset(56.04672f, 72.14016000000001f),
new Offset(56.04672f, 72.14016000000001f),
new Offset(56.04672f, 72.14016000000001f),

}
),
new _PathCubicTo(
new List<Offset>{
new Offset[]{
new Offset(56.04672f, 67.69436438964466f),
new Offset(56.04672f, 67.69436438964466f),
new Offset(56.04672f, 67.69436438964466f),

new Offset(56.04672f, 43.65726275604466f),
new Offset(56.04672f, 43.65726275604466f)
},
new List<Offset>{
new Offset[]{
new Offset(52.445826306158004f, 64.09344f),
new Offset(52.445826306158004f, 64.09344f),
new Offset(52.445826306158004f, 64.09344f),

new Offset(52.445826306158004f, 40.0563383664f),
new Offset(52.445826306158004f, 40.0563383664f)
},
new List<Offset>{
new Offset[]{
new Offset(48.0f, 64.09344f),
new Offset(48.0f, 64.09344f),
new Offset(48.0f, 64.09344f),

260
com.unity.uiwidgets/Runtime/material/animated_icons/data/event_add.g.cs
文件差异内容过多而无法显示
查看文件

1
com.unity.uiwidgets/Runtime/material/material_state.cs


using System.Collections.Generic;
using Unity.UIWidgets.material;
using Unity.UIWidgets.ui;
namespace Unity.UIWidgets.material {

10
com.unity.uiwidgets/Runtime/services/keyboard.cs


}
#if UNITY_IOS
/*
[DllImport ("__Internal")]
internal static extern void UIWidgetsTextInputShow();

internal static extern void UIWidgetsTextInputSetTextInputEditingState(string jsonText);
[DllImport ("__Internal")]
internal static extern void UIWidgetsTextInputClearTextInputClient();
internal static extern void UIWidgetsTextInputClearTextInputClient();*/
internal static void UIWidgetsTextInputShow() {}
internal static void UIWidgetsTextInputHide() {}
internal static void UIWidgetsTextInputSetClient(int client, string configuration) {}
internal static void UIWidgetsTextInputSetTextInputEditingState(string jsonText) {}
internal static void UIWidgetsTextInputClearTextInputClient() {}
#elif UNITY_ANDROID
internal static void UIWidgetsTextInputShow() {
using (

4
com.unity.uiwidgets/Runtime/services/text_input.cs


}
else {
#if UNITY_IOS || UNITY_ANDROID
if (configuration.unityTouchKeyboard) {
/*if (configuration.unityTouchKeyboard) {
}
}*/
#elif UNITY_WEBGL
keyboardDelegate = new UIWidgetsWebGLKeyboardDelegate();
#else

12
com.unity.uiwidgets/Runtime/ui2/hooks.cs


namespace Unity.UIWidgets.ui {
public static class Hooks {
static bool hooked = false;
#if UNITY_EDITOR
[UnityEditor.InitializeOnLoadMethod]
#else

D.assert(!hooked);
hooked = true;
Mono_hook(
Mono_throwException,
Mono_shutdown);

Window_drawFrame,
ui_._dispatchPlatformMessage,
ui_._dispatchPointerDataPacket);
}
public static void tryHook() {
if (hooked) {
return;
}
hook();
}
delegate void Mono_ThrowExceptionCallback(IntPtr exception);

257
engine/Build.bee.cs


}
}
//ios build helpers
class UserIOSSdkLocator : IOSSdkLocator
{
public UserIOSSdkLocator() : base(Architecture.Arm64) {}
public IOSSdk UserIOSSdk(NPath path)
{
return DefaultSdkFromXcodeApp(path);
}
}
class IOSAppToolchain : IOSToolchain
{
//there is a bug in XCodeProjectFile.cs and the class IosPlatform, where the acceptale Platform Name is not matched
//we workaround this bug by overriding LegacyPlatformIdentifier to the correct one
public override string LegacyPlatformIdentifier => $"iphone_{Architecture.Name}";
//copied from com.unity.platforms.ios/Editor/Unity.Platform.Editor/bee~/IOSAppToolchain.cs
private static NPath _XcodePath = null;
private static NPath XcodePath
{
get
{
if (_XcodePath == null)
{
string error = "";
try
{
if (HostPlatform.IsOSX)
{
var start = new ProcessStartInfo("xcode-select", "-p")
{
RedirectStandardOutput = true,
RedirectStandardError = true,
RedirectStandardInput = true,
UseShellExecute = false,
};
string output = "";
using (var process = Process.Start(start))
{
process.OutputDataReceived += (sender, e) => { output += e.Data; };
process.ErrorDataReceived += (sender, e) => { error += e.Data; };
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit(); //? doesn't work correctly if time interval is set
}
_XcodePath = error == "" ? output : "";
if (_XcodePath != "" && _XcodePath.DirectoryExists())
{
_XcodePath = XcodePath.Parent.Parent;
}
else
{
throw new InvalidOperationException("Failed to find Xcode, xcode-select did not return a valid path");
}
}
}
catch (InvalidOperationException e)
{
Console.WriteLine(
$"xcode-select did not return a valid path. Error message, if any, was: {error}. " +
$"Often this can be fixed by making sure you have Xcode command line tools" +
$" installed correctly, and then running `sudo xcode-select -r`");
throw e;
}
}
return _XcodePath;
}
}
//private static string XcodePath = "/Applications/Xcode.app/";
public IOSAppToolchain() : base((new UserIOSSdkLocator()).UserIOSSdk(XcodePath))
{
}
}
/**
* How to add new target platform (taking iOS as the example)
* (1) add a new static void DeployIOS() {} in which we need call SetupLibUIWidgets() with UIWidgetsBuildTargetPlatform.ios as its

}
}
//bee.exe ios
static void DeployIOS()
{
var libUIWidgets = SetupLibUIWidgets(UIWidgetsBuildTargetPlatform.ios, out var dependencies);
var nativePrograms = new List<NativeProgram>();
nativePrograms.Add(libUIWidgets);
var xcodeProject = new XCodeProjectFile(nativePrograms, new NPath("libUIWidgetsIOS.xcodeproj/project.pbxproj"));
Backend.Current.AddAliasDependency("ios", new NPath("libUIWidgetsIOS.xcodeproj/project.pbxproj"));
foreach(var dep in dependencies) {
Backend.Current.AddAliasDependency("ios", dep);
}
}
static void Main()
{
flutterRoot = Environment.GetEnvironmentVariable("FLUTTER_ROOT");

{
DeployMac();
DeployAndroid();
DeployIOS();
}
}

//this setting is disabled by default, don't change it unless you know what you are doing
//it must be set the same as the settings we choose to build the flutter txt library
//refer to the readme file for the details
private static bool ios_bitcode_enabled = false;
static NativeProgram SetupLibUIWidgets(UIWidgetsBuildTargetPlatform platform, out List<NPath> dependencies)
{
var np = new NativeProgram("libUIWidgets")

"src/shell/platform/unity/android/uiwidgets_panel.cc",
};
var iosSources = new NPath[] {
"src/shell/platform/unity/darwin/ios/uiwidgets_panel.mm",
"src/shell/platform/unity/darwin/ios/uiwidgets_panel.h",
"src/shell/platform/unity/darwin/ios/uiwidgets_system.mm",
"src/shell/platform/unity/darwin/ios/uiwidgets_system.h",
"src/shell/platform/unity/darwin/ios/cocoa_task_runner.cc",
"src/shell/platform/unity/darwin/ios/cocoa_task_runner.h",
"src/shell/platform/unity/darwin/ios/unity_surface_manager.mm",
"src/shell/platform/unity/darwin/ios/unity_surface_manager.h",
};
np.Sources.Add(c => IsIosOrTvos(c), iosSources);
np.Sources.Add(c => IsAndroid(c), androidSource);
np.Libraries.Add(c => IsWindows(c), new BagOfObjectFilesLibrary(

np.CompilerSettings().Add(c => c.WithCppLanguageVersion(CppLanguageVersion.Cpp17));
np.CompilerSettings().Add(c => IsMac(c), c => c.WithCustomFlags(new[] { "-Wno-c++11-narrowing" }));
np.CompilerSettings().Add(c => IsMac(c) || IsIosOrTvos(c), c => c.WithCustomFlags(new []{"-Wno-c++11-narrowing"}));
if (ios_bitcode_enabled) {
np.CompilerSettingsForIosOrTvos().Add(c => c.WithEmbedBitcode(true));
}
np.Defines.Add(c => IsAndroid(c), new[] {
"USE_OPENSSL=1",
"USE_OPENSSL_CERTS=1",

np.IncludeDirectories.Add("src");
np.Defines.Add("UIWIDGETS_ENGINE_VERSION=\\\"0.0\\\"", "SKIA_VERSION=\\\"0.0\\\"");
np.Defines.Add(c => IsMac(c), "UIWIDGETS_FORCE_ALIGNAS_8=\\\"1\\\"");
np.Defines.Add(c => IsMac(c) || IsIosOrTvos(c), "UIWIDGETS_FORCE_ALIGNAS_8=\\\"1\\\"");
np.Defines.Add(c => c.CodeGen == CodeGen.Debug,
new[] { "_ITERATOR_DEBUG_LEVEL=2", "_HAS_ITERATOR_DEBUGGING=1", "_SECURE_SCL=1" });

np.ValidConfigurations = validConfigurations;
}
else if (platform == UIWidgetsBuildTargetPlatform.ios)
{
var toolchain = new IOSAppToolchain();
var validConfigurations = new List<NativeProgramConfiguration>();
foreach (var codegen in codegens)
{
var config = new NativeProgramConfiguration(codegen, toolchain, lump: true);
validConfigurations.Add(config);
var buildProgram = np.SetupSpecificConfiguration(config, toolchain.StaticLibraryFormat);
var builtNP = buildProgram.DeployTo("build");
var deployNP = buildProgram.DeployTo("../Samples/UIWidgetsSamples_2019_4/Assets/Plugins/iOS/");
dependencies.Add(builtNP.Path);
dependencies.Add(deployNP.Path);
}
Backend.Current.AddAliasDependency("ios", CopyTool.Instance().Setup("../Samples/UIWidgetsSamples_2019_4/Assets/Plugins/iOS/CustomAppController.m", "src/external/ios/CustomAppController.m"));
np.ValidConfigurations = validConfigurations;
}
return np;
}

static void SetupDependency(NativeProgram np)
{
SetupRadidJson(np);
np.Defines.Add(c => IsIosOrTvos(c), new []
{
//lib flutter
"__STDC_CONSTANT_MACROS",
"__STDC_FORMAT_MACROS",
"_FORTIFY_SOURCE=2",
"_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
"_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS",
"_DEBUG",
"FLUTTER_RUNTIME_MODE_DEBUG=1",
"FLUTTER_RUNTIME_MODE_PROFILE=2",
"FLUTTER_RUNTIME_MODE_RELEASE=3",
"FLUTTER_RUNTIME_MODE_JIT_RELEASE=4",
"FLUTTER_RUNTIME_MODE=1",
"FLUTTER_JIT_RUNTIME=1",
//lib skia
"SK_ENABLE_SPIRV_VALIDATION",
"SK_ASSUME_GL_ES=1","SK_ENABLE_API_AVAILABLE",
"SK_GAMMA_APPLY_TO_A8",
"SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1",
"GR_TEST_UTILS=1",
"SKIA_IMPLEMENTATION=1",
"SK_GL",
"SK_ENABLE_DUMP_GPU",
"SK_SUPPORT_PDF",
"SK_CODEC_DECODES_JPEG",
"SK_ENCODE_JPEG",
"SK_ENABLE_ANDROID_UTILS",
"SK_USE_LIBGIFCODEC",
"SK_HAS_HEIF_LIBRARY",
"SK_CODEC_DECODES_PNG",
"SK_ENCODE_PNG",
"SK_CODEC_DECODES_RAW",
"SK_ENABLE_SKSL_INTERPRETER",
"SK_CODEC_DECODES_WEBP",
"SK_ENCODE_WEBP",
"SK_XML",
});
np.Defines.Add(c => IsIosOrTvos(c), new[] {
"__STDC_CONSTANT_MACROS",
"__STDC_FORMAT_MACROS",
"_FORTIFY_SOURCE=2",
"_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
"_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS",
"_DEBUG",
"SK_GL",
"SK_METAL",
"SK_ENABLE_DUMP_GPU",
"SK_CODEC_DECODES_JPEG",
"SK_ENCODE_JPEG",
"SK_CODEC_DECODES_PNG",
"SK_ENCODE_PNG",
"SK_CODEC_DECODES_WEBP",
"SK_ENCODE_WEBP",
"SK_HAS_WUFFS_LIBRARY",
"FLUTTER_RUNTIME_MODE_DEBUG=1",
"FLUTTER_RUNTIME_MODE_PROFILE=2",
"FLUTTER_RUNTIME_MODE_RELEASE=3",
"FLUTTER_RUNTIME_MODE_JIT_RELEASE=4",
"FLUTTER_RUNTIME_MODE=1",
"FLUTTER_JIT_RUNTIME=1",
"U_USING_ICU_NAMESPACE=0",
"U_ENABLE_DYLOAD=0",
"USE_CHROMIUM_ICU=1",
"U_STATIC_IMPLEMENTATION",
"ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE",
"UCHAR_TYPE=uint16_t",
"SK_DISABLE_REDUCE_OPLIST_SPLITTING",
"SK_ENABLE_DUMP_GPU",
"SK_DISABLE_AAA",
"SK_DISABLE_READBUFFER",
"SK_DISABLE_EFFECT_DESERIALIZATION",
"SK_DISABLE_LEGACY_SHADERCONTEXT",
"SK_DISABLE_LOWP_RASTER_PIPELINE",
"SK_FORCE_RASTER_PIPELINE_BLITTER",
"SK_GL",
"SK_ASSUME_GL_ES=1",
"SK_ENABLE_API_AVAILABLE"
});
np.CompilerSettings().Add(c => IsIosOrTvos(c), c => c.WithCustomFlags(new[] {
"-MD",
"-MF",
"-I.",
"-Ithird_party",
"-Isrc",
"-I"+ flutterRoot,
"-I"+ flutterRoot+"/third_party/rapidjson/include",
"-I"+ skiaRoot,
"-I"+ flutterRoot+"/flutter/third_party/txt/src",
"-I" + flutterRoot + "/third_party/harfbuzz/src",
"-I" + skiaRoot + "/third_party/externals/icu/source/common",
// "-Igen",
"-I"+ flutterRoot+"/third_party/icu/source/common",
"-I"+ flutterRoot+"/third_party/icu/source/i18n",
"-fvisibility-inlines-hidden",
}));
np.Libraries.Add(IsIosOrTvos, c => {
return new PrecompiledLibrary[]
{
new StaticLibrary(flutterRoot+"/out/ios_debug_unopt/obj/flutter/third_party/txt/libtxt_lib.a"),
new SystemFramework("CoreFoundation"),
new SystemFramework("ImageIO"),
new SystemFramework("MobileCoreServices"),
new SystemFramework("CoreGraphics"),
new SystemFramework("CoreText"),
new SystemFramework("UIKit"),
};
});
// TODO: fix warning, there are some type mismatches
var ignoreWarnigs = new string[] { "4244", "4267", "5030", "4101", "4996", "4359", "4018", "4091", "4722", "4312", "4838", "4172", "4005", "4311", "4477" };

93
engine/README.md


cd <uiwidigets_dir>\engine
python $FLUTTER_ROOT/flutter/sky/tools/objcopy.py --objcopy $FLUTTER_ROOT/third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-objcopy --input $FLUTTER_ROOT/third_party/icu/flutter/icudtl.dat --output icudtl.o --arch arm
```
### build uiwidgets
```
cd <uiwidigets_dir>\engine
mono bee.exe android
```
### build uiwidgets
## How to Build (IOS)
The UIWidgets engine for iOS can only be built on Mac.
### Preliminaries
There is a special settings, namely "Enable bitcode" we need set properly when building an ios native plugin.
Generally, the program is possible to run faster when "Enable bitcode" is true while the size of the plugin
will also become bigger.
You can choose to build the library with enabled or disabled "Enable bitcode" using different build commands as
shown in the following two sections.
You can also build UIWidgets engine with enabled or disabled "Enable bitcode" by changing the value of
"ios_bitcode_enabled" in "Build.bee.cs". Note that the value is set to false by default.
You can also change the setting of "Enable bitcode" in the XCode project generated by Unity. Specifically, you can
find this setting in "Build Settings/Build Options/Enable Bitcode". This value is true by default.
You should always keep the "Enable bitcode" settings the same in the built library, the UIWidgets engine and the XCode project generated by your UIWidget project.
### Build Dependencies
Setting up the Engine development environment
Please follow https://github.com/flutter/flutter/wiki/Setting-up-the-Engine-development-environment.
Check out repo and update dependencies:
```
cd $FLUTTER_ROOT/flutter
git checkout flutter-1.17-candidate.5
gclient sync -D
```
Apply following to end of `flutter/third_party/txt/BUILD.gn`
```
diff --git a/third_party/txt/BUILD.gn b/third_party/txt/BUILD.gn
index 56b73a020..d42e88045 100644
--- a/third_party/txt/BUILD.gn
+++ b/third_party/txt/BUILD.gn
@@ -141,6 +141,7 @@ source_set("txt") {
"//third_party/harfbuzz",
"//third_party/icu",
"//third_party/skia",
+ "//third_party/skia/modules/skottie",
]
deps = [
@@ -339,3 +340,10 @@ executable("txt_benchmarks") {
deps += [ "//third_party/skia/modules/skparagraph" ]
}
}
+
+static_library("txt_lib") {
+ complete_static_lib = true
+ deps = [
+ ":txt",
+ ]
+}
```
Comiple engine:
```
cd $FLUTTER_ROOT
./flutter/tools/gn --unoptimized --ios //disable bitcode
./flutter/tools/gn --unoptimized --ios --bitcode //enable bitcode
```
add this line to the end of out/ios_debug_unopt/args.gn:
```
icu_use_data_file=false
```
finally run ninja:
```
ninja -C out/ios_debug_unopt/ flutter/third_party/txt:txt_lib
```
If the compilation fails because "no available Mac SDK is found" (in flutter-1.17 the build tool will only try to find Mac 10.XX SDKs), please modify the file "/src/build/Mac/find_sdk.py" under flutter root by setting "sdks" as your current sdk, e.g., ['11.0'].
If the compilation fails because "'Foundation/NSURLHandle.h' file not found" (flutter-1.17 assumes that you are using some low iphone SDK (e.g., older than 12.2), in which some platform-dependent Macros are defined differently from new SDKs like 12.2), please modify the file "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/TargetConditionals.h" in your system by making "TARGET_OS_EMBEDDED = 1" and "TARGET_OS_MACCATALYST = 0" for arm64-iphone architecture. You can also work-around this issue by checking out a new version of flutter (e.g., "flutter-1.18-candidate.6") and run "gclient sync -D" to get dependencies on newer iphone SDKs. Then switch back and build.
### Build Engine
mono bee.exe
mono bee.exe ios
```

35
engine/src/lib/ui/painting/color_filter.cc


#include "color_filter.h"
#include "runtime/mono_api.h"
namespace uiwidgets {

ColorFilter::~ColorFilter() = default;
} // namespace uiwidgets
UIWIDGETS_API(ColorFilter*)
ColorFilter_constructor() {
const auto colorFilter = ColorFilter::Create();
colorFilter->AddRef();
return colorFilter.get();
}
UIWIDGETS_API(void)
ColorFilter_dispose(ColorFilter* ptr) {
ptr->Release();
}
UIWIDGETS_API(void)
ColorFilter_initMode(ColorFilter* ptr, int color, int blend_mode) {
ptr->initMode(color, blend_mode);
}
UIWIDGETS_API(void)
ColorFilter_initMatrix(ColorFilter* ptr, const float* color_matrix) {
ptr->initMatrix(color_matrix);
}
UIWIDGETS_API(void)
ColorFilter_initLinearToSrgbGamma(ColorFilter* ptr) {
ptr->initLinearToSrgbGamma();
}
UIWIDGETS_API(void)
ColorFilter_initSrgbToLinearGamma(ColorFilter* ptr) {
ptr->initSrgbToLinearGamma();
}
} // namespace uiwidgets

8
engine/src/shell/platform/unity/uiwidgets_system.h


#ifdef __ANDROID__
#include "shell/platform/unity/android/uiwidgets_system.h"
#elif __APPLE__
#include "shell/platform/unity/darwin/macos/uiwidgets_system.h"
#ifdef TARGET_OS_IOS
#include "shell/platform/unity/darwin/ios/uiwidgets_system.h"
#else
#include "shell/platform/unity/darwin/macos/uiwidgets_system.h"
#endif
#include "shell/platform/unity/windows/uiwidgets_system.h"
#include "shell/platform/unity/windows/uiwidgets_system.h"
#endif

26
engine/src/external/ios/CustomAppController.m


#if TARGET_OS_IOS
#import "UnityAppController.h"
#import <TargetConditionals.h>
extern void UnityPluginLoad(struct IUnityInterfaces *interfaces);
extern void UnityPluginUnload(void);
#pragma mark - App controller subclasssing
@interface CustomAppController : UnityAppController
{
}
- (void)shouldAttachRenderDelegate;
@end
@implementation CustomAppController
- (void)shouldAttachRenderDelegate;
{
UnityRegisterRenderingPluginV5(&UnityPluginLoad, &UnityPluginUnload);
}
@end
IMPL_APP_CONTROLLER_SUBCLASS(CustomAppController);
#endif

106
engine/src/shell/platform/unity/darwin/ios/cocoa_task_runner.cc


#include "cocoa_task_runner.h"
#include <flutter/fml/time/time_point.h>
#include <atomic>
#include <utility>
namespace uiwidgets {
CocoaTaskRunner::CocoaTaskRunner(const TaskExpiredCallback& on_task_expired)
: on_task_expired_(std::move(on_task_expired)) {}
CocoaTaskRunner::~CocoaTaskRunner() = default;
std::chrono::nanoseconds CocoaTaskRunner::ProcessTasks() {
const TaskTimePoint now = TaskTimePoint::clock::now();
std::vector<UIWidgetsTask> expired_tasks;
// Process expired tasks.
{
std::lock_guard<std::mutex> lock(task_queue_mutex_);
while (!task_queue_.empty()) {
const auto& top = task_queue_.top();
// If this task (and all tasks after this) has not yet expired, there is
// nothing more to do. Quit iterating.
if (top.fire_time > now) {
break;
}
// Make a record of the expired task. Do NOT service the task here
// because we are still holding onto the task queue mutex. We don't want
// other threads to block on posting tasks onto this thread till we are
// done processing expired tasks.
expired_tasks.push_back(task_queue_.top().task);
// Remove the tasks from the delayed tasks queue.
task_queue_.pop();
}
}
for (const auto& observer : task_observers_) {
observer.second();
}
// Fire expired tasks.
{
// Flushing tasks here without holing onto the task queue mutex.
for (const auto& task : expired_tasks) {
on_task_expired_(&task);
for (const auto& observer : task_observers_) {
observer.second();
}
}
}
if (!expired_tasks.empty()) {
return ProcessTasks();
}
// Calculate duration to sleep for on next iteration.
{
std::lock_guard<std::mutex> lock(task_queue_mutex_);
const auto next_wake = task_queue_.empty() ? TaskTimePoint::max()
: task_queue_.top().fire_time;
return std::min(next_wake - now, std::chrono::nanoseconds::max());
}
}
CocoaTaskRunner::TaskTimePoint CocoaTaskRunner::TimePointFromUIWidgetsTime(
uint64_t uiwidgets_target_time_nanos) {
const auto fml_now = fml::TimePoint::Now().ToEpochDelta().ToNanoseconds();
if (uiwidgets_target_time_nanos <= fml_now) {
return {};
}
const auto uiwidgets_duration = uiwidgets_target_time_nanos - fml_now;
const auto now = TaskTimePoint::clock::now();
return now + std::chrono::nanoseconds(uiwidgets_duration);
}
void CocoaTaskRunner::PostTask(UIWidgetsTask uiwidgets_task,
uint64_t uiwidgets_target_time_nanos) {
static std::atomic_uint64_t sGlobalTaskOrder(0);
Task task;
task.order = ++sGlobalTaskOrder;
task.fire_time = TimePointFromUIWidgetsTime(uiwidgets_target_time_nanos);
task.task = uiwidgets_task;
{
std::lock_guard<std::mutex> lock(task_queue_mutex_);
task_queue_.push(task);
}
}
void CocoaTaskRunner::AddTaskObserver(intptr_t key,
const fml::closure& callback) {
task_observers_[key] = callback;
}
void CocoaTaskRunner::RemoveTaskObserver(intptr_t key) {
task_observers_.erase(key);
}
} // namespace uiwidgets

66
engine/src/shell/platform/unity/darwin/ios/cocoa_task_runner.h


#pragma once
#include <flutter/fml/closure.h>
#include <chrono>
#include <deque>
#include <map>
#include <mutex>
#include <queue>
#include "shell/platform/embedder/embedder.h"
#include <flutter/fml/memory/ref_counted.h>
#include "runtime/mono_api.h"
namespace uiwidgets {
class CocoaTaskRunner {
public:
using TaskExpiredCallback = std::function<void(const UIWidgetsTask*)>;
CocoaTaskRunner(const TaskExpiredCallback& on_task_expired);
~CocoaTaskRunner();
std::chrono::nanoseconds ProcessTasks();
// Post a Flutter engine tasks to the event loop for delayed execution.
void PostTask(UIWidgetsTask uiwidgets_task,
uint64_t uiwidgets_target_time_nanos);
void AddTaskObserver(intptr_t key, const fml::closure& callback);
void RemoveTaskObserver(intptr_t key);
FML_DISALLOW_COPY_AND_ASSIGN(CocoaTaskRunner);
private:
using TaskTimePoint = std::chrono::steady_clock::time_point;
struct Task {
uint64_t order;
TaskTimePoint fire_time;
UIWidgetsTask task;
struct Comparer {
bool operator()(const Task& a, const Task& b) {
if (a.fire_time == b.fire_time) {
return a.order > b.order;
}
return a.fire_time > b.fire_time;
}
};
};
TaskExpiredCallback on_task_expired_;
std::mutex task_queue_mutex_;
std::priority_queue<Task, std::deque<Task>, Task::Comparer> task_queue_;
using TaskObservers = std::map<intptr_t, fml::closure>;
TaskObservers task_observers_;
static TaskTimePoint TimePointFromUIWidgetsTime(
uint64_t uiwidgets_target_time_nanos);
};
} // namespace uiwidgets

124
engine/src/shell/platform/unity/darwin/ios/uiwidgets_panel.h


#pragma once
#include <mutex>
#include <queue>
#include <map>
#include <flutter/fml/memory/ref_counted.h>
#include "shell/platform/unity/gfx_worker_task_runner.h"
#include "runtime/mono_api.h"
#include "cocoa_task_runner.h"
#include "unity_surface_manager.h"
namespace uiwidgets {
enum UIWidgetsWindowType {
InvalidPanel = 0,
GameObjectPanel = 1,
EditorWindowPanel = 2
};
struct MouseState {
bool state_is_down = false;
bool state_is_added = false;
uint64_t buttons = 0;
};
class UIWidgetsPanel : public fml::RefCountedThreadSafe<UIWidgetsPanel> {
FML_FRIEND_MAKE_REF_COUNTED(UIWidgetsPanel);
public:
typedef void (*EntrypointCallback)(Mono_Handle handle);
static fml::RefPtr<UIWidgetsPanel> Create(
Mono_Handle handle, UIWidgetsWindowType window_type, EntrypointCallback entrypoint_callback);
~UIWidgetsPanel();
void* OnEnable(size_t width, size_t height, float device_pixel_ratio, const char* streaming_assets_path, const char* settings);
void MonoEntrypoint();
void OnDisable();
void* OnRenderTexture(size_t width, size_t height,
float dpi);
bool ReleaseNativeRenderTexture();
int RegisterTexture(void* native_texture_ptr);
void UnregisterTexture(int texture_id);
std::chrono::nanoseconds ProcessMessages();
void ProcessVSync();
void VSyncCallback(intptr_t baton);
void SetEventLocationFromCursorPosition(UIWidgetsPointerEvent* event_data);
void OnKeyDown(int keyCode, bool isKeyDown);
void OnMouseMove(float x, float y);
void OnScroll(float x, float y, float px, float py);
void OnMouseDown(float x, float y, int button);
void OnMouseUp(float x, float y, int button);
void OnMouseLeave();
bool NeedUpdateByPlayerLoop();
bool NeedUpdateByEditorLoop();
private:
UIWidgetsPanel(Mono_Handle handle, UIWidgetsWindowType window_type, EntrypointCallback entrypoint_callback);
void CreateInternalUIWidgetsEngine(size_t width, size_t height, float device_pixel_ratio, const char* streaming_assets_path, const char* settings);
MouseState GetMouseState() { return mouse_state_; }
void ResetMouseState() { mouse_state_ = MouseState(); }
void SetMouseStateDown(bool is_down) { mouse_state_.state_is_down = is_down; }
void SetMouseStateAdded(bool is_added) {
mouse_state_.state_is_added = is_added;
}
void SetMouseButtons(uint64_t buttons) { mouse_state_.buttons = buttons; }
void SendMouseMove(float x, float y);
void SendMouseDown(float x, float y);
void SendMouseUp(float x, float y);
void SendMouseLeave();
void SendScroll(float delta_x, float delta_y, float px, float py);
void SetEventPhaseFromCursorButtonState(UIWidgetsPointerEvent* event_data);
void SendPointerEventWithData(const UIWidgetsPointerEvent& event_data);
Mono_Handle handle_;
EntrypointCallback entrypoint_callback_;
UIWidgetsWindowType window_type_;
std::unique_ptr<UnitySurfaceManager> surface_manager_;
std::unique_ptr<GfxWorkerTaskRunner> gfx_worker_task_runner_;
std::unique_ptr<CocoaTaskRunner> task_runner_;
UIWidgetsEngine engine_ = nullptr;
std::vector<intptr_t> vsync_batons_;
MouseState mouse_state_;
bool process_events_ = false;
};
} // namespace uiwidgets

79
engine/src/shell/platform/unity/darwin/ios/uiwidgets_system.h


#pragma once
#include <flutter/fml/closure.h>
#include <chrono>
#include <cstdarg>
#include <set>
#include <unordered_map>
#include <mutex>
#include "Unity/IUnityInterface.h"
#include "Unity/IUnityUIWidgets.h"
#include "flutter/fml/macros.h"
#include "runtime/mono_api.h"
namespace uiwidgets {
using TimePoint = std::chrono::steady_clock::time_point;
class UIWidgetsPanel;
class UIWidgetsSystem {
public:
UIWidgetsSystem();
~UIWidgetsSystem();
void RegisterPanel(UIWidgetsPanel* panel);
void UnregisterPanel(UIWidgetsPanel* panel);
void PostTaskToGfxWorker(const fml::closure& task);
void printf_console(const char* log, ...) {
va_list vl;
va_start(vl, log);
unity_uiwidgets_->printf_consolev(log, vl);
va_end(vl);
}
void BindUnityInterfaces(IUnityInterfaces* unity_interfaces);
void UnBindUnityInterfaces();
IUnityInterfaces* GetUnityInterfaces() { return unity_interfaces_; }
static UIWidgetsSystem* GetInstancePtr();
FML_DISALLOW_COPY_AND_ASSIGN(UIWidgetsSystem);
private:
UIWIDGETS_CALLBACK(void) _Update() { GetInstancePtr()->Update(); }
UIWIDGETS_CALLBACK(void) _Wait(long max_duration) {
GetInstancePtr()->Wait(std::chrono::nanoseconds(max_duration));
}
UIWIDGETS_CALLBACK(void) _VSync() { GetInstancePtr()->VSync(); }
UIWIDGETS_CALLBACK(void) _WakeUp() { GetInstancePtr()->WakeUp(); }
UIWIDGETS_CALLBACK(void) _GfxWorkerCallback(int eventId, void* data) {
GetInstancePtr()->GfxWorkerCallback(eventId, data);
}
void Update();
void Wait(std::chrono::nanoseconds max_duration);
void VSync();
void WakeUp();
void GfxWorkerCallback(int eventId, void* data);
IUnityInterfaces* unity_interfaces_ = nullptr;
UnityUIWidgets::IUnityUIWidgets* unity_uiwidgets_ = nullptr;
std::unordered_map<int, fml::closure> gfx_worker_tasks_;
int last_task_id_ = 0;
TimePoint next_uiwidgets_event_time_ = TimePoint::clock::now();
std::set<UIWidgetsPanel*> uiwidgets_panels_;
std::mutex task_mutex_;
};
} // namespace uiwidgets

106
engine/src/shell/platform/unity/darwin/ios/uiwidgets_system.mm


#include "uiwidgets_system.h"
#include <algorithm>
#include <chrono>
#include "uiwidgets_panel.h"
namespace uiwidgets {
UIWidgetsSystem g_uiwidgets_system;
UIWidgetsSystem::UIWidgetsSystem() = default;
UIWidgetsSystem::~UIWidgetsSystem() = default;
void UIWidgetsSystem::RegisterPanel(UIWidgetsPanel* panel) {
uiwidgets_panels_.insert(panel);
}
void UIWidgetsSystem::UnregisterPanel(UIWidgetsPanel* panel) {
uiwidgets_panels_.erase(panel);
}
void UIWidgetsSystem::Wait(std::chrono::nanoseconds max_duration) {
Update();
std::chrono::nanoseconds wait_duration =
std::max(std::chrono::nanoseconds(0),
next_uiwidgets_event_time_ - TimePoint::clock::now());
wait_duration = std::min(max_duration, wait_duration);
//TODO: find a proper api similar to MsgWaitForMultipleObjects on Windows
// which will notify os to wait for the given period of time
}
void UIWidgetsSystem::Update() {
TimePoint next_event_time = TimePoint::max();
for (auto* uiwidgets_panel : uiwidgets_panels_) {
if (!uiwidgets_panel->NeedUpdateByPlayerLoop()) {
continue;
}
std::chrono::nanoseconds wait_duration = uiwidgets_panel->ProcessMessages();
if (wait_duration != std::chrono::nanoseconds::max()) {
next_event_time =
std::min(next_event_time, TimePoint::clock::now() + wait_duration);
}
}
next_uiwidgets_event_time_ = next_event_time;
}
void UIWidgetsSystem::VSync() {
for (auto* uiwidgets_panel : uiwidgets_panels_) {
if (!uiwidgets_panel->NeedUpdateByPlayerLoop()) {
continue;
}
uiwidgets_panel->ProcessVSync();
}
}
void UIWidgetsSystem::WakeUp() {}
void UIWidgetsSystem::GfxWorkerCallback(int eventId, void* data) {
const fml::closure task(std::move(gfx_worker_tasks_[eventId]));
{
std::scoped_lock lock(task_mutex_);
gfx_worker_tasks_.erase(eventId);
}
task();
}
void UIWidgetsSystem::PostTaskToGfxWorker(const fml::closure& task) {
{
std::scoped_lock lock(task_mutex_);
last_task_id_++;
gfx_worker_tasks_[last_task_id_] = task;
}
unity_uiwidgets_->IssuePluginEventAndData(&_GfxWorkerCallback, last_task_id_,
nullptr);
}
void UIWidgetsSystem::BindUnityInterfaces(IUnityInterfaces* unity_interfaces) {
unity_interfaces_ = unity_interfaces;
unity_uiwidgets_ = unity_interfaces_->Get<UnityUIWidgets::IUnityUIWidgets>();
unity_uiwidgets_->SetUpdateCallback(_Update);
unity_uiwidgets_->SetVSyncCallback(_VSync);
unity_uiwidgets_->SetWaitCallback(_Wait);
unity_uiwidgets_->SetWakeUpCallback(_WakeUp);
}
void UIWidgetsSystem::UnBindUnityInterfaces() {
unity_uiwidgets_->SetUpdateCallback(nullptr);
unity_uiwidgets_->SetVSyncCallback(nullptr);
unity_uiwidgets_->SetWaitCallback(nullptr);
unity_uiwidgets_->SetWakeUpCallback(nullptr);
unity_uiwidgets_ = nullptr;
unity_interfaces_ = nullptr;
}
UIWidgetsSystem* UIWidgetsSystem::GetInstancePtr() {
return &g_uiwidgets_system;
}
} // namespace uiwidgets

54
engine/src/shell/platform/unity/darwin/ios/unity_surface_manager.h


#pragma once
#include <OpenGLES/EAGL.h>
#include <OpenGLES/ES2/gl.h>
#include <OpenGLES/ES2/glext.h>
#include <OpenGLES/ES3/gl.h>
#include <UIKit/UIKit.h>
#include <Metal/Metal.h>
#include <CoreVideo/CoreVideo.h>
#include "Unity/IUnityInterface.h"
#include "flutter/fml/macros.h"
namespace uiwidgets {
class UnitySurfaceManager {
public:
UnitySurfaceManager(IUnityInterfaces* unity_interfaces);
~UnitySurfaceManager();
void* CreateRenderTexture(size_t width, size_t height);
void ReleaseNativeRenderContext();
bool ReleaseNativeRenderTexture();
bool ClearCurrentContext();
bool MakeCurrentContext();
bool MakeCurrentResourceContext();
uint32_t GetFbo();
private:
//pixel buffer handles
CVPixelBufferRef pixelbuffer_ref = nullptr;
//gl handlers
EAGLContext *gl_context_ = NULL;
EAGLContext *gl_resource_context_ = NULL;
GLuint default_fbo_ = 0;
GLuint gl_tex_ = 0;
CVOpenGLESTextureCacheRef gl_tex_cache_ref_ = nullptr;
CVOpenGLESTextureRef gl_tex_ref_ = nullptr;
//metal handlers
id<MTLDevice> metal_device_;
id<MTLTexture> metal_tex_;
CVMetalTextureRef metal_tex_ref_ = nullptr;
CVMetalTextureCacheRef metal_tex_cache_ref_ = nullptr;
};
} // namespace uiwidgets

200
engine/src/shell/platform/unity/darwin/ios/unity_surface_manager.mm


#include "unity_surface_manager.h"
#include <flutter/fml/logging.h>
#include "Unity/IUnityGraphics.h"
#include "Unity/IUnityGraphicsMetal.h"
#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367
namespace uiwidgets {
UnitySurfaceManager::UnitySurfaceManager(IUnityInterfaces* unity_interfaces)
{
FML_DCHECK(metal_device_ == nullptr);
//get main gfx device (metal)
auto* graphics = unity_interfaces->Get<IUnityGraphics>();
FML_DCHECK(graphics->GetRenderer() == kUnityGfxRendererMetal);
auto* metalGraphics = unity_interfaces->Get<IUnityGraphicsMetalV1>();
metal_device_ = metalGraphics->MetalDevice();
//create opengl context
FML_DCHECK(!gl_context_);
FML_DCHECK(!gl_resource_context_);
gl_context_ = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
gl_resource_context_ = [[EAGLContext alloc] initWithAPI:[gl_context_ API] sharegroup: [gl_context_ sharegroup]];
FML_DCHECK(gl_context_ != nullptr && gl_resource_context_ != nullptr);
}
UnitySurfaceManager::~UnitySurfaceManager() { ReleaseNativeRenderContext(); }
void* UnitySurfaceManager::CreateRenderTexture(size_t width, size_t height)
{
//Constants
const int ConstCVPixelFormat = kCVPixelFormatType_32BGRA;
const MTLPixelFormat ConstMetalViewPixelFormat = MTLPixelFormatBGRA8Unorm_sRGB;
const GLuint ConstGLInternalFormat = GL_RGBA;
const GLuint ConstGLFormat = GL_BGRA_EXT;
const GLuint ConstGLType = GL_UNSIGNED_INT_8_8_8_8_REV;
//render context must be available
FML_DCHECK(metal_device_ != nullptr && gl_context_ != nullptr);
//render textures must be released already
FML_DCHECK(pixelbuffer_ref == nullptr && default_fbo_ == 0 && gl_tex_ == 0 && gl_tex_cache_ref_ == nullptr && gl_tex_ref_ == nullptr && metal_tex_ == nullptr && metal_tex_ref_ == nullptr && metal_tex_cache_ref_ == nullptr);
CVReturn cvret;
//create pixel buffer
NSDictionary* cvBufferProperties = @{
(__bridge NSString*)kCVPixelBufferOpenGLCompatibilityKey : @YES,
(__bridge NSString*)kCVPixelBufferMetalCompatibilityKey : @YES,
};
cvret = CVPixelBufferCreate(kCFAllocatorDefault,
width, height,
ConstCVPixelFormat,
(__bridge CFDictionaryRef)cvBufferProperties,
&pixelbuffer_ref);
FML_DCHECK(cvret == kCVReturnSuccess);
//create metal context
// 1. Create a Metal Core Video texture cache from the pixel buffer.
cvret = CVMetalTextureCacheCreate(
kCFAllocatorDefault,
nil,
metal_device_,
nil,
&metal_tex_cache_ref_);
FML_DCHECK(cvret == kCVReturnSuccess);
// 2. Create a CoreVideo pixel buffer backed Metal texture image from the texture cache.
cvret = CVMetalTextureCacheCreateTextureFromImage(
kCFAllocatorDefault,
metal_tex_cache_ref_,
pixelbuffer_ref, nil,
ConstMetalViewPixelFormat,
width, height,
0,
&metal_tex_ref_);
FML_DCHECK(cvret == kCVReturnSuccess);
// 3. Get a Metal texture using the CoreVideo Metal texture reference.
metal_tex_ = CVMetalTextureGetTexture(metal_tex_ref_);
FML_DCHECK(metal_tex_ != nullptr);
//create GL Texture
// 1. Create an OpenGL ES CoreVideo texture cache from the pixel buffer.
cvret = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault,
nil,
gl_context_,
nil,
&gl_tex_cache_ref_);
FML_DCHECK(cvret == kCVReturnSuccess);
// 2. Create a CVPixelBuffer-backed OpenGL ES texture image from the texture cache.
cvret = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
gl_tex_cache_ref_,
pixelbuffer_ref,
nil,
GL_TEXTURE_2D,
ConstGLInternalFormat,
width, height,
ConstGLFormat,
ConstGLType,
0,
&gl_tex_ref_);
FML_DCHECK(cvret == kCVReturnSuccess);
// 3. Get an OpenGL ES texture name from the CVPixelBuffer-backed OpenGL ES texture image.
gl_tex_ = CVOpenGLESTextureGetName(gl_tex_ref_);
//initialize gl renderer
[EAGLContext setCurrentContext:gl_context_];
glGenFramebuffers(1, &default_fbo_);
glBindFramebuffer(GL_FRAMEBUFFER, default_fbo_);
const GLenum texType = GL_TEXTURE_2D;
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texType, gl_tex_, 0);
return (__bridge void*)metal_tex_;
}
bool UnitySurfaceManager::ClearCurrentContext()
{
[EAGLContext setCurrentContext:nil];
return true;
}
bool UnitySurfaceManager::MakeCurrentContext()
{
[EAGLContext setCurrentContext:gl_context_];
return true;
}
bool UnitySurfaceManager::MakeCurrentResourceContext()
{
[EAGLContext setCurrentContext:gl_resource_context_];
return true;
}
uint32_t UnitySurfaceManager::GetFbo()
{
return default_fbo_;
}
void UnitySurfaceManager::ReleaseNativeRenderContext()
{
FML_DCHECK(gl_resource_context_);
gl_resource_context_ = nullptr;
FML_DCHECK(gl_context_);
gl_context_ = nullptr;
[EAGLContext setCurrentContext:nil];
FML_DCHECK(metal_device_ != nullptr);
metal_device_ = nullptr;
}
bool UnitySurfaceManager::ReleaseNativeRenderTexture()
{
//release gl resources
FML_DCHECK(default_fbo_ != 0);
glDeleteFramebuffers(1, &default_fbo_);
default_fbo_ = 0;
FML_DCHECK(gl_tex_ != 0);
glDeleteTextures(1, &gl_tex_);
gl_tex_ = 0;
CFRelease(gl_tex_cache_ref_);
gl_tex_cache_ref_ = nullptr;
CFRelease(gl_tex_ref_);
gl_tex_ref_ = nullptr;
//release metal resources
//since ARC is enabled by default, no need to release the texture
metal_tex_ = nullptr;
CFRelease(metal_tex_ref_);
metal_tex_ref_ = nullptr;
CFRelease(metal_tex_cache_ref_);
metal_tex_cache_ref_ = nullptr;
//release cv pixelbuffer
CVPixelBufferRelease(pixelbuffer_ref);
pixelbuffer_ref = nullptr;
return true;
}
} // namespace uiwidgets

525
engine/src/shell/platform/unity/darwin/ios/uiwidgets_panel.mm


#include <flutter/fml/synchronization/waitable_event.h>
#include <iostream>
#include "lib/ui/window/viewport_metrics.h"
#include "runtime/mono_api.h"
#include "shell/platform/embedder/embedder_engine.h"
#include "shell/platform/embedder/embedder.h"
#include "shell/common/switches.h"
#include "uiwidgets_system.h"
#include "uiwidgets_panel.h"
namespace uiwidgets {
fml::RefPtr<UIWidgetsPanel> UIWidgetsPanel::Create(
Mono_Handle handle, UIWidgetsWindowType window_type, EntrypointCallback entrypoint_callback) {
return fml::MakeRefCounted<UIWidgetsPanel>(handle, window_type, entrypoint_callback);
}
UIWidgetsPanel::UIWidgetsPanel(Mono_Handle handle,
UIWidgetsWindowType window_type,
EntrypointCallback entrypoint_callback)
: handle_(handle), window_type_(window_type), entrypoint_callback_(entrypoint_callback) {}
UIWidgetsPanel::~UIWidgetsPanel() = default;
bool UIWidgetsPanel::NeedUpdateByPlayerLoop() {
return window_type_ == GameObjectPanel;
}
bool UIWidgetsPanel::NeedUpdateByEditorLoop() {
return window_type_ == EditorWindowPanel;
}
void* UIWidgetsPanel::OnEnable(size_t width, size_t height, float device_pixel_ratio,
const char* streaming_assets_path, const char* settings)
{
surface_manager_ = std::make_unique<UnitySurfaceManager>(
UIWidgetsSystem::GetInstancePtr()->GetUnityInterfaces());
void* metal_tex = surface_manager_->CreateRenderTexture(width, height);
CreateInternalUIWidgetsEngine(width, height, device_pixel_ratio, streaming_assets_path, settings);
return metal_tex;
}
void UIWidgetsPanel::CreateInternalUIWidgetsEngine(size_t width, size_t height, float device_pixel_ratio,
const char* streaming_assets_path, const char* settings)
{
fml::AutoResetWaitableEvent latch;
std::thread::id gfx_worker_thread_id;
UIWidgetsSystem::GetInstancePtr()->PostTaskToGfxWorker(
[&latch, &gfx_worker_thread_id]() -> void {
gfx_worker_thread_id = std::this_thread::get_id();
latch.Signal();
});
latch.Wait();
gfx_worker_task_runner_ = std::make_unique<GfxWorkerTaskRunner>(
gfx_worker_thread_id, [this](const auto* task) {
if (UIWidgetsEngineRunTask(engine_, task) != kSuccess) {
std::cerr << "Could not post an gfx worker task." << std::endl;
}
});
//render task runner configs
UIWidgetsTaskRunnerDescription render_task_runner = {};
render_task_runner.struct_size = sizeof(UIWidgetsTaskRunnerDescription);
render_task_runner.identifier = 1;
render_task_runner.user_data = gfx_worker_task_runner_.get();
render_task_runner.runs_task_on_current_thread_callback =
[](void* user_data) -> bool {
return static_cast<GfxWorkerTaskRunner*>(user_data)
->RunsTasksOnCurrentThread();
};
render_task_runner.post_task_callback = [](UIWidgetsTask task,
uint64_t target_time_nanos,
void* user_data) -> void {
static_cast<GfxWorkerTaskRunner*>(user_data)->PostTask(task,
target_time_nanos);
};
//renderer config
UIWidgetsRendererConfig config = {};
config.type = kOpenGL;
config.open_gl.struct_size = sizeof(config.open_gl);
config.open_gl.clear_current = [](void* user_data) -> bool {
auto* panel = static_cast<UIWidgetsPanel*>(user_data);
return panel->surface_manager_->ClearCurrentContext();
};
config.open_gl.make_current = [](void* user_data) -> bool {
auto* panel = static_cast<UIWidgetsPanel*>(user_data);
return panel->surface_manager_->MakeCurrentContext();
};
config.open_gl.make_resource_current = [](void* user_data) -> bool {
auto* panel = static_cast<UIWidgetsPanel*>(user_data);
return panel->surface_manager_->MakeCurrentResourceContext();
};
config.open_gl.fbo_callback = [](void* user_data) -> uint32_t {
auto* panel = static_cast<UIWidgetsPanel*>(user_data);
return panel->surface_manager_->GetFbo();
};
config.open_gl.present = [](void* user_data) -> bool { return true; };
config.open_gl.fbo_reset_after_present = true;
//main thread task runner
task_runner_ = std::make_unique<CocoaTaskRunner>(
[this](const auto* task) {
if (UIWidgetsEngineRunTask(engine_, task) != kSuccess) {
std::cerr << "Could not post an engine task." << std::endl;
}
});
UIWidgetsTaskRunnerDescription main_task_runner = {};
main_task_runner.struct_size = sizeof(UIWidgetsTaskRunnerDescription);
main_task_runner.identifier = 2;
main_task_runner.user_data = task_runner_.get();
main_task_runner.runs_task_on_current_thread_callback = [](void* user_data) -> bool {
return [[NSThread currentThread] isMainThread];
};
main_task_runner.post_task_callback = [](UIWidgetsTask task, uint64_t target_time_nanos,
void* user_data) -> void {
static_cast<CocoaTaskRunner*>(user_data)->PostTask(task, target_time_nanos);
};
//setup custom task runners
UIWidgetsCustomTaskRunners custom_task_runners = {};
custom_task_runners.struct_size = sizeof(UIWidgetsCustomTaskRunners);
custom_task_runners.platform_task_runner = &main_task_runner;
custom_task_runners.ui_task_runner = &main_task_runner;
custom_task_runners.render_task_runner = &render_task_runner;
UIWidgetsProjectArgs args = {};
args.struct_size = sizeof(UIWidgetsProjectArgs);
args.assets_path = streaming_assets_path;
args.font_asset = settings;
args.command_line_argc = 0;
args.command_line_argv = nullptr;
args.platform_message_callback =
[](const UIWidgetsPlatformMessage* engine_message,
void* user_data) -> void {};
args.custom_task_runners = &custom_task_runners;
args.task_observer_add = [](intptr_t key, void* callback,
void* user_data) -> void {
auto* panel = static_cast<UIWidgetsPanel*>(user_data);
panel->task_runner_->AddTaskObserver(key, *static_cast<fml::closure*>(callback));
};
args.task_observer_remove = [](intptr_t key, void* user_data) -> void {
auto* panel = static_cast<UIWidgetsPanel*>(user_data);
panel->task_runner_->RemoveTaskObserver(key);
};
args.custom_mono_entrypoint = [](void* user_data) -> void {
auto* panel = static_cast<UIWidgetsPanel*>(user_data);
panel->MonoEntrypoint();
};
args.vsync_callback = [](void* user_data, intptr_t baton) -> void {
auto* panel = static_cast<UIWidgetsPanel*>(user_data);
panel->VSyncCallback(baton);
};
args.initial_window_metrics.width = width;
args.initial_window_metrics.height = height;
args.initial_window_metrics.pixel_ratio = device_pixel_ratio;
UIWidgetsEngine engine = nullptr;
auto result = UIWidgetsEngineInitialize(&config, &args, this, &engine);
if (result != kSuccess || engine == nullptr) {
std::cerr << "Failed to start UIWidgets engine: error " << result
<< std::endl;
return;
}
engine_ = engine;
UIWidgetsEngineRunInitialized(engine);
UIWidgetsSystem::GetInstancePtr()->RegisterPanel(this);
process_events_ = true;
}
void UIWidgetsPanel::MonoEntrypoint() { entrypoint_callback_(handle_); }
void UIWidgetsPanel::OnDisable() {
// drain pending messages
ProcessMessages();
// drain pending vsync batons
ProcessVSync();
process_events_ = false;
UIWidgetsSystem::GetInstancePtr()->UnregisterPanel(this);
if (engine_) {
UIWidgetsEngineShutdown(engine_);
engine_ = nullptr;
}
gfx_worker_task_runner_ = nullptr;
task_runner_ = nullptr;
//release all resources
if (surface_manager_)
{
surface_manager_->ReleaseNativeRenderTexture();
surface_manager_ = nullptr;
}
}
void* UIWidgetsPanel::OnRenderTexture(size_t width,
size_t height, float device_pixel_ratio) {
ViewportMetrics metrics;
metrics.physical_width = static_cast<float>(width);
metrics.physical_height = static_cast<float>(height);
metrics.device_pixel_ratio = device_pixel_ratio;
reinterpret_cast<EmbedderEngine*>(engine_)->SetViewportMetrics(metrics);
return surface_manager_->CreateRenderTexture(width, height);
}
bool UIWidgetsPanel::ReleaseNativeRenderTexture() { return surface_manager_->ReleaseNativeRenderTexture(); }
int UIWidgetsPanel::RegisterTexture(void* native_texture_ptr) {
//TODO: add implementation
std::cerr << "registering external texture is not implemented for MacOS" << std::endl;
return 0;
}
void UIWidgetsPanel::UnregisterTexture(int texture_id) {
//TODO: add implementation
std::cerr << "unregistering external texture is not implemented for MacOS" << std::endl;
}
std::chrono::nanoseconds UIWidgetsPanel::ProcessMessages() {
return std::chrono::nanoseconds(task_runner_->ProcessTasks().count());
}
void UIWidgetsPanel::ProcessVSync() {
std::vector<intptr_t> batons;
vsync_batons_.swap(batons);
for (intptr_t baton : batons) {
reinterpret_cast<EmbedderEngine*>(engine_)->OnVsyncEvent(
baton, fml::TimePoint::Now(),
fml::TimePoint::Now() +
fml::TimeDelta::FromNanoseconds(1000000000 / 60));
}
}
void UIWidgetsPanel::VSyncCallback(intptr_t baton) {
vsync_batons_.push_back(baton);
}
void UIWidgetsPanel::SetEventPhaseFromCursorButtonState(
UIWidgetsPointerEvent* event_data) {
MouseState state = GetMouseState();
event_data->phase = state.buttons == 0
? state.state_is_down ? UIWidgetsPointerPhase::kUp
: UIWidgetsPointerPhase::kHover
: state.state_is_down ? UIWidgetsPointerPhase::kMove
: UIWidgetsPointerPhase::kDown;
}
void UIWidgetsPanel::SendMouseMove(float x, float y) {
UIWidgetsPointerEvent event = {};
event.x = x;
event.y = y;
SetEventPhaseFromCursorButtonState(&event);
SendPointerEventWithData(event);
}
void UIWidgetsPanel::SendMouseDown(float x, float y) {
UIWidgetsPointerEvent event = {};
SetEventPhaseFromCursorButtonState(&event);
event.x = x;
event.y = y;
SendPointerEventWithData(event);
SetMouseStateDown(true);
}
void UIWidgetsPanel::SendMouseUp(float x, float y) {
UIWidgetsPointerEvent event = {};
SetEventPhaseFromCursorButtonState(&event);
event.x = x;
event.y = y;
SendPointerEventWithData(event);
if (event.phase == UIWidgetsPointerPhase::kUp) {
SetMouseStateDown(false);
}
}
void UIWidgetsPanel::SendMouseLeave() {
UIWidgetsPointerEvent event = {};
event.phase = UIWidgetsPointerPhase::kRemove;
SendPointerEventWithData(event);
}
void UIWidgetsPanel::SendScroll(float delta_x, float delta_y, float px, float py) {
UIWidgetsPointerEvent event = {};
// TODO: this is a native method, use unity position instead.
event.x = px;
event.y = py;
SetEventPhaseFromCursorButtonState(&event);
event.signal_kind = UIWidgetsPointerSignalKind::kUIWidgetsPointerSignalKindScroll;
// TODO: See if this can be queried from the OS; this value is chosen
// arbitrarily to get something that feels reasonable.
const int kScrollOffsetMultiplier = 20;
event.scroll_delta_x = delta_x * kScrollOffsetMultiplier;
event.scroll_delta_y = delta_y * kScrollOffsetMultiplier;
SendPointerEventWithData(event);
}
void UIWidgetsPanel::SendPointerEventWithData(
const UIWidgetsPointerEvent& event_data) {
MouseState mouse_state = GetMouseState();
// If sending anything other than an add, and the pointer isn't already added,
// synthesize an add to satisfy Flutter's expectations about events.
if (!mouse_state.state_is_added &&
event_data.phase != UIWidgetsPointerPhase::kAdd) {
UIWidgetsPointerEvent event = {};
event.phase = UIWidgetsPointerPhase::kAdd;
event.x = event_data.x;
event.y = event_data.y;
event.buttons = 0;
SendPointerEventWithData(event);
}
// Don't double-add (e.g., if events are delivered out of order, so an add has
// already been synthesized).
if (mouse_state.state_is_added &&
event_data.phase == UIWidgetsPointerPhase::kAdd) {
return;
}
UIWidgetsPointerEvent event = event_data;
event.device_kind = kUIWidgetsPointerDeviceKindMouse;
event.buttons = mouse_state.buttons;
// Set metadata that's always the same regardless of the event.
event.struct_size = sizeof(event);
event.timestamp =
std::chrono::duration_cast<std::chrono::microseconds>(
std::chrono::high_resolution_clock::now().time_since_epoch())
.count();
UIWidgetsEngineSendPointerEvent(engine_, &event, 1);
if (event_data.phase == UIWidgetsPointerPhase::kAdd) {
SetMouseStateAdded(true);
} else if (event_data.phase == UIWidgetsPointerPhase::kRemove) {
SetMouseStateAdded(false);
ResetMouseState();
}
}
void UIWidgetsPanel::OnKeyDown(int keyCode, bool isKeyDown) {
if (process_events_) {
UIWidgetsPointerEvent event = {};
event.phase = isKeyDown ? UIWidgetsPointerPhase::kMouseDown : UIWidgetsPointerPhase::kMouseUp;
event.device_kind =
UIWidgetsPointerDeviceKind::kUIWidgetsPointerDeviceKindKeyboard;
event.buttons = keyCode;
event.struct_size = sizeof(event);
event.timestamp =
std::chrono::duration_cast<std::chrono::microseconds>(
std::chrono::high_resolution_clock::now().time_since_epoch())
.count();
UIWidgetsEngineSendPointerEvent(engine_, &event, 1);
}
}
void UIWidgetsPanel::OnMouseMove(float x, float y) {
if (process_events_) {
SendMouseMove(x, y);
}
}
void UIWidgetsPanel::OnScroll(float x, float y, float px, float py) {
if (process_events_) {
SendScroll(x, y, px, py);
}
}
static uint64_t ConvertToUIWidgetsButton(int button) {
switch (button) {
case -1:
return kUIWidgetsPointerButtonMousePrimary;
case -2:
return kUIWidgetsPointerButtonMouseSecondary;
case -3:
return kUIWidgetsPointerButtonMouseMiddle;
}
std::cerr << "Mouse button not recognized: " << button << std::endl;
return 0;
}
void UIWidgetsPanel::OnMouseDown(float x, float y, int button) {
if (process_events_) {
uint64_t uiwidgets_button = ConvertToUIWidgetsButton(button);
if (uiwidgets_button != 0) {
uint64_t mouse_buttons = GetMouseState().buttons | uiwidgets_button;
SetMouseButtons(mouse_buttons);
SendMouseDown(x, y);
}
}
}
void UIWidgetsPanel::OnMouseUp(float x, float y, int button) {
if (process_events_) {
uint64_t uiwidgets_button = ConvertToUIWidgetsButton(button);
if (uiwidgets_button != 0) {
uint64_t mouse_buttons = GetMouseState().buttons & ~uiwidgets_button;
SetMouseButtons(mouse_buttons);
SendMouseUp(x, y);
}
}
}
void UIWidgetsPanel::OnMouseLeave() {
if (process_events_) {
SendMouseLeave();
}
}
UIWIDGETS_API(UIWidgetsPanel*)
UIWidgetsPanel_constructor(
Mono_Handle handle, int windowType,
UIWidgetsPanel::EntrypointCallback entrypoint_callback) {
UIWidgetsWindowType window_type = static_cast<UIWidgetsWindowType>(windowType);
const auto panel = UIWidgetsPanel::Create(handle, window_type, entrypoint_callback);
panel->AddRef();
return panel.get();
}
UIWIDGETS_API(void) UIWidgetsPanel_dispose(UIWidgetsPanel* panel) {
panel->Release();
}
UIWIDGETS_API(void*)
UIWidgetsPanel_onEnable(UIWidgetsPanel* panel,
size_t width, size_t height, float device_pixel_ratio,
const char* streaming_assets_path,
const char* settings) {
return panel->OnEnable(width, height, device_pixel_ratio,
streaming_assets_path, settings);
}
UIWIDGETS_API(void) UIWidgetsPanel_onDisable(UIWidgetsPanel* panel) {
panel->OnDisable();
}
UIWIDGETS_API(bool) UIWidgetsPanel_releaseNativeTexture(UIWidgetsPanel* panel) {
return panel->ReleaseNativeRenderTexture();
}
UIWIDGETS_API(void*)
UIWidgetsPanel_onRenderTexture(UIWidgetsPanel* panel,
int width, int height, float dpi) {
return panel->OnRenderTexture(width, height, dpi);
}
UIWIDGETS_API(int)
UIWidgetsPanel_registerTexture(UIWidgetsPanel* panel,
void* native_texture_ptr) {
return panel->RegisterTexture(native_texture_ptr);
}
UIWIDGETS_API(void)
UIWidgetsPanel_unregisterTexture(UIWidgetsPanel* panel, int texture_id) {
panel->UnregisterTexture(texture_id);
}
UIWIDGETS_API(void)
UIWidgetsPanel_onKey(UIWidgetsPanel* panel, int keyCode, bool isKeyDown) {
panel->OnKeyDown(keyCode, isKeyDown);
}
UIWIDGETS_API(void)
UIWidgetsPanel_onMouseDown(UIWidgetsPanel* panel, float x, float y,
int button) {
panel->OnMouseDown(x, y, button);
}
UIWIDGETS_API(void)
UIWidgetsPanel_onMouseUp(UIWidgetsPanel* panel, float x, float y, int button) {
panel->OnMouseUp(x, y, button);
}
UIWIDGETS_API(void)
UIWidgetsPanel_onMouseMove(UIWidgetsPanel* panel, float x, float y) {
panel->OnMouseMove(x, y);
}
UIWIDGETS_API(void)
UIWidgetsPanel_onMouseLeave(UIWidgetsPanel* panel) { panel->OnMouseLeave(); }
UIWIDGETS_API(void)
UIWidgetsPanel_onEditorUpdate(UIWidgetsPanel* panel) {
if (!panel->NeedUpdateByEditorLoop()) {
std::cerr << "only EditorWindowPanel can be updated using onEditorUpdate" << std::endl;
return;
}
//_Update
panel->ProcessMessages();
//_ProcessVSync
panel->ProcessVSync();
//_Wait
panel->ProcessMessages();
}
UIWIDGETS_API(void)
UIWidgetsPanel_onScroll(UIWidgetsPanel* panel, float x, float y, float px, float py) {
panel->OnScroll(x, y, px, py);
}
} // namespace uiwidgets

8
com.unity.uiwidgets/Runtime/Plugins.meta


fileFormatVersion: 2
guid: 748885407ae664e1093421099f1ad4b6
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
正在加载...
取消
保存