4 * License : The MIT License
5 * Copyright(c) 2010 MikuToga Partners
8 package jp.sfjp.mikutoga.pmd.binio;
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;
20 * PMDモデルファイルを読み込むためのローダ。
22 public class PmdLoader {
24 private static final String ERR_TRYLOAD = "try loading first.";
25 private static final String ERR_LOADED = "has been loaded.";
28 private boolean loaded = false;
29 private boolean hasMoreData = true;
42 * 正常パース時に読み残したデータがあったか判定する。
44 * PMDファイルフォーマットの拡張が行われた場合を想定。
45 * @return 読み残したデータがあればtrue
46 * @throws IllegalStateException まだパースを試みていない。
48 public boolean hasMoreData() throws IllegalStateException{
49 if( ! this.loaded ) throw new IllegalStateException(ERR_TRYLOAD);
50 return this.hasMoreData;
54 * PMDファイルの読み込みを行いモデル情報を返す。
55 * 1インスタンスにつき一度しかロードできない。
56 * @param source PMDファイル入力ソース
58 * @throws IOException 入力エラー
59 * @throws MmdFormatException PMDファイルフォーマットの異常を検出
60 * @throws IllegalStateException このインスタンスで再度のロードを試みた。
62 public PmdModel load(InputStream source)
65 IllegalStateException {
66 if(this.loaded) throw new IllegalStateException(ERR_LOADED);
68 PmdModel model = new PmdModel();
70 PmdParser parser = new PmdParser(source);
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);
81 List<MorphPart> morphPartList = new ArrayList<MorphPart>();
82 morphBuilder.setMorphPartList(morphPartList);
83 textBuilder.setMorphPartList(morphPartList);
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);
97 this.hasMoreData = textBuilder.hasMoreData();