1. Фрагментный и вершинный шейдеры генерятся из графа.
For fun попробовал написать очень простой PathTracer прямо внутри HLSL шейдера для DX11
Нуэ, сферки и плоскости трассировать – задача достаточно тривиальная, с ней я, собсно, и справился : )
Вот ссылка на демку: http://l-proger.narod.ru/pathtracer_l.rar
Управление: только клавиша ПРОБЕЛ. Нажал – камера начала крутиться, ещё раз начал – перестала. Чем дольше камера будет находиться в статичном положении, тем качественней будет становится картинка на экране : )
Может потом фракталы прикручу, пока лень.
Потом моя долбанутая система обрезания геометрии контролов scissor-ом начала фейлить – Tab внутри Tab-а начал бажить, если заходил за границы клиентской области родителя.
Теперь вроде всё ок. Скроллится, двигается, нажимается… Только скин надо на XML перенести, а то пока не совсем гибко :
Но написать надо! Ведь использование готового – не есть путь для настоящих джедаев (дада, напишу потом компилер, ОС, комп спаяю, генератор энергии сооружу и т.п.)
Итак, что изменилось:
1. Ололош, внутри опять всё переписал, на этот раз намного чётче! GUI теперь может хендлить разные виды топологии геометрии (юзаю для линий)
2. GUI теперь поддерживает рендеринг сплайнов! Юхуу!
3. ДОБАВИЛ НАКОНЕЦ Drag & Drop !! Вон на скрине у нодов есть синие хреньки – прямоугольники! Просто наживаем мышей на один и перетягиваем на другой, отпускаем мышь иии..БАЦ ) Сплайном соединились! Чотко же! = )
Осталось сделать удаление связей (и дохрена контролов типа TabControl ). WTF! Уже 4:25!!!!!!! Ушёл спать, срочно!
Вот оно, ребята, GUI моей мечты! 😀 Не, ну оформление конечно кака, но не суть ) Главное ведь что оно своё :3
upd: дада! Опять без скина GUI ) Скины поддерживаются но мне лениво их рисовать 😀
Что изменилось:
Теперь рендеринг всего 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, ушёл дальше болеть : (