/**
* Вьюхи теней поверх чистой математики shadowSim: текстура блоба
* (ступенчатый эллипс — мягкий край без мыла, пиксель-стиль) и раскладка
* спрайта по размещению из blobPlacement. Тонко: состояние считает сцена.
*/
import { Graphics, Sprite, Texture } from 'pixi.js';
import { type BlobPlacement } from './shadowSim';
import { SHADOW_COLOR } from './shadowSim';
import { type Renderer } from './Renderer';
/** Полуось текстуры блоба, px виртуального разрешения (масштабируется спрайтом). */
export const SHADOW_TEX_PX = 32;
/** Текстура блоба-тени: три ступени прозрачности от края к центру. */
export function makeShadowTexture(renderer: Renderer): Texture {
const g = new Graphics();
g.ellipse(0, 0, SHADOW_TEX_PX, SHADOW_TEX_PX).fill({ color: SHADOW_COLOR, alpha: 0.34 });
g.ellipse(0, 0, SHADOW_TEX_PX * 0.72, SHADOW_TEX_PX * 0.72).fill({ color: SHADOW_COLOR, alpha: 0.36 });
g.ellipse(0, 0, SHADOW_TEX_PX * 0.45, SHADOW_TEX_PX * 0.45).fill({ color: SHADOW_COLOR, alpha: 0.3 });
const tex = renderer.app.renderer.generateTexture({ target: g, resolution: 1 });
g.destroy();
return tex;
}
/**
* Положить спрайт-блоб (текстура makeShadowTexture) по размещению blobPlacement:
* base — точка базы объекта (ноги/основание) в координатах родителя.
*/
export function applyBlobShadow(
sprite: Sprite,
base: { x: number; y: number },
blob: BlobPlacement
): void {
sprite.position.set(base.x + blob.x, base.y + blob.y);
sprite.rotation = blob.rotation;
sprite.scale.set(blob.scaleX / SHADOW_TEX_PX, blob.scaleY / SHADOW_TEX_PX);
sprite.alpha = blob.alpha;
}