Stage 3: Binary Space Partition
Отрисовка внутреннего сектора
Вернемся к проблеме с отрисовкой внутреннего сектора. Теперь вместо сортировки стен по расстоянию от камеры мы используем BSP-дерево и получаем гарантированный порядок отрисовки стен от ближних стен к дальним.
2.5D Renderer
2D Renderer
Управление камерой WASD
Немного кода
Может показаться, что на каждом кадре строится дерево, на самом деле используется кэш. Callback функция обрабатывает листы BSP-дерева, те те самые выпуклые многоуольники. Сегменты из листа BSP-дерева проецируются и передаются функции отрисовки непрозрачной стены:
function render25d(
ctx: CanvasRenderingContext2D,
settings: Settings,
) {
const camera = settings.camera;
const allSegments = settings.level.linedefs;
const bspTree = buildBSPTree(allSegments);
const solidWallRanges = createSolidWallRanges(camera);
traverseBSPTree(bspTree, camera, (bspNode: BSPLeaf) => {
for (const seg of bspNode.segs) {
const sector = seg.frontSector!;
const projection = projectSeg(camera, sector, seg);
if (!projection) {
continue;
}
drawSolidWall(ctx, camera, seg, projection, solidWallRanges);
}
});
}