Exemple #1
0
 /// <summary>
 /// Reads a <see cref="AnimConstant"/> instance from the current stream and returns it.
 /// </summary>
 /// <param name="self">The extended <see cref="BinaryDataReader"/>.</param>
 /// <param name="count">The number of instances to read.</param>
 /// <returns>The <see cref="AnimConstant"/> instance.</returns>
 public static AnimConstant[] ReadAnimConstants(this BinaryDataReader self, int count)
 {
     AnimConstant[] values = new AnimConstant[count];
     for (int i = 0; i < count; i++)
     {
         values[i] = self.ReadAnimConstant();
     }
     return(values);
 }
Exemple #2
0
        private void SaveParamInfos(MaterialAnimData data, Material mat, int ParamCurveIndex)
        {
            foreach (var param in mat.Params)
            {
                //Set our begin curve index
                bool SetBeginCurve = false;
                if (!SetBeginCurve)
                {
                    data.ShaderParamCurveIndex   += ParamCurveIndex;
                    data.BeginVisalConstantIndex += 0; //This is usually 0 so set it

                    SetBeginCurve = true;
                }

                foreach (var value in  param.Values)
                {
                    if (value.Constant)
                    {
                        AnimConstant animConstant = new AnimConstant();
                        animConstant.AnimDataOffset = 0;
                        animConstant.Value          = value.GetValue(0); //Set our constant value
                        data.Constants.Add(animConstant);
                    }
                    else if (value.Keys.Count > 0) //Else create curves for each param value
                    {
                        //If constant, create a constant instance with the first value set
                        AnimCurve curve = new AnimCurve();
                        curve.AnimDataOffset = value.AnimDataOffset;
                        curve.Scale          = value.Scale;
                        curve.Offset         = value.Offset;

                        data.Curves.Add(curve);
                    }
                }
            }
        }
Exemple #3
0
        private void SavePatternInfos(MaterialAnimData data, Material mat, int TexturePatternCurveIndex)
        {
            bool SetBeginCurve = false;

            foreach (var sampler in mat.Samplers)
            {
                //If constant, create a constant instance with the first value set
                if (sampler.Constant)
                {
                    AnimConstant animConstant = new AnimConstant();
                    animConstant.AnimDataOffset = 0;
                    animConstant.Value          = sampler.GetValue(0);
                    data.Constants.Add(animConstant);
                }
                else if (sampler.Keys.Count > 0)
                {
                    //If a sampler is not constant and uses curve data, then we need to set our begin curve index
                    if (!SetBeginCurve)
                    {
                        data.TexturePatternCurveIndex += TexturePatternCurveIndex;
                        data.BeginVisalConstantIndex  += 0; //This is usually 0 so set it

                        SetBeginCurve = true;
                    }

                    //Create a curve to store all the index data in for each frame
                    AnimCurve curve = new AnimCurve();
                    curve.AnimDataOffset = 0;

                    //Set our data types. Pattern and visibilty are always the same type
                    if (AnimType == AnimationType.TexturePattern)
                    {
                        curve.CurveType = AnimCurveType.StepInt;
                    }
                    else if (AnimType == AnimationType.Visibilty)
                    {
                        curve.CurveType = AnimCurveType.StepBool;
                    }
                    else
                    {
                        if (sampler.InterpolationType == InterpolationType.HERMITE)
                        {
                            curve.CurveType = AnimCurveType.Cubic;
                        }
                        if (sampler.InterpolationType == InterpolationType.LINEAR)
                        {
                            curve.CurveType = AnimCurveType.Linear;
                        }
                        if (sampler.InterpolationType == InterpolationType.STEP)
                        {
                            curve.CurveType = AnimCurveType.StepInt;
                        }
                        if (sampler.InterpolationType == InterpolationType.STEPBOOL)
                        {
                            curve.CurveType = AnimCurveType.StepBool;
                        }
                    }

                    curve.Delta      = 0;
                    curve.EndFrame   = FrameCount;
                    curve.StartFrame = 0;
                    curve.FrameType  = AnimCurveFrameType.Byte;
                    curve.Scale      = 1;
                    curve.Offset     = 0;

                    List <float> Frames = new List <float>();
                    List <float> Keys   = new List <float>();

                    for (int frame = 0; frame < sampler.Keys.Count; frame++)
                    {
                        float currentIndex = sampler.GetValue(frame);
                        if (frame > 0)
                        {
                            float previousIndex = sampler.GetValue(frame - 1);
                            if (currentIndex != previousIndex)
                            {
                                //Add key frame if texture not loaded previously
                                Frames.Add(frame);
                                Keys.Add(currentIndex);
                            }
                        }
                        else
                        {
                            //Add the first key frame value. We would add base values here but switch has none
                            Frames.Add(frame);
                            Keys.Add(currentIndex);
                        }
                    }


                    for (int i = 0; i < Keys.Count; i++)
                    {
                        curve.Keys[i, 0] = Keys[i];
                    }

                    curve.Frames = Frames.ToArray();

                    TexturePatternCurveIndex += 1;
                }
            }
        }
        // ---- METHODS (PUBLIC) ---------------------------------------------------------------------------------------

        /// <summary>
        /// Writes a <see cref="AnimConstant"/> instance into the current stream.
        /// </summary>
        /// <param name="self">The extended <see cref="BinaryDataWriter"/>.</param>
        /// <param name="value">The <see cref="AnimConstant"/> instance.</param>
        public static void Write(this BinaryDataWriter self, AnimConstant value)
        {
            self.Write(value.AnimDataOffset);
            self.Write(value.Value);
        }
Exemple #5
0
            public void ToYaml(MaterialAnim materialAnim, FMAA.AnimationType animType)
            {
                MaterialAnimConfigs = new List <MatAnimConfig>();

                Name       = materialAnim.Name;
                Path       = materialAnim.Path;
                FrameCount = materialAnim.FrameCount;
                Loop       = materialAnim.Loop;

                foreach (var mat in materialAnim.MaterialAnimDataList)
                {
                    MatAnimConfig matConfig = new MatAnimConfig();
                    matConfig.Name = mat.Name;
                    MaterialAnimConfigs.Add(matConfig);

                    foreach (var paramInfo in mat.ParamAnimInfos)
                    {
                        ParamInfo paramCfg = new ParamInfo();
                        paramCfg.Name       = paramInfo.Name;
                        paramCfg.IsConstant = paramInfo.ConstantCount != 0;
                        matConfig.ParamInfos.Add(paramCfg);

                        if (paramInfo.ConstantCount != 0)
                        {
                            paramCfg.Constants = new List <ConstantConfig>();
                            for (int i = 0; i < paramInfo.ConstantCount; i++)
                            {
                                AnimConstant   constant      = mat.Constants[paramInfo.BeginConstant + i];
                                ConstantConfig ConstantValue = new ConstantConfig();
                                ConstantValue.Offset = ConvertParamOffset(constant.AnimDataOffset, animType);
                                ConstantValue.Value  = constant.Value;

                                paramCfg.Constants.Add(ConstantValue);
                            }
                        }

                        if (paramInfo.BeginCurve != ushort.MaxValue)
                        {
                            paramCfg.CurveData = new List <CurveConfig>();
                            for (int i = 0; i < paramInfo.IntCurveCount + paramInfo.FloatCurveCount; i++)
                            {
                                var curve    = mat.Curves[(int)paramInfo.BeginCurve + i];
                                var CurveCfg = new CurveConfig();
                                CurveCfg.Offset = ConvertParamOffset(curve.AnimDataOffset, animType);

                                if (curve.Scale == 0)
                                {
                                    curve.Scale = 1;
                                }

                                for (int f = 0; f < curve.Frames.Length; f++)
                                {
                                    int   frame = (int)curve.Frames[f];
                                    float Value = curve.Offset + curve.Keys[f, 0] * curve.Scale;
                                    CurveCfg.KeyFrames.Add(frame, Value);
                                }

                                paramCfg.CurveData.Add(CurveCfg);
                            }
                        }
                    }

                    foreach (var patternInfo in mat.TexturePatternAnimInfos)
                    {
                        PatternInfo infoCfg = new PatternInfo();
                        infoCfg.Name       = patternInfo.Name;
                        infoCfg.IsConstant = patternInfo.BeginConstant != ushort.MaxValue;
                        matConfig.TexturePatternInfos.Add(infoCfg);

                        if (infoCfg.IsConstant)
                        {
                            infoCfg.ConstantValue = new ConstantTPConfig();
                            int Index = (int)mat.Constants[(int)patternInfo.BeginConstant].Value;
                            infoCfg.ConstantValue.Texture = materialAnim.TextureNames[Index];
                        }
                        if (patternInfo.CurveIndex != ushort.MaxValue)
                        {
                            var curve = mat.Curves[(int)patternInfo.CurveIndex];
                            infoCfg.CurveData = new CurveTPConfig();

                            if (curve.Scale == 0)
                            {
                                curve.Scale = 1;
                            }

                            for (int f = 0; f < curve.Frames.Length; f++)
                            {
                                int frame = (int)curve.Frames[f];
                                int Value = (int)curve.Offset + (int)curve.Keys[f, 0] * (int)curve.Scale;

                                infoCfg.CurveData.KeyFrames.Add(frame, materialAnim.TextureNames[Value]);
                            }
                        }
                    }
                }
            }
Exemple #6
0
            public MaterialAnim FromYaml()
            {
                MaterialAnim matAnim = new MaterialAnim();

                matAnim.Name         = Name;
                matAnim.Path         = Path;
                matAnim.Loop         = Loop;
                matAnim.FrameCount   = FrameCount;
                matAnim.TextureNames = GenerateTextureList();
                matAnim.BindIndices  = new ushort[MaterialAnimConfigs.Count];
                for (int i = 0; i < matAnim.BindIndices.Length; i++)
                {
                    matAnim.BindIndices[i] = ushort.MaxValue;
                }

                int ShaderParamCurveIndex    = 0;
                int TexturePatternCurveIndex = 0;

                Console.WriteLine("MaterialAnimConfigs " + MaterialAnimConfigs.Count);
                foreach (var matCfg in MaterialAnimConfigs)
                {
                    var matAnimData = new MaterialAnimData();
                    matAnimData.Name      = matCfg.Name;
                    matAnimData.Constants = new List <AnimConstant>();
                    matAnimData.Curves    = new List <AnimCurve>();
                    matAnimData.TexturePatternAnimInfos  = new List <TexturePatternAnimInfo>();
                    matAnimData.ParamAnimInfos           = new List <ParamAnimInfo>();
                    matAnimData.BeginVisalConstantIndex  = -1;
                    matAnimData.ShaderParamCurveIndex    = -1;
                    matAnimData.VisualConstantIndex      = -1;
                    matAnimData.TexturePatternCurveIndex = -1;
                    matAnimData.VisalCurveIndex          = -1;
                    matAnim.MaterialAnimDataList.Add(matAnimData);

                    ushort CurveIndex         = 0;
                    ushort BeginConstantIndex = 0;

                    foreach (var texturePatternCfg in matCfg.TexturePatternInfos)
                    {
                        TexturePatternAnimInfo patternInfo = new TexturePatternAnimInfo();
                        patternInfo.Name = texturePatternCfg.Name;
                        matAnimData.TexturePatternAnimInfos.Add(patternInfo);

                        if (texturePatternCfg.IsConstant && texturePatternCfg.ConstantValue != null)
                        {
                            patternInfo.BeginConstant = BeginConstantIndex++;

                            AnimConstant constant = new AnimConstant();
                            constant.AnimDataOffset = 0;
                            constant.Value          = matAnim.TextureNames.IndexOf(texturePatternCfg.ConstantValue.Texture);
                            matAnimData.Constants.Add(constant);

                            matAnimData.VisualConstantIndex     = 0;
                            matAnimData.BeginVisalConstantIndex = 0;
                        }
                        else if (texturePatternCfg.CurveData != null)
                        {
                            patternInfo.CurveIndex = CurveIndex++;

                            matAnimData.TexturePatternCurveIndex = TexturePatternCurveIndex;
                            matAnimData.BeginVisalConstantIndex  = 0;

                            AnimCurve curve = new AnimCurve();
                            matAnimData.Curves.Add(curve);

                            curve.Offset         = 0;
                            curve.AnimDataOffset = 0;
                            curve.Scale          = 1;
                            curve.CurveType      = AnimCurveType.StepInt;
                            curve.StartFrame     = 0;

                            int FrameCount = texturePatternCfg.CurveData.KeyFrames.Count;

                            curve.Frames = new float[FrameCount];
                            curve.Keys   = new float[FrameCount, 1];

                            int MaxFrame = 0;
                            int MaxIndex = 0;

                            int i = 0;
                            foreach (var KeyFrame in texturePatternCfg.CurveData.KeyFrames)
                            {
                                int Index = matAnim.TextureNames.IndexOf(KeyFrame.Value);
                                Console.WriteLine($"{Index} {KeyFrame.Value}");

                                curve.Frames[i]  = KeyFrame.Key;
                                curve.Keys[i, 0] = Index;

                                MaxFrame = Math.Max(MaxIndex, KeyFrame.Key);
                                MaxIndex = Math.Max(MaxIndex, Index);

                                i++;
                            }

                            curve.EndFrame = curve.Frames.Max();

                            if (curve.Keys.Length > 1)
                            {
                                curve.Delta = curve.Keys[curve.Keys.Length - 1, 0] - curve.Keys[0, 0];
                            }

                            if (MaxFrame < byte.MaxValue)
                            {
                                curve.FrameType = AnimCurveFrameType.Byte;
                            }
                            else if (MaxFrame < ushort.MaxValue)
                            {
                                curve.FrameType = AnimCurveFrameType.Decimal10x5;
                            }
                            else
                            {
                                curve.FrameType = AnimCurveFrameType.Single;
                            }

                            if (MaxIndex < byte.MaxValue)
                            {
                                curve.KeyType = AnimCurveKeyType.SByte;
                            }
                            else if (MaxIndex < ushort.MaxValue)
                            {
                                curve.KeyType = AnimCurveKeyType.Int16;
                            }
                            else
                            {
                                curve.KeyType = AnimCurveKeyType.Single;
                            }
                        }
                    }

                    foreach (var paramCfg in matCfg.ParamInfos)
                    {
                        ParamAnimInfo paramInfo = new ParamAnimInfo();
                        paramInfo.Name = paramCfg.Name;
                        matAnimData.ParamAnimInfos.Add(paramInfo);

                        if (paramCfg.Constants != null && paramCfg.Constants.Count > 0)
                        {
                            paramInfo.BeginConstant = BeginConstantIndex;
                            paramInfo.ConstantCount = (ushort)paramCfg.Constants.Count;

                            BeginConstantIndex += (ushort)paramCfg.Constants.Count;
                            foreach (var constantCfg in paramCfg.Constants)
                            {
                                AnimConstant constant = new AnimConstant();
                                constant.AnimDataOffset = ConvertParamOffset(constantCfg.Offset);
                                constant.Value          = constantCfg.Value;
                                matAnimData.Constants.Add(constant);
                            }
                        }

                        if (paramCfg.CurveData != null && paramCfg.CurveData.Count > 0)
                        {
                            matAnimData.ShaderParamCurveIndex = ShaderParamCurveIndex;

                            paramInfo.BeginCurve      = CurveIndex;
                            paramInfo.FloatCurveCount = (ushort)paramCfg.CurveData.Count;

                            CurveIndex += (ushort)paramCfg.CurveData.Count;
                            foreach (var curveCfg in paramCfg.CurveData)
                            {
                                AnimCurve curve = new AnimCurve();
                                matAnimData.Curves.Add(curve);
                                curve.Offset         = 0;
                                curve.AnimDataOffset = ConvertParamOffset(curveCfg.Offset);
                                curve.Scale          = 1;
                                curve.CurveType      = AnimCurveType.Linear;
                                curve.StartFrame     = 0;

                                int   MaxFrame = 0;
                                float MaxValue = 0;

                                int FrameCount = curveCfg.KeyFrames.Count;
                                curve.Frames = new float[FrameCount];
                                curve.Keys   = new float[FrameCount, 2];

                                int i      = 0;
                                var values = curveCfg.KeyFrames.Values.ToList();
                                foreach (var KeyFrame in curveCfg.KeyFrames)
                                {
                                    curve.Frames[i]  = KeyFrame.Key;
                                    curve.Keys[i, 0] = KeyFrame.Value;

                                    //Calculate delta
                                    float Delta = 0;
                                    if (i < values.Count - 1)
                                    {
                                        Delta = values[i + 1] - values[i];
                                    }

                                    curve.Keys[i, 1] = Delta;

                                    MaxFrame = Math.Max(MaxFrame, KeyFrame.Key);
                                    MaxValue = Math.Max(MaxValue, KeyFrame.Value);
                                    i++;
                                }

                                curve.EndFrame = curve.Frames.Max();

                                if (curve.Keys.Length > 1)
                                {
                                    curve.Delta = values[values.Count - 1] - values[0];
                                }

                                curve.KeyType   = AnimCurveKeyType.Single;
                                curve.FrameType = AnimCurveFrameType.Single;

                                /*    if (MaxFrame < byte.MaxValue)
                                 *      curve.FrameType = AnimCurveFrameType.Byte;
                                 *  else if (MaxFrame < ushort.MaxValue)
                                 *      curve.FrameType = AnimCurveFrameType.Decimal10x5;
                                 *  else
                                 *      curve.FrameType = AnimCurveFrameType.Single;
                                 *
                                 *  if (MaxValue < byte.MaxValue)
                                 *      curve.KeyType = AnimCurveKeyType.SByte;
                                 *  else if (MaxValue < ushort.MaxValue)
                                 *      curve.KeyType = AnimCurveKeyType.Int16;
                                 *  else
                                 *      curve.KeyType = AnimCurveKeyType.Single;*/
                            }
                        }
                    }

                    TexturePatternCurveIndex += matAnimData.TexturePatternAnimInfos.Where(item => item.CurveIndex != uint.MaxValue).ToList().Count;
                    ShaderParamCurveIndex    += CurveIndex;
                }

                return(matAnim);
            }