Разработка игрового движка с нуля, как создать игровой движок |
Здравствуйте, гость ( Авторизация | Регистрация )
Разработка игрового движка с нуля, как создать игровой движок |
04.12.2017, 23:46
Сообщение
#21
|
|
You're never too young to have a plan. © Репутация: 2131 Группа: Участник Сообщений: 14955 Награды: 14 Регистрация: 20.02.2009 |
Надо бы шапку темы оформить, кто займется?
-------------------- Форум, это место где люди выслушивают аргументы друг друга, а не только высказывают свое мнение. |
 
|
|
|
|
05.12.2017, 00:38
Сообщение
#22
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
Надо бы шапку темы оформить, кто займется? Читать Места для курения: нормативы и требования Борьба с курением подразумевает не только меры по снижению курения, но и способы оградить некурящих от табачного дыма, не ущемив при этом конституционные права и тех и других. Именно по этой причине в тех местах, где курение ограничено согласно законодательству (Федеральный закон от 10 июля 2001 года N 87-ФЗ "Об ограничении курения табака") необходимо оборудовать место для курения — в соответствии с правилами пожарной и санитарной безопасности. Закреплено Конституцией Отсутствие такого места при запрете на данной территории курения, может быть расценено как нарушение прав человека. Согласно Конституции РФ ограничения личных прав не допускаются, в том числе по такому признаку как курение. В Трудовом Кодексе тоже указано, что ограничения в приеме на работу по качествам, не связанным с должностными обязанностями, незаконны и могут быть обжалованы в суде. Оставив в стороне юридическую казуистику и споры (надо признать, бесконечные) на тему курильщики ущемляют права некурящих или наоборот, попытаемся найти «общий знаменатель», который охарактеризовал бы требования к местам для курения. Общие требования к организации мест для курения Места для курения — как неизолированная площадка, так и курительная комната — должны быть изолированы ото всех помещений, так или иначе связанных с осуществлением рабочего процесса. Отдельная изолированная комната для курения должна быть организована на предприятиях численностью от 200 человек и более. «Курилки» недопустимо устраивать в санитарно-бытовых помещениях, в том числе санузлах общего пользования, столовых, мест отдыха, медпунктов и т. п. Главное требование: места для курения должны быть размещены так, чтобы запах их курительных помещений не проникал в производственные и бытовые помещения. При этом (в том числе с целью избежать нерациональных потерь времени в рабочее время) до помещений для курения расстояние не должно быть больше 75 метров в зданиях и не более 150 метров от рабочих мест на производственной или строительной площадке. Минимальное расстояние — 5 метров. Пожарные требования Места, предназначенные для курения, должны быть обозначены специальными знаками, согласно ГОСТ Р 12.4.026-2001 — это знак М15 «Курить здесь». Отделка стен, полов в помещении для курения должна быть выполнена из негорючих материалов (стекло, металл, плитка), остальные материалы, в том числе лакокрасочные, должны быть обработаны огнезащитными составами, обработку которыми необходимо обновлять в соответствии с рекомендациями производителей. Урны в помещении для курения должны быть выполнены из металла, размещать их вблизи воспламеняющихся материалов (в том числе возле стены, не обработанной огнезащитным составом) запрещено. Санитарно-гигиенические требования Место для курения должно хорошо проветриваться естественным образом (но при этом должно быть исключено попадание воздуха из «курилки» на рабочие и бытовые места), либо быть оборудовано вентиляцией. Мощность вентиляционной системы должны быть рассчитана исходя из санитарных требований СНиП 31-05-2003, и обеспечивать обмен воздуха в рабочем состоянии не менее 10 кубометров в час. Системы вентиляции и кондиционирования всего здания, в том числе помещения для курения, должны быть спроектированы таким образом, чтобы исключить попадание воздуха из курительной комнаты в другие помещения. В холодное время года температура воздуха в месте, отведенном для курения должна быть не менее 16CєC, для жаркого времени года нормативы не определены. Сообщение отредактировал andreyholkin - 05.12.2017, 01:05 |
 
|
|
05.12.2017, 02:06
Сообщение
#23
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
Кто в шейдерах разбирается? Напишите пожалуйста шейдер с отражением в воде для ЗП - народ вас не забудет.
Я пытаюсь ОГСЕ шейдеры править - но там хвостов в другие отрасли хозяйства, что мама не горюй. С меня магарыч. |
 
|
|
05.12.2017, 10:20
Сообщение
#24
|
|
Доктор Игровых Наук Репутация: 544 Группа: Участник Сообщений: 3657 Награды: 9 Регистрация: 12.07.2007 |
Боян же, там FFP во все поля. Ты покажи пример где SM реализована, да так чтобы я без проблем мог кастомные шейдера писать, и чтобы удобно было smile.gif Ну просто же Сказки все это, там точно такой же колхоз и багло там плавает годами, как и везде. Свой колхоз ценен тем, что я имплеменчу только то что буду использовать и не забиваю голову поддержкой 100500 различных фичей на все случаи жизни, которые мне никогда не понадобятся. Прелесть в том что тебе не придется наступать на теже грабли годами, а те что известны либо уже пофикшены либо ты о них явно знаешь. Ненужные тебе фичи можно и не юзать и не знать про них. А касательно колхоза, ну давай сделай мне демку с кубиком который будет работать одинаково и вообще будет работать на mac\linux\windows\android и при этом на железе разной тухлости в особенности видяшек hd graphics и при этом потратив на это минимум времени =). |
 
|
|
07.12.2017, 03:34
Сообщение
#25
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
Собираю старые версии NeoAxis.
У кого есть версии от 0-2? Версия 2 есть - нужно старее. Сообщение отредактировал andreyholkin - 07.12.2017, 04:12 |
 
|
|
07.12.2017, 09:42
Сообщение
#26
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Такая тривиальная обертка точно также просто пишется за пару вечеров своими руками, какой смысл тащить в проэкт стопицот непонятных зависимостей, которые ничего кроме не предлагают? Код #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 Прелесть в том что тебе не придется наступать на теже грабли годами, а те что известны либо уже пофикшены либо ты о них явно знаешь. Да ну чушь все это, точно такие же колхозники пилят по вечерам этот SFML по вечерам, точно также плодят багло которое потом никто не проверяет, пока оно не стрельнет в очередном проэкте. А касательно колхоза, ну давай сделай мне демку с кубиком который будет работать одинаково и вообще будет работать на mac\linux\windows\android и при этом на железе разной тухлости Я открою тебе страшную тайну, ни один FFML на свете не спасет от трудностей при разработке и поддержке кроссплатформенного продукта, если этот продукт немного сложнее чем в демка с кубиком. Настрадаешься с тем же самым SFML'ем по самое не балуйся В общем мое мнение таково: если уж и делать выбор между готовым решением и своим колхозом, то это наверняка будет выбор между промышленными движками, вроде Анрила или Крайэнджина, и своим колхозом, но никак не между чужим колхозом и своим колхозом. Сообщение отредактировал refuse - 07.12.2017, 09:59 -------------------- nop
|
 
|
|
10.12.2017, 13:35
Сообщение
#27
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Создал
-------------------- nop
|
 
|
|
10.12.2017, 15:24
Сообщение
#28
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
Создал Тесты не писал, код не компилировал. Фу таким быть Может сразу асинхронность и тому подобное, а то два сталкера в онлайн выйду и залагает |
 
|
|
10.12.2017, 17:58
Сообщение
#29
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Тесты не писал, код не компилировал. Фу таким быть Ну не правда же! Тестик написал, скомпилял код.Времени на все маловато, да. 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); } За ревьюшку спасибо огромное! Завтра поправлю, после работы. З.Ы. Посоны!? активнее давайте, не стесняйтесь комментировать ревьюшку! Все поправлю, все учту, если по существу будут комментарии. -------------------- nop
|
 
|
|
10.12.2017, 18:27
Сообщение
#30
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Может сразу асинхронность и тому подобное, а то два сталкера в онлайн выйду и залагает Распараллелить - не проблема! Но сначала хочется получить минимальное приложение в духе "As simple as it is." -------------------- nop
|
 
|
|
10.12.2017, 18:40
Сообщение
#31
|
|
Почти Игроман Репутация: 91 Группа: Модератор Сообщений: 516 Награды: 4 Регистрация: 19.07.2015 |
Никто не знает API для считывание данных репозитория с Github? Коммиты, релизы, etc.
-------------------- В армии по 01.07.2020. |
 
|
|
10.12.2017, 19:03
Сообщение
#32
|
|
Высший Игровой Бог Репутация: 1747 Группа: Супермодератор Сообщений: 12594 Награды: 15 Регистрация: 05.11.2009 |
-------------------- |
 
|
|
10.12.2017, 19:04
Сообщение
#33
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
|
 
|
|
10.12.2017, 23:15
Сообщение
#34
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
А как у тебя тогда unique_ptr в shared_ptr сконвертился? Полагаю конструктор перемещения помог. Код template< class Y, class Deleter > shared_ptr( std::unique_ptr<Y,Deleter>&& r ); mkbkompas как-то связан с Компас-3Д? Не, это с + Главный уже в тюрьме давно сидит. Удивительно даже, учитывая масштаб воровства. -------------------- nop
|
 
|
|
11.12.2017, 21:31
Сообщение
#35
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Поправил ревью, жду аппрувов.
-------------------- nop
|
 
|
|
11.12.2017, 22:01
Сообщение
#36
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
Поправил ревью, жду аппрувов. Два слова понял: поправил, жду. Помог бы код оптимизации Occlusion Culling в NeoAxis 3.5 завести. Там есть основа, включить не можем. Кому надо старье PhysX? |
 
|
|
11.12.2017, 22:08
Сообщение
#37
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Два слова понял Да все просто в общем. Умные люди придумали такую полезную штуку как code review, это когда разработчик прежде чем мержить свой код в основную ветку просит коллег по цеху пробежаться по коду и прокомментировать те места которые вызывают у них сомнение, а также помогли выявить ошибки, опечатки и прочие ляпы. В итоге код становится чище и прозрачнее. -------------------- nop
|
 
|
|
11.12.2017, 23:55
Сообщение
#38
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
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 |
 
|
|
12.12.2017, 00:01
Сообщение
#39
|
|
Почти Игроман Репутация: 187 Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
andreyholkin, запуск с правами администратора?
|
 
|
|
12.12.2017, 00:04
Сообщение
#40
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
|
 
|
|
Текстовая версия | Сейчас: 26.04.2024, 17:10 |