вторник, 14 июня 2011 г.

Flash вообще и AS3 в частности говно лютое, всех кто его использует по собственной воле следует физически уничтожить, они не люди вообще. Тех кто придумал - растворить заживо в кислоте с прямой трансляцией в стерео на весь мир. Пидараса что не сделал опцию "я ебал ваши вектора, скейлинг-хуельник и прочее говно, хочу чтобы было M на N пикселе и всё было в них" вообще больно-больно убивать, потом вылечить, потом снова убивать и так пока не дойдёт до абсолютно нелечибельного сосотояния.

вторник, 7 июня 2011 г.

Столкновения.

Сделал столкновения через BSP-дерево. За основу взят код найденный на AppHub, переделан на построение дерева для каждого меша, сохраняется вместе с моделью. В рантайме считается проверка на пересечение с Bounding Sphere, затем перевод в систему координат модели и проверка столкновения с деревом. Профайлер показывает что со скоростью всё в порядке. Сотня проверок на кадре и функция определения столкновений сидит где то в средней части. Минус сейчас - генерация мусора, надо найти реализацию LinkedList которая бы лучше работала с памятью. Или оставить как есть если сборка мусора не будет вызывать проблем.

понедельник, 6 июня 2011 г.

Новые материалы.

Теперь вариант с полной подготовкой материалов в оффлайне реализован. Всё исходит из того что у меня конечное и неизменное число источников света и явное разделение на объекты первого и заднего плана. Текстуры и параметры материала в рантайме менять нельзя, материалов как таковых в коде нет, есть только параметры задаваемые снаружи, такие как матрицы и источники света. Преимущества подхода: тривиально в рантайме, не нужно использовать свой класс моделей и материалов.

Реализация проста. Наследуется MaterialEffect и MaterialEffectContent, в ConvertMaterial ставится эффект с зашитыми в него параметрами и текстурами. У наследника появляется ровно одно поле - техника. Техника определяется по наличию текстур и параметров на меше, сохраняется в материал. При загрузке мы просто грузим MaterialEffect, текстуры и параметы уже получаются установленными. Потом ставим нужную технику. И на этом всё, далее достаточно использовать стандартный код для рисования, точно как с BasicEffect, только внешних параметров чуть больше.

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

Методику можно развить: сохранять не одну технику а кучу разных, в зависимости от типов и числа источников света, теней и прочих. В рантайме выбирать нужную исходя из внешних параметров, в эффекте при этом будет что то типа "параметры -> техника".

пятница, 3 июня 2011 г.

Совершенно новая идея. Надо прямо при сборке ресурсов делать батчи. Сортировать MeshPart по эффектам, собирать части с одинаковыми эффектами вместе, ставить флажки типа "прозрачно/непрозрачно". Делать этим батчам какие нибудь id'ы для объединения одинаковых и рисования через инстансинг. Много подобных идей, непонятно как подходить пока.