Альфа 5 патч 9 виправлення 55

Тут я торкнуся теми розростання складності в випадку додавання ще одного виду свободи для гравця. У попередньому дописі я згадував про нову функцію для деяких будівель вільної форми, які матимуть таку свободу.
В Альфі 5 деяким будівлям можна було надати будь-якої форми, за умови що вона мала 4 сторони та залишалась опуклою. Ніби нічого складного в тому, щоб додати більше точок, але насправді багато оптимізацій та спрощень коду спиралися саме на це. Справа в тому, що розрахунки для опуклих форм набагато простіші, ніж для ввігнутих.
Візьмімо, наприклад, бруківку, оскільки це найпростіший випадок. Графічно це просто: ви генеруєте чотирикутник із двох трикутників, малюєте його на текстурній карті та використовуєте цю карту в фрагментному шейдері, щоб застосувати текстуру бруківки там, де треба. Для підтримки більш просунутих увігнутих полігональних форм вам потрібно лише додати справжню тріангуляцію (перетворення полігону на набір трикутників, які розуміє відеокарта) до алгоритму та продовжувати так само, як і раніше.
Далі все стає трохи складніше. Будівлі можуть бути виділені гравцем, і вони повинні виглядати виділеними. Раніше ви покладалися на просту перевірку у фрагментному шейдері, яка створювала гарний закруглений контур на землі навколо будівлі на основі 4 наданих точок.

Але виконання цієї перевірки для складного полігону з довільною кількістю сторін у фрагментному шейдері швидко призводить до катастрофи з точки зору продуктивності, особливо на слабших відеокартах.
Тож тепер вам потрібно додати альтернативне рішення, яке спирається на окремий набір трикутників для прозорої заливки та смужок із коригуванням висоти для країв. Ви навіть додаєте кружечки в кожну точку, щоб імітувати заокруглення. Це може виглядати майже так само добре, як оригінал:

Також виявляється, що ваша система виділення будівель спиралася на опуклі форми, щоб визначити, на яку з них натиснув гравець. До того ж це пов’язано з системою, яка перевіряє, чи будівля, яку гравець намагається розмістити, накладається на одну з наявних будівель. Тому все це теж потрібно рефакторити, щоб підтримувати ввігнуті форми. Після того, як ви це зробили, ви помічаєте, що новий код не такий швидкий через складніші перевірки, тому ви додаєте обмежувальні рамки для кожної форми та спочатку перевіряєте обмежувальні рамки (дешевший тест) перед перевіркою полігонів.
Але це ще не найскладніше. Оскільки бруківка в Острові не просто малюється, а будується по частинах, нам також потрібно щоб будівельники ходили від місця, де лежить каміння, до кожної точки всередині ділянки. З 4-сторонніми опуклими формами це було досить просто: ви генеруєте сітку з точок, і каміння з’єднується безпосередньо з кожною з них прямою лінією, що зменшує навантаження на систему пошуку шляху (можуть бути сотні точок на великій ділянці). З увігнутими формами немає гарантії, що лінія не буде перекрита якоюсь іншою будівлею. Тож тепер вам потрібно додати спеціалізований мініатюрний пошук шляху для будівництва бруківки.
Чи згадував я про ці маленькі прапорці навколо будівельного майданчика? Раніше ми генерували їх як опуклу оболонку навколо будівлі. Це, очевидно, також потрібно змінити, щоб додати підтримку довільних контурів.
Я навіть не впевнений, що все згадав, але ви розумієте, скільки роботи може створити просте бажання додати кілька точок до фігури.
Наступним кроком доведеться схожим чином переробити хатні обійстя. Задача обіцяє бути дуже цікавою.

Тим часом, ось що вже готове:

Додано/змінено:

  • Тепер можна, тримаючи Shift, замовити всі тачки/плуги/вози/тощо
  • Незначні зміни інтерфейса
  • Церква тепер вестиме книгу записів про всі хрещення, одруження та поховання

  • Міська рада триматиме записи про прибуття та вибуття мешканців

Виправлено:

  • Урожай ставав невидимим у грудні, якщо його не встигли зібрати
  • Числа в опціях постачання не зберігались при втраті фокусу
  • Кнопка “Додати” в джерелах постачання не з’являлась після видалення джерела
  • Ятки та крамниці не дуже добре працювали зі списком джерел постачання
  • “Заліснювати автоматично” було завджди ввімкнено, незалежно від галки
  • Виліт, пов’язаний із парканами та заблокованими шляхами
  • Несправедливо виснажена земля на нових полях у деяких випадках
  • Запас каміння не відображався при будівництві бруківки
  • Указівник миші міг скинутись при перетягуванні тварин та транспортних засобів
  • Панель скарбниці неправильно оновлювала підказки на кнопках