private static MaterialClipContent ProcessAnimation(NodeContent input, ContentProcessorContext context, MaterialAnimationContent animation, int generateKeyframesFrequency) { var keyframes = new List <MaterialKeyframeContent>(); // For each input animation channel. foreach (var channel in animation.Channels) { foreach (var keyframe in channel.Value) { keyframes.Add(new MaterialKeyframeContent(keyframe.Material, keyframe)); } } // Sort the merged keyframes by time. //keyframes.Sort(CompareKeyframeTimes); //System.Diagnostics.Debugger.Launch(); //if (generateKeyframesFrequency > 0) // keyframes = InterpolateKeyframes(animation.Duration, keyframes, generateKeyframesFrequency); if (keyframes.Count == 0) { throw new InvalidContentException("Animation has no keyframes."); } if (animation.Duration <= TimeSpan.Zero) { throw new InvalidContentException("Animation has a zero duration."); } return(new MaterialClipContent(animation.Duration, keyframes.ToArray()) { Name = animation.Name, Identity = animation.Identity }); }
private MaterialAnimationContent ImportMaterialAnimation(H3DModel model, H3DDict <H3DMaterialParams> materials, H3DMaterialAnim animation) { var framesCount = (int)animation.FramesCount + 1; var animationNode = new MaterialAnimationContent { Name = animation.Name, Identity = _identity, Duration = TimeSpan.FromSeconds((float)1 / (float)30 * (float)framesCount) }; foreach (var elem in animation.Elements) { var material = model.Materials.Single(mat => elem.Name == mat.Name); var materialParams = material.MaterialParams; var channel = new MaterialAnimationChannel(); for (var frame = 0; frame < framesCount; frame++) { var keyFrame = new MaterialAnimationKeyframe(TimeSpan.FromSeconds((float)frame / 30f)) { Material = material.Name, Transforms = new Matrix[3] }; var tc = new [] { materialParams.TextureCoords[0], materialParams.TextureCoords[1], materialParams.TextureCoords[2] }; if (elem.PrimitiveType == H3DPrimitiveType.RGBA) { void SetColor(H3DAnimRGBA c, string name) { var color = new Color(); if (c.R.Exists) { color.R = (byte)c.R.GetFrameValue(frame); } if (c.G.Exists) { color.G = (byte)c.G.GetFrameValue(frame); } if (c.B.Exists) { color.B = (byte)c.B.GetFrameValue(frame); } if (c.A.Exists) { color.A = (byte)c.A.GetFrameValue(frame); } keyFrame.OpaqueData.Add(name, color); } var rgba = (H3DAnimRGBA)elem.Content; switch (elem.TargetType) { case H3DTargetType.MaterialEmission: SetColor(rgba, "EmissionColor"); break; case H3DTargetType.MaterialAmbient: SetColor(rgba, "AmbientColor"); break; case H3DTargetType.MaterialDiffuse: SetColor(rgba, "DiffuseColor"); break; case H3DTargetType.MaterialSpecular0: SetColor(rgba, "Specular0Color"); break; case H3DTargetType.MaterialSpecular1: SetColor(rgba, "Specular1Color"); break; case H3DTargetType.MaterialConstant0: SetColor(rgba, "Constant0Color"); break; case H3DTargetType.MaterialConstant1: SetColor(rgba, "Constant1Color"); break; case H3DTargetType.MaterialConstant2: SetColor(rgba, "Constant2Color"); break; case H3DTargetType.MaterialConstant3: SetColor(rgba, "Constant3Color"); break; case H3DTargetType.MaterialConstant4: SetColor(rgba, "Constant4Color"); break; case H3DTargetType.MaterialConstant5: SetColor(rgba, "Constant5Color"); break; } } else if (elem.PrimitiveType == H3DPrimitiveType.Vector2D) { void SetVector2(H3DAnimVector2D v, ref System.Numerics.Vector2 t) { if (v.X.Exists) { t.X = v.X.GetFrameValue(frame); } if (v.Y.Exists) { t.Y = v.Y.GetFrameValue(frame); } } var vector = (H3DAnimVector2D)elem.Content; switch (elem.TargetType) { case H3DTargetType.MaterialTexCoord0Scale: SetVector2(vector, ref tc[0].Scale); break; case H3DTargetType.MaterialTexCoord1Scale: SetVector2(vector, ref tc[1].Scale); break; case H3DTargetType.MaterialTexCoord2Scale: SetVector2(vector, ref tc[2].Scale); break; case H3DTargetType.MaterialTexCoord0Trans: SetVector2(vector, ref tc[0].Translation); break; case H3DTargetType.MaterialTexCoord1Trans: SetVector2(vector, ref tc[1].Translation); break; case H3DTargetType.MaterialTexCoord2Trans: SetVector2(vector, ref tc[2].Translation); break; } } else if (elem.PrimitiveType == H3DPrimitiveType.Float) { var @float = ((H3DAnimFloat)elem.Content).Value; if ([email protected]) { continue; } var value = @float.GetFrameValue(frame); switch (elem.TargetType) { case H3DTargetType.MaterialTexCoord0Rot: tc[0].Rotation = value; break; case H3DTargetType.MaterialTexCoord1Rot: tc[1].Rotation = value; break; case H3DTargetType.MaterialTexCoord2Rot: tc[2].Rotation = value; break; } } else if (elem.PrimitiveType == H3DPrimitiveType.Texture) { var @int = ((H3DAnimFloat)elem.Content).Value; if ([email protected]) { continue; } var value = (int)@int.GetFrameValue(frame); var name = materials[value].Name; switch (elem.TargetType) { case H3DTargetType.MaterialMapper0Texture: keyFrame.OpaqueData.Add("Texture0", name); break; case H3DTargetType.MaterialMapper1Texture: keyFrame.OpaqueData.Add("Texture1", name); break; case H3DTargetType.MaterialMapper2Texture: keyFrame.OpaqueData.Add("Texture2", name); break; } } keyFrame.Transforms[0] = tc[0].GetTransform().ToXNA(); keyFrame.Transforms[1] = tc[1].GetTransform().ToXNA(); keyFrame.Transforms[2] = tc[2].GetTransform().ToXNA(); channel.Add(keyFrame); } animationNode.Channels[elem.Name] = channel; } return(animationNode); }