4 * License : The MIT License
5 * Copyright(c) 2011 MikuToga Partners
8 package jp.sfjp.mikutoga.vmd.model.binio;
10 import java.io.IOException;
11 import java.io.InputStream;
12 import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
13 import jp.sfjp.mikutoga.vmd.model.VmdMotion;
14 import jp.sfjp.mikutoga.vmd.parser.VmdParser;
17 * VMDモーションファイルを読み込むためのバイナリローダ。
19 public class VmdLoader {
21 private static final String ERR_TRYLOAD = "try loading first.";
22 private static final String ERR_LOADED = "has been loaded.";
25 private boolean loaded = false;
26 private boolean hasMoreData = true;
28 private boolean redundantCheck = false;
41 * 正常パース時に読み残したデータがあったか判定する。
42 * @return 読み残したデータがあればtrue
43 * @throws IllegalStateException まだパースを試みていない。
45 public boolean hasMoreData() throws IllegalStateException{
46 if( ! this.loaded ) throw new IllegalStateException(ERR_TRYLOAD);
47 return this.hasMoreData;
51 * ボーンモーション補間情報冗長部のチェックを行うか否か設定する。
53 * <p>※MMDVer7.30前後のVMD出力不具合を回避したい場合は、
54 * オフにするとパースに成功する場合がある。
55 * <p>※MMD Ver7.39x64以降はチェック回避必須。
56 * @param mode チェックさせたければtrue
58 public void setRedundantCheck(boolean mode){
59 this.redundantCheck = mode;
64 * VMDファイルの読み込みを行いモーション情報を返す。
65 * 1インスタンスにつき一度しかロードできない。
66 * @param source VMDファイル入力ソース
68 * @throws IOException 入力エラー
69 * @throws MmdFormatException VMDファイルフォーマットの異常を検出
70 * @throws IllegalStateException このインスタンスで再度のロードを試みた。
72 public VmdMotion load(InputStream source)
75 IllegalStateException {
76 if(this.loaded) throw new IllegalStateException(ERR_LOADED);
78 VmdMotion motion = new VmdMotion();
80 VmdParser parser = new VmdParser(source);
82 parser.setRedundantCheck(this.redundantCheck);
84 BasicLoader basicBuilder = new BasicLoader(motion);
85 CameraLoader cameraBuilder = new CameraLoader(motion);
86 LightingLoader lightingBuilder = new LightingLoader(motion);
87 BoolLoader boolBuilder = new BoolLoader(motion);
89 parser.setBasicHandler(basicBuilder);
90 parser.setCameraHandler(cameraBuilder);
91 parser.setLightingHandler(lightingBuilder);
92 parser.setBoolHandler(boolBuilder);
96 this.hasMoreData = basicBuilder.hasMoreData();