ДР/2015/Л13/Трудна
- Forums:
Сценови редактор
Тази задача носи 8 точки.
Сега както си имаме интерактивен режим, ще искаме да добавим към него възможност да се редактира сцената (да се променят, изтриват, добавят Node-ове). При стартиране, трябва да се зарежда сцена (както и досега), а след което, освен да летим из сцената, ще искаме да можем да я променяме.
Изисквания:
- Трябва да се поддържа един "текущ" Node, който е "избран на фокус". Редактиращите операции (по-долу) работят върху него. За да си личи кой е "избраният" Node, направете го мигащ. Мигането може да стане така: половин секунда Node-а е нормален, след което половин секунда е по-ярък от нормалното. За целта, в началото на кадъра в mainloop(), проверете в коя половина от секундата сте с SDL_GetTicks() и вдигнете подходящ флаг. После, в raytrace(), ако удареният най-близък Node е "избраният", и флагът указва по-висока яркост, умножавайте резултата от шейдъра по 1.2.
- Чрез два клавиша (например, '[' и ']', проверявайте ev.key.keysym.sym в mainloop), да може да се сменя текущо избрания обект (селекцията се сменя на предходния/следващия обект от nodes).
- Чрез клавишни комбинации, направете текущо избрания Node да може да се транслира, ротира, и мащабира. Например, клавишите Q A Z, да транслират, респективно, по X, Y и Z осите; WSX за ротация, EDC за скалиране. Например, ако потребителят натисне Z, то на трансформацията на текущия Node трябва да се извика translate(0, 0, Ct), като добавеното число Ct е някаква конкретна стойност (виж следващата точка).
- Модифициращите стойности Ct, Cr, Cs (примерни начални стойности: 5, 30°, 1.2), да могат да се променят чрез клавишите 1-9. "5" трябва да задава началите стойности, а по-ниските клавиши да задават по-ниски числа (по-фино регулиране). Обратно за по-високите. Идеята е, че човек може да започне с '5' (или по-голямо) и да позиционира, ротира и скалира грубо обекта си, след което използвайки по-ниски клавиши (4, 3, 2, 1) да задава по-финни настройки и с тях постепенно да прецизира трансформацията. Направете клавиш '-' да обръща значението на тези стойности, т.е. вместо транслация по +Z, да е транслация по -Z, ротирането да е в обратна посока, уголемяването да се превърне в свиване и т.н.
- Сложете някой клавиш (напр., Del) да изтрива избрания Node. След изтриването, някой друг Node става активен (освен ако списъка с Nodes остане празен).
- Добавете два клавиша, които да сменят шейдъра на текущо избрания Node. Т.е. всички налични шейдъри са в scene.shaders, трябва да определите кой е текущо избрания шейдър за този Node и да го смените на предходния/следващия от списъка.
- Добавете клавиши, с които да можете да генерирате нов обект, позициониран пред камерата. Трябва да можете да генерирате сфера и куб. При натискане на съответния клавиш, в геометриите се добавя нова геометрия от съответния клас, към шейдърите се добавя нов Lambert със случаен цвят, и се създава нов Node, който ползва въпросните геометрия и шейдър, и е поставен "пред" камерата (например на 10 единици пред камерата; това трябва да става само чрез транслацията на трансформацията, ротирането и скалирането остават идентитет)
- Добавете клавиш, който проверява дали на текущо избрания Node шейдърът е от тип Lamert и, ако да, сменя цвета му със случаен друг
Бонус (4т): направете клавиш (напр., F2), който "записва" текущата сцена в обратно в .qdmg файла. Сцената после трябва да се отваря и всичките "промени" по нея да са запазени. Самият сценови файл може да изгуби произволно количество незначещи данни (вероятно няма да има коментари, може имената да са различни и т.н.).
Съвет: направете си малка, "почти празна" сцена (примерно: Environment + една сферичка), за да тествате по-лесно.
Comments
Бъг
Здравейте,
Намерих малък бъг в тази ревизия: bbox.h:178 трябва да се добави този ред:
T.ABcrossAC = ABcrossAC;
заради оптимизацията с предварително пресметнатото произведение. Това при мен се прояви като липсващи части от модела, който беше на сцената.
Надявам се да спестя на някого часове дебъгване :)
Благодаря ти! Поправката е
Благодаря ти!
Поправката е приложена в SVN (r783), заедно с фикс на еквивалентен сорт проблеми в Heightfield геометрията.