Pull to refresh

Comments 26

glBegin(GL_QUADS);
glVertex2f(-1.0f, 1.0f);
glVertex2f(1.0f, 1.0f);
glVertex2f(1.0f, -1.0f);
glVertex2f(-1.0f, -1.0f);
glEnd();

Ой! Сожгите, пожалуйста, вашу методичку, учебник, что у вас там. OpenGL 1.0, созданный в 1992 году, к данному моменту сильно устарел. Его поддержка сейчас имеется на десктопах, и то в режиме эмуляции. В современных драйверах видеокарт это приводит к проблемам с производительностью — на старых драйверах программы работают лучше, чем на новых.

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

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

//https://github.com/Glebanister/ample/blob/76f20b27e15366f38dd351ec34506d323d002091/core/src/Graphics/Shaders/Shader.cpp
sstr << shaderStream.rdbuf();
if (!sstr.good() || !shaderStream.good())
{
       throw exception::Exception(exception::exId::FILE_READ,
                                   exception::exType::CASUAL);
}

То есть, тут ошибка stream переводится в исключение. Но зачем — stream сам умеет швырять исключения, нужно только настроить.
Хотелось кидаться исключениями, которые умеют красиво себя выводить, и которые знают о произошедшей ошибке немного больше, чем стандартные. Поэтому у истоков проекта был написан Exception, его дочерние исключения умеют обрабатывать ошибки OpenGL и SDL2, например вот так:
exception::OpenGLException::handle();
довольно удобно. Exception был написан давно и не самым лучшим способом, пользоваться им для обработки ошибок, которые не связаны с графикой не очень удобно, мне стоит переписать это.
Рассмотрите, на правах идеи, добавление в исключения __FILE__ и __LINE__ места, где оно выбросилось. Для отладочной сборки бывает полезно.
Как-то пытался писать свой движок в одиночку, к сожалению в какой-то момент потерял исходный код последней версии и забил, осталась копия, но чуть более старая. Движок писать долго, работа и получение денег всё же победили. Так же нашел для себя другой pet проект, которым начал заниматься. Думаю чуть позже вернуть к движку

Вот пример одной из начальных версий
www.youtube.com/watch?v=hl0eIBFhKKk

К сожалению разработка движка сжирает просто огромное количество времени, настолько огромное, что я хотел прикрутить к двигу AngelScript и на нём оформлять логику по типу плагин системы, так как AS позволяет в реалтайме менять логику. Писать двиг это вливать время в пустоту, но очень интересно) Движков, кстати очень много валяется на гите, можно изучать
UFO just landed and posted this here
Не очень понятно, что значит написать движок и компилятор. Еще не очень понятно, что значит написать движок под питон: чтобы в нем можно было писать скрипты на этом языке? В нашем движке планируется связки с Python 3, если вопрос в этом.
Эх, уже больше 15 лет прошло. После учебного Delphi хотелось «настоящего» программирования, тоже взялся за написание 3д-движка. Тоже С++ и OpenGl. Запала хватило на написание импорта моделей с текстурами, управления камерой и движением с прыжками :)
Иногда от осознания того, сколько всего еще предстоит сделать хотелось все бросить. Останавливало то, что этот проект уже был заявлен как учебный, значит нужно было его доделать любой ценой ) Вот после сессии планировал сделать импорт моделей, у нас сейчас все объекты — это параллелипипеды и правильные многоугольники
Хорошая статья, и работа проделана немалая.
Но если вы планируете на этом движке писать мало-мальски сложную игру, советую отказаться от концепции объекта с виртуальными методами и смотреть в сторону паттерна entity component system. Например, библиотеки EnTT. Они позволяют эффективно использовать кэш CPU и избежать накладных расходов от виртуальных методов а-ля update.
Также, я бы посоветовал всё же заморочиться и заинтегрировать окно движка в Qt окно для целей редактирования. Сейчас работаю в компании, где огроменный игровой редактор написан на imgui и также интегрирован в игру, и подправлять что-то в нём это боль. Ни шорткатов тебе нормальных, ни окошек, не редактор, а какой-то среднеазиатский рынок, уж простите.
Большое спасибо)
Мы решили, что Dear Imgui будет гораздо проще внедрить в проект, и времени на её изучение понадобится гораздо меньше. Qt, конечно, предоставляет больше возможностей, но недостаток времени сыграл решающую роль.
void onActive():
onActive()
for sb in subBehaviors:
sb.onActive()

Статья огонь, только что это за странный питоний синтаксис? У вас там какой-то препроцессор все это дело обрабатывает?

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

А есть код подсмотреть как выглядят ваши стейтмашинные блюпринты?

Я имел ввиду вот те штуки которые отображаются в редакторе. Хотел подглядеть как вы линии между виджетами дорисовываете. Оно оказывается через imnodes скрафчено

Задача хорошая в плане понимания, а вот автору советую прекратить использовать OpenGL первой версии. Это бесполезный инструмент. Учите GLSL и вперед!
Уже не используем, это был первый Hello World, сейчас все немного современнее, с шейдерами и вершинными буфферами.
Вот например VertexArray.cpp
И даже самые простые шейдеры: Shaders
Обратите внимание на это:
     result[i * 3 + 0] = vector[i].x;
     result[i * 3 + 1] = vector[i].y;
     result[i * 3 + 2] = vector[i].z;

Это стандартный код, побуждающий сделать стандартную ошибку — эффект последней строки.
Даже Кармак на этом ловился:
if (fabs(dir[0]) > test->radius ||
    fabs(dir[1]) > test->radius ||
    fabs(dir[1]) > test->radius)
(Q III)

Решение — пользоваться массивами и писать циклы.
Я согласен с вами, что это не пример не очень хорошего кода, но функция, в которой он написан так и называется: expand, раскрывает массив трехмерных координат {{x1, y1, z1}, {x2, y2, z2}} в массив чисел, который можно затем передать в OpenGL {x1, y1, z1, x2, y2, z2}. Во всем проекте не очень удобно оперировать вершинами без структуры Vector3d, содержащей трехмерные координаты, и так могло бы потенциально образоваться гораздо больше ошибок, чем если в одном месте пожертвовать красотой кода, написав такую развертку.
Планируется ли впиливание Lua или какого-нибудь другого скриптового языка в движок?
Да, уже связываю с Python 3, почему-то решил начать с него. Уже получилось с помощью SWIG сделать обертку над C++ кодом, теперь осталось только научиться вызывать написанные на Python скрипты из C++. В теории не должно возникнуть сложностей и с другими языками, как Lua, например, SWIG обо всем позаботится.

По набору фичей для первого курса неплохой результат. Правда в реальной разработке совсем другие проблемы — миддлвара затачивается под реальные задачи использующих её приложений, и это сильно меняет процесс постановки и решения задач.
Как мне кажется, сейчас вы просто смотрите на чужие движки и делаете себе такое же. Но в коммерческой разработке такой подход будет только мешать. Я думаю, что движок эффективнее делать под конкретную игру — тогда вы получите более релевантный опыт. Так-то на рынке много программистов, умеющих реализовать сферический движок в вакууме. Но обычно эти решения не позволяют получить прибыли при использовании на реальных проектах, призванных приносить деньги. А вот программистов, оптимизирующих движки под нужды целевого проекта, — мало, они более эффективны и высоко ценятся работодателями.

Да, на первом курсе задача у нас в этом году примерно так и ставится: сделать что-нибудь работающее, в ~первый раз потренироваться в командной разработке и проектах на C++ длиннее нескольких недель. Не требуется научной новизны, прорывов или даже детального изучения предметной области или разумного выбора технологий.


По верхам прошлись, грабли пособирали, что-то слепили и поняли, как не надо делать — уже здорово.


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

А между тем выглядит вполне интересно. Думается, стоит таки продолжать развивать проект.
Sign up to leave a comment.