воскресенье, 22 февраля 2009 г.

Little helpers

Наверное у каждого программиста есть такие маленькие функции, которые не делают ничего сверхъестественного, однако сильно упрощают жизнь.
Вот и у меня есть. И решил я что по мере появления новых буду публиковать их у себя на блоге, авось кому пригодится.
Начну с сегодняшней маленькой функции. В моем движке fEngine есть конечно же класс строки, однако когда пишешь маленькие демонстрашки или просто тесты, не всегда удобно его целиком подключать. Вот и сегодня мне было лень его подключать к моей новой демке OpenGL 3.0, а нужно было всего-навсего заменить в строке все пробелы на символы перевода каретки. Таким образом родилась такая малютка:
template<int what, int to>
int change_char( int c ) { if ( what == c ) return to; return c; }

И с помощью нее задача была решена просто и елегантно:
std::transform( extensions.begin(), extensions.end(), extensions.begin(), change_char<' ','\n'> );

В будущем постараюсь выкладывать наиболее интересные такие "помогашки", и возможно, соберу свои бывшие и новые в один файл и выложу здесь.

суббота, 21 февраля 2009 г.

Платформа 2009

4–5 Декабря в Москве прошла очередная, десятая ежегодная конференция от Micro$oft - "Платформа 2009. Определяя будущее". Лично на конференциия не присутствовал, но был заинтересован. Очень сильно интриговал тот факт, что на конференцию приедет выступить с докладами сам великий и могучий Марк Руссинович (профиль докладчика).
Особый интерес для меня как для программиста представлял доклад "C#. Взгляд в будущее", рассказывающий историю развития языка C# его зарождения в 1998-м году и появления в 2002-м году первой его версии 1.0, до версии 4.0 которая будет доступна в VisualStudio 2010.
Итак, чтоже такого интересного нас ждет в C# 4.0?
1)
Динамическая типизация объектов.
смысл в том, что мы можем напрямую сообщить компилятору что мы не знаем точного типа объекта, и что привязка к его методам должна быть выполнена в Run-Time. для этого введено новое ключевое слово dynamic :
То что раньше приходилось делать так:
object calc = GetCalculator();
Type calcType = calc.GetType();
object res = calcType.InvokeMember("Add",
BindingFlags.InvokeMethod, null,
new object[] { 10, 20 });
int sum = Convert.ToInt32(res);

Теперь можно сделать так:
dynamic calc = GetCalculator();
int sum = calc.Add(10, 20);

Сразу хочу заметить, что тем кто, в связи с Dynamic Dispatch, переживает за производительность, Micro$oft обещает реализовать эффективный Call Site Caching.

2) Параметры по умолчанию и именованные аргументы.
Некоторым это должно быть знакомо. Да! Такое есть в языке Objective-C, так что кто писал под MacOS удивлены не будут. Однако для C# это очень крутое нововведение. Смысл его в том, что можно пропускать дефолтные параметры, а также менять порядок передачи параметров. Вот простейший пример:

можем написать такую функцию
public void M(int x, int y = 5, int z = 7);

и она будет иметь такие варианты вызовов:
M(1, 2, 3); // обычным образом
M(1, 2); // опущен последний параметр z – тоже самое, что вызвать M(1, 2, 7)
M(1); // опущены 2 последних параметра - y и z – тоже самое, что вызвать M(1, 5, 7)

M(1, z: 3); // передача фактического значения по имени формального параметра - z
M(x: 1, z: 3); // передача двух значений по именам параметров - x и z
M(z: 3, x: 1); // аналогично предыдущему


3) Упрощенная работа с COM.
То чего всем так не хватало! Наконец у Micro$oft дошли руки. Встречайте - теперь вместо такой колбасни
object fileName = "Test.docx";
object missing = System.Reflection.Missing.Value;

doc.SaveAs(ref fileName,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing);

можем просто написать
doc.SaveAs("Test.docx");

Ура товарищи.

4) Ко-вариантность и контра-вариантность.
Обещают безопасную ко-вариантность. Предлагается статически проверяемая вариантность по месту определения, а также типы значений теперь всегда инвариантны
IEnumerable<int> != IEnumerable<object>

5) Компилятор как сервис.
Еще одна очень интересная штуковина в C#4.0 - это Evaluator - класс для компиляции и исполнения кода в Run-Time! Да здравствует скриптование! Программа во время выполнения может в зависимости от ситуации и параметров генерировать код, компилировать и выполнять его.
CSharpEvaluator ev = new CSharpEvaluator();
ev.Usings.Add("System");
ev.Eval("for (int i = 0; i < 10; ++i) Console.WriteLine(i * i);");

Было много еще всего вкусного. Рекомендую сходить на сайт http://platforma2009.ru и узнать больше.

пятница, 20 февраля 2009 г.

Attention! Реклама! :)

Сегодня мне выпало немного свободного времени, поэтому я решил наконец заняться своим блогом. Так как я являюсь модератором на форуме портала Сообщество украинских разработчиков игр , то не могу его не отрекламировать :) Надеюсь Раптор не засудит меня :)) Этот портал - попытка создать Украинский аналог форуму gamedev.ru, который бы объединил наших "вiтчизняних виробникiв" :).

Также я успел выложить на этом портале 2 свои статьи:

1) Расчет TBN векторов. Да, именно тех самых, которые образуют базис касательного пространства для перевода векторов нужных для расчета освещения (источник света, направление взгляда и т.п.) в пространство текстуры-normalmap'ы.
Статья сопровождается полным исходным кодом на С++.
http://gameworld.com.ua/showthread.php?t=195

2) Пишем GLSL шейдеры в RenderMonkey - Specular Lighting + Heat Haze. Как продолжение предыдущей статьи, эта статья рассказывает о двух технологиях - попиксельное бликовое освещение (в статье используется модель Блинна(Blinn)), и эффект искажения изображения как от горячего воздуха (heat-haze).
Статья сопровождается полным исходным кодом GLSL-шейдеров и готовым проектом для RenderMonkey 1.6
[Внимание! Для просмотра второй статьи Вы должны быть зарегистрированы на форуме и иметь два сообщения]
http://gameworld.com.ua/showthread.php?t=197

Первые официальные скрины моего движка

Наконец в сети выложили первые официальные скриншоты третьей части пошаговой стратегии "Герои Мальгримии"! Эта часть будет переведена в 3D благодаря моему движку - fEngine. Так что эти скрины есть его первая публичная демонстрация.