예제 #1
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);
            }
예제 #2
0
        public static void FromStruct(MaterialAnim anim, MaterialAnimHelper animJson)
        {
            anim.TextureNames = new ResDict <TextureRef>();
            foreach (var tex in animJson.TextureList)
            {
                anim.TextureNames.Add(tex, new TextureRef()
                {
                    Name = tex
                });
            }

            anim.Name                 = animJson.Name;
            anim.Baked                = animJson.Baked;
            anim.Loop                 = animJson.Loop;
            anim.FrameCount           = animJson.FrameCount;
            anim.Baked                = animJson.Baked;
            anim.MaterialAnimDataList = new List <MaterialAnimData>();
            anim.BindIndices          = new ushort[animJson.MaterialAnims.Count];
            for (int i = 0; i < anim.BindIndices.Length; i++)
            {
                anim.BindIndices[i] = 65535;
            }

            anim.UserData = UserDataConvert.Convert(animJson.UserData);

            foreach (var matAnimJson in animJson.MaterialAnims)
            {
                MaterialAnimData matAnim = new MaterialAnimData();
                anim.MaterialAnimDataList.Add(matAnim);
                matAnim.Name                  = matAnimJson.Name;
                matAnim.ParamAnimInfos        = new List <ParamAnimInfo>();
                matAnim.PatternAnimInfos      = new List <PatternAnimInfo>();
                matAnim.ShaderParamCurveIndex = 0;
                List <ushort> texturePatternBase = new List <ushort>();

                foreach (var samplerInfo in matAnimJson.Samplers)
                {
                    var info = new PatternAnimInfo();
                    info.Name       = samplerInfo.Name;
                    info.CurveIndex = -1;

                    if (samplerInfo.Curve != null)
                    {
                        info.CurveIndex = (short)matAnim.Curves.Count;
                    }

                    matAnim.PatternAnimInfos.Add(info);
                    texturePatternBase.Add(samplerInfo.Constant);

                    if (samplerInfo.Curve != null)
                    {
                        matAnim.Curves.Add(CurveAnimHelper.GenerateCurve(samplerInfo.Curve, 0, false));
                    }
                }

                ushort curveIndex    = 0;
                ushort constantIndex = 0;

                foreach (var paramInfo in matAnimJson.Params)
                {
                    var info = new ParamAnimInfo();
                    info.BeginCurve      = curveIndex;
                    info.BeginConstant   = constantIndex;
                    info.ConstantCount   = (ushort)paramInfo.Constants.Count;
                    info.FloatCurveCount = (ushort)paramInfo.Curves.Count();
                    info.IntCurveCount   = 0;
                    info.Name            = paramInfo.Name;
                    matAnim.ParamAnimInfos.Add(info);

                    if (paramInfo.Curves.Count > 0)
                    {
                        matAnim.VisualConstantIndex = 0;
                    }

                    foreach (var curveJson in paramInfo.Curves)
                    {
                        uint target = uint.Parse(curveJson.Target);
                        matAnim.Curves.Add(CurveAnimHelper.GenerateCurve(curveJson, target, false));
                    }
                    foreach (var constJson in paramInfo.Constants)
                    {
                        matAnim.Constants.Add(constJson);
                    }

                    curveIndex    += (ushort)matAnim.Curves.Count;
                    constantIndex += (ushort)matAnim.Constants.Count;
                }
                matAnim.BaseDataList = texturePatternBase.ToArray();
            }
        }