The Link

Материал из SpeccyWiki
Перейти к: навигация, поиск

The Link - первое демо, специально написанное для компьютера Pentagon 1024SL v2.x с устройством NeoGS (также используется TurboSound FM). Использует режим 16col, расширенную память, турбо-режим. Не работает на обычных ZX Spectrum-совместимых компьютерах.

Демо разработано в 2009 году Alone Coder'ом (код, музыка, графика) при участии Shiru (графика) и Dimidrol'а (графика). Утилиту для получения 256-цветных чанков 2x2 написал screwer. Эмуляцию NeoGS в Unreal Speccy реализовали deathsoft и DDp.

Демо было представлено на демопати Chaos Constructions 2009 и заняло первое место из четырёх работ (3 для ZX Spectrum, 1 для компьютера "Вектор").

Описание

Демо состоит из титульного экрана (Medieval by Dimidrol), семи частей и конечного экрана с указанием авторов. Действие синхронизировано с музыкой, общая продолжительность демо составляет две минуты десять секунд.

Первая часть

Туннель с поворотом. Выводится в мультиколоре пикселями 4x2. Реализован через двойной лукап (первый - из декартовых координат в полярные, второй - из полярных координат в координаты текстуры тора). Текстура - сгенерированная плазма 256x64.

Внутренний цикл:

ld hl,dRa ;строится по таблице полярных координат
add hl,sp ;Ra + адрес таблицы для тора
ld sp,hl
pop hl ;адрес в текстуре
add hl,de ;dVdU ;0..3fff
res 6,h ;можно избежать, если 2 копии текстуры 128x64
ld b/c,(hl) 
ld a,(bc) ;пересчитываем 2 пикселя в байт атрибутов
ld (...),a ;пишем на экран

Вторая часть

Вращение текстуры 256x128 в пиксельном разрешении, с логотипом поверх. Автор текстуры и логотипа - Alone Coder. Экран рисуется целыми байтами. Для этого в памяти лежит 16 байтов-поворотов от каждого пикселя текстуры. Возможны более крупные текстуры, если усложнить код и использовать больше памяти.

Третья часть

Картинка собирается из падающих брусков (цвет на точку). Единственный эффект, использующий NMI (для того, чтобы несколько раз переставить указатель DMA). На пати не показан из-за проблем с аппаратурой. Чтобы эффект успел во фрейм, используется насильственная остановка вывода по прерыванию (визуально - "расчёска").

Принцип вывода блоков - косыми сканлайнами. Чтобы избежать дыр и многократного рисования одних и тех же байтов, рисуется не hxl пикселей, а (h/cos a) строк по l*cos a пикселей.

В коде программы есть четыре (если не считать зеркальных копий) процедуры для разных углов (почти стоячий, средний, почти лежачий и лежачий). Из них используются только две последние, чтобы не затягивать эффект. Нельзя бросать блоки быстрее, иначе компьютер не успеет их стереть (стирается только верхняя половина бруска и два байта с торца). Внутренние циклы очень большие.

NGS передаёт Spectrum'у адреса для стирания, а также адреса и данные для отрисовки.

Автор картинки - Alone Coder.

Четвёртая часть

Картинка рассыпается на бруски (в мультиколоре). NGS передаёт Spectrum'у команды типа "вывести по адресу такие-то данные", "обнулить 32 байта с такого-то адреса", "ждать столько-то тактов", "переключить экран".

Пятая часть

Картинка с демоном и вращающийся большой звёздчатый додекаэдр. Освещение текстуры по Ламберту (texture+flat shading). Объект содержит 60 граней, укладывается во фрейм, но Pentagon 1024SL 2.2 немного не успевает его отрисовать (это исправимо, если не обновлять углы кадра).

Автор текстуры объекта и наброска демона - Alone Coder. Демона раскрасил Shiru.

Статистика (в тактах, приводятся также оптимизации, сделанные уже после показа демо):

  • Вращение вершин (метод JTN с исправлением округления): 17001 (32 вершины по ~520), можно 12079 без SRA (координаты будут грубыми) и по 2 осям (32 вершины по ~360)
  • Перспективная коррекция: 2833 (32 вершины по ~88)
  • Расчёт средних точек полигонов: 8726 (60 граней по ~145)
  • Очистка чанкового буфера: 24032 (64x64 - можно уменьшить под текущее окно)
  • Сортировка вершин: 52806..54894 (60 граней^2), можно heap sort: ~50000 (N*lg N), можно по Сайрусу (но есть ситуации, которые он не может отсортировать): 17983..19787 (log2(60) проходов по 60 граней по ~50 тактов), но лучше pigeonhole sort: 15500 (Z=#a0..#ff)
  • Полигоны: 166000..169000 (60 граней, полная ~1600+патч+отрисовка)
    • ~600 выполняется даже в случае невидимости полигона
    • ~1000 выполняется только для видимых
    • 60 тактов на пиксель максимальной ширины - патч смещений отрисовки
    • 116 тактов на сканлайн - обвязка отрисовки
    • 39 тактов на пиксель - отрисовка
  • c2p: 181762 (56x64 по ~50)

Шестая часть

Двухслойная картинка - на заднем плане пейзаж (автор - канадский художник Frank Stock), на переднем женщина с метлой (нарисовал и раскрасил Alone Coder).

Седьмая часть

Голова женщины вращается на фоне текстуры плазмы (проекция лукапом). В объекте 28 полигонов. Автор модели и графики - Alone Coder.

Скриншоты

Ссылки