Skip to content
This repository was archived by the owner on Sep 7, 2022. It is now read-only.

[WIP] Prepare 2.0.6 #226

Open
wants to merge 27 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
adf2c8d
add touch
SiyaoHuang Jul 13, 2021
17bb616
format
SiyaoHuang Jul 14, 2021
b972534
fix
SiyaoHuang Jul 14, 2021
ec1cf5a
remove unused file
zhuxingwei Aug 10, 2021
76123f4
remove unused file
zhuxingwei Aug 10, 2021
730326e
Merge branch 'siyaoH/1.17/rawTouches' of github.com:Unity-Technologie…
zhuxingwei Aug 10, 2021
6e607fe
refine rawTouch code
zhuxingwei Aug 10, 2021
2a6a0b5
fix vsync issue on plugin side
zhuxingwei Aug 10, 2021
7cfffca
update windows plugin
zhuxingwei Aug 10, 2021
dc1dbd7
update arm64 plugin
zhuxingwei Aug 10, 2021
288c2c9
build a test plugin for android
zhuxingwei Aug 10, 2021
bbcd5a8
Merge branch 'prepare_2.0.6' of github.com:Unity-Technologies/com.uni…
zhuxingwei Aug 10, 2021
3850dac
revert test plugin
zhuxingwei Aug 10, 2021
45edf6e
Merge branch 'prepare_2.0.6' of github.com:Unity-Technologies/com.uni…
zhuxingwei Aug 10, 2021
f6f8858
revert to release build after validation on windows
zhuxingwei Aug 10, 2021
d9c943b
Merge branch 'prepare_2.0.6' of github.com:Unity-Technologies/com.uni…
zhuxingwei Aug 10, 2021
41236bd
upload latest windows plugin
zhuxingwei Aug 10, 2021
40d6676
update engine
SiyaoHuang Nov 22, 2021
cc038b5
Merge branch 'master' into siyaoH/1.17/rawTouches
SiyaoHuang Nov 22, 2021
1f94e24
Merge branch 'siyaoH/1.17/rawTouches' into prepare_2.0.6
SiyaoHuang Nov 24, 2021
4e7389b
fix
SiyaoHuang Nov 24, 2021
67ee89b
ios plugin
SiyaoHuang Nov 25, 2021
778bfa8
android plugin
SiyaoHuang Nov 26, 2021
522e6bd
win plugin
SiyaoHuang Nov 26, 2021
12d2e94
udpate
SiyaoHuang Nov 29, 2021
d87c64f
cache RawTouch and dispatch during Input_Update
SiyaoHuang Dec 3, 2021
9bc3f63
Merge pull request #272 from Unity-Technologies/siyaoH/1.17/combineTouch
SiyaoHuang Dec 3, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 44 additions & 3 deletions Samples/UIWidgetsSamples_2019_4/Assets/Scene/ImageTest.unity
Original file line number Diff line number Diff line change
@@ -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
Git LFS file not shown
4 changes: 2 additions & 2 deletions com.unity.uiwidgets/Runtime/Plugins/Android/libUIWidgets.so
Git LFS file not shown
4 changes: 2 additions & 2 deletions com.unity.uiwidgets/Runtime/Plugins/ios/libUIWidgets.a
Git LFS file not shown
4 changes: 2 additions & 2 deletions com.unity.uiwidgets/Runtime/Plugins/osx/libUIWidgets.dylib
Git LFS file not shown
Git LFS file not shown
79 changes: 75 additions & 4 deletions com.unity.uiwidgets/Runtime/engine/UIWidgetsPanel.cs
Original file line number Diff line number Diff line change
@@ -48,15 +48,18 @@ public interface IUIWidgetsWindow {

UIWidgetsWindowType getWindowType();
}

public class Configurations {
private Dictionary<string, TextFont> _textFonts = new Dictionary<string, TextFont>();

public void Clear() {
_textFonts.Clear();
}

public void AddFont(string family, TextFont font) {
_textFonts[key: family] = font;
}

public object fontsToObject() {
Dictionary<string, TextFont> 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<UnityEngine.UIWidgets.RawTouchEventParam> rawTouchEventParams =
new Queue<UnityEngine.UIWidgets.RawTouchEventParam>();
#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
}
}
1 change: 1 addition & 0 deletions com.unity.uiwidgets/package.json
Original file line number Diff line number Diff line change
@@ -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"
}
}
6 changes: 3 additions & 3 deletions engine/src/shell/platform/unity/android/uiwidgets_panel.cc
Original file line number Diff line number Diff line change
@@ -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<intptr_t> batons;
vsync_batons_.swap(batons);
@@ -302,7 +302,7 @@ namespace uiwidgets
reinterpret_cast<EmbedderEngine *>(engine_)->OnVsyncEvent(
baton, fml::TimePoint::Now(),
fml::TimePoint::Now() +
fml::TimeDelta::FromNanoseconds(1000000000 / 60));
fml::TimeDelta::FromNanoseconds(1000000000 * frame_duration));
}
}

2 changes: 1 addition & 1 deletion engine/src/shell/platform/unity/android/uiwidgets_panel.h
Original file line number Diff line number Diff line change
@@ -52,7 +52,7 @@ class UIWidgetsPanel : public fml::RefCountedThreadSafe<UIWidgetsPanel> {

std::chrono::nanoseconds ProcessMessages();

void ProcessVSync();
void ProcessVSync(double frame_duration);

void VSyncCallback(intptr_t baton);

21 changes: 9 additions & 12 deletions engine/src/shell/platform/unity/android/uiwidgets_system.cc
Original file line number Diff line number Diff line change
@@ -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);
}
}

4 changes: 2 additions & 2 deletions engine/src/shell/platform/unity/android/uiwidgets_system.h
Original file line number Diff line number Diff line change
@@ -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);

Original file line number Diff line number Diff line change
@@ -55,7 +55,7 @@ class UIWidgetsPanel : public fml::RefCountedThreadSafe<UIWidgetsPanel> {

std::chrono::nanoseconds ProcessMessages();

void ProcessVSync();
void ProcessVSync(double frame_duration);

void VSyncCallback(intptr_t baton);

8 changes: 4 additions & 4 deletions engine/src/shell/platform/unity/darwin/ios/uiwidgets_panel.mm
Original file line number Diff line number Diff line change
@@ -190,7 +190,7 @@
ProcessMessages();

// drain pending vsync batons
ProcessVSync();
ProcessVSync(0);

process_events_ = false;

@@ -240,15 +240,15 @@
return std::chrono::nanoseconds(task_runner_->ProcessTasks().count());
}

void UIWidgetsPanel::ProcessVSync() {
void UIWidgetsPanel::ProcessVSync(double frame_duration) {
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));
fml::TimeDelta::FromNanoseconds(1000000000 * frame_duration));
}
}

@@ -438,7 +438,7 @@
panel->ProcessMessages();

//_ProcessVSync
panel->ProcessVSync();
panel->ProcessVSync(0);

//_Wait
panel->ProcessMessages();
4 changes: 2 additions & 2 deletions engine/src/shell/platform/unity/darwin/ios/uiwidgets_system.h
Original file line number Diff line number Diff line change
@@ -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);

21 changes: 9 additions & 12 deletions engine/src/shell/platform/unity/darwin/ios/uiwidgets_system.mm
Original file line number Diff line number Diff line change
@@ -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);
}
}

Original file line number Diff line number Diff line change
@@ -52,7 +52,7 @@ class UIWidgetsPanel : public fml::RefCountedThreadSafe<UIWidgetsPanel> {

std::chrono::nanoseconds ProcessMessages();

void ProcessVSync();
void ProcessVSync(double frame_duration);

void VSyncCallback(intptr_t baton);

Original file line number Diff line number Diff line change
@@ -190,7 +190,7 @@
ProcessMessages();

// drain pending vsync batons
ProcessVSync();
ProcessVSync(0);

process_events_ = false;

@@ -240,15 +240,15 @@
return std::chrono::nanoseconds(task_runner_->ProcessTasks().count());
}

void UIWidgetsPanel::ProcessVSync() {
void UIWidgetsPanel::ProcessVSync(double frame_duration) {
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));
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();
Original file line number Diff line number Diff line change
@@ -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);

21 changes: 9 additions & 12 deletions engine/src/shell/platform/unity/darwin/macos/uiwidgets_system.mm
Original file line number Diff line number Diff line change
@@ -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);
}
}

8 changes: 4 additions & 4 deletions engine/src/shell/platform/unity/windows/uiwidgets_panel.cc
Original file line number Diff line number Diff line change
@@ -212,7 +212,7 @@ void UIWidgetsPanel::OnDisable() {
ProcessMessages();

// drain pending vsync batons
ProcessVSync();
ProcessVSync(0);

process_events_ = false;

@@ -273,15 +273,15 @@ std::chrono::nanoseconds UIWidgetsPanel::ProcessMessages() {
return std::chrono::nanoseconds(task_runner_->ProcessTasks().count());
}

void UIWidgetsPanel::ProcessVSync() {
void UIWidgetsPanel::ProcessVSync(double frame_duration) {
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));
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();
2 changes: 1 addition & 1 deletion engine/src/shell/platform/unity/windows/uiwidgets_panel.h
Original file line number Diff line number Diff line change
@@ -51,7 +51,7 @@ class UIWidgetsPanel : public fml::RefCountedThreadSafe<UIWidgetsPanel> {

std::chrono::nanoseconds ProcessMessages();

void ProcessVSync();
void ProcessVSync(double frame_duration);

void VSyncCallback(intptr_t baton);

23 changes: 9 additions & 14 deletions engine/src/shell/platform/unity/windows/uiwidgets_system.cc
Original file line number Diff line number Diff line change
@@ -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<DWORD>(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);
}
}

4 changes: 2 additions & 2 deletions engine/src/shell/platform/unity/windows/uiwidgets_system.h
Original file line number Diff line number Diff line change
@@ -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);

3 changes: 2 additions & 1 deletion engine/third_party/Unity/IUnityUIWidgets.h
Original file line number Diff line number Diff line change
@@ -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,