OSDN Git Service

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