2025-12-08 21:23:37 +08:00
|
|
|
import { Component, ECSComponent, Serializable, Serialize, Property } from '@esengine/esengine';
|
2025-11-23 14:49:37 +08:00
|
|
|
|
2025-12-01 22:28:51 +08:00
|
|
|
export enum ECameraProjection {
|
2025-11-23 14:49:37 +08:00
|
|
|
Perspective = 'perspective',
|
|
|
|
|
Orthographic = 'orthographic'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ECSComponent('Camera')
|
|
|
|
|
@Serializable({ version: 1, typeId: 'Camera' })
|
|
|
|
|
export class CameraComponent extends Component {
|
|
|
|
|
@Serialize()
|
|
|
|
|
@Property({
|
|
|
|
|
type: 'enum',
|
|
|
|
|
label: 'Projection',
|
|
|
|
|
options: [
|
2025-12-01 22:28:51 +08:00
|
|
|
{ label: 'Orthographic', value: ECameraProjection.Orthographic },
|
|
|
|
|
{ label: 'Perspective', value: ECameraProjection.Perspective }
|
2025-11-23 14:49:37 +08:00
|
|
|
]
|
|
|
|
|
})
|
2025-12-01 22:28:51 +08:00
|
|
|
public projection: ECameraProjection = ECameraProjection.Orthographic;
|
2025-11-23 14:49:37 +08:00
|
|
|
|
2025-12-01 22:28:51 +08:00
|
|
|
/** 透视模式下的视野角度,范围 [1, 179] 度 */
|
2025-11-23 14:49:37 +08:00
|
|
|
@Serialize()
|
|
|
|
|
@Property({ type: 'number', label: 'Field of View', min: 1, max: 179 })
|
|
|
|
|
public fieldOfView: number = 60;
|
|
|
|
|
|
2025-12-01 22:28:51 +08:00
|
|
|
/** 正交模式下的可见区域半高度(世界单位) */
|
2025-11-23 14:49:37 +08:00
|
|
|
@Serialize()
|
|
|
|
|
@Property({ type: 'number', label: 'Orthographic Size', min: 0.1, step: 0.1 })
|
|
|
|
|
public orthographicSize: number = 5;
|
|
|
|
|
|
|
|
|
|
@Serialize()
|
|
|
|
|
@Property({ type: 'number', label: 'Near Clip', min: 0.01, step: 0.1 })
|
|
|
|
|
public nearClipPlane: number = 0.1;
|
|
|
|
|
|
|
|
|
|
@Serialize()
|
|
|
|
|
@Property({ type: 'number', label: 'Far Clip', min: 1, step: 10 })
|
|
|
|
|
public farClipPlane: number = 1000;
|
|
|
|
|
|
2025-12-01 22:28:51 +08:00
|
|
|
/** 视口归一化坐标,范围 [0, 1] */
|
2025-11-23 14:49:37 +08:00
|
|
|
@Serialize()
|
|
|
|
|
@Property({ type: 'number', label: 'Viewport X', min: 0, max: 1, step: 0.01 })
|
|
|
|
|
public viewportX: number = 0;
|
|
|
|
|
|
|
|
|
|
@Serialize()
|
|
|
|
|
@Property({ type: 'number', label: 'Viewport Y', min: 0, max: 1, step: 0.01 })
|
|
|
|
|
public viewportY: number = 0;
|
|
|
|
|
|
|
|
|
|
@Serialize()
|
|
|
|
|
@Property({ type: 'number', label: 'Viewport Width', min: 0, max: 1, step: 0.01 })
|
|
|
|
|
public viewportWidth: number = 1;
|
|
|
|
|
|
|
|
|
|
@Serialize()
|
|
|
|
|
@Property({ type: 'number', label: 'Viewport Height', min: 0, max: 1, step: 0.01 })
|
|
|
|
|
public viewportHeight: number = 1;
|
|
|
|
|
|
2025-12-01 22:28:51 +08:00
|
|
|
/** 渲染优先级,值越大越后渲染(覆盖在上层) */
|
2025-11-23 14:49:37 +08:00
|
|
|
@Serialize()
|
|
|
|
|
@Property({ type: 'integer', label: 'Depth' })
|
|
|
|
|
public depth: number = 0;
|
|
|
|
|
|
|
|
|
|
@Serialize()
|
|
|
|
|
@Property({ type: 'color', label: 'Background Color' })
|
|
|
|
|
public backgroundColor: string = '#000000';
|
|
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
|
super();
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-12-01 22:28:51 +08:00
|
|
|
|
|
|
|
|
/** @deprecated 使用 ECameraProjection 代替 */
|
|
|
|
|
export const CameraProjection = ECameraProjection;
|