4 * License : The MIT License
5 * Copyright(c) 2011 MikuToga Partners
8 package jp.sfjp.mikutoga.vmd.parser;
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;
19 public class VmdParser {
21 private final InputStream source;
23 private final VmdBasicParser basicParser;
24 private final VmdCameraParser cameraParser;
25 private final VmdLightingParser lightingParser;
27 private VmdBasicHandler basicHandler = VmdUnifiedHandler.EMPTY;
29 private boolean ignoreName = true;
30 private boolean redundantCheck = false;
36 * @throws NullPointerException 引数がnull
38 public VmdParser(InputStream source) throws NullPointerException{
41 if(source == null) throw new NullPointerException();
44 BinParser parser = new CommonParser(this.source);
46 this.basicParser = new VmdBasicParser(parser);
47 this.cameraParser = new VmdCameraParser(parser);
48 this.lightingParser = new VmdLightingParser(parser);
58 public InputStream getSource(){
66 public void setBasicHandler(VmdBasicHandler handler){
67 this.basicParser.setBasicHandler(handler);
70 this.basicHandler = VmdUnifiedHandler.EMPTY;
72 this.basicHandler = handler;
79 * カメラワーク情報通知用ハンドラを登録する。
80 * @param cameraHandler ハンドラ
82 public void setCameraHandler(VmdCameraHandler cameraHandler){
83 this.cameraParser.setCameraHandler(cameraHandler);
88 * ライティング情報通知用ハンドラを登録する。
89 * @param lightingHandler ハンドラ
91 public void setLightingHandler(VmdLightingHandler lightingHandler){
92 this.lightingParser.setLightingHandler(lightingHandler);
97 * カメラ・ライティングデータのパースを試みるか否かの判断で、
98 * 特殊モデル名判定を無視するか否か設定する。
100 * <p>※MMDVer7.30前後のVMD出力不具合を回避したい場合は、
101 * オフにするとパースに成功する場合がある。
102 * @param mode モデル名を無視するならtrue
104 public void setIgnoreName(boolean mode){
105 this.ignoreName = mode;
110 * ボーンモーション補間情報冗長部のチェックを行うか否か設定する。
112 * <p>※MMDVer7.30前後のVMD出力不具合を回避したい場合は、
113 * オフにするとパースに成功する場合がある。
114 * @param mode チェックさせたければtrue
116 public void setRedundantCheck(boolean mode){
117 this.redundantCheck = mode;
118 this.basicParser.setRedundantCheck(mode);
124 * @throws IOException IOエラー
125 * @throws MmdFormatException フォーマットエラー
127 public void parseVmd() throws IOException, MmdFormatException {
128 setIgnoreName(this.ignoreName);
129 setRedundantCheck(this.redundantCheck);
131 this.basicHandler.vmdParseStart();
135 boolean hasMoreData = this.lightingParser.hasMore();
136 this.basicHandler.vmdParseEnd(hasMoreData);
142 * VMDファイル本体のパースを開始する。
143 * <p>モデル名がボーンモーション用と推測され、
144 * かつパーサがStrict-modeでない場合、
145 * カメラ、ライティングデータのパースは行われない。
146 * @throws IOException IOエラー
147 * @throws MmdFormatException フォーマットエラー
149 private void parseBody() throws IOException, MmdFormatException{
150 this.basicParser.parse();
152 if(this.basicParser.hasStageActName() || this.ignoreName){
153 this.cameraParser.parse();
154 this.lightingParser.parse();