import { Mat4 } from 'ogl'; import type Matter from 'matter-js'; import type { Animation } from './Animation.js'; import { FadeTransition } from './objects/FadeTransition.js'; import { EventEmitter } from './EventEmitter.js'; import type { Attribute, AnimateTarget, EasingType, LeviarObjectOptions, LeviarObjectEvents, Style, Transform } from './types.js'; export declare abstract class LeviarObject = Record, D extends Record = Record> extends EventEmitter { readonly attribute: Attribute & T; readonly dataset: D; readonly style: Style; readonly transform: Transform; /** matter-js 바디 참조 (PhysicsEngine에서 설정) */ __body: Matter.Body | null; /** * attribute Proxy의 위임 키에 대한 값을 가져옵니다. (하위 클래스에서 재정의) */ protected _getDelegatedAttribute(key: string): any; /** * attribute Proxy의 위임 키에 대한 값을 설정합니다. (하위 클래스에서 재정의) */ protected _setDelegatedAttribute(key: string, value: any): void; /** * Renderer가 매 프레임 기록하는 실제 렌더 크기 (월드 좌표 기준, scale 포함, perspectiveScale 제외) * style.width/height 미지정 시 naturalWidth 등의 값이 들어옵니다. */ __renderedSize: { w: number; h: number; } | null; /** Offscreen Canvas · 텍스처 재생성이 필요함을 나타내는 dirty flag */ __dirtyTexture: boolean; /** 물리 바디 크기 재확인이 필요함을 나타내는 dirty flag */ __dirtyPhysics: boolean; /** * 마지막 텍스처 변경 이후 경과한 프레임 수. * 새 변경이 오면 0으로 리셋, 임계값 도달 시 텍스처를 업데이트합니다. (디바운스) */ __textureIdleCount: number; /** * 마지막 물리 변경 이후 경과한 프레임 수. * 새 변경이 오면 0으로 리셋, 임계값 도달 시 물리 실제 크기를 재확인합니다. (디바운스) */ __physicsIdleCount: number; /** * 마지막 텍스처 업데이트 이후 경과한 프레임 수. * 렌더 후 0으로 리셋, 임계값 도달 시 강제 업데이트합니다. (스로틀) */ __textureThrottleCount: number; /** * 마지막 물리 업데이트 이후 경과한 프레임 수. * 업데이트 후 0으로 리셋, 임계값 도달 시 강제 재확인합니다. (스로틀) */ __physicsThrottleCount: number; /** * FadeTransition에 의해 제어되는 렌더링용 내부 투명도. */ __fadeOpacity: number; /** 부모 객체 (계층 구조) */ parent: LeviarObject | null; /** 자식 객체 목록 */ children: Set; /** 로컬 변환 매트릭스 (자신의 position, rotation, scale) */ private localMatrix; /** 부모의 반영이 끝난 최종 월드 매트릭스 */ __worldMatrix: Mat4; /** 계층 구조에 의해 누적 계산된 최종 투명도 */ __worldOpacity: number; /** 계층 구조에 의해 누적 계산된 최종 display 속성 */ __worldDisplay: string; constructor(type: string, options?: LeviarObjectOptions, delegatedKeys?: string[]); /** * 계층 구조(Hierarchy)의 자식으로 다른 LeviarObject를 추가합니다. * 부모 객체의 3D 매트릭스 변환을 완전히 상속받게 됩니다. */ addChild(child: LeviarObject): this; /** * 자식 객체를 삭제합니다. */ removeChild(child: LeviarObject): this; /** * 현재 부모 객체로부터 독립합니다. */ removeFromParent(): this; /** * 객체를 월드에서 제거합니다. * @param options 제거 옵션. child: true이면 자식 객체도 함께 삭제, follower: true이면 자신을 따라다니는 객체도 함께 삭제 (기본값: 모두 false) */ remove(options?: { follower?: boolean; child?: boolean; }): this; /** * 객체의 로컬 트랜스폼 및 피벗을 이용해 월드 매트릭스를 재귀적으로 계산 및 갱신합니다. * World.ts 의 렌더 루프 전에 루트 노드로부터 호출되어야 합니다. */ __updateMatrixWorld(force?: boolean): void; /** * 객체가 주어진 클래스들을 모두 포함하고 있는지 확인합니다. (공백으로 구분) * 전달된 모든 클래스가 존재할 때만 true를 반환합니다. */ hasClass(classNames: string): boolean; /** * 객체에 하나 이상의 클래스를 추가합니다. (공백으로 구분) * 이미 존재하는 클래스는 무시됩니다. */ addClass(classNames: string): this; /** * 객체에서 하나 이상의 클래스를 제거합니다. (공백으로 구분) * 존재하지 않는 클래스는 무시됩니다. */ removeClass(classNames: string): this; /** * 물리 바디에 힘을 적용합니다. attribute.physics가 설정된 경우에만 동작합니다. */ applyForce(force: { x?: number; y?: number; }): this; /** * 물리 바디의 속도를 설정합니다. attribute.physics가 설정된 경우에만 동작합니다. */ setVelocity(velocity: { x?: number; y?: number; }): this; /** * 물리 바디의 각속도를 설정합니다. attribute.physics가 설정된 경우에만 동작합니다. * @param angularVelocity 각속도 (라디안/초) */ setAngularVelocity(angularVelocity: number): this; /** * 물리 바디에 토크(회전력)를 적용합니다. attribute.physics가 설정된 경우에만 동작합니다. * Matter.js는 매 스텝마다 torque를 소비하므로, 매 프레임 호출하면 지속적인 회전력이 됩니다. * @param torque 토크 값 (양수: 시계 방향, 음수: 반시계 방향) */ applyTorque(torque: number): this; private _followTarget?; private _followOffset?; private _followListener?; private _followers; /** * 자신이 따라다니는 객체를 반환합니다. 없다면 undefined를 반환합니다. */ get following(): LeviarObject | undefined; /** * 현재 자신을 따라다니거나 들러붙은 모든 객체를 배열로 반환합니다. */ get followers(): LeviarObject[]; /** * 다른 LeviarObject를 일정 거리를 두고 따라다닙니다. * 기존에 따라다니던 객체가 있다면 새로운 객체로 덮어씁니다. */ follow(target: LeviarObject, offset?: { x?: number; y?: number; z?: number; }): this; /** * 대상을 따라다니는 동작을 중지합니다. */ unfollow(): this; /** * 자신을 따라다니는 특정 오브젝트의 추적을 끊어냅니다. (unfollow 시킴) * @param follower 제거할 추적 객체 */ kick(follower: LeviarObject): this; /** * 객체의 속성을 애니메이션으로 부드럽게 변경합니다. * @param target 변경할 속성과 목표값 (숫자 or 복합 대입 연산자 문자열) * @param duration 지속 시간 (ms) * @param easing 이징 함수 이름 (기본값: 'linear') */ animate(target: AnimateTarget, duration: number, easing?: EasingType): Animation; private _fadeTransition?; /** * 객체를 부드럽게 나타나게 합니다 (display: block 이후 투명도 0 -> 1). */ fadeIn(durationMs: number, easing?: EasingType): FadeTransition; /** * 객체를 부드럽게 사라지게 합니다 (투명도 1 -> 0 이후 display: none). */ fadeOut(durationMs: number, easing?: EasingType): FadeTransition; }