QUOTE (sergy172 @ 29.07.2013, 14:28)
В который уж раз очень прошу поковырять Баг с отсутствием плавной смены текстур солнца и луны.
Параметры движок берёт из flares.ltx
blend_time = 10 ;(сек) скорость перехода одной текстуры в другую, например из flares = flares_sun_rise во flares = flares_default10
blend_rise_time = 300 ;(сек) скорость появления, если в предыдущей погодной секции был пустой flares =
blend_down_time = 300 ;(сек) скорость исчезновения, если в последующей погодной секции пустой flares =
Поковырял.
В общем, это конечно же не баг, просто такая реализация. В погоде всегда рисуется только то солнце, час которого сейчас идет. В билде же, наверно солнце рисовалось как скайбокс, точнее их рисовалось всегда два - для текущего часа и для следующего и постепенно менялся цвет (прозрачность) для обоих.
Теперь немного конкретики.
Отрисовкой текущего флара занимается класс
CLensFlare, который рисует флар по индексу, переданному из
CEnvironment.
CODE
int l_id = (current_weight<0.5f)?Current[0]->lens_flare_id:Current[1]->lens_flare_id;
eff_LensFlare->OnFrame (l_id);
lens_flare_id - это айди созданного экземпляра класса
CLensFlareDescriptor, а каждый экземпляр содержит себе настройки одной секции флара.
Current[0] и
Current[1] - как я понял, текущая и следующая погода (
CEnvDescriptor).
Внутри
CLensFlare::OnFrame работа всегда идет только с
одной секцией флара
CODE
CLensFlareDescriptor* desc = (id==-1)?0:&m_Palette[id];
У класса есть 4 состояния
lfsNone,
lfsIdle,
lfsShow и
lfsHide. По названиям, думаю можно догадаться, за что отвечает каждый стейт.
Алгоритм переключения флара - если раньше флара не было (текущий стейт -
lfsNone) и есть новый (который передали по индексу) - работаем с ним, включается стейт
lfsShow. После чего, когда
m_StateBlend достиг единицы (со скоростью
blend_rise_time для этого флара из его конфига), стейт переключается в
lfsIdle и висит в этом состоянии, пока не передадут флар из другого часа. После того, как это произошло, стейт переключается в
lfsHide и уже со скоростью
blend_down_time из конфига, текущий флар будет исчезать. Когда
m_StateBlend достиг нуля, новый переданный флар становится основным, включается стейт
lfsShow и всё прокручивается по-новой.
В общем, для реализации "плавных фларов" надо править класс
CLensFlare, в котором управлять двумя текущими фларами, меняя их цвет (прозрачность). Правка достаточно основательная, так что шансы на то, что её могли раньше (без исходников) сделать почти равны нулю...
З.Ы. параметр
blend_time во всех 3 играх даже
не читается, разве что в ЗП вроде как начали делать какую движуху по этой теме, но похоже забили - остался пустой класс без реализации...
З.Ы2. ну а вообще если подумать, реально как-то стремно выходит - одно солнце сначала "исчезает", а потом другое начинает "появляться"