/// <summary> /// Converts a <see cref="BasicMaterialContent"/> to an equivalent /// <see cref="SkinnedMaterialContent"/>. /// </summary> /// <param name="material">The <see cref="BasicMaterialContent"/>.</param> /// <returns>The <see cref="SkinnedMaterialContent"/>.</returns> public static SkinnedMaterialContent ConvertToSkinnedMaterial(MaterialContent material) { var skinnedMaterial = material as SkinnedMaterialContent; if (skinnedMaterial != null) { return(skinnedMaterial); } var basicMaterial = material as BasicMaterialContent; if (basicMaterial != null) { skinnedMaterial = new SkinnedMaterialContent { Name = basicMaterial.Name, Identity = basicMaterial.Identity, Alpha = basicMaterial.Alpha, DiffuseColor = basicMaterial.DiffuseColor, EmissiveColor = basicMaterial.EmissiveColor, SpecularColor = basicMaterial.SpecularColor, SpecularPower = basicMaterial.SpecularPower, WeightsPerVertex = null }; skinnedMaterial.Textures.AddRange(basicMaterial.Textures); return(skinnedMaterial); } return(null); }
/// <summary> /// Sets a <see cref="SkinnedMaterialContent"/> for all skinned meshes. /// </summary> private void SetSkinnedMaterial() { var swappedMaterials = new Dictionary <MaterialContent, SkinnedMaterialContent>(); var defaultMaterial = new SkinnedMaterialContent() { Identity = _input.Identity }; SetSkinnedMaterial(_input, swappedMaterials, defaultMaterial); }
/// <summary> /// If a node is skinned, we need to use the skinned model /// effect rather than basic effect. This function runs through the /// geometry and finds the meshes that have bone weights associated /// and swaps in the skinned effect. /// </summary> /// <param name="node"></param> void SwapSkinnedMaterial(NodeContent node) { // It has to be a MeshContent node MeshContent mesh = node as MeshContent; if (mesh != null) { // In the geometry we have to find a vertex channel that // has a bone weight collection foreach (GeometryContent geometry in mesh.Geometry) { bool swap = false; foreach (VertexChannel vchannel in geometry.Vertices.Channels) { if (vchannel is VertexChannel <BoneWeightCollection> ) { swap = true; break; } } if (swap) { if (toSkinnedMaterial.ContainsKey(geometry.Material)) { // We have already swapped it geometry.Material = toSkinnedMaterial[geometry.Material]; } else { SkinnedMaterialContent smaterial = new SkinnedMaterialContent(); BasicMaterialContent bmaterial = geometry.Material as BasicMaterialContent; // Copy over the data smaterial.Alpha = bmaterial.Alpha; smaterial.DiffuseColor = bmaterial.DiffuseColor; smaterial.EmissiveColor = bmaterial.EmissiveColor; smaterial.SpecularColor = bmaterial.SpecularColor; smaterial.SpecularPower = bmaterial.SpecularPower; smaterial.Texture = bmaterial.Texture; smaterial.WeightsPerVertex = 4; toSkinnedMaterial[geometry.Material] = smaterial; geometry.Material = smaterial; } } } } foreach (NodeContent child in node.Children) { SwapSkinnedMaterial(child); } }
void SetSkinnedEffect(NodeContent node) { MeshContent mesh = node as MeshContent; if (mesh != null) { foreach (GeometryContent geometry in mesh.Geometry) { bool swap = false; foreach (VertexChannel vchannel in geometry.Vertices.Channels) { if (vchannel is VertexChannel <BoneWeightCollection> ) { swap = true; break; } } if (swap) { if (toSkinnedMaterial.ContainsKey(geometry.Material)) { geometry.Material = toSkinnedMaterial[geometry.Material]; } else { SkinnedMaterialContent smaterial = new SkinnedMaterialContent(); BasicMaterialContent bmaterial = geometry.Material as BasicMaterialContent; smaterial.Alpha = bmaterial.Alpha; smaterial.DiffuseColor = bmaterial.DiffuseColor; smaterial.EmissiveColor = bmaterial.EmissiveColor; smaterial.SpecularColor = bmaterial.SpecularColor; smaterial.SpecularPower = bmaterial.SpecularPower; smaterial.Texture = bmaterial.Texture; smaterial.WeightsPerVertex = 4; toSkinnedMaterial[geometry.Material] = smaterial; geometry.Material = smaterial; } } } } foreach (NodeContent child in node.Children) { SetSkinnedEffect(child); } }
private static void SetSkinnedMaterial(NodeContent node, Dictionary <MaterialContent, SkinnedMaterialContent> swappedMaterials, SkinnedMaterialContent defaultMaterial) { var mesh = node as MeshContent; if (mesh != null) { foreach (var geometry in mesh.Geometry) { if (!ContentHelper.IsSkinned(geometry)) { continue; } if (geometry.Material == null) { // Happens if the model is exported without a material. (XNA only!) geometry.Material = defaultMaterial; continue; } SkinnedMaterialContent skinnedMaterial; if (!swappedMaterials.TryGetValue(geometry.Material, out skinnedMaterial)) { // Convert BasicMaterialContent to SkinnedMaterialContent. skinnedMaterial = ContentHelper.ConvertToSkinnedMaterial(geometry.Material); if (skinnedMaterial == null) { continue; } swappedMaterials[geometry.Material] = skinnedMaterial; } geometry.Material = skinnedMaterial; } } foreach (var child in node.Children) { SetSkinnedMaterial(child, swappedMaterials, defaultMaterial); } }