понедельник, 23 ноября 2015 г.

Новый скриптинг 3D-Coat

3D-Coat AngelScript
В программировании важно продумать архитектуру приложения. Как минимум, она должна быть такой, чтобы библиотеку было удобно использовать правильно и неудобно неправильно. Работая со скриптингом для Коута, я стараюсь следовать этой заповеди этому принципу. (Разумное следование принципам ООП - это даже не обсуждается). И вот что получается...
// Создаём две сферы и объединяем их тремя способами.
void main() {

    // подготавливаем сцену
    SculptRoom  sculpt;
    sculpt.clear().toSurface();

    Mesh  a, b;
    const Vec3  dir = Vec3( 0, 1, 0 );

    // I) add
    float  delta = 0;
    Vec3  shift = dir * delta;
    {
        build( a, b, shift );
        const Mesh  ab = a | b;
        sculpt += ab;
    }

    // II) subtruct
    delta += 200;
    shift = dir * delta;
    {
        build( a, b, shift );
        const Mesh  ab = a - b;
        sculpt += ab;
    }

    // III) intersect
    delta += 200;
    shift = dir * delta;
    {
        build( a, b, shift );
        const Mesh  ab = a & b;
        sculpt += ab;
    }
}


void build( Mesh &out a, Mesh &out b, const Vec3 &in shift ) {

    Builder  builder;

    const Vec3  pa( 0 );
    a = builder.sphere()
      .radius( 90 )
      .position( pa + shift )
      .details( 0.1 )
      .build();

    const Vec3  pb( 30, 40, 50 );
    b = builder.sphere()
      .radius( 50 )
      .position( pb + shift )
      .details( 0.5 )
      .build();
}

Запускаем скрипт в Коте (кстати, во Вт, 24/11/15 сделаю, чтобы скрипт можно было пускать при старте 3D-Coat'а) и видим:


Почему такая картинка - понятно, если прочесть код и, может быть, комментарии к нему. Обратите внимание: детализация сфер при добавлении, вычитании и пересечении сохраняется.
Скрипт можно записать более компактно, исключив декларацию `Mesh ab`:
{
    build( a, b, shift );
    sculpt += a | b;
}

Это первая заметка с новой архитектурой скриптинга. Синтаксис - красная нить, которой буду придерживаться. Также есть небольшая презентация, в которой видно, каким образом планирую расширять возможности Coat'а. Говорите, если что-то понадобится Вам быстрее. Старый код - тоже работает, но, при появлении подходящей замены, помечается как DEPRECATED.

В ближайшее время добавлю новые примитивы и дополню этот обзор.

Updated 14/12/2015
См. "Примитивы в 3D-Coat: что уже можно".

Комментариев нет: