OSDN Git Service

MMD Ver7.40 対応 新スキーマ開発開始
[mikutoga/Vmd2XML.git] / src / main / java / jp / sfjp / mikutoga / vmd / model / binio / VmdLoader.java
1 /*
2  * VMD file loader
3  *
4  * License : The MIT License
5  * Copyright(c) 2011 MikuToga Partners
6  */
7
8 package jp.sfjp.mikutoga.vmd.model.binio;
9
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;
15
16 /**
17  * VMDモーションファイルを読み込むためのバイナリローダ。
18  */
19 public class VmdLoader {
20
21     private static final String ERR_TRYLOAD = "try loading first.";
22     private static final String ERR_LOADED  = "has been loaded.";
23
24
25     private boolean loaded = false;
26     private boolean hasMoreData = true;
27
28     private boolean redundantCheck = false;
29
30
31     /**
32      * コンストラクタ。
33      */
34     public VmdLoader(){
35         super();
36         return;
37     }
38
39
40     /**
41      * 正常パース時に読み残したデータがあったか判定する。
42      * @return 読み残したデータがあればtrue
43      * @throws IllegalStateException まだパースを試みていない。
44      */
45     public boolean hasMoreData() throws IllegalStateException{
46         if( ! this.loaded ) throw new IllegalStateException(ERR_TRYLOAD);
47         return this.hasMoreData;
48     }
49
50     /**
51      * ボーンモーション補間情報冗長部のチェックを行うか否か設定する。
52      * デフォルトではチェックを行わない。
53      * <p>※MMDVer7.30前後のVMD出力不具合を回避したい場合は、
54      * オフにするとパースに成功する場合がある。
55      * <p>※MMD Ver7.39x64以降はチェック回避必須。
56      * @param mode チェックさせたければtrue
57      */
58     public void setRedundantCheck(boolean mode){
59         this.redundantCheck = mode;
60         return;
61     }
62
63     /**
64      * VMDファイルの読み込みを行いモーション情報を返す。
65      * 1インスタンスにつき一度しかロードできない。
66      * @param source VMDファイル入力ソース
67      * @return モーション情報
68      * @throws IOException 入力エラー
69      * @throws MmdFormatException VMDファイルフォーマットの異常を検出
70      * @throws IllegalStateException このインスタンスで再度のロードを試みた。
71      */
72     public VmdMotion load(InputStream source)
73             throws IOException,
74                    MmdFormatException,
75                    IllegalStateException {
76         if(this.loaded) throw new IllegalStateException(ERR_LOADED);
77
78         VmdMotion motion = new VmdMotion();
79
80         VmdParser parser = new VmdParser(source);
81
82         parser.setRedundantCheck(this.redundantCheck);
83
84         BasicLoader basicBuilder       = new BasicLoader(motion);
85         CameraLoader cameraBuilder     = new CameraLoader(motion);
86         LightingLoader lightingBuilder = new LightingLoader(motion);
87         BoolLoader boolBuilder         = new BoolLoader(motion);
88
89         parser.setBasicHandler(basicBuilder);
90         parser.setCameraHandler(cameraBuilder);
91         parser.setLightingHandler(lightingBuilder);
92         parser.setBoolHandler(boolBuilder);
93
94         try{
95             parser.parseVmd();
96             this.hasMoreData = basicBuilder.hasMoreData();
97         }finally{
98             this.loaded = true;
99         }
100
101         return motion;
102     }
103
104 }