RefTargetHandle CloneRef(RefTargetHandle oldTarg)
 {
     if (oldTarg == NULL)
         return NULL;
     else if (oldTarg->SuperClassID() == PARAMETER_BLOCK2_CLASS_ID)
         return oldTarg->Clone(*this);
     else
         return oldTarg;
 }
예제 #2
0
void mrTwoSidedShader::SetReference(int i, RefTargetHandle rtarg) {

	switch(i) {
	case kRef_MainPB:
		DbgAssert((rtarg == NULL) || (rtarg->SuperClassID() == PARAMETER_BLOCK2_CLASS_ID));
		if((rtarg == NULL) || (rtarg->SuperClassID() == PARAMETER_BLOCK2_CLASS_ID))
			m_mainPB = static_cast<IParamBlock2*>(rtarg);
		break;
	default:
		break;
	}
}
예제 #3
0
//This function will determine whether the effect needs rebuiling or the change comes from a EffectElement managed parameter
RefResult DxStdMtl2::NotifyMaterialChanged(Interval changeInt, RefTargetHandle hTarget, PartID& partID, RefMessage message)
{
	bool supported = false;
	RefResult res = REF_SUCCEED;

	if(IsDxMaterialEnabled(map)&& !bReEntrant)
	{
/*		if(hTarget->SuperClassID() == SClass_ID(TEXMAP_CONTAINER_CLASS_ID))
		{
			Texmap * tex = (Texmap*)hTarget;
			if(!tex->TestMtlFlag(MTL_HW_TEX_ENABLED))
				return REF_SUCCEED;

		}
*/
		if(hTarget->ClassID() == Class_ID(PARAMETER_BLOCK2_CLASS_ID,0))
		{
			IParamBlock2 * pblock = (IParamBlock2*)hTarget;
			if(CheckParamBlock(pblock))
				return REF_SUCCEED;
		}
		for(int i=0; i< hTarget->NumParamBlocks();i++)
		{
			IParamBlock2 * pblock = hTarget->GetParamBlock(i);
			if(CheckParamBlock(pblock))
				return REF_SUCCEED;
		}
		if(!supported){
//			ReEntrantCount--;
			bReEntrant = true;
			CreateAndLoadEffectData();
		}
	}
	else
	{
		res = bReEntrant ? REF_STOP : REF_SUCCEED;
//		ReEntrantCount = RENTRANT_COUNT;
		bReEntrant = false;	
	}
	//make sure the cache is flushed...
	if(!IsDxMaterialEnabled(map))
	{
		elementContainer.DeleteAllElements();
		if(pEffectParser){
			pEffectParser->DestroyParser();
			pEffectParser = NULL;
		}
	}

	return res;
}
예제 #4
0
RefResult CompositeMat::NotifyRefChanged(
		Interval changeInt, 
		RefTargetHandle hTarget, 
		PartID& partID, 
		RefMessage message)
	{
	switch (message) {
 		case REFMSG_CHANGE:
			if (hTarget == pblock2)	{
				ivalid.SetEmpty();
//				compmat_param_blk.InvalidateUI();
				ParamID changing_param = pblock2->LastNotifyParamID();
				compmat_param_blk.InvalidateUI(changing_param);
				if( (changing_param == compmat_amount )
					||(changing_param == compmat_map_on )
					||(changing_param == compmat_type ))
				{
					mReshadeRQ = RR_NeedReshade;
				} else if( changing_param == compmat_mtls ) {
					mReshadeRQ = RR_NeedPreshade; // really want to get from mtl, but dont have it
//					NotifyChanged();
				}
			} else {
				ivalid.SetEmpty();
				NotifyChanged();
			}

			if (hTarget != NULL) {
				switch (hTarget->SuperClassID()) {
					case MATERIAL_CLASS_ID: {
						// never hit for this mtl ????
						IReshading* r = static_cast<IReshading*>(hTarget->GetInterface(IID_IReshading));
						mReshadeRQ = r == NULL ? RR_None : r->GetReshadeRequirements();
					} break;
				}
			}
			break;
		case REFMSG_SUBANIM_STRUCTURE_CHANGED:
			if ((hTarget!=this))
				return REF_SUCCEED;

			mReshadeRQ = RR_NeedPreshade;
			NotifyChanged();
			break;
			
	}
	return REF_SUCCEED;
}
예제 #5
0
RefResult M3Mat::NotifyRefChanged(
		Interval changeInt, 
		RefTargetHandle hTarget, 
		PartID& partID, 
		RefMessage message)
	{
	switch (message) {
		case REFMSG_CHANGE:
			if (matDlg && matDlg->theMtl==this) {
				matDlg->Invalidate();
			}
			if( hTarget == pblockMat ){
				mReshadeRQ = RR_NeedPreshade;
				NotifyDependents(FOREVER, PART_ALL, REFMSG_CHANGE);
			}
			else if (hTarget != NULL) {
				switch (hTarget->SuperClassID()) {
					case MATERIAL_CLASS_ID: {
						IReshading* r = static_cast<IReshading*>(hTarget->GetInterface(IID_IReshading));
						mReshadeRQ = (r == NULL)? RR_None : r->GetReshadeRequirements();
					} break;
				}
			}
		break;

		case REFMSG_SUBANIM_STRUCTURE_CHANGED:
			mReshadeRQ = RR_NeedPreshade;
			NotifyDependents(FOREVER, PART_ALL, REFMSG_CHANGE);
		break;
				
		case REFMSG_GET_PARAM_DIM: {
			GetParamDim *gpd = (GetParamDim*)partID;
			gpd->dim = stdPercentDim;
			return REF_STOP; 
			}

		case REFMSG_GET_PARAM_NAME: {
			GetParamName *gpn = (GetParamName*)partID;
			char s[50];
			sprintf(s,GetString(IDS_MTL_CNAME),gpn->index);
			gpn->name = s;
			return REF_STOP; 
			}
		}
	return REF_SUCCEED;
	}
예제 #6
0
RefResult Matte::NotifyRefChanged(
      const Interval& changeInt, 
      RefTargetHandle hTarget, 
      PartID& partID, 
	  RefMessage message, 
	  BOOL propagate)
   {
   switch (message) {
      case REFMSG_CHANGE:
         if (hTarget == pblock)
            {
            ivalid.SetEmpty();
         // see if this message came from a changing parameter in the pblock,
         // if so, limit rollout update to the changing item and update any active viewport texture
            ParamID changing_param = pblock->LastNotifyParamID();
            matte_param_blk.InvalidateUI(changing_param);
            if( (changing_param == matte_receive_shadows)
               ||(changing_param == matte_shadow_brightness)
               ||(changing_param == matte_color)
               ||(changing_param == matte_reflection_amount)
               ||(changing_param == matte_use_reflection_map))
            {
               mReshadeRQ = RR_NeedReshade;
            } else if (changing_param == -1) 
               mReshadeRQ = RR_NeedPreshade;
             else 
               mReshadeRQ = RR_None;
         }

         if (hTarget != NULL) {

            switch (hTarget->SuperClassID()) {
               case TEXMAP_CLASS_ID: {
                     mReshadeRQ = RR_NeedPreshade;
               } break;
//             default:
//                mReshadeRQ =RR_NeedReshade;
//             break;
            }

         }
         break;

      case REFMSG_SUBANIM_STRUCTURE_CHANGED:
//       if (partID == 0) 
//          mReshadeRQ = RR_None;
//       else {
//          mReshadeRQ = RR_NeedPreshade;
//          NotifyChanged();
//       }
         break;
      
   }
   return REF_SUCCEED;
}