OSDN Git Service

63cd1f30e0679c7a0557a71ddebfb04433a331d2
[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 PmdModel model;
25     private PmdParser parser;
26     private TextBuilder textBuilder;
27
28     private boolean loaded = false;
29     private boolean hasMoreData = false;
30
31     /**
32      * コンストラクタ。
33      * @param source PMDファイル入力ソース
34      */
35     public PmdLoader(InputStream source){
36         super();
37
38         this.model = new PmdModel();
39         this.parser = new PmdParser(source);
40         this.textBuilder = new TextBuilder(this.model);
41
42         setHandler();
43
44         return;
45     }
46
47     /**
48      * パーサに各種ハンドラの設定を行う。
49      */
50     private void setHandler(){
51         ShapeBuilder    shapeBuilder    = new ShapeBuilder(this.model);
52         MaterialBuilder materialBuilder = new MaterialBuilder(this.model);
53         BoneBuilder     boneBuilder     = new BoneBuilder(this.model);
54         MorphBuilder    morphBuilder    = new MorphBuilder(this.model);
55         ToonBuilder     toonBuilder     = new ToonBuilder(this.model);
56         RigidBuilder    rigidBuilder    = new RigidBuilder(this.model);
57         JointBuilder    jointBuilder    = new JointBuilder(this.model);
58
59         this.parser.setBasicHandler(this.textBuilder);
60         this.parser.setShapeHandler(shapeBuilder);
61         this.parser.setMaterialHandler(materialBuilder);
62         this.parser.setBoneHandler(boneBuilder);
63         this.parser.setMorphHandler(morphBuilder);
64         this.parser.setEngHandler(this.textBuilder);
65         this.parser.setToonHandler(toonBuilder);
66         this.parser.setRigidHandler(rigidBuilder);
67         this.parser.setJointHandler(jointBuilder);
68
69         List<MorphPart> morphPartList = new ArrayList<MorphPart>();
70         morphBuilder.setMorphPartList(morphPartList);
71         this.textBuilder.setMorphPartList(morphPartList);
72         morphPartList.clear();
73
74         return;
75     }
76
77     /**
78      * PMDファイルの読み込みを行いモデル情報を返す。
79      * 1インスタンスにつき一度しかロードできない。
80      * @return モデル情報
81      * @throws IOException 入力エラー
82      * @throws MmdFormatException PMDファイルフォーマットの異常を検出
83      * @throws IllegalStateException このインスタンスで再度のロードを試みた。
84      */
85     public PmdModel load()
86             throws IOException,
87                    MmdFormatException,
88                    IllegalStateException {
89         if(this.loaded) throw new IllegalStateException();
90
91         PmdModel result;
92         try{
93             this.parser.parsePmd();
94         }finally{
95             this.loaded = true;
96
97             result = this.model;
98             this.hasMoreData = this.textBuilder.hasMoreData();
99
100             this.model = null;
101             this.parser = null;
102             this.textBuilder = null;
103         }
104
105         return result;
106     }
107
108     /**
109      * ロード処理が正常終了したのにまだ読み込んでいない部分が放置されているか判定する。
110      * MMDでの仕様拡張によるPMDファイルフォーマットの拡張が行われた場合を想定。
111      * @return 読み込んでいない部分があればtrue
112      */
113     public boolean hasMoreData(){
114         return this.hasMoreData;
115     }
116
117 }