Новости • Форум • Помощь • Поиск • Участники • Календарь • База |
Гость ( Вход | Регистрация ) | Выслать повторно письмо для активации |
Страницы: (5) 1 [2] 3 4 ... Последняя » ( Перейти к первому непрочитанному сообщению ) | Ответ Новая тема |
maxFox Профиль Статус: нажиматель кнопок Группа: Элита Рейтинг: 17 |
я реализовывал подобную штуку. можно создать свою область памяти, и ссылкой на память делится. Правда это не встроенная штука в Кси. основана на Сишных ссылках. А адрес самой ссылки я передавал через проперти. Причем адрес конвертировал и записвал на проперти. как три целых числа. Тот ещё геморрой, но работало! я так реализовывал взаимодействие между операторами и айсом. |
||
Bravlin Pechatnik Профиль Статус: слон Группа: Артисты Рейтинг: 2 |
Вот я читая SDK в ту же сторону смотрю. Но пока что-то не завелось. Допустим вот такой псевдокод:
Здесь во время исполнения команды myCmd к контексту подключается в качесвте UserData адрес указателя на структуру. Дальше уже внутри Update колбека оператора myOperator мы должны получить этот адрес с помощью ctxt.GetUserData(). Но то ли адрес освобождается раньше то ли я что-то неправильно передаю\получаю. |
||
Mr.Core Профиль Статус: - Группа: Модераторы Рейтинг: 17 |
pData на стеке аллоцирован, уничтожается при выходе из области видимости, т.е. после putuserdata
аллоцируй через PlugData * pDataPtr = new PlugData ; и удаляй в operator_term колбеке |
Bravlin Pechatnik Профиль Статус: слон Группа: Артисты Рейтинг: 2 |
Русская версия более подробная. :good: Спасибо Олег.
А избежать использования UserData и Property не получится видимо. |
Bravlin Pechatnik Профиль Статус: слон Группа: Артисты Рейтинг: 2 |
Вобщем пробовал написать то что предложил Steven Caron, подключать UserData к самому плагину внутри XSILoadPlugin().
В результате возникли проблемы с вызгрузкой данных из памяти. Вот такую ошибку хипа я получал при попытке выгрузить плагин: http://i.imgur.com/FLzg6EV.png "__plastBlock == pHead" Пробовал освобождать память в колбеке команды myCmd_Term() но ошибка повторялась. А вот если подключать UserData к контексту а не к плагину и подключать её в колбеке myCmd_Init(), а убивать в myCmd_Term() то никаких ошибок нет. Но опять же передать UserData из команды в оператор я не понимаю как т.к. насколько я понял внутри myCmd_####(CRef in_ctxt) аргумент in_ctxt это ссылка на инстанс Command, а внутри myOperator_####(CRef in_ctxt) аргумент является ссылкой на инстанс Operator. |
||
Bravlin Pechatnik Профиль Статус: слон Группа: Артисты Рейтинг: 2 |
При этом если подключить UserData к инстансу PluginRegistrar , то-есть через колбек
SICALLBACK XSILoadPlugin( PluginRegistrar& in_reg ) то эту UserData действительно можно получить и внутри Operator'a и внутри Tool'a и внутри Command инстов. Вся проблема только в выгрузке плагина и освобождении памяти. Даже вот что откопал :) http://softimage.ru/forums/index.php?showtopic=7580 |
Bravlin Pechatnik Профиль Статус: слон Группа: Артисты Рейтинг: 2 |
[ solved ] Юзердату добавляем внутри _init() колбека команды. Т.к. данный колбек вызывается единожды при первом обращении к команде плагина, это нужно учитывать. Удаляем внутри _Unload() колбека плагина. Так мы не потеряем юезрдату при удалении Оператора из стека моделирования. Получать юзердату по аналогии и в др колбеках. Т.к. она подключается к плагину она доступна для всех элементов плагина и не требует передачи инстов тула, оператора, команды и т.д. с подключеной юзердатой.
|
||
Bravlin Pechatnik Профиль Статус: слон Группа: Артисты Рейтинг: 2 |
В какой массив можно вложить несколько CVector3Array массивов
[ CVector3Array, CVector3Array, CVector3Array ] ? CValueArray может содержать несколько CLongArray массивов, но CVector3Array он по аналогии принимать не хочет. |
maxFox Профиль Статус: нажиматель кнопок Группа: Элита Рейтинг: 17 |
а почему не создать свою собственную структуру? стандартный вектор?
|
||
Mr.Core Профиль Статус: - Группа: Модераторы Рейтинг: 17 |
насколько я помню у ксишных массивов нету конструктора перемещения, и массивы копируются по значению, и при ресайзе std vector может быть лишний оверхед. Лучше заюзать
std::vector < std::shared_ptr <CVector3Array> > pntChain |
Bravlin Pechatnik Профиль Статус: слон Группа: Артисты Рейтинг: 2 |
спасибо за советы ребят. 2го января будем пробовать ))) С НАСТУПАЮЩИМ !!!
:lazy2: |
Bravlin Pechatnik Профиль Статус: слон Группа: Артисты Рейтинг: 2 |
C 1м примером понятно. Тут в структуру копируется значение CVector3Array.
Хочется немного прояснить теоретическую часть по 2у примеру.
01. не очень понятно как его наполнять. Я так понимаю в таком виде это уже не масив значений а массив указателей и он хочет в качестве аргумента std::shared_ptr с типом указателя CVector3Array. Но что то никак не получается правильно подобрать аргумент, темболее что newVectorArray у нас уже наполнен ))). 02. по значениям. Допустим в такой масив сложены указатели на CVector3Array масивы существующие внутри одного из колбеков тула(помним тул это класс). Получается нам эти CVector3Array массивы нужно создавать в динамической памяти с помошью new например и в дальнейшем убивать уже указатели внутри нашей структуры. Вот тут теоритическая пропасть у меня ))) |
||||
Bravlin Pechatnik Профиль Статус: слон Группа: Артисты Рейтинг: 2 |
небольшое дополнение: 03. В теории очистить std::shared_ptr тем самым освободить память, можно используя .reset(). Но при попытке сбрасывать так указатели XSI падает замертво. А т.к. std::vector у меня лежит в структуре и наполняется внутри колбека (в моём случае это колбек Draw()) то при каждом попадании указателя на GUI и обратно во вьюпорт срабатывает колбек, только значения указателей не освобождаются, а добавляются и добавляются. Получается в конце колбека нужно указатели освобождать руками. Но как это сделать.
Насколько я понял вся суть умных указателей какраз в том что бы не требовать обязательного освобождения памяти. Или мне достаточно просто очистить сам массив std::vector.Clear() ? |
||
Bravlin Pechatnik Профиль Статус: слон Группа: Артисты Рейтинг: 2 |
04. И последний на сегодня вопрос уже не касаемо структур а касаемо векторной алгебры:
Пытаюсь симитировать Relative слайд ейджей в OGL, в 100% точки не совпадают с конечным вертексом =\ Где-то напортачил в алгоритме рассчёта координат. https://db.tt/8qGzOcQS Алгоритм: // векторное представление ейджа. Edge_vector = Edge_v2 - Edge_v1; // длинна ейджа Edge_length = Edge_vector.GetLength(); // длинна одного процента от длинны этого ейджа 1_perc_length = Edge_length * 0.01; // Эквивалент желаемой длинны согласно процентной длинны ейджа. // UserDefinedScalar - обычный скаляр от пользователя. UserDefinedLength = 1_perc_length * UserDefinedScalar; // Векторный эквивалент согласно желаемой длинны slide_vector = Edge_vector * UserDefinedLength // перемещение векторного эквивалента из начала координат // в координату первого вертекса ейджа slide_vector = Edge_v1 + slide_vector; на трансформ матрицу ту не домножаю пока. |
Bravlin Pechatnik Профиль Статус: слон Группа: Артисты Рейтинг: 2 |
04. Вопрос решён.
slide_vector нужно сначало нормализовать а потом скейлить ) |
Страницы: (5) 1 [2] 3 4 ... Последняя » | Ответ Новая тема |