示例#1
0
        private static Material ConvertToTextMaterial(Material material, Geometry textGeometry)
        {
            // Create a material that is sort of like a clone of the material passed in, but instead of being an
            // infinite plane, it is shaped like the geometry passed in

            if (material is MaterialGroup)
            {
                #region MaterialGroup

                MaterialGroup retVal = new MaterialGroup();

                foreach (Material childMaterial in ((MaterialGroup)material).Children)
                {
                    // Recurse
                    retVal.Children.Add(ConvertToTextMaterial(childMaterial, textGeometry));
                }

                return retVal;

                #endregion
            }

            Brush embeddedBrush = null;
            Brush newBrush = null;

            if (material is DiffuseMaterial)
            {
                #region DiffuseMaterial

                DiffuseMaterial materialCast1 = (DiffuseMaterial)material;

                if (materialCast1.Brush == null)
                {
                    embeddedBrush = new SolidColorBrush(materialCast1.AmbientColor);
                }
                else
                {
                    embeddedBrush = materialCast1.Brush;
                }

                newBrush = new DrawingBrush(new GeometryDrawing(embeddedBrush, null, textGeometry));

                return new DiffuseMaterial(newBrush);

                #endregion
            }
            else if (material is SpecularMaterial)
            {
                #region SpecularMaterial

                SpecularMaterial materialCast2 = (SpecularMaterial)material;

                embeddedBrush = materialCast2.Brush;

                newBrush = new DrawingBrush(new GeometryDrawing(embeddedBrush, null, textGeometry));

                return new SpecularMaterial(newBrush, materialCast2.SpecularPower);

                #endregion
            }
            else if (material is EmissiveMaterial)
            {
                #region EmissiveMaterial

                EmissiveMaterial materialCast3 = (EmissiveMaterial)material;

                if (materialCast3.Brush == null)
                {
                    embeddedBrush = new SolidColorBrush(materialCast3.Color);
                }
                else
                {
                    embeddedBrush = materialCast3.Brush;
                }

                return new EmissiveMaterial(newBrush);

                #endregion
            }

            throw new ApplicationException("Unknown type of material: " + material.GetType().ToString());
        }
示例#2
0
        // Returns true if two materials have a parallel structure.
        bool AreMaterialsParallel(Material mat1, Material mat2)
        {
            if (mat1 is MaterialGroup && mat2 is MaterialGroup)
            {
                int num = (mat1 as MaterialGroup).Children.Count;

                if (num != (mat2 as MaterialGroup).Children.Count)
                    return false;

                for (int i = 0; i < num; i++)
                    if (!AreMaterialsParallel((mat1 as MaterialGroup).Children[i],
                                              (mat2 as MaterialGroup).Children[i]))
                        return false;

                return true;
            }
            return mat1 != null && mat2 != null && mat1.GetType() == mat2.GetType();
        }