您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
96 行
2.8 KiB
96 行
2.8 KiB
using System;
|
|
using System.Reflection;
|
|
using Unity.UIWidgets.async;
|
|
using Unity.UIWidgets.engine;
|
|
using Unity.UIWidgets.foundation;
|
|
using Unity.UIWidgets.scheduler;
|
|
using Unity.UIWidgets.ui;
|
|
using UnityEngine;
|
|
using Rect = Unity.UIWidgets.ui.Rect;
|
|
|
|
namespace Unity.UIWidgets.rendering {
|
|
public class TextureBox : RenderBox {
|
|
|
|
public TextureBox(int? textureId, Texture texture) {
|
|
_textureId = textureId;
|
|
_texture = texture;
|
|
}
|
|
|
|
Texture _texture;
|
|
public int? textureId {
|
|
get { return _textureId; }
|
|
set {
|
|
D.assert(value != null);
|
|
if (value != _textureId) {
|
|
_textureId = value;
|
|
markNeedsPaint();
|
|
}
|
|
}
|
|
}
|
|
|
|
int? _textureId;
|
|
Timer _timer;
|
|
bool _frameCallbackScheduled;
|
|
|
|
protected override bool sizedByParent {
|
|
get { return true; }
|
|
}
|
|
|
|
protected override bool alwaysNeedsCompositing {
|
|
get { return true; }
|
|
}
|
|
|
|
public override bool isRepaintBoundary {
|
|
get { return true; }
|
|
}
|
|
|
|
protected override void performResize() {
|
|
size = constraints.biggest;
|
|
}
|
|
|
|
protected override bool hitTestSelf(Offset position) {
|
|
return true;
|
|
}
|
|
|
|
void _scheduleAppFrame() {
|
|
if (_frameCallbackScheduled || textureId == null) {
|
|
return;
|
|
}
|
|
|
|
_frameCallbackScheduled = true;
|
|
SchedulerBinding.instance.scheduleFrameCallback(_handleAppFrame);
|
|
}
|
|
|
|
void _handleAppFrame(TimeSpan timestamp) {
|
|
_frameCallbackScheduled = false;
|
|
if (textureId == null) {
|
|
return;
|
|
}
|
|
|
|
TimeSpan delay = TimeSpan.Zero;
|
|
delay = new TimeSpan((long) (delay.Ticks * scheduler_.timeDilation));
|
|
// TODO: time dilation
|
|
_timer = Timer.create(delay, () => _scheduleAppFrame());
|
|
}
|
|
|
|
public override void paint(PaintingContext context, Offset offset) {
|
|
if (_textureId == null) {
|
|
if (_texture != null) {
|
|
markNeedsLayout();
|
|
SchedulerBinding.instance.scheduleFrameCallback(_handleAppFrame);
|
|
|
|
if (_texture.GetNativeTexturePtr() != IntPtr.Zero) {
|
|
_textureId = UIWidgetsPanelWrapper.current.registerTexture(_texture);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
_scheduleAppFrame();
|
|
context.addLayer(new TextureLayer(
|
|
rect: Rect.fromLTWH(offset.dx, offset.dy, size.width, size.height),
|
|
textureId: _textureId.Value
|
|
));
|
|
}
|
|
}
|
|
}
|