Exemplo n.º 1
0
        //①Form.OnLoadをオーバーライドする。
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e); //RenderFormはOnLoad内で3DCG空間を初期化しているため、base.OnLoadがOnLoad内で一番初めに呼ぶべきである。

            //ファイルを開くダイアログ
            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                //ダイアログの返値がOKの場合、モデルの読み込み処理をする


                //②モデルを読み込む
                PMXModel model = PMXModelWithPhysics.OpenLoad(ofd.FileName, RenderContext);//MMDModel MMDModelWithPhysics.OpenLoad(string ファイル名,RenderContext);となっています
                //以下のように書けば、物理演算を無効にして読み込むことも可能
                //MMDModel model=MMDModel.OpenLoad(ofd.FileName, RenderContext);
                //RenderContextはカメラの情報やデバイスの情報など3DCG描画に必要な変数である。RenderFormを継承している場合、メンバー変数として利用可能である。
                //基本的にモデルなどの読み込みが必要なものは、DirectX11デバイスの情報などを保持するRenderContextの値を要求する場合が多い。

                //③ワールド空間にモデルを追加する
                WorldSpace.AddResource(model);
                //WorldSpaceは、このフォームの描画する3D空間を示している。ここにモデルなど(IDrawableを実装している)ものを渡すと、描画してくれる。
                //WorldSpaceは、ScreenContext.WorldSpaceと常に等しい。ウィンドウごとに必要な3DCG描画に必要な情報はScreenContextに保管されている。
            }
        }
Exemplo n.º 2
0
        protected override void OnClosed(EventArgs e)
        {
            model?.Dispose();
            model = null;

            base.OnClosed(e);
        }
Exemplo n.º 3
0
        static void FindTextures(PMXModel md, string[] textureFolders, string outputFolder)
        {
            string textureOutputFolder = outputFolder + Path.DirectorySeparatorChar.ToString() + "tex";

            foreach (PMXMaterial mat in md.Materials)
            {
                if (mat.DiffuseTexture == null || mat.DiffuseTexture.Length == 0)
                {
                    continue;
                }
                string texFileName = mat.DiffuseTexture;

                if (File.Exists(textureOutputFolder + Path.DirectorySeparatorChar.ToString() + texFileName))
                {
                    mat.DiffuseTexture = "tex\\" + mat.DiffuseTexture;
                    continue;
                }

                foreach (string textureFolder in textureFolders)
                {
                    if (File.Exists(textureFolder + Path.DirectorySeparatorChar.ToString() + texFileName))
                    {
                        mat.DiffuseTexture = "tex\\" + mat.DiffuseTexture;

                        if (!Directory.Exists(textureOutputFolder))
                        {
                            Directory.CreateDirectory(textureOutputFolder);
                        }

                        File.Copy(textureFolder + Path.DirectorySeparatorChar.ToString() + texFileName, textureOutputFolder + Path.DirectorySeparatorChar.ToString() + texFileName);
                        break;
                    }
                }
            }
        }
Exemplo n.º 4
0
        /// <summary>
        ///     モデルの初期状態における外接直方体を計算します.
        /// </summary>
        /// <param name="model">対称のモデル.</param>
        /// <returns>外接直方体.</returns>
        private static CubeF CalculateModelCube(PMXModel model)
        {
            VertexList list = model.Model.VertexList;

            float      left, top, right, bottom, front, back;
            VertexData first = list.Vertexes.First();

            left  = right = first.Position.X;
            top   = bottom = first.Position.Y;
            front = back = first.Position.Z;

            foreach (VertexData v in list.Vertexes)
            {
                left   = v.Position.X < left ? v.Position.X : left;
                top    = top < v.Position.Y ? v.Position.Y : top;
                right  = right < v.Position.X ? v.Position.X : right;
                bottom = v.Position.Y < bottom ? v.Position.Y : bottom;
                front  = v.Position.Z < front ? v.Position.Z : front;
                back   = back < v.Position.Z ? v.Position.Z : back;
            }

            return(new CubeF
            {
                X = left,
                Width = right - left,
                Y = bottom,
                Height = top - bottom,
                Z = front,
                Depth = back - front
            });
        }
Exemplo n.º 5
0
        //①Form.OnLoadをオーバーライドする。
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e); //The RenderForm Initializes the 3D space within the OnLoad for the base.OnLoadがOnLoad内で一番初めに呼ぶべきである。

            //The file open dialog
            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                //OK if the return value of the dialog to model loading process


                //②モデルを読み込む
                PMXModel model = PMXModelWithPhysics.OpenLoad(ofd.FileName, RenderContext);//MMDModel MMDModelWithPhysics.OpenLoad(string ファイル名,RenderContext);となっています
                //Possible to disable physics if you write the following in the load
                //MMDModel model=MMDModel.OpenLoad(ofd.FileName, RenderContext);
                //RenderContext is required to draw the camera or device information, including 3D variable。RenderFormを継承している場合、メンバー変数として利用可能である。
                //To request the value of RenderContext DirectX11 device information to hold a basically loads, such as those that require a lot。

                //③ワールド空間にモデルを追加する
                WorldSpace.AddResource(model);
                //WorldSpace shows the 3D space to draw on this form.。ここにモデルなど(IDrawableを実装している)ものを渡すと、描画してくれる。
                //WorldSpace is a ScreenContext.WorldSpaceと常に等しい。ウィンドウごとに必要な3DCG描画に必要な情報はScreenContextに保管されている。
            }
        }
Exemplo n.º 6
0
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                PMXModel model = PMXModelWithPhysics.OpenLoad(ofd.FileName, RenderContext);

                OpenFileDialog ofd2 = new OpenFileDialog();
                ofd2.Filter = "vmdモーションファイル(*.vmd)|*.vmd";
                if (ofd2.ShowDialog() == DialogResult.OK)
                {
                    IMotionProvider motion = model.MotionManager.AddMotionFromFile(ofd2.FileName, true);
                    model.MotionManager.ApplyMotion(motion, 0, ActionAfterMotion.Replay);
                }
                WorldSpace.AddResource(model);
                //③ カメラモーションの選択ダイアログを表示し、選ばれたものをScreenContext.CameraMotionProviderに代入する。
                CameraControlSelector selector = new CameraControlSelector(model);
                selector.ShowDialog(this);
                ScreenContext.CameraMotionProvider = selector.ResultCameraMotionProvider;

                /*
                 * ScreenContext.CameraMotionProviderに代入されたインターフェースのUpdateCameraが毎回呼ばれることによりカメラを更新している。
                 * この変数の型はICameraMotionProviderのため、これを実装すればカメラの動きは容易に定義可能である。
                 */
            }
        }
Exemplo n.º 7
0
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                PMXModel model = PMXModelWithPhysics.OpenLoad(ofd.FileName, RenderContext);

                OpenFileDialog ofd2 = new OpenFileDialog();
                ofd2.Filter = "vmdモーションファイル(*.vmd)|*.vmd";
                if (ofd2.ShowDialog() == DialogResult.OK)
                {
                    IMotionProvider motion = model.MotionManager.AddMotionFromFile(ofd2.FileName, true);
                    model.MotionManager.ApplyMotion(motion, 0, ActionAfterMotion.Replay);
                }

                WorldSpace.AddResource(model);
                //②コントローラーフォームに対して読み込んだモデルを渡して表示します。
                Controller controller = new Controller(model);
                controller.Show();
            }
        }
Exemplo n.º 8
0
 public MaterialMorphProvider(PMXModel model)
 {
     this.model = model;
     foreach (MorphData materialMorphData in model.Model.MorphList.Morphes)
     {
      if(materialMorphData.type==MorphType.Matrial)Morphs.Add(materialMorphData.MorphName,new MaterialMorphData(materialMorphData));
     }
 }
Exemplo n.º 9
0
        private static PMXVertex ReplaceVertexIfRequired(PMXVertex input, PMXModel md, int[] duplicateList)
        {
            int dupIndex = duplicateList[((PMXExtendedVertex)input).EasySlashIndex];

            if (dupIndex >= 0)
            {
                return(md.Vertices[dupIndex]);
            }
            return(input);
        }
Exemplo n.º 10
0
 public ModelData(string name, PMXModel model, IShell shell)
 {
     Name  = name;
     Model = model;
     shell.LoadModel(model);
     MotionManager        = new ModelMotionManager(model);
     ModelCube            = CalculateModelCube(model);
     _baloonReferenceBone = model.Skinning.BoneDictionary["頭"];
     _centerReferenceBone = model.Skinning.BoneDictionary["下半身"];
 }
Exemplo n.º 11
0
 public BoneMorphProvider(PMXModel model)
 {
     this.skinningProvider = model.Skinning;
     foreach (MorphData morphData in model.Model.MorphList.Morphes)
     {
         if (morphData.type == MorphType.Bone)
         {
             this.MorphList.Add(morphData.MorphName, new BoneMorphData(morphData));
         }
     }
 }
Exemplo n.º 12
0
        private void Add2Form1_Click(object sender, EventArgs e)
        {
            var ofd = new OpenFileDialog();

            ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                PMXModel model = PMXModel物理変形付き.ファイルから読み込む(ofd.FileName);
                form1.ScreenContext.ワールド空間.Drawableを追加する(model);
            }
        }
Exemplo n.º 13
0
        private void loadModel_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx";
            if (ofd.ShowDialog(this) == DialogResult.OK)
            {
                model = PMXModelWithPhysics.OpenLoad(ofd.FileName, renderControl1.RenderContext);
                renderControl1.WorldSpace.AddResource(model);
            }
        }
Exemplo n.º 14
0
 public PMXMorphManager(PMXModel model)
 {
     this.MMDMorphs.Add(new VertexMorphProvider(model.Model, model.BufferManager));
     this.MMDMorphs.Add(new BoneMorphProvider(model));
     this.MMDMorphs.Add(new MaterialMorphProvider(model));
     this.MMDMorphs.Add(new GroupMorphProvider(model, this));
     this.MMDMorphs.Add(new UVMorphProvider(model, MorphType.UV));
     this.MMDMorphs.Add(new UVMorphProvider(model, MorphType.UV_Additional1));
     this.MMDMorphs.Add(new UVMorphProvider(model, MorphType.UV_Additional2));
     this.MMDMorphs.Add(new UVMorphProvider(model, MorphType.UV_Additional3));
     this.MMDMorphs.Add(new UVMorphProvider(model, MorphType.UV_Additional4));
 }
Exemplo n.º 15
0
        private void Add2ChildForm_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                PMXModel model = PMXModelWithPhysics.OpenLoad(ofd.FileName, childForm.RenderContext);
                //RenderContext pass here are common in childForm form1 so good either
                childForm.WorldSpace.AddResource(model);
            }
        }
Exemplo n.º 16
0
        private void Add2ChildForm_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                PMXModel model = PMXModelWithPhysics.OpenLoad(ofd.FileName, childForm.RenderContext);
                //ここで渡すRenderContextはform1とchildFormで共通しているのでどちらでも良い
                childForm.WorldSpace.AddResource(model);
            }
        }
Exemplo n.º 17
0
        public override void Subscribe(EffectVariable subscribeTo, SubscribeArgument variable)
        {
            if (!this.isCached)
            {
                this.modelCache = variable.Model as PMXModel;
                this.isCached   = true;
            }

            if (this.modelCache != null)
            {
                Subscribe(subscribeTo, this.modelCache.MotionManager, variable.Context);
            }
        }
Exemplo n.º 18
0
        static void Main(string[] args)
        {
            /*string folder = @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\map\0500\001";
             *
             * string[] textureFolders = new string[2]
             * {
             *  @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\map\texture",
             *  @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\map\texture2"
             * };*/

            string folder = @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\chara\011";

            string[] textureFolders = new string[2]
            {
                @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\chara\011\texture\001",
                @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\chara\011\face\001"
            };

            Stopwatch sw = Stopwatch.StartNew();

            string[] ism2Files = Directory.GetFiles(folder, "*.ism2");

            foreach (string ism2 in ism2Files)
            {
                if (ism2.IndexOf("col_") != -1)
                {
                    continue; //Don't export collission data
                }

                string outputDir = Path.GetDirectoryName(ism2) + Path.DirectorySeparatorChar.ToString() + "pmx";
                if (!Directory.Exists(outputDir))
                {
                    Directory.CreateDirectory(outputDir);
                }

                string pmx = outputDir + Path.DirectorySeparatorChar.ToString() + Path.GetFileName(Path.ChangeExtension(ism2, ".pmx"));
                Console.WriteLine("Importing " + Path.GetFileNameWithoutExtension(ism2));
                PMXModel md = ISMModel.ImportISM(ism2);
                CleanUpModel(md);
                TriangleClearance.SeperateTriangles(md, false, true);
                MirrorX(md);
                FindTextures(md, textureFolders, outputDir);
                md.SaveToFile(pmx);
                Console.WriteLine("");
            }

            sw.Stop();
            Console.WriteLine("Import complete - " + (int)Math.Round(sw.Elapsed.TotalSeconds) + " seconds");

            Console.ReadLine();
        }
Exemplo n.º 19
0
        /// <summary>
        /// Constractor
        ///
        /// </summary>
        /// <param name="model"></param>
        /// <param name="boneName"></param>
        /// <param name="distance"></param>
        /// <param name="viewFrom"></param>
        /// <param name="rotationZaxis"></param>
        public BoneFollowCameraMotionProvider(PMXModel model, string boneName, float distance, Vector3 viewFrom, bool rotationZaxis = false)
        {
            this.followModel = model;
            var bones = (from bone in model.Skinning.Bone where bone.BoneName == boneName select bone).ToArray();

            if (bones.Length == 0)
            {
                throw new InvalidOperationException(string.Format("ボーン\"{0}\"は見つかりませんでした。", boneName));
            }
            this.followBone      = bones[0];
            this.Distance        = distance;
            this.IsRotationZAxis = rotationZaxis;
            this.ViewFrom        = viewFrom;
        }
Exemplo n.º 20
0
        public static void StraightenHierarchie(PMXModel mdl, PMXBone source)
        {
            List <PMXBone> bones = new List <PMXBone>()
            {
                source
            };

            bones.AddRange(GetAllChildBones(mdl, source));

            foreach (PMXBone b in bones)
            {
                b.CreateLocalCoodinateAxis();
            }
        }
Exemplo n.º 21
0
        public GroupMorphProvider(PMXModel model, IMorphManager morph)
        {
            this.morphManager = morph;
            int i = 0;

            foreach (MorphData morphData in model.Model.MorphList.Morphes)
            {
                if (morphData.type == MorphType.Group)
                {
                    this.Morphs.Add(morphData.MorphName, new GroupMorphData(morphData));
                }
                this.morphNameList.Add(i, morphData.MorphName);
                i++;
            }
        }
Exemplo n.º 22
0
        public void TestLoadmodel()
        {
            var           form       = new RenderForm();
            RenderContext Context    = new RenderContext();
            ScreenContext _scContext = Context.Initialize(form);
            PMXModel      Model      = PMXModelWithPhysics.OpenLoad(@"C:\Users\ZhiYong\Documents\CodeBase\mmflex\debug\1.pmx", Context);

            Model.Transformer.Position = new Vector3(0, 0, 0);

            _scContext.WorldSpace.AddResource(Model);

            _scContext.Dispose();
            Model.Dispose();
            Context.Dispose();
        }
Exemplo n.º 23
0
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "pmxモデルファイル(*.pmx)|*.pmx";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                PMXModel model = PMXModelWithPhysics.OpenLoad(ofd.FileName, RenderContext);
                WorldSpace.AddResource(model);
                //②ボーン、モーフの編集用に作成したサンプルのGUIを表示する
                TransformController controller=new TransformController(model);
                controller.Show(this);
            }
        }
Exemplo n.º 24
0
        protected override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);
            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Title  = "表示するモデルファイルを選んでください。";
            ofd.Filter = "PMXモデルファイル(*.pmx)|*.pmx";
            if (ofd.ShowDialog() == true)
            {
                PMXModel model = PMXModel.OpenLoad(ofd.FileName, RenderControl.RenderContext);
                RenderControl.WorldSpace.AddResource(model);
                RenderControl.TextureContext.MatrixManager.ViewMatrixManager.CameraPosition = new Vector3(0, 10, -25);
                RenderControl.TextureContext.MatrixManager.ViewMatrixManager.CameraLookAt   = new Vector3(0, 10, 0);
                RenderControl.TextureContext.CameraMotionProvider = new WPFBasicCameraControllerMotionProvider(RenderControl, 10);//So do not react only on a fully transparent controls with the color of the Background#01000000などにすることでウィンドウ全域で反応するようになる。
            }
        }
Exemplo n.º 25
0
        protected override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);
            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Title  = "表示するモデルファイルを選んでください。";
            ofd.Filter = "PMXモデルファイル(*.pmx)|*.pmx";
            if (ofd.ShowDialog() == true)
            {
                PMXModel model = PMXModel.OpenLoad(ofd.FileName, RenderControl.RenderContext);
                RenderControl.WorldSpace.AddResource(model);
                RenderControl.TextureContext.MatrixManager.ViewMatrixManager.CameraPosition = new Vector3(0, 10, -25);
                RenderControl.TextureContext.MatrixManager.ViewMatrixManager.CameraLookAt   = new Vector3(0, 10, 0);
                RenderControl.TextureContext.CameraMotionProvider = new WPFBasicCameraControllerMotionProvider(RenderControl, 10);//コントロールを完全に透過すると、色のある部分の上しか反応しないので、Backgroundを#01000000などにすることでウィンドウ全域で反応するようになる。
            }
        }
Exemplo n.º 26
0
 public UVMorphProvider(PMXModel model, MorphType targetType)
 {
     bufferManager = model.BufferManager;
     targetMorph   = targetType;
     this.model    = model.Model;
     if (model.Model.Header.AdditionalUVCount + 2 <= (int)targetType)
     {
         return;                                                       //このとき対応した追加UVは存在しない
     }
     foreach (MorphData morphData in model.Model.MorphList.Morphes)
     {
         if (morphData.type == targetMorph)
         {
             Morphs.Add(morphData.MorphName, new UVMorphData(morphData));
         }
     }
 }
Exemplo n.º 27
0
        public static List <PMXBone> GetAllChildBones(PMXModel mdl, PMXBone parent)
        {
            List <PMXBone> res = new List <PMXBone>();

            foreach (PMXBone b in mdl.Bones)
            {
                if (b.Parent != parent)
                {
                    continue;
                }

                res.Add(b);
                res.AddRange(GetAllChildBones(mdl, b));
            }

            return(res);
        }
Exemplo n.º 28
0
 public UVMorphProvider(PMXModel model, MorphType targetType)
 {
     this.bufferManager = model.BufferManager;
     this.targetMorph   = targetType;
     this.model         = model.Model;
     if (model.Model.Header.AdditionalUVCount + 2 <= (int)targetType)
     {
         return;                                                       //Does not exist at this time for additional UV
     }
     foreach (MorphData morphData in model.Model.MorphList.Morphes)
     {
         if (morphData.type == this.targetMorph)
         {
             this.Morphs.Add(morphData.MorphName, new UVMorphData(morphData));
         }
     }
 }
Exemplo n.º 29
0
        protected override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);

            //② 使い方は今までのサンプルとほとんど同じだが、Renderメソッドなどを呼び出す必要性はない。
            //Also, you need to override WPFRenderControl if the RenderContext is created automatically, but this is disgusting。
            //The initialization, such as recommended in the OnInitialized
            RenderControl.Background = new Color4(1, 0, 0, 1);
            BasicGrid grid = new BasicGrid();

            grid.Load(RenderControl.RenderContext);
            RenderControl.WorldSpace.AddResource(grid);
            RenderControl.TextureContext.CameraMotionProvider = new WPFBasicCameraControllerMotionProvider(this);
            OpenFileDialog ofd = new OpenFileDialog();

            if (ofd.ShowDialog() == true)
            {
                PMXModel model = PMXModelWithPhysics.OpenLoad(ofd.FileName, RenderControl.RenderContext);
                RenderControl.WorldSpace.AddResource(model);
            }
        }
Exemplo n.º 30
0
        public static void SeperateTriangles(PMXModel model, bool ignoreSmallParts, bool combineVertexLocations)
        {
            TriangleClearance clearModel = new TriangleClearance(model, ignoreSmallParts, combineVertexLocations);
            int i = 0;

            for (i = 0; i < clearModel._model.Vertices.Count; i++)
            {
                ((PMXExtendedVertex)clearModel._model.Vertices[i]).EasySlashIndex = i;
            }

            List <PMXMaterial> resultMaterials = new List <PMXMaterial>();

            foreach (PMXMaterial mat in clearModel._model.Materials)
            {
                List <PMXMaterial> splittedMaterials = clearModel.SplitTriangles(mat);
                resultMaterials.AddRange(splittedMaterials);
            }

            clearModel._model.Materials.Clear();
            clearModel._model.Materials.AddRange(resultMaterials);
        }