OSDN Git Service

ローカルスキーマ参照処理の共通化
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / 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.sourceforge.mikutoga.vmd.parser;
9
10 import java.io.IOException;
11 import java.io.InputStream;
12 import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
13
14 /**
15  * VMDモーションファイルのパーサ。
16  */
17 public class VmdParser {
18
19     private final InputStream source;
20
21     private final VmdBasicParser    basicParser;
22     private final VmdCameraParser   cameraParser;
23     private final VmdLightingParser lightingParser;
24
25     private VmdBasicHandler basicHandler  = VmdUnifiedHandler.EMPTY;
26     private boolean strictMode = true;
27
28
29     /**
30      * コンストラクタ。
31      * @param source 入力ソース
32      * @throws NullPointerException 引数がnull
33      */
34     public VmdParser(InputStream source) throws NullPointerException{
35         super();
36
37         if(source == null) throw new NullPointerException();
38         this.source = source;
39
40         this.basicParser    = new VmdBasicParser(source);
41         this.cameraParser   = new VmdCameraParser(source);
42         this.lightingParser = new VmdLightingParser(source);
43
44         return;
45     }
46
47
48     /**
49      * 入力ソースを返す。
50      * @return 入力ソース
51      */
52     public InputStream getSource(){
53         return this.source;
54     }
55
56     /**
57      * 基本情報通知用ハンドラを登録する。
58      * @param handler ハンドラ
59      */
60     public void setBasicHandler(VmdBasicHandler handler){
61         this.basicParser.setBasicHandler(handler);
62
63         if(handler == null){
64             this.basicHandler = VmdUnifiedHandler.EMPTY;
65         }else{
66             this.basicHandler = handler;
67         }
68
69         return;
70     }
71
72     /**
73      * カメラワーク情報通知用ハンドラを登録する。
74      * @param cameraHandler ハンドラ
75      */
76     public void setCameraHandler(VmdCameraHandler cameraHandler){
77         this.cameraParser.setCameraHandler(cameraHandler);
78         return;
79     }
80
81     /**
82      * ライティング情報通知用ハンドラを登録する。
83      * @param lightingHandler ハンドラ
84      */
85     public void setLightingHandler(VmdLightingHandler lightingHandler){
86         this.lightingParser.setLightingHandler(lightingHandler);
87         return;
88     }
89
90     /**
91      * 厳密なパース(Strict-mode)を行うか否か設定する。
92      * デフォルトではStrict-modeはオン。
93      * <p>Strict-mode下では、
94      * ボーンモーションの冗長な補間情報の一貫性チェックが行われ、
95      * モデル名がなんであろうとカメラ・ライティングデータのパースを試みる。
96      * <p>※MMDVer7.30前後のVMD出力不具合を回避したい場合は、
97      * Strict-modeをオフにするとパースに成功する場合がある。
98      * @param mode Strict-modeに設定したければtrue
99      */
100     public void setStrictMode(boolean mode){
101         this.strictMode = mode;
102         this.basicParser.setStrictMode(this.strictMode);
103         return;
104     }
105
106     /**
107      * VMDファイルのパースを開始する。
108      * @throws IOException IOエラー
109      * @throws MmdFormatException フォーマットエラー
110      */
111     public void parseVmd() throws IOException, MmdFormatException {
112         this.basicHandler.vmdParseStart();
113
114         parseBody();
115
116         boolean hasMoreData = this.lightingParser.hasMore();
117         this.basicHandler.vmdParseEnd(hasMoreData);
118
119         return;
120     }
121
122     /**
123      * VMDファイル本体のパースを開始する。
124      * <p>モデル名がボーンモーション用と推測され、
125      * かつパーサがStrict-modeでない場合、
126      * カメラ、ライティングデータのパースは行われない。
127      * @throws IOException IOエラー
128      * @throws MmdFormatException フォーマットエラー
129      */
130     private void parseBody() throws IOException, MmdFormatException{
131         this.basicParser.parse();
132
133         if(this.basicParser.hasStageActName() || this.strictMode){
134             this.cameraParser.parse();
135             this.lightingParser.parse();
136         }
137
138         return;
139     }
140
141 }