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有効無効)
21 * <p>MikuMikuDance Ver7.40以降でサポート
23 class VmdBoolParser extends ProxyParser {
25 private final TextDecoder decoderWin31j =
26 new TextDecoder(VmdBasicParser.CS_WIN31J);
28 private VmdBoolHandler handler = VmdUnifiedHandler.EMPTY;
33 * @param parser 委譲先パーサ
35 VmdBoolParser(BinParser parser){
37 this.decoderWin31j.setZeroChopMode(true);
43 * ON/OFF情報通知用ハンドラを登録する。
44 * @param boolHandler ハンドラ
46 void setBoolHandler(VmdBoolHandler boolHandler){
47 if(boolHandler == null){
48 this.handler = VmdUnifiedHandler.EMPTY;
50 this.handler = boolHandler;
58 * @throws IOException IOエラー
59 * @throws MmdFormatException フォーマットエラー
61 void parse() throws IOException, MmdFormatException {
62 if( ! hasMore() ) return;
71 * @throws IOException IOエラー
72 * @throws MmdFormatException フォーマットエラー
74 private void parseVmdModelSight()
75 throws IOException, MmdFormatException{
76 int modelSightNo = parseLeInt();
78 this.handler.loopStart(VmdBoolHandler.MODELSIGHT_LIST,
81 for(int ct = 0; ct < modelSightNo; ct++){
82 int keyFrameNo = parseLeInt();
83 boolean show = parseBoolean();
84 this.handler.vmdModelSight(show, keyFrameNo);
86 parseVmdIkSwitch(keyFrameNo);
88 this.handler.loopNext(VmdBoolHandler.MODELSIGHT_LIST);
91 this.handler.loopEnd(VmdBoolHandler.MODELSIGHT_LIST);
98 * @param keyFrameNo キーフレーム番号
99 * @throws IOException IOエラー
100 * @throws MmdFormatException フォーマットエラー
102 private void parseVmdIkSwitch(int keyFrameNo)
103 throws IOException, MmdFormatException{
104 int ikSwitchNo = parseLeInt();
106 this.handler.loopStart(VmdBoolHandler.IKSW_LIST, ikSwitchNo);
108 for(int ct = 0; ct < ikSwitchNo; ct++){
109 String boneName = parseString(this.decoderWin31j,
110 VmdConst.IKSWBONENAME_MAX );
111 boolean valid = parseBoolean();
112 this.handler.vmdIkSwitch(boneName, valid, keyFrameNo);
114 this.handler.loopNext(VmdBoolHandler.IKSW_LIST);
117 this.handler.loopEnd(VmdBoolHandler.IKSW_LIST);