1
0
mirror of https://github.com/xiaopeng12138/MaiDXR.git synced 2024-12-18 20:05:52 +01:00
MaiDXR/Assets/uWindowCapture/Runtime/UwcWindowTextureChildrenManager.cs
2022-01-05 19:44:30 +01:00

133 lines
4.0 KiB
C#

using UnityEngine;
using System.Collections.Generic;
namespace uWindowCapture
{
[RequireComponent(typeof(UwcWindowTexture))]
public class UwcWindowTextureChildrenManager : MonoBehaviour
{
UwcWindowTexture windowTexture_;
Dictionary<int, UwcWindowTexture> children_ = new Dictionary<int, UwcWindowTexture>();
void Awake()
{
windowTexture_ = GetComponent<UwcWindowTexture>();
windowTexture_.onWindowChanged.AddListener(OnWindowChanged);
OnWindowChanged(windowTexture_.window, null);
}
void Update()
{
UpdateChildren();
}
UwcWindowTexture InstantiateChild()
{
var prefab = windowTexture_.childWindowPrefab;
if (!prefab) return null;
var childTexture = Instantiate(prefab, transform);
return childTexture.GetComponent<UwcWindowTexture>();
}
void OnWindowChanged(UwcWindow newWindow, UwcWindow oldWindow)
{
if (newWindow == oldWindow) return;
if (oldWindow != null) {
oldWindow.onChildAdded.RemoveListener(OnChildAdded);
oldWindow.onChildRemoved.RemoveListener(OnChildRemoved);
foreach (var kv in children_) {
var windowTexture = kv.Value;
Destroy(windowTexture.gameObject);
}
children_.Clear();
}
if (newWindow != null) {
newWindow.onChildAdded.AddListener(OnChildAdded);
newWindow.onChildRemoved.AddListener(OnChildRemoved);
foreach (var pair in UwcManager.windows) {
var window = pair.Value;
if (
!window.isAltTabWindow &&
window.isChild &&
window.parentWindow.id == newWindow.id) {
OnChildAdded(window);
}
}
}
}
void OnChildAdded(UwcWindow window)
{
var childWindowTexture = InstantiateChild();
if (!childWindowTexture) {
Debug.LogError("childPrefab is not set or does not have UwcWindowTexture.");
return;
}
childWindowTexture.window = window;
childWindowTexture.parent = windowTexture_;
childWindowTexture.manager = windowTexture_.manager;
childWindowTexture.type = WindowTextureType.Child;
childWindowTexture.captureFrameRate = windowTexture_.captureFrameRate;
childWindowTexture.captureRequestTiming = windowTexture_.captureRequestTiming;
childWindowTexture.drawCursor = windowTexture_.drawCursor;
children_.Add(window.id, childWindowTexture);
}
void OnChildRemoved(UwcWindow window)
{
OnChildRemoved(window.id);
}
void OnChildRemoved(int id)
{
UwcWindowTexture child;
children_.TryGetValue(id, out child);
if (child) {
Destroy(child.gameObject);
children_.Remove(id);
}
}
void MoveAndScaleChildWindow(UwcWindowTexture child)
{
var window = child.window;
var parent = window.parentWindow;
var px = parent.x;
var py = parent.y;
var pw = parent.width;
var ph = parent.height;
var cx = window.x;
var cy = window.y;
var cw = window.width;
var ch = window.height;
var dz = windowTexture_.childWindowZDistance;
var desktopX = (cw - pw) * 0.5f + (cx - px);
var desktopY = (ch - ph) * 0.5f + (cy - py);
var localX = desktopX / parent.width;
var localY = -desktopY / parent.height;
var localZ = dz * (window.zOrder - window.parentWindow.zOrder) / transform.localScale.z;
child.transform.localPosition = new Vector3(localX, localY, localZ);
var widthRatio = 1f * window.width / window.parentWindow.width;
var heightRatio = 1f * window.height / window.parentWindow.height;
child.transform.localScale = new Vector3(widthRatio, heightRatio, 1f);
}
void UpdateChildren()
{
foreach (var kv in children_) {
MoveAndScaleChildWindow(kv.Value);
}
}
}
}