diff --git a/Samples/UIWidgetsSamples_2019_4/Assets/Scene/ImageTest.unity b/Samples/UIWidgetsSamples_2019_4/Assets/Scene/ImageTest.unity index 52a7c3c0..497cd994 100644 --- a/Samples/UIWidgetsSamples_2019_4/Assets/Scene/ImageTest.unity +++ b/Samples/UIWidgetsSamples_2019_4/Assets/Scene/ImageTest.unity @@ -269,16 +269,15 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Texture: {fileID: 0} + m_Texture: {fileID: 1525330782} m_UVRect: serializedVersion: 2 x: 0 y: 0 width: 1 height: 1 - fonts: [] - devicePixelRatioOverride: 0 hardwareAntiAliasing: 0 + fonts: [] --- !u!222 &847097471 CanvasRenderer: m_ObjectHideFlags: 0 @@ -287,6 +286,48 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 847097468} m_CullTransparentMesh: 0 +--- !u!28 &1525330782 +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 diff --git a/com.unity.uiwidgets/Runtime/Plugins/Android/arm64/libUIWidgets.so b/com.unity.uiwidgets/Runtime/Plugins/Android/arm64/libUIWidgets.so index 52e9e725..84545d21 100755 --- a/com.unity.uiwidgets/Runtime/Plugins/Android/arm64/libUIWidgets.so +++ b/com.unity.uiwidgets/Runtime/Plugins/Android/arm64/libUIWidgets.so @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ac05731242706bce2c77bddc2af4059f9016f8c16ac9b075b12ef7776cf6df01 -size 84195040 +oid sha256:17c8a9b1eb40bfb70c7192a13aef015cc080f6fb977be8cea08c2c754e0d97bb +size 83590064 diff --git a/com.unity.uiwidgets/Runtime/Plugins/Android/libUIWidgets.so b/com.unity.uiwidgets/Runtime/Plugins/Android/libUIWidgets.so index b36aafae..29d2a539 100755 --- a/com.unity.uiwidgets/Runtime/Plugins/Android/libUIWidgets.so +++ b/com.unity.uiwidgets/Runtime/Plugins/Android/libUIWidgets.so @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6538e29dcefa8b013fd46288f17fbd95a14e6e2ae73ca15c67acc2ec25565e35 -size 76134220 +oid sha256:65113cd66375bbf443cd1f55e892efc470ec2cab8b4f6974269907af3fb7045b +size 76134272 diff --git a/com.unity.uiwidgets/Runtime/Plugins/ios/libUIWidgets.a b/com.unity.uiwidgets/Runtime/Plugins/ios/libUIWidgets.a index 59b7b12d..d4cb8c86 100644 --- a/com.unity.uiwidgets/Runtime/Plugins/ios/libUIWidgets.a +++ b/com.unity.uiwidgets/Runtime/Plugins/ios/libUIWidgets.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:45f5772380e27b4a127aca15f4af961cd6703d716360f87c76a7191fc746a090 -size 247578504 +oid sha256:87e0abacac35679936b702eecee8a92e1ba08d37a5b29e8d14ca60e0b6e23c21 +size 244006568 diff --git a/com.unity.uiwidgets/Runtime/Plugins/osx/libUIWidgets.dylib b/com.unity.uiwidgets/Runtime/Plugins/osx/libUIWidgets.dylib index ccba92e1..24d32637 100755 --- a/com.unity.uiwidgets/Runtime/Plugins/osx/libUIWidgets.dylib +++ b/com.unity.uiwidgets/Runtime/Plugins/osx/libUIWidgets.dylib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:99313d899e6946d4d614c2a0a5cacc050cc7ff0bd480c19428435363633169a8 -size 21801256 +oid sha256:022b89ac98717f037386b126a063658db557d321d029b6d9b6a7e8e90ffb39e0 +size 21821784 diff --git a/com.unity.uiwidgets/Runtime/Plugins/x86_64/libUIWidgets.dll b/com.unity.uiwidgets/Runtime/Plugins/x86_64/libUIWidgets.dll index 43e2bbf5..1cf9cc64 100644 --- a/com.unity.uiwidgets/Runtime/Plugins/x86_64/libUIWidgets.dll +++ b/com.unity.uiwidgets/Runtime/Plugins/x86_64/libUIWidgets.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:74a8add2eb68589ffdde29bf411e53530415b618aaeee9a55fce80ad937aa4d9 +oid sha256:ed6946393b28423ab1552bddf7b25b9fa7100b9ee95638185c6c4627f00f5623 size 11260928 diff --git a/com.unity.uiwidgets/Runtime/engine/UIWidgetsPanel.cs b/com.unity.uiwidgets/Runtime/engine/UIWidgetsPanel.cs index 5c07cd61..607e1fec 100644 --- a/com.unity.uiwidgets/Runtime/engine/UIWidgetsPanel.cs +++ b/com.unity.uiwidgets/Runtime/engine/UIWidgetsPanel.cs @@ -48,15 +48,18 @@ public interface IUIWidgetsWindow { UIWidgetsWindowType getWindowType(); } + public class Configurations { private Dictionary _textFonts = new Dictionary(); public void Clear() { _textFonts.Clear(); } + public void AddFont(string family, TextFont font) { _textFonts[key: family] = font; } + public object fontsToObject() { Dictionary settings = _textFonts; if (settings == null || settings.Count == 0) { @@ -81,11 +84,13 @@ public object fontsToObject() { #else if (!File.Exists(assetAbsolutePath)) { #endif - Debug.LogError($"The font asset (family: \"{setting.Key}\", path: \"{assetPath}\") is not found"); + Debug.LogError( + $"The font asset (family: \"{setting.Key}\", path: \"{assetPath}\") is not found"); } else { fileExist = true; } + fontDic.Add("asset", value: setting.Value.fonts[j].asset); } @@ -191,10 +196,12 @@ protected virtual void Update() { CollectGarbageOnDemand(); #endif + Input_Update(); } #region OnDemandGC + #if !UNITY_EDITOR // 8 MB const long kCollectAfterAllocating = 8 * 1024 * 1024; @@ -243,6 +250,7 @@ void CollectGarbageOnDemand() lastFrameMemory = mem; } #endif + #endregion IEnumerator ReEnableUIWidgetsNextFrame() { @@ -334,6 +342,7 @@ protected override void OnEnable() { AddFont(family: font.family, font: font); } } + _wrapper.Initiate(this, width: _currentWidth, height: _currentHeight, dpr: _currentDevicePixelRatio, _configurations: _configurations); _configurations.Clear(); @@ -433,8 +442,7 @@ protected virtual void main() { } } - enum UIWidgetsInputMode - { + enum UIWidgetsInputMode { Mouse, Touch } @@ -483,13 +491,61 @@ void _convertPointerData(PointerEventData evt, out Vector2? position, out int po } void Input_OnEnable() { +#if !UNITY_EDITOR && (UNITY_IOS || UNITY_ANDROID) + UnityEngine.UIWidgets.InitUIWidgets.Init(); + UnityEngine.UIWidgets.RawTouchEvent += CacheRawTouch; +#endif _inputMode = Input.mousePresent ? UIWidgetsInputMode.Mouse : UIWidgetsInputMode.Touch; } +#if !UNITY_EDITOR && (UNITY_IOS || UNITY_ANDROID) + enum TouchPhase { + Began = 0, + Moved = 1, + Stationary = 2, + Ended = 3, + Canceled = 4 + } + + void CacheRawTouch(UnityEngine.UIWidgets.RawTouchEventParam param) { + rawTouchEventParams.Enqueue(param); + } + + void ProcessRawTouch(UnityEngine.UIWidgets.RawTouchEventParam param) { + var position = _getPointerPosition(new Vector2(param.x, param.y)); + var pointerId = -1 - param.pointerId; + switch ((TouchPhase)param.phase) { + case TouchPhase.Began: + _wrapper.OnPointerDown(position, pointerId); + break; + case TouchPhase.Moved: + _wrapper.OnDrag(position, pointerId); + break; + + case TouchPhase.Ended: + _wrapper.OnPointerUp(position, pointerId); + break; + default: + break; + } + } + + Queue rawTouchEventParams = + new Queue(); +#endif + void Input_OnDisable() { +#if !UNITY_EDITOR && (UNITY_IOS || UNITY_ANDROID) + UnityEngine.UIWidgets.RawTouchEvent -= CacheRawTouch; +#endif } void Input_Update() { +#if !UNITY_EDITOR && (UNITY_IOS || UNITY_ANDROID) + while (rawTouchEventParams.isNotEmpty()) { + ProcessRawTouch(rawTouchEventParams.Dequeue()); + } +#endif //we only process hover events for desktop applications if (_inputMode == UIWidgetsInputMode.Mouse) { if (_isEntered) { @@ -530,6 +586,7 @@ void _onMouseMove() { if (_inputMode != UIWidgetsInputMode.Mouse) { return; } + var pos = _getPointerPosition(Input.mousePosition); _wrapper.OnMouseMove(pos); } @@ -538,6 +595,7 @@ void _onScroll() { if (_inputMode != UIWidgetsInputMode.Mouse) { return; } + var pos = _getPointerPosition(Input.mousePosition); _wrapper.OnMouseScroll(Input.mouseScrollDelta, pos); } @@ -546,6 +604,7 @@ public void OnPointerEnter(PointerEventData eventData) { if (_inputMode != UIWidgetsInputMode.Mouse) { return; } + D.assert(eventData.pointerId < 0); _isEntered = true; _lastMousePosition = Input.mousePosition; @@ -555,11 +614,13 @@ public void OnPointerExit(PointerEventData eventData) { if (_inputMode != UIWidgetsInputMode.Mouse) { return; } + D.assert(eventData.pointerId < 0); _isEntered = false; _wrapper.OnPointerLeave(); } - + +#if UNITY_EDITOR || (!UNITY_IOS && !UNITY_ANDROID) public void OnPointerDown(PointerEventData eventData) { _convertPointerData(eventData, out var pos, out var pointerId); _wrapper.OnPointerDown(pos, pointerId); @@ -574,5 +635,15 @@ public void OnDrag(PointerEventData eventData) { _convertPointerData(eventData, out var pos, out var pointerId); _wrapper.OnDrag(pos, pointerId); } +#else + public void OnPointerDown(PointerEventData eventData) { + } + + public void OnPointerUp(PointerEventData eventData) { + } + + public void OnDrag(PointerEventData eventData) { + } +#endif } } \ No newline at end of file diff --git a/com.unity.uiwidgets/package.json b/com.unity.uiwidgets/package.json index a6fa5ed7..79ebb07c 100644 --- a/com.unity.uiwidgets/package.json +++ b/com.unity.uiwidgets/package.json @@ -5,5 +5,6 @@ "unity": "2019.4", "description": "UIWidgets allows you to build beautiful cross-platform apps through Unity", "dependencies": { + "com.unity.modules.uiwidgets": "1.0.0" } } diff --git a/engine/src/shell/platform/unity/android/uiwidgets_panel.cc b/engine/src/shell/platform/unity/android/uiwidgets_panel.cc index 9c80abc3..7b4cba5a 100644 --- a/engine/src/shell/platform/unity/android/uiwidgets_panel.cc +++ b/engine/src/shell/platform/unity/android/uiwidgets_panel.cc @@ -213,7 +213,7 @@ namespace uiwidgets ProcessMessages(); // drain pending vsync batons - ProcessVSync(); + ProcessVSync(0); process_events_ = false; @@ -292,7 +292,7 @@ namespace uiwidgets return std::chrono::nanoseconds(task_runner_->ProcessTasks().count()); } - void UIWidgetsPanel::ProcessVSync() + void UIWidgetsPanel::ProcessVSync(double frame_duration) { std::vector batons; vsync_batons_.swap(batons); @@ -302,7 +302,7 @@ namespace uiwidgets reinterpret_cast(engine_)->OnVsyncEvent( baton, fml::TimePoint::Now(), fml::TimePoint::Now() + - fml::TimeDelta::FromNanoseconds(1000000000 / 60)); + fml::TimeDelta::FromNanoseconds(1000000000 * frame_duration)); } } diff --git a/engine/src/shell/platform/unity/android/uiwidgets_panel.h b/engine/src/shell/platform/unity/android/uiwidgets_panel.h index ba851e45..a77f08a7 100644 --- a/engine/src/shell/platform/unity/android/uiwidgets_panel.h +++ b/engine/src/shell/platform/unity/android/uiwidgets_panel.h @@ -52,7 +52,7 @@ class UIWidgetsPanel : public fml::RefCountedThreadSafe { std::chrono::nanoseconds ProcessMessages(); - void ProcessVSync(); + void ProcessVSync(double frame_duration); void VSyncCallback(intptr_t baton); diff --git a/engine/src/shell/platform/unity/android/uiwidgets_system.cc b/engine/src/shell/platform/unity/android/uiwidgets_system.cc index 8c5fc64a..63f4723c 100644 --- a/engine/src/shell/platform/unity/android/uiwidgets_system.cc +++ b/engine/src/shell/platform/unity/android/uiwidgets_system.cc @@ -21,16 +21,7 @@ void UIWidgetsSystem::UnregisterPanel(UIWidgetsPanel* 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 + //do nothing } void UIWidgetsSystem::Update() { @@ -45,9 +36,15 @@ void UIWidgetsSystem::Update() { next_uiwidgets_event_time_ = next_event_time; } -void UIWidgetsSystem::VSync() { +void UIWidgetsSystem::VSync(double frame_duration) { + //use default frame_duration if undefined in Unity engine + if (frame_duration <= 0) + { + frame_duration = 1.0 / 60; + } + for (auto* uiwidgets_panel : uiwidgets_panels_) { - uiwidgets_panel->ProcessVSync(); + uiwidgets_panel->ProcessVSync(frame_duration); } } diff --git a/engine/src/shell/platform/unity/android/uiwidgets_system.h b/engine/src/shell/platform/unity/android/uiwidgets_system.h index 1ccaca95..3df12402 100644 --- a/engine/src/shell/platform/unity/android/uiwidgets_system.h +++ b/engine/src/shell/platform/unity/android/uiwidgets_system.h @@ -54,7 +54,7 @@ class UIWidgetsSystem { GetInstancePtr()->Wait(std::chrono::nanoseconds(max_duration)); } - UIWIDGETS_CALLBACK(void) _VSync() { GetInstancePtr()->VSync(); } + UIWIDGETS_CALLBACK(void) _VSync(double frame_duration) { GetInstancePtr()->VSync(frame_duration); } UIWIDGETS_CALLBACK(void) _WakeUp() { GetInstancePtr()->WakeUp(); } @@ -69,7 +69,7 @@ class UIWidgetsSystem { void Update(); void Wait(std::chrono::nanoseconds max_duration); - void VSync(); + void VSync(double frame_duration); void WakeUp(); void GfxWorkerCallback(int eventId, void* data); diff --git a/engine/src/shell/platform/unity/darwin/ios/uiwidgets_panel.h b/engine/src/shell/platform/unity/darwin/ios/uiwidgets_panel.h index 937b1f68..6b3e8375 100644 --- a/engine/src/shell/platform/unity/darwin/ios/uiwidgets_panel.h +++ b/engine/src/shell/platform/unity/darwin/ios/uiwidgets_panel.h @@ -55,7 +55,7 @@ class UIWidgetsPanel : public fml::RefCountedThreadSafe { std::chrono::nanoseconds ProcessMessages(); - void ProcessVSync(); + void ProcessVSync(double frame_duration); void VSyncCallback(intptr_t baton); diff --git a/engine/src/shell/platform/unity/darwin/ios/uiwidgets_panel.mm b/engine/src/shell/platform/unity/darwin/ios/uiwidgets_panel.mm index 5df8e528..7daa27a4 100644 --- a/engine/src/shell/platform/unity/darwin/ios/uiwidgets_panel.mm +++ b/engine/src/shell/platform/unity/darwin/ios/uiwidgets_panel.mm @@ -190,7 +190,7 @@ ProcessMessages(); // drain pending vsync batons - ProcessVSync(); + ProcessVSync(0); process_events_ = false; @@ -240,7 +240,7 @@ return std::chrono::nanoseconds(task_runner_->ProcessTasks().count()); } -void UIWidgetsPanel::ProcessVSync() { +void UIWidgetsPanel::ProcessVSync(double frame_duration) { std::vector batons; vsync_batons_.swap(batons); @@ -248,7 +248,7 @@ reinterpret_cast(engine_)->OnVsyncEvent( baton, fml::TimePoint::Now(), fml::TimePoint::Now() + - fml::TimeDelta::FromNanoseconds(1000000000 / 60)); + fml::TimeDelta::FromNanoseconds(1000000000 * frame_duration)); } } @@ -438,7 +438,7 @@ panel->ProcessMessages(); //_ProcessVSync - panel->ProcessVSync(); + panel->ProcessVSync(0); //_Wait panel->ProcessMessages(); diff --git a/engine/src/shell/platform/unity/darwin/ios/uiwidgets_system.h b/engine/src/shell/platform/unity/darwin/ios/uiwidgets_system.h index 086d9eac..032427cc 100644 --- a/engine/src/shell/platform/unity/darwin/ios/uiwidgets_system.h +++ b/engine/src/shell/platform/unity/darwin/ios/uiwidgets_system.h @@ -50,7 +50,7 @@ class UIWidgetsSystem { GetInstancePtr()->Wait(std::chrono::nanoseconds(max_duration)); } - UIWIDGETS_CALLBACK(void) _VSync() { GetInstancePtr()->VSync(); } + UIWIDGETS_CALLBACK(void) _VSync(double frame_duration) { GetInstancePtr()->VSync(frame_duration); } UIWIDGETS_CALLBACK(void) _WakeUp() { GetInstancePtr()->WakeUp(); } @@ -60,7 +60,7 @@ class UIWidgetsSystem { void Update(); void Wait(std::chrono::nanoseconds max_duration); - void VSync(); + void VSync(double frame_duration); void WakeUp(); void GfxWorkerCallback(int eventId, void* data); diff --git a/engine/src/shell/platform/unity/darwin/ios/uiwidgets_system.mm b/engine/src/shell/platform/unity/darwin/ios/uiwidgets_system.mm index 835f25a1..ecefb7c7 100644 --- a/engine/src/shell/platform/unity/darwin/ios/uiwidgets_system.mm +++ b/engine/src/shell/platform/unity/darwin/ios/uiwidgets_system.mm @@ -21,16 +21,7 @@ } 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 + //do nothing } void UIWidgetsSystem::Update() { @@ -48,12 +39,18 @@ next_uiwidgets_event_time_ = next_event_time; } -void UIWidgetsSystem::VSync() { +void UIWidgetsSystem::VSync(double frame_duration) { + //use default frame_duration if undefined in Unity engine + if (frame_duration <= 0) + { + frame_duration = 1.0 / 60; + } + for (auto* uiwidgets_panel : uiwidgets_panels_) { if (!uiwidgets_panel->NeedUpdateByPlayerLoop()) { continue; } - uiwidgets_panel->ProcessVSync(); + uiwidgets_panel->ProcessVSync(frame_duration); } } diff --git a/engine/src/shell/platform/unity/darwin/macos/uiwidgets_panel.h b/engine/src/shell/platform/unity/darwin/macos/uiwidgets_panel.h index f0287cd4..99c39519 100644 --- a/engine/src/shell/platform/unity/darwin/macos/uiwidgets_panel.h +++ b/engine/src/shell/platform/unity/darwin/macos/uiwidgets_panel.h @@ -52,7 +52,7 @@ class UIWidgetsPanel : public fml::RefCountedThreadSafe { std::chrono::nanoseconds ProcessMessages(); - void ProcessVSync(); + void ProcessVSync(double frame_duration); void VSyncCallback(intptr_t baton); diff --git a/engine/src/shell/platform/unity/darwin/macos/uiwidgets_panel.mm b/engine/src/shell/platform/unity/darwin/macos/uiwidgets_panel.mm index aa42a516..cf674349 100644 --- a/engine/src/shell/platform/unity/darwin/macos/uiwidgets_panel.mm +++ b/engine/src/shell/platform/unity/darwin/macos/uiwidgets_panel.mm @@ -190,7 +190,7 @@ ProcessMessages(); // drain pending vsync batons - ProcessVSync(); + ProcessVSync(0); process_events_ = false; @@ -240,7 +240,7 @@ return std::chrono::nanoseconds(task_runner_->ProcessTasks().count()); } -void UIWidgetsPanel::ProcessVSync() { +void UIWidgetsPanel::ProcessVSync(double frame_duration) { std::vector batons; vsync_batons_.swap(batons); @@ -248,7 +248,7 @@ reinterpret_cast(engine_)->OnVsyncEvent( baton, fml::TimePoint::Now(), fml::TimePoint::Now() + - fml::TimeDelta::FromNanoseconds(1000000000 / 60)); + fml::TimeDelta::FromNanoseconds(1000000000 * frame_duration)); } } @@ -514,7 +514,7 @@ static uint64_t ConvertToUIWidgetsButton(int button) { panel->ProcessMessages(); //_ProcessVSync - panel->ProcessVSync(); + panel->ProcessVSync(0); //_Wait panel->ProcessMessages(); diff --git a/engine/src/shell/platform/unity/darwin/macos/uiwidgets_system.h b/engine/src/shell/platform/unity/darwin/macos/uiwidgets_system.h index 086d9eac..032427cc 100644 --- a/engine/src/shell/platform/unity/darwin/macos/uiwidgets_system.h +++ b/engine/src/shell/platform/unity/darwin/macos/uiwidgets_system.h @@ -50,7 +50,7 @@ class UIWidgetsSystem { GetInstancePtr()->Wait(std::chrono::nanoseconds(max_duration)); } - UIWIDGETS_CALLBACK(void) _VSync() { GetInstancePtr()->VSync(); } + UIWIDGETS_CALLBACK(void) _VSync(double frame_duration) { GetInstancePtr()->VSync(frame_duration); } UIWIDGETS_CALLBACK(void) _WakeUp() { GetInstancePtr()->WakeUp(); } @@ -60,7 +60,7 @@ class UIWidgetsSystem { void Update(); void Wait(std::chrono::nanoseconds max_duration); - void VSync(); + void VSync(double frame_duration); void WakeUp(); void GfxWorkerCallback(int eventId, void* data); diff --git a/engine/src/shell/platform/unity/darwin/macos/uiwidgets_system.mm b/engine/src/shell/platform/unity/darwin/macos/uiwidgets_system.mm index 835f25a1..ecefb7c7 100644 --- a/engine/src/shell/platform/unity/darwin/macos/uiwidgets_system.mm +++ b/engine/src/shell/platform/unity/darwin/macos/uiwidgets_system.mm @@ -21,16 +21,7 @@ } 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 + //do nothing } void UIWidgetsSystem::Update() { @@ -48,12 +39,18 @@ next_uiwidgets_event_time_ = next_event_time; } -void UIWidgetsSystem::VSync() { +void UIWidgetsSystem::VSync(double frame_duration) { + //use default frame_duration if undefined in Unity engine + if (frame_duration <= 0) + { + frame_duration = 1.0 / 60; + } + for (auto* uiwidgets_panel : uiwidgets_panels_) { if (!uiwidgets_panel->NeedUpdateByPlayerLoop()) { continue; } - uiwidgets_panel->ProcessVSync(); + uiwidgets_panel->ProcessVSync(frame_duration); } } diff --git a/engine/src/shell/platform/unity/windows/uiwidgets_panel.cc b/engine/src/shell/platform/unity/windows/uiwidgets_panel.cc index 4ab92d2c..bc6032b2 100644 --- a/engine/src/shell/platform/unity/windows/uiwidgets_panel.cc +++ b/engine/src/shell/platform/unity/windows/uiwidgets_panel.cc @@ -212,7 +212,7 @@ void UIWidgetsPanel::OnDisable() { ProcessMessages(); // drain pending vsync batons - ProcessVSync(); + ProcessVSync(0); process_events_ = false; @@ -273,7 +273,7 @@ std::chrono::nanoseconds UIWidgetsPanel::ProcessMessages() { return std::chrono::nanoseconds(task_runner_->ProcessTasks().count()); } -void UIWidgetsPanel::ProcessVSync() { +void UIWidgetsPanel::ProcessVSync(double frame_duration) { std::vector batons; vsync_batons_.swap(batons); @@ -281,7 +281,7 @@ void UIWidgetsPanel::ProcessVSync() { reinterpret_cast(engine_)->OnVsyncEvent( baton, fml::TimePoint::Now(), fml::TimePoint::Now() + - fml::TimeDelta::FromNanoseconds(1000000000 / 60)); + fml::TimeDelta::FromNanoseconds(1000000000 * frame_duration)); } } @@ -559,7 +559,7 @@ UIWidgetsPanel_onEditorUpdate(UIWidgetsPanel* panel) { panel->ProcessMessages(); //_ProcessVSync - panel->ProcessVSync(); + panel->ProcessVSync(0); //_Wait panel->ProcessMessages(); diff --git a/engine/src/shell/platform/unity/windows/uiwidgets_panel.h b/engine/src/shell/platform/unity/windows/uiwidgets_panel.h index de9ee826..d95c51a7 100644 --- a/engine/src/shell/platform/unity/windows/uiwidgets_panel.h +++ b/engine/src/shell/platform/unity/windows/uiwidgets_panel.h @@ -51,7 +51,7 @@ class UIWidgetsPanel : public fml::RefCountedThreadSafe { std::chrono::nanoseconds ProcessMessages(); - void ProcessVSync(); + void ProcessVSync(double frame_duration); void VSyncCallback(intptr_t baton); diff --git a/engine/src/shell/platform/unity/windows/uiwidgets_system.cc b/engine/src/shell/platform/unity/windows/uiwidgets_system.cc index ca588499..bbe87d56 100644 --- a/engine/src/shell/platform/unity/windows/uiwidgets_system.cc +++ b/engine/src/shell/platform/unity/windows/uiwidgets_system.cc @@ -21,18 +21,7 @@ void UIWidgetsSystem::UnregisterPanel(UIWidgetsPanel* 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); - wait_duration = std::max(std::chrono::nanoseconds(0), wait_duration); - - ::MsgWaitForMultipleObjects(0, nullptr, FALSE, - static_cast(wait_duration.count() / 1000000), - QS_ALLINPUT); + //do nothing } void UIWidgetsSystem::Update() { @@ -50,12 +39,18 @@ void UIWidgetsSystem::Update() { next_uiwidgets_event_time_ = next_event_time; } -void UIWidgetsSystem::VSync() { +void UIWidgetsSystem::VSync(double frame_duration) { + //use default frame_duration if undefined in Unity engine + if (frame_duration <= 0) + { + frame_duration = 1.0 / 60; + } + for (auto* uiwidgets_panel : uiwidgets_panels_) { if (!uiwidgets_panel->NeedUpdateByPlayerLoop()) { continue; } - uiwidgets_panel->ProcessVSync(); + uiwidgets_panel->ProcessVSync(frame_duration); } } diff --git a/engine/src/shell/platform/unity/windows/uiwidgets_system.h b/engine/src/shell/platform/unity/windows/uiwidgets_system.h index 086d9eac..032427cc 100644 --- a/engine/src/shell/platform/unity/windows/uiwidgets_system.h +++ b/engine/src/shell/platform/unity/windows/uiwidgets_system.h @@ -50,7 +50,7 @@ class UIWidgetsSystem { GetInstancePtr()->Wait(std::chrono::nanoseconds(max_duration)); } - UIWIDGETS_CALLBACK(void) _VSync() { GetInstancePtr()->VSync(); } + UIWIDGETS_CALLBACK(void) _VSync(double frame_duration) { GetInstancePtr()->VSync(frame_duration); } UIWIDGETS_CALLBACK(void) _WakeUp() { GetInstancePtr()->WakeUp(); } @@ -60,7 +60,7 @@ class UIWidgetsSystem { void Update(); void Wait(std::chrono::nanoseconds max_duration); - void VSync(); + void VSync(double frame_duration); void WakeUp(); void GfxWorkerCallback(int eventId, void* data); diff --git a/engine/third_party/Unity/IUnityUIWidgets.h b/engine/third_party/Unity/IUnityUIWidgets.h index a6fe8082..576e7694 100644 --- a/engine/third_party/Unity/IUnityUIWidgets.h +++ b/engine/third_party/Unity/IUnityUIWidgets.h @@ -10,12 +10,13 @@ namespace UnityUIWidgets { typedef void (*VoidCallback)(); typedef void (*VoidCallbackLong)(long); +typedef void (*VoidCallbackDouble)(double); UNITY_DECLARE_INTERFACE(IUnityUIWidgets) { virtual ~IUnityUIWidgets() {} virtual void SetUpdateCallback(VoidCallback callback) = 0; - virtual void SetVSyncCallback(VoidCallback callback) = 0; + virtual void SetVSyncCallback(VoidCallbackDouble callback) = 0; virtual void SetWaitCallback(VoidCallbackLong callback) = 0; virtual void SetWakeUpCallback(VoidCallback callback) = 0; virtual void IssuePluginEventAndData(UnityRenderingEventAndData callback,