Помогите с координатами и интерполяцией
Имеем комнату из 3D шутера. Она задана координатами и высотами стен по углам, координатами-высотами прорезей в стенах (порталов), спрайтами, которые есть в комнате, и некоторыми другими штуками, которые пока не важны.
Имеем ультраскоростную процедуру отрисовки стен в столбцовый буфер:
LD SP, конец буфера
LD BC, 0
LD DE, чанк 8х2, показывающий степень затенения
LD HL, $+6
JP кусок процедуры PushEmpty
LD HL, $+6
JP кусок процедуры PushWall
LD HL, $+6
JP кусок процедуры PushEmpty
LD DE, новое значение затенения
; выше портала стена может быть затенена по-одному, ниже -- по-другому.
LD HL, $+6
JP кусок процедуры PushWall
LD HL, $+6
JP кусок процедуры PushEmpty
; Далее повторяем этот кусок еще 31 раз. SP можно не перезагружать.
PushEmpty:
DUP 32
PUSH BC
EDUP
JP (HL)
PushWall:
DUP 32
PUSH DE
EDUP
JP (HL)
Итого что-то около двадцати тысяч тактов на грубую отрисовку стен с окнами, причем самой процедуре пофиг форма краев -- хоть по синусоиде выгибай. Но мы пока ограничимся линейной интерполяцией.
После отрисовки стен и спрайтов этот буфер за фрейм (точнее, за два полуфрейма) можно перебросить на экран с растяжением в 2 раза по вертикали. По грубым прикидкам, на вейтовых машинах честное 32х16 либо повиснет, либо будет tear-ить по диагонали, но можно сделать 28х14.
Таким образом, стенная часть движка упирается в три вещи:
1) как по-быстрому перевести координаты и высОты углов в экранные координаты.
2) как по-быстрому линейно интерполировать высоты и освещенности
и 3) как эти данные непосредственно раскидать по младшим байтам адресов вызова PushEmpty и PushWall.
Прошу помощь клуба по этим вопросам!
Стены должны получиться примерно такими (рисовал для наглядности на шахматке)http://cs317225.vk.me/v317225355/7194/36ZpDtxOGcw.jpg
---------- Post added at 21:31 ---------- Previous post was at 21:25 ----------