вторник, 9 марта 2010 г.

Progress msg

1) давным давно уже сделан GUI ( полностью система сообщений, вывод текста, кнопок )
не много поподробней, опишу
итак, есть главные контроллы такие как
а) Overlay ( виртуальный экран ( может содержать в себе окна кнопки текст и прочее )
б) окна ( могут содержать кнопки текст и прочие контролы ( окно младше оверлея )
итак каждый овелей и каждое окно имеет свой VBO буфер контроллов и отдельно буфер текста
вывод происходит так
- Дип контроллы овелея ( не окна )
- Дип текст оверлея ( и всех контроллов окна не трогаются )
- Дип первое окно овелея
- Дип Текст первого окна овелея
- итак далее для все окон текущего оверлея
когда рисование овелея закончилось, начинается рисование следующего овелея в перечисленной выше последовательности ( на деле больше одного оверлея не бывает и больше 2 дипов для рендеринга всего Гуя тоже редкость)
и т/д/

схематичное создание
Overlay*testOverlay = .... содаем экран
Button * testButton = ... создаем простую кнопку
testOverlay addChild: testButton ... добавляем кнопку на экран
testButton addEventListener:MouseEvent.Click listener:sameFunction.... подписываем кнопку на событие мыши КЛик
все контроллы наследованы от DisplayObject, у которого есть стандартный набор свойств ( visible/alpha/width ets ) соответственно сами контроллы имеют набор своих свойств свойственных им ( например Text имеет свойства форматирования текста и т/д/ ) при срабатывании сообщения, в листенер передается ссылка на объект + свойства сообщения ( например на MouseMove передается дельта, старт мауз координаты и прочее, то есть можно сделать так

-(void)sameFunction:(Event):event
{
event.target.x // выдаст координаты testButton по оси Х так же можно обратиться к другим свойствам контролла ( например для контролла Text можно получить содержимое строки/текстового поля через свойство text и т/д/
event.mouseX // выдаст координаты клика мыши так же доступны координаты глобальные экранные и контролла
ets ...
}
если внимательно проанализировать рендеринг, то становиться ясно, что схема позволяет верно отображать контроллы в минимальное количество Дипов

любой контролл может быть подписан на определенные сообщения ( есть стандартный набор сообщение, но так же есть и свойственные только определенным контроллам сообщения )
любой контролл может быть подписан на любое количество сообщений и т/д/

вобщем все как нада и все удобно !
render
Overlay
- controlls VBO
- textControlls VBO
- window controll VBO
- window text VBO
next Overlay
ets
текст создается учиывая ширину каждого глифа при помощи фритайпа и просто текстуры ( два варианта рендера ) для текста можно спокойно задать цвет в формате 0xrgba например результат
Text*testText
testText.color = 0xff00ff
testText.text = "helloWorld"
будет

нада отметить что ВСЕ расчеты касательно задания текста размеров позиции и прочего происходят ТОЛЬКО при срабатывании сеттера ! то есть каждый кадр не чего не считается ! используются уже рассчитанные данные ! каждый кадр только обновляются буфера !



2) скелетная анимация
-полностью готова система иерархического перемноженная скелета
-блендинг анимаций
-система стэйтов
идл режимы для сбленденной анимации ( то есть если мы шли и начали бежать и махать рукой, вначале произойдет бленд этих анимаций, с указанным весом и типом перехода между анимации ( после перехода, если мы например так и продолжаем бежать и махать рукой, то функция бленда уже не будет вызываться ! так как уже будет полный круг сбленденной анимации и вызывать тяжелые расчеты уже не нужно ! то есть контроллер анимации перейдет в режим Идл )
можно устанавливать
-с какого кадра брать у трека кадры для бленда
-в какой кадр общей анимации вставлять бленд
-до какого кадра общей анимации вставлять трек
-до какого кадра берутся кадры из трека для бленда
-реверс анимации
-замедленная анимация
-разные переходы между треками
-тип трека ( луп /разовый )
-для каждого трека можно задать вес максимальный, минимальный, дельту и прочее
и еще куча возможностей



3) ландшафт
система лодинга ( все считается при загрузки ) ( спасибо Сержу ! L его идея )
система такая
в VBO загружаются вершины полосками
2 4 2 4
1 3 1 3
2 4 2 4
1 3 1 3
далее под каждый чанк создаются 9 буферов
int offsetLeft;
int offsetRight;
int offsetTop;
int offsetBottom;
int offsetRightBottom;
int offsetRightTop;
int offsetLeftBottom;
int offsetLeftTop;
int offsetNONTRIM;
int offsetALLTRIM;
итак схема простая
в центре находиться Lod1 offsetALLTRIM, по краям к нему стыкуются чанки с Lod2 у которых края трименные к которым линкуется Lod3 и т/д/ вобщем на деле это проще объясняется
преимущество такого подхода в
- нет реалтайм расчетов
- нет разрывов на стыках лодов

техническое инфо
в вертекстом буфере лежит весь ландшафт, разбитый на чанки, то есть например при выводе любого чанка, нам нужны индексы 0 1 2 3 ( поэтому для любого чанка, мы можем использовать один универсальный буфер ) а так как у нас их 9 ( специально под каждый вариант триминга ) то мы можем отрисовать ландшафт без разрывов на стыках
ЗЫ ландшафт выводиться стрипами

каждый чанк обернут в ббокс который разбит еще на 4 ббокса
сделано это для редактирования
при клике происходит следующее
опускается луч который колайдиться с ббоксами чанков, при нахождении чанка происходит поиск нужного сабБокса (одного из 4 ) и уже в нем находится нужный треугольник, далее описывать не стоит итак все ясно ( например можно выдавить вершинку кликом -
для раскраски используются бленд карты ( чанк = бленд карта ) подгрузка динамическая

еще много чего по мелочи готово, но будет переделываться !

на данный момент собираюсь доделать раскраску и заняться тенями !


2014
кстати эти сурсы лежат и ждут своего часа ) хотя сейчас мне не очень нравится хранить 9 буферов )

Комментариев нет:

Отправить комментарий