Exemple #1
0
        void refin(List <Vec3> vert, List <int> faceGr, List <Vector2> uv, AdaptiveOptionsCs option)
        {
            Init( );

            using (var refi = new Refiner(vert, faceGr, 3))
            {
                refi.AddChannel(new FVarChannelCs(faceGr, uv.Count));
                for (int i = 0; i < uv.Count; i++)
                {
                    refi.SetUV(uv[i].X, uv[i].Y);
                }
                refi.AddOption(option);
                refi.OnFace = OnFace;
                refi.OnUV   = OnUV;
                refi.OnVert = OnVert;
                refi.DoRefine( );
            }
        }
Exemple #2
0
        static void Main(string[] args)
        {
#if true
            RefineMMD      refine = new RefineMMD();
            var            path   = "debugRect.pmx";//ex.pmx";
            OpenFileDialog dialog = new OpenFileDialog( );
            dialog.Filter = ".pmx|*.pmx";
            if (dialog.ShowDialog( ) == DialogResult.OK)
            {
                path = dialog.FileName;
            }
            refine.DebugRect(path);
            //RefineMMD debugRef = new RefineMMD( );
            //debugRef.DebugRect( path + "ex.pmx" );
#else
            var      exePath = AppDomain.CurrentDomain.BaseDirectory;
            var      path    = @"miku.csv";
            string[] lines   = File.ReadAllLines(path);
            //;Face,親材質名,面Index,頂点Index1,頂点Index2,頂点Index3
            //Face,"スカート腕ヘドフォン",0,858,840,855
            // のように最初の文字列がVertexだと頂点 Faceだと面になる ;が最初に来るものは説明用のものなので弾く
            var gr = lines.GroupBy(l => l.Split(',')[0]);
            var gs = gr.Where(g => !g.Key.Contains(";")).ToDictionary(s => s.Key, g => g.ToList( ));

            var Vertice = ParseCSV(gs["Vertex"]).ToList( );
            var faceGr  =            //.GroupBy( s => s.Split( ',' )[ 1 ] ).ToDictionary( s => s.Key , g => g.ToList( ) );
                          Util.ParseFaceCSVAll(gs["Face"]).SelectMany(x => x).ToList();

            var verts = new List <Vec3> {
                new Vec3(-0.5f, -0.5f, 0.5f),
                new Vec3(0.5f, -0.5f, 0.5f),
                new Vec3(-0.5f, 0.5f, 0.5f),
                new Vec3(0.5f, 0.5f, 0.5f),
                new Vec3(-0.5f, 0.5f, -0.5f),
                new Vec3(0.5f, 0.5f, -0.5f),
                new Vec3(-0.5f, -0.5f, -0.5f),
                new Vec3(0.5f, -0.5f, -0.5f),
            };

            var faces = new List <int>
            {
                0, 1, 3, 2,
                2, 3, 5, 4,
                4, 5, 7, 6,
                6, 7, 1, 0,
                1, 7, 5, 3,
                6, 0, 2, 4
            };

            var option = new AdaptiveOptionsCs(1);
            option.UseInfSharpPatch     = true;
            option.UseSingleCreasePatch = true;
            // far_tutorial_6 がパラメトリックにずらす
            // far_tutorial_3 uvなど
            using (var refi = new Refiner(Vertice, faceGr, 3))
            {
                refi.AddOption(option);
                refi.DoRefine( );
            }
#endif
        }
Exemple #3
0
        public void DebugRect(string path)
        {
            using (FileStream sr = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                using (BinaryReader bin = new BinaryReader(sr))
                {
                    var pmxModelData = new PmxModelData(bin);
                    //Path = path;
                    //PmxModelData.Write( path + "ex.pmx" );
                    var               vert          = pmxModelData.VertexArray.Select(v => v.Pos.ToV3( )).ToList( );
                    var               uv            = pmxModelData.VertexArray.Select(v => v.Uv).ToList( );
                    List <int>        faceGr        = pmxModelData.VertexIndices.ToList( );
                    PmxMaterialData[] materialArray = pmxModelData.MaterialArray;
                    string            parent        = Directory.GetParent(path).FullName;
                    var               option        = new AdaptiveOptionsCs(1);
                    //option.UseInfSharpPatch = true;
                    //option.UseSingleCreasePatch = true;
                    option.ConsiderFVarChannels = true;
#if false
                    // far_tutorial_6 がパラメトリックにずらす
                    // far_tutorial_3 uvなど
                    refin(vert, faceGr, uv, option);


                    pmxModelData.VertexArray = CreateVert( ).ToArray( );
                    // VertexIndices と同じ
                    materialArray[0].FaceCount = Faces.Count;
                    // boneid と materialは仮
                    pmxModelData.VertexIndices = Faces.ToArray( );
                    pmxModelData.Write(path + "ex.pmx");
#else
                    int currentFaces         = 0;
                    int refinedVertsCount    = 0;
                    var refinedVertice       = new List <PmxVertexData>( );
                    int appendedVerticeCount = 0;
                    var inds          = new List <int>( );
                    var refineTargets = new List <int> {
                        0, 1, 2, 5, 8, 9
                    };
                    for (int i = 0; i < materialArray.Length; i++)
                    {
                        int faces       = materialArray[i].FaceCount;
                        var havingFaces = faceGr.Range(currentFaces, faces).ToList( );
                        // Distinctすると面IDがばらばらになっている、正しい頂点順で拾うためにソート
                        var uniqueFaces = havingFaces.Distinct( ).ToList( );
                        uniqueFaces.Sort( );
                        var matVertice = uniqueFaces.Select(ind => pmxModelData.VertexArray[ind]);
                        // リファインしないならもとの頂点のまま入れる
                        if (!refineTargets.Contains(i))
                        {
                            currentFaces += faces;
                            refinedVertice.AddRange(matVertice);
                            // 合計して増えた頂点数分オフセットすれば
                            inds.AddRange(havingFaces                             // );//
                                          .Select(x => x + appendedVerticeCount));
                            refinedVertsCount += matVertice.Count( );
                            continue;
                        }
                        var uvInMat = uniqueFaces.Select(ind => uv[ind]).ToList( );
                        refin(vert, havingFaces, uvInMat, option);
                        materialArray[i].FaceCount = Faces.Count;
                        List <PmxVertexData> createdVert = CreateVert( );
                        refinedVertice.AddRange(createdVert);
                        inds.AddRange(Faces.Select(x => x + refinedVertsCount));
                        refinedVertsCount    += createdVert.Count;
                        appendedVerticeCount += createdVert.Count - matVertice.Count( );
                        currentFaces         += faces;
                    }
                    pmxModelData.VertexArray = refinedVertice.ToArray();
                    // VertexIndices と同じ
                    // boneid と materialは仮
                    pmxModelData.VertexIndices = inds.ToArray( );
                    pmxModelData.Write(path + "smo.pmx");
#endif
                }
            }
        }