OSDN Git Service

Merge develop into pomconfig
[mikutoga/TogaGem.git] / src / main / java / jp / sfjp / mikutoga / vmd / parser / VmdParser.java
1 /*
2  * VMD file parser
3  *
4  * License : The MIT License
5  * Copyright(c) 2011 MikuToga Partners
6  */
7
8 package jp.sfjp.mikutoga.vmd.parser;
9
10 import java.io.IOException;
11 import java.io.InputStream;
12 import jp.sfjp.mikutoga.bin.parser.BinParser;
13 import jp.sfjp.mikutoga.bin.parser.CommonParser;
14 import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
15
16 /**
17  * VMDモーションファイルのパーサ。
18  */
19 public class VmdParser {
20
21     private final InputStream source;
22
23     private final VmdBasicParser    basicParser;
24     private final VmdCameraParser   cameraParser;
25     private final VmdLightingParser lightingParser;
26     private final VmdBoolParser     boolParser;
27
28     private VmdBasicHandler basicHandler  = VmdUnifiedHandler.EMPTY;
29
30     private boolean redundantCheck = false;
31
32
33     /**
34      * コンストラクタ。
35      * @param source 入力ソース
36      * @throws NullPointerException 引数がnull
37      */
38     public VmdParser(InputStream source) throws NullPointerException{
39         super();
40
41         if(source == null) throw new NullPointerException();
42         this.source = source;
43
44         BinParser parser = new CommonParser(this.source);
45
46         this.basicParser    = new VmdBasicParser(parser);
47         this.cameraParser   = new VmdCameraParser(parser);
48         this.lightingParser = new VmdLightingParser(parser);
49         this.boolParser     = new VmdBoolParser(parser);
50
51         return;
52     }
53
54
55     /**
56      * 入力ソースを返す。
57      * @return 入力ソース
58      */
59     public InputStream getSource(){
60         return this.source;
61     }
62
63     /**
64      * 基本情報通知用ハンドラを登録する。
65      * @param handler ハンドラ
66      */
67     public void setBasicHandler(VmdBasicHandler handler){
68         this.basicParser.setBasicHandler(handler);
69
70         if(handler == null){
71             this.basicHandler = VmdUnifiedHandler.EMPTY;
72         }else{
73             this.basicHandler = handler;
74         }
75
76         return;
77     }
78
79     /**
80      * カメラワーク情報通知用ハンドラを登録する。
81      * @param cameraHandler ハンドラ
82      */
83     public void setCameraHandler(VmdCameraHandler cameraHandler){
84         this.cameraParser.setCameraHandler(cameraHandler);
85         return;
86     }
87
88     /**
89      * ライティング情報通知用ハンドラを登録する。
90      * @param lightingHandler ハンドラ
91      */
92     public void setLightingHandler(VmdLightingHandler lightingHandler){
93         this.lightingParser.setLightingHandler(lightingHandler);
94         return;
95     }
96
97     /**
98      * ON/OFF情報通知用ハンドラを登録する。
99      * @param boolHandler ハンドラ
100      */
101     public void setBoolHandler(VmdBoolHandler boolHandler){
102         this.boolParser.setBoolHandler(boolHandler);
103         return;
104     }
105
106     /**
107      * ボーンモーション補間情報冗長部のチェックを行うか否か設定する。
108      * デフォルトではチェックを行わない。
109      * <p>※MMDVer7.30前後のVMD出力不具合を回避したい場合は、
110      * オフにするとパースに成功する場合がある。
111      * <p>※MMD Ver7.39x64以降はチェック回避必須。
112      * @param mode チェックさせたければtrue
113      */
114     public void setRedundantCheck(boolean mode){
115         this.redundantCheck = mode;
116         this.basicParser.setRedundantCheck(mode);
117         return;
118     }
119
120     /**
121      * VMDファイルのパースを開始する。
122      * @throws IOException IOエラー
123      * @throws MmdFormatException フォーマットエラー
124      */
125     public void parseVmd() throws IOException, MmdFormatException {
126         setRedundantCheck(this.redundantCheck);
127
128         this.basicHandler.vmdParseStart();
129
130         parseBody();
131
132         boolean hasMoreData = this.lightingParser.hasMore();
133         this.basicHandler.vmdParseEnd(hasMoreData);
134
135         return;
136     }
137
138     /**
139      * VMDファイル本体のパースを開始する。
140      * @throws IOException IOエラー
141      * @throws MmdFormatException フォーマットエラー
142      */
143     private void parseBody() throws IOException, MmdFormatException{
144         this.basicParser.parse();
145
146         if(this.cameraParser.hasMore()){
147             this.cameraParser.parse();
148             this.lightingParser.parse();
149         }
150
151         if(this.boolParser.hasMore()){
152             this.boolParser.parse();
153         }
154
155         return;
156     }
157
158 }