OSDN Git Service

ローカルスキーマ参照処理の共通化
[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
27     private VmdBasicHandler basicHandler  = VmdUnifiedHandler.EMPTY;
28
29     private boolean ignoreName = true;
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
50         return;
51     }
52
53
54     /**
55      * 入力ソースを返す。
56      * @return 入力ソース
57      */
58     public InputStream getSource(){
59         return this.source;
60     }
61
62     /**
63      * 基本情報通知用ハンドラを登録する。
64      * @param handler ハンドラ
65      */
66     public void setBasicHandler(VmdBasicHandler handler){
67         this.basicParser.setBasicHandler(handler);
68
69         if(handler == null){
70             this.basicHandler = VmdUnifiedHandler.EMPTY;
71         }else{
72             this.basicHandler = handler;
73         }
74
75         return;
76     }
77
78     /**
79      * カメラワーク情報通知用ハンドラを登録する。
80      * @param cameraHandler ハンドラ
81      */
82     public void setCameraHandler(VmdCameraHandler cameraHandler){
83         this.cameraParser.setCameraHandler(cameraHandler);
84         return;
85     }
86
87     /**
88      * ライティング情報通知用ハンドラを登録する。
89      * @param lightingHandler ハンドラ
90      */
91     public void setLightingHandler(VmdLightingHandler lightingHandler){
92         this.lightingParser.setLightingHandler(lightingHandler);
93         return;
94     }
95
96     /**
97      * カメラ・ライティングデータのパースを試みるか否かの判断で、
98      * 特殊モデル名判定を無視するか否か設定する。
99      * デフォルトではモデル名を無視。
100      * <p>※MMDVer7.30前後のVMD出力不具合を回避したい場合は、
101      * オフにするとパースに成功する場合がある。
102      * @param mode モデル名を無視するならtrue
103      */
104     public void setIgnoreName(boolean mode){
105         this.ignoreName = mode;
106         return;
107     }
108
109     /**
110      * ボーンモーション補間情報冗長部のチェックを行うか否か設定する。
111      * デフォルトではチェックを行わない。
112      * <p>※MMDVer7.30前後のVMD出力不具合を回避したい場合は、
113      * オフにするとパースに成功する場合がある。
114      * @param mode チェックさせたければtrue
115      */
116     public void setRedundantCheck(boolean mode){
117         this.redundantCheck = mode;
118         this.basicParser.setRedundantCheck(mode);
119         return;
120     }
121
122     /**
123      * VMDファイルのパースを開始する。
124      * @throws IOException IOエラー
125      * @throws MmdFormatException フォーマットエラー
126      */
127     public void parseVmd() throws IOException, MmdFormatException {
128         setIgnoreName(this.ignoreName);
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      * <p>モデル名がボーンモーション用と推測され、
144      * かつパーサがStrict-modeでない場合、
145      * カメラ、ライティングデータのパースは行われない。
146      * @throws IOException IOエラー
147      * @throws MmdFormatException フォーマットエラー
148      */
149     private void parseBody() throws IOException, MmdFormatException{
150         this.basicParser.parse();
151
152         if(this.basicParser.hasStageActName() || this.ignoreName){
153             this.cameraParser.parse();
154             this.lightingParser.parse();
155         }
156
157         return;
158     }
159
160 }