OSDN Git Service

Merge release/v3.122.2
[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      *
110      * <p>※MMDVer7.30前後のVMD出力不具合を回避したい場合は、
111      * オフにするとパースに成功する場合がある。
112      *
113      * <p>※MMD Ver7.39x64以降はチェック回避必須。
114      *
115      * @param mode チェックさせたければtrue
116      */
117     public void setRedundantCheck(boolean mode){
118         this.redundantCheck = mode;
119         this.basicParser.setRedundantCheck(mode);
120         return;
121     }
122
123     /**
124      * VMDファイルのパースを開始する。
125      * @throws IOException IOエラー
126      * @throws MmdFormatException フォーマットエラー
127      */
128     public void parseVmd() throws IOException, MmdFormatException {
129         setRedundantCheck(this.redundantCheck);
130
131         this.basicHandler.vmdParseStart();
132
133         parseBody();
134
135         boolean hasMoreData = this.lightingParser.hasMore();
136         this.basicHandler.vmdParseEnd(hasMoreData);
137
138         return;
139     }
140
141     /**
142      * VMDファイル本体のパースを開始する。
143      * @throws IOException IOエラー
144      * @throws MmdFormatException フォーマットエラー
145      */
146     private void parseBody() throws IOException, MmdFormatException{
147         this.basicParser.parse();
148
149         if(this.cameraParser.hasMore()){
150             this.cameraParser.parse();
151             this.lightingParser.parse();
152         }
153
154         if(this.boolParser.hasMore()){
155             this.boolParser.parse();
156         }
157
158         return;
159     }
160
161 }