public override void WriteInstance(Serialization.MaterialSerializer ser, SubRenderState subRenderState, Graphics.TextureUnitState srcTextureUnit, Graphics.TextureUnitState dstTextureUnit) { int texIndex = 0; for (int i = 0; i < srcTextureUnit.Parent.TextureUnitStatesCount; i++) { if (srcTextureUnit.Parent.GetTextureUnitState(i) == srcTextureUnit) { texIndex = i; break; } } //get blend mode for current texture unit var layeredBlendingSubRenderState = subRenderState as LayeredBlending; //write the blend mode LayeredBlending.BlendMode blendMode = layeredBlendingSubRenderState.GetBlendMode(texIndex); if (blendMode != LayeredBlending.BlendMode.Invalid) { //TODO //ser.WriteAttribute(5, "layered_blend"); //ser.WriteAttribute(BlendModeToString(blendMode)); } //write the source modifier LayeredBlending.SourceModifier modType; int customNum; if (layeredBlendingSubRenderState.GetSourceModifier(texIndex, out modType, out customNum) == true) { //TODO //ser.WriteAttribute(5, "source_modifier"); //ser.WriteValue(SourceModifierToString(modType)); //ser.WriteValue("custom"); //ser.WriteValue(customNum.ToString()); } }
public override SubRenderState CreateInstance(Scripting.Compiler.ScriptCompiler compiler, Scripting.Compiler.AST.PropertyAbstractNode prop, Graphics.TextureUnitState texState, ScriptTranslator translator) { if (prop.Name == "layered_blend") { string blendType; if (!SGScriptTranslator.GetString(prop.Values[0], out blendType)) { // compiler.AddError(...); return(null); } LayeredBlending.BlendMode blendMode = StringToBlendMode(blendType); if (blendMode == LayeredBlending.BlendMode.Invalid) { // compiler.AddError(...); return(null); } //get the layer blend sub-render state to work on var layeredBlendState = (LayeredBlending)CreateOrRetrieveInstance(translator); int texIndex = -1; //TODO: check impl. Ogre use: texIndex = texState.Parent.GetTextureUnitStateIndex(texState); for (int i = 0; i < texState.Parent.TextureUnitStatesCount; i++) { if (texState.Parent.GetTextureUnitState(i) == texState) { texIndex = i; break; } } layeredBlendState.SetBlendMode(texIndex, blendMode); return(layeredBlendState); } if (prop.Name == "source_modifier") { if (prop.Values.Count < 3) { //compiler.AddError(..); return(null); } //Read light model type bool isParseSuccess; string modifierString; string paramType; int customNum; int itValue = 0; isParseSuccess = SGScriptTranslator.GetString(prop.Values[itValue], out modifierString); LayeredBlending.SourceModifier modType = StringToSourceModifier(modifierString); isParseSuccess &= modType != LayeredBlending.SourceModifier.Invalid; if (isParseSuccess == false) { //compiler.AddError(...); return(null); } itValue++; isParseSuccess = SGScriptTranslator.GetString(prop.Values[itValue], out paramType); isParseSuccess &= (paramType == "custom"); if (isParseSuccess == false) { // compiler.AddError(...); return(null); } itValue++; isParseSuccess = SGScriptTranslator.GetString(prop.Values[itValue], out paramType); if (isParseSuccess == false) { //compiler.AddError(...); return(null); } itValue++; isParseSuccess = SGScriptTranslator.GetInt(prop.Values[itValue], out customNum); if (isParseSuccess == false) { //compiler.AddError(...); return(null); } //get the layer blend sub render state to work on var layeredBlendState = (LayeredBlending)CreateOrRetrieveInstance(translator); int texIndex = 0; //update the layer sub render state for (int i = 0; i < texState.Parent.TextureUnitStatesCount; i++) { if (texState.Parent.GetTextureUnitState(i) == texState) { texIndex = i; break; } } layeredBlendState.SetSourceModifier(texIndex, modType, customNum); return(layeredBlendState); } return(null); }