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)

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

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


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

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