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 jp.sourceforge.mikutoga.parser.MmdFormatException;
12 import jp.sourceforge.mikutoga.parser.MmdInputStream;
17 public class VmdParser {
19 private final MmdInputStream source;
21 private final VmdBasicParser basicParser;
22 private final VmdCameraParser cameraParser;
23 private final VmdLightingParser lightingParser;
25 private VmdBasicHandler basicHandler = null;
26 private boolean strictMode = true;
32 * @throws NullPointerException 引数がnull
34 public VmdParser(MmdInputStream 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 MmdInputStream getSource(){
60 public void setBasicHandler(VmdBasicHandler handler){
61 this.basicParser.setBasicHandler(handler);
62 this.basicHandler = handler;
67 * カメラワーク情報通知用ハンドラを登録する。
68 * @param cameraHandler ハンドラ
70 public void setCameraHandler(VmdCameraHandler cameraHandler){
71 this.cameraParser.setCameraHandler(cameraHandler);
76 * ライティング情報通知用ハンドラを登録する。
77 * @param lightingHandler ハンドラ
79 public void setLightingHandler(VmdLightingHandler lightingHandler){
80 this.lightingParser.setLightingHandler(lightingHandler);
85 * 厳密なパース(Strict-mode)を行うか否か設定する。
86 * デフォルトではStrict-modeはオン。
88 * ボーンモーションの冗長な補間情報の一貫性チェックが行われ、
89 * モデル名がなんであろうとカメラ・ライティングデータのパースを試みる。
90 * <p>※MMDVer7.30前後のVMD出力不具合を回避したい場合は、
91 * Strict-modeをオフにするとパースに成功する場合がある。
92 * @param mode Strict-modeに設定したければtrue
94 public void setStrictMode(boolean mode){
95 this.strictMode = mode;
96 this.basicParser.setStrictMode(this.strictMode);
102 * @throws IOException IOエラー
103 * @throws MmdFormatException フォーマットエラー
105 public void parseVmd() throws IOException, MmdFormatException {
106 if(this.basicHandler != null){
107 this.basicHandler.vmdParseStart();
112 boolean hasMoreData = this.source.hasMore();
113 if(this.basicHandler != null){
114 this.basicHandler.vmdParseEnd(hasMoreData);
121 * VMDファイル本体のパースを開始する。
122 * <p>モデル名がボーンモーション用と推測され、
123 * かつパーサがStrict-modeでない場合、
124 * カメラ、ライティングデータのパースは行われない。
125 * @throws IOException IOエラー
126 * @throws MmdFormatException フォーマットエラー
128 private void parseBody() throws IOException, MmdFormatException{
129 this.basicParser.parse();
131 if(this.basicParser.hasStageActName() || this.strictMode){
132 this.cameraParser.parse();
133 this.lightingParser.parse();