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

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

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

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

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

struct Foo
{
virtual void VirtualMethod(){
printf(“VIRTUAL METHODn”);
}
};

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;
}

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

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

0
0

Кривые Безье

Появилось время для редактора )

Продолжил пилить, фиксить баги и т.п.  Ноды вроде работают без проблем!  Но ноды эти надо связывать между собой! Т.е. выходы одних с входами других.

Для этого везде юзаются кривые Безье. Вот я и подумал – а чем я хуже? : )   Решил погуглить тему, так как раньше не нужна была – не занимался.  Погуглил, покурил..  ох ёпт!!  Я то думал там будет ацкая жесть с километровыми формулами, а там оказалась детская задачка ))

Вот на своём софтрендере замтил отрисовку этих самых кривых ^^ С-К-А-Ч-А-Т-Ь    90кб всего, статично слинковал с рантаймом (просить не должно). M$ Windows only.

0
0

Пилю дальше GUI )

Опять переписал дофига всего, уже по традиции )

Но главное что дописал – “обрезание” контролов scissor-ом родителя.  Я думал, что я сделал это давно, а оказалось не сделал )  😀   Теперь всё зачОтненько рендерится, быстро и правильно )

Слегка пофиксил сплит-контейнеры, допилил класс виджета-узла графа шейдерного редактора, сделал его ресайзинг )

Скины поддерживаются, однако я их пока не рисовал и контролы просто заливаются дефолтным цветом, который я рендомно выставил как-то однажды и забил : )

Вот WIP (work in progress) скрин того, с чем я работаю.  Поясню:

1. Тут не все поддерживаемые контролы 😀  Тут только то, что я прямо сейчас тестирую, не более.
2. Тут нету скина  (не применён) и т.е. нет текстур.
3. На скрине 2 сплит-контейнера, 2 кнопки, 1 pictureBox (в который выводится отрендеренная сцена), 1 shaderNode

0
0

WIP news

Oh sh..
Времени почти нет на движок. Но вот вчера вечером сел за написание редактора шейдеров ) ЭТО КОШМАР! 😀

Мой GUI – сразу же с первых минут жутко зафейлился по всем фронтам ( И началось его дописывание/переписывание. : )

1. Добавил SplitContainer контрол. Нужен мне для UI редактора (ну, это контрол где есть 2 панельки и полоса-разделитель. которую таскать можно). Работает теперь отлично!

2. Сегодня при поддержке одного друга пофиксил 100500 багов в моём текстовом классе! А именно: горизонтальное, вертикальное выравнивание, отступы букв друг от друга, правильное получение размеров строки (в пикселях) и много чего ещё попутно ). Теперь текст рендерится правильно и чётко по центру (если стоИт выравнивание по центру). В общем _теперь_ я доволен рендерингом текста )

3. Меняю иерархию классов “виджетов”. Теперь моего брутального и бессердечного кода нет. Всё чисто, лаконично и красиво )

Допиливаю другие контролы… скоро будут скрины ^^

0
0

NES Emulator news

Добавил поддержку over 20 опкодов процессора, начал писать PPU (сделал запись контрольных регистров 1,2 и чтение регистра состояния). Нашёл баг в JSR опкоде – пофиксил ) Более подробно в моём блоге на gamedev.ru http://www.gamedev.ru/pages/l/forum/?id=152486 (это страница с комментами – я в комментах больше всего постю – не хочу засирать раздел своими постами )

0
0

Волшебный мир ассемблера :D

Вчерашней ночью решил же писать эмулятор денди! О ДААА! 😀

Создал пустой проект, написал создание окошка, копирование ROM-а в память. Cool!! What next?? o_O Эм… ээм.. вырубил всё нафиг и пошёл спать ; ) “Верное решение”(с)

Сегодня решил таки вернуться к вопросу, ведь “врагу на сдаётся наш гордый Варяг”! начал с гугления архитектуры Famicom. Этой системе уже куча лет, она жутко старая, но в инете так и нет нормальной полной скомпонованной инфы о ней 😀 Блджад! Приходится гуглить по кусочкам.

Окей, базовая инфа есть, почитал про CPU, PPU, APU, memory mapped IO и т.п. Ну это всё конечно весьма увлекательно, только представления о том, как это всё реально работает и как собсно это эмулировать досихпор нет! : Что-то типа “смотрим в книгу – видим фигу” Но.. останавливаться же не в моих правилах )

Пошёл потроллил в Skype чатике товарищей Utechenko V. O. и DDS, которые таки выдали чуток полезной мне инфы, в частности направили “на путь истинный” – посоветовали книги Владислава Пирогова, которые оказались весьма занимательными : )

Так я пришёл к мысли, что “блин, ведь давно пора выучить ассемблер” ! Используя книги, туториалы по программированию AVR микроконтроллеров, туториалы по ассемблеру, википедию, параллельно распивая зелёный чай, поедая сгущёнку и печатая очередной рендер из VRay матеря принтер за баги в печати начал постигать азы микроэлектроники, ассемблерного программирования.

Чёрт! Это чувство просто офигенно! Чувство, когда начинаешь понимать нечто ранее недосягаемое.. как звёзды ) Ещё вчера сидел тупил, не понимал _совершенно ничего_ в архитектуре и уже сегодня я знаю назначение северного, южного мостов, чипа CMOS, что такое защищённый режим процессора и как в него переходить ) Назначение APIC (контроллера прерываний) да и саму суть прерываний! Я раньше вообще не представлял что же это такое и нафига оно нужно! Я вообще думал что это какаято хардварная фича проца, которая вызывается через строго отведённый интервал и что-то шлёт в этот момент девайсам. Оказалось всё немного по-другому. APIC контроллер физически приаттачен к выводам девайсов на материнской плате. Девайсы могут слать сигналы прерываний, контроллер ставит соответствующий флаг, который ожидает обработки процессором. Если в процессоре глобально и локально прерывания не запрещены, то обрабатываются они по очереди следуя приоритету. Для каждого прерывания есть свой собственный обработчик! Т.е. – процессор проверяет, стоит ли флаг прерывания и если его можно выполнить – сохраняет состояние регистров (заливает значения в стек), переходит к обработчику прерывания и обрабатывает его, восстанавливает состояние регистров и продолжает выполнение программы.

Не понятен только один момент – ведь во время обработки прерывания могут ещё несколько раз придти сигналы о необходимости выполнить одно и тоже прерывание! Ну тоесть девайс запросит его несколько раз. Что тогда? Насколько я понял – все прерывания кроме последнего тупо пропускаются. Странно это всё. Понятно, что такое может произойти с минимальной вероятностью, но может же : )

Сделал загрузку ROM-а игры NES (выбрал SuperMarioBros как тестовую игру,ибо в нём самая простая архитектура картриджа – нету MemoryMapper-а и т.п.), набросал пока Dummy классы железа NES, обработчики нескольких опкодов процессора, разобрался с обработкой прерываний, обработал Reset.

Ок, хватит тут графоманствовать – ушёл обратно в мир ассемблера..

0
0

Hardcore wanted

Софтрендеры писал и не раз… уже не вставляет. Хочется чего-то более хардкорного и полезного! Вот в мою больную голову неведомым мне образом закатилась мысль – а не написать ли мне эмулятор чего-нибудь? :3 Но так как я ничерта не смыслю в этом деле – решил начать с простого ) С эмуляции DENDY (nes). Собсно да – начинаю писать эмулятор ) В свободное время… 9ох ё.. и как эти процессорры то эмулировать…)

: P

0
0

PIMPL

Дело было вечером, делать было нечего : ) Почитал об этой идиоме (pointer to implementation). Мне как-то раньше объясняли что это такое! Да так объяснили, что я чуть не поседел, решив, что это что-то мегозаумное, жёсткое в реализации и вообще только для программеров over9000 уровня )

Погуглил, прочитал за пару минут первую попавшуюся статью и.. ОМГ, дак тут то идея, которая будет понятна любому школьнику ))) Оказалось – мне СЛИШКОМ извращённо объясняли и ещё я сам идею юзал уже давно, правда слегка не так, а по-своему :3

Переписал систему ввода с каноничной идеей PIMPL ) Впринципе чуть-чуть красивше смотрится, чем раньше ^__^

А, кстати, обновил железо чуть-чуть : ) Заменил видеокарту! Раньше стояла gf 8600 gts, а теперь купил и поставил gf GTX 550 Ti ! Жырнота! Разница огромная!! Особенно это заметно при массивной выборке текстур – так в 8600 скорость выборки была примерно 8 гигатекселей в секунду, теперь же 28 гигатекселей : ) И те тяжёлые места в моих сценах, где ФПС падал до 30 теперь выдают не меньше 250 ФПС!

Блин, такая видяха расслабляет : Как бы не наговнокодить с ней 😀 Что ещё радует кроме высокой производительности – полная аппаратная поддержка DirectX11! О да!! Можно пощупать тесселяцию и динамическую линковку шейдеров ^^ Да и собсно писать полноценный именно DX11 рендерер для движка : )

Ах да, насчёт рендеров. У меня в движке реализован мультирендеринг. Тоесть могу рендерить сцену хоть через DX9-11, хоть через OpenGl, да хоть через софтварный рендерер : )) 9кстати новая версия софтрендера сейчас в разработке – юзаю блочную растеризацию и MMX). Но есть тут мааааленькая проблема – линковка gAPI библиотек :

В поле Additional dependencies настроек линковки проекта я прописываю нужные lib-ы, они линкуются к библиотеке проекта и всё прекрасно работает! НО! Представим ситуацию, когда у меня реализован рендеринг на DX9 и глупо запрещать запуск на Windows XP. Как, собсно, запускать на XP мой проект?? Когда он слинкован с DX11 либами. которых в XP может и не быть! о_О

Раньше я юзал M$-only фичу #pragma comment (lib, “blablabla.lib”) и, впринципе, указав дефайнами набор рендереров можно было отключить какую угодно версию DX и для XP собрать версию без DX11. Но это смотрится больше как костыль : (

Единственным годным решением пока вижу вынесение рендереров в отдельные DLL как плагины и подгрузку нужной библиотеки уже во время зщапуска руками : ) Кстати, так у меня было изначально! И систему плагинов я НЕ удалил ; )

Но, думаю, пока рано над этим заморачиваться! Рендереры описаны в отдельных классах в отдельных файлах ) Поэтому перенести в DLL – не составит особого труда.

The end. Ушёл дальше покорять мир!

0
0

Raytracing

Накидал по-быстрому трассировщик пути : )

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

Не суперское качество, конечно, но ждать ещё несколько минут/часов стало влом – остановил : )

0
0