The Link
The Link - первое демо, специально написанное для компьютера Pentagon 1024SL v2.x с устройством NeoGS в качестве "ускорителя". Также используется TurboSound FM для воспроизведения музыки, режим 16col для некоторых эффектов, расширенная память и турбо-режим. Не работает на обычных ZX Spectrum-совместимых компьютерах.
Демо разработано в 2009 году Alone Coder'ом (код, музыка, графика) при участии Shiru (графика) и Dimidrol'а (графика). Утилиту для получения 256-цветных чанков 2x2 написал Screw. Эмуляцию NeoGS в Unreal Speccy реализовали deathsoft и DDp.
Демо было представлено на демопати Chaos Constructions 2009 и заняло первое место из четырёх работ (3 для ZX Spectrum, 1 для компьютера "Вектор-06Ц").
Содержание
Описание
Демо состоит из титульного экрана (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). На пати эффект не был показан из-за проблем с аппаратурой. Чтобы эффект успел во фрейм, используется насильственный останов вывода по прерыванию (визуально - "расчёска").
Принцип вывода блоков - косыми сканлайнами. Чтобы избежать дыр и многократного рисования одних и тех же байтов, рисуется не h строк по l пикселей, а 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.
Скриншоты
Ссылки
- демо с исходниками
- youtube (видео снято с эмулятора Diver'ом)
- mkv (видео снято с реала DDp)