Ответ

Предупреждение: в данной теме не было сообщений более 120 дней.
Если не уверены, что хотите ответить, то лучше создайте новую тему.
Имя:
E-mail:
Тема:
Иконка:

Вложение:
(Удалить вложение)
(Добавить ещё)
Ограничения: максимум вложений в сообщении — 4, максимальный размер всех файлов — 192 Кбайт, максимальный размер одного файла — 128 Кбайт
Визуальная проверка:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:
О какой игре форум? (три буквы заглавные):
Сколько будет (5*5 + 2) ответ цифрой.:

подсказка: нажмите alt+s для отправки или alt+p для предварительного просмотра сообщения


Сообщения в этой теме

Автор: DK
« : Декабрь 31, 2016, 07:02:14 pm »

Найди в игре все вызовы RwRenderStateSet() с параметром rwRENDERSTATETEXTUREFILTER и везде проставь устанавливаемое значение rwFILTERNEAREST.
Автор: ilufir
« : Декабрь 31, 2016, 03:03:00 pm »

Код: C++
  1. #include "plugin_vc.h"
  2.  
  3. using namespace plugin;
  4.  
  5. class FontRenderingSettings {
  6. public:
  7.     FontRenderingSettings() {
  8.         patch::SetUChar(0x5787EA, rwFILTERNEAREST);
  9.         patch::SetUChar(0x5788EA, rwFILTERNEAREST);
  10.     }
  11. } plg;

Теперь пример с текстурой, которую показал Shagg.



Код: C++
  1. #include "plugin_vc.h"
  2. #include "game_vc\CSprite2d.h"
  3. #include "game_vc\CFont.h"
  4.  
  5. using namespace plugin;
  6.  
  7. class ImageDraw {
  8. public:
  9.     static RwRaster *LoadRasterFromBMP(char *filepath) {
  10.         RwImage *image = RtBMPImageRead(filepath);
  11.         if (image) {
  12.             int width, height, depth, format;
  13.             RwImageFindRasterFormat(image, rwRASTERTYPETEXTURE, &width, &height, &depth, &format);
  14.             RwRaster *raster = RwRasterCreate(width, height, depth, format);
  15.             RwRasterSetFromImage(raster, image);
  16.             RwImageDestroy(image);
  17.             return raster;
  18.         }
  19.         return nullptr;
  20.     }
  21.  
  22.     ImageDraw() {
  23.         static RwRaster *gRaster = nullptr;
  24.         static int savedState;
  25.  
  26.         Events::initRwEvent += [] {
  27.             gRaster = LoadRasterFromBMP(PLUGIN_PATH("image.bmp"));
  28.         };
  29.  
  30.         Events::drawingEvent += [] {
  31.             if (gRaster) {
  32.                 CSprite2d::DrawRect(CRect(0, 0, SCREEN_COORD_MAX_X, SCREEN_COORD_MAX_Y), CRGBA(0, 0, 0, 240));
  33.  
  34.                 static wchar_t tmpText[64];
  35.  
  36.                 CFont::SetColor(CRGBA(255, 255, 255, 255));
  37.                 CFont::SetDropShadowPosition(0);
  38.                 CFont::SetBackgroundOff();
  39.                 CFont::SetFontStyle(1);
  40.                 CFont::SetCentreOn();
  41.                 CFont::SetPropOn();
  42.                 CFont::SetCentreSize(SCREEN_COORD_MAX_X);
  43.                 CFont::SetScale(SCREEN_MULTIPLIER(1.2f), SCREEN_MULTIPLIER(2.4f));
  44.  
  45.                 swprintf(tmpText, L"Raster: %dx%dx%d", gRaster->width, gRaster->height, gRaster->depth);
  46.                 CFont::PrintString(SCREEN_COORD_LEFT(350.0f), SCREEN_COORD_TOP(620.0f), tmpText);
  47.                 CFont::PrintString(SCREEN_COORD_LEFT(350.0f), SCREEN_COORD_TOP(670.0f), L"Filtering: NEAREST POINT");
  48.  
  49.                 swprintf(tmpText, L"Raster: %dx%dx%d", gRaster->width, gRaster->height, gRaster->depth);
  50.                 CFont::PrintString(SCREEN_COORD_LEFT(900.0f), SCREEN_COORD_TOP(620.0f), tmpText);
  51.                 CFont::PrintString(SCREEN_COORD_LEFT(900.0f), SCREEN_COORD_TOP(670.0f), L"Filtering: LINEAR");
  52.  
  53.                 RwRenderStateSet(rwRENDERSTATETEXTURERASTER, gRaster);
  54.                 RwRenderStateGet(rwRENDERSTATETEXTUREFILTER, &savedState);
  55.  
  56.                 RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, RWRSTATE(rwFILTERNEAREST));
  57.                 CSprite2d::SetVertices(CRect(SCREEN_COORD_LEFT(100.0f), SCREEN_COORD_TOP(100.0f), SCREEN_COORD_LEFT(600.0f), SCREEN_COORD_TOP(600.0f)),
  58.                     CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255));
  59.                 RwIm2DRenderPrimitive(rwPRIMTYPETRIFAN, CSprite2d::maVertices, 4);
  60.  
  61.                 RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, RWRSTATE(rwFILTERLINEAR));
  62.                 CSprite2d::SetVertices(CRect(SCREEN_COORD_LEFT(650.0f), SCREEN_COORD_TOP(100.0f), SCREEN_COORD_LEFT(1150.0f), SCREEN_COORD_TOP(600.0f)),
  63.                     CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255));
  64.                 RwIm2DRenderPrimitive(rwPRIMTYPETRIFAN, CSprite2d::maVertices, 4);
  65.  
  66.                 RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, RWRSTATE(savedState));
  67.                 RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nullptr);
  68.             }
  69.         };
  70.  
  71.         Events::shutdownRwEvent += [] {
  72.             if (gRaster)
  73.                 RwRasterDestroy(gRaster);
  74.         };
  75.     }
  76. } plg;


Спасибо! А можно ли подобным образом ВООБЩЕ отключить сглаживание текстур?
Автор: Shagg_E
« : Декабрь 30, 2016, 10:23:46 pm »

А вот и изящное решение в виде плагина. Круто.



----

Ну это уже костыли. Увы, хоть оно и работает, появляется такая проблема, как утечки памяти - из-за этого теряется стабильность. А этого нам не надо
Ну, я и не писал, что это супер решение  ;D Просто рабочее(у меня сплошь и рядом в моддинге так).
Автор: DK
« : Декабрь 30, 2016, 08:03:36 pm »

Код: C++
  1. #include "plugin_vc.h"
  2.  
  3. using namespace plugin;
  4.  
  5. class FontRenderingSettings {
  6. public:
  7.     FontRenderingSettings() {
  8.         patch::SetUChar(0x5787EA, rwFILTERNEAREST);
  9.         patch::SetUChar(0x5788EA, rwFILTERNEAREST);
  10.     }
  11. } plg;

Теперь пример с текстурой, которую показал Shagg.



Код: C++
  1. #include "plugin_vc.h"
  2. #include "game_vc\CSprite2d.h"
  3. #include "game_vc\CFont.h"
  4.  
  5. using namespace plugin;
  6.  
  7. class ImageDraw {
  8. public:
  9.     static RwRaster *LoadRasterFromBMP(char *filepath) {
  10.         RwImage *image = RtBMPImageRead(filepath);
  11.         if (image) {
  12.             int width, height, depth, format;
  13.             RwImageFindRasterFormat(image, rwRASTERTYPETEXTURE, &width, &height, &depth, &format);
  14.             RwRaster *raster = RwRasterCreate(width, height, depth, format);
  15.             RwRasterSetFromImage(raster, image);
  16.             RwImageDestroy(image);
  17.             return raster;
  18.         }
  19.         return nullptr;
  20.     }
  21.  
  22.     ImageDraw() {
  23.         static RwRaster *gRaster = nullptr;
  24.         static int savedState;
  25.  
  26.         Events::initRwEvent += [] {
  27.             gRaster = LoadRasterFromBMP(PLUGIN_PATH("image.bmp"));
  28.         };
  29.  
  30.         Events::drawingEvent += [] {
  31.             if (gRaster) {
  32.                 CSprite2d::DrawRect(CRect(0, 0, SCREEN_COORD_MAX_X, SCREEN_COORD_MAX_Y), CRGBA(0, 0, 0, 240));
  33.  
  34.                 static wchar_t tmpText[64];
  35.  
  36.                 CFont::SetColor(CRGBA(255, 255, 255, 255));
  37.                 CFont::SetDropShadowPosition(0);
  38.                 CFont::SetBackgroundOff();
  39.                 CFont::SetFontStyle(1);
  40.                 CFont::SetCentreOn();
  41.                 CFont::SetPropOn();
  42.                 CFont::SetCentreSize(SCREEN_COORD_MAX_X);
  43.                 CFont::SetScale(SCREEN_MULTIPLIER(1.2f), SCREEN_MULTIPLIER(2.4f));
  44.  
  45.                 swprintf(tmpText, L"Raster: %dx%dx%d", gRaster->width, gRaster->height, gRaster->depth);
  46.                 CFont::PrintString(SCREEN_COORD_LEFT(350.0f), SCREEN_COORD_TOP(620.0f), tmpText);
  47.                 CFont::PrintString(SCREEN_COORD_LEFT(350.0f), SCREEN_COORD_TOP(670.0f), L"Filtering: NEAREST POINT");
  48.  
  49.                 swprintf(tmpText, L"Raster: %dx%dx%d", gRaster->width, gRaster->height, gRaster->depth);
  50.                 CFont::PrintString(SCREEN_COORD_LEFT(900.0f), SCREEN_COORD_TOP(620.0f), tmpText);
  51.                 CFont::PrintString(SCREEN_COORD_LEFT(900.0f), SCREEN_COORD_TOP(670.0f), L"Filtering: LINEAR");
  52.  
  53.                 RwRenderStateSet(rwRENDERSTATETEXTURERASTER, gRaster);
  54.                 RwRenderStateGet(rwRENDERSTATETEXTUREFILTER, &savedState);
  55.  
  56.                 RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, RWRSTATE(rwFILTERNEAREST));
  57.                 CSprite2d::SetVertices(CRect(SCREEN_COORD_LEFT(100.0f), SCREEN_COORD_TOP(100.0f), SCREEN_COORD_LEFT(600.0f), SCREEN_COORD_TOP(600.0f)),
  58.                     CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255));
  59.                 RwIm2DRenderPrimitive(rwPRIMTYPETRIFAN, CSprite2d::maVertices, 4);
  60.  
  61.                 RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, RWRSTATE(rwFILTERLINEAR));
  62.                 CSprite2d::SetVertices(CRect(SCREEN_COORD_LEFT(650.0f), SCREEN_COORD_TOP(100.0f), SCREEN_COORD_LEFT(1150.0f), SCREEN_COORD_TOP(600.0f)),
  63.                     CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255));
  64.                 RwIm2DRenderPrimitive(rwPRIMTYPETRIFAN, CSprite2d::maVertices, 4);
  65.  
  66.                 RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, RWRSTATE(savedState));
  67.                 RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nullptr);
  68.             }
  69.         };
  70.  
  71.         Events::shutdownRwEvent += [] {
  72.             if (gRaster)
  73.                 RwRasterDestroy(gRaster);
  74.         };
  75.     }
  76. } plg;
Автор: ilufir
« : Декабрь 29, 2016, 09:35:23 pm »

Я знаю только один способ(через ж, как всегда) - "эмуляция" "пиксельности" текстур(шрифтов): изначально саму текстуру делать высокого разрешения, но низкой детализации, т.е., из этого:

сделать это:


В этом случае никакое игровое сглаживание не будет проблемой:D


Ну это уже костыли. Увы, хоть оно и работает, появляется такая проблема, как утечки памяти - из-за этого теряется стабильность. А этого нам не надо
Автор: Shagg_E
« : Декабрь 28, 2016, 11:41:49 pm »

Я знаю только один способ(через ж, как всегда) - "эмуляция" "пиксельности" текстур(шрифтов): изначально саму текстуру делать высокого разрешения, но низкой детализации, т.е., из этого:

сделать это:


В этом случае никакое игровое сглаживание не будет проблемой:D
Автор: ilufir
« : Декабрь 28, 2016, 09:28:21 pm »

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