SoftimageRu Форум -> Организация userdata

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


  Ответ в темуОтвет      Создание новой темыНовая тема   

> Организация userdata   
Mr.Core
Профиль
Статус: -
Группа: Модераторы
Рейтинг: 17
Здравствуйте
пытаюсь написать айс ноду, для правильной работы необходимо выделять память под массив для промежуточных данных, которые должны существовать на протяжении всей симуляции, не знаю с какой стороны подойти

Сейчас тыкаю GetUserData \ PutUserData методы из класса Контекста, главная проблема что при удалении выделенной памяти выбивает ошибку мол я пытаюсь почитсть память за границами выделенной


Выделение памяти при инициализации ноды
Код
SICALLBACK cuda_iWave_Init( CRef& in_ctxt )
{
Context ctxt (in_ctxt);
//CTime time; // TIme access
   //time.GetTime();
   float* VALUE_POINTER = (float*)malloc(sizeof(float));
ctxt.PutUserData( (CValue::siPtrType) VALUE_POINTER );
return CStatus::OK;
}


Расширение памяти в зависимости от входных данных ( происходит в каждом кадре До начала основного просчета )

Код
SICALLBACK cuda_iWave_BeginEvaluate( ICENodeContext& in_ctxt )
{  
CDataArrayVector2f Grid_size( in_ctxt , ID_IN_Grid_size );
float input_size = Grid_size[0].GetX() * Grid_size[0].GetY();
CValue userData = in_ctxt.GetUserData();
if (userData.IsEmpty())
{
 return CStatus::Unexpected;
};
float * VALUE_POINTER = (float*)(CValue::siPtrType)userData;
if ( input_size != VALUE_POINTER[0] )
{
       VALUE_POINTER = (float*)realloc ( VALUE_POINTER , input_size*sizeof(float) + 1 );
 VALUE_POINTER[0] = input_size;
 for ( int i=0; i<(int)input_size; i++ )
 {
     VALUE_POINTER[i+1] = 0.0f;
 };
 in_ctxt.PutUserData( (CValue::siPtrType) VALUE_POINTER );
 VALUE_POINTER = NULL;
    return CStatus::OK;
};
VALUE_POINTER = NULL;
return CStatus::OK;
}


Потом собсно идет сам просчет, но я там все откоментил, поэтому ничего не просиходит в том келбеке

и собсно сам процесс удаления

Код

SICALLBACK cuda_iWave_Term( CRef& in_ctxt )
{
   Context ctxt (in_ctxt);
   CValue userData = ctxt.GetUserData( );
if (userData.IsEmpty())
{
 return CStatus::Unexpected;
}
float * VALUE_POINTER = (float*)(CValue::siPtrType)userData;
 

if (VALUE_POINTER)
 free ( VALUE_POINTER );
VALUE_POINTER = NULL;

ctxt.PutUserData( CValue() );
return CStatus::OK;
}

если код - явный быдлокод, ткните носом что не так делаю ;)

ЗЫ терзают сомнения, что лучше юзать userdatablob вместо этого
Спасибо
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователя
Цитировать сообщение Дата 1.04.2011 - 23:42 Top
maxFox
Профиль
Статус: нажиматель кнопок
Группа: Элита
Рейтинг: 17
Коекретно для Айс-ноды не знаю, на кастом операторе все просто:

1. ЮзерДата описывается, как класс
пример:
Код

class PlugData
{
public:
PlugData()
{
 cnt = 10;
 dat = 4.56f;
 //uvs = NULL;

 //adress =0;
}
///////
int cnt;
LLONG adress;

CDoubleArray uvs;
CLongArray indexes;
float dat;
bool firstLoad;
//std::vector< int > datArray;
};


2. Инициализируется в _init калбеке:
Код

SICALLBACK mx_4sided_Init( CRef& in_ctxt )
{
OperatorContext ctxt( in_ctxt );

PlugData* p = new PlugData(); // создаём струкруру
       // - можно изменить/ввести данные
CValue cval = (CValue::siPtrType) p;
ctxt.PutUserData( cval );

return CStatus::OK;
}


3. Удаление в _term калбеке:
Код

SICALLBACK mx_4sided_Term( CRef& in_ctxt )
{
  OperatorContext ctxt( in_ctxt );
   
  CValue val = ctxt.GetUserData();  
  PlugData* p = (PlugData*)(CValue::siPtrType)val;

  delete p;// удаляем Юсер-дату

  return CStatus::OK;
}


думаю, что организация в айс-нодах идентична
п.с. ну, конечно, класс может быль любой структуры, т.к. в Юзердата сохраняется только ссылка на инициализируемую структуру.
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQ
Цитировать сообщение Дата 2.04.2011 - 00:05 Top
Mr.Core
Профиль
Статус: -
Группа: Модераторы
Рейтинг: 17
Ага, спасибо большое, завтра буду пробовать :)
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователя
Цитировать сообщение Дата 2.04.2011 - 00:07 Top
alCa
Профиль
Статус: слон
Группа: Элита
Рейтинг: 13
Привет всем.
сижу потихоньку ковыряю для кси плугин. айс ноду. Так вот никак не въеду как правильно забить 2д массив чтобы с ним в последствии производить расчёты. Понимаю что нужно использовать юзердату но вообще не понимаю как это работает.
по примеру из СДК автодеска в колбеке беггин евалуейт пишу следующее

CValue userData = in_ctxt.GetUserData();
ULONG nThreadCount = in_ctxt.GetEvaluationThreadCount();
std::vector<MATH::CVector3f >* pPointVector = NULL;
if (userData.IsEmpty())
{
pPointVector = new std::vector<MATH::CVector3f >;
in_ctxt.PutUserData((CValue::siPtrType)pPointVector);
}
else
{
// Reuse the user data buffer if already created.
pPointVector = (std::vector<MATH::CVector3f >*)(CValue::siPtrType)in_ctxt.GetUserData();
}
if (pPointVector && pPointVector->size() < nThreadCount)
{
// Extend buffer if needed
for (ULONG i = (ULONG)pPointVector->size(); i < nThreadCount; i++)
{
// Create a CSampleData object for each thread
pPointVector->push_back(MATH::CVector3f());
}
}

тут как я понимаю происходит чтото типа инициализации 2д вектора
дальше мне нужно забить этот вектор данными со входа ноды (поинтпозишены. они с каждым фрэймом прибавляютьбся ). вот тут я плыву. не могу понять где это делать и как.
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQ
Цитировать сообщение Дата 13.08.2018 - 21:13 Top
alCa
Профиль
Статус: слон
Группа: Элита
Рейтинг: 13
Опять я. Вопрос тот же, на входе ноды в айсе поинтпозишены которые мне нужно занести в массив .Далее я с этим маасивом буду производить расчёты. и потом эти расчёты нужно вывести обратно в айс ноде на выход. Может есть пример подходящий какой?
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQ
Цитировать сообщение Дата 19.08.2018 - 12:08 Top
Mr.Core
Профиль
Статус: -
Группа: Модераторы
Рейтинг: 17
тебе надо что бы массив хранился между отдельными вызовами evaluate ноды ?
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователя
Цитировать сообщение Дата 19.08.2018 - 16:06 Top
alCa
Профиль
Статус: слон
Группа: Элита
Рейтинг: 13
наверно да. рассчёты нужно производить сразу над всеми поинтпозишенами одновременно а не по порциям как это позволяет вызов evaluate.
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQ
Цитировать сообщение Дата 19.08.2018 - 20:45 Top
Mr.Core
Профиль
Статус: -
Группа: Модераторы
Рейтинг: 17
Подробнее опиши что надо получить. Пример из сдк не в тему, там создают массив значений класса CSampleData, кол-во элементов массива равно кол-ву тредов, под мультипоток рассчитано
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователя
Цитировать сообщение Дата 20.08.2018 - 04:11 Top
alCa
Профиль
Статус: слон
Группа: Элита
Рейтинг: 13
В айсе генерятся патиклы каждый фрэйм добавляються новые. Я завожу поинтпозишен на вход моей ноды. все поинтпозишены патиклов должны сохраниться в массив. Далее в теле кода с++ мне нужно произвести вычисления над всеми патиклами одновременно. По порциям как позволяет вызов эвалюэйт не годиться(ну может и можно как то и с этим работать но тогда я вообще закопаюсь, или я чегото не знаю). Далее полученный результат нужно выдать на выход моей ноды ,чтобы в айсе поинтпозишены этих патиклов получи новые значения.
Может ты делал чтото такое же когда писал свой плугин для Waterfall_FX.
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQ
Цитировать сообщение Дата 20.08.2018 - 14:03 Top
Mr.Core
Профиль
Статус: -
Группа: Модераторы
Рейтинг: 17
это физиковский который? линк на сорсы, может поможет чем-то
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователя
Цитировать сообщение Дата 22.08.2018 - 00:24 Top
alCa
Профиль
Статус: слон
Группа: Элита
Рейтинг: 13
спс. буду курить
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQ
Цитировать сообщение Дата 22.08.2018 - 16:47 Top
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуОтвет      Создание новой темыНовая тема   

 

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