OSDN Git Service

6915fad6051cf1df43bc3bc7e116385b817a3c66
[mikutoga/TogaGem.git] / src / main / java / jp / sfjp / mikutoga / vmd / parser / VmdBasicHandler.java
1 /*
2  * VMD basic handler
3  *
4  * License : The MIT License
5  * Copyright(c) 2011 MikuToga Partners
6  */
7
8 package jp.sfjp.mikutoga.vmd.parser;
9
10 import jp.sfjp.mikutoga.bin.parser.LoopHandler;
11 import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
12 import jp.sfjp.mikutoga.bin.parser.ParseStage;
13
14 /**
15  * VMDモーションファイルの基本情報(ボーンモーション/モーフモーション)
16  * の通知用ハンドラ。
17  *
18  * <p>フレーム番号は相対的なものとなる。
19  * 一番若いモーションのフレーム番号が0となる模様。
20  *
21  * <p>位置情報の座標基準は左手系ワールド座標で表される。
22  *
23  * <p>モーション補間情報は三次ベジェ曲線により記述される。
24  * 三次ベジェ曲線は4つの制御点P0,P1,P2,P3により定義される。
25  * P0は(0,0)、P3は(127,127)で固定。
26  * P1,P2はP0,P3を対角線とする正方形の内部になければならない。
27  * 直線補間の場合、P1には(20,20)、P2には(107,107)が使われることが多い。
28  *
29  * <p>補間情報は直後のボーンモーション情報との差分に関するもの。
30  */
31 public interface VmdBasicHandler extends LoopHandler {
32
33     /** ボーンモーション抽出ループ識別子。 */
34     ParseStage BONEMOTION_LIST = new ParseStage();
35
36     /** モーフ抽出ループ識別子。 */
37     ParseStage MORPH_LIST = new ParseStage();
38
39
40     /**
41      * VMDファイルのパース処理開始の通知を受け取る。
42      * @throws MmdFormatException 不正フォーマットによる
43      * パース処理の中断をパーサに指示
44      */
45     void vmdParseStart()
46             throws MmdFormatException;
47
48     /**
49      * VMDファイルのパース処理終了の通知を受け取る。
50      * @param hasMoreData 入力ソースに
51      * まだ読み込まれていないデータがあればtrue
52      * @throws MmdFormatException 不正フォーマットによる
53      * パース処理の中断をパーサに指示
54      */
55     void vmdParseEnd(boolean hasMoreData)
56             throws MmdFormatException;
57
58     /**
59      * VMDファイルの固定長ヘッダを通知する。
60      * @param header ヘッダ情報
61      * @throws MmdFormatException 不正フォーマットによる
62      * パース処理の中断をパーサに指示
63      */
64     void vmdHeaderInfo(byte[] header)
65             throws MmdFormatException;
66
67
68     /**
69      * モーションの適用先モデル名に関する情報を通知する。
70      *
71      * <p>カメラやライティングなどの演出データには
72      * 特殊なモデル名が使われる。
73      *
74      * @param modelName モデル名
75      * @throws MmdFormatException 不正フォーマットによる
76      * パース処理の中断をパーサに指示
77      */
78     void vmdModelName(String modelName)
79             throws MmdFormatException;
80
81     /**
82      * ボーンモーションのボーン名及びキーフレーム番号に関する情報を通知する。
83      *
84      * <p>{@link #BONEMOTION_LIST}ループの構成要素。
85      *
86      * @param boneName ボーン名
87      * @param keyFrameNo キーフレーム番号
88      * @throws MmdFormatException 不正フォーマットによる
89      * パース処理の中断をパーサに指示
90      */
91     void vmdBoneMotion(String boneName, int keyFrameNo)
92             throws MmdFormatException;
93
94     /**
95      * ボーン移動モーション情報の通知を受け取る。
96      *
97      * <p>座標基準は親ボーンもしくはワールド座標。
98      *
99      * <p>{@link #BONEMOTION_LIST}ループの構成要素。
100      *
101      * @param xPos X座標
102      * @param yPos Y座標
103      * @param zPos Z座標
104      * @throws MmdFormatException 不正フォーマットによる
105      * パース処理の中断をパーサに指示
106      */
107     void vmdBonePosition(float xPos, float yPos, float zPos)
108             throws MmdFormatException;
109
110     /**
111      * ボーン回転モーション情報の通知を受け取る。
112      *
113      * <p>回転及び姿勢はクォータニオンによって記述される。
114      * MMDUI上のボーン数値入力YXZオイラー角と等価な回転。
115      *
116      * <p>座標基準は親ボーンもしくはワールド座標。
117      *
118      * <p>※ボーン種別によっては、無意味な情報。
119      *
120      * <p>{@link #BONEMOTION_LIST}ループの構成要素。
121      *
122      * @param qx クォータニオン虚部 X
123      * @param qy クォータニオン虚部 Y
124      * @param qz クォータニオン虚部 Z
125      * @param qw クォータニオン実部 W
126      * @throws MmdFormatException 不正フォーマットによる
127      * パース処理の中断をパーサに指示
128      */
129     void vmdBoneRotationQt(float qx, float qy, float qz, float qw)
130             throws MmdFormatException;
131
132     /**
133      * ボーンモーションX軸移動補間情報の通知を受け取る。
134      *
135      * <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
136      *
137      * <p>{@link #BONEMOTION_LIST}ループの構成要素。
138      *
139      * @param xP1x P1点のX座標
140      * @param xP1y P1点のY座標
141      * @param xP2x P2点のX座標
142      * @param xP2y P2点のY座標
143      * @throws MmdFormatException 不正フォーマットによる
144      * パース処理の中断をパーサに指示
145      */
146     void vmdBoneIntpltXpos(byte xP1x, byte xP1y, byte xP2x, byte xP2y)
147             throws MmdFormatException;
148
149     /**
150      * ボーンモーションY軸移動補間情報の通知を受け取る。
151      *
152      * <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
153      *
154      * <p>{@link #BONEMOTION_LIST}ループの構成要素。
155      *
156      * @param yP1x P1点のX座標
157      * @param yP1y P1点のY座標
158      * @param yP2x P2点のX座標
159      * @param yP2y P2点のY座標
160      * @throws MmdFormatException 不正フォーマットによる
161      * パース処理の中断をパーサに指示
162      */
163     void vmdBoneIntpltYpos(byte yP1x, byte yP1y, byte yP2x, byte yP2y)
164             throws MmdFormatException;
165
166     /**
167      * ボーンモーションZ軸移動補間情報の通知を受け取る。
168      *
169      * <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
170      *
171      * <p>{@link #BONEMOTION_LIST}ループの構成要素。
172      *
173      * @param zP1x P1点のX座標
174      * @param zP1y P1点のY座標
175      * @param zP2x P2点のX座標
176      * @param zP2y P2点のY座標
177      * @throws MmdFormatException 不正フォーマットによる
178      * パース処理の中断をパーサに指示
179      */
180     void vmdBoneIntpltZpos(byte zP1x, byte zP1y, byte zP2x, byte zP2y)
181             throws MmdFormatException;
182
183     /**
184      * ボーンモーション回転量補間情報の通知を受け取る。
185      *
186      * <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
187      *
188      * <p>{@link #BONEMOTION_LIST}ループの構成要素。
189      *
190      * <p>クォータニオン間のslerp処理に利用される。
191      *
192      * @param rP1x P1点のX座標
193      * @param rP1y P1点のY座標
194      * @param rP2x P2点のX座標
195      * @param rP2y P2点のY座標
196      * @throws MmdFormatException 不正フォーマットによる
197      * パース処理の中断をパーサに指示
198      */
199     void vmdBoneIntpltRot(byte rP1x, byte rP1y, byte rP2x, byte rP2y)
200             throws MmdFormatException;
201
202
203     /**
204      * モーフモーション情報の通知を受け取る。
205      *
206      * <p>{@link #MORPH_LIST}ループの構成要素。
207      *
208      * @param morphName モーフ名。特殊モーフ名「base」は無視してもよい?
209      * @param keyFrameNo フレーム番号
210      * @param flex モーフ変量。通常は0.0以上1.0以下。
211      * @throws MmdFormatException 不正フォーマットによる
212      * パース処理の中断をパーサに指示
213      */
214     void vmdMorphMotion(String morphName, int keyFrameNo, float flex)
215             throws MmdFormatException;
216
217 }