Esempio n. 1
0
        public static void ProcessCarForCarmageddonMaxDamage()
        {
            if (SceneManager.Current.Models.Count == 0)
            {
                return;
            }

            Model model = SceneManager.Current.Models[0];
            ModelBoneCollection bones = SceneManager.Current.Models[0].Bones[0].AllChildren();

            SceneManager.Current.UpdateProgress("Applying Carmageddon Reincarnation scale");

            ModelManipulator.Scale(bones, Matrix4D.CreateScale(6.9f, 6.9f, -6.9f), true);
            ModelManipulator.FlipFaces(bones, true);

            SceneManager.Current.UpdateProgress("Fixing material names");

            foreach (Material material in SceneManager.Current.Materials)
            {
                if (material.Name.Contains("."))
                {
                    material.Name = material.Name.Substring(0, material.Name.IndexOf("."));
                }
                material.Name = material.Name.Replace("\\", "");
            }

            SceneManager.Current.UpdateProgress("Munging parts and fixing wheels");

            float scale;

            for (int i = 0; i < bones.Count; i++)
            {
                ModelBone bone = bones[i];

                if (i == 0)
                {
                    bone.Name      = "c_Body";
                    bone.Mesh.Name = "c_Body";
                }
                else
                {
                    bone.Name = Path.GetFileNameWithoutExtension(bone.Name);
                }

                switch (bone.Name.ToUpper())
                {
                case "C_BODY":
                    break;

                case "FLPIVOT":
                case "FRPIVOT":
                    bone.Name = "Hub_" + bone.Name.ToUpper().Substring(0, 2);

                    if (bone.Transform.ExtractTranslation() == Vector3.Zero)
                    {
                        ModelManipulator.MungeMeshWithBone(bone.Children[0].Mesh, false);

                        Matrix4D m = bone.Transform;
                        m.M31          = bone.Children[0].Transform.M31;
                        m.M32          = bone.Children[0].Transform.M32;
                        m.M33          = bone.Children[0].Transform.M33;
                        bone.Transform = m;

                        model.SetTransform(Matrix4D.Identity, bone.Children[0].Index);
                    }
                    break;

                case "FLWHEEL":
                    scale = bone.CombinedTransform.ExtractTranslation().Y / 0.35f;

                    bone.Name = "Wheel_FL";
                    model.ClearMesh(bone.Index);
                    model.SetTransform(Matrix4D.CreateScale(scale) * Matrix4D.CreateRotationY(Maths.DegreesToRadians(180)), bone.Index);
                    break;

                case "FRWHEEL":
                    scale = bone.CombinedTransform.ExtractTranslation().Y / 0.35f;

                    bone.Name = "Wheel_FR";
                    model.ClearMesh(bone.Index);
                    model.SetTransform(Matrix4D.CreateScale(scale), bone.Index);
                    break;

                case "RLWHEEL":
                case "RRWHEEL":
                    string suffix = bone.Name.ToUpper().Substring(0, 2);

                    bone.Name = "Hub_" + suffix;

                    if (bone.Transform.ExtractTranslation() == Vector3.Zero)
                    {
                        ModelManipulator.MungeMeshWithBone(bone.Mesh, false);
                    }
                    model.ClearMesh(bone.Index);

                    scale = bone.CombinedTransform.ExtractTranslation().Y / 0.35f;

                    int newBone = model.AddMesh(null, bone.Index);
                    model.SetName("Wheel_" + suffix, newBone);
                    model.SetTransform(Matrix4D.CreateScale(scale) * (suffix == "RL" ? Matrix4D.CreateRotationY(Maths.DegreesToRadians(180)) : Matrix4D.Identity), newBone);
                    break;

                case "DRIVER":
                    bone.Name = "Dryver";
                    goto default;

                default:
                    if (bone.Type == BoneType.Mesh)
                    {
                        ModelManipulator.MungeMeshWithBone(bone.Mesh, false);
                    }
                    break;
                }
            }

            SceneManager.Current.UpdateProgress("Processing complete!");

            SceneManager.Current.SetCoordinateSystem(CoordinateSystem.LeftHanded);

            SceneManager.Current.Change(ChangeType.Munge, ChangeContext.Model, -1);

            SceneManager.Current.SetContext("Carmageddon Max Damage", ContextMode.Car);
        }