OSDN Git Service

82645d0cbb99078c5e62874b022b3f931c391f20
[mikutoga/Pmd2XML.git] / src / main / java / jp / sfjp / mikutoga / pmd / model / binio / PmdLoader.java
1 /*
2  * PMD file loader
3  *
4  * License : The MIT License
5  * Copyright(c) 2010 MikuToga Partners
6  */
7
8 package jp.sfjp.mikutoga.pmd.model.binio;
9
10 import java.io.IOException;
11 import java.io.InputStream;
12 import java.util.ArrayList;
13 import java.util.List;
14 import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
15 import jp.sfjp.mikutoga.pmd.model.MorphPart;
16 import jp.sfjp.mikutoga.pmd.model.PmdModel;
17 import jp.sfjp.mikutoga.pmd.parser.PmdParser;
18
19 /**
20  * PMDモデルファイルを読み込むためのローダ。
21  */
22 public class PmdLoader {
23
24     private static final String ERR_TRYLOAD = "try loading first.";
25     private static final String ERR_LOADED  = "has been loaded.";
26
27
28     private boolean loaded = false;
29     private boolean hasMoreData = true;
30
31
32     /**
33      * コンストラクタ。
34      */
35     public PmdLoader(){
36         super();
37         return;
38     }
39
40
41     /**
42      * 正常パース時に読み残したデータがあったか判定する。
43      *
44      * <p>MMDでの仕様拡張による
45      * PMDファイルフォーマットの拡張が行われた場合を想定。
46      *
47      * @return 読み残したデータがあればtrue
48      * @throws IllegalStateException まだパースを試みていない。
49      */
50     public boolean hasMoreData() throws IllegalStateException{
51         if( ! this.loaded ) throw new IllegalStateException(ERR_TRYLOAD);
52         return this.hasMoreData;
53     }
54
55     /**
56      * PMDファイルの読み込みを行いモデル情報を返す。
57      * 1インスタンスにつき一度しかロードできない。
58      *
59      * @param source PMDファイル入力ソース
60      * @return モデル情報
61      * @throws IOException 入力エラー
62      * @throws MmdFormatException PMDファイルフォーマットの異常を検出
63      * @throws IllegalStateException このインスタンスで再度のロードを試みた。
64      */
65     public PmdModel load(InputStream source)
66             throws IOException,
67                    MmdFormatException,
68                    IllegalStateException {
69         if(this.loaded) throw new IllegalStateException(ERR_LOADED);
70
71         PmdModel model = new PmdModel();
72
73         PmdParser parser = new PmdParser(source);
74
75         TextBuilder     textBuilder     = new TextBuilder(model);
76         ShapeBuilder    shapeBuilder    = new ShapeBuilder(model);
77         MaterialBuilder materialBuilder = new MaterialBuilder(model);
78         BoneBuilder     boneBuilder     = new BoneBuilder(model);
79         MorphBuilder    morphBuilder    = new MorphBuilder(model);
80         ToonBuilder     toonBuilder     = new ToonBuilder(model);
81         RigidBuilder    rigidBuilder    = new RigidBuilder(model);
82         JointBuilder    jointBuilder    = new JointBuilder(model);
83
84         List<MorphPart> morphPartList = new ArrayList<MorphPart>();
85         morphBuilder.setMorphPartList(morphPartList);
86         textBuilder.setMorphPartList(morphPartList);
87
88         parser.setBasicHandler(textBuilder);
89         parser.setShapeHandler(shapeBuilder);
90         parser.setMaterialHandler(materialBuilder);
91         parser.setBoneHandler(boneBuilder);
92         parser.setMorphHandler(morphBuilder);
93         parser.setEngHandler(textBuilder);
94         parser.setToonHandler(toonBuilder);
95         parser.setRigidHandler(rigidBuilder);
96         parser.setJointHandler(jointBuilder);
97
98         try{
99             parser.parsePmd();
100             this.hasMoreData = textBuilder.hasMoreData();
101         }finally{
102             this.loaded = true;
103         }
104
105         return model;
106     }
107
108 }