23 static float norm(
const float&
x) {
return (
x<0.0f?0.0f:(
x>1.0f?1.0f:
x));}
69 std::map<std::set<SoMaterial*>,SoMaterial*>
::const_iterator it, itE =
m_d->matlists2mixedmats.end();
70 std::set<SoMaterial*>::iterator it2, it2E;
71 for (it =
m_d->matlists2mixedmats.begin();it!=itE;++it) {
72 for (it2=it->first.begin(), it2E=it->first.end();it2!=it2E;++it2)
78 std::map<std::map<SoMaterial*,double>,SoMaterial*>
::iterator it, itE =
m_d->matlists2mixedmats_weighted.end();
79 std::map<SoMaterial*,double>::const_iterator it2,it2E;
80 for (it =
m_d->matlists2mixedmats_weighted.begin();it!=itE;++it) {
81 for (it2=it->first.begin(),it2E=it->first.end();it2!=it2E;++it2)
88 std::map<SoMaterial*,SoNodeSensor*>::iterator it(
m_d->mat2sensors.begin()), itE(
m_d->mat2sensors.end());
90 m_d->sensor2matmixerimp.erase(
m_d->sensor2matmixerimp.find(it->second));
102 if (
m_d->matlists2mixedmats.size()+
m_d->matlists2mixedmats_weighted.size()>100)
105 +
str(
m_d->matlists2mixedmats.size()+
m_d->matlists2mixedmats_weighted.size())
106 +
") different material combinations. Try to use fewer combinations for better performance!");
108 if (
m_d->mat2sensors.size()>1000)
111 ") different materials. Try to lower this number for better performance!");
121 && m->ambientColor.getNum() == 1
122 && m->diffuseColor.getNum() == 1
123 && m->specularColor.getNum() == 1
124 && m->emissiveColor.getNum() == 1
125 && m->transparency.getNum() == 1
126 && m->shininess.getNum() == 1;
165 std::set<SoMaterial*>::iterator it2(it->first.begin()),it2E(it->first.end());
166 for (;it2!=it2E;++it2) {
176 std::map<SoMaterial*,double>::const_iterator it4(it3->first.begin()),it4E(it3->first.end());
177 for (;it4!=it4E;++it4) {
178 if (mat==it4->first) {
190 float ambient_r(0.0f), ambient_g(0.0f), ambient_b(0.0f);
191 float diffuse_r(0.0f), diffuse_g(0.0f), diffuse_b(0.0f);
192 float specular_r(0.0f), specular_g(0.0f), specular_b(0.0f);
193 float emissive_r(0.0f), emissive_g(0.0f), emissive_b(0.0f);
194 float shininess(0.0f), transparency(0.0f);
196 std::set<SoMaterial*>::const_iterator it(matlist.begin()), itE(matlist.end());
197 for (;it!=itE;++it) {
198 (*it)->ambientColor[0].getValue(
r,g,b); ambient_r +=
r; ambient_g += g; ambient_b += b;
199 (*it)->diffuseColor[0].getValue(
r,g,b); diffuse_r +=
r; diffuse_g += g; diffuse_b += b;
200 (*it)->specularColor[0].getValue(
r,g,b); specular_r +=
r; specular_g += g; specular_b += b;
201 (*it)->emissiveColor[0].getValue(
r,g,b); emissive_r +=
r; emissive_g += g; emissive_b += b;
202 shininess += (*it)->shininess[0];
203 transparency += (*it)->transparency[0];
206 float n = 1.0f/matlist.size();
207 bool save = mat->enableNotify(
false);
208 mat->ambientColor.setValue(
norm(n*ambient_r),
norm(n*ambient_g),
norm(n*ambient_b));
209 mat->diffuseColor.setValue(
norm(n*diffuse_r),
norm(n*diffuse_g),
norm(n*diffuse_b));
210 mat->specularColor.setValue(
norm(n*specular_r),
norm(n*specular_g),
norm(n*specular_b));
211 mat->emissiveColor.setValue(
norm(n*emissive_r),
norm(n*emissive_g),
norm(n*emissive_b));
212 mat->shininess.setValue(
norm(n*shininess));
213 mat->transparency.setValue(
norm(n*transparency));
215 mat->enableNotify(
true);
218 theclass->messageVerbose(
"Material ("+
str(mat)+
") updated and touched");
222 theclass->messageVerbose(
"Material ("+
str(mat)+
") updated but notifications were off");
230 float w{}, totweight{};
231 float ambient_r(0.0f), ambient_g(0.0f), ambient_b(0.0f);
232 float diffuse_r(0.0f), diffuse_g(0.0f), diffuse_b(0.0f);
233 float specular_r(0.0f), specular_g(0.0f), specular_b(0.0f);
234 float emissive_r(0.0f), emissive_g(0.0f), emissive_b(0.0f);
235 float shininess(0.0f), transparency(0.0f);
237 std::map<SoMaterial*,double>::const_iterator it(matlist.begin()), itE(matlist.end());
239 for (;it!=itE;++it) {
243 m->ambientColor[0].getValue(
r,g,b); ambient_r += w*
r; ambient_g += w*g; ambient_b += w*b;
244 m->diffuseColor[0].getValue(
r,g,b); diffuse_r += w*
r; diffuse_g += w*g; diffuse_b += w*b;
245 m->specularColor[0].getValue(
r,g,b); specular_r += w*
r; specular_g += w*g; specular_b += w*b;
246 m->emissiveColor[0].getValue(
r,g,b); emissive_r += w*
r; emissive_g += w*g; emissive_b += w*b;
247 shininess += m->shininess[0]*w;
248 transparency += m->transparency[0]*w;
254 float n = 1.0f/totweight;
255 bool save = mat->enableNotify(
false);
256 mat->ambientColor.setValue(
norm(n*ambient_r),
norm(n*ambient_g),
norm(n*ambient_b));
257 mat->diffuseColor.setValue(
norm(n*diffuse_r),
norm(n*diffuse_g),
norm(n*diffuse_b));
258 mat->specularColor.setValue(
norm(n*specular_r),
norm(n*specular_g),
norm(n*specular_b));
259 mat->emissiveColor.setValue(
norm(n*emissive_r),
norm(n*emissive_g),
norm(n*emissive_b));
260 mat->shininess.setValue(
norm(n*shininess));
261 mat->transparency.setValue(
norm(n*transparency));
263 mat->enableNotify(
true);
266 theclass->messageVerbose(
"Material ("+
str(mat)+
") updated and touched");
270 theclass->messageVerbose(
"Material ("+
str(mat)+
") updated but notifications were off");
279 std::set<SoMaterial*>::const_iterator it(matlist.begin()), itE(matlist.end());
280 for (;it!=itE;++it) {
281 if (!
m_d->inputMaterialValid(*it)) {
286 if (matlist.empty()) {
288 return m_d->defaultMaterial();
292 return m_d->defaultMaterial();
296 if (matlist.size()==1)
297 return *(matlist.begin());
300 std::map<std::set<SoMaterial*>,SoMaterial*>
::const_iterator it2 =
m_d->matlists2mixedmats.find(matlist);
301 if (it2!=
m_d->matlists2mixedmats.end())
305 SoMaterial * mixmat =
new SoMaterial;
306 m_d->setMaterialFieldsAsAverageOfMatList(mixmat,matlist);
309 std::set<SoMaterial*>::const_iterator it3(matlist.begin()), it3E(matlist.end());
310 for (;it3!=it3E;++it3) {
311 m_d->monitorMaterial(*it3);
315 m_d->matlists2mixedmats[matlist] = mixmat;
325 std::map<SoMaterial*,double>::const_iterator it(matlist.begin()), itE(matlist.end());
326 for (;it!=itE;++it) {
327 if (!
m_d->inputMaterialValid(it->first)||it->second<=0.0) {
332 if (matlist.empty()) {
334 return m_d->defaultMaterial();
338 return m_d->defaultMaterial();
342 if (matlist.size()==1)
343 return matlist.begin()->first;
346 std::map<std::map<SoMaterial*,double>,SoMaterial*>
::const_iterator it2 =
m_d->matlists2mixedmats_weighted.find(matlist);
347 if (it2!=
m_d->matlists2mixedmats_weighted.end())
351 SoMaterial * mixmat =
new SoMaterial;
352 m_d->setMaterialFieldsAsAverageOfMatList(mixmat,matlist);
355 std::map<SoMaterial*,double>::const_iterator it3(matlist.begin()), it3E(matlist.end());
356 for (;it3!=it3E;++it3) {
357 m_d->monitorMaterial(it3->first);
361 m_d->matlists2mixedmats_weighted[matlist] = mixmat;