import { TWEEN } from '@uino/base-thing';

/**
 * @typedef {object} AABBResult
 * 表示一个轴对齐包围盒(AABB),用于描述空间中的包围范围。
 * @property {Array<number>} center 盒子的中心。
 * @property {Array<number>} halfSize 盒子的半边长。
 */

/**
 * @typedef {object} OBBResult
 * 表示一个有向包围盒(OBB),可用于描述带方向的空间边界。
 * @property {Array<number>} center 盒子的中心。
 * @property {Array<number>} halfSize 盒子的半边长。
 * @property {Array<number>} rotation 盒子的旋转,单位为弧度(四元数)。
 */

/**
 * 节点用户数据类型。
 * @enum {string}
 * @readonly
 * @private
 */
const NodeUserDataType = {
	/**
	 * 节点的包围盒继承类型。
	 * @private
	 */
	BoundingBoxInheritType: '_BoundingBoxInheritType_',
};

/**
 * @typedef {object} MouseEventData
 * @property {string} type 事件类型,小写形式。
 * @property {boolean} altKey 检查是否按下 alt 键。
 * @property {boolean} ctrlKey 检查是否按下 control 键。
 * @property {boolean} shiftKey 检查是否按下 shift 键。
 * @property {number} deltaX 鼠标光标的 x 方向位移(以像素为单位)。
 * @property {number} deltaY 鼠标光标的 y 方向位移(以像素为单位)。
 * @property {number} x 鼠标光标的 x 坐标(以像素为单位)。
 * @property {number} y 鼠标光标的 y 坐标(以像素为单位)。
 * @property {THING.BaseObject} object 选中的对象(可能为 null)。
 * @property {Array<number>} pickedPosition 选中位置的世界坐标。
 * @property {Array<number>} normal 世界坐标中的法线方向。
 * @public
 */

/**
 * 相机模式
 * @enum {string}
 * @public
 */
const CameraMode = {
	/**
	 * 地图模式
	 */
	Map: 'Map',
	/**
	 * 普通模式
	 */
	Normal: 'Normal'
}

/**
 * 事件类型
 * @enum {string}
 * @readonly
 * @public
 */
const EventType = {
	// #region 系统

	/**
	 * 当应用程序退出时。
	 */
	AppQuit: 'AppQuit',

	/**
	 * 当应用程序被设置为当前时。
	 */
	AppEnter: 'AppEnter',

	/**
	 * 当应用程序被设置为非当前时。
	 */
	AppLeave: 'AppLeave',

	/**
	 * 当更新时。
	 */
	Update: 'Update',

	/**
	 * 当应用程序获得焦点时。
	 */
	FocusIn: 'FocusIn',

	/**
	 * 当应用程序失去焦点时。
	 */
	FocusOut: 'FocusOut',

	/**
	 * 当应用程序调整大小时。
	 */
	Resize: 'Resize',

	/**
	 * 当鼠标进入对象时。
	 */
	MouseEnter: 'MouseEnter',

	/**
	 * 当鼠标离开对象时。
	 */
	MouseLeave: 'MouseLeave',

	/**
	 * 当鼠标移动时。
	 */
	MouseMove: 'MouseMove',

	/**
	 * 当鼠标按钮抬起时。
	 */
	MouseUp: 'MouseUp',

	/**
	 * 当鼠标按钮按下时。
	 */
	MouseDown: 'MouseDown',

	/**
	 * 当鼠标滚轮滚动时。
	 */
	Wheel: 'Wheel',

	/**
	 * 当触摸结束时。
	 */
	Click: 'Click',

	/**
	 * 当双击触摸结束时。
	 */
	DBLClick: 'DBLClick',

	/**
	 * 当按键按下时。
	 */
	KeyDown: 'KeyDown',

	/**
	 * 当按键抬起时。
	 */
	KeyUp: 'KeyUp',

	/**
	 * 当按键正在按下时。
	 */
	KeyPress: 'KeyPress',

	/**
	 * 当将文件拖放到应用程序容器中时。
	 */
	DropFiles: 'DropFiles',

	/**
	 * 当时间线改变时。
	 */
	TimelineChange: 'TimelineChange',

	/**
	 * 当进入状态时。
	 * @private
	 */
	EnterState: 'EnterState',
	AfterEnterState: 'AfterEnterState',

	/**
	 * 当离开状态时。
	 * @private
	 */
	LeaveState: 'LeaveState',
	AfterLeaveState: 'AfterLeaveState',

	// #endregion

	// #region 层级

	/**
	 * 当第一次为层级组件注册层级动作时
	 */
	RegisterLevelAction: 'RegisterLevelAction',

	/**
	 * 在离开对象层级之前。
	 */
	BeforeLeaveLevel: 'BeforeLeaveLevel',

	/**
	 * 离开对象层级。
	 */
	LeaveLevel: 'LeaveLevel',

	/**
	 * 离开对象层级。
	 */
	LeaveObjectLevel: 'LeaveObjectLevel',

	/**
	 * 离开对象层级之后。
	 */
	AfterLeaveLevel: 'AfterLeaveLevel',

	/**
	 * 在进入对象层级之前。
	 */
	BeforeEnterLevel: 'BeforeEnterLevel',

	/**
	 * 进入对象层级。
	 */
	EnterLevel: 'EnterLevel',

	/**
	 * 进入对象层级。
	 */
	EnterObjectLevel: 'EnterObjectLevel',

	/**
	 * 进入对象层级之后。
	 */
	AfterEnterLevel: 'AfterEnterLevel',

	/**
	 * 完成对象层级进入。
	 */
	CompleteEnterLevel: 'CompleteEnterLevel',

	/**
	 * 离开对象层级完成。
	 */
	ObjectLevelComplete: 'ObjectLevelComplete',
	// #endregion

	// #region 碰撞体

	/**
	 * 当进入(碰撞)对象的碰撞体时(在离开碰撞体之前只触发一次)。
	 */
	ColliderEnter: 'ColliderEnter',

	/**
	 * 当离开对象的碰撞体时。
	 */
	ColliderLeave: 'ColliderLeave',

	// #endregion

	// #region 对象

	/**
	 * 当创建对象事件时(同步)。
	 */
	CreateSync: 'CreateSync',

	/**
	 * 当创建对象事件时。
	 */
	Create: 'Create',

	/**
	 * 当加载对象资源事件时。
	 */
	Load: 'Load',

	/**
	 * 当加载对象资源时。
	 */
	Progress: 'Progress',

	/**
	 * 当加载对象资源失败时。
	 */
	Error: 'Error',

	/**
	 * 在销毁对象事件之前。
	 * @private
	 */
	BeforeDestroy: 'Destroy',

	/**
	 * 当销毁对象事件时。
	 */
	Destroy: 'Destroy',

	/**
	 * 在销毁对象事件之后。
	 * @private
	 */
	AfterDestroy: 'Destroy',

	/**
	 * 在将子对象添加到对象之前。
	 */
	BeforeAddChild: 'BeforeAddChild',

	/**
	 * 在将子对象添加到对象之后。
	 */
	AfterAddChild: 'AfterAddChild',

	/**
	 * 在从对象中移除子对象之前。
	 */
	BeforeRemoveChild: 'BeforeRemoveChild',

	/**
	 * 在从对象中移除子对象之后。
	 */
	AfterRemoveChild: 'AfterRemoveChild',

	/**
	 * 当对象开始飞行时。
	 */
	StartFlying: 'StartFlying',

	/**
	 * 当对象正在飞行时。
	 */
	Flying: 'Flying',

	/**
	 * 当对象停止飞行时。
	 */
	StopFlying: 'StopFlying',

	/**
	 * 当对象完成飞行时。
	 */
	CompleteFlying: 'CompleteFlying',

	/**
	 * 当对象的活动属性改变时。
	 */
	ActiveChange: 'ActiveChange',

	/**
	 * 当对象的可见属性改变时。
	 */
	VisibleChange: 'VisibleChange',

	/**
	 * 当对象停止播放动画时。
	 */
	StopAnimation: 'StopAnimation',

	/**
	 * 当对象开始播放动画时。
	 */
	PlayAnimation: 'PlayAnimation',

	/**
	 * 当对象改变属性时。
	 */
	ChangeAttributes: 'ChangeAttributes',

	// #endregion

	// #region 相机

	/**
	 * 当相机启用视口时。
	 */
	EnableViewport: 'EnableViewport',

	/**
	 * 当相机准备开始改变时。
	 */
	CameraChangePreStart: 'CameraChangePreStart',

	/**
	 * 当相机开始改变时。
	 */
	CameraChangeStart: 'CameraChangeStart',

	/**
	 * 当相机正在改变时。
	 */
	CameraChange: 'CameraChange',

	/**
	 * 当相机准备结束改变时。
	 */
	CameraChangePreEnd: 'CameraChangePreEnd',

	/**
	 * 当相机结束改变时。
	 */
	CameraChangeEnd: 'CameraChangeEnd',

	/**
	 * 当相机开始捕获屏幕时。
	 * @private
	 */
	BeforeCameraCapture: 'BeforeCameraCapture',

	/**
	 * 当相机完成捕获屏幕时。
	 * @private
	 */
	AfterCameraCapture: 'AfterCameraCapture',

	/**
	 * 在场景加载器中加载解析器之前
	 */
	BeforeLoadResolvers: 'BeforeLoadResolvers',

	// 通知物体被选择
	Select: 'select',
	// 通知物体被取消选择
	Deselect: 'deselect',
	// 通知物体选择集合更新
	SelectionChange: 'selectionchange',
	// renderSetting中的灯光改变 给地球用
	RenderSettingsLightChange: 'RenderSettingsLightChange'
	// #endregion
};

/**
 * @callback LerpCallback
 * @param {number} t 当前插值进度值 [0, 1]
 * @returns {number} 插值结果
 */

/**
 * @typedef {object} Linear
 * @property {LerpCallback} None 无插值
 * @public
 */

/**
 * @typedef {object} Quadratic
 * @property {LerpCallback} In 二次插值 - 进入
 * @property {LerpCallback} Out 二次插值 - 离开
 * @property {LerpCallback} InOut 二次插值 - 进入和离开
 * @public
 */

/**
 * @typedef {object} Cubic
 * @property {LerpCallback} In 三次插值 - 进入
 * @property {LerpCallback} Out 三次插值 - 离开
 * @property {LerpCallback} InOut 三次插值 - 进入和离开
 * @public
 */

/**
 * @typedef {object} Quartic
 * @property {LerpCallback} In 四次插值 - 进入
 * @property {LerpCallback} Out 四次插值 - 离开
 * @property {LerpCallback} InOut 四次插值 - 进入和离开
 * @public
 */

/**
 * @typedef {object} Quintic
 * @property {LerpCallback} In 五次插值 - 进入
 * @property {LerpCallback} Out 五次插值 - 离开
 * @property {LerpCallback} InOut 五次插值 - 进入和离开
 * @public
 */

/**
 * @typedef {object} Sinusoidal
 * @property {LerpCallback} In 正弦插值 - 进入
 * @property {LerpCallback} Out 正弦插值 - 离开
 * @property {LerpCallback} InOut 正弦插值 - 进入和离开
 * @public
 */

/**
 * @typedef {object} Exponential
 * @property {LerpCallback} In 指数插值 - 进入
 * @property {LerpCallback} Out 指数插值 - 离开
 * @property {LerpCallback} InOut 指数插值 - 进入和离开
 * @public
 */

/**
 * @typedef {object} Circular
 * @property {LerpCallback} In 圆形插值 - 进入
 * @property {LerpCallback} Out 圆形插值 - 离开
 * @property {LerpCallback} InOut 圆形插值 - 进入和离开
 * @public
 */

/**
 * @typedef {object} Elastic
 * @property {LerpCallback} In 弹性插值 - 进入
 * @property {LerpCallback} Out 弹性插值 - 离开
 * @property {LerpCallback} InOut 弹性插值 - 进入和离开
 * @public
 */

/**
 * @typedef {object} Back
 * @property {LerpCallback} In 回弹插值 - 进入
 * @property {LerpCallback} Out 回弹插值 - 离开
 * @property {LerpCallback} InOut 回弹插值 - 进入和离开
 * @public
 */

/**
 * @typedef {object} Bounce
 * @property {LerpCallback} In 弹跳插值 - 进入
 * @property {LerpCallback} Out 弹跳插值 - 离开
 * @property {LerpCallback} InOut 弹跳插值 - 进入和离开
 * @public
 */

/**
 * @typedef {object} LerpType
 * 插值类型。用于描述插值行为的配置对象。
 * @see http://sole.github.io/tween.js/examples/03_graphs.html
 * @property {object} Linear 线性插值
 * @property {object} Quadratic 二次插值
 * @property {object} Cubic 三次插值
 * @property {object} Quartic 四次插值
 * @property {object} Quintic 五次插值
 * @property {object} Sinusoidal 正弦插值
 * @property {object} Exponential 指数插值
 * @property {object} Circular 圆形插值
 * @property {object} Elastic 弹性插值
 * @property {object} Back 回弹插值
 * @property {object} Bounce 弹跳插值
 * @public
 */
const LerpType = {
	Linear: {
		/**
		 * @function
		 * @description 无插值
		 */
		None: TWEEN.Easing.Linear.None,
	},
	Quadratic: {
		/**
		 * @function
		 * @description 二次插值 - 进入
		 */
		In: TWEEN.Easing.Quadratic.In,
		/**
		 * @function
		 * @description 二次插值 - 离开
		 */
		Out: TWEEN.Easing.Quadratic.Out,
		/**
		 * @function
		 * @description 二次插值 - 进入和离开
		 */
		InOut: TWEEN.Easing.Quadratic.InOut,
	},
	Cubic: {
		/**
		 * @function
		 * @description 三次插值 - 进入
		 */
		In: TWEEN.Easing.Cubic.In,
		/**
		 * @function
		 * @description 三次插值 - 离开
		 */
		Out: TWEEN.Easing.Cubic.Out,
		/**
		 * @function
		 * @description 三次插值 - 进入和离开
		 */
		InOut: TWEEN.Easing.Cubic.InOut,
	},
	Quartic: {
		/**
		 * @function
		 * @description 四次插值 - 进入
		 */
		In: TWEEN.Easing.Quartic.In,
		/**
		 * @function
		 * @description 四次插值 - 离开
		 */
		Out: TWEEN.Easing.Quartic.Out,
		/**
		 * @function
		 * @description 四次插值 - 进入和离开
		 */
		InOut: TWEEN.Easing.Quartic.InOut,
	},
	Quintic: {
		/**
		 * @function
		 * @description 五次插值 - 进入
		 */
		In: TWEEN.Easing.Quintic.In,
		/**
		 * @function
		 * @description 五次插值 - 离开
		 */
		Out: TWEEN.Easing.Quintic.Out,
		/**
		 * @function
		 * @description 五次插值 - 进入和离开
		 */
		InOut: TWEEN.Easing.Quintic.InOut,
	},
	Sinusoidal: {
		/**
		 * @function
		 * @description 正弦插值 - 进入
		 */
		In: TWEEN.Easing.Sinusoidal.In,
		/**
		 * @function
		 * @description 正弦插值 - 离开
		 */
		Out: TWEEN.Easing.Sinusoidal.Out,
		/**
		 * @function
		 * @description 正弦插值 - 进入和离开
		 */
		InOut: TWEEN.Easing.Sinusoidal.InOut,
	},
	Exponential: {
		/**
		 * @function
		 * @description 指数插值 - 进入
		 */
		In: TWEEN.Easing.Exponential.In,
		/**
		 * @function
		 * @description 指数插值 - 离开
		 */
		Out: TWEEN.Easing.Exponential.Out,
		/**
		 * @function
		 * @description 指数插值 - 进入和离开
		 */
		InOut: TWEEN.Easing.Exponential.InOut,
	},
	Circular: {
		/**
		 * @function
		 * @description 圆形插值 - 进入
		 */
		In: TWEEN.Easing.Circular.In,
		/**
		 * @function
		 * @description 圆形插值 - 离开
		 */
		Out: TWEEN.Easing.Circular.Out,
		/**
		 * @function
		 * @description 圆形插值 - 进入和离开
		 */
		InOut: TWEEN.Easing.Circular.InOut,
	},
	Elastic: {
		/**
		 * @function
		 * @description 弹性插值 - 进入
		 */
		In: TWEEN.Easing.Elastic.In,
		/**
		 * @function
		 * @description 弹性插值 - 离开
		 */
		Out: TWEEN.Easing.Elastic.Out,
		/**
		 * @function
		 * @description 弹性插值 - 进入和离开
		 */
		InOut: TWEEN.Easing.Elastic.InOut,
	},
	Back: {
		/**
		 * @function
		 * @description 回弹插值 - 进入
		 */
		In: TWEEN.Easing.Back.In,
		/**
		 * @function
		 * @description 回弹插值 - 离开
		 */
		Out: TWEEN.Easing.Back.Out,
		/**
		 * @function
		 * @description 回弹插值 - 进入和离开
		 */
		InOut: TWEEN.Easing.Back.InOut,
	},
	Bounce: {
		/**
		 * @function
		 * @description 弹跳插值 - 进入
		 */
		In: TWEEN.Easing.Bounce.In,
		/**
		 * @function
		 * @description 弹跳插值 - 离开
		 */
		Out: TWEEN.Easing.Bounce.Out,
		/**
		 * @function
		 * @description 弹跳插值 - 进入和离开
		 */
		InOut: TWEEN.Easing.Bounce.InOut,
	},
};

/**
 * 循环类型。
 * @enum {string}
 * @readonly
 * @public
 */
const LoopType = {
	/**
	 * 值在重复循环模式下变化。
	 */
	Repeat: 'Repeat',

	/**
	 * 值在乒乓循环模式下变化。
	 */
	PingPong: 'PingPong',
};

/**
 * 鼠标按钮类型。
 * @enum {string}
 * @readonly
 * @public
 */
const MouseButtonType = {
	/**
	 * 无效的鼠标按钮类型。
	 */
	None: 'None',

	/**
	 * 鼠标左键类型。
	 */
	Left: 'Left',

	/**
	 * 鼠标中键类型。
	 */
	Middle: 'Middle',

	/**
	 * 鼠标右键类型。
	 */
	Right: 'Right'
};

/**
 * 空间类型。
 * @enum {string}
 * @readonly
 * @public
 */
const SpaceType = {
	/**
	 * 基于自身空间。
	 */
	Self: 'Self',

	/**
	 * 基于局部空间。
	 */
	Local: 'Local',

	/**
	 * 基于世界空间。
	 */
	World: 'World'
};

/**
 * 按键代码。
 * @enum {string}
 * @readonly
 * @public
 */
const CodeType = {
	/** ESC键 */
	Escape: "Escape",
	/** 数字键1 */
	Digit1: "Digit1",
	/** 数字键2 */
	Digit2: "Digit2",
	/** 数字键3 */
	Digit3: "Digit3",
	/** 数字键4 */
	Digit4: "Digit4",
	/** 数字键5 */
	Digit5: "Digit5",
	/** 数字键6 */
	Digit6: "Digit6",
	/** 数字键7 */
	Digit7: "Digit7",
	/** 数字键8 */
	Digit8: "Digit8",
	/** 数字键9 */
	Digit9: "Digit9",
	/** 数字键0 */
	Digit0: "Digit0",
	/** 减号 */
	Minus: "Minus",
	/** 等号 */
	Equal: "Equal",
	/** 退格键 */
	Backspace: "Backspace",
	/** Tab键 */
	Tab: "Tab",
	/** Q键 */
	KeyQ: "KeyQ",
	/** W键 */
	KeyW: "KeyW",
	/** E键 */
	KeyE: "KeyE",
	/** R键 */
	KeyR: "KeyR",
	/** T键 */
	KeyT: "KeyT",
	/** Y键 */
	KeyY: "KeyY",
	/** U键 */
	KeyU: "KeyU",
	/** I键 */
	KeyI: "KeyI",
	/** O键 */
	KeyO: "KeyO",
	/** P键 */
	KeyP: "KeyP",
	/** 左方括号 */
	BracketLeft: "BracketLeft",
	/** 右方括号 */
	BracketRight: "BracketRight",
	/** 回车键 */
	Enter: "Enter",
	/** 左控制键 */
	ControlLeft: "ControlLeft",
	/** A键 */
	KeyA: "KeyA",
	/** S键 */
	KeyS: "KeyS",
	/** D键 */
	KeyD: "KeyD",
	/** F键 */
	KeyF: "KeyF",
	/** G键 */
	KeyG: "KeyG",
	/** H键 */
	KeyH: "KeyH",
	/** J键 */
	KeyJ: "KeyJ",
	/** K键 */
	KeyK: "KeyK",
	/** L键 */
	KeyL: "KeyL",
	/** 分号 */
	Semicolon: "Semicolon",
	/** 引号 */
	Quote: "Quote",
	/** 反引号 */
	Backquote: "Backquote",
	/** 左Shift键 */
	ShiftLeft: "ShiftLeft",
	/** 反斜杠 */
	Backslash: "Backslash",
	/** Z键 */
	KeyZ: "KeyZ",
	/** X键 */
	KeyX: "KeyX",
	/** C键 */
	KeyC: "KeyC",
	/** V键 */
	KeyV: "KeyV",
	/** B键 */
	KeyB: "KeyB",
	/** N键 */
	KeyN: "KeyN",
	/** M键 */
	KeyM: "KeyM",
	/** 逗号 */
	Comma: "Comma",
	/** 句点 */
	Period: "Period",
	/** 斜杠 */
	Slash: "Slash",
	/** 右Shift键 */
	ShiftRight: "ShiftRight",
	/** 小键盘乘法 */
	NumpadMultiply: "NumpadMultiply",
	/** 左Alt键 */
	AltLeft: "AltLeft",
	/** 空格键 */
	Space: "Space",
	/** 大写锁定 */
	CapsLock: "CapsLock",
	/** F1键 */
	F1: "F1",
	/** F2键 */
	F2: "F2",
	/** F3键 */
	F3: "F3",
	/** F4键 */
	F4: "F4",
	/** F5键 */
	F5: "F5",
	/** F6键 */
	F6: "F6",
	/** F7键 */
	F7: "F7",
	/** F8键 */
	F8: "F8",
	/** F9键 */
	F9: "F9",
	/** F10键 */
	F10: "F10",
	/** 暂停键 */
	Pause: "Pause",
	/** 滚动锁定 */
	ScrollLock: "ScrollLock",
	/** 小键盘7 */
	Numpad7: "Numpad7",
	/** 小键盘8 */
	Numpad8: "Numpad8",
	/** 小键盘9 */
	Numpad9: "Numpad9",
	/** 小键盘减法 */
	NumpadSubtract: "NumpadSubtract",
	/** 小键盘4 */
	Numpad4: "Numpad4",
	/** 小键盘5 */
	Numpad5: "Numpad5",
	/** 小键盘6 */
	Numpad6: "Numpad6",
	/** 小键盘加法 */
	NumpadAdd: "NumpadAdd",
	/** 小键盘1 */
	Numpad1: "Numpad1",
	/** 小键盘2 */
	Numpad2: "Numpad2",
	/** 小键盘3 */
	Numpad3: "Numpad3",
	/** 小键盘0 */
	Numpad0: "Numpad0",
	/** 小键盘小数点 */
	NumpadDecimal: "NumpadDecimal",
	/** F11键 */
	F11: "F11",
	/** F12键 */
	F12: "F12",
	/** F13键 */
	F13: "F13",
	/** F14键 */
	F14: "F14",
	/** F15键 */
	F15: "F15",
	/** F16键 */
	F16: "F16",
	/** F17键 */
	F17: "F17",
	/** F18键 */
	F18: "F18",
	/** F19键 */
	F19: "F19",
	/** F20键 */
	F20: "F20",
	/** F21键 */
	F21: "F21",
	/** F22键 */
	F22: "F22",
	/** F23键 */
	F23: "F23",
	/** F24键 */
	F24: "F24",
	/** 小键盘逗号 */
	NumpadComma: "NumpadComma",
	/** 小键盘回车 */
	NumpadEnter: "NumpadEnter",
	/** 右控制键 */
	ControlRight: "ControlRight",
	/** 浏览器主页 */
	BrowserHome: "BrowserHome",
	/** 小键盘除法 */
	NumpadDivide: "NumpadDivide",
	/** 打印屏幕 */
	PrintScreen: "PrintScreen",
	/** 右Alt键 */
	AltRight: "AltRight",
	/** 数字锁定 */
	NumLock: "NumLock",
	/** Home键 */
	Home: "Home",
	/** 上箭头 */
	ArrowUp: "ArrowUp",
	/** Page Up键 */
	PageUp: "PageUp",
	/** 左箭头 */
	ArrowLeft: "ArrowLeft",
	/** 右箭头 */
	ArrowRight: "ArrowRight",
	/** End键 */
	End: "End",
	/** 下箭头 */
	ArrowDown: "ArrowDown",
	/** Page Down键 */
	PageDown: "PageDown",
	/** 插入键 */
	Insert: "Insert",
	/** 删除键 */
	Delete: "Delete"
};

const KeyCodeType = {
	/** 退格键 */
	Backspace: 8,
	/** Tab键 */
	Tab: 9,
	/** 回车键 */
	Enter: 13,
	/** Shift键 */
	Shift: 16,
	/** Ctrl键 */
	Ctrl: 17,
	/** Alt键 */
	Alt: 18,
	/** 暂停键 */
	Pause: 19,
	/** 大写锁定键 */
	Capslock: 20,
	/** ESC键 */
	Escape: 27,
	/** 空格键 */
	Space: 32,
	/** Page Up键 */
	PageUp: 33,
	/** Page Down键 */
	PageDown: 34,
	/** End键 */
	End: 35,
	/** Home键 */
	Home: 36,
	/** 左箭头 */
	Left: 37,
	/** 上箭头 */
	Up: 38,
	/** 右箭头 */
	Right: 39,
	/** 下箭头 */
	Down: 40,
	/** 插入键 */
	Insert: 45,
	/** 删除键 */
	Delete: 46,
	/** 数字键0 */
	Key0: 48,
	/** 数字键1 */
	Key1: 49,
	/** 数字键2 */
	Key2: 50,
	/** 数字键3 */
	Key3: 51,
	/** 数字键4 */
	Key4: 52,
	/** 数字键5 */
	Key5: 53,
	/** 数字键6 */
	Key6: 54,
	/** 数字键7 */
	Key7: 55,
	/** 数字键8 */
	Key8: 56,
	/** 数字键9 */
	Key9: 57,
	/** A键 */
	A: 65,
	/** B键 */
	B: 66,
	/** C键 */
	C: 67,
	/** D键 */
	D: 68,
	/** E键 */
	E: 69,
	/** F键 */
	F: 70,
	/** G键 */
	G: 71,
	/** H键 */
	H: 72,
	/** I键 */
	I: 73,
	/** J键 */
	J: 74,
	/** K键 */
	K: 75,
	/** L键 */
	L: 76,
	/** M键 */
	M: 77,
	/** N键 */
	N: 78,
	/** O键 */
	O: 79,
	/** P键 */
	P: 80,
	/** Q键 */
	Q: 81,
	/** R键 */
	R: 82,
	/** S键 */
	S: 83,
	/** T键 */
	T: 84,
	/** U键 */
	U: 85,
	/** V键 */
	V: 86,
	/** W键 */
	W: 87,
	/** X键 */
	X: 88,
	/** Y键 */
	Y: 89,
	/** Z键 */
	Z: 90,
	/** 选择键 */
	Select: 93,
	/** 小键盘0 */
	Numpad0: 96,
	/** 小键盘1 */
	Numpad1: 97,
	/** 小键盘2 */
	Numpad2: 98,
	/** 小键盘3 */
	Numpad3: 99,
	/** 小键盘4 */
	Numpad4: 100,
	/** 小键盘5 */
	Numpad5: 101,
	/** 小键盘6 */
	Numpad6: 102,
	/** 小键盘7 */
	Numpad7: 103,
	/** 小键盘8 */
	Numpad8: 104,
	/** 小键盘9 */
	Numpad9: 105,
	/** 乘法键 */
	Multiply: 106,
	/** 加法键 */
	Add: 107,
	/** 减法键 */
	Subtract: 109,
	/** 小数点键 */
	Decimal: 110,
	/** 除法键 */
	Divide: 111,
	/** F1键 */
	F1: 112,
	/** F2键 */
	F2: 113,
	/** F3键 */
	F3: 114,
	/** F4键 */
	F4: 115,
	/** F5键 */
	F5: 116,
	/** F6键 */
	F6: 117,
	/** F7键 */
	F7: 118,
	/** F8键 */
	F8: 119,
	/** F9键 */
	F9: 120,
	/** F10键 */
	F10: 121,
	/** F11键 */
	F11: 122,
	/** F12键 */
	F12: 123,
	/** 数字锁定键 */
	Numlock: 144,
	/** 滚动锁定键 */
	Scrolllock: 145,
	/** 分号键 */
	Semicolon: 186,
	/** 等号键 */
	EqualSign: 187,
	/** 逗号键 */
	Comma: 188,
	/** 减号键 */
	Dash: 189,
	/** 句点键 */
	Period: 190,
	/** 斜杠键 */
	ForwardSlash: 191,
	/** 反引号键 */
	GraveAccent: 192,
	/** 左方括号 */
	OpenBracket: 219,
	/** 反斜杠 */
	BackSlash: 220,
	/** 右方括号 */
	CloseBraket: 221,
	/** 单引号 */
	SingleQuote: 222,
};

/**
 * 旋转顺序类型。
 * @enum {string}
 * @readonly
 * @private
 */
const RotationOrdersType = {
	/**
	 * XYZ
	 * @private
	 */
	XYZ: 'XYZ',

	/**
	 * YZX
	 * @private
	 */
	YZX: 'YZX',

	/**
	 * ZXY
	 * @private
	 */
	ZXY: 'ZXY',

	/**
	 * XZY
	 * @private
	 */
	XZY: 'XZY',

	/**
	 * YXZ
	 * @private
	 */
	YXZ: 'YXZ',

	/**
	 * ZYX
	 * @private
	 */
	ZYX: 'ZYX'
};

/**
 * 坐标轴类型。
 * @enum {string}
 * @readonly
 * @public
 */
const AxisType = {
	/** X轴 */
	X: 'X',
	/** Y轴 */
	Y: 'Y',
	/** Z轴 */
	Z: 'Z',
};

/**
 * 投影类型。
 * @enum {string}
 * @readonly
 * @public
 */
const ProjectionType = {
	/** 正交投影 */
	Orthographic: 'Orthographic',
	/** 透视投影 */
	Perspective: 'Perspective',
};

/**
 * 视图模式。
 * @enum {string}
 * @readonly
 * @public
 */
const ViewMode = {
	/** 顶视图 */
	Top: 'Top',
	/** 底视图 */
	Bottom: 'Bottom',
	/** 左视图 */
	Left: 'Left',
	/** 右视图 */
	Right: 'Right',
	/** 前视图 */
	Front: 'Front',
	/** 后视图 */
	Back: 'Back',
};

/**
 * 视图模式类型。
 * @deprecated 2.7
 * @private
 */
const ViewModeType = ViewMode;

/**
 * 对齐类型。
 * @enum {string}
 * @readonly
 * @public
 */
const AlignType = {
	/**
	 * 居中对齐。
	 * @private
	 */
	Center: 'Center',

	/**
	 * 左对齐。
	 * @private
	 */
	Left: 'Left',

	/**
	 * 顶部对齐。
	 * @private
	 */
	Top: 'Top',

	/**
	 * 左上对齐。
	 * @private
	 */
	TopLeft: 'TopLeft',

	/**
	 * 右上对齐。
	 * @private
	 */
	TopRight: 'TopRight',

	/**
	 * 右对齐。
	 * @private
	 */
	Right: 'Right',

	/**
	 * 底部对齐。
	 * @private
	 */
	Bottom: 'Bottom',

	/**
	 * 左下对齐。
	 * @private
	 */
	BottomLeft: 'BottomLeft',

	/**
	 * 右下对齐。
	 * @private
	 */
	BottomRight: 'BottomRight',
}

/**
 * 面渲染类型.
 * @enum {string}
 * @readonly
 * @public
 */
const SideType = {
	/** 只绘制正面 */
	Front: 'Front',
	/** 只绘制背面 */
	Back: 'Back',
	/** 绘制正面和背面 */
	Double: 'Double',
};

/**
 * 渲染类型。
 * @enum {string}
 * @readonly
 * @public
 */
const RenderType = {
	/** 精灵 */
	Sprite: 'Sprite',
	/** 平面 */
	Plane: 'Plane',
};

/**
 * 轴心点模式。
 * @enum {string}
 * @readonly
 * @public
 */
const PivotMode = {
	/** 自动 */
	Auto: 'Auto',
	/** 位置 */
	Location: 'Location',
};

/**
 * 轴心点模式类型。
 * @deprecated 2.7
 * @private
 */
const PivotModeType = PivotMode;

/**
 * 拾取类型。
 * @enum {string}
 * @readonly
 */
const PickType = {
	/** 射线投射 */
	Raycaster: 'Raycaster',
	/** GPU */
	GPU: 'GPU',
	GPUFast: 'GPUFast',
};

/**
 * 拾取模式。
 * @enum {string}
 * @readonly
 */
const PickMode = {
	/** 网格 */
	Mesh: 'Mesh',
	/** 包围盒 */
	BoundingBox: 'BoundingBox',
};

/**
 * 雾的类型。
 * @enum {string}
 * @readonly
 * @private
 */
const FogType = {
	/**
	 * 线性雾
	 * </br>以线性方式增加雾在相机距离一定距离处的密度。
	 * @private
	 */
	Linear: 'Linear',

	/**
	 * 指数雾
	 * </br>使用指数平方雾。
	 * @private
	 */
	Exp2: 'Exp2',
};

/**
 * 动画播放状态
 * @enum {string}
 * @readonly
 * @public
 */
const PlayState = {
	/**
	 * 准备就绪。
	 */
	Ready: 'Ready',
	/**
	 * 正在播放。
	 */
	Playing: 'Playing',
	/**
	 * 已暂停。
	 */
	Paused: 'Paused',
	/**
	 * 已停止。
	 */
	Stopped: 'Stopped',
	/**
	 * 已完成。
	 */
	Finished: 'Finished',
};

/**
 * 播放状态类型。
 * @deprecated 2.7
 * @private
 */
const PlayStateType = PlayState;

/**
 * 动画方向类型。
 * @enum {string}
 * @readonly
 * @public
 */
const AnimationDirectionType = {
	/**
	 * 正常模式播放。
	 */
	Normal: 'Normal',
	/**
	 * 反向模式播放。
	 */
	Reverse: 'Reverse',
};

/**
 * 继承类型。
 * @enum {string}
 * @readonly
 * @public
 */
const InheritType = {
	/**
	 * 对象将正常处理动作(处理后传递给子对象)。
	 */
	Normal: 'Normal',

	/**
	 * 对象将处理动作但不传递给子对象。
	 */
	Break: 'Break',

	/**
	 * 对象将跳过动作但继续传递给子对象。
	 */
	Jump: 'Jump',

	/**
	 * 对象将中断动作且不传递给子对象。
	 */
	Stop: 'Stop',
}

const InheritActionType = InheritType;

/**
 * 包围盒显示方案
 * @enum {string}
 * @readonly
 * @public
 */
const BoxHelperModeType = {
	/** All 物体以及所有子物体都计算到一个包围盒中(会显示一个最大的包围盒) */
	All: 'All',
	/** Root 只显示物体自身的包围盒,忽略所有子物体 */
	Root: 'Root',
	/** Bodies 显示物体以及所有子物体自身的包围盒(会显示多个包围盒) */
	Bodies: 'Bodies',
}

/**
 * 混合类型。
 * @enum {string}
 * @readonly
 * @public
 */
const BlendingType = {
	/**
	 * 禁用混合。
	 */
	No: 'NoBlending',

	/**
	 * 正常混合。
	 * 颜色(RGB) = (源颜色 * 1) + (目标颜色 * (1 - 源Alpha))
	 * 颜色(A) = (源Alpha * 1) + (目标Alpha * (1 - 源Alpha))
	 */
	Normal: 'NormalBlending',

	/**
	 * 加法混合。
	 * 颜色(RGBA) = (源颜色 * 1) + (目标颜色 * 1)。
	 */
	Additive: 'AdditiveBlending',

	/**
	 * 减法混合。
	 * 颜色(RGB) = 目标颜色 * (1 - 源Alpha)
	 * 颜色(A) = 目标Alpha * 1
	 */
	Subtractive: 'SubtractiveBlending',

	/**
	 * 乘法混合。
	 * 颜色(RGB) = 目标颜色 * 源颜色
	 * 颜色(A) = 目标Alpha * 源Alpha
	 */
	Multiply: 'MultiplyBlending',
};

/**
 * UV模式。
 * @enum {string}
 * @readonly
 * @public
 */
const UVMode = {
	/**
	 * 以平铺方式重复填充UV。
	 */
	Tile: 'Tile',

	/**
	 * 以拉伸图像模式填充UV。
	 */
	Stretch: 'Stretch',

	/**
	 * 自定义UV。
	 */
	Custom: 'Custom',
};

/**
 * UV模式类型。
 * @deprecated 2.7
 * @private
 */
const UVModeType = UVMode;

/**
 * 图像槽类型。
 * @enum {string}
 * @readonly
 * @public
 */
const ImageSlotType = {
	/** 贴图 */
	Map: 'Map',
	/** 环境贴图 */
	EnvMap: 'EnvMap',
	/** 透明度贴图 */
	AlphaMap: 'AlphaMap',
	/** 自发光贴图 */
	EmissiveMap: 'EmissiveMap',
	/** 法线贴图 */
	NormalMap: 'NormalMap',
	/** 颜色映射 */
	ColorMapping: 'ColorMapping',
	/** 环境光遮蔽贴图 */
	AOMap: 'AOMap',
};

/**
 * 纹理元素编码类型。
 * @enum {string}
 * @readonly
 * @public
 */
const TexelEncodingType = {
	/** 线性编码 */
	LINEAR: "LINEAR",
	/** sRGB编码 */
	SRGB: "SRGB",
	/** RGBE编码 */
	RGBE: "RGBE",
	/** RGBM7编码 */
	RGBM7: "RGBM7",
	/** RGBM16编码 */
	RGBM16: "RGBM16",
	/** RGBD编码 */
	RGBD: "RGBD",
	/** 伽马编码 */
	GAMMA: "GAMMA"
}

/**
 * 图像颜色格式类型。
 * @enum {string}
 * @readonly
 * @public
 */
const ImageColorFormat = {
	/**
	 * 红、绿、蓝(RGB)颜色格式。
	 */
	RGB: 'RGB',

	/**
	 * 透明度、红、绿、蓝(RGBA)颜色格式。
	 */
	RGBA: 'RGBA',

	/** BC7_M6_OPAQUE_ONLY压缩格式 */
	BC7_M6_OPAQUE_ONLY: 'BC7_M6_OPAQUE_ONLY',
};

/**
 * 图像压缩类型。
 * @enum {string}
 * @readonly
 * @private
 */
const ImageCompressionType = {
	/**
	 * ETC1
	 * @private
	 */
	ETC1: 'ETC1',

	/**
	 * ETC2
	 * @private
	 */
	ETC2: 'ETC2',

	/**
	 * BC1
	 * @private
	 */
	BC1: 'BC1',

	/**
	 * BC3
	 * @private
	 */
	BC3: 'BC3',

	/**
	 * BC4
	 * @private
	 */
	BC4: 'BC4',

	/**
	 * BC5
	 * @private
	 */
	BC5: 'BC5',

	/**
	 * BC7_M6_OPAQUE_ONLY
	 * @private
	 */
	BC7_M6_OPAQUE_ONLY: 'BC7_M6_OPAQUE_ONLY',

	/**
	 * BC7_M5
	 * @private
	 */
	BC7_M5: 'BC7_M5',

	/**
	 * PVRTC1_4_RGB
	 * @private
	 */
	PVRTC1_4_RGB: 'PVRTC1_4_RGB',

	/**
	 * PVRTC1_4_RGBA
	 * @private
	 */
	PVRTC1_4_RGBA: 'PVRTC1_4_RGBA',

	/**
	 * ASTC_4x4
	 * @private
	 */
	ASTC_4x4: 'ASTC_4x4',

	/**
	 * ATC_RGB
	 * @private
	 */
	ATC_RGB: 'ATC_RGB',

	/**
	 * ATC_RGBA_INTERPOLATED_ALPHA
	 * @private
	 */
	ATC_RGBA_INTERPOLATED_ALPHA: 'ATC_RGBA_INTERPOLATED_ALPHA',

	/**
	 * RGBA32
	 * @private
	 */
	RGBA32: 'RGBA32',

	/**
	 * RGB565
	 * @private
	 */
	RGB565: 'RGB565',

	/**
	 * BGR565
	 * @private
	 */
	BGR565: 'BGR565',

	/**
	 * RGBA4444
	 * @private
	 */
	RGBA4444: 'RGBA4444',
};

/**
 * 图像填充类型。
 * @enum {string}
 * @readonly
 * @public
 */
const ImageWrapType = {
	/**
	 * 图像以重复模式填充。
	 */
	Repeat: 'Repeat',

	/**
	 * 图像使用边缘重复。
	 */
	ClampToEdge: 'ClampToEdge',

	/**
	 * 图像以重复/镜像一一对应模式填充。
	 */
	MirroredRepeat: 'MirroredRepeat',
};

/**
 * 图像映射类型。
 * @enum {string}
 * @readonly
 * @public
 */
const ImageMappingType = {
	/**
	 * 图像纹理正常映射。
	 */
	UV: 'UV',

	/**
	 * 立方体反射
	 * @private
	 */
	CubeReflection: 'CubeReflection',

	/**
	 * 立方体折射
	 * @private
	 */
	CubeRefraction: 'CubeRefraction',

	/**
	 * 使用单一环境贴图显示图像,如天空盒等。
	 */
	EquirectangularReflection: 'EquirectangularReflection',

	/**
	 * 等矩形折射
	 * @private
	 */
	EquirectangularRefraction: 'EquirectangularRefraction',
};

/**
 * 图像过滤类型。
 * @enum {string}
 * @readonly
 * @public
 */
const ImageFilterType = {
	/**
	 * 使用最接近指定纹理坐标的纹理元素的值。
	 */
	NearestFilter: 'NearestFilter',

	/**
	 * 选择与被纹理化像素大小最接近的mipmap,并使用NearestFilter。
	 */
	NearestMipmapNearestFilter: 'NearestMipmapNearestFilter',

	/**
	 * 选择与被纹理化像素大小最接近的两个mipmap,并使用NearestFilter。
	 */
	NearestMipmapLinearFilter: 'NearestMipmapLinearFilter',

	/**
	 * 使用最接近指定纹理坐标的四个纹理元素的加权平均值。
	 */
	LinearFilter: 'LinearFilter',

	/**
	 * 选择与被纹理化像素大小最接近的mipmap,并使用LinearFilter。
	 */
	LinearMipmapNearestFilter: 'LinearMipmapNearestFilter',

	/**
	 * 选择与被纹理化像素大小最接近的两个mipmap,并使用LinearFilter。
	 */
	LinearMipmapLinearFilter: 'LinearMipmapLinearFilter'
};

/**
 * 阴影质量类型。
 * @enum {number}
 * @readonly
 * @public
 */
const ShadowQualityType = {
	/**
	 * 512x512 阴影纹理大小。
	 */
	Low: 512,

	/**
	 * 1024x1024 阴影纹理大小。
	 */
	Medium: 1024,

	/**
	 * 2048x2048 阴影纹理大小。
	 */
	High: 2048,

	/**
	 * 4096x4096 阴影纹理大小。
	 */
	Ultra: 4096
};

/**
 * 光球模式类型。
 * @enum {string}
 * @readonly
 * @private
 */
const LightSphereModeType = {
	/**
	 * 在运行时每帧获取绑定对象的包围盒。
	 * @private
	 */
	Dynamic: 'Dynamic',

	/**
	 * 在绑定时(仅一次)获取绑定对象的包围盒。
	 * @private
	 */
	Static: 'Static'
};

/**
 * 动作队列类型。
 * @enum {string}
 * @readonly
 * @public
 */
const ActionQueueType = {
	/**
	 * 进入对象层级的动作。
	 */
	EnterLevel: 'EnterLevel',
};

/**
 * 碰撞体类型。
 * @enum {string}
 * @readonly
 * @public
 */
const ColliderType = {
	/**
	 * 使用包围盒检查碰撞。
	 */
	Box: 'Box',

	/**
	 * 使用包围球检查碰撞。
	 */
	Sphere: 'Sphere',
};

/**
 * 资源类型。
 * @enum {string}
 * @readonly
 * @private
 */
const ResourceType = {
	/**
	 * 自动检测资源类型。
	 * @private
	 */
	AutoDetect: 'AutoDetect',

	/**
	 * 非加密资源类型。
	 * @private
	 */
	NonEncrypted: 'NonEncrypted',

	/**
	 * 加密资源类型。
	 * @private
	 */
	Encrypted: 'Encrypted',
};

/**
 * 场景资源类型。
 * @enum {string}
 * @readonly
 * @private
 */
const SceneResourceType = {
	/**
	 * 场景资源是树形格式的对象。
	 * @private
	 */
	Object: 'Object',

	/**
	 * 场景资源是布局格式的对象。
	 * @private
	 */
	Layout: 'Layout',
};

/**
 * 空资源类型。
 * @enum {string}
 * @readonly
 * @private
 */
const Empty = {
	/**
	 * 空图像纹理资源
	 * @private
	 */
	ImageTexture: 'EmptyImageTexture',

	/**
	 * 空纹理资源
	 * @private
	 */
	Texture: 'EmptyTexture',
};

/**
 * 字体粗细。
 * @enum {string}
 * @readonly
 */
const FontWeight = {
	/**
	 * 正常。
	 * @private
	 */
	Normal: 'Normal',

	/**
	 * 粗体。
	 * @private
	 */
	Bold: 'Bold',

	/**
	 * 更粗。
	 * @private
	 */
	Bolder: 'Bolder',

	/**
	 * 更细。
	 * @private
	 */
	Lighter: 'Lighter',
}

/**
 * 关系方向类型。
 * @enum {string}
 * @readonly
 * @public
 */
const RelationshipDirection = {
	/** 出 源 -> 目标 */
	Out: 'Out',
	/** 入 目标 -> 源 */
	In: "In",
	/** 双向 */
	InOut: 'InOut',
	/** 无 */
	None: 'None',
}

/**
 * 过滤结果类型。
 * @enum {string}
 * @readonly
 */
const FilterResultType = {
	Pass: 'Pass',
	Fail: 'Fail',
	Ignore: 'Ignore'
};

/**
 * 动作类型。
 * @enum {string}
 * @readonly
 * @private
 */
const ActionType = {
	/**
	 * 创建对象。
	 * @private
	 */
	CreateObject: 'CreateObject',

	/**
	 * 相机飞行到。
	 * @private
	 */
	CameraFlyTo: 'CameraFlyTo',

	/**
	 * 对象设置颜色。
	 * @private
	 */
	ObjectSetColor: 'ObjectSetColor',

	/**
	 * 对象设置属性。
	 * @private
	 */
	ObjectSetProperty: 'ObjectSetProperty',
}

/**
 * 图像编码类型。
 * @enum {string}
 * @readonly
 * @public
 */
const ImageEncodingType = {
	/** 线性编码 */
	'LINEAR': 'LINEAR',
	/** sRGB编码 */
	'SRGB': 'SRGB',
	/** RGBE编码 */
	'RGBE': 'RGBE',
	/** RGBM7编码 */
	'RGBM7': 'RGBM7',
	/** RGBM16编码 */
	'RGBM16': 'RGBM16',
	/** RGBD编码 */
	'RGBD': 'RGBD',
	/** 伽玛编码 */
	'GAMMA': 'GAMMA'
};

/**
 * 挤压形状的可见方向
 * @enum {string}
 * @readonly
 * @public
 */
const ExtrudeShapeDirection = {
	/** 前 */
	Top: 'Top',
	/** 后 */
	Bottom: 'Bottom',
	/** 两者 */
	Both: 'Both',
	/** 无 */
	None: 'None',

};

/**
 * 变换类型
 * @enum {number}
 * @readonly
 * @public
 */
const Transform = {
	/** 旋转变换 */
	Rotation: 1 << 0,
	/** 缩放变换 */
	Scale: 1 << 1
};


/**
 * 缩放模式
 * @enum {string}
 * @readonly
 * @public
 */
const ScaleMode = {
	/**
	 * 宽高乘系数作为缩放
	 */
	ScaleFactor: 'ScaleFactor',
	/**
	 * 宽高比乘系数作为缩放
	 */
	ScaleRatio: 'ScaleRatio',
	/**
	 * 固定缩放 (宽大于高,固定宽,修改高保持宽高比。反之固定高,修改宽保持宽高比)
	 */
	ScaleFixed: 'ScaleFixed'
}

const StyleAttributeKeys = {
	SpecularFactor: 'SpecularFactor',
	FresnelPower: 'FresnelPower',
	FresnelInverse: 'FresnelInverse',
	ColorMappingIntensity: 'ColorMappingIntensity',
	AOMapIntensity: 'AOMapIntensity',
	EnvMapIntensity: 'EnvMapIntensity',
	Lights: 'Lights',
	VerticalEmissive: 'VerticalEmissive',
	AlphaTest: 'AlphaTest',
	LightingGroup: 'LightingGroup'
}

/**
 * 精确模式
 * @enum {string}
 * @readonly
 * @public
 */
const AccuracyMode = {
	/**
	 * 基础模式
	 */
	Basic: 'Basic',
	/**
	 * 精确模式
	 */
	Accurate: 'Accurate'
}

export {
	Empty,
	CameraMode,
	NodeUserDataType,
	EventType,
	LerpType,
	LoopType,
	MouseButtonType,
	SpaceType,
	CodeType,
	KeyCodeType,
	RotationOrdersType,
	AxisType,
	ProjectionType,
	ViewMode,
	ViewModeType,
	AlignType,
	SideType,
	RenderType,
	PivotMode,
	PivotModeType,
	PickType,
	PickMode,
	FogType,
	PlayState,
	PlayStateType,
	AnimationDirectionType,
	InheritType,
	InheritActionType,
	BoxHelperModeType,
	BlendingType,
	UVMode,
	UVModeType,
	ImageSlotType,
	TexelEncodingType,
	ImageColorFormat,
	ImageCompressionType,
	ImageWrapType,
	ImageMappingType,
	ImageFilterType,
	ShadowQualityType,
	LightSphereModeType,
	ActionQueueType,
	ColliderType,
	ResourceType,
	SceneResourceType,
	FontWeight,
	RelationshipDirection,
	FilterResultType,
	ActionType,
	ImageEncodingType,
	ExtrudeShapeDirection,
	Transform,
	ScaleMode,
	StyleAttributeKeys,
	AccuracyMode
}