4 * License : The MIT License
\r
5 * Copyright(c) 2010 MikuToga Partners
\r
8 package jp.sourceforge.mikutoga.pmd.pmdloader;
\r
10 import java.io.IOException;
\r
11 import java.util.ArrayList;
\r
12 import java.util.List;
\r
13 import jp.sourceforge.mikutoga.parser.MmdFormatException;
\r
14 import jp.sourceforge.mikutoga.parser.MmdSource;
\r
15 import jp.sourceforge.mikutoga.parser.pmd.PmdParser;
\r
16 import jp.sourceforge.mikutoga.pmd.MorphPart;
\r
17 import jp.sourceforge.mikutoga.pmd.PmdModel;
\r
20 * PMDモデルファイルを読み込むためのローダ。
\r
22 public class PmdLoader {
\r
24 private PmdModel model;
\r
25 private PmdParser parser;
\r
26 private TextBuilder textBuilder;
\r
28 private boolean loaded = false;
\r
29 private boolean hasMoreData = false;
\r
33 * @param source PMDファイル入力ソース
\r
35 public PmdLoader(MmdSource source){
\r
38 this.model = new PmdModel();
\r
39 this.parser = new PmdParser(source);
\r
40 this.textBuilder = new TextBuilder(this.model);
\r
50 private void setHandler(){
\r
51 ShapeBuilder shapeBuilder = new ShapeBuilder(this.model);
\r
52 MaterialBuilder materialBuilder = new MaterialBuilder(this.model);
\r
53 BoneBuilder boneBuilder = new BoneBuilder(this.model);
\r
54 MorphBuilder morphBuilder = new MorphBuilder(this.model);
\r
55 ToonBuilder toonBuilder = new ToonBuilder(this.model);
\r
56 RigidBuilder rigidBuilder = new RigidBuilder(this.model);
\r
57 JointBuilder jointBuilder = new JointBuilder(this.model);
\r
59 this.parser.setBasicHandler(this.textBuilder);
\r
60 this.parser.setShapeHandler(shapeBuilder);
\r
61 this.parser.setMaterialHandler(materialBuilder);
\r
62 this.parser.setBoneHandler(boneBuilder);
\r
63 this.parser.setMorphHandler(morphBuilder);
\r
64 this.parser.setEngHandler(this.textBuilder);
\r
65 this.parser.setToonHandler(toonBuilder);
\r
66 this.parser.setRigidHandler(rigidBuilder);
\r
67 this.parser.setJointHandler(jointBuilder);
\r
69 List<MorphPart> morphPartList = new ArrayList<MorphPart>();
\r
70 morphBuilder.setMorphPartList(morphPartList);
\r
71 this.textBuilder.setMorphPartList(morphPartList);
\r
72 morphPartList.clear();
\r
78 * PMDファイルの読み込みを行いモデル情報を返す。
\r
79 * 1インスタンスにつき一度しかロードできない。
\r
81 * @throws IOException 入力エラー
\r
82 * @throws MmdFormatException PMDファイルフォーマットの異常を検出
\r
83 * @throws IllegalStateException このインスタンスで再度のロードを試みた。
\r
85 public PmdModel load()
\r
88 IllegalStateException {
\r
89 if(this.loaded) throw new IllegalStateException();
\r
93 this.parser.parsePmd();
\r
97 result = this.model;
\r
98 this.hasMoreData = this.textBuilder.hasMoreData();
\r
101 this.parser = null;
\r
102 this.textBuilder = null;
\r
109 * ロード処理が正常終了したのにまだ読み込んでいない部分が放置されているか判定する。
\r
110 * MMDでの仕様拡張によるPMDファイルフォーマットの拡張が行われた場合を想定。
\r
111 * @return 読み込んでいない部分があればtrue
\r
113 public boolean hasMoreData(){
\r
114 return this.hasMoreData;
\r