2.5D Renderer

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);
      }
    });
  }