Вход

Просмотр полной версии : Помогите с координатами и интерполяцией



Soplik
18.09.2013, 23:31
Имеем комнату из 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 ----------

Andrew771
20.09.2013, 10:29
Книга "Графика ZX Spectrum" издательства Солон. Там все формулы и примеры на Бейсике. Переведи их в ассемблер и оптимизируй.