#pragma once // ----------------------------------------------------------------------------- // Мелочь, общая для всякого, кто рисует спрайты руками: движок и игра. // // Вынесено из render/sprites.cpp, потому что тайлы пола и стен переехали в // движок (engine/tileset.h), а рисуются они тем же кодом, что и всё остальное. // Держать две копии наклона ромба — верный способ получить пол и обстановку // в разных изометриях. // ----------------------------------------------------------------------------- #include #include "engine/framebuffer.h" // Затемнить/осветлить цвет (множитель по RGB, альфа сохраняется). uint32_t ShadeColor(uint32_t c, float k); // Занятая часть строки y для ромба dw x dh. Шаг ступеньки — dw/(dh/2), то есть // ровно наклон 2:1: всё, что стоит на полу, обязано быть в одной изометрии // с полом, иначе объект выглядит приклеенным к экрану. void DiamondRowN(int y, int dw, int dh, int& x0, int& x1); // Ромба размером с плиту пола здесь БОЛЬШЕ НЕТ: форму плиты знает проекция // (g_proj.TileRow), и при виде сверху плита не ромб, а квадрат. Помощник, // рисующий ромб мимо проекции, — это ровно тот способ снова получить пол и // обстановку в разных видах. // Обводка по силуэту: любой непрозрачный пиксель, у которого есть прозрачный // 4-сосед (или край спрайта), перекрашивается в outline. void OutlineSilhouette(Sprite& s, uint32_t outline);