Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Разработка игрового движка с нуля
GAMEINATOR forums > Общие разделы > Создание и модификация игр. Геймдев.
Страницы: 1, 2, 3
autistic
Пилю в свободное время графический движок https://bitbucket.org/mkbkompas/engine
Что-то с проекцией не то:


Треугольник равносторонний: (-0.5, -0.5, 0), (0.5, -0.5, 0), (0, 0.5, 0)
Клиентский код:
+

Код
#include <engine/platform.h>
#include <engine/renderer.h>

std::string vertexShaderSrc =
"\n\
attribute vec4 vertexPosition;\n\
uniform mat4 modelViewProj;\n\
void main()\n\
{\n\
  gl_Position = modelViewProj * vertexPosition;\n\
}\n\
\0";

std::string fragmentShaderSrc =
"\n\
void main()\n\
{\n\
  gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0);\n\
}\n\
\0";

struct Vertex
{
    float x, y, z;
};

Vertex vertices[] = {
    {-0.5f, -0.5f, 0},
    {0.5f, -0.5f, 0},
    {0.0f,  0.5f, 0},
};

unsigned short indices[] = {
    0, 1, 2
};

int main()
{
    Engine::Platform *platform = Engine::GetPlatform();
    if (!platform->CreateMainWindow())
        return -1;

    Engine::Renderer *renderer = Engine::GetRenderer();

    size_t size = vertexShaderSrc.size();
    const Engine::Byte *pVertShaderData = reinterpret_cast<const Engine::Byte*>(vertexShaderSrc.data());
    Engine::ByteVector vertexSrc(pVertShaderData, pVertShaderData + size);

    size = fragmentShaderSrc.size();
    const Engine::Byte *pFragShaderData = reinterpret_cast<const Engine::Byte*>(fragmentShaderSrc.data());
    Engine::ByteVector fragSrc(pFragShaderData, pFragShaderData + size);

    auto progId = renderer->CreateGpuProgram(Engine::STATIC_VERTEX, vertexSrc, fragSrc);
    renderer->BindGpuProgram(progId);

    const Engine::Byte *pVertData = reinterpret_cast<const Engine::Byte*>(vertices);
    Engine::ByteVector verts(pVertData, pVertData + sizeof(vertices));

    const Engine::Byte *pIndexData = reinterpret_cast<const Engine::Byte*>(indices);
    Engine::ByteVector inds(pIndexData, pIndexData + sizeof(indices));

    auto buffId = renderer->CreateHardwareBuffer(Engine::STATIC_VERTEX, verts, inds);

    Engine::Matrix4 proj, model, modelViewProj;
    proj.SetPerspective(1.3f, 1.78f, 1.0f, 100.0f);
    model.SetTranslation(Engine::Vector3(0, 0, -1.5f));
    modelViewProj = model * proj;

    renderer->SetGpuProgramConstant(progId, "modelViewProj", modelViewProj);

    platform->SetMainWindowSize(1280, 720, true);
    renderer->SetViewport(1280, 720);

    for (;;) {
        if (!platform->UpdateMainWindow()) {
            break;
        }

        renderer->BeginRenderFrame();
        renderer->DrawHardwareBuffer(buffId);
        renderer->EndRenderFrame();
    }

    renderer->DestroyHardwareBuffer(buffId);
    renderer->DestroyGpuProgram(progId);
}


Нука быстра, помогите найти в чем проблема, пожалуйста?
Diesel
proj.SetPerspective(1.3f, 1.78f, 1.0f, 100.0f);

Я не спец. Если честно, вообще не шарю. Так что не пинайте.

Я как увидел файл СиМаки, решил задать вопрос: а что все в последнее время так в неё ударились?
autistic
Цитата(andreyholkin @ 04.12.2017, 00:32) *
proj.SetPerspective(1.3f, 1.78f, 1.0f, 100.0f);

А что здесь не так? Вроде правильно проекцию строю:
1-й параметр - угол обзора в радианах, 1.3 рад = 75 градусов
2-й параметр - соотношение сторон экрана монитора 16:9 = 1.7(7)
3-й параметр - ближняя плоскость отсечения
4-й параметр - дальняя плоскость отсечения

Код ф-ии SetPerspective тут
Формула, по которой строится матрица тут, внизу страницы
Вроде верно все, но мои глаза говорят мне обратное =/

Цитата(andreyholkin @ 04.12.2017, 00:32) *
а что все в последнее время так в неё ударились?

Я нахожу удобство этой системы сборки в том, что она позволяет абстрагироваться от среды разработки и версии компилятора, лишь бы поддерживал стандарт С++11
Trollz0r
А если сделать окно 1280х768?

А если отрисовать в 5:4 1280х1024?

А билд для тестирования уже есть?
jamakasi
refuse, сдается мне ты запустил его, поменял размер окна или его что то другое изменило но не пересчитал proj.SetPerspective(1.3f, 1.78f, 1.0f, 100.0f) второй параметр =)
Высчитывай его динамически. Так же возможно ошибка закралась в самой функции SetPerspective.
Код
void SetPerspective(float fov, float aspect, float znear, float zfar)
        {
            assert(aspect && fov > 0 && fov < M_PI && znear < zfar); //а может быть ... aspect > 0 && fov > 0 .... ?)

            const float m22 = 1.0f / tanf(fov / 2.0f);
            const float m11 = m22 / aspect;
            const float m33 = zfar / (znear - zfar);
            const float m34 = -1.0f;
            const float m43 = znear * m33;

            x = { m11 * 1.5f, 0, 0, 0 }; //А тут что за магия 1.5f ?
            y = { 0, m22, 0, 0 };
            z = { 0, 0, m33, m34 };
            w = { 0, 0, m43, 0 };
        }

ps как же вырвиглазно выглядит с++ bad.gif

Я конечно не знаю зачем с нуля делать двиг но мне в студенческие годы очень понравился SFML как либа для старта своего двигла и Irrlicht как уже готовый двиг =)
Diesel
Как там в 3d? Это вид с верху. Сейчас в Максе собрал по координатам треугольник.


По координатам, треугольник не может быть равносторонним.

Основание 1
Остальные стороны: каждая больше 1
Пифагор приде: биссектриса 1, основание 1
Trollz0r
Андрей прав, по координатам треугольник действительно равнобедренный, глаза не врут death.gif
Молния в вакууме
Подтверждаю, длинна нижней грани совпадает с расстоянием от неё же до верхней точки.
Цитата(jamakasi @ 04.12.2017, 10:34) *
как же вырвиглазно выглядит с++

Там в новых стандартах вообще какую-то дичь делают, добавили этот using = вместо typedef, просто чтобы был и портил совместимость со старыми компиляторами, лямбда с ужасным синтаксисом, типа такого: [&] (int a, int b ) -> float { ... }. Лучше уж Objective-C.
Еще auto для тех, кому лень писать имя типа, но эта штука с совсем древними компиляторами в которых есть ещё неявный int будет работать иногда. Я например представленный движок собрал в C++ Builder 6, auto не заменял и всё ровно запустилось.
Tron
Цитата(andreyholkin @ 02.12.2017, 18:52) *
Говорят китайцы виноваты, а не мы.

изначально китайцы слили. все старье.
хавок триальный кстати
Diesel
А зачем писать графический движок?
https://ru.wikipedia.org/wiki/OpenGL
https://ru.wikipedia.org/wiki/DirectX
Эти же не просят лицензии покупать.

Я понял - это программа импортозамещения. Придёт пора, придёт Рогозин и внедрит это.
А почему падают ракеты? Виной тому, то что у нас нет своего хорошего программного обеспечения, или то что оно импортное?
Молния в вакууме
Цитата(andreyholkin @ 04.12.2017, 13:38) *
А зачем писать графический движок?
https://ru.wikipedia.org/wiki/OpenGL
https://ru.wikipedia.org/wiki/DirectX
Эти же не просят лицензии покупать.

Так это и не графические движки, а просто API для доступа к видеокарте.
Diesel
Цитата(saas @ 04.12.2017, 15:43) *
Цитата(andreyholkin @ 04.12.2017, 13:38) *
А зачем писать графический движок?
https://ru.wikipedia.org/wiki/OpenGL
https://ru.wikipedia.org/wiki/DirectX
Эти же не просят лицензии покупать.

Так это и не графические движки, а просто API для доступа к видеокарте.

Я не спец. И что в x-ray является графическим движком? Где он зарыт?
Молния в вакууме
andreyholkin, в xrRender_R1,R2,R3,R4.
Diesel
Цитата(saas @ 04.12.2017, 16:09) *
andreyholkin, в xrRender_R1,R2,R3,R4.

Стало доходить. Вообще я думал, что это узлы связи неких визуальных потребностей.
Если честно, то я и впрямь думал, что DirectX9-11 это графический движок.
Diesel
http://media.moddb.com/images/mods/1/26/25940/ssr.jpg
Не подскажите тему, как это сделать? Отражение в воде.
Diesel
Ткнули носом в ОГСЕ. Отбой.
autistic
Цитата(andreyholkin @ 04.12.2017, 12:39) *
По координатам, треугольник не может быть равносторонним.

Цитата(RedPython @ 04.12.2017, 13:25) *
Андрей прав, по координатам треугольник действительно равнобедренный, глаза не врут

Цитата(saas @ 04.12.2017, 14:49) *
Подтверждаю, длинна нижней грани совпадает с расстоянием от неё же до верхней точки.

Ох, позор на мою седую голову, верно же! >_<

Цитата(andreyholkin @ 04.12.2017, 15:38) *
А зачем писать графический движок?

Иногда полезнее иметь собственное простое и доступное решение, чтобы протестировать что-то или дему какую-нить запилить, нежели раскатывать монструозный движок с гигабайтной документацией к нему (и кучей чужих багов впридачу). Ну и вопрос с лицензированием, само собой, не на последнем месте стоит.

Цитата(RedPython @ 04.12.2017, 12:26) *
А билд для тестирования уже есть?

Эх запилю что-нибудь эдакое! Но это когда уже будет основной каркас более-менее готов.
dPlayer
Цитата(andreyholkin @ 04.12.2017, 17:34) *
Не подскажите тему, как это сделать? Отражение в воде.

Отзеркалировать геометрию под террейн biggrin.gif wink.gif
jamakasi
Цитата(refuse @ 04.12.2017, 21:27) *
Иногда полезнее иметь собственное простое и доступное решение, чтобы протестировать что-то или дему какую-нить запилить, нежели раскатывать монструозный движок с гигабайтной документацией к нему (и кучей чужих багов впридачу). Ну и вопрос с лицензированием, само собой, не на последнем месте стоит.

Ну так это, у sfml лицензия zlib:
Цитата
  • ПО используется «как есть» — его авторы снимают с себя ответственность за проблемы, связанные с его использованием.
  • На распространение изменённых версий ПО накладываются следующие ограничения:

  1. Запрещается утверждать, что это вы написали оригинальный продукт;
  2. Изменённые версии не должны выдаваться за оригинальный продукт;
  3. Уведомление о лицензии не должно убираться из пакетов с исходными текстами.


Данная лицензия не требует обязательного распространения исходных текстов вместе с продуктом.

Что может быть удобнее чем такой лаконичный пример для 3d https://gist.github.com/kenpower/4018118 или такой https://www.sfml-dev.org/tutorials/2.4/graphics-draw.php для 2d ?) Все проблемы абстракции решены, матан и потоки уже тоже отточены годами и юзаются элементарно. Нафига нужен свой колхоз, или просто лень в случае успеха в титрах\описании внести строчку что "used awesome sfml lib" ?))
autistic
Цитата(jamakasi @ 05.12.2017, 00:06) *
Что может быть удобнее чем такой лаконичный пример для 3d

Боян же, там FFP во все поля. Ты покажи пример где SM реализована, да так чтобы я без проблем мог кастомные шейдера писать, и чтобы удобно было smile.gif

Цитата(jamakasi @ 05.12.2017, 00:06) *
Все проблемы абстракции решены, матан и потоки уже тоже отточены годами и юзаются элементарно. Нафига нужен свой колхоз

Сказки все это, там точно такой же колхоз и багло там плавает годами, как и везде. Свой колхоз ценен тем, что я имплеменчу только то что буду использовать и не забиваю голову поддержкой 100500 различных фичей на все случаи жизни, которые мне никогда не понадобятся.
tom-m15
Надо бы шапку темы оформить, кто займется?
Diesel
Цитата(tom-m15 @ 05.12.2017, 01:46) *
Надо бы шапку темы оформить, кто займется?





Читать
Места для курения: нормативы и требования

Борьба с курением подразумевает не только меры по снижению курения, но и способы оградить некурящих от табачного дыма, не ущемив при этом конституционные права и тех и других. Именно по этой причине в тех местах, где курение ограничено согласно законодательству (Федеральный закон от 10 июля 2001 года N 87-ФЗ "Об ограничении курения табака") необходимо оборудовать место для курения — в соответствии с правилами пожарной и санитарной безопасности.

Закреплено Конституцией

Отсутствие такого места при запрете на данной территории курения, может быть расценено как нарушение прав человека. Согласно Конституции РФ ограничения личных прав не допускаются, в том числе по такому признаку как курение. В Трудовом Кодексе тоже указано, что ограничения в приеме на работу по качествам, не связанным с должностными обязанностями, незаконны и могут быть обжалованы в суде.

Оставив в стороне юридическую казуистику и споры (надо признать, бесконечные) на тему курильщики ущемляют права некурящих или наоборот, попытаемся найти «общий знаменатель», который охарактеризовал бы требования к местам для курения.

Общие требования к организации мест для курения

Места для курения — как неизолированная площадка, так и курительная комната — должны быть изолированы ото всех помещений, так или иначе связанных с осуществлением рабочего процесса. Отдельная изолированная комната для курения должна быть организована на предприятиях численностью от 200 человек и более. «Курилки» недопустимо устраивать в санитарно-бытовых помещениях, в том числе санузлах общего пользования, столовых, мест отдыха, медпунктов и т. п.

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

При этом (в том числе с целью избежать нерациональных потерь времени в рабочее время) до помещений для курения расстояние не должно быть больше 75 метров в зданиях и не более 150 метров от рабочих мест на производственной или строительной площадке. Минимальное расстояние — 5 метров.

Пожарные требования

Места, предназначенные для курения, должны быть обозначены специальными знаками, согласно ГОСТ Р 12.4.026-2001 — это знак М15 «Курить здесь».




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

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

Санитарно-гигиенические требования

Место для курения должно хорошо проветриваться естественным образом (но при этом должно быть исключено попадание воздуха из «курилки» на рабочие и бытовые места), либо быть оборудовано вентиляцией.

Мощность вентиляционной системы должны быть рассчитана исходя из санитарных требований СНиП 31-05-2003, и обеспечивать обмен воздуха в рабочем состоянии не менее 10 кубометров в час. Системы вентиляции и кондиционирования всего здания, в том числе помещения для курения, должны быть спроектированы таким образом, чтобы исключить попадание воздуха из курительной комнаты в другие помещения.

В холодное время года температура воздуха в месте, отведенном для курения должна быть не менее 16CєC, для жаркого времени года нормативы не определены.
Diesel
Кто в шейдерах разбирается? Напишите пожалуйста шейдер с отражением в воде для ЗП - народ вас не забудет.
Я пытаюсь ОГСЕ шейдеры править - но там хвостов в другие отрасли хозяйства, что мама не горюй.
С меня магарыч.
jamakasi
Цитата(refuse @ 04.12.2017, 22:57) *
Боян же, там FFP во все поля. Ты покажи пример где SM реализована, да так чтобы я без проблем мог кастомные шейдера писать, и чтобы удобно было smile.gif

Ну просто же https://www.sfml-dev.org/tutorials/2.4/graphics-shader.php
Цитата(refuse @ 04.12.2017, 22:57) *
Сказки все это, там точно такой же колхоз и багло там плавает годами, как и везде. Свой колхоз ценен тем, что я имплеменчу только то что буду использовать и не забиваю голову поддержкой 100500 различных фичей на все случаи жизни, которые мне никогда не понадобятся.

Прелесть в том что тебе не придется наступать на теже грабли годами, а те что известны либо уже пофикшены либо ты о них явно знаешь. Ненужные тебе фичи можно и не юзать и не знать про них. А касательно колхоза, ну давай сделай мне демку с кубиком который будет работать одинаково и вообще будет работать на mac\linux\windows\android и при этом на железе разной тухлости в особенности видяшек hd graphics и при этом потратив на это минимум времени =).
Diesel
Собираю старые версии NeoAxis.
https://yadi.sk/d/FfhexSk23QPM2S
У кого есть версии от 0-2? Версия 2 есть - нужно старее.
autistic
Цитата(jamakasi @ 05.12.2017, 12:20) *

Такая тривиальная обертка точно также просто пишется за пару вечеров своими руками, какой смысл тащить в проэкт стопицот непонятных зависимостей, которые ничего кроме не предлагают?
Код
#pragma comment(lib,"sfml-graphics-d.lib")
#pragma comment(lib,"sfml-audio-d.lib")
#pragma comment(lib,"sfml-system-d.lib")
#pragma comment(lib,"sfml-window-d.lib")
#pragma comment(lib,"sfml-network-d.lib")
#else
#pragma comment(lib,"sfml-graphics.lib")
#pragma comment(lib,"sfml-audio.lib")
#pragma comment(lib,"sfml-system.lib")
#pragma comment(lib,"sfml-window.lib")
#pragma comment(lib,"sfml-network.lib")
#endif

death.gif

Цитата(jamakasi @ 05.12.2017, 12:20) *
Прелесть в том что тебе не придется наступать на теже грабли годами, а те что известны либо уже пофикшены либо ты о них явно знаешь.

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

Цитата(jamakasi @ 05.12.2017, 12:20) *
А касательно колхоза, ну давай сделай мне демку с кубиком который будет работать одинаково и вообще будет работать на mac\linux\windows\android и при этом на железе разной тухлости

Я открою тебе страшную тайну, ни один FFML на свете не спасет от трудностей при разработке и поддержке кроссплатформенного продукта, если этот продукт немного сложнее чем в демка с кубиком. Настрадаешься с тем же самым SFML'ем по самое не балуйся smile.gif

В общем мое мнение таково: если уж и делать выбор между готовым решением и своим колхозом, то это наверняка будет выбор между промышленными движками, вроде Анрила или Крайэнджина, и своим колхозом, но никак не между чужим колхозом и своим колхозом.
autistic
Создал пул реквест в мастер. Нука быстренько пробегитесь по коду, пожалуйста, пока оно туда окончательно не заехало, может где говно пропустил.
abramcumner
Цитата(refuse @ 10.12.2017, 13:35) *
Создал пул реквест в мастер. Нука быстренько пробегитесь по коду, пожалуйста, пока оно туда окончательно не заехало, может где говно пропустил.

Тесты не писал, код не компилировал. Фу таким быть sad.gif

Может сразу асинхронность и тому подобное, а то два сталкера в онлайн выйду и залагает smile.gif
autistic
Цитата(abramcumner @ 10.12.2017, 17:24) *
Тесты не писал, код не компилировал. Фу таким быть sad.gif

Ну не правда же! Тестик написал, скомпилял код.Времени на все маловато, да.
FBX конвертер
Код
#include <exception>
#include <fstream>
#include <iostream>
#include <set>
#include <vector>

#include <fbxsdk.h>

void ConvertMesh(FbxMesh *fbxMesh, std::vector<short> &indices, std::vector<float> &vertices)
{
    if (!fbxMesh->IsTriangleMesh()) {
        throw std::exception("The mesh should be a triangle mesh");
    }

    for (int i = 0; i < fbxMesh->GetPolygonCount(); ++i) {
        for (int j = 0; j < 3; ++j) {
            short index = fbxMesh->GetPolygonVertex(i, j);
            indices.push_back(index);
        }
    }

    const FbxVector4 *controlPoints = fbxMesh->GetControlPoints();
    for (int i = 0; i < fbxMesh->GetControlPointsCount(); ++i) {
        const FbxVector4 &controlPoint = controlPoints[i];
        vertices.push_back(controlPoint[0]);
        vertices.push_back(controlPoint[1]);
        vertices.push_back(controlPoint[2]);
        vertices.resize(vertices.size() + 11);
    }
}

void ConvertMesh(const std::vector<short> &indices, const std::vector<float> &vertices, FbxMesh *mesh)
{
    int count = vertices.size() / 14;
    mesh->InitControlPoints(count);

    const float *verts = vertices.data();
    FbxVector4 *points = mesh->GetControlPoints();

    for (int i = 0; i < count; ++i) {
        float x = *verts++;
        float y = *verts++;
        float z = *verts++;
        verts += 11;
        points[i] = FbxVector4(x, y, z);
    }

    count = indices.size();
    for (int i = 0; i < count; i +=3) {
        mesh->BeginPolygon();
        for (int j = 0; j < 3; ++j) {
            int index = indices[i + j];
            mesh->AddPolygon(index);
        }
        mesh->EndPolygon();
    }
}

void ExportMesh(const char *source, const char *target)
{
    std::vector<short> indices;
    std::vector<float> vertices;

    FbxManager *sdkManager = FbxManager::Create();
    FbxIOSettings *ios = FbxIOSettings::Create(sdkManager, IOSROOT);
    sdkManager->SetIOSettings(ios);

    FbxImporter* importer = FbxImporter::Create(sdkManager, "");
    if (!importer->Initialize(source, -1, sdkManager->GetIOSettings()))
        throw std::exception("Call to FbxImporter::Initialize() failed.");

    FbxScene* scene = FbxScene::Create(sdkManager, "ImportedScene");
    importer->Import(scene);
    importer->Destroy();

    std::ofstream file;
    file.open(target, std::ios::out | std::ios::binary);
    file.write("mdl\0", 4);

    short minor = 1, major = 0;
    file.write((char*)&major, 2);
    file.write((char*)&minor, 2);

    FbxNode *root = scene->GetRootNode();
    for (int i = 0; i < root->GetChildCount(); ++i) {
        std::vector<short> indices;
        std::vector<float> vertices;
        FbxNode *child = root->GetChild(i);
        ConvertMesh(child->GetMesh(), indices, vertices);

        int chunkId = 1, size = indices.size() * 2, fmt = 31;
        file.write((char*)&chunkId, 4);
        file.write((char*)&size, 4);
        file.write((const char*)indices.data(), indices.size() * 2);

        size = vertices.size() * 4;
        file.write((char*)&fmt, 4);
        file.write((char*)&size, 4);
        file.write((const char*)vertices.data(), vertices.size() * 4);
    }

    file.close();
}

void ImportMesh(const char *source, const char *target)
{
    std::vector<short> indices;
    std::vector<float> vertices;

    std::ifstream file;
    file.open(source, std::ios::in | std::ios::binary);
    if (!file)
        throw std::exception("Can't open source file");

    int size;
    file.seekg(12, SEEK_CUR);
    file.read((char*)&size, 4);

    indices.resize(size);
    file.read((char*)&indices[0], size);

    file.seekg(4, SEEK_CUR);
    file.read((char*)&size, 4);
    vertices.resize(size);
    file.read((char*)&vertices[0], size);

    FbxManager *sdkManager = FbxManager::Create();
    FbxIOSettings *ios = FbxIOSettings::Create(sdkManager, IOSROOT);
    sdkManager->SetIOSettings(ios);

    FbxExporter* exporter = FbxExporter::Create(sdkManager, "");
    if (!exporter->Initialize(source, -1, sdkManager->GetIOSettings()))
        throw std::exception("Call to FbxImporter::Initialize() failed.");

    FbxScene *scene = FbxScene::Create(sdkManager, "ExportedScene");
    FbxNode *root = scene->GetRootNode();

    FbxNode *child = FbxNode::Create(sdkManager, "teapot");
    FbxMesh *mesh = FbxMesh::Create(scene, "teapot");

    ConvertMesh(indices, vertices, mesh);

    child->SetNodeAttribute(mesh);
    root->AddChild(child);

    exporter->Export(scene);
    exporter->Destroy();
}

int main(int argc, char *argv[])
{
    try {
        if (argc != 3) {
            throw std::exception("Invalid parameters passed.");
        }

#if 0
        ExportMesh(argv[1], argv[2]);
#elif 0
        ImportMesh(argv[2], argv[1]);
#else
        ExportMesh(argv[1], argv[2]);
        ImportMesh(argv[2], argv[1]);
#endif
    }
    catch (const std::exception &error) {
        std::clog << error.what() << std::endl;
    }
}

Тест
Код
#include <engine/model.h>
#include <engine/platform.h>
#include <engine/renderer.h>

std::string vertexShaderSrc =
"\n\
attribute vec4 vertexPosition;\n\
uniform mat4 modelViewProj;\n\
void main()\n\
{\n\
  gl_Position = modelViewProj * vertexPosition;\n\
}\n\
\0";

std::string fragmentShaderSrc =
"\n\
void main()\n\
{\n\
  gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0);\n\
}\n\
\0";

int main()
{
    Engine::Platform *platform = Engine::GetPlatform();
    if (!platform->CreateMainWindow())
        return -1;

    Engine::Renderer *renderer = Engine::GetRenderer();
    Engine::ModelManager *modelManager = Engine::GetModelManager();
    Engine::ModelPtr teapot = modelManager->GetModel("teapot");
    teapot->Load();
    Engine::HardwareBufferId hardwareBuffer = teapot->GetGraphicsShapes().at(0)->hardwareBufferId;

    Engine::Matrix4 proj, model, modelViewProj;
    proj.SetPerspective(1.3f, 1.78f, 1.0f, 100.0f);
    model.SetTranslation(Engine::Vector3(0, 0, -5.0f));
    modelViewProj = model * proj;

    size_t size = vertexShaderSrc.size();
    const Engine::Byte *pVertShaderData = reinterpret_cast<const Engine::Byte*>(vertexShaderSrc.data());
    Engine::ByteVector vertexSrc(pVertShaderData, pVertShaderData + size);

    size = fragmentShaderSrc.size();
    const Engine::Byte *pFragShaderData = reinterpret_cast<const Engine::Byte*>(fragmentShaderSrc.data());
    Engine::ByteVector fragSrc(pFragShaderData, pFragShaderData + size);

    auto progId = renderer->CreateGpuProgram(Engine::STATIC_VERTEX, vertexSrc, fragSrc);
    renderer->BindGpuProgram(progId);

    renderer->SetGpuProgramConstant(progId, "modelViewProj", modelViewProj);

    platform->SetMainWindowSize(1280, 720, false);
    renderer->SetViewport(1280, 720);

    for (;;) {
        if (!platform->UpdateMainWindow()) {
            break;
        }

        renderer->BeginRenderFrame();
        renderer->DrawHardwareBuffer(hardwareBuffer);
        renderer->EndRenderFrame();
    }

    renderer->DestroyGpuProgram(progId);
}



За ревьюшку спасибо огромное! Завтра поправлю, после работы.

З.Ы. Посоны!? активнее давайте, не стесняйтесь комментировать ревьюшку! Все поправлю, все учту, если по существу будут комментарии.
autistic
Цитата(abramcumner @ 10.12.2017, 17:24) *
Может сразу асинхронность и тому подобное, а то два сталкера в онлайн выйду и залагает smile.gif

Распараллелить - не проблема! Но сначала хочется получить минимальное приложение в духе "As simple as it is." smile.gif
ForserX
Никто не знает API для считывание данных репозитория с Github? Коммиты, релизы, etc.
RedMagic
ForserX, https://developer.github.com/v3/activity/events/types/
abramcumner
Цитата(refuse @ 10.12.2017, 17:58) *
Ну не правда же! Тестик написал, скомпилял код.Времени на все маловато, да.

А как у тебя тогда unique_ptr в shared_ptr сконвертился?
mkbkompas как-то связан с Компас-3Д?
autistic
Цитата(abramcumner @ 10.12.2017, 21:04) *
А как у тебя тогда unique_ptr в shared_ptr сконвертился?

Полагаю конструктор перемещения помог.
Код
template< class Y, class Deleter >
shared_ptr( std::unique_ptr<Y,Deleter>&& r );

https://ideone.com/RTJSyT

Цитата(abramcumner @ 10.12.2017, 21:04) *
mkbkompas как-то связан с Компас-3Д?

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


autistic
Поправил ревью, жду аппрувов.
Diesel
Цитата(refuse @ 11.12.2017, 23:31) *
Поправил ревью, жду аппрувов.

Два слова понял: поправил, жду. biggrin.gif

Помог бы код оптимизации Occlusion Culling в NeoAxis 3.5 завести. Там есть основа, включить не можем.



Кому надо старье PhysX?
https://mega.nz/#F!nlMkSLzb!oYNi4zPdDrU3qyh7wyPdeg
autistic
Цитата(andreyholkin @ 12.12.2017, 00:01) *
Два слова понял

Да все просто в общем. Умные люди придумали такую полезную штуку как code review, это когда разработчик прежде чем мержить свой код в основную ветку просит коллег по цеху пробежаться по коду и прокомментировать те места которые вызывают у них сомнение, а также помогли выявить ошибки, опечатки и прочие ляпы. В итоге код становится чище и прозрачнее.
Diesel
NeoAxis 0.561 настолько древний, что система не пускает его в реестр.
Warning: PhysXPhysicsWorld: SDK initialization: Registry: Отказано в доступе к разделу реестра "HKEY_LOCAL_MACHINE\SOFTWARE\AGEIA Technologies".

Error: PhysXPhysicsSystem: SDK create error (RiEGKNFk8). Unable to initialize the PhysX SDK.

Вопрос: какого черта? Что надо? Рестребутив? 2008год. Физика v2.7.2
Молния в вакууме
andreyholkin, запуск с правами администратора?
Diesel
Цитата(saas @ 12.12.2017, 02:01) *
andreyholkin, запуск с правами администратора?

Пробовал и под xp sp3 - не помогает.
Молния в вакууме
andreyholkin, посмотри значит что с правами у этого раздела.
Diesel

Запустил. Вывод напросился, что физика 2.7 не работает в Win10x64
Заменил рестребутивы на 2.8.1
Diesel
Есть подробности. Дело было не в бабине...
Дело в том, что я второй раз, до этого установил инсталятор. Видимо первый раз в реестр не пустило. А физика не причём, потому, как на старой физике всё работает.
autistic
Народ! Тут возникла мысль, что экспортировать модельки из майи скриптом на С++ не очень удобно, а точнее совсем неудобно, и рано или поздно встанет вопрос о том, что неплохо бы иметь удобный инструмент который сможет не только импорт отекстуренных мешей делать, а позволит настраивать положение, материалы, анимации, физическую модель и т.д.
В общем задумался я тут какую технологию использовать для этого дела. Пока не сильно задумался, просто несколько очевидных решений которые первыми пришли в голову в порядке убывания приоритета:
1. Использовать C# в связке с С++. Для связывания использовать какой-нибудь сторонний биндинг, основанный на C++/CLI.
2. Использовать C# в связке с С++. Для связывания написать скрипт, скажем на питоне, который из интерфейсов С++ классов будет генерировать код для оболочки на C++/CLI.
3. Использовать С++ в связке с библиотекой Qt.

Какие я вижу преимущества и недостатки у перечисленных выше способов:
Плюсы 1 и 2 способов:
Ускорение времени разработки за счет гибкости и удобства языка C# в плане построения пользовательского интерфейса.
Компактное приложение, которое можно легко развернуть на любой тачке т.к. не нужно тянуть 150мб зависимостей в виде dll, все необходимые рантаймы уже установлены в ОС.

Минусы 1 способа:
Сложности с подбором и настройкой подходящего биндинга, а также с развертыванием ненобходимого окружения для его работы.

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

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

Минусы 3 способа:
Неудобство и замедление скорости разработки пользовательского интерфейса т.к. С++ плохо предназначен для этого.
Общая кривость, избыточность и плохой дизайн библиотеки Qt.
Сложности сопряженные со сборкой и распространением полученного продукта на машины, на которых не установлены рантайм библиотеки Qt соответствующей версии.

Что посоветуете, какой вариант наиболее правильный?

Все это далеко идущие планы, конечно, а пока вот вам немного котика smile.gif
jamakasi
Цитата(refuse @ 17.12.2017, 13:41) *
1. Использовать C# в связке с С++. Для связывания использовать какой-нибудь сторонний биндинг, основанный на C++/CLI.
2. Использовать C# в связке с С++. Для связывания написать скрипт, скажем на питоне, который из интерфейсов С++ классов будет генерировать код для оболочки на C++/CLI.
3. Использовать С++ в связке с библиотекой Qt.

4. Заюзать православный fbx который решает все вопросы и у которого есть вообще все в т.ч. поддержка кучи 3д пакетов, отличный сдк и тонны утилит на любой вкус.
autistic
Цитата(jamakasi @ 17.12.2017, 19:57) *
Заюзать православный fbx который решает все вопросы

Ну его-то и предполагается использовать в качестве промежуточного контейнера, в каком-то виде он и сейчас уже используется, но речь не об этом. Нужен некий инструмент в котором можно собрать воедино и настроить различные компоненты модели, например назначить отдельным поверхностям свойства материала, которые прописаны в GLSL-шейдере.
NanoBot-AMK
Цитата(Forser @ 26.09.2017, 08:58) *
NanoBot-AMK, сделать просто конвертер и не мучаться.

Не понял, какой ещё конвертер. Блин, прочитал как конвейер. ohmy.gif
Молния в вакууме
Цитата(refuse @ 17.12.2017, 13:41) *
Неудобство и замедление скорости разработки пользовательского интерфейса т.к. С++ плохо предназначен для этого.
Общая кривость, избыточность и плохой дизайн библиотеки Qt.
Сложности сопряженные со сборкой и распространением полученного продукта на машины, на которых не установлены рантайм библиотеки Qt соответствующей версии.

Что, неужели совсем нет хорошей библиотеки для интерфейса на C/C++?
autistic
Цитата(saas @ 17.12.2017, 22:29) *
Что, неужели совсем нет хорошей библиотеки для интерфейса на C/C++?

В том то и вопрос - какая библиотека для построения гуя на С++ хорошо подойдет, если такая имеется, для быстрого и безболезненного формошлепства, и какие альтернативы из имеющихся будут не хуже?
Из тех вариантов что известны мне - ни один не подходит. MFC для быстрой разработки не подойдет. Всякие WxWidgets и прочие колхозные поделки тоже не годятся. Продукты Борланда безбожно устарели. Остается выбор между Qt и Windows Forms.
Молния в вакууме
Цитата(refuse @ 17.12.2017, 21:00) *
Продукты Борланда безбожно устарели.

Я и не предлагаю. laugh.gif
В X-Ray 1.8 используют вот такую библиотеку: https://github.com/ocornut/imgui.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.