/// <summary> /// Applies all the local shader parameters before drawing any primitives. /// </summary> protected internal virtual void BeginApplyLocalParameters(DrawingContext3D context, MaterialGroup material) { }
private static bool BuildByUsage(MaterialGroup materialGroup, MaterialUsage usage, out byte[] effectCode, out byte[] key) { key = effectCode = null; // Make sure we have the necessary building blocks of a shader if (materialGroup.MaterialParts.Count <= 0) { materialGroup.MaterialParts.Add(new DiffuseMaterialPart() { DiffuseColorEnabled = false, TextureEnabled = false }); } var dependentPartTypes = new List <Type>(); for (int p = 0; p < materialGroup.MaterialParts.Count; p++) { var currentPart = materialGroup.MaterialParts[p]; currentPart.GetDependentParts(usage, dependentPartTypes); for (int i = 0; i < dependentPartTypes.Count; ++i) { var type = dependentPartTypes[i]; if (!materialGroup.MaterialParts.Any(x => x.GetType() == type)) { var part = (MaterialPart)Activator.CreateInstance(type); part.GetDependentParts(usage, dependentPartTypes); materialGroup.MaterialParts.Insert(++p, part); } else { var parts = materialGroup.MaterialParts.Where(x => x.GetType() == type && x != currentPart).ToArray(); foreach (var pt in parts) { materialGroup.MaterialParts.Remove(pt); } p = materialGroup.MaterialParts.IndexOf(currentPart); foreach (var pt in parts) { materialGroup.MaterialParts.Insert(++p, pt); } } } dependentPartTypes.Clear(); } if (!materialGroup.MaterialParts.OfType <VertexTransformMaterialPart>().Any()) { materialGroup.MaterialParts.Add(new VertexTransformMaterialPart()); } var builderContext = CreateMaterialGroupBuilderContext(materialGroup.MaterialParts, usage, true); if (builderContext.PixelShaderOutputs.Count <= 0) { return(false); } try { // Force 3_0 when using instancing if (materialGroup.MaterialParts.OfType <InstancedMaterialPart>().Any()) { throw new InvalidOperationException(); } return(BuildEffect(builderContext, "2_0", out effectCode, out key)); } catch { return(BuildEffect(builderContext, "3_0", out effectCode, out key)); } }
/// <summary> /// Applies all the local shader parameters before drawing any primitives. /// </summary> protected internal override void BeginApplyLocalParameters(DrawingContext3D context, MaterialGroup material) { var count = materialParts.Count; for (int i = 0; i < count; ++i) { materialParts[i].BeginApplyLocalParameters(context, material); } }
/// <summary> /// Applies all the local shader parameters before drawing any primitives. /// </summary> protected internal override void BeginApplyLocalParameters(DrawingContext3D context, MaterialGroup material) { parameters.BeginApplyLocalParameters(context, MaterialGroup); }
/// <summary> /// Sets the mask texture scale of the material group. /// </summary> public static void SetMaskTextureScale(MaterialGroup materialGroup, Vector2 value) { AttachablePropertyServices.SetProperty(materialGroup, MaskTextureScaleProperty, value); BindMaskTextureParameters(materialGroup); }