4 * License : The MIT License
5 * Copyright(c) 2010 MikuToga Partners
8 package jp.sfjp.mikutoga.pmd.model.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 * 正常パース時に読み残したデータがあったか判定する。
45 * PMDファイルフォーマットの拡張が行われた場合を想定。
47 * @return 読み残したデータがあればtrue
48 * @throws IllegalStateException まだパースを試みていない。
50 public boolean hasMoreData() throws IllegalStateException{
51 if( ! this.loaded ) throw new IllegalStateException(ERR_TRYLOAD);
52 return this.hasMoreData;
56 * PMDファイルの読み込みを行いモデル情報を返す。
57 * 1インスタンスにつき一度しかロードできない。
59 * @param source PMDファイル入力ソース
61 * @throws IOException 入力エラー
62 * @throws MmdFormatException PMDファイルフォーマットの異常を検出
63 * @throws IllegalStateException このインスタンスで再度のロードを試みた。
65 public PmdModel load(InputStream source)
68 IllegalStateException {
69 if(this.loaded) throw new IllegalStateException(ERR_LOADED);
71 PmdModel model = new PmdModel();
73 PmdParser parser = new PmdParser(source);
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);
84 List<MorphPart> morphPartList = new ArrayList<MorphPart>();
85 morphBuilder.setMorphPartList(morphPartList);
86 textBuilder.setMorphPartList(morphPartList);
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);
100 this.hasMoreData = textBuilder.hasMoreData();