Beispiel #1
0
 /// <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));
            }
        }
Beispiel #3
0
        /// <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);
 }
Beispiel #5
0
 /// <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);
 }