import type { LeviarObject } from './LeviarObject.js'; import type { LoadedAssets } from './types.js'; export declare class Renderer { private ogl; private gl; private camera; private scene; private quadGeo; private colorProgram; private ellipseProgram; private textureProgram; private instancedProgram; private shadowProgram; private alphaOutlineProgram; private alphaShadowProgram; private gradientProgram; private placeholderProgram; private colorMesh; private ellipseMesh; private textureMesh; private placeholderMesh; private shadowMesh; private alphaOutlineMesh; private alphaShadowMesh; private gradientMesh; private _modelMat; private _viewMat; private _tmpVec; private _activeObj; private _activeRenderW; private _activeRenderH; private _scissorTmpMat; private _scissorMvpMat; private _stencilDepth; private meshCache; private textCache; private textContentCache; private textContentRefCount; private _noCameraText; removeTextEntry(id: string): void; private assetTextureCache; private videoTextureCache; private readonly _batchMaxSize; private _batchMat0; private _batchMat1; private _batchMat2; private _batchMat3; private _batchOpacityFlip; private _batchUVParams; private _batchCount; private _batchTexture; private _batchBlendMode; private _currentBlendMode; private _instancedGeo; private _instancedMesh; private _batchBorderRadius; /** 정렬 순서가 캐시된 객체 배열 (카메라 거리 기준 내림차순) */ private _sortedObjects; /** true이면 다음 프레임에 재정렬 */ private _sortDirty; /** 마지막으로 정렬에 사용된 카메라 회전값 */ private _lastCamRotX; private _lastCamRotY; private _lastCamRotZ; /** 마지막 정렬 시 객체 수 */ private _lastObjCount; private _width; private _height; private _lastFocalLength; private _debugCamZ; private _canvas; private _debugMode; debugHoveredIds: Set; debugClickedIds: Map; debugRipples: Array<{ x: number; y: number; time: number; }>; private _debugOverlayCanvas; private _debugOverlayCtx; private _fpsPrevTime; private _fpsFrameCount; private _fpsValue; get debugMode(): boolean; set debugMode(value: boolean); constructor(canvas: HTMLCanvasElement); get width(): number; get height(): number; /** * Z-Sort 캐시를 무효화합니다. * 객체의 position.z 또는 zIndex가 변경될 때 World에서 호출합니다. */ markSortDirty(): void; setSize(w: number, h: number): void; private _initPrograms; private _setupDebugOverlay; private _teardownDebugOverlay; private _renderDebugOverlay; private getFlatAncestor; private compareHierarchical; render(objects: Set, assets?: LoadedAssets, timestamp?: number, activeCamera?: LeviarObject | null): void; /** * obj 기준으로 조상 중 overflow:'hidden'인 것들을 수집합니다. */ private _collectOverflowAncestors; /** * overflow:'hidden' 조상들을 스텐실 버퍼에 그려 클리핑 마스크를 설정합니다. * 호출 후에는 스텐실 == depth 인 픽셀만 통과합니다. * 반환값: 적용된 스텐실 depth 수 (0이면 조상 없음) */ private _applyStencilClip; /** * 스텐실 버퍼를 초기화하고 스텐실 테스트를 비활성화합니다. */ private _clearStencilClip; /** * 스텐실 쓰기 전용으로 obj의 사각형 형태를 colorMesh로 렌더합니다. * 현재 _activeObj 상태를 임시 교체하여 _makeModelMatrix를 활용합니다. */ private _drawStencilShape; private _drawObject; /** * 디버그 모드에서 각 오브젝트의 실제 렌더 경계와 margin을 시각화합니다. * 기존 style을 일절 덮어쓰지 않고, 프레임 맨 마지막에 별도 레이어로 그립니다. * * - outline: 기본(#00ff88, 초록), hover(#ffee00, 노랑), depth가 깊을수록 파랑 계열로 변화 * - margin: 반투명 주황색(#ff9800, 30%) * - click: 클릭 직후 0.5초 동안 반투명 오렌지 fill로 fade-out */ private _drawDebugOverlay; /** * 객체의 고유 TRS(Translation, Rotation, Scale, Pivot)만으로 Model Matrix를 생성합니다. * 카메라 정보는 View Matrix에서 처리됩니다. */ private _makeModelMatrix; /** * View Matrix를 직접 계산하여 모든 Program에 업로드합니다. * OGL camera.viewMatrix에 의존하지 않고 _viewMat에 직접 구성합니다. * * 좌표계: obj.z > cam.z = 카메라 앞 (구 시스템과 동일) * 모델 z = -obj.z 이므로, 카메라 역변환 z = +camZ */ private _buildViewMatrix; /** ogl 카메라의 projectionMatrix를 Float32Array로 반환 */ private _projMatrix; private _setBlendMode; private _flushBatch; private _drawColorMesh; private _drawTextureMesh; private _drawShadow; /** * 이미지 알파채널 경계를 기준으로 그림자를 렌더링합니다. * 이미지 불투명 영역 위에서는 그림자가 hidden 처리됩니다. */ private _drawAlphaShadow; /** * 이미지 알파채널 경계를 기준으로 border + outline을 렌더링합니다. * 이미지 불투명 픽셀은 discard하여 texture 패스와 중복되지 않습니다. */ private _drawAlphaImageBorders; private _drawRectBorders; private _drawRectangle; private _drawEllipse; private _drawText; private _renderTextToCanvas; private _drawAsset; private _drawVideo; private _drawSprite; private _drawParticle; /** * WebGL 셰이더로 gradient를 직접 렌더링합니다. * Canvas 텍스처 생성·캐싱 없이 uniform만 설정하여 즉시 draw합니다. */ private _drawGradient; /** * style.background = 'url(에셋키)' 에 대응하는 이미지 배경 렌더링. * backgroundSize에 따라 UV를 계산하여 _drawTextureMesh로 전달합니다. * * - 'cover' : 가로·세로 중 큰 쪽에 맞춰 채움 (중앙 크롭) * - 'contain': 가로·세로 중 작은 쪽에 맞춰 맞춤 (중앙 레터박스) * - 'auto' : 컨테이너에 그대로 늘림 (기본값) */ private _drawRectBackground; private _drawPlaceholder; private _getOrCreateAssetTexture; /** * 렌더러의 모든 리소스를 해제합니다. * WebGL 컨텍스트, 텍스처 캐시, 디버그 오버레이 등을 정리합니다. * @internal World.destroy()에서 호출됩니다. */ destroy(): void; }