2 * VMD boolean data parser
4 * License : The MIT License
5 * Copyright(c) 2013 MikuToga Partners
8 package jp.sfjp.mikutoga.vmd.parser;
10 import java.io.IOException;
11 import jp.sfjp.mikutoga.bin.parser.BinParser;
12 import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
13 import jp.sfjp.mikutoga.bin.parser.ProxyParser;
14 import jp.sfjp.mikutoga.bin.parser.TextDecoder;
15 import jp.sfjp.mikutoga.vmd.VmdConst;
18 * VMDモーションファイルの各種ON/OFF情報(モデル表示・IK有効無効)
20 * <p>MikuMikuDance Ver7.40以降でサポート
22 class VmdBoolParser extends ProxyParser {
24 private final TextDecoder decoderWin31j =
25 new TextDecoder(VmdBasicParser.CS_WIN31J);
27 private VmdBoolHandler handler = VmdUnifiedHandler.EMPTY;
32 * @param parser 委譲先パーサ
34 VmdBoolParser(BinParser parser){
36 this.decoderWin31j.setZeroChopMode(true);
42 * ON/OFF情報通知用ハンドラを登録する。
43 * @param boolHandler ハンドラ
45 void setBoolHandler(VmdBoolHandler boolHandler){
46 if(boolHandler == null){
47 this.handler = VmdUnifiedHandler.EMPTY;
49 this.handler = boolHandler;
57 * @throws IOException IOエラー
58 * @throws MmdFormatException フォーマットエラー
60 void parse() throws IOException, MmdFormatException {
61 if( ! hasMore() ) return;
70 * @throws IOException IOエラー
71 * @throws MmdFormatException フォーマットエラー
73 private void parseVmdModelSight()
74 throws IOException, MmdFormatException{
75 int modelSightNo = parseLeInt();
77 this.handler.loopStart(VmdBoolHandler.MODELSIGHT_LIST,
80 for(int ct = 0; ct < modelSightNo; ct++){
81 int keyFrameNo = parseLeInt();
82 boolean show = parseBoolean();
83 this.handler.vmdModelSight(show, keyFrameNo);
85 parseVmdIkSwitch(keyFrameNo);
87 this.handler.loopNext(VmdBoolHandler.MODELSIGHT_LIST);
90 this.handler.loopEnd(VmdBoolHandler.MODELSIGHT_LIST);
97 * @param keyFrameNo キーフレーム番号
98 * @throws IOException IOエラー
99 * @throws MmdFormatException フォーマットエラー
101 private void parseVmdIkSwitch(int keyFrameNo)
102 throws IOException, MmdFormatException{
103 int ikSwitchNo = parseLeInt();
105 this.handler.loopStart(VmdBoolHandler.IKSW_LIST, ikSwitchNo);
107 for(int ct = 0; ct < ikSwitchNo; ct++){
108 String boneName = parseString(this.decoderWin31j,
109 VmdConst.IKSWBONENAME_MAX );
110 boolean valid = parseBoolean();
111 this.handler.vmdIkSwitch(boneName, valid, keyFrameNo);
113 this.handler.loopNext(VmdBoolHandler.IKSW_LIST);
116 this.handler.loopEnd(VmdBoolHandler.IKSW_LIST);