forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Clear Engine (Понятный движок) (http://forum.boolean.name/showthread.php?t=18702)

pozitiffcat 04.12.2013 20:23

Ответ: Clear Engine (Понятный движок)
 
запилил атрибуты
PHP код:

sProgramInitData progInit;
progInit.add(VertexAttribute::VaPosition"POSITION");
progInit.add(VertexAttribute::VaTexcoord0"TEXCOORD");
progInit.add(VertexAttribute::VaJoint"JOINT");
progInit.add(VertexAttribute::VaWeight"WEIGHT");
progInit.vertexSource readTextFile(context"simple_anim.vs");
progInit.fragmentSource readTextFile(context"simple_anim.fs");
m_program context->video()->createProgram(progInit);

sVertexDeclaration vd;
vd.attributes.push_back(sAttributeDeclaration(VertexAttribute::VaPosition03));
vd.attributes.push_back(sAttributeDeclaration(VertexAttribute::VaTexcoord0242));
vd.stride sizeof(sVertex);
surface->setVertexDeclaration(vd); 


HolyDel 05.12.2013 02:09

Ответ: Clear Engine (Понятный движок)
 
столько лишних слов...
это нифига не slim.

pozitiffcat 05.12.2013 09:49

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от HolyDel (Сообщение 271025)
столько лишних слов...
это нифига не slim.

не, ну у вершины есть статический метод, по которому можно получить ее формат, вот если ты хочешь юзать свой формат, тогда придется потрудится.

Slim не в плане простоты, а в плане того, что движок не жирный.

Samodelkin 05.12.2013 15:45

Ответ: Clear Engine (Понятный движок)
 
Кстати вот в d3dx есть такая штука id3dxeffect, которая позволяет более менее структурировать большое кол-во шейдеров, хотя конечно имхо от большого кол-ва шейдеров нужно по возможности избавляться. Можешь попробовать в opengl что-то подобное сам сделать.

Насчет Slim: с таким подходом он может превратиться либо в обертку вокруг opengl, которая не прибавляет функционала, но становится ненужным оверхедом, либо урезает функционал, что-то обобщает, но ничего полезного не добавляет, либо просто явлется контейнером всего что в нем лежит и опять же никакого толку - все компоненты можно использовать напрямую с тем же успехом без лишних заморочек.

По моему убеждению движок должен не добавлять/обобщать/урезать функционал тех компонентов с которыми он работает, а интерпретировать высокоуровневую работу с абстрактными сущностями через эти низкоуровневые компоненты.

Что ты понимаешь под простотой движка? Например кодить небольшие игры довольно просто на unity3d или blitz3d, однако их нельзя назвать оптимизированными по производительности. С другой стороны оптимизированный код обычно больше по размеру чем универсальный, потому что в нем может быть много частных случаев и ассемблерных вставок, он сложней для понимания и отладки. Так что имхо упрощать нужно архитектуру, убирать ненужный функционал, а также упрощать структуру и семантику кода пока это совпадает с повышением его производительности, и улучшением читабельности.

Управление сложностью является решающим фактором успешного развития движка в будущем.

Поэтому я бы еще раз обратил внимание на пост товарища jimon'а где то в начале темы - там он расписывал о driven data.
Это удачное решение потому что позволяет четко распределить обязанности между движком и редакторами. Задача движка воспроизводить контент на разных платформах, с минимальным вмешательством программиста. Задача редакторов предоставить функционал движка разработчикам игр в наиболее подходящей для данного проекта форме. Тем самым подход становится более декларативным - мы даем движку контент и говорим что делать, а не как делать. Движок становится проще, а редакторы гибче, к тому же я могу на каждый проект сделать свой набор редакторов, и делать их по мере необходимости.

Mr_F_ 05.12.2013 17:07

Ответ: Clear Engine (Понятный движок)
 

Цитата:

ассемблерных вставок
интересно кстати, у кого-нибудь хоть их юзанье на практике оправдывалось?
я кроме sincos за одну инструкцию не знаю ничего такого полезного, что нельзя было бы сделать в обычном С, он компилится и так более-менее предсказуемо.

Samodelkin 05.12.2013 17:46

Ответ: Clear Engine (Понятный движок)
 

simd однозначно лучше на ассемблере. потому как компилятор далеко не всегда может сам распаралелить цикл или т. п. У себя в двиге кое-где заюзал, но пока очень мало - оптимизацию на потом оставил, так что точнее сказать не смогу, но теоретически на x64 где 16 xmm регистров можно соответственно добиться ускорения в 8 раз. avx еще больше.
На С++ интринсики работают чуть хуже.
Однако если у тебя с производительностью все нормально то от ассемблера стоит воздержаться.

Mr_F_ 05.12.2013 18:03

Ответ: Clear Engine (Понятный движок)
 

Цитата:

На С++ интринсики работают чуть хуже.
а чем хуже? всегда их юзаю как раз.

Samodelkin 05.12.2013 18:35

Ответ: Clear Engine (Понятный движок)
 

Цитата:

а чем хуже? всегда их юзаю как раз.
Они просто медленней по факту, вот тут замеряли:
http://www.gamedev.ru/code/articles/?id=4238

Вот еще на тему оптимизации:
http://www.xakep.ru/post/60145/?print=true

Также видел что simd можно юзать и на armv6 и выше.

pozitiffcat 18.12.2013 00:35

Ответ: Clear Engine (Понятный движок)
 
Новые картинки :) работаю над проектом, волки воруют кур, нужно их остановить )) При разработке игры проще разрабатывать движок )
Очень много поменялось в концепции, убралась абстракция видеодрайвера, теперь модель сама знает как себя рисовать (конкретно реализованая для конкретного рендера), меньше виртуальных функций.. Объект ядра теперь синглтон.. Постпроцесс и шейдеры описываются скриптами в виде xml файлов, вобщем нет смысла рассказывать, я могу еще 100 раз все переделать. Буду выкладывать наработки просто, в дальнейшем скомпилю более-менее нармальный движок для всех платформ, запилю доку и выложу кому интересно. Движок конечно не убийца Юнити, но думаю делать на нем что-либо на плюсах будет удобно =)


На картинках диффуз + лайтмап + AO + [GLOW]

Samodelkin 18.12.2013 01:18

Ответ: Clear Engine (Понятный движок)
 
Цитата:

При разработке игры проще разрабатывать движок )
Показатель неюзабельности движка - это нужно исправлять.

Картинка нормальная - визуальный дизайн помогает делать графику лучше, сам моделил?

ЗЫ: Вроде где то в начале темы был вопрос о том как сделать размытие гаусса быстрей? Есть альтернатива - pingpong. Смысл в том что создаешь две текстуры (оптимальный вариант 128х128 и 64х64) и перерисовываешь несколько раз (около 18 ) туда-сюда, линейная фильтрация размывает изображение. Только еще стоит обратить внимание на смещение (в статье этого нет непочему-то): вот когда тебе надо перерисовать из одной текстуры в другую обычно используют смещение на пол пиксела, чтобы тексель в пиксель попадал и изображение не размывалось - так вот в данном случае как раз не нужно этого делать чтобы изображение больше смазывалось, только оно будет постепенно уезжать вниз-вправо, поэтому его можно компенсировать через каждые 2 прохода (я так делал) или сразу после всех проходов. Вот я сам буквально на днях делал размытие для блума в двух вариантах - гаусс (горизонтальный/вертикальный) с ядром в 7 семплов и текстурами 128х128 и вот такой пингпонг - разница почти не заметна, а выйгрышь по скорости на слабых платформах будет. Недостаток пингпонга: если изображение стратает большим количеством горизонтальных и вертикальных контрастных линий то будет заметна пикселизация, увеличение количества проходов ситуацию не спасет, и вообще пингпонг очень консервативен - если изменить разрешение таргетов/текстур или изменить кол-во проходов то изображение в большинстве случаев только хуже становится. Однако из источника выше говорят что даже в crysis использовали - очень хорошо настроено было.

mr.DIMAS 18.12.2013 10:39

Ответ: Clear Engine (Понятный движок)
 
Цитата:

При разработке игры проще разрабатывать движок )
Тут я полностью согласен. При разработке всплывают реальные задачи а не абстрактные модели( которые в большинстве движков реализованы криво ).

pozitiffcat 18.12.2013 11:07

Ответ: Clear Engine (Понятный движок)
 
Модельки мои

HolyDel 18.12.2013 13:30

Ответ: Clear Engine (Понятный движок)
 
Цитата:

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

Mr_F_ 18.12.2013 14:12

Ответ: Clear Engine (Понятный движок)
 
Цитата:

это в неправославном dx координата указывает на центр текселя, поэтому надо смещать
к слову, в дх10-11 уже не надо

Samodelkin 18.12.2013 15:05

Ответ: Clear Engine (Понятный движок)
 
Цитата:

это в неправославном dx координата указывает на центр текселя, поэтому надо смещать.
Подожди, если бы указывала в центр, тогда как раз не надо было бы смещать, потому что дискретная экранная координата пиксела соответствовала бы центру тексела рисуемой текстуры. В d3d9 текстурная координата ( 0, 0 ) указывает в верхний левый угол текселя, поэтому и надо смещать на центр текселя. Или ты имеешь ввиду что в opengl экранные координаты смещены?

Но вобщем смысл понял, буду разбираться в opengl, тогда в той статье все верно.

В любом случае какой инструментарий предоставляется с тем и приходится работать... :(

Кстати, d3d9 еще актуален? Например для xp или там для vista без сервис пака, если считать что у меня нет dx10, только 11 и 9?

Samodelkin 18.12.2013 15:24

Ответ: Clear Engine (Понятный движок)
 
А все я разобрался :)

Да пиксел ( 0, 0 ) должен по идее указывать на координату 0.5f / width, 0.5f / heigth, а он на самом деле указывает на 0.0f, 0.0f, так что он по верхнему левому углу позиционируется.

pozitiffcat 19.12.2013 15:34

Ответ: Clear Engine (Понятный движок)
 
Вложений: 2
Запилил видео где бегают курочки
http://rutube.ru/video/e6a77187383e3...12ca90dafdbcb/
На саму модель потратил около 4х часов (( lowpoly, учусь пока

код для сцены в неск строк
Код:

void ceMain(){
    ceCateye::createCateye("render", 800, 480);
    auto lightmapProgram = ceCateye::instance()->scene()->loadProgram("lightmapambient.cep");
    //ceCateye::instance()->scene()->setPostProcessor("glow.cpe");
    ceCateye::instance()->scene()->camera()->setPosition(55, 30, -20);
    ceCateye::instance()->scene()->camera()->setRotation(25, -70, 0);
    auto L_lm = ceCateye::instance()->scene()->loadModel("L_lm.cex");
    auto lightmap = ceCateye::instance()->scene()->loadTexture("L_sm.jpg");
    auto ambientmap = ceCateye::instance()->scene()->loadTexture("L_lm.jpg");
    L_lm->setTexture(lightmap, ceModel::TextureLightmap);
    L_lm->setTexture(ambientmap, ceModel::TextureAmbient);
    L_lm->setProgram(lightmapProgram);
    ceCateye::instance()->scene()->addTask(std::shared_ptr<Chicken>(new Chicken(6, 0, 3, 1, 25)));//код курицы - на основе состояний, 2 сек ходит 1 сек клюёт еще с десяток строк
    ceCateye::instance()->scene()->addTask(std::shared_ptr<Chicken>(new Chicken(12, 0, 6, 1.5, -60)));
    ceCateye::instance()->scene()->addTask(std::shared_ptr<Chicken>(new Chicken(12, 0, 2, 2.0, 60)));
    ceCateye::instance()->start();
}

UPD:
4 часа еще на волка потратил

pozitiffcat 24.12.2013 00:23

Ответ: Clear Engine (Понятный движок)
 
Запилил моушены. Это заданный последовательный набор движений объекта на сцене. Впринципе не только объекта сцены, в моушен положить можно что угодно.
В сцене хранится MotionDispatcher, в нем можно создавать нити MotionThread, путем ручного создания или загрузки из xml файла. Все нити работают асинхронно. В каждой нити хранится список действий Motion, которые воспроизводятся поочереди, одно действие может хранить несколько в себе. К нити можно присвоить объект MotionObject, тогда он будет передаваться в контексте Motion.
Пример:
Я хочу что-бы волк шел потом шел и поворачивал, затем бил лапами и шел дальше, и так бесконечно. Как это сделать.
По дефолту у нас нет реализации моушенов, их надо запилить. (в дальнейшем подумаю над стандартными)
Код:

class MotionMove : public ceMotion, public ceMotionConstructor{
public:
    // при загрузки из файла движок будет сам создавать нужный моушен
    std::shared_ptr<ceMotion> createMotion(){
        return std::shared_ptr<MotionMove>(new MotionMove);
    }

    // перезагрузка класса в этом методе
    void setParams(const std::string &params){
        m_moveDistance = atof(params.c_str());
    }

    // само действие
    bool doMotion(const std::shared_ptr<ceMotionContext> &motionContext, double frameTime){
        // из контекста получаем объект и двигаем
        std::static_pointer_cast<ceModel>(motionContext->motionObject())->moveForward(frameTime);
        m_moveDistance -= frameTime;
        return m_moveDistance > 0;
    }

private:
    float m_moveDistance;
};

И в том же духе остальные действия, которые будут в игре.
Все классы нужно зарегистрировать под каким-то именем я буду называть это имя класса в xml файле
Код:

engine->scene()->motionDispatcher()->registerMotionConstructor("MotionMove", std::shared_ptr<MotionMove>(new MotionMove));
// register any classes

Все, с регистрацией классов покончено, впринципе можно создать личную библиотеку моушенов и юзать в любом своем приложении.
Теперь как загрузить нить.
Пример xml файла
Код:

<cet>
    <motion class="MotionChangeAnimation" params="1;10;1;10" />
    <motion class="MotionMove" params="9" />
    <motion together="1">
        <motion class="MotionMove" params="3" />
        <motion class="MotionRotate" params="-160;3" />
    </motion>
    <motion class="MotionChangeAnimation" params="11;20;0;10" />
    <motion class="MotionWaitFinishModelAnimation" params="" />
    <motion class="MotionRestart" params="" />
</cet>

Видно, что мы создаем моушен, имя класса это то имя с которым мы зарегистрировали, строка параметров будет передаваться при перезагрузке класса, а именно в setParams, там мы его ручками парсим
Если наш моешен должен выполнять одновременно несколько действий, например ходьба и поворот, то нам в моушен нужно вложить несколько моушенов, причем атрибут together отвечает за то, как будут выполняться моушены, по очереди или сразу все.
Теперь как загрузить этот файл в коде программы:
Код:

m_motionThread = m_wolf->parentScene()->motionDispatcher()->loadMotionThread("wolf_motion.cet");
m_motionThread->setMotionObject(m_wolf);
m_motionThread->setListener(this);

Тут загружается сама нить, после того как она загружена моушены начнут сразу работать. Важно задать объект для контекста так как мы хотим его в дальнейшем использовать, и последнее нить умеет возвращать callback'и.

Ну как-то так

moka 24.12.2013 00:48

Ответ: Clear Engine (Понятный движок)
 
Когда речь идёт о "простом" или "удобном" движке, то речь идёт о самом приятном и "гладком" пути обучения для программиста, и добавление абстракций подобных Motion, только усложняет этот процесс. Заместо того чтобы разраб изучал топик и сам начинал мыслить как разраб, разные решения пытаются предлагать всякие абстракции, типо помогая разрабу, на самом деле лишь сбивает и тормозит.

Mr_F_ 24.12.2013 00:59

Ответ: Clear Engine (Понятный движок)
 
Цитата:

В сцене хранится MotionDispatcher, в нем можно создавать нити MotionThread, путем ручного создания или загрузки из xml файла. Все нити работают асинхронно.
Цитата:

std::static_pointer_cast<ceModel>(motionContext->motionObject())
Цитата:

Все классы нужно зарегистрировать
Асинхронные нити, контексты, регистрировать классы? Ради того чтобы моделька лапами подрыгала? Да ты издеваешься, специально придумал самую мудрёную конструкцию, чтобы юмористически контрастировала с названием твоего движка? :D

pozitiffcat 24.12.2013 09:08

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от moka (Сообщение 271826)
Когда речь идёт о "простом" или "удобном" движке, то речь идёт о самом приятном и "гладком" пути обучения для программиста, и добавление абстракций подобных Motion, только усложняет этот процесс. Заместо того чтобы разраб изучал топик и сам начинал мыслить как разраб, разные решения пытаются предлагать всякие абстракции, типо помогая разрабу, на самом деле лишь сбивает и тормозит.

не ну, стандартная библиотека моушенов естественно будет, лучше так чем никак

pozitiffcat 24.12.2013 09:11

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от Mr_F_ (Сообщение 271827)
Асинхронные нити, контексты, регистрировать классы? Ради того чтобы моделька лапами подрыгала? Да ты издеваешься, специально придумал самую мудрёную конструкцию, чтобы юмористически контрастировала с названием твоего движка? :D

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

Mr_F_ 24.12.2013 12:38

Ответ: Clear Engine (Понятный движок)
 
Цитата:

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

Animate (wolf, wolf_run)
Делать какие-то действия, ждать их завершения и делать следующие - это распространённая задача в играх и касается далеко на только анимаций.
Наблюдал реализацию этой фишки в скриптовых движках, что мне кажется довольно удобным.
Например, в первой Мафии такой скрипт выглядел бы так:
Код:

label 1
model_playanim 0, "wolf_walk", 1 // записывает время анимки в переменную 1
wait flt[1] // ждём окончания
model_playanim 0, "wolf_turn", 1
wait flt[1]
model_playanim 0, "wolf_paws", 1
wait flt[1]
goto 1

а в юнити с C# он бы мог выглядеть так:
Код:

IEnumerator loop()
{
 animation.CrossFade(wolf_walk);
 yield return new WaitForSeconds(animation["wolf_walk"].length);
 animation.CrossFade(wolf_turn);
 yield return new WaitForSeconds(animation["wolf_turn"].length);
 animation.CrossFade(wolf_paws);
 yield return new WaitForSeconds(animation["wolf_paws"].length);
}

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

---
алсо, как в мафе, так и в юнити, нет реальной асинхронности у этих штук (ибо не нужно), виртуальная машина просто умеет не обновлять скрипт, пока условие не выполнено, чекая его время от времени.

pozitiffcat 24.12.2013 17:28

Ответ: Clear Engine (Понятный движок)
 
Не понимаю что мешает запилить тоже самое у меня, добавь нужный моушен в рантайме, в котором ты будешь крутить свои действия и все, и не обязательно к модели их привязывать, ты хоть каждые 5 сек сцены переключай, возможности не ограничиваются.

moka 24.12.2013 17:53

Ответ: Clear Engine (Понятный движок)
 
Смотри на вещи глазами нуба разраба. Разве он читая эти: motionContext, motionDispatcher, registerMotionConstructor и куча всего поймёт о чём идёт речь вообще, до того как сможет это использовать?

Посмотри на современные технологии, все технологии, железо, софт, да даже тупо электроника и быт - выживает только самое простое, почему? Да потому что простые вещи, проще понять и приступить к их использованию.
Почему JavaScript самый популярный и используемый язык, который за несколько последних лет многократно увеличивает свою популярность?
Потому что он тупо прост.

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

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

Топик у тебя: Clear - понятный. Значит ты ставишь на первое место пользователя. Любой проект для успешного разраба, имеет политику которая влияет на методы и идеи при разработке - если ставишь на первое место разраба, так учитывай это при разработке, начинай с простого продумывания интерфейса для самого разраба, а потом с имплементации.

ABTOMAT 24.12.2013 18:50

Ответ: Clear Engine (Понятный движок)
 
Насчёт ожидания завершения действия.
Вот как сделано это в jQuery:

foobar.animate(params, что-делать-после-завершения-анимации);

На мой взгляд, очень просто этим пользоваться.
Не знаю, правда, возможна ли подобная конструкция на С++

moka 24.12.2013 19:40

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от ABTOMAT (Сообщение 271847)
Насчёт ожидания завершения действия.
Вот как сделано это в jQuery:

foobar.animate(params, что-делать-после-завершения-анимации);

На мой взгляд, очень просто этим пользоваться.
Не знаю, правда, возможна ли подобная конструкция на С++

callback'и - это достояние event-driven парадигмы языка.
В C++ ты по сути можешь передать pointer на функцию (самый простой вариант?), если ещё lambda функции (подходят тут?) и anonymous функции (это по сути то что и есть в js).

Да и не jQuery а java-script, т.к. этот паттерн с каллбэками был задолго до jQuery.

Есть ещё promises паттерн, и использует chain'ы для выражения последовательности действий. Круто то что можно иметь динамично определяющуюся цепь анимаций:

PHP код:

player.animation
  
.do('walk')
  .
delay(1000)
  .do(
'run', { speed40 });

...
if (
player.hit) {
  var 
currentAnimation player.animation.current;

  
player.animation
    
.cancel()
    .do(
'hit')
    .
delay('500')
    .do(
curentAnimation);

  if (
curentAnimation == 'run') {
    
player.animation
      
.params({ speed20 })
      .
delay(1000)
      .
params({ speed40 })
  }


Как пример набросок, это паттерн chaining. Анимирует походку затем через секунду начинает бежать быстро. Где-то в цикле, если игрока ударили, отменяет текущую анимацию, затем анимирует что его ударили, затем через 500 мс возвращает предыдущую анимацию. Если она была "бег", то сперва поставит медленный бег, затем через секунду обратно на скорость 40.
Как пример.

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

Но удобство в том что ты можешь добавлять в цепочку разные стейты, отменять их, и манипулировать по разному. Также дать разрабу возможность расширять цепочку и влиять на стейт прямым образом.


Самый простой пример использования:
PHP код:

player.animation.do('run'); 

Установит анимацию на бег.
По сути разраб может юзать такой фреймворк как угодно, используя chaining или не используя и менеджить это сам.

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


Имея примитивные методы работы с костями, группами костей, установки кадра кости/группы - по сути самое примитивное, что должен иметь изначально разраб. Это даст ему возможность уже анимировать. Далее не теряя возможности иметь такой низкий уровень, добавляй слоёв, но таким образом что нижний слой об этом и не догадывается.

И разраб уже сам выберет что ему по душе.

Samodelkin 24.12.2013 22:52

Ответ: Clear Engine (Понятный движок)
 
Какие тут могут быть обсуждения синтаксиса? Делать для нубов значит делать GUI и никакого программирования!

Цитата:

Почему JavaScript самый популярный и используемый язык, который за несколько последних лет многократно увеличивает свою популярность?
Самый популярный Си, JavaScript на 11 месте.

Nikich 25.12.2013 01:55

Ответ: Clear Engine (Понятный движок)
 
Java из-за android так высоко в рейтинге?

SBJoker 25.12.2013 02:30

Ответ: Clear Engine (Понятный движок)
 
Да сколько же вы будите путать Java и JavaScript уже?!!

moka 25.12.2013 04:17

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от Samodelkin (Сообщение 271857)
Какие тут могут быть обсуждения синтаксиса? Делать для нубов значит делать GUI и никакого программирования!


Самый популярный Си, JavaScript на 11 месте.

Если ты прочитал внимательно методику составления рейтинга, то узнаешь о том что он базируется на количестве поисков и запросов, а также материалов в интернете по разным языкам. А не о их популярности вовсе. Если с одним языком у тебя куча проблем и нужно постоянно ссылаться в гугл, а с другим нет, это не знчит что первый более популярен.

В довесок к своим словам, я тебе покажу статистику на 2013, от github'а, котороые уж как никак, а имеют получше данные для статистики:
http://adambard.com/blog/top-github-...r-2013-so-far/

И ещё одна картинка, с количеством вопросов (stackoverflow) и та же таблица популярности на гитхабе (горизонтально)


Цитата:

Сообщение от Nikich (Сообщение 271861)
Java из-за android так высоко в рейтинге?

Java до сих пор считается "стабильным" Enterprise решением, бизнесов и индустрий, которые ужасно не поворотливы и не адаптируются к новым технологиям без боли. Также Android да, но больше думаю банки, финансы, гос учреждения, и ещё не мало "классических" индустрий.

Mr_F_ 25.12.2013 12:31

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Почему JavaScript самый популярный и используемый язык
как будто ты в вебе у тебя много вариантов)
это скорее говорит о том, что большинство кодеров - вебщики.

Samodelkin 25.12.2013 12:56

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от moka
Если ты прочитал внимательно методику составления рейтинга, то узнаешь о том что он базируется на количестве поисков и запросов, а также материалов в интернете по разным языкам. А не о их популярности вовсе. Если с одним языком у тебя куча проблем и нужно постоянно ссылаться в гугл, а с другим нет, это не знчит что первый более популярен.

В довесок к своим словам, я тебе покажу статистику на 2013, от github'а, котороые уж как никак, а имеют получше данные для статистики:
http://adambard.com/blog/top-github-...r-2013-so-far/

Ну сообщи в TIOBE, что они не компетентны и покажи им как работают настоящие профи. Я просто взял ссыль на которую ссылаются в хабре.

Насчет github - там не адекват, потому что в том же googlecode противоположно другие, в каком-нибудь bitbucker третьи - они отражают только то что в одних сервисах удобней размещать проекты на одних языках, в других - на других.

upd:
Еще раз прочитал про TIOBE
Цитата:

The ratings are based on the number of skilled engineers world-wide, courses and third party vendors. Popular search engines such as Google, Bing, Yahoo!, Wikipedia, Amazon, YouTube and Baidu are used to calculate the ratings.
Написано же что базируется на продвинутых пользователях, курсах, разрабах. И для этого используются поисковики. Это не значит что поисковики используются для кол-ва запросов от нубов. Иначе сам рейтинг был бы весьма нубский.

Samodelkin 25.12.2013 18:46

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от moka
callback'и - это достояние event-driven парадигмы языка.
В C++ ты по сути можешь передать pointer на функцию (самый простой вариант?), если ещё lambda функции (подходят тут?) и anonymous функции (это по сути то что и есть в js).

Я думаю функторы подойдут.


Часовой пояс GMT +4, время: 15:27.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot