Thursday, December 07, 2006

ANSI C

попытался написать конвертор мешей на ANSI C.
Такой извращёный язык! Я на нём совершенно не умею писать :(

Monday, November 20, 2006

dsound note

Как менять громкость звука в DirectSound линейно, а не экспоненциально? Очень просто!

void SetVolume(double vol)
{
double dbVol = 20 * log10(clamp(vol, 1e-3f, 1.0f));
pSndBuffer->SetVolume(dbVol * 100);
}

Таким образом, меняя vol от 0 до 1, получаем линейное изменение громкости звука.

Thursday, November 09, 2006

functional style

Люблю функциональный стиль кода и рекурсию. Надоели мне for/while циклы. Ну их :)

Короче, вот как у меня создаётся гео-сфера. Всего несколько строчек кода.


//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------
MeshCPtr SmoothGeoSphere(GLuint iter, MeshCPtr in)
{
 if (!iter)
  return in;
 return SmoothGeoSpehre(--iter, SphereNormalize(Subdivide(in)));
}

//--------------------------------------------------------------------------------------
MeshCPtr CreateGeoSphere(GLuint iterations)
{
 return SmoothGeoSphere(iterations, CreateIcosahedron());
}

Thursday, November 02, 2006

MotionX release

Вот и наступил момент, когда я вполне удовлетворен качеством библиотеки MotionX. Она опробывана, так сказать, в боевых условиях, то есть в коммерческом проекте. И все мелкие косяки и глюки, которые в ней были, я вроде устранил.
Библиотека обладает достаточной функциональностью, но пока не все, что я задумал, реализовано.
Но есть всё, что необходимо для внедрения в игру скелетной покадровой анимации, в том числе и экспортёр из 3dsmax.
Но главное - положить начало публичной жизни библиотеки, дальше будет проще. Я думаю.
Осталось написать небольшую демку c использыванием glut и sdl.
И написать туториал по экспорту анимации. И документацию...
Вот в этом вся проблема. Придется писать много текста на английском. А в этом я никогда не практиковался. Хотя читать могу абсолютно любые тексты.
Ну ладно. Главное начать, что-то делать в этом направлении. Возможно излагать свои мысли на английском не так уж и сложно, как это кажеться.

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

Tuesday, October 31, 2006

floating point

Думаю написать статью по теме работы с floating point числами в графических и физических real-time приложениях.
Из чего должна состоять статья? Вот набросал несколько пунктов.

- Краткое описание формата чисел с плавающей точкой стандарта IEEE 754
- Погрешности. какие бывают и как их расчитывать.
- Расчёт погрешностей для базовых математических операций. Сложения, вычитания, умножения и деления.
- Расчёт погрешностей для векторных операций. Сложение, вычитание векторов. Нормализация. Матричное перемножение(в том числе и умножение матрицы на вектор).
- Стабильность по численным погрешностям некоторых алгоритмов. Пока в голову пришли алгоритмы интегрирования. Вот думаю, для каких алгоритмов еще надо провести research?

Вот пока всё.
Но гложет меня сомнения о нужности подобной статьи. Может быть таких уже десятки и я их пропустил? Не хотелось бы заниматься ненужной работой.



upd:
сюда буду добавлять линки на статьи, по данной тематике которые мне удалось найти.

What Every Computer Scientist Should Know About Floating-Point Arithmetic

Monday, October 30, 2006

gDEBugger

Помоему это ужасная не справедливость. То что под проприетарный D3DX есть такие удобные и бесплатные утилиты для отладки как NVPerfHUD. А для свободного OpenGL мы имеем в наличии лишь корявенький и платный gDEBugger. Причем NV распространяет его со своим SDK, что значит не стоит надеятся на выход аналогичной NVPerfHUD утилиты для OGL.
Это ли не саботаж разработчиков на OGL? Ну что стоит NV выпустить удобную и бесплатную утилиту для отладки OGL графики?

Sunday, August 27, 2006

MotionX

За две недели полностью, то есть абсолютно с нуля переписал свою систему анимации. Очень долго выбирал как называть библиотеку. Решил не оригинальничать и назвал ее MotionX :)

Вот что есть из возможностей.
- Возможность анимировать любые структуры жестких тел(Rigid Bodies). То есть связи могут быть не обязательно в виде скелета(то есть дерева), как это обычно делается. Например, можно анимировать сложные механизмы, моделировать физические взаимодействия тел(используя Havoc в 3дмаксе или другие физические движки). Ну и вообще. При использывании только кейфреймовой анимации, связи между объектами вообще не обязательны.

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

- Есть возможность анимировать разные части скелета персонажа в разных потоках. Например на ногах у нас стоит walk, а для верхней части туловища можно переключать различные анимации(attack, shoot, walk и т.д.). Ну и вообще дает большую гибкость в анимировании объектов.

- Модульная архитектура библиотеки. Помимо покадрового контролёра, можно подлючать другие контроллёры управления положением объектов. Например всё возможные варианты инвресной кинематики. Правда я пока не реализовал ни одного IK контролёра, но добавить их можно очень просто.

- Легкость в сериализации. Описание контроллёров, списки анимаций и связи между ними(время блендинга) находятся в xml файлах. Сами кейфреймовые анимации лежат в бинарном представлении. Есть экспортёр анимации из 3дмакса. Планирую написать экспорт из коллады. Таким образом можно будет охватить и Маю и XSI и другие пакеты моделирования.

- Мультиплатформенность. Библиотека компилируется под vc7.1, vc8.0 и gcc3.4 другие компиляторы пока не тестировал. Привязка к ОС или графическому API отсутсвует. Библиотеку тестировал под линуксом всё работает как надо. Если надо будет сделать поддержку других платформ, то займусь и этим.

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


Через пару недель планирую все это дело выложить на sourceforge. Лицензию пока не выбрал, но вряд ли это будет GPL. Выберу что-нибудь по-мягче.

Wednesday, June 07, 2006

Lua

Уф... похоже битва с Lua и luabind закончилась моей победой.
Сначала я сбилдил lua.lib через msys, просто под mingw. Но в таком варианте там тольео билдинг dll, что вообщем-то мне не надо, не хочу плодить дллки. Тогда сбилдил либу вроде под posix, получил заветный liblua.a, переименовал её в lua.lib и подключил к своему проекту.
Вот зачто я испытываю нежные чувства к языку Си, являясь адептом С++, так за то, что можно сбилдить либу на одном компиляторе, а слинковать совсем на другом. Главное что бы формат объектников совпадал, к счатью и mingw и vc используют coff формат, во всём остальном ABI у них идентичный.
Всё было бы замечательно, если бы не одно но. В отладочной конфигурации у меня проект собирался без проблем и луа работала как надо. Но стоило сбилдить его в релизе, как начинались непонятные глюки. Линкер ругался, что отсутсвуют функции из lua.lib, причем имена функций начинались без подчеркиваний, что не соответсвует cdecl конвенции. Я так не разобрался, что это значит, но по-моему, такие имена у функций в либах, которые указывают на dll. Потом к ним прибавляется префкис __imp_. Так вот, как бы я не менял конфигурации проекта, сколько бы не копался в его настройках, но в релизе из под студии линковаться он у меня отказывался. При этом у меня вместо экзешника появлялись .lib и .exp файлы. Откуда? Я так и не понял.
Удивительнее всего оказалось то, что билдинг релиза используя boost.build работал без проблем. Чудеса да и только.
Совсем отчаявшись, я подумал что придется руками собирать библиотеку Луа в студии. Но вместо этого скомпилировал её в ansi конфигурации. И в моём проекта она вполне корректно слинковалась! Видимо я напоролся на какой-то баг линкера, который присутсвует как в VC7.1, так и в VC8.0.

С компиляцией lualib у меня проблем тоже вроде не было. Хоть это и С++ библиотека, но она использует boost.build для сблорки, а я с ним вполне так дружу :). Слинковалась библиотека с моим проектом тоже без проблем. Но вот работать отказывалась. Падала с совсем непонятными ошибками, в совершенно неожиданных местах. То есть там, где по логике вообще падать не должно. И еще все тесты оказались проваленными.
Тут я тоже промучался несколько часов, пока не заметил, что у меня путь к бусту в project-root.jam прописан не совсем правильно. У меня использывался буст из CVS репозитория, а он там очень корявый лежит. Исправил проблему, прописав путь к дистрибутиву 1.33.1 и всё заработало. Хотя под vc8.0 несколько тестов всё же провалилось, а в vc7.1 все прошли успешно. Странно как-то.
Кстати, версия luabind из sourceforge не работает с последней версией lua5.1, надо забирать luabind из CVS. Тоже весьма неприятный момент.

Но к счастью, весь этот секс остался позади. И теперь у меня открылись новые архитектурные возможности. Например используя скрипты будет проще наладить взаимодействие между потоком, обрабатывающим GUI и основным потоком приложения. Так как задавать отложенные скрипты всё же лаконичнее, чем задавать отложенные функции. Хотя второе и удобно благодоря boost::lambda, но всё же С++, к сожалению, не функциональный язык и boost::lambda не может придать ему всех свойств ФЯ.

Sunday, May 07, 2006

Проблемы с WTL

Поставил сегодня себе Visual C++ Express Edition и Microsoft Platform SDK. Думал что мой проект скомпилируется без проблем. Ха! Наивный.
Проблема в том, что мой проект использует WTL 7.5, он конечно же лежит отдельно и не входит в Platform SDK. Но требует наличия файла atlbase.h, который уже являются частью Platform SDK.
Все было бы хорошо, но atlbase.h инклюдит файл shlwapi.h, которого у меня в наличии не оказалось.
После блужданий по сети, я нашел информацию о том, что этот файл появится после установки компонента Microsoft Web Workshop(IE) SDK.
Какая логическая связь между этим компонентом и ATL я так и не понял. Ну ладно, поставил его, у меня появился shlwapi.h.
Все было бы хорошо, но у меня появилась новая проблема. При линковке проект требует библиотеку atlthunk.lib, которой опять же не оказалось в Platform SDK.

Опять поиск в сети очень помог мне. Оказалось что PSDK не поддерживает 32-ух битные ATL библиотеки. Только 64-ех битные. А что бы иметь доступ к первой надо перейти на полную платную версию Visual Studio... ну или просто закоментировать #pragma comment(lib, "atlthunk.lib") в файле atlbase.h. Я выбрал второй вариант.
Еще хотелось бы заметить, что WTL под vc8.0 не компилируется, из-за использывании не совместимых со стандартом С++ приемов. В файле atlwin.h на 1753-ей строчке используется не объявленная переменная в качестве счетчика цикла. Всё же VC6.0 очень развращает людей.

Wednesday, April 12, 2006

С++ жив!

Наконец-то руки дошли до boost::multi_index. Очень красивая концепция и замечательная реализация. Одна из самых красивых вещей в бусте. А почему? Да потому что стиль программирования контейнеров объектов, с различными отношениями порядка, похож на стиль программирования динамических систем в моей DSP библиотечке :) Даже идею с метками использовали.
Вообще не перестаю удивляться мощности языка С++, а в особенности, его возможностей в области метапрограммирования.


На форуме программистов на КРИ звучали мнения о том что С++ язык неудобный, сложный и неповоротливый, что лучше переходить на С#, Java, Дельфи и прочие гадости. В тоже время те самые люди плевались в сторону буста, шаблонов и вообще modern C++ programming. Странные какие. Конечно, если не использовать одну из самых сильных сторон языка, он не будет очень удобен.

Да, компиляторы пока оставляют желать лучшего. Но все же большинство современных компиляторов С++ предоставляют все возможности для вполне комфортного метапрограммирования. Главное что бы у программиста руки откуда надо росли и все будет хорошо :)