您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

761 行
22 KiB

using Unity.UIWidgets.foundation;
using UnityEngine;
namespace Unity.UIWidgets.ui {
public partial struct uiMatrix3 {
//Constants
enum TypeMask {
kIdentity_Mask = 0, //!< identity SkMatrix; all bits clear
kTranslate_Mask = 0x01, //!< translation SkMatrix
kScale_Mask = 0x02, //!< scale SkMatrix
kAffine_Mask = 0x04, //!< skew or rotate SkMatrix
kPerspective_Mask = 0x08, //!< perspective SkMatrix
}
const int kRectStaysRect_Mask = 0x10;
const int kOnlyPerspectiveValid_Mask = 0x40;
const int kUnknown_Mask = 0x80;
const int kORableMasks =
(int)
(TypeMask.kTranslate_Mask |
TypeMask.kScale_Mask |
TypeMask.kAffine_Mask |
TypeMask.kPerspective_Mask);
const int kAllMasks =
(int)
(TypeMask.kTranslate_Mask |
TypeMask.kScale_Mask |
TypeMask.kAffine_Mask |
TypeMask.kPerspective_Mask) |
kRectStaysRect_Mask;
enum TypeShift {
kTranslate_Shift,
kScale_Shift,
kAffine_Shift,
kPerspective_Shift,
kRectStaysRect_Shift
}
const int kScalar1Int = 0x3f800000;
}
public partial struct uiMatrix3 {
//Variables
public float kMScaleX; //0
public float kMSkewX; //1
public float kMTransX; //2
public float kMSkewY; //3
public float kMScaleY; //4
public float kMTransY; //5
public float kMPersp0; //6
public float kMPersp1; //7
public float kMPersp2; //8
public int fTypeMask;
}
public partial struct uiMatrix3 {
//private methods
void _setScale(float sx, float sy) {
if (1 == sx && 1 == sy) {
this.reset();
}
else {
this.kMScaleX = sx;
this.kMScaleY = sy;
this.kMPersp2 = 1;
this.kMTransX = this.kMTransY = this.kMSkewX =
this.kMSkewY = this.kMPersp0 = this.kMPersp1 = 0;
this._setTypeMask((int) TypeMask.kScale_Mask | kRectStaysRect_Mask);
}
}
void _setScale(float sx, float sy, float px, float py) {
if (1 == sx && 1 == sy) {
this.reset();
}
else {
this._setScaleTranslate(sx, sy, px - sx * px, py - sy * py);
}
}
int _computeTypeMask() {
int mask = 0;
if (this.kMPersp0 != 0 || this.kMPersp1 != 0 ||
this.kMPersp2 != 1) {
// Once it is determined that that this is a perspective transform,
// all other flags are moot as far as optimizations are concerned.
return kORableMasks;
}
if (this.kMTransX != 0 || this.kMTransY != 0) {
mask |= (int) TypeMask.kTranslate_Mask;
}
int m00 = uiScalarUtils.ScalarAs2sCompliment(this.kMScaleX);
int m01 = uiScalarUtils.ScalarAs2sCompliment(this.kMSkewX);
int m10 = uiScalarUtils.ScalarAs2sCompliment(this.kMSkewY);
int m11 = uiScalarUtils.ScalarAs2sCompliment(this.kMScaleY);
if ((m01 != 0) | (m10 != 0)) {
mask |= (int) TypeMask.kAffine_Mask | (int) TypeMask.kScale_Mask;
m01 = m01 != 0 ? 1 : 0;
m10 = m10 != 0 ? 1 : 0;
int dp0 = 0 == (m00 | m11) ? 1 : 0;
int ds1 = m01 & m10;
mask |= (dp0 & ds1) << (int) TypeShift.kRectStaysRect_Shift;
}
else {
if (((m00 ^ kScalar1Int) | (m11 ^ kScalar1Int)) != 0) {
mask |= (int) TypeMask.kScale_Mask;
}
m00 = m00 != 0 ? 1 : 0;
m11 = m11 != 0 ? 1 : 0;
mask |= (m00 & m11) << (int) TypeShift.kRectStaysRect_Shift;
}
return mask;
}
TypeMask _getType() {
if ((this.fTypeMask & kUnknown_Mask) != 0) {
this.fTypeMask = this._computeTypeMask();
}
// only return the public masks
return (TypeMask) (this.fTypeMask & 0xF);
}
public void reset() {
this.kMScaleX = this.kMScaleY = this.kMPersp2 = 1;
this.kMSkewX = this.kMSkewY = this.kMTransX =
this.kMTransY = this.kMPersp0 = this.kMPersp1 = 0;
this._setTypeMask((int) TypeMask.kIdentity_Mask | kRectStaysRect_Mask);
}
bool _isTriviallyIdentity() {
if ((this.fTypeMask & kUnknown_Mask) != 0) {
return false;
}
return (this.fTypeMask & 0xF) == 0;
}
void _setConcat(uiMatrix3 a, uiMatrix3 b) {
TypeMask aType = a._getType();
TypeMask bType = b._getType();
if (a._isTriviallyIdentity()) {
this.copyFrom(b);
}
else if (b._isTriviallyIdentity()) {
this.copyFrom(a);
}
else if (_only_scale_and_translate((int) aType | (int) bType)) {
this._setScaleTranslate(a.kMScaleX * b.kMScaleX,
a.kMScaleY * b.kMScaleY,
a.kMScaleX * b.kMTransX + a.kMTransX,
a.kMScaleY * b.kMTransY + a.kMTransY);
}
else {
uiMatrix3 tmp = new uiMatrix3();
if (((aType | bType) & TypeMask.kPerspective_Mask) != 0) {
tmp.kMScaleX = _rowcol3(a, 0, b, 0);
tmp.kMSkewX = _rowcol3(a, 0, b, 1);
tmp.kMTransX = _rowcol3(a, 0, b, 2);
tmp.kMSkewY = _rowcol3(a, 3, b, 0);
tmp.kMScaleY = _rowcol3(a, 3, b, 1);
tmp.kMTransY = _rowcol3(a, 3, b, 2);
tmp.kMPersp0 = _rowcol3(a, 6, b, 0);
tmp.kMPersp1 = _rowcol3(a, 6, b, 1);
tmp.kMPersp2 = _rowcol3(a, 6, b, 2);
tmp._setTypeMask(kUnknown_Mask);
}
else {
tmp.kMScaleX = _muladdmul(a.kMScaleX,
b.kMScaleX,
a.kMSkewX,
b.kMSkewY);
tmp.kMSkewX = _muladdmul(a.kMScaleX,
b.kMSkewX,
a.kMSkewX,
b.kMScaleY);
tmp.kMTransX = _muladdmul(a.kMScaleX,
b.kMTransX,
a.kMSkewX,
b.kMTransY) + a.kMTransX;
tmp.kMSkewY = _muladdmul(a.kMSkewY,
b.kMScaleX,
a.kMScaleY,
b.kMSkewY);
tmp.kMScaleY = _muladdmul(a.kMSkewY,
b.kMSkewX,
a.kMScaleY,
b.kMScaleY);
tmp.kMTransY = _muladdmul(a.kMSkewY,
b.kMTransX,
a.kMScaleY,
b.kMTransY) + a.kMTransY;
tmp.kMPersp0 = 0;
tmp.kMPersp1 = 0;
tmp.kMPersp2 = 1;
tmp._setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);
}
this.copyFrom(tmp);
}
}
void _setScaleTranslate(float sx, float sy, float tx, float ty) {
this.kMScaleX = sx;
this.kMSkewX = 0;
this.kMTransX = tx;
this.kMSkewY = 0;
this.kMScaleY = sy;
this.kMTransY = ty;
this.kMPersp0 = 0;
this.kMPersp1 = 0;
this.kMPersp2 = 1;
int mask = 0;
if (sx != 1 || sy != 1) {
mask |= (int) TypeMask.kScale_Mask;
}
if (tx != 0 || ty != 0) {
mask |= (int) TypeMask.kTranslate_Mask;
}
this._setTypeMask(mask | kRectStaysRect_Mask);
}
void _setTypeMask(int mask) {
D.assert(kUnknown_Mask == mask || (mask & kAllMasks) == mask ||
((kUnknown_Mask | kOnlyPerspectiveValid_Mask) & mask) ==
(kUnknown_Mask | kOnlyPerspectiveValid_Mask));
this.fTypeMask = mask;
}
void _orTypeMask(int mask) {
D.assert((mask & kORableMasks) == mask);
this.fTypeMask |= mask;
}
void _clearTypeMask(int mask) {
// only allow a valid mask
D.assert((mask & kAllMasks) == mask);
this.fTypeMask &= ~mask;
}
int _computePerspectiveTypeMask() {
if (this.kMPersp0 != 0 || this.kMPersp1 != 0 ||
this.kMPersp2 != 1) {
return kORableMasks;
}
return kOnlyPerspectiveValid_Mask | kUnknown_Mask;
}
TypeMask _getPerspectiveTypeMaskOnly() {
if ((this.fTypeMask & kUnknown_Mask) != 0 &&
(this.fTypeMask & kOnlyPerspectiveValid_Mask) == 0) {
this.fTypeMask = this._computePerspectiveTypeMask();
}
return (TypeMask) (this.fTypeMask & 0xF);
}
bool _hasPerspective() {
return (this._getPerspectiveTypeMaskOnly() & TypeMask.kPerspective_Mask) != 0;
}
void _updateTranslateMask() {
if ((this.kMTransX != 0) | (this.kMTransY != 0)) {
this.fTypeMask |= (int) TypeMask.kTranslate_Mask;
}
else {
this.fTypeMask &= ~(int) TypeMask.kTranslate_Mask;
}
}
public bool _isFinite() {
return uiScalarUtils.ScalarsAreFinite(this);
}
uiMatrix3? _invertNonIdentity(bool invertableCheck) {
D.assert(!this.isIdentity());
TypeMask mask = this._getType();
if (0 == (mask & ~(TypeMask.kScale_Mask | TypeMask.kTranslate_Mask))) {
bool invertible = true;
if (!invertableCheck) {
if ((mask & TypeMask.kScale_Mask) != 0) {
var invX = this.kMScaleX;
var invY = this.kMScaleY;
if (0 == invX || 0 == invY) {
return null;
}
invX = 1f / invX;
invY = 1f / invY;
var _inv = I();
_inv.kMSkewX = _inv.kMSkewY =
_inv.kMPersp0 = _inv.kMPersp1 = 0;
_inv.kMScaleX = invX;
_inv.kMScaleY = invY;
_inv.kMPersp2 = 1;
_inv.kMTransX = -this.kMTransX * invX;
_inv.kMTransY = -this.kMTransY * invY;
_inv._setTypeMask((int) mask | kRectStaysRect_Mask);
return _inv;
}
else {
var _inv = I();
_inv.setTranslate(-this.kMTransX, -this.kMTransY);
return _inv;
}
}
else {
if (this.kMScaleX == 0 || this.kMScaleY == 0) {
return null;
}
return I();
}
}
int isPersp = (int) (mask & TypeMask.kPerspective_Mask);
float invDet = uiScalarUtils.inv_determinant(this, isPersp);
if (invDet == 0) {
// underflow
return null;
}
var inv = ComputeInv(this, invDet, isPersp != 0);
if (!inv._isFinite()) {
return null;
}
inv._setTypeMask(this.fTypeMask);
return inv;
}
public bool _isScaleTranslate() {
return (this._getType() & ~(TypeMask.kScale_Mask | TypeMask.kTranslate_Mask)) == 0;
}
public uiRect _mapRectScaleTranslate(uiRect src) {
D.assert(this._isScaleTranslate());
var sx = this.kMScaleX;
var sy = this.kMScaleY;
var tx = this.kMTransX;
var ty = this.kMTransY;
var dst = uiRectHelper.fromLTRB(
src.left * sx + tx,
src.top * sy + ty,
src.right * sx + tx,
src.bottom * sy + ty
);
dst = uiRectHelper.normalize(dst);
return dst;
}
}
public partial struct uiMatrix3 {
//public methods
public uiMatrix3(uiMatrix3 other) {
this.kMScaleX = other.kMScaleX;
this.kMSkewX = other.kMSkewX;
this.kMTransX = other.kMTransX;
this.kMSkewY = other.kMSkewY;
this.kMScaleY = other.kMScaleY;
this.kMTransY = other.kMTransY;
this.kMPersp0 = other.kMPersp0;
this.kMPersp1 = other.kMPersp1;
this.kMPersp2 = other.kMPersp2;
this.fTypeMask = other.fTypeMask;
}
public void copyFrom(uiMatrix3 other) {
this.kMScaleX = other.kMScaleX;
this.kMSkewX = other.kMSkewX;
this.kMTransX = other.kMTransX;
this.kMSkewY = other.kMSkewY;
this.kMScaleY = other.kMScaleY;
this.kMTransY = other.kMTransY;
this.kMPersp0 = other.kMPersp0;
this.kMPersp1 = other.kMPersp1;
this.kMPersp2 = other.kMPersp2;
this.fTypeMask = other.fTypeMask;
}
public bool isIdentity() {
return this._getType() == 0;
}
public float getScaleX() {
return this.kMScaleX;
}
public float getScaleY() {
return this.kMScaleY;
}
public float getSkewY() {
return this.kMSkewY;
}
public float getSkewX() {
return this.kMSkewX;
}
public float getTranslateX() {
return this.kMTransX;
}
public float getTranslateY() {
return this.kMTransY;
}
public float getPerspX() {
return this.kMPersp0;
}
public float getPerspY() {
return this.kMPersp1;
}
public void postConcat(uiMatrix3 mat) {
if (!mat.isIdentity()) {
this._setConcat(mat, this);
}
}
public void setSinCos(float sinV, float cosV, float px, float py) {
var oneMinusCosV = 1 - cosV;
this.kMScaleX = cosV;
this.kMSkewX = -sinV;
this.kMTransX = uiScalarUtils.sdot(sinV, py, oneMinusCosV, px);
this.kMSkewY = sinV;
this.kMScaleY = cosV;
this.kMTransY = uiScalarUtils.sdot(-sinV, px, oneMinusCosV, py);
this.kMPersp0 = this.kMPersp1 = 0;
this.kMPersp2 = 1;
this._setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);
}
public void setSinCos(float sinV, float cosV) {
this.kMScaleX = cosV;
this.kMSkewX = -sinV;
this.kMTransX = 0;
this.kMSkewY = sinV;
this.kMScaleY = cosV;
this.kMTransY = 0;
this.kMPersp0 = this.kMPersp1 = 0;
this.kMPersp2 = 1;
this._setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);
}
public void setTranslate(float dx, float dy) {
if ((dx != 0) | (dy != 0)) {
this.kMTransX = dx;
this.kMTransY = dy;
this.kMScaleX = this.kMScaleY = this.kMPersp2 = 1;
this.kMSkewX = this.kMSkewY =
this.kMPersp0 = this.kMPersp1 = 0;
this._setTypeMask((int) TypeMask.kTranslate_Mask | kRectStaysRect_Mask);
}
else {
this.reset();
}
}
public void postTranslate(float dx, float dy) {
if (this._hasPerspective()) {
var m = new uiMatrix3();
m.setTranslate(dx, dy);
this.postConcat(m);
}
else {
this.kMTransX += dx;
this.kMTransY += dy;
this._updateTranslateMask();
}
}
public void postScale(float sx, float sy) {
if (1 == sx && 1 == sy) {
return;
}
var m = new uiMatrix3();
m._setScale(sx, sy);
this.postConcat(m);
}
public bool rectStaysRect() {
if ((this.fTypeMask & kUnknown_Mask) != 0) {
this.fTypeMask = this._computeTypeMask();
}
return (this.fTypeMask & kRectStaysRect_Mask) != 0;
}
public uiMatrix3? invert(bool invertableCheck = false) {
if (this.isIdentity()) {
return I();
}
return this._invertNonIdentity(invertableCheck);
}
public uiRect mapRect(uiRect src) {
if (this._getType() <= TypeMask.kTranslate_Mask) {
var tx = this.kMTransX;
var ty = this.kMTransY;
var dst = uiRectHelper.fromLTRB(
src.left + tx,
src.top + ty,
src.right + tx,
src.bottom + ty
);
dst = uiRectHelper.normalize(dst);
return dst;
}
if (this._isScaleTranslate()) {
return this._mapRectScaleTranslate(src);
}
else {
float x1, y1, x2, y2, x3, y3, x4, y4;
this.mapXY(src.left, src.top, out x1, out y1);
this.mapXY(src.right, src.top, out x2, out y2);
this.mapXY(src.right, src.bottom, out x3, out y3);
this.mapXY(src.left, src.bottom, out x4, out y4);
var minX = x1;
var minY = y1;
var maxX = x1;
var maxY = y1;
if (x2 < minX) {
minX = x2;
}
if (x2 > maxX) {
maxX = x2;
}
if (y2 < minY) {
minY = y2;
}
if (y2 > maxY) {
maxY = y2;
}
if (x3 < minX) {
minX = x3;
}
if (x3 > maxX) {
maxX = x3;
}
if (y3 < minY) {
minY = y3;
}
if (y3 > maxY) {
maxY = y3;
}
if (x4 < minX) {
minX = x4;
}
if (x4 > maxX) {
maxX = x4;
}
if (y4 < minY) {
minY = y4;
}
if (y4 > maxY) {
maxY = y4;
}
var dst = uiRectHelper.fromLTRB(minX, minY, maxX, maxY);
return dst;
}
}
public void mapXY(float x, float y, out float x1, out float y1) {
this._getMapXYProc()(this, x, y, out x1, out y1);
}
public Matrix4x4 toMatrix4x4() {
var matrix = Matrix4x4.identity;
matrix[0, 0] = this.kMScaleX; // row 0
matrix[0, 1] = this.kMSkewX;
matrix[0, 3] = this.kMTransX;
matrix[1, 0] = this.kMSkewY; // row 1
matrix[1, 1] = this.kMScaleY;
matrix[1, 3] = this.kMTransY;
matrix[3, 0] = this.kMPersp0; // row 2
matrix[3, 1] = this.kMPersp1;
matrix[3, 3] = this.kMPersp2;
return matrix;
}
public void preTranslate(float dx, float dy) {
var mask = this._getType();
if (mask <= TypeMask.kTranslate_Mask) {
this.kMTransX += dx;
this.kMTransY += dy;
}
else if ((mask & TypeMask.kPerspective_Mask) != 0) {
var m = new uiMatrix3();
m.setTranslate(dx, dy);
this.preConcat(m);
return;
}
else {
this.kMTransX += this.kMScaleX * dx + this.kMSkewX * dy;
this.kMTransY += this.kMSkewY * dx + this.kMScaleY * dy;
}
this._updateTranslateMask();
}
public void preConcat(uiMatrix3 other) {
if (!other.isIdentity()) {
this._setConcat(this, other);
}
}
public void preScale(float sx, float sy, float px, float py) {
if (1 == sx && 1 == sy) {
return;
}
var m = new uiMatrix3();
m.setScale(sx, sy, px, py);
this.preConcat(m);
}
public void preScale(float sx, float sy) {
if (1 == sx && 1 == sy) {
return;
}
this.kMScaleX *= sx;
this.kMSkewY *= sx;
this.kMPersp0 *= sx;
this.kMSkewX *= sy;
this.kMScaleY *= sy;
this.kMPersp1 *= sy;
if (this.kMScaleX == 1 && this.kMScaleY == 1 && (this.fTypeMask &
(int) (TypeMask.kPerspective_Mask | TypeMask.kAffine_Mask)
) == 0) {
this._clearTypeMask((int) TypeMask.kScale_Mask);
}
else {
this._orTypeMask((int) TypeMask.kScale_Mask);
}
}
public void preRotate(float radians, float px, float py) {
var m = new uiMatrix3();
m.setRotate(radians, px, py);
this.preConcat(m);
}
public void preRotate(float radians) {
var m = new uiMatrix3();
m.setRotate(radians);
this.preConcat(m);
}
public void preSkew(float kx, float ky) {
var m = new uiMatrix3();
m.setSkew(kx, ky);
this.preConcat(m);
}
public void setScale(float sx, float sy, float px, float py) {
if (1 == sx && 1 == sy) {
this.reset();
}
else {
this._setScaleTranslate(sx, sy, px - sx * px, py - sy * py);
}
}
}
}