Ejemplo n.º 1
0
        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
            });
        }
Ejemplo n.º 2
0
        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);
        }