The Link
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.
Скриншоты
Ссылки
- демо с исходниками
- youtube (видео снято с эмулятора Diver'ом)
- mkv (видео снято с реала DDp)