int PMaterialIterator(const CKBehaviorContext& behcontext) { CKBehavior* beh = behcontext.Behavior; CKContext* ctx = behcontext.Context; PhysicManager *pm = GetPMan(); pFactory *pf = pFactory::Instance(); if (beh->IsInputActive(0)) { beh->ActivateInput(0,FALSE); ////////////////////////////////////////////////////////////////////////// //we reset our session counter int sessionIndex=-1; beh->SetOutputParameterValue(0,&sessionIndex); LMaterials*sResults = NULL; beh->GetLocalParameterValue(0,&sResults); if (!sResults) { sResults = new LMaterials(); }else sResults->clear(); NxScene * scene = GetPMan()->getDefaultWorld()->getScene(); for(int i = 0 ; i < GetPMan()->getDefaultWorld()->getScene()->getNbMaterials() ; i ++) { NxMaterial *currentMaterial = scene->getMaterialFromIndex(i); sResults->push_back(currentMaterial); } beh->SetLocalParameterValue(0,&sResults); if (sResults->size()) { beh->ActivateInput(1); }else { beh->ActivateOutput(0); return 0; } } if( beh->IsInputActive(1) ) { beh->ActivateInput(1,FALSE); int currentIndex=0; CKParameterOut *pout = beh->GetOutputParameter(0); pout->GetValue(¤tIndex); currentIndex++; LMaterials *sResults = NULL; beh->GetLocalParameterValue(0,&sResults); if (!sResults) { beh->ActivateOutput(0); return 0; } if (currentIndex>=sResults->size()) { sResults->clear(); beh->ActivateOutput(0); return 0; } NxMaterial * material = sResults->at(currentIndex); if (material!=NULL) { int sIndex = currentIndex+1; beh->SetOutputParameterValue(0,&sIndex); //SetOutputParameterValue<int>(beh,O_XML,material->xmlLinkID); SetOutputParameterValue<float>(beh,O_DFRICTION,material->getDynamicFriction()); SetOutputParameterValue<float>(beh,O_SFRICTION,material->getStaticFriction()); SetOutputParameterValue<float>(beh,O_RES,material->getRestitution()); SetOutputParameterValue<float>(beh,O_DFRICTIONV,material->getDynamicFrictionV()); SetOutputParameterValue<float>(beh,O_SFRICTIONV,material->getStaticFrictionV()); SetOutputParameterValue<VxVector>(beh,O_ANIS,getFrom(material->getDirOfAnisotropy())); SetOutputParameterValue<int>(beh,O_FCMODE,material->getFrictionCombineMode()); SetOutputParameterValue<int>(beh,O_RCMODE,material->getFrictionCombineMode()); SetOutputParameterValue<int>(beh,O_FLAGS,material->getFlags()); } if(material->userData ) { pMaterial *bMaterial = static_cast<pMaterial*>(material->userData); if (bMaterial && bMaterial->xmlLinkID ) { int xid = bMaterial->xmlLinkID; XString nodeName = vtAgeia::getEnumDescription(GetPMan()->GetContext()->GetParameterManager(),VTE_XML_MATERIAL_TYPE,xid); CKParameterOut *nameStr = beh->GetOutputParameter(O_NAME); nameStr->SetStringValue(nodeName.Str()); } } //pFactory::Instance()->copyTo(beh->GetOutputParameter(O_MATERIAL),material); beh->ActivateOutput(0); } return 0; }
pWorld*pFactory::createWorld(CK3dEntity* referenceObject, pWorldSettings *worldSettings,pSleepingSettings *sleepSettings) { using namespace vtTools::AttributeTools; using namespace vtTools::ParameterTools; ////////////////////////////////////////////////////////////////////////// //sanity checks : if (!referenceObject || !GetPMan() ) { return NULL; } if (!getPhysicSDK()) { //xLogger::xLog(XL_START,ELOGWARNING,E_LI_MANAGER,"No physic sdk loaded"); return NULL; } int worldAtt = GetPMan()->att_world_object; int surfaceAttribute = GetPMan()->att_surface_props; //exists ? Delete it ! pWorld *w = GetPMan()->getWorld(referenceObject->GetID()); if (w) { GetPMan()->deleteWorld(referenceObject->GetID()); } //our new world : pWorld *result = new pWorld(referenceObject); GetPMan()->getWorlds()->InsertUnique(referenceObject,result); result->initUserReports(); ////////////////////////////////////////////////////////////////////////// //there is no world settings attribute : if (!referenceObject->HasAttribute(worldAtt) ) { referenceObject->SetAttribute(worldAtt); using namespace vtTools; VxVector grav = worldSettings->getGravity(); float sWith = worldSettings->getSkinWith(); AttributeTools::SetAttributeValue<VxVector>(referenceObject,worldAtt,0,&grav); AttributeTools::SetAttributeValue<float>(referenceObject,worldAtt,1,&sWith); } if (!worldSettings) { worldSettings = pFactory::Instance()->createWorldSettings(XString("Default"),GetPMan()->getDefaultConfig()); } if (!worldSettings) { worldSettings = new pWorldSettings(); } ////////////////////////////////////////////////////////////////////////// //pSDK Scene creation : // Create a scene NxSceneDesc sceneDesc; sceneDesc.gravity = pMath::getFrom(worldSettings->getGravity()); sceneDesc.upAxis = 1; sceneDesc.flags |=NX_SF_ENABLE_ACTIVETRANSFORMS; sceneDesc.userNotify =&myNotify; sceneDesc.userContactReport = result->contactReport; NxScene *scene = NULL; if (getPhysicSDK()) { scene = getPhysicSDK()->createScene(sceneDesc); if(scene == NULL) { xLogger::xLog(XL_START,ELOGERROR,E_LI_MANAGER,"Couldn't create scene!"); return NULL; } } result->setScene(scene); scene->setUserContactReport(result->contactReport); scene->setUserTriggerReport(result->triggerReport); NxMaterialDesc *materialDescr = NULL; NxMaterial *material = NULL; if (referenceObject->HasAttribute(surfaceAttribute)) { materialDescr = createMaterialFromEntity(referenceObject); material = result->getScene()->createMaterial(*materialDescr); material->userData = (void*)GetValueFromParameterStruct<int>(referenceObject->GetAttributeParameter(surfaceAttribute) ,E_MS_XML_TYPE); }else{ if (getDefaultDocument()) { materialDescr = createMaterialFromXML("Default",getDefaultDocument()); } if (materialDescr) { material = result->getScene()->createMaterial(*materialDescr); } if (!material) { materialDescr = new NxMaterialDesc(); materialDescr->setToDefault(); material = result->getScene()->getMaterialFromIndex(0); material->loadFromDesc(*materialDescr); } } int z = (int)material->userData; NxMaterial *zeroMaterial = result->getScene()->getMaterialFromIndex(0); zeroMaterial->setDirOfAnisotropy(material->getDirOfAnisotropy()); zeroMaterial->setStaticFriction(material->getStaticFriction()); zeroMaterial->setDynamicFriction(material->getDynamicFriction()); zeroMaterial->setStaticFrictionV(material->getStaticFrictionV()); zeroMaterial->setDynamicFrictionV(material->getDynamicFrictionV()); zeroMaterial->setFrictionCombineMode(material->getFrictionCombineMode()); zeroMaterial->setRestitutionCombineMode(material->getRestitutionCombineMode()); zeroMaterial->setFlags(material->getFlags()); zeroMaterial->userData = material->userData; if (!material) { xLogger::xLog(XL_START,ELOGERROR,E_LI_MANAGER,"Couldn't create default material!"); } result->setDefaultMaterial(material); scene->userData = result; //NxConstraintDominance testDom(1.0, 1.0f); //result->getScene()->setDominanceGroupPair(1, 2,testDom ); //board - debris ////////////////////////////////////////////////////////////////////////// //there is no world settings attribute : /* if (!referenceObject->HasAttribute(GetPMan()->att_sleep_settings) ) { referenceObject->SetAttribute(GetPMan()->att_sleep_settings); using namespace vtTools; AttributeTools::SetAttributeValue<int>(referenceObject,GetPMan()->att_sleep_settings,0,&sSettings->m_SleepSteps); AttributeTools::SetAttributeValue<float>(referenceObject,GetPMan()->att_sleep_settings,1,&sSettings->m_AngularThresold); AttributeTools::SetAttributeValue<float>(referenceObject,GetPMan()->att_sleep_settings,2,&sSettings->m_LinearThresold); AttributeTools::SetAttributeValue<int>(referenceObject,GetPMan()->att_sleep_settings,3,&sSettings->m_AutoSleepFlag); } */ /* result->SleepingSettings(sSettings); ////////////////////////////////////////////////////////////////////////// result->Reference(referenceObject); result->Init(); */ result->_checkForDominanceConstraints(); result->_construct(); return result; //return NULL; }