Jump to content
Korean Random

Dragon armor

User
  • Posts

    416
  • Joined

  • Last visited

  • Days Won

    3

Posts posted by Dragon armor

  1. Зачем мне Viewer нужен? Кто бы сказал. Там в питон-файлах можешь посмотреть. Они не будут изменяться.

    Только что, DrWeb7_1 сказал:

    Ты его для предпросмотра карт использовал, насколько я помню.

    Не, это отдельно. Сейчас он 64 битный, а тут и 32 битный, и в скриптах запускается. А что делает, не помню.

    Это будет не просто, заставить его запуститься.

    Ньютон надо пересобрать под 32 бита.

    Отлично, всё собралось. Сейчас пути поправлю.

  2. Только что, DrWeb7_1 сказал:

    *переваривает инструкцию, поэтапно выполняя действия*

    Йасно.

    Сейчас бекап бинарников сделаю и буду фиксить, чтобы запустилось.

    Ммм, дебаг-версия.

    	mutex = CreateMutex(NULL, FALSE, ...);
    	if (GetLastError() == ERROR_ALREADY_EXISTS)
    	{
    		CloseHandle(mutex);
    		assert(FALSE);
    		return -1;
    	}

    Да, прокси-клиент надо запускать после сервера. А иначе что-то пойдёт не так.

  3. Один файл так скину. Это пропатченный клиент. Пропатчено место, где ищется директория для сохранения настроек. Можешь использовать, может нет. Нужно мне было для того, чтобы постоянно не восстанавливать настройки основного клиента после запуска старой версии. Будет создана папка Wargaming.net прямо в корне игры. Вроде как помогает.

    WorldOfTanks_fixed.7z

    1 минуту назад, DrWeb7_1 сказал:

    Оптический привод на этой букве висит.

    Ну тогда пересилю себя и пофиксю абсолютные пути, если не запустится.

    Сейчас скину.

    Идёт загрузка. У меня 3g, вместо интернета, нужно время.

    Отправил. Надеюсь, правильно отправилось.

    Содержимое res в  res.

    Остальное в корень папки кинь. Запусти и скажи, что получилось.

    Если есть фаервол, разреши локальную сетевую активность (адрес 127.127.127.127).

    Вот только порядок запуска не помню. Клиент, сервер, прокси-клиент, так вроде.

    Там пути захардкожены.

        PySys_SetPath(
        "C:\\Python27\\Lib\\;"
        "D:\\pr\\WoT\\listener\\server_py\\;"
        "F:\\wot_0.9.22.0.1\\c\\scripts\\common\\lib\\;"
        //"F:\\wot_0.9.22.0.1\\c\\scripts\\client\\;"
        "F:\\wot_0.9.22.0.1\\c\\scripts\\common\\;"
        "D:\\pr\\WoT\\listener\\server_py\\bw_emul\\;");

    @DrWeb7_1 С тобой всё впорядке?

    Там ещё надо папку scripts распаковать и поместить в папку "c" в корневую игры.

  4. Может запустить сможешь до ангара. В бой тоже можно зайти будет, но не более.

    Только что, DrWeb7_1 сказал:

    Можем в личке обсудить?

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

    У тебя скачан клиент нужной версии?

  5. 1 минуту назад, Plotnik5252ru сказал:

    Да ностальгия по старой музыке в ангаре танки и старая графика.

    А музыка в 0.9.22 поменялась? Не с 1.0? Графика, что увидел в 0.7.0 - это как-то не серьёзно. Не, ну совсем. ГТА4 вышел в 2008, так не сравнить с тем, что танки представляют в 2012 (или когда этот патч был).

    3 минуты назад, Plotnik5252ru сказал:

    Интересно а возможно старую графику сделать вместо новой?

    Ухудшить? Текстуры низкого разрешения? Низкополигонатьные танки?

    @DrWeb7_1 Хочешь тебе под честное слово о непубликации скину бинарные файлы сервера, прокси-клиента и питон-скрипты?

  6. 5 минут назад, DrWeb7_1 сказал:

    То есть, потребуется немного напильником подкорректировать публичные ключи серверов в клиенте и внести некоторые правки в сами скрипты клиента?

    В любом случае, нужно будет указать в конфиге адрес локального сервера. И публичный ключ заменить, да. Но это два файла в папке res. Можно даже и их не трогать, а заменить через папку с модами. Ну это детали.

     <login>
      <host>
      <name>Emul server</name> 
      <short_name>ES</short_name> 
      <url>127.127.127.127:20014</url> 
      <url_token>127.127.127.127:20014</url_token> 
      <public_key_path>rsa_mitm.pubkey</public_key_path> 
      <periphery_id>101</periphery_id> 
      </host>
      </login>

     

    А сервер-то до сих пор работает. Последняя удачная дебаг-сборка аж октябрь 2018. Ассерт только один

        import weakref
      File "C:\Python27\Lib\weakref.py", line 14, in <module>
        from _weakref import (
    ImportError: cannot import name _remove_dead_weakref

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

    @DrWeb7_1 Ты погромист? На каком-то языке погромировать можешь?

    Странно, что по стандартному пути используется питон. Он встроенный как-бы должен быть. Может абсолютные пути использовал, уже и не помню.

  7. 3 минуты назад, DrWeb7_1 сказал:

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

    На данный момент локальный сервер на той же машине, только вот для версии x86-64 скорее всего, не смотря на то, что сама игра только для x86. И на первое время, кроме сервера, ещё и клиент, чтобы от сервера к основному клиенту формировать и передавать пакеты. Это было нужно, чтобы сетевой протокол не реализовывать на тот момент.

    9 минут назад, Plotnik5252ru сказал:

    если у меня есть клиент версии 0.7.0 не запуститься

    А зачем 0.7.0? Ностальгия по старой графике? Так версия 0.9.22 лучше по всем параметрам. Старые карты, а графика подтянута, движок оптимизирован, по сравнению с 0.7.0, где всё тормозило, когда его недавно запускали.

    • Upvote 1
  8. @Plotnik5252ru Нет. На данный момент занимаюсь совсем другим проектом. Никто не решился сделать физику для движения танка. Позже вернусь и попробую хоть как-то заставить технику ездить по карте. Вот тогда можно будет уже и скачивать хоть что-то.

    53 минуты назад, Plotnik5252ru сказал:

    и после скачки что качать и запускать?

    А качать нужно будет клиент версии 0.9.22.0.1#788 (последний перед 1.0).

  9. 8 часов назад, blueferret сказал:

    Can you post the mod the way it is right now by any chance? I figured the best way to start with physics is to start by attempting to emulate pre-patch 0.8 physics and work from the bare basics up; after all, it's also what WG did.

    You can use Newton Demos Sandbox. It'll be enough. An example of a tracked vehicle in a sandbox is called ConstructionVehicle. In my post, I showed an example of what I was doing.

     

    8 часов назад, blueferret сказал:

    I figured the best way to start with physics is to start by attempting to emulate pre-patch 0.8 physics and work from the bare basics up; after all, it's also what WG did.

    I've already tried a lot of things. If you do something that works stably, it will be great.

     

    8 часов назад, blueferret сказал:

    Also, I've been digging around for around 2 weeks now in the py scripts etc. just figured why recreate something someone's already created.

    There is no physics in the scripts.

    I'm just tired. I will resume the project later.

     

    28.05.2020 в 17:24, Pavel3333 сказал:

    2019 же давно есть...

    Да перестань. Сам для сишки до сих пор использую VS2005. Её более чем достаточно, тем более для сишки вряд ли чего нового добавят, что придётся переходить на версию поновее.

    28.05.2020 в 17:24, Pavel3333 сказал:

    и можно будет что-нибудь поделать

    Можно. Просто надоедает пытаться делать одно и тоже, а в итоге без результата. Был бы результат, другое дело. А то не выходит ничего. Мне из-за этого периодически надоедает. Эта физика меня просто добивает. Есть пример. Можно повторить. Но нужно без внутренних классов. Ну и производительность чтобы была нормальной. Пытался на рейкасте сделать, что-то опять не выходит. Надо ограничить перемещение, когда виртуальные пружины сжаты до предела, а как сделать не понимаю. Кстати, судя по тому, что танки в оригинале могут по забору/машинкам ездить, у вг так же рейкаст, а не реальные физические объекты (цилиндры, например) в шасси, иначе объект разрушался бы сразу же, как только его коснутся. Что он и делает, если корпус танка объекта всё же касается.

     

    https://youtu.be/-vO7qdL9Xh8?t=224

     

  10. 5 часов назад, mixailwot сказал:

    всё?

    Нет. Мне периодически надоедает заниматься одним и тем же. Сейчас другим проектом занялся. Позже вернусь. Наверное.

    Ну и тем, кто желает сделать физику танку, может попробовать помочь. Потому что у меня в этом проблема, не получается повторить пример. Можно и по-другому сделать, лишь бы работало.

    Итак, нужен физический движок. Скачиваем тут. Для сборки нужна VisualStudio 2015. Открываем applications\demosSandbox\projects\visualStudio_2015\demosSandbox.sln. Открываем любой файл из demos, чтобы заменить существующий пример, или добавляем свой собственный, как сделано у меня, заодно добавив вызов функции в mainLogic\DemoEntityManager.cpp (DemoEntityManager::SDKDemos DemoEntityManager::m_demosSelection).

     

    
    #include "toolbox_stdafx.h"
    #include "SkyBox.h"
    #include "PhysicsUtils.h"
    #include "TargaToOpenGl.h"
    #include "dCustomHinge.h"
    #include "DemoMesh.h"
    #include "DemoCamera.h"
    #include "DebugDisplay.h"
    #include "DemoEntityManager.h"
    
    
    #include "toolbox_stdafx.h"
    #include "SkyBox.h"
    #include "DemoMesh.h"
    #include "DemoEntity.h"
    #include "DemoCamera.h"
    #include "PhysicsUtils.h"
    #include "DebugDisplay.h"
    #include "TargaToOpenGl.h"
    #include "DemoEntityManager.h"
    #include "DemoCameraManager.h"
    //#include "DemoEntityListener.h"
    #include "DemoCameraManager.h"
    #include "dHighResolutionTimer.h"
    #include "DemoEntityManager.h"
    #include "HeightFieldPrimitive.h"
    
    #include <dCustomJoint.h>
    #include <dCustomHinge.h>
    
    
    typedef float vec_t;
    
    typedef struct vec3_t
    {
    	union
    	{
    		struct
    		{
    			vec_t m_x, m_y, m_z;
    		};
    
    		vec_t v[3];
    	};
    } vec3_t;
    
    typedef struct Mat4x4
    {
    	union
    	{
    		struct
    		{
    			vec3_t m_front;
    			float w0;
    			vec3_t m_up;
    			float w1;
    			vec3_t m_right;
    			float w2;
    			vec3_t m_posit;
    			float w3;
    		};
    
    		vec_t mat[16];
    		vec_t m[4][4];
    	};
    } Mat4x4;
    
    struct wheel_data_s
    {
    	float radius;
    	BOOL isLeft;
    	BOOL isLeading;
    	Mat4x4 matrix;
    };
    static const wheel_data_s wheel_data_r[] =
    {
    	{0.511382f, 0, 1, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.840247f, 3.437970f, 1.000000f, }}, /*WD_R0*/
    	{0.352796f, 0, 1, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.715852f, -3.440844f, 1.000000f, }}, /*WD_R1*/
    	{0.495185f, 0, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.566284f, 2.490273f, 1.000000f, }}, /*W_R0*/
    	{0.491401f, 0, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.566284f, 1.779711f, 1.000000f, }}, /*W_R1*/
    	{0.495185f, 0, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.566284f, 1.051981f, 1.000000f, }}, /*W_R2*/
    	{0.490210f, 0, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.566073f, 0.345949f, 1.000000f, }}, /*W_R3*/
    	{0.495185f, 0, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.566284f, -0.367665f, 1.000000f, }}, /*W_R4*/
    	{0.491401f, 0, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.566179f, -1.073491f, 1.000000f, }}, /*W_R5*/
    	{0.495185f, 0, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.566284f, -1.782996f, 1.000000f, }}, /*W_R6*/
    	{0.491401f, 0, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.566284f, -2.494514f, 1.000000f, }}, /*W_R7*/
    };
    
    static const wheel_data_s wheel_data_l[] =
    {
    	{0.511382f, 1, 1, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.840247f, 3.437970f, 1.000000f, }}, /*WD_L0*/
    	{0.352796f, 1, 1, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.715852f, -3.440844f, 1.000000f, }}, /*WD_L1*/
    	{0.495185f, 1, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.566284f, 2.490273f, 1.000000f, }}, /*W_L0*/
    	{0.491377f, 1, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.566284f, 1.779711f, 1.000000f, }}, /*W_L1*/
    	{0.495185f, 1, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.566284f, 1.051981f, 1.000000f, }}, /*W_L2*/
    	{0.490210f, 1, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.566073f, 0.345949f, 1.000000f, }}, /*W_L3*/
    	{0.495185f, 1, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.566284f, -0.367665f, 1.000000f, }}, /*W_L4*/
    	{0.491401f, 1, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.566179f, -1.073491f, 1.000000f, }}, /*W_L5*/
    	{0.495185f, 1, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.566284f, -1.782996f, 1.000000f, }}, /*W_L6*/
    	{0.491401f, 1, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.566284f, -2.494514f, 1.000000f, }}, /*W_L7*/
    
    };
    
    static int Ignore_Material_NewtonOnAABBOverlap(const NewtonJoint* const contact, dFloat timestep, int threadIndex)
    {
    	return 0;
    }
    
    static NewtonBody * Create_Single_Wheel(DemoEntityManager *scene, const int chassis_material, const wheel_data_s *wheel_data,  const dMatrix &matrix)
    {
    	//NewtonCollision *collision = NewtonCreateChamferCylinder(scene->GetNewton(), wheel_data->radius, 0.5f, 0, NULL);
    	NewtonCollision *collision = NewtonCreateCylinder(scene->GetNewton(), wheel_data->radius, wheel_data->radius, 0.5f, 0, NULL);
    	DemoMesh *geometry = new DemoMesh("primitive", scene->GetShaderCache(), collision, "smilli.tga", "smilli.tga", "smilli.tga");
    
    	//dMatrix matrix = dMatrix(wheel_data->matrix.mat);
    	//dMatrix matrix = dRollMatrix(90.0f * dDegreeToRad) * m;
    
    	//m.m_posit.m_y += susp_data[i].radius + .5f;
    
    	NewtonBody *tire_body = CreateSimpleSolid(scene, geometry, 150, matrix, collision, chassis_material);
    	//DemoEntity *entity
    	geometry->Release();
    	NewtonDestroyCollision(collision);
    
    	return tire_body;
    }
    
    static dVector Vec3_To_Vector(const vec3_t &vec)
    {
    	return dVector(vec.m_x, vec.m_y, vec.m_z);
    }
    
    static void Create_Wheels(DemoEntityManager *scene, const int chassis_material, NewtonBody *hull_body, const wheel_data_s *wheel_data, const uint32_t count)
    {
    	//NewtonWorld *world = scene->GetNewton();
    
    	//dMatrix main_matrix(wheel_data->matrix.m_posit.v);
    	dMatrix main_matrix(dGetIdentityMatrix());
    	main_matrix.m_posit = Vec3_To_Vector(wheel_data->matrix.m_posit);
    	NewtonBody *main_wheel = Create_Single_Wheel(scene, chassis_material, wheel_data, main_matrix);
    	//dMatrix main_matrix(wheel_data->matrix.mat);
    
    	const dMatrix rot_matrix = dPitchMatrix(90.0f * dDegreeToRad);
    
    	dCustomHinge *master = new dCustomHinge(rot_matrix * main_matrix, main_wheel, hull_body);
    
    	master->EnableMotor(true, 12.1f);
    	master->SetFriction(1.0e4f);
    	dMatrix matrix(dGetIdentityMatrix());
    
    	for (uint32_t i = 1; i < count; i++)
    	{
    		//NewtonCollision *collision = NewtonCreateChamferCylinder(world, wheel_data[i].radius, 0.5f, 0, NULL);
    		//DemoMesh *geometry = new DemoMesh("primitive", scene->GetShaderCache(), collision, "smilli.tga", "smilli.tga", "smilli.tga");
    
    		//dMatrix matrix = dMatrix(wheel_data[i].matrix.mat);
    		////dMatrix matrix = dRollMatrix(90.0f * dDegreeToRad) * m;
    
    		////m.m_posit.m_y += susp_data[i].radius + .5f;
    
    		////DemoEntity *entity
    		//geometry->Release();
    		//NewtonDestroyCollision(collision);
    
    		matrix.m_posit = Vec3_To_Vector(wheel_data[i].matrix.m_posit);
    		//dMatrix matrix(wheel_data[i].matrix.mat);
    		NewtonBody *tire_body = Create_Single_Wheel(scene, chassis_material, &wheel_data[i], matrix);
    
    		//dMatrix pinMatrix0;
    		//dMatrix pinMatrix1;
    
    		//master->CalculateGlobalMatrix(pinMatrix0, pinMatrix1);
    
    		dCustomHinge *hinge = new dCustomHinge(rot_matrix * matrix, tire_body, hull_body);
    		//hinge->SetAsSpringDamper(true, 0.9f, 2.0f, 20.0f);
    		//hinge->EnableMotor(true, 1.1f);
    
    		//dFloat masterRadio = masterTire.m_chamferCylinder.m_height * 0.5f + masterTire.m_chamferCylinder.m_radio;
    		//dFloat slaveRadio = slaveTire.m_chamferCylinder.m_height * 0.5f + slaveTire.m_chamferCylinder.m_radio;
    		//main_matrix = main_matrix.Inverse();
    		new dCustomGear(wheel_data[i].radius / wheel_data->radius, main_matrix[0], main_matrix[0].Scale(-1.0f), tire_body, main_wheel);
    		//new dCustomGear(wheel_data[i].radius / wheel_data->radius, pinMatrix0[0], pinMatrix0[0].Scale(-1.0f), tire_body, main_wheel);
    	}
    
    }
    
    void Test(DemoEntityManager* const scene)
    {
    	/*NewtonBody * const floor =*/ CreateHeightFieldTerrain(scene, HEIGHTFIELD_DEFAULT_SIZE, HEIGHTFIELD_DEFAULT_CELLSIZE, 4.0f, 0.1f, 200.0f, -130.0f);
    	//NewtonCollision* const floorCollision = NewtonBodyGetCollision(floor);
    	
    	dMatrix pos = dGetIdentityMatrix();
    	NewtonCollision *shape = NewtonCreateBox(scene->GetNewton(), 3.187f, 1.2f, 8.f, 0, &pos[0][0]);
    	pos.m_posit.m_y += 1.2f;
    	NewtonBody *hull_body = NewtonCreateDynamicBody(scene->GetNewton(), shape, &pos[0][0]);
    	NewtonDestroyCollision(shape);
    
    	shape = NewtonBodyGetCollision(hull_body);
    
    	NewtonBodySetForceAndTorqueCallback(hull_body, PhysicsApplyGravityForce);
    	NewtonBodySetTransformCallback(hull_body, DemoEntity::TransformCallback);
    	NewtonBodySetMassProperties(hull_body, 50000, shape);
    	DemoMesh *m_redBox = new DemoMesh("platform", scene->GetShaderCache(), shape, "smilli.tga", "smilli.tga", "smilli.tga");
    
    	pos.m_posit.m_y = 20;
    	DemoEntity *hull_model = new DemoEntity(pos, NULL);
    	hull_model->SetMesh(m_redBox, dGetIdentityMatrix());
    	NewtonBodySetUserData(hull_body, hull_model);
    	m_redBox->Release();
    	//	//DemoEntity *hull_model = DemoEntity::LoadNGD_mesh("wte100\\hull_model.ngd", scene->GetNewton(), scene->GetShaderCache());
    	scene->Append(hull_model);
    
    	NewtonWorld *world = scene->GetNewton();
    
    	const int chassis_material = NewtonMaterialCreateGroupID(world);
    	NewtonMaterialSetCollisionCallback(world, chassis_material, chassis_material, Ignore_Material_NewtonOnAABBOverlap, NULL);
    
    	const int body_material = NewtonMaterialCreateGroupID(world);
    	NewtonMaterialSetCollisionCallback(world, body_material, chassis_material, Ignore_Material_NewtonOnAABBOverlap, NULL);
    
    	NewtonBodySetMaterialGroupID(hull_body, body_material);
    
    	Create_Wheels(scene, chassis_material, hull_body, wheel_data_l, _countof(wheel_data_l));
    	Create_Wheels(scene, chassis_material, hull_body, wheel_data_r, _countof(wheel_data_r));
    }

     

  11. @Exemp1ee Приветствую. Меня нет в социальных сетях.

     

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

    И кстати, про деревья. Нашёл вьювер для них. Вот так выглядит коллизия.

    tree1.thumb.jpg.a89b67e4e942a25666058f6195fab7b1.jpgtree2.thumb.jpg.b07a63386d8c7aab9eef26ec6fe831c3.jpgtree3.thumb.jpg.c2ba5567edbc6c2fc3f4230c977677d6.jpg

     

    Ни веток, ни ствола. Простейшие геометрические фигуры. А потом удивляемся, почему куст дырявый и наоборот, наполовину выехал, а всё-равно скрыт.

    Ранее писал про непонятное значение при проверке, будет ли объект на карте или нет (2 & map.BSMI.bsmi.visibility_masks). Это тип боя. Совсем забыл про это. ctf, domination и прочее.

     
    - <type>
      <name>Capture the Flag</name> 
      <tagName>ctf</tagName> 
      <visibilityMask>1</visibilityMask> 
      </type>
    - <type>
      <name>Domination</name> 
      <tagName>domination</tagName> 
      <visibilityMask>2</visibilityMask> 
      </type>
     
  12. @SkepticalFox Только до этого файла не добраться из space.bin. Загрузка у меня только из того, что привёл. Нужная группа, возможно, не совсем правильно у меня выбирается. Но раз есть строка с нужной группой, почему бы ей не воспользоваться?

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

    s10.thumb.jpg.d0e26f9b3f338b1aa0459be6aeee6127.jpg

    Но если ассерты пропустить, то даже загружается.

    Не всё верно, полигоны ошибочные вижу.

    Похоже, это дерево ошибочно грузится.

    А в физдвижке красота прямо-таки. Правда, с вывернутыми нормалями. Но это только в экспорте. Внутри всё должно быть хорошо.

    s11.thumb.jpg.6d724a534bf34673ca84e5a644519b69.jpg

    10кк полигонов. Наверное, с bsp придётся разбираться. Там должна быть упрощенная геометрия. Тут слишком много.

    Но с bsp такая проблема.

    s12.thumb.jpg.ce82d53c1bda936a2a7a17a8ae9b24e7.jpg

    Всё грузится нормально. Даже видно, что отсутствующие полигоны можно достроить, вершины есть.

  13. 1 минуту назад, SkepticalFox сказал:

    а больше кода где используется primitive_index ?)

    scene::IVertexBuffer *vertex_buffer = Create_Vertex_Buffer(&primitives);

    Тут без индекса. Вершины же едины для секции?

    scene::CDynamicMeshBuffer *buffer = Create_Mesh_Buffer(&primitives, render_item->primitive_index, vertex_buffer, indexType);

    Тут индексы загружаю.

    static scene::CDynamicMeshBuffer * Create_Mesh_Buffer(primitives_s *prim, const uint32_t groupe_index, scene::IVertexBuffer *vertex_buffer, const video::E_INDEX_TYPE indexType)
    {
    	scene::CDynamicMeshBuffer *buffer = new scene::CDynamicMeshBuffer(video::EVT_STANDARD, indexType);
    	scene::IIndexBuffer &indixes = buffer->getIndexBuffer();
    	buffer->setVertexBuffer(vertex_buffer);
    
    	indixes.set_used(prim->groupe[groupe_index].triangles_count * 3);
    	memcpy(
    		indixes.getData(),
    		prim->groupe[groupe_index].index_offset * prim->index_size + prim->indices,
    		prim->index_size * prim->groupe[groupe_index].triangles_count * 3);
    	indixes.setHardwareMappingHint(scene::EHM_STATIC);
    
    	buffer->recalculateBoundingBox();
    	return buffer;
    }

     

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

    typedef struct vertex_data_s
    {
    	uint32_t count;
    	vec3_t *position;
    	vec3_t *normal;
    	vec2_t *uv;
    } vertex_data_s;
    
    typedef struct primitives_s
    {
    	uint32_t index_size;
    	uint32_t index_count;
    	uint8_t *indices;
    	triangle_groupe_s *groupe;
    	uint32_t groupe_count;
    	vertex_data_s vertex_data;
    } primitives_s;

     

    
    typedef struct triangle_groupe_s
    {
    	uint32_t index_offset;
    	uint32_t triangles_count; // Count of indexes = 3 * triangles_count
    	uint32_t vertex_offset;
    	uint32_t vertex_count;
    } triangle_groupe_s;

     

  14. 3 минуты назад, SkepticalFox сказал:

    его используешь?

    Да. У меня даже ассерт есть

    assert(primitives.groupe_count > render_item->primitive_index);

     

    primitives - это загруженные секции из файла. А название секций из verts_name_fnv и prims_name_fnv.

    verts_name_fnv и prims_name_fnv это такие вот строки

    content/Environment/env044_AFStones/normal/lod0/env044_AFStone2.primitives/indices
    content/Environment/env044_AFStones/normal/lod0/env044_AFStone3.primitives/vertices

    Достаточно обрезать до primitives/ и название нужных секций есть.

  15. 24 минуты назад, SkepticalFox сказал:

    bsmo.models_loddings => bsmo.lod_renders => bsmo.renders

    Для простоты у меня сейчас нет лодов. Беру первый индекс из bsmo.models_loddings->index0, по нему затем прохожу по всем элементам от bsmo.lod_renders->index0 до bsmo.lod_renders->index1. Для каждой части загружаю материал. В общем, цепочка таблиц 0-7-8.

    4 минуты назад, SkepticalFox сказал:

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

    А там указывается группа примитивов. До этого думал, что только index и vertex бывают, а потом попробовал загрузить другую карту. Пришлось исправлять и делать загрузку именно из этих двух строк verts_name_fnv и prims_name_fnv.

    Подозреваю, мы об одном и том же говорим. Если у тебя всё загружается правильно и у меня правильно.

  16. 3 минуты назад, SkepticalFox сказал:

    там геометрия разрушенного объекта в отдельном render блоке, по идее ты лишние грузишь

    Загружаю файл из render_item->verts_name_fnv и render_item->prims_name_fnv для вершин и индексов соответственно.Секцию BWSG не использую. Это предварительная загрузка моделей, чтобы не дублировать информацию.

    А потом прохожу по секции BSMI, количество моделей беру из map.BSMI.bsmi.chunk_models.count, хотя без разницы, из какой таблицы брать, нулевой, первой.

    Даже если лишнее гружу, то не использованная модель не должна вовсе выводиться. Но, как уже написал, специально проверил, сколько загруженных моделей используется. И все из секции BSMO используются в BSMI.bsmo_models_id.

    Может и неправильно делаю. Попробую пока что разобраться с разрушаемыми объектами, чтобы они разрушаться начали.

    Вот два скрина из вьювера.

    Первый - загружаю только видимые объекты (условие (chunk_model[ i ].unknown & 1) && (2 & map.BSMI.bsmi.visibility_masks.chunk_4[ i ].index) != 0.

    Второй - инвертирование условия. Два объекта (неразрушаемые изначально) исчезли.

    s9.thumb.jpg.25ae013c78e011d7836fb979f5eaff90.jpgs8.thumb.jpg.c0df0f7372ef9b5a39162c6a427479a0.jpg

  17. 1 минуту назад, SkepticalFox сказал:

    я же написал, там только неразрушенные - я не прав?

    Если выводить всё подряд из bsmo_models_id, то будут и разрушаемые объекты, и неразрушаемые. Одни накладываются на другие и даже не заметно, что их больше одного.

  18. В таблице BSMI.8_12 индексы 0 и 1 - это новые объекты, которые появятся в замен разрушенного. 4 объекта соответствуют трём разрушаемым секциям и один - это основание.

    1 минуту назад, SkepticalFox сказал:

    Мы не юзаем в nuTerra chunkmodels

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

    @SkepticalFox Тогда встречный вопрос. А как обходите вывод разрушамых объектов? Они же мешаться будут.

    Если всё подряд из bsmo_models_id выводить.

×
×
  • Create New...