среда, 22 августа 2012 г.

XNAnimation на WP7

Портировал XNAnimation под WP7. Задача на самом деле очень простая.
  1. Выкидываем все кастомные шейдеры и модели. На выходе должна быть стандартная модель и стандартный SkinningEffect. Надо будет вырезать весь код который занимался собственным классом модели на стороне процессора и игры.
  2. Информацию про анимации и скелет помещаем в отдельный класс. Класс помещаем в Tag модели. Делаем соответствующий ContentTypeWriter и ContentTypeReader.
И на этом всё. На выходе получается нормальный скининг с быстрой загрузкой, блендингом анимаций и всеми наворотами прямо на телефоне. Всей работы на 2-3 часа.

P.S. Новый интерфейс блогспота - говно.

пятница, 24 февраля 2012 г.

Использование особенностей C# в материалах.

Итак, задача. У нас есть куча эффектов с разными параметрами. Надо в них загнать данные, много, разных. И надо чтобы всё было в более-менее одном месте. Тут вылезает чудная возможность C#, в C++ отсутствующая. Мы можем на ходу спросить объект "ты вот такой интерфейс реализуешь?" и получить ответ. И тут же смотрим в стандартные эффекты XNA - там уже есть интерфейсы вроде IEffectLight, IEffectMatrices. Далее делаем наш эффект реализующий нужные интерфейсы (и ещё добавляем своих), при рендере просто спрашиваем "у тебя такой интерфейс есть? А такой?" и передаём через них все данные. Всё, можно делать кучу сложных вещей. Можно делать ещё интерфейсы типа "рендерюсь в карту теней" откуда доставать предназначенную для этого технику. Назначение эффектов и установка неизменяемых параметров с текстурами спокойно делается в простеньком расширении Content Pipeline.

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

И чтобы я когда либо вернулся на плюсы после таких ништяков.

И важный момент, не совсем в тему. Frustrum.Intersects медленный, не используйте на каждый объект, проверяйте большими блоками.