void CompositeMat::PreShade(ShadeContext& sc, IReshadeFragment* pFrag) { int i(0); Mtl *submtl = NULL; // BOOL enabled(FALSE); char texLengths[12]; int lengthChan = pFrag->NTextures(); pFrag->AddIntChannel(0); pFrag->AddIntChannel(0); pFrag->AddIntChannel(0); int nPrevTex = 3 + lengthChan; // preshade any submaterials for (i=0; i<MAX_NUM_MTLS; i++) { pblock2->GetValue(compmat_mtls, sc.CurTime(), submtl, FOREVER, i); if (submtl){ IReshading* pReshading = (IReshading*)(submtl->GetInterface(IID_IReshading)); if( pReshading ){ pReshading->PreShade(sc, pFrag); int nTex = pFrag->NTextures(); texLengths[i] = char( nTex - nPrevTex); nPrevTex = nTex; } } } int* pI = (int*)&texLengths[0]; pFrag->SetIntChannel( lengthChan++, pI[0] ); pFrag->SetIntChannel( lengthChan++, pI[1] ); pFrag->SetIntChannel( lengthChan, pI[2] ); }
void M3Mat::PreShade(ShadeContext& sc, IReshadeFragment* pFrag) { int i; IReshading* pReshading; TimeValue t = sc.CurTime(); Interval valid = FOREVER; // get the base material value into i pblockMat->GetValue(100, t, i, valid ); Mtl *sm1 = mTex[100]; // handle no base mat if(sm1 == NULL) { return; } if(i==0||(i==1&&inRender)) { for( i=0;i<100;i++) { float u; pblockMat->GetValue(i,t,u,valid); if(mTex[i]!=NULL && u!=0 && mapOn[i]) { Mtl *comb = mTex[i]; pReshading = (IReshading*)(comb->GetInterface(IID_IReshading)); if( pReshading ) pReshading->PreShade(sc, pFrag); } } pReshading = (IReshading*)(sm1->GetInterface(IID_IReshading)); if( pReshading ) pReshading->PreShade(sc, pFrag); } else { // i == 1 && not inRender pReshading = (IReshading*)(sm1->GetInterface(IID_IReshading)); if( pReshading ) pReshading->PreShade(sc, pFrag); } }