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()); }
// 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(); }