void CParticleAttachCommand::cmd_Execute ( unsigned flags) { CSourceItems sel(dyna_Int(0)); CLxUser_Item source, item; CLxUser_ValueReference ref; if (dyna_Object (1, ref)) ref.Get (source); for (sel.LoopInit (); sel.LoopNext (item);) { if (SetSource (item, source)) { UpDateUI (item, source); } else { // if there is no source attached, we try to load from file, thus we init features first. // restore settings from file. CLxUser_ChannelRead chanRead; CLxUser_ChannelWrite chanWrite, chanWriteEdit; std::string currentFeature; std::string filename; chanRead.from (item); int index = item.ChannelIndex (CN_FILE_NAME); chanRead.GetString (item, index, filename); OpenVDBItemPreLoader itemPreLoader (filename); chanWrite.setupFrom (item); chanWrite.Set (item, CN_DATA_FILE_NAME, filename.c_str()); std::string featureList; currentFeature = itemPreLoader.getFeatureNameList (featureList); chanWrite.Set (item, FEATURE_NAME_LIST, featureList.c_str()); chanWriteEdit.from (item); chanWriteEdit.Set (item, CURRENT_FEATURE, currentFeature.c_str()); } } }
LxResult CParticleAttachCommand::cmd_Query ( unsigned index, ILxUnknownID vaQuery) { CLxUser_ValueReference ref; CLxUser_ValueArray va(vaQuery); CSourceItems sel(dyna_Int(0)); CLxUser_Item item; CLxUser_Value val; CSourceFinder src; for (sel.LoopInit (); sel.LoopNext (item);) { va.AddEmpty (val); ref.set (val); if (src.Find (item)) { ref.SetObject ( (ILxUnknownID)src.source_item); } } return LXe_OK; }
LxResult CModifierElement::EvalCache (CLxUser_Evaluation &eval, CLxUser_Attributes &attr, CLxObject *cacheRaw, bool prev) { CChanState *cache = dynamic_cast<CChanState *> (cacheRaw); CInfluence *infl; CLxUser_ValueReference ref; ILxUnknownID obj; LxResult rc; infl = new CInfluence; infl->Spawn ((void **) &obj); attr.ObjectRW (index, ref); ref.SetObject (obj); lx::UnkRelease (obj); infl->cur.Read (attr, index + 1); //early out if(!infl->cur.enabled) return LXe_OK; if(infl->cur.resolution != resolution || infl->cur.outputType != outputType || infl->cur.size != size || infl->cur.windSpeed != windSpeed || infl->cur.windDir != windDir || infl->cur.windAlign != windAlign || infl->cur.chop != chop || infl->cur.shortestWave != shortestWave || infl->cur.oceanDepth != oceanDepth || infl->cur.damping != damping || infl->cur.seed != seed || infl->cur.waveHeight != waveHeight || ocean == NULL ) { if (ocean) { delete ocean; } if (context) { delete context; } ocean = infl->cur.reBuildOceanData(); outputType = infl->cur.outputType; if (outputType == 0) { context = ocean->new_context(true,true,false,false); } else { context = ocean->new_context(true,true,false,true); } resolution = infl->cur.resolution; size = infl->cur.size; windSpeed = infl->cur.windSpeed; windDir = infl->cur.windDir; windAlign = infl->cur.windAlign; chop = infl->cur.chop; shortestWave = infl->cur.shortestWave; oceanDepth = infl->cur.oceanDepth; damping = infl->cur.damping; seed = infl->cur.seed; waveHeight = infl->cur.waveHeight; infl->cur.setUpOceanPtrs(ocean, context); } else infl->cur.setUpOceanPtrs(ocean, context); infl->cur.updateOcean(); if (prev) rc = cache->Compare (infl->cur); else rc = LXe_OK; *cache = infl->cur; return rc; }