+ using namespace osg;
+ ref_ptr<SGReaderWriterXMLOptions> xmlOptions;
+ if (options)
+ xmlOptions = new SGReaderWriterXMLOptions(*options);
+ ref_ptr<SGMaterialUserData> user = new SGMaterialUserData(this);
+ SGPropertyNode_ptr propRoot = new SGPropertyNode();
+ makeChild(propRoot, "inherits-from")->setStringValue(effect);
+ SGPropertyNode* paramProp = makeChild(propRoot, "parameters");
+ SGPropertyNode* materialProp = makeChild(paramProp, "material");
+ makeChild(materialProp, "ambient")->setValue(SGVec4d(ambient));
+ makeChild(materialProp, "diffuse")->setValue(SGVec4d(diffuse));
+ makeChild(materialProp, "specular")->setValue(SGVec4d(specular));
+ makeChild(materialProp, "emissive")->setValue(SGVec4d(emission));
+ makeChild(materialProp, "shininess")->setFloatValue(shininess);
+ if (ambient[3] < 1 || diffuse[3] < 1 ||
+ specular[3] < 1 || emission[3] < 1) {
+ makeChild(paramProp, "transparent")->setBoolValue(true);
+ SGPropertyNode* binProp = makeChild(paramProp, "render-bin");
+ makeChild(binProp, "bin-number")->setIntValue(TRANSPARENT_BIN);
+ makeChild(binProp, "bin-name")->setStringValue("DepthSortedBin");
+ }
+ BOOST_FOREACH(_internal_state& matState, _status)
+ {
+ SGPropertyNode_ptr effectProp = new SGPropertyNode();
+ copyProperties(propRoot, effectProp);
+ SGPropertyNode* effectParamProp = effectProp->getChild("parameters", 0);
+ for (unsigned int i = 0; i < matState.texture_paths.size(); i++) {
+ SGPropertyNode* texProp = makeChild(effectParamProp, "texture", matState.texture_paths[i].second);
+ makeChild(texProp, "image")->setStringValue(matState.texture_paths[i].first);
+ makeChild(texProp, "filter")
+ ->setStringValue(mipmap ? "linear-mipmap-linear" : "nearest");
+ makeChild(texProp, "wrap-s")
+ ->setStringValue(wrapu ? "repeat" : "clamp");
+ makeChild(texProp, "wrap-t")
+ ->setStringValue(wrapv ? "repeat" : "clamp");
+ }
+ matState.effect = makeEffect(effectProp, false, xmlOptions.get());
+ matState.effect->setUserData(user.get());