Гайд Продолжение. вбе(партикли)

https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
C++:
// m_flStartSequenceCycle
const auto vis = entity.visible;
entity.visible = entity.StartSequenceCyclePrev == entity.StartSequenceCycle;
entity.StartSequenceCyclePrev = entity.StartSequenceCycle;
if (vis != entity.visible)
   entity.vbe = false;
Это буквально псевдо-код из одних паст.
За работоспособность не отвечаю.
да все ворк код конечно хуита но нетвар годный ) < 33333333333
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
C++:
// m_flStartSequenceCycle
const auto vis = entity.visible;
entity.visible = entity.StartSequenceCyclePrev == entity.StartSequenceCycle;
entity.StartSequenceCyclePrev = entity.StartSequenceCycle;
if (vis != entity.visible)
   entity.vbe = false;
Это буквально псевдо-код из одних паст.
За работоспособность не отвечаю.
работает впринципе. когда тебя не видно, нетвар m_flStartSequenceCycle обновляется. если он не обновляется - значит тебя видно.


в лоббаке в стокгольме тоже работает
shot_0004.jpg
shot_0009.jpg
 
Последнее редактирование:
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
работает впринципе. когда тебя не видно, нетвар m_flStartSequenceCycle обновляется. если он не обновляется - значит тебя видно.


в лоббаке в стокгольме тоже работает
Посмотреть вложение 207381
Посмотреть вложение 207382
Ну как я сказал, я не ничего не делал, кроме как почекал дампы. Моя задача выполнена, спасибо за разъяснение всем остальным. (Реакции не могу еще ставить)
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
иконки спелов png парс через файловую систему? или панорама
Пока вот так делаем, до панорамы руки не дошли.
C++:
for (const auto& entry : std::filesystem::directory_iterator(icons_path)) {
    string path = entry.path().string();
    string name = entry.path().filename().string();
    name = name.substr(0, name.find(".png"));
    Draw.LoadTextureFromFile(path.data(), &icons[name]);
}

void Draw::LoadTextureFromFile(const char* filename, ID3D11ShaderResourceView** out_srv) {
    // Load from disk into a raw RGBA buffer
    int image_width = 0;
    int image_height = 0;
    unsigned char* image_data = stbi_load(filename, &image_width, &image_height, NULL, 4);
    if (image_data == NULL)
        return;

    // Create texture
    D3D11_TEXTURE2D_DESC desc;
    ZeroMemory(&desc, sizeof(desc));
    desc.Width = image_width;
    desc.Height = image_height;
    desc.MipLevels = 1;
    desc.ArraySize = 1;
    desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    desc.SampleDesc.Count = 1;
    desc.Usage = D3D11_USAGE_DEFAULT;
    desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    desc.CPUAccessFlags = 0;

    ID3D11Texture2D* pTexture = NULL;
    D3D11_SUBRESOURCE_DATA subResource;
    subResource.pSysMem = image_data;
    subResource.SysMemPitch = desc.Width * 4;
    subResource.SysMemSlicePitch = 0;
    Draw::Data.pDevice->CreateTexture2D(&desc, &subResource, &pTexture);

    // Create texture view
    D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
    ZeroMemory(&srvDesc, sizeof(srvDesc));
    srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
    srvDesc.Texture2D.MipLevels = desc.MipLevels;
    srvDesc.Texture2D.MostDetailedMip = 0;
    Draw::Data.pDevice->CreateShaderResourceView(pTexture, &srvDesc, out_srv);
    pTexture->Release();

    stbi_image_free(image_data);
}
 
Эксперт
Статус
Оффлайн
Регистрация
31 Авг 2018
Сообщения
1,792
Реакции[?]
1,073
Поинты[?]
29K
Пока вот так делаем, до панорамы руки не дошли.
C++:
for (const auto& entry : std::filesystem::directory_iterator(icons_path)) {
    string path = entry.path().string();
    string name = entry.path().filename().string();
    name = name.substr(0, name.find(".png"));
    Draw.LoadTextureFromFile(path.data(), &icons[name]);
}

void Draw::LoadTextureFromFile(const char* filename, ID3D11ShaderResourceView** out_srv) {
    // Load from disk into a raw RGBA buffer
    int image_width = 0;
    int image_height = 0;
    unsigned char* image_data = stbi_load(filename, &image_width, &image_height, NULL, 4);
    if (image_data == NULL)
        return;

    // Create texture
    D3D11_TEXTURE2D_DESC desc;
    ZeroMemory(&desc, sizeof(desc));
    desc.Width = image_width;
    desc.Height = image_height;
    desc.MipLevels = 1;
    desc.ArraySize = 1;
    desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    desc.SampleDesc.Count = 1;
    desc.Usage = D3D11_USAGE_DEFAULT;
    desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    desc.CPUAccessFlags = 0;

    ID3D11Texture2D* pTexture = NULL;
    D3D11_SUBRESOURCE_DATA subResource;
    subResource.pSysMem = image_data;
    subResource.SysMemPitch = desc.Width * 4;
    subResource.SysMemSlicePitch = 0;
    Draw::Data.pDevice->CreateTexture2D(&desc, &subResource, &pTexture);

    // Create texture view
    D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
    ZeroMemory(&srvDesc, sizeof(srvDesc));
    srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
    srvDesc.Texture2D.MipLevels = desc.MipLevels;
    srvDesc.Texture2D.MostDetailedMip = 0;
    Draw::Data.pDevice->CreateShaderResourceView(pTexture, &srvDesc, out_srv);
    pTexture->Release();

    stbi_image_free(image_data);
}
от stb_image можно избавиться просто заставляя игру распаковывать пнгшки в байты за тебя
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Пока вот так делаем, до панорамы руки не дошли.
C++:
for (const auto& entry : std::filesystem::directory_iterator(icons_path)) {
    string path = entry.path().string();
    string name = entry.path().filename().string();
    name = name.substr(0, name.find(".png"));
    Draw.LoadTextureFromFile(path.data(), &icons[name]);
}

void Draw::LoadTextureFromFile(const char* filename, ID3D11ShaderResourceView** out_srv) {
    // Load from disk into a raw RGBA buffer
    int image_width = 0;
    int image_height = 0;
    unsigned char* image_data = stbi_load(filename, &image_width, &image_height, NULL, 4);
    if (image_data == NULL)
        return;

    // Create texture
    D3D11_TEXTURE2D_DESC desc;
    ZeroMemory(&desc, sizeof(desc));
    desc.Width = image_width;
    desc.Height = image_height;
    desc.MipLevels = 1;
    desc.ArraySize = 1;
    desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    desc.SampleDesc.Count = 1;
    desc.Usage = D3D11_USAGE_DEFAULT;
    desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    desc.CPUAccessFlags = 0;

    ID3D11Texture2D* pTexture = NULL;
    D3D11_SUBRESOURCE_DATA subResource;
    subResource.pSysMem = image_data;
    subResource.SysMemPitch = desc.Width * 4;
    subResource.SysMemSlicePitch = 0;
    Draw::Data.pDevice->CreateTexture2D(&desc, &subResource, &pTexture);

    // Create texture view
    D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
    ZeroMemory(&srvDesc, sizeof(srvDesc));
    srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
    srvDesc.Texture2D.MipLevels = desc.MipLevels;
    srvDesc.Texture2D.MostDetailedMip = 0;
    Draw::Data.pDevice->CreateShaderResourceView(pTexture, &srvDesc, out_srv);
    pTexture->Release();

    stbi_image_free(image_data);
}
я конечно понимаю что это просто пример кода но тем не менее
name = name.substr(0, name.find(".png"));
а что если в названии файла нету .png?(ну мало ли по ошибке там тхт файлик окажется где-нибудь)
if(const auto index = name.find(".png"); index != std::string::npos)
{
name = name.substr(0, index);
...
}
и ресурсы имеет смысл заворачивать в RAII.
C:
stbi_load

...

stbi_image_free
это С.
если в ... ты return'ешься или вылетит исключение(например майкрософтовское(их ловить можно чтобы не крашило. /EHa
Пожалуйста, авторизуйтесь для просмотра ссылки.
)) то ты получается не освобождаешь ресурс. если ты крашишь от майкрософтовского исключения - то конкретно в данном случае похуй(ибо краш = закрытие процесса = освобождение оперативки), но что если бы тут была не оперативка а условно какой-нибудь другой супер сложный ресурс который не освобождался бы при смерти процесса(например иконка в трее. если приложуха крашится - иконка в трее так и остаётся висеть. иконку в трее прога должна сама подчищать если она выходит)?
я уже не говорю про тот ад который в С наступает когда у тебя несколько ресурсов в одном масштабе(goto cleanup и тд))) нафига это тебе?
в общем лично я советую ловить майкрософтовские исключения(чтобы потом тебе логнуло и ты пошел в сурсы смотреть. если же ничего не нашел в сурсах интересного тогда перестаешь ловить и идешь дебажить. ну и плюс просто неприятно когда тебе крашит), а если уж с исключениями работать то нужно тогда RAII везде делать. да и даже без исключений RAII мастхев. я лично считаю что с++ код без раии нельзя называть с++.
Пожалуйста, авторизуйтесь для просмотра ссылки.
и еще не совсем понимаю что значит
if (image_data == NULL)
return;
это значит что если произошла ошибка то ты тупо ее игноришь и абсолютно нихуя с ней не делаешь и потенциально даже не знаешь о том что она произошла(логгинга не вижу никаких еррор кодов и исключений тоже не вижу) xD?
бтв, не надо так писать
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
ZeroMemory(&srvDesc, sizeof(srvDesc));
пиши
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc{};
структура D3D11_SHADER_RESOURCE_VIEW_DESC это aggregate, следовательно {} это Aggregate initialization с пустым листом, следовательно все нон-класс(инт и тд) члены value-инитятся(по факту = zero-инитятся). то есть все то же самое что и твой ZeroMemory делает можно сделать двумя символами {}
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
я конечно понимаю что это просто пример кода но тем не менее
name = name.substr(0, name.find(".png"));
а что если в названии файла нету .png?(ну мало ли по ошибке там тхт файлик окажется где-нибудь)
if(const auto index = name.find(".png"); index != std::string::npos)
{
name = name.substr(0, index);
...
}
и ресурсы имеет смысл заворачивать в RAII.
C:
stbi_load

...

stbi_image_free
это С.
если в ... ты return'ешься или вылетит исключение(например майкрософтовское(их ловить можно чтобы не крашило. /EHa
Пожалуйста, авторизуйтесь для просмотра ссылки.
)) то ты получается не освобождаешь ресурс. если ты крашишь от майкрософтовского исключения - то конкретно в данном случае похуй(ибо краш = закрытие процесса = освобождение оперативки), но что если бы тут была не оперативка а условно какой-нибудь другой супер сложный ресурс который не освобождался бы при смерти процесса(например иконка в трее. если приложуха крашится - иконка в трее так и остаётся висеть. иконку в трее прога должна сама подчищать если она выходит)?
я уже не говорю про тот ад который в С наступает когда у тебя несколько ресурсов в одном масштабе(goto cleanup и тд))) нафига это тебе?
в общем лично я советую ловить майкрософтовские исключения(чтобы потом тебе логнуло и ты пошел в сурсы смотреть. если же ничего не нашел в сурсах интересного тогда перестаешь ловить и идешь дебажить. ну и плюс просто неприятно когда тебе крашит), а если уж с исключениями работать то нужно тогда RAII везде делать. да и даже без исключений RAII мастхев. я лично считаю что с++ код без раии нельзя называть с++.
Пожалуйста, авторизуйтесь для просмотра ссылки.
и еще не совсем понимаю что значит
if (image_data == NULL)
return;
это значит что если произошла ошибка то ты тупо ее игноришь и абсолютно нихуя с ней не делаешь и потенциально даже не знаешь о том что она произошла(логгинга не вижу никаких еррор кодов и исключений тоже не вижу) xD?
бтв, не надо так писать
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
ZeroMemory(&srvDesc, sizeof(srvDesc));
пиши
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc{};
структура D3D11_SHADER_RESOURCE_VIEW_DESC это aggregate, следовательно {} это Aggregate initialization с пустым листом, следовательно все нон-класс(инт и тд) члены value-инитятся(по факту = zero-инитятся). то есть все то же самое что и твой ZeroMemory делает можно сделать двумя символами {}
Пожалуйста, авторизуйтесь для просмотра ссылки.
Ой, да забей, это писал мой кохай. Молодой, не опытный. Код работает -- я даже не брался его ревьюить, не до этого пока.
Насчет отлова ошибок -- там вроде всё так работает, что просто картинка не загрузится и там в ID3D11ShaderResourceView будет nullptr, что я чекаю в функе рендера.
Ну и типа в худшем случае я получу нихуя вместо картинки. Понятно дело, это хуевая практика\кодстайл. Но, опять же, ревьюить каждый его коммит -- у меня нет столько времени.
 
Пользователь
Статус
Оффлайн
Регистрация
26 Окт 2017
Сообщения
520
Реакции[?]
95
Поинты[?]
2K
Пока вот так делаем, до панорамы руки не дошли.
C++:
for (const auto& entry : std::filesystem::directory_iterator(icons_path)) {
    string path = entry.path().string();
    string name = entry.path().filename().string();
    name = name.substr(0, name.find(".png"));
    Draw.LoadTextureFromFile(path.data(), &icons[name]);
}

void Draw::LoadTextureFromFile(const char* filename, ID3D11ShaderResourceView** out_srv) {
    // Load from disk into a raw RGBA buffer
    int image_width = 0;
    int image_height = 0;
    unsigned char* image_data = stbi_load(filename, &image_width, &image_height, NULL, 4);
    if (image_data == NULL)
        return;

    // Create texture
    D3D11_TEXTURE2D_DESC desc;
    ZeroMemory(&desc, sizeof(desc));
    desc.Width = image_width;
    desc.Height = image_height;
    desc.MipLevels = 1;
    desc.ArraySize = 1;
    desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    desc.SampleDesc.Count = 1;
    desc.Usage = D3D11_USAGE_DEFAULT;
    desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    desc.CPUAccessFlags = 0;

    ID3D11Texture2D* pTexture = NULL;
    D3D11_SUBRESOURCE_DATA subResource;
    subResource.pSysMem = image_data;
    subResource.SysMemPitch = desc.Width * 4;
    subResource.SysMemSlicePitch = 0;
    Draw::Data.pDevice->CreateTexture2D(&desc, &subResource, &pTexture);

    // Create texture view
    D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
    ZeroMemory(&srvDesc, sizeof(srvDesc));
    srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
    srvDesc.Texture2D.MipLevels = desc.MipLevels;
    srvDesc.Texture2D.MostDetailedMip = 0;
    Draw::Data.pDevice->CreateShaderResourceView(pTexture, &srvDesc, out_srv);
    pTexture->Release();

    stbi_image_free(image_data);
}
Ну я так понял лежат где то на диске? Не на прямую из игры
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Зачем тебе забивать место на диске таким, если ты можешь через CBaseFileSystem прочитать любые нужные тебе файлы?
Да по хорошему это всё -- залупа и надо через панораму делать.
Но короч это. В падлу :D
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Да по хорошему это всё -- залупа и надо через панораму делать.
Но короч это. В падлу :D
панорама имба конечно но там пиздец сколько оффсетов хуетов индексов и прочего дерьма( = фиксить при апдейтах сложно. а апдейты там частые с учетом того что сурс 2 еще в бете) и алгоритм градиента там у габена нестандартный(не как в стандартном CSS)
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
панорама имба конечно но там пиздец сколько оффсетов хуетов индексов и прочего дерьма( = фиксить при апдейтах сложно. а апдейты там частые с учетом того что сурс 2 еще в бете) и алгоритм градиента там у габена нестандартный(не как в стандартном CSS)
Ну я короч че и думаю. Типа хуй знает, панорама -- круто, но, имгуй не требэ обновления, и как бы...
 
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
Да по хорошему это всё -- залупа и надо через панораму делать.
Но короч это. В падлу :D
Эм. Ну, да. Ты можешь рендерить пикчи через панараму, окей.
Но я вижу, что ты делаешь через аймгуи, следовательно, представим, что завтра они переделают любую иконку, что-то еще - тебе заново надо анпакать и заливать в лаунчер, людям перекачивать, слишком много лишнего, нет? А что если ты возьмешь класс CBaseFileSystem, найдешь там вт функу на чтение и будешь читать? Ты получишь например vtex, но на том же github куча кода как из vtex перегонять в png. Не хочешь искать, зайди в panorama.dll. Там есть конвертер, почти точно такой же как в ксго. Если будет интересно - на юц найдешь связанные по этой теме треды. Типо ты находишь нужную пикчу - конвертируешь в памяти её в нужный формат, отдаешь Imgui.

Просто есть вещи которые я могу понять, зачем хранить на компе у юзера, например кастом партикли сделанные тобою, еще можно понять. Но пикчи. Как говориться, нипонял.
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Эм. Ну, да. Ты можешь рендерить пикчи через панараму, окей.
Но я вижу, что ты делаешь через аймгуи, следовательно, представим, что завтра они переделают любую иконку, что-то еще - тебе заново надо анпакать и заливать в лаунчер, людям перекачивать, слишком много лишнего, нет? А что если ты возьмешь класс CBaseFileSystem, найдешь там вт функу на чтение и будешь читать? Ты получишь например vtex, но на том же github куча кода как из vtex перегонять в png. Не хочешь искать, зайди в panorama.dll. Там есть конвертер, почти точно такой же как в ксго. Если будет интересно - на юц найдешь связанные по этой теме треды. Типо ты находишь нужную пикчу - конвертируешь в памяти её в нужный формат, отдаешь Imgui.

Просто есть вещи которые я могу понять, зачем хранить на компе у юзера, например кастом партикли сделанные тобою, еще можно понять. Но пикчи. Как говориться, нипонял.
На самом деле всё супер-просто объясняется. Нужно было сию-минутное решение (читать: костыль), когда я доделал панель со скиллами. А дальше были более приоритетные задачи, и это как-то ушло на второй план.
Но, да, разумеется ты прав. И спасибо за подсказку, я давно хотел в эту сторону посмотреть. AFAIK в IVGuiPaintSurface есть загрузка картинок, а CBaseFileSystem у меня давно отревершена.
 
Пользователь
Статус
Оффлайн
Регистрация
26 Окт 2017
Сообщения
520
Реакции[?]
95
Поинты[?]
2K
На самом деле всё супер-просто объясняется. Нужно было сию-минутное решение (читать: костыль), когда я доделал панель со скиллами. А дальше были более приоритетные задачи, и это как-то ушло на второй план.
Но, да, разумеется ты прав. И спасибо за подсказку, я давно хотел в эту сторону посмотреть. AFAIK в IVGuiPaintSurface есть загрузка картинок, а CBaseFileSystem у меня давно отревершена.
фиксить бледность пикч не пробовал?
 
Начинающий
Статус
Оффлайн
Регистрация
28 Июн 2022
Сообщения
15
Реакции[?]
1
Поинты[?]
1K
Сверху Снизу