4 * License : The MIT License
5 * Copyright(c) 2011 MikuToga Partners
8 package jp.sourceforge.mikutoga.vmd.parser;
10 import java.io.IOException;
11 import java.io.InputStream;
12 import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
17 public class VmdParser {
19 private final InputStream source;
21 private final VmdBasicParser basicParser;
22 private final VmdCameraParser cameraParser;
23 private final VmdLightingParser lightingParser;
25 private VmdBasicHandler basicHandler = VmdUnifiedHandler.EMPTY;
26 private boolean strictMode = true;
32 * @throws NullPointerException 引数がnull
34 public VmdParser(InputStream source) throws NullPointerException{
37 if(source == null) throw new NullPointerException();
40 this.basicParser = new VmdBasicParser(source);
41 this.cameraParser = new VmdCameraParser(source);
42 this.lightingParser = new VmdLightingParser(source);
52 public InputStream getSource(){
60 public void setBasicHandler(VmdBasicHandler handler){
61 this.basicParser.setBasicHandler(handler);
64 this.basicHandler = VmdUnifiedHandler.EMPTY;
66 this.basicHandler = handler;
73 * カメラワーク情報通知用ハンドラを登録する。
74 * @param cameraHandler ハンドラ
76 public void setCameraHandler(VmdCameraHandler cameraHandler){
77 this.cameraParser.setCameraHandler(cameraHandler);
82 * ライティング情報通知用ハンドラを登録する。
83 * @param lightingHandler ハンドラ
85 public void setLightingHandler(VmdLightingHandler lightingHandler){
86 this.lightingParser.setLightingHandler(lightingHandler);
91 * 厳密なパース(Strict-mode)を行うか否か設定する。
92 * デフォルトではStrict-modeはオン。
94 * ボーンモーションの冗長な補間情報の一貫性チェックが行われ、
95 * モデル名がなんであろうとカメラ・ライティングデータのパースを試みる。
96 * <p>※MMDVer7.30前後のVMD出力不具合を回避したい場合は、
97 * Strict-modeをオフにするとパースに成功する場合がある。
98 * @param mode Strict-modeに設定したければtrue
100 public void setStrictMode(boolean mode){
101 this.strictMode = mode;
102 this.basicParser.setStrictMode(this.strictMode);
108 * @throws IOException IOエラー
109 * @throws MmdFormatException フォーマットエラー
111 public void parseVmd() throws IOException, MmdFormatException {
112 this.basicHandler.vmdParseStart();
116 boolean hasMoreData = this.lightingParser.hasMore();
117 this.basicHandler.vmdParseEnd(hasMoreData);
123 * VMDファイル本体のパースを開始する。
124 * <p>モデル名がボーンモーション用と推測され、
125 * かつパーサがStrict-modeでない場合、
126 * カメラ、ライティングデータのパースは行われない。
127 * @throws IOException IOエラー
128 * @throws MmdFormatException フォーマットエラー
130 private void parseBody() throws IOException, MmdFormatException{
131 this.basicParser.parse();
133 if(this.basicParser.hasStageActName() || this.strictMode){
134 this.cameraParser.parse();
135 this.lightingParser.parse();