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;
26 private final VmdBoolParser boolParser;
28 private VmdBasicHandler basicHandler = VmdUnifiedHandler.EMPTY;
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);
49 this.boolParser = new VmdBoolParser(parser);
59 public InputStream getSource(){
67 public void setBasicHandler(VmdBasicHandler handler){
68 this.basicParser.setBasicHandler(handler);
71 this.basicHandler = VmdUnifiedHandler.EMPTY;
73 this.basicHandler = handler;
80 * カメラワーク情報通知用ハンドラを登録する。
81 * @param cameraHandler ハンドラ
83 public void setCameraHandler(VmdCameraHandler cameraHandler){
84 this.cameraParser.setCameraHandler(cameraHandler);
89 * ライティング情報通知用ハンドラを登録する。
90 * @param lightingHandler ハンドラ
92 public void setLightingHandler(VmdLightingHandler lightingHandler){
93 this.lightingParser.setLightingHandler(lightingHandler);
98 * ON/OFF情報通知用ハンドラを登録する。
99 * @param boolHandler ハンドラ
101 public void setBoolHandler(VmdBoolHandler boolHandler){
102 this.boolParser.setBoolHandler(boolHandler);
107 * ボーンモーション補間情報冗長部のチェックを行うか否か設定する。
109 * <p>※MMDVer7.30前後のVMD出力不具合を回避したい場合は、
110 * オフにするとパースに成功する場合がある。
111 * <p>※MMD Ver7.39x64以降はチェック回避必須。
112 * @param mode チェックさせたければtrue
114 public void setRedundantCheck(boolean mode){
115 this.redundantCheck = mode;
116 this.basicParser.setRedundantCheck(mode);
122 * @throws IOException IOエラー
123 * @throws MmdFormatException フォーマットエラー
125 public void parseVmd() throws IOException, MmdFormatException {
126 setRedundantCheck(this.redundantCheck);
128 this.basicHandler.vmdParseStart();
132 boolean hasMoreData = this.lightingParser.hasMore();
133 this.basicHandler.vmdParseEnd(hasMoreData);
139 * VMDファイル本体のパースを開始する。
140 * @throws IOException IOエラー
141 * @throws MmdFormatException フォーマットエラー
143 private void parseBody() throws IOException, MmdFormatException{
144 this.basicParser.parse();
146 if(this.cameraParser.hasMore()){
147 this.cameraParser.parse();
148 this.lightingParser.parse();
151 if(this.boolParser.hasMore()){
152 this.boolParser.parse();