void M3Mat::Shade(ShadeContext& sc) { int i; TimeValue t = sc.CurTime(); Interval valid = FOREVER; pblockMat->GetValue(100,t,i,FOREVER); Mtl *sm1 = mTex[100]; float total(0.0f); ShadeOutput sFinal( sc.out.nElements ); // get nElements correctly ShadeOutput sDatabase[100]; // for( i = 0; i < 100; ++i ) // sDatabase[i] = sFinal; float u[100]; // handle no base mat if(!sm1) { sc.ResetOutput(); sc.out.c = black; sc.out.t = black; return; } if(i==0||(i==1&&inRender)) { for( i=0;i<100;i++) { pblockMat->GetValue(i,t,u[i],valid); u[i] /= 100.0f; if(mTex[i]!=NULL&&u[i]!=0&&mapOn[i]) { Mtl *comb = mTex[i]; comb->Shade(sc); sDatabase[i] = sc.out; sc.ResetOutput(); total += u[i]; } } sc.ResetOutput(); sm1->Shade(sc); sFinal.c = black; sFinal.t = black; sFinal.ior = 0.0f; for( i=0;i<100;i++) { if(mTex[i]!=NULL&&u[i]!=0&&mapOn[i]) { sc.out.flags |= sDatabase[i].flags; if(total>1.0f){ sFinal.c += u[i]/total * sDatabase[i].c; sFinal.t += u[i]/total * sDatabase[i].t; sFinal.ior += u[i]/total * sDatabase[i].ior; } else{ sFinal.c += u[i] * sDatabase[i].c; sFinal.t += u[i] * sDatabase[i].t; sFinal.ior += u[i] * sDatabase[i].ior; } } } if(total) { sc.out.MixIn(sFinal, 1.0f-total); } } else { sm1->Shade(sc); } }
void unitTestState(void) { State s; State sNamed(std::string("name")); State sNamedFinal("name", true); State sFinal("", true); /* ** Constructor and getter tests */ assert(s.getName() == ""); assert(s.isFinal() == false); assert(sNamed.getName() == "name"); assert(sNamed.isFinal() == false); assert(sNamedFinal.getName() == "name"); assert(sNamedFinal.isFinal()); assert(sFinal.getName() == ""); assert(sFinal.isFinal() == true); /* ** Comparison tests */ assert(s == sFinal); assert(sNamed == sNamedFinal); assert(s < sNamed); assert(sNamedFinal > sFinal); assert(s >= sFinal); assert(s <= sFinal); /* ** Create tests */ State s0 = State::create(); State s1 = State::create(); State s2 = State::create(true); assert(s0.getName() == "S0"); assert(s1.getName() == "S1"); assert(s2.getName() == "S2"); /* ** link/unlink and access tests */ Edge e1('c'); Edge e2('4'); s0.link(e1, s1.getName()); s1.link(e2, s2); assert(s0[e1] == s1.getName()); try { // this is supposed to throw but if it doesn't the assert will fail assert(s0[e2] == ""); } catch (const std::out_of_range &oor) { (void)oor; } assert(s1[e2] == s2.getName()); std::cout << "State passed unit tests" << std::endl; }