OSDN Git Service

Vmd2XMLと共通化
[mikutoga/Pmd2XML.git] / src / main / java / jp / sfjp / mikutoga / pmd / 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.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      * <p>MMDでの仕様拡張による
44      * PMDファイルフォーマットの拡張が行われた場合を想定。
45      * @return 読み残したデータがあればtrue
46      * @throws IllegalStateException まだパースを試みていない。
47      */
48     public boolean hasMoreData() throws IllegalStateException{
49         if( ! this.loaded ) throw new IllegalStateException(ERR_TRYLOAD);
50         return this.hasMoreData;
51     }
52
53     /**
54      * PMDファイルの読み込みを行いモデル情報を返す。
55      * 1インスタンスにつき一度しかロードできない。
56      * @param source PMDファイル入力ソース
57      * @return モデル情報
58      * @throws IOException 入力エラー
59      * @throws MmdFormatException PMDファイルフォーマットの異常を検出
60      * @throws IllegalStateException このインスタンスで再度のロードを試みた。
61      */
62     public PmdModel load(InputStream source)
63             throws IOException,
64                    MmdFormatException,
65                    IllegalStateException {
66         if(this.loaded) throw new IllegalStateException(ERR_LOADED);
67
68         PmdModel model = new PmdModel();
69
70         PmdParser parser = new PmdParser(source);
71
72         TextBuilder     textBuilder     = new TextBuilder(model);
73         ShapeBuilder    shapeBuilder    = new ShapeBuilder(model);
74         MaterialBuilder materialBuilder = new MaterialBuilder(model);
75         BoneBuilder     boneBuilder     = new BoneBuilder(model);
76         MorphBuilder    morphBuilder    = new MorphBuilder(model);
77         ToonBuilder     toonBuilder     = new ToonBuilder(model);
78         RigidBuilder    rigidBuilder    = new RigidBuilder(model);
79         JointBuilder    jointBuilder    = new JointBuilder(model);
80
81         List<MorphPart> morphPartList = new ArrayList<MorphPart>();
82         morphBuilder.setMorphPartList(morphPartList);
83         textBuilder.setMorphPartList(morphPartList);
84
85         parser.setBasicHandler(textBuilder);
86         parser.setShapeHandler(shapeBuilder);
87         parser.setMaterialHandler(materialBuilder);
88         parser.setBoneHandler(boneBuilder);
89         parser.setMorphHandler(morphBuilder);
90         parser.setEngHandler(textBuilder);
91         parser.setToonHandler(toonBuilder);
92         parser.setRigidHandler(rigidBuilder);
93         parser.setJointHandler(jointBuilder);
94
95         try{
96             parser.parsePmd();
97             this.hasMoreData = textBuilder.hasMoreData();
98         }finally{
99             this.loaded = true;
100         }
101
102         return model;
103     }
104
105 }