#pragma once // ----------------------------------------------------------------------------- // Сборка кадра: сплошной проход по полу, затем общий список стен и сущностей, // отсортированный по глубине (wx + wy). // ----------------------------------------------------------------------------- #include #include "render/blood.h" #include "engine/framebuffer.h" #include "engine/view2d.h" #include "render/sprites.h" #include "render/lighting.h" #include "engine/tilemap.h" struct Scene { std::vector items; int ox = 0; // смещение камеры в пикселях (целое) int oy = 0; void Begin(const v2d::Camera& cam); // world — мировая позиция «подошвы» сущности; // pixelLift — подъём спрайта по экрану (пули летят не по земле); // depthBias — ручная правка ключа сортировки. void Add(const Sprite* spr, Vec2 world, int pixelLift = 0, float depthBias = 0.0f); // Тот же элемент, но с патчем света. void AddShaded(const Sprite* spr, Vec2 world, const ShadeQuad& quad, int pixelLift = 0, float depthBias = 0.0f); void Flush(Framebuffer& fb); }; // Пол — первым сплошным проходом, в список сортировки не попадает. // Полностью тёмные тайлы пропускаются: ступень 0 рампы совпадает с цветом // очистки, поэтому результат пиксель-в-пиксель тот же, а рисовать дешевле. // // blood == nullptr — крови нет. Иначе у запачканных тайлов берётся запечённая // копия ромба. Стоимость кадра от этого не меняется: тот же один блит на тайл, // сколько бы крови ни накопилось (render/blood.h). void DrawFloor(Framebuffer& fb, const SpriteSet& sprites, const Tilemap& map, int ox, int oy, const Lighting& light, const BloodField* blood); // Все WALL-тайлы уходят в общий список вместе с сущностями. void CollectWalls(Scene& scene, const SpriteSet& sprites, const Tilemap& map, const Lighting& light);