SoftimageRu Форум -> Edge Slide

Новости • Форум • Помощь • Поиск • Участники • Календарь • База


Страницы: (5) 1 [2] 3 4 ... Последняя »  ( Перейти к первому непрочитанному сообщению ) Ответ в темуОтвет      Создание новой темыНовая тема   

> Edge Slide, алгоритм ?   
maxFox
Профиль
Статус: нажиматель кнопок
Группа: Элита
Рейтинг: 17
Цитата
Можно ли как-то в этот колбек передать массивы посчитанные внутри Tool'a и его колбеков ?

я реализовывал подобную штуку. можно создать свою область памяти, и ссылкой на память делится. Правда это не встроенная штука в Кси. основана на Сишных ссылках. А адрес самой ссылки я передавал через проперти. Причем адрес конвертировал и записвал на проперти. как три целых числа. Тот ещё геморрой, но работало! я так реализовывал взаимодействие между операторами и айсом.
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQ
Цитировать сообщение Дата 9.12.2015 - 23:13 Top
Bravlin Pechatnik
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 2
Вот я читая SDK в ту же сторону смотрю.
Но пока что-то не завелось.
Допустим вот такой псевдокод:
Код

struct myStruct
{
       XSI::CLongArray polyData;
       XSI::CValueArray edgeSegmentsArray;
}

SICALLBACK myCmd_Execute( CRef& in_ctxt )
{
      PlugData pData;
      "заполняем масивы и т.д.";
      PlugData * pDataPtr;
      pDataPtr = &pData;
      ctxt.PutUserData(XSI::CValue(pDataPtr));     // добавляем в качестве UserData значение указателя на структуру
}

SICALLBACK myOperator_Update( CRef& in_ctxt )
{
       OperatorContext ctxt( in_ctxt );
       CValue userData(ctxt.GetUserData());         // получаем значение указателя на структуру

       update_func(ctxt);

       return CStatus::OK;
}


Здесь во время исполнения команды myCmd к контексту подключается в
качесвте UserData адрес указателя на структуру. Дальше уже внутри Update
колбека оператора myOperator мы должны получить этот адрес с помощью
ctxt.GetUserData(). Но то ли адрес освобождается раньше то ли я что-то
неправильно передаю\получаю.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 10.12.2015 - 00:47 Top
Mr.Core
Профиль
Статус: -
Группа: Модераторы
Рейтинг: 17
pData на стеке аллоцирован, уничтожается при выходе из области видимости, т.е. после putuserdata
аллоцируй через PlugData * pDataPtr = new PlugData ;
и удаляй в operator_term колбеке
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователя
Цитировать сообщение Дата 10.12.2015 - 20:11 Top
Bravlin Pechatnik
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 2
Русская версия более подробная. :good: Спасибо Олег.
А избежать использования UserData и Property не получится видимо.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 10.12.2015 - 20:39 Top
Bravlin Pechatnik
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 2
Вобщем пробовал написать то что предложил Steven Caron,
подключать UserData к самому плагину внутри XSILoadPlugin().
Код

   struct myStruct{
          XSI::CLongArray polyData;
          XSI::CValueArray edgeSegmentsArray;
   }
   SICALLBACK XSILoadPlugin( PluginRegistrar& in_reg ){
         PlugData * pDataPtr = new PlugData;
         CValue ptrValue = (CValue::siPtrType) pDataPtr;
         in_reg.PutUserData(ptrValue);
   }
   SICALLBACK XSIUnloadPlugin( PluginRegistrar& in_reg ){
         CValue ptrValue = in_reg.GetUserData();
         PlugData* ptr_pData = (PlugData*)(CValue::siPtrType)ptrValue;
         delete ptr_pData;
   }


В результате возникли проблемы с вызгрузкой данных из памяти.
Вот такую ошибку хипа я получал при попытке выгрузить плагин:
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.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 17.12.2015 - 19:57 Top
Bravlin Pechatnik
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 2
При этом если подключить UserData к инстансу PluginRegistrar , то-есть через колбек
SICALLBACK XSILoadPlugin( PluginRegistrar& in_reg )
то эту UserData действительно можно получить и внутри Operator'a и внутри Tool'a и внутри Command инстов.
Вся проблема только в выгрузке плагина и освобождении памяти.

Даже вот что откопал :)
http://softimage.ru/forums/index.php?showtopic=7580
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 17.12.2015 - 21:35 Top
Bravlin Pechatnik
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 2
[ solved ]
Юзердату добавляем внутри _init() колбека команды. Т.к. данный колбек
вызывается единожды при первом обращении к команде плагина, это нужно учитывать.
Удаляем внутри _Unload() колбека плагина. Так мы не потеряем юезрдату при
удалении Оператора из стека моделирования.
Получать юзердату по аналогии и в др колбеках.
Т.к. она подключается к плагину она доступна для всех элементов
плагина и не требует передачи инстов тула, оператора, команды и т.д. с
подключеной юзердатой.

Код

struct myStruct{
      XSI::CLongArray polyData;
      XSI::CValueArray edgeSegmentsArray;
}

SICALLBACK XSILoadPlugin( PluginRegistrar& in_reg ){
      in_reg.PutName(L"myPlugin");
      in_reg.RegisterCommand(L"myCustomCommand",L"myCustomCommand");
      in_reg.RegisterOperator(L"myCustomOperator");
}

SICALLBACK myCustomCommand_Init(CRef& in_ctxt ){
      CRefArray pluginArray = Application().GetPlugins();                  
      for (LONG i=0; i<pluginArray.GetCount(); i++)
      {
         Plugin plugin(pluginArray[i]);                                    
         CString plugname(plugin.GetName());                              
         if (CValue(plugname).GetAsText() == "myPlugin")
         {
               PlugData * pDataPtr = new PlugData;                          
               CValue ptrValue = (CValue::siPtrType) pDataPtr;              
               plugin.PutUserData(ptrValue);                                
                                                                     
         }
      }

}

SICALLBACK XSIUnloadPlugin( const PluginRegistrar& in_reg ){
      CRefArray pluginArray = Application().GetPlugins();                
      CValue ptrAdress;                                                  
                                                                   
      for (LONG i=0; i<pluginArray.GetCount(); i++)
      {
         Plugin plugin(pluginArray[i]);                                  
         CString plugname(plugin.GetName());                            
         if (CValue(plugname).GetAsText() == "avUniversalDivide Plugin")
         {
            ptrAdress = plugin.GetUserData();                          
         }
      }

      if(ptrAdress .IsEmpty())
      {
         Application().LogMessage(L"EMPTY POINTER RECIVED FROM PLUGIN USERDATA ");
      }
      else
      {
          PlugData* ptr_pData = (PlugData*)(CValue::siPtrType)ptrValue;            
          delete ptr_pData;                                                        
       }
}
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 21.12.2015 - 14:07 Top
Bravlin Pechatnik
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 2
В какой массив можно вложить несколько CVector3Array массивов
[ CVector3Array, CVector3Array, CVector3Array ] ?
CValueArray может содержать несколько CLongArray массивов,
но CVector3Array он по аналогии принимать не хочет.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 29.12.2015 - 23:06 Top
maxFox
Профиль
Статус: нажиматель кнопок
Группа: Элита
Рейтинг: 17
а почему не создать свою собственную структуру? стандартный вектор?
Код
std::vector<  CVector3Array > pntChain
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQ
Цитировать сообщение Дата 30.12.2015 - 22:47 Top
Mr.Core
Профиль
Статус: -
Группа: Модераторы
Рейтинг: 17
насколько я помню у ксишных массивов нету конструктора перемещения, и массивы копируются по значению, и при ресайзе std vector может быть лишний оверхед. Лучше заюзать
std::vector < std::shared_ptr <CVector3Array> > pntChain
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователя
Цитировать сообщение Дата 30.12.2015 - 23:40 Top
Bravlin Pechatnik
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 2
спасибо за советы ребят. 2го января будем пробовать ))) С НАСТУПАЮЩИМ !!!
:lazy2:
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 31.12.2015 - 16:54 Top
Bravlin Pechatnik
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 2
C 1м примером понятно. Тут в структуру копируется значение CVector3Array.
Код
struct myData{
std::vector<  CVector3Array > pntChain;
}
...
CVector3Array newVectorArray;
myData newStruct;
newStruct.pntChain.push_back(newVectorArray);


Хочется немного прояснить теоретическую часть по 2у примеру.
Код
struct myData{
std::vector < std::shared_ptr <CVector3Array> > pntChain;
}
...
CVector3Array newVectorArray;
myData newStruct;
newStruct.pntChain.push_back( ??? );

01. не очень понятно как его наполнять. Я так понимаю в таком виде это уже не
масив значений а массив указателей и он хочет в качестве аргумента std::shared_ptr
с типом указателя CVector3Array. Но что то никак не получается правильно
подобрать аргумент, темболее что newVectorArray у нас уже наполнен ))).

02. по значениям. Допустим в такой масив сложены указатели на CVector3Array
масивы существующие внутри одного из колбеков тула(помним тул это класс).
Получается нам эти CVector3Array массивы нужно создавать в динамической памяти
с помошью new например и в дальнейшем убивать уже указатели внутри нашей структуры.
Вот тут теоритическая пропасть у меня )))
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 2.01.2016 - 12:25 Top
Bravlin Pechatnik
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 2
небольшое дополнение:
03. В теории очистить std::shared_ptr тем самым освободить память, можно используя .reset().
Но при попытке сбрасывать так указатели XSI падает замертво.
А т.к. std::vector у меня лежит в структуре и наполняется внутри колбека
(в моём случае это колбек Draw()) то при каждом попадании указателя на GUI и
обратно во вьюпорт срабатывает колбек, только значения указателей не
освобождаются, а добавляются и добавляются. Получается в конце колбека
нужно указатели освобождать руками. Но как это сделать.
Код

struct myData{
   std::vector < std::shared_ptr <CVector3Array> > pntChain;
}
Class myTool{
   CStatus Draw(ToolContext& in_ctxt){
       CVector3Array newVectorArray;
       myData newStruct;
       std::shared_ptr<CVector3Array> newVectorArrayPtr (new CVector3Array (newVectorArray));
       newStruct.pntChain.push_back( newVectorArrayPtr );
       return CStatus::OK;
   }
}

Насколько я понял вся суть умных указателей какраз в том что бы не требовать обязательного освобождения памяти.

Или мне достаточно просто очистить сам массив std::vector.Clear() ?
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 2.01.2016 - 14:28 Top
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;

на трансформ матрицу ту не домножаю пока.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 2.01.2016 - 21:40 Top
Bravlin Pechatnik
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 2
04. Вопрос решён.
slide_vector нужно сначало нормализовать а потом скейлить )
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 3.01.2016 - 00:22 Top
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Страницы: (5) 1 [2] 3 4 ... Последняя » Ответ в темуОтвет      Создание новой темыНовая тема   

 

Текстовая версия