пятница, 30 декабря 2011 г.

GUI. FUCK YEAH, переделал рендеринг!








Вот оно, ребята, GUI моей мечты!  :D   Не, ну оформление конечно кака, но не суть )  Главное ведь что оно своё :3

upd: дада! Опять без скина GUI )  Скины поддерживаются но мне лениво их рисовать :D

Что изменилось:

Теперь рендеринг всего GUI идёт обычно в 1-5 DIP-ов а не в 100500 как раньше.  Сам по себе GUI не только может, но и рисуется ровно в 1 DIP, однако дополнительные ДИП-ы нужны, если в нём юзаются пользовательские текстуры!   На скрине, приведённом выше, количество DIP-ов = 3 потому что вон та хренька красная сверху слева - это текстура сцены, которая какраз перед рендером GUI и рисуется. Из за неё и не 1 а 3 дипа:  рисуем GUI до картинки, рисуем картинку, рисуем остальное.

То есть я вместо моего адски дебилоидного рендеринга (каждый элемент рисовал сам себя, имел СВОЙ вершинный и константный буфер..омг) сделал чоткий батчинг : )

На самом деле это конечно не сложно совсем. Но кое что изначально слегка напрягло:  родительские контролы должны собой обрезать дочерние контролы, чтобы дочерние не рендерились за границами родительских. Раньше я рекурсивно рендерил, постоянно спуская ScissorRectangle и применяя его для каждого контрола.  И было всё вздрыжне. НО! Теперь то у меня всё всё всё может нарисоваться за 1 DIP! И Scissor хардварный не применить (  Бида!  Вот пришлось симулировать его - вручную обрезаю scissor-ом квады контролов  (модифицирую геометрию и текстурные координаты квадов). Впринципе тоже детсвкая задача : )   Обрезание геометрии делается прямо во время её генерации, а генерация вызывается если изменился scissor. Всё просто.


На скрине новые контролы (сейчас сел и допилил их):

1. ScrollBar  - он один для вертикального и горизонтального скроллирования! Конструктор требует, чтобы юзер указал направление скроллинга

2. ScrollablePlane - вон тот квадратик посреди скрина с 2 скроллами сразу.   ScrollablePlane - наследник Plane  + добавил скроллы.  Можно скроллить теперь контент очень удобно : )  Надо бы прикрутить "кинетические скроллы" (точнее эти модифицировать), чтобы можо было дёрнуть ползунок, а он ещё будет некоторое время двигаться, останавливаясь  (как сейчас на мобилах любят делать)


Adios, ушёл дальше болеть : (

четверг, 1 декабря 2011 г.

Блин

С кем бы замутить игру под iPhone и заработать миллион )  Что ж все такие ленивые то..

Извращения в С++

Начал постигать всяческие извращения, которые можно замутить в С++  ^__^

Первое, что пришло в голову - подменить у класса виртуальный метод  :3 Легального способа тут конечно нет, но just for fun можно VisualStudio-only намутить код ) Всё тут просто - у каждого объекта любого класса при наличии в классе виртуальных методов в самом начале записывается указатель на таблицу виртуальных методов этого класса. Таблица - просто набор указателей на методы! Осталось написать подложный метод и перезаписать указатель в таблице виртуальных методов ^^ Что я, собственно, и сделал. И.. и обломался: access violation writing location... )

vtable записывается в read-only память : \  Бида...  казалось бы ) Но за что я люблю С++  (в отличае от шарпа на котором раньше писал) - в нём можно сделать всё, даже то, что запрещено  :D

VirtualQuery, VirtualProtect спасут отца Русской демократии.

struct Foo
{
virtual void VirtualMethod(){
printf("VIRTUAL METHOD\n");
}
};

void ReplacementFunc(){
printf("LOL FUNCTION!!\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
typedef void (*func)();
 Foo* foo = new Foo();

size_t* vtbl;
 memcpy(&vtbl, foo, sizeof(size_t));

func ptr = &ReplacementFunc;

MEMORY_BASIC_INFORMATION meminfo;
DWORD oldprotect;
VirtualQuery(&vtbl[0], &meminfo, sizeof(meminfo));
VirtualProtect(meminfo.BaseAddress, 4, PAGE_EXECUTE_READWRITE, &oldprotect);

memcpy(&vtbl[0], &ptr, sizeof(func));

 foo->VirtualMethod();  //тадааам ) В консоли:  LOL FUNCTION!!
getchar();
return 0;
}

Блджад, почему тут нету тега [code]  ?  Или есть..

Буду искать новые извращения и потом добавлять сюда, а пока надо делами заниматься.