<suppress files="" checks="ImportControl" />
<!-- Javadoc Comments -->
- <suppress files="" checks="JavadocParagraph" />
- <suppress files="" checks="JavadocTagContinuationIndentation" />
<suppress files="" checks="SummaryJavadocCheck" />
<!-- Miscellaneous -->
/**
* バイナリデータの出力を行う汎用エクスポーター。
+ *
* <p>基本的にリトルエンディアン形式で出力される。
*/
public class BinaryExporter implements Closeable, Flushable{
/**
* 詰め物パディングを出力する。
+ *
* @param filler byte型配列によるパディングデータの並び。
- * <p>指定パディング長より長い部分は出力されない。
- * 指定パディング長に満たない場合は最後の要素が繰り返し出力される。
- * <p>配列長が0の場合は何も出力されない。
+ *
+ * <p>指定パディング長より長い部分は出力されない。
+ * 指定パディング長に満たない場合は最後の要素が繰り返し出力される。
+ *
+ * <p>配列長が0の場合は何も出力されない。
+ *
* @param fillerLength パディング長。
- * <p>パディング長が0以下の場合は何も出力されない。
+ *
+ * <p>パディング長が0以下の場合は何も出力されない。
+ *
* @return this
* @throws IOException 出力エラー
*/
* @return this
* @throws IOException 出力エラー
* @throws IllegalTextExportException テキスト出力エラー。
- * 出力が固定長を超えようとした、
- * もしくは不正なエンコードが行われたかのいずれか。
+ * 出力が固定長を超えようとした、
+ * もしくは不正なエンコードが行われたかのいずれか。
*/
public BinaryExporter dumpFixedW31j(CharSequence text,
int fixedLength,
* @return エンコードバイト列長
* @throws IOException 出力エラー
* @throws IllegalTextExportException テキスト出力エラー。
- * 出力が固定長を超えようとした、
- * もしくは不正なエンコードが行われたかのいずれか。
+ * 出力が固定長を超えようとした、
+ * もしくは不正なエンコードが行われたかのいずれか。
*/
public int dumpHollerithUtf16LE(CharSequence text)
throws IOException, IllegalTextExportException{
/**
* バイナリファイルへの不正なテキスト情報の出力が検出された場合の例外。
- * <p>
- * {@link java.nio.charset.CharacterCodingException}に由来する異常系を
+ *
+ * <p>{@link java.nio.charset.CharacterCodingException}に由来する異常系を
* {@link java.io.IOException}から分離するために設計された。
- * <p>
- * 異常系の発生した理由としては
+ *
+ * <p>異常系の発生した理由としては
* <ul>
* <li>所定のフォーマットに対し文字列が長すぎる。
* <li>文字エンコーディングできない文字が含まれている
/**
* 入力バッファに文字を埋める。
+ *
* <p>入力バッファが一杯になるか
* 入力文字列がなくなるまでバッファが埋められる。
*/
/**
* 与えられた文字列のエンコード結果を格納先バイトストリームへ格納する。
+ *
* <p>エンコード結果は格納先ストリームに追記される。
+ *
* @param text 文字列
* @param bos 格納先ストリーム
* @return エンコードしたバイト数。
/**
* バイナリパーサの共通インタフェース。
+ *
* <p>バイト列、各種プリミティブ型値およびエンコードされた文字列を読み込む。
+ *
* <p>long,double、およびビッグエンディアン形式のデータは未サポート。
*/
public interface BinParser {
/**
* 入力ソースの読み込み位置を返す。
+ *
* @return 入力ソースの読み込み位置。単位はbyte。
*/
long getPosition();
/**
* 入力ソースにまだデータが残っているか判定する。
+ *
* @return まだ読み込んでいないデータが残っていればtrue
* @throws IOException IOエラー
*/
/**
* 入力ソースを読み飛ばす。
+ *
* @param skipLength 読み飛ばすバイト数。
* @throws IOException IOエラー
* @throws MmdEofException 読み飛ばす途中でストリーム終端に達した。
/**
* byte配列を読み込む。
+ *
* @param dst 格納先配列
* @param off 読み込み開始オフセット
* @param length 読み込みバイト数
/**
* byte配列を読み込む。
+ *
* <p>配列要素全ての読み込みが試みられる。
+ *
* @param dst 格納先配列
* @throws NullPointerException 配列がnull
* @throws IOException IOエラー
/**
* byte値を読み込む。
+ *
* @return 読み込んだbyte値
* @throws IOException IOエラー
* @throws MmdEofException 読み込む途中でストリーム終端に達した。
/**
* 符号無し値としてbyte値を読み込み、int型に変換して返す。
+ *
* <p>符号は拡張されない。(0xffは0x000000ffとなる)
+ *
* @return 読み込まれた値のint値
* @throws IOException IOエラー
* @throws MmdEofException 読み込む途中でストリーム終端に達した。
/**
* byte値を読み込み、boolean型に変換して返す。
+ *
* <p>0x00は偽、それ以外は真と解釈される。
+ *
* @return 読み込まれた値のboolean値
* @throws IOException IOエラー
* @throws MmdEofException 読み込む途中でストリーム終端に達した。
/**
* short値を読み込む。
+ *
* <p>short値はリトルエンディアンで格納されていると仮定される。
+ *
* @return 読み込んだshort値
* @throws IOException IOエラー
* @throws MmdEofException 読み込む途中でストリーム終端に達した。
/**
* 符号無し値としてshort値を読み込み、int型に変換して返す。
+ *
* <p>符号は拡張されない。(0xffffは0x0000ffffとなる)
+ *
* <p>short値はリトルエンディアンで格納されていると仮定される。
+ *
* @return 読み込まれた値のint値
* @throws IOException IOエラー
* @throws MmdEofException 読み込む途中でストリーム終端に達した。
/**
* int値を読み込む。
+ *
* <p>int値はリトルエンディアンで格納されていると仮定される。
+ *
* @return 読み込んだint値
* @throws IOException IOエラー
* @throws MmdEofException 読み込む途中でストリーム終端に達した。
/**
* float値を読み込む。
+ *
* <p>float値はリトルエンディアンで格納されていると仮定される。
+ *
* @return 読み込んだfloat値
* @throws IOException IOエラー
* @throws MmdEofException 読み込む途中でストリーム終端に達した。
private final PushbackInputStream is;
private final byte[] readBuffer;
-// private final ByteBuffer beBuf;
+ // private final ByteBuffer beBuf;
private final ByteBuffer leBuf;
private long position = 0L;
this.readBuffer = new byte[BYTES_PRIM];
-// this.beBuf = ByteBuffer.wrap(this.readBuffer);
+ // this.beBuf = ByteBuffer.wrap(this.readBuffer);
this.leBuf = ByteBuffer.wrap(this.readBuffer);
-// this.beBuf.order(ByteOrder.BIG_ENDIAN);
+ // this.beBuf.order(ByteOrder.BIG_ENDIAN);
this.leBuf.order(ByteOrder.LITTLE_ENDIAN);
return;
/**
* バイナリファイル中ループ構造の通知用ハンドラ。
+ *
* <p>ステージ指定により、多重ネストループをもサポートする。
*/
public interface LoopHandler {
/**
* ループ構造開始の通知を受け取る。
+ *
* <p>0回ループの場合も含め一度呼ばれる。
+ *
* @param stage ループ種別
* @param loops ループ予定回数。未知の場合は負の値。
* @throws MmdFormatException 不正フォーマットによる
/**
* ループ構造の1イテレーション終了の通知を受け取る。
+ *
* <p>1度しか回らないループでも呼ばれる。
* 0回ループでは決して呼ばれない。
+ *
* @param stage ループ種別
* @throws MmdFormatException 不正フォーマットによる
* パース処理の中断をパーサに指示
/**
* ループ構造終了の通知を受け取る。
+ *
* <p>0回ループの場合も含め一度呼ばれる。
+ *
* @param stage ループ種別
* @throws MmdFormatException 不正フォーマットによる
* パース処理の中断をパーサに指示
/**
* MMD関連ファイルのパース異常系。
+ *
* <p>必要に応じて、パースに失敗した位置を保持する。
*/
@SuppressWarnings("serial")
/**
* パース処理の進行ステージ種別を表す。
+ *
* <p>ループ構造の識別に用いられる。
+ *
* <p>enum型と異なり、実行時での要素の追加が可能。
*/
public class ParseStage {
/**
* 委譲パーサ。
+ *
* <p>別のパーサにパース処理を委譲する。
*/
public class ProxyParser implements BinParser{
/**
* 文字デコーダー。
+ *
* <p>あらかじめバイト長が既知であるバイトバッファを読み取り、
* 文字列へのデコード結果を返す。
+ *
* <p>デコード対象のバイト列が全てメモリ上に展開される必要があるので、
* 巨大なテキストのデコードには不適当。
+ *
* <p>入力バイト値0x00以降をデコード処理の対象から外す
* 「ゼロチョップモード」を備える。
* デフォルトではゼロチョップモードはオフ。
/**
* 指定されたバイト長のデコードに必要な出力バッファを用意する。
+ *
* <p>既存バッファで足りなければ新たに確保し直す。
+ *
* @param byteLength 入力バイト長
* @return 出力バッファ長。(キャラクタ単位)
*/
/**
* MMD用各種バイナリファイルパーサ共通ライブラリ。
- * <p>
- * PMDモデルファイルやVMDモーションファイルなどの個別のパーサは
+ *
+ * <p>PMDモデルファイルやVMDモーションファイルなどの個別のパーサは
* 別パッケージにより提供される。
*/
/**
* 何もしないインタフェース実装のインスタンスを生成する。
+ *
* <p>インタフェースの各メソッド戻り値はvoidでなければならない。
+ *
* @param types インタフェース群
* @return インタフェースを実装したインスタンス。
*/
/**
* プライマリ文字列を返す。
+ *
* <p>見つからなければグローバル文字列を返す。
* それでも見つからなければ長さ0の空文字列を返す。
+ *
* <p>※決してnullは返さない。
+ *
* @return 文字列
*/
public String getText(){
/**
* 実行環境のデフォルトロケールに応じた文字列を返す。
+ *
* <p>見つからなければグローバル文字列、プライマリ文字列の順に返す。
* それでも見つからなければ適当な言語コードの文字列を返す。
* それでも見つからなければ長さ0の空文字列を返す。
+ *
* <p>デフォルトロケールの確認はその都度行われる。
+ *
* <p>※決してnullは返さない。
+ *
* @return 文字列
*/
public String getLocalizedText(){
/**
* YXZオイラー角。
* 三次元空間での方向及び姿勢を定義する。
+ *
* <p>回転量はラジアンで表される。
+ *
* <p>※XYZオイラー角ではない。
*/
public strictfp class EulerYXZ {
/**
* コンストラクタ。
+ *
* <p>三軸とも回転量0の状態になる。
*/
public EulerYXZ(){
/**
* コンストラクタ。
+ *
* @param xRot X軸回転量。(ラジアン)
* @param yRot Y軸回転量。(ラジアン)
* @param zRot Z軸回転量。(ラジアン)
/**
* X軸回転量を返す。
+ *
* @return X軸回転量を返す。(ラジアン)
*/
public double getXRot(){
/**
* Y軸回転量を返す。
+ *
* @return Y軸回転量を返す。(ラジアン)
*/
public double getYRot(){
/**
* Z軸回転量を返す。
+ *
* @return Z軸回転量を返す。(ラジアン)
*/
public double getZRot(){
/**
* X軸回転量を設定する。
+ *
* @param xRotArg X軸回転量。(ラジアン)
*/
public void setXRot(double xRotArg){
/**
* Y軸回転量を設定する。
+ *
* @param yRotArg Y軸回転量。(ラジアン)
*/
public void setYRot(double yRotArg){
/**
* Z軸回転量を設定する。
+ *
* @param zRotArg Z軸回転量。(ラジアン)
*/
public void setZRot(double zRotArg){
/**
* 三軸の回転量を設定する。
+ *
* @param xRotArg X軸回転量。(ラジアン)
* @param yRotArg Y軸回転量。(ラジアン)
* @param zRotArg Z軸回転量。(ラジアン)
/**
* パラメータ情報の文字列化。
+ *
* @param x x値
* @param y y値
* @param z z値
/**
* 二次元空間座標及び変量を表す。
+ *
* <p>直交座標を二つの倍精度値で表す。
+ *
* <p>主な用途はUVマッピングなど。
*/
public strictfp class MkPos2D {
/**
* コンストラクタ。
+ *
* @param xPosArg X座標
* @param yPosArg Y座標
*/
/**
* X座標を設定する。
+ *
* @param xPosArg X座標
*/
public void setXpos(double xPosArg){
/**
* X座標を返す。
+ *
* @return X座標
*/
public double getXpos(){
/**
* Y座標を設定する。
+ *
* @param yPosArg Y座標
*/
public void setYpos(double yPosArg){
/**
* Y座標を返す。
+ *
* @return Y座標
*/
public double getYpos(){
/**
* 座標を設定する。
+ *
* @param xPosArg X軸座標
* @param yPosArg Y軸座標
*/
/**
* この点が原点(0,0)か否か判定する。
+ *
* @return 原点ならtrue
*/
public boolean isOriginPoint(){
/**
* 三次元位置情報。
+ *
* <p>直交座標を三つの倍精度値で表す。
+ *
* <p>具体的にはボーン位置やカメラターゲット位置など。
*/
public strictfp class MkPos3D {
/**
* コンストラクタ。
+ *
* @param xPosArg X軸座標
* @param yPosArg Y軸座標
* @param zPosArg Z軸座標
/**
* X軸座標を返す。
+ *
* @return X軸座標
*/
public double getXpos() {
/**
* Y軸座標を返す。
+ *
* @return Y軸座標
*/
public double getYpos() {
/**
* Z軸座標を返す。
+ *
* @return Z軸座標
*/
public double getZpos() {
/**
* X軸座標を設定する。
+ *
* @param xPosArg X軸座標
*/
public void setXpos(double xPosArg){
/**
* Y軸座標を設定する。
+ *
* @param yPosArg Y軸座標
*/
public void setYpos(double yPosArg){
/**
* Z軸座標を設定する。
+ *
* @param zPosArg Z軸座標
*/
public void setZpos(double zPosArg){
/**
* 座標を設定する。
+ *
* @param xPosArg X軸座標
* @param yPosArg Y軸座標
* @param zPosArg Z軸座標
/**
* この点が原点(0,0,0)か否か判定する。
+ *
* @return 原点ならtrue
*/
public boolean isOriginPoint(){
/**
* クォータニオンによる回転表現。
+ *
* <p>虚部q1,q2,q3と実部qwから構成される。
*/
public strictfp class MkQuat {
/**
* コンストラクタ。
+ *
* <p>虚部が全て0.0、実部が1.0となる。
*/
public MkQuat(){
/**
* コンストラクタ。
+ *
* @param q コピー元クォータニオン
*/
public MkQuat(MkQuat q){
/**
* コンストラクタ。
+ *
* @param q1 虚部1
* @param q2 虚部2
* @param q3 虚部3
/**
* クォータニオン積を求め格納する。
+ *
* <p>クォータニオン積では交換則が成り立たない。
+ *
* <p>引数は同一インスタンスを含んでもよい。
+ *
* @param qA 積前項
* @param qB 積後項
* @param result 積の格納先
/**
* 共役(共軛)クォータニオンを求め格納する。
+ *
* <p>引数は同一インスタンスでもよい。
+ *
* @param q クォータニオン
* @param result 格納先
*/
/**
* 単位クォータニオンを求め格納する。
+ *
* <p>引数は同一インスタンスでもよい。
+ *
* @param q クォータニオン
* @param result 格納先
*/
/**
* 逆元クォータニオンを求め格納する。
+ *
* <p>対象クォータニオンの絶対値が小さい場合、
* 無限大が虚部実部に入る可能性がある。
+ *
* <p>引数は同一インスタンスでもよい。
+ *
* @param q クォータニオン
* @param result 格納先
*/
/**
* 位置情報を読み込む。
+ *
* <p>虚部q1,q2,q3にX,Y,Z軸の変量が入る。
+ *
* <p>実部には0が入る。
+ *
* @param xPos X位置
* @param yPos Y位置
* @param zPos Z位置
/**
* 位置情報を読み込む。
+ *
* <p>虚部q1,q2,q3にX,Y,Z軸の変量が入る。
+ *
* <p>実部には0が入る。
+ *
* @param pos 位置情報
*/
public void setPos3D(MkPos3D pos){
/**
* YXZオイラー角を読み込む。
+ *
* <p>Y軸回転、X軸回転、Z軸回転の順に
* 個別回転クォータニオンの積をとったものと等しい。
+ *
* @param xRot X軸回転量(ラジアン)。第2軸
* @param yRot Y軸回転量(ラジアン)。第1軸
* @param zRot Z軸回転量(ラジアン)。第3軸
/**
* YXZオイラー角を読み込む。
+ *
* <p>Y軸回転、X軸回転、Z軸回転の順に
* 個別回転クォータニオンの積をとったものと等しい。
+ *
* @param rot YXZオイラー角
*/
public void setEulerYXZ(EulerYXZ rot){
/**
* クォータニオンをYXZオイラー角へと変換する。
+ *
* <p>ジンバルロック時のYZ配分が指定可能。
+ *
* @param result YXZオイラー角
* @param oldY ジンバルロック時(オイラー角Xが直角etc.)
- * に使われるY軸回転量
+ * に使われるY軸回転量
*/
public void toEulerYXZ(EulerYXZ result, double oldY){
double qx = this.q1;
double m11 = 1.0 - 2.0 * (qx2 + qz2);
double m12 = 2.0 * (qyz - qwx);
-// double m20 = 2.0 * (qxz - qwy);
-// double m21 = 2.0 * (qwx + qyz);
+ // double m20 = 2.0 * (qxz - qwy);
+ // double m21 = 2.0 * (qwx + qyz);
double m22 = 1.0 - 2.0 * (qx2 + qy2);
double resultX;
double rprrQ1;
double rprrQ2;
double rprrQ3;
-// double rprrQW;
rprrQ1 = rpQ2 * rrQ3 - rpQ3 * rrQ2 + rpQW * rrQ1 + rpQ1 * rrQW;
rprrQ2 = rpQ3 * rrQ1 - rpQ1 * rrQ3 + rpQW * rrQ2 + rpQ2 * rrQW;
rprrQ3 = rpQ1 * rrQ2 - rpQ2 * rrQ1 + rpQW * rrQ3 + rpQ3 * rrQW;
-// rprrQW = rpQW * rrQW - rpQ1 * rrQ1 - rpQ2 * rrQ2 - rpQ3 * rrQ3;
-// assert rprrQW == 0.0;
+ // double rprrQW;
+ // rprrQW = rpQW * rrQW - rpQ1 * rrQ1 - rpQ2 * rrQ2 - rpQ3 * rrQ3;
+ // assert rprrQW == 0.0;
result.setXpos(rprrQ1);
result.setYpos(rprrQ2);
/**
* MMDにおける数学的な各種概念。
+ *
* <p>基本的には左手系直交座標のユークリッド三次元空間を基盤とする。
+ *
* <p>javax.vecmathの代替品。
*/
/**
* ボーン最大数。
* (Id : 0 - 0xfffe)
+ *
* <p>MMDがいくつまで受け入れるかはまた別の話だよ。
*/
public static final int MAX_BONE = 65535;
/**
* シェーディング情報の各種ユーティリティ。
+ *
* <p>※ スフィアマップファイルの中身はBMP(DIB)形式。
+ *
* <p><a href="http://en.wikipedia.org/wiki/BMP_file_format">
* BMP file format </a>
*/
/**
* スフィアマップファイル名か否か判定する。
+ *
* <p>拡張子が「.sph」(乗算)もしくは「.spa」(加算)なら
* スフィアマップファイル名と判定する。
+ *
* @param fname ファイル名
* @return スフィアマップファイルならtrue
*/
/**
* シェーディング用ファイル情報文字列から
* テクスチャファイル名とスフィアマップファイル名を分離する。
+ *
* <p>2つのファイル名は単一の「*」で区切られ、
* 前部がテクスチャファイル名、後部がスフィアマップファイル名となる。
* 「*」がなく末尾が「.sph」か「.spa」なら
* スフィアマップファイル名のみ、
* 末尾がどちらでもなければテクスチャファイル名のみとなる。
+ *
* @param shadingFile シェーディング用ファイル情報
* @return [0]:テクスチャファイル名 [1]:スフィアマップファイル名。
- * 該当ファイル名が無い場合は空文字列。
+ * 該当ファイル名が無い場合は空文字列。
*/
public static String[] splitShadingFileInfo(String shadingFile) {
String[] result;
/**
* ボーン定義情報の通知を受け取る。
+ *
* <p>{@link #BONE_LIST}ループの構成要素。
+ *
* @param boneName ボーン名
* @param boneKind ボーン種別。
* <ul>
/**
* ボーン間接続情報の通知を受け取る。
+ *
* <p>{@link #BONE_LIST}ループの構成要素。
+ *
* @param parentId 親(前)ボーンID。無い場合は0xffff。
* @param tailId 子(次)ボーンID。末端の場合は0。
* 捩りボーンの場合は軸方向のボーンID、
/**
* ボーン位置情報の通知を受け取る。
+ *
* <p>{@link #BONE_LIST}ループの構成要素。
+ *
* @param xPos X座標
* @param yPos Y座標
* @param zPos Z座標
/**
* IKボーン情報の通知を受け取る。
+ *
* <p>{@link #IK_LIST}ループの構成要素。
+ *
* @param boneId IKボーンID
* @param targetId IKボーンが最初に接続するIK接続先ボーンID
* @param depth 再帰演算の深さ
/**
* IKチェイン要素の通知を受け取る。
+ *
* <p>{@link #IK_LIST}ループの下位{@link #IKCHAIN_LIST}ループの構成要素。
+ *
* @param childId IK影響下ボーンID
* @throws MmdFormatException 不正フォーマットによる
* パース処理の中断をパーサに指示
/**
* ボーングループ名定義の通知を受け取る。
+ *
* <p>{@link #BONEGROUP_LIST}ループの構成要素。
+ *
* @param groupName ボーングループ名。末尾のLF(0x0a)は削除される。
* @throws MmdFormatException 不正フォーマットによる
* パース処理の中断をパーサに指示
/**
* ボーングループ内訳の通知を受け取る。
+ *
* <p>{@link #GROUPEDBONE_LIST}ループの構成要素。
+ *
* @param boneId グループに所属するボーンのID
* @param groupId ボーンが所属するボーングループIDに1を足した数
* @throws MmdFormatException 不正フォーマットによる
/**
* 英語ボーン名の通知を受け取る。
+ *
* <p>{@link #ENGBONE_LIST}ループの構成要素
+ *
* @param boneName 英語ボーン名
* @throws MmdFormatException 不正フォーマットによる
* パース処理の中断をパーサに指示
/**
* 英語モーフ名の通知を受け取る。
* 特殊モーフ名「base」に対応する英語名は通知されない。
+ *
* <p>{@link #ENGMORPH_LIST}ループの構成要素
+ *
* @param morphName 英語モーフ名
* @throws MmdFormatException 不正フォーマットによる
* パース処理の中断をパーサに指示
/**
* 英語ボーングループ名の通知を受け取る。
+ *
* <p>{@link #ENGBONEGROUP_LIST}ループの構成要素
+ *
* @param groupName 英語ボーングループ名
* @throws MmdFormatException 不正フォーマットによる
* パース処理の中断をパーサに指示
/**
* ジョイント名の通知を受け取る。
+ *
* <p>{@link #JOINT_LIST}ループの構成要素。
+ *
* @param jointName ジョイント名
* @throws MmdFormatException 不正フォーマットによる
* パース処理の中断をパーサに指示。
/**
* ジョイントが繋ぐ接続剛体IDの通知を受け取る。
+ *
* <p>{@link #JOINT_LIST}ループの構成要素。
+ *
* @param rigidIdA 接続剛体AのID
* @param rigidIdB 接続剛体BのID
* @throws MmdFormatException 不正フォーマットによる
/**
* ジョイント位置の通知を受け取る。
+ *
* <p>{@link #JOINT_LIST}ループの構成要素。
+ *
* @param posX X座標
* @param posY Y座標
* @param posZ Z座標
/**
* ジョイント回転姿勢の通知を受け取る。
+ *
* <p>{@link #JOINT_LIST}ループの構成要素。
+ *
* @param radX X軸回転量(radian)
* @param radY Y軸回転量(radian)
* @param radZ Z軸回転量(radian)
/**
* ジョイント移動制限の通知を受け取る。
+ *
* <p>{@link #JOINT_LIST}ループの構成要素。
+ *
* <p>※ [制限端 その1 <= その2] 条件を満たす必要はあるか?
+ *
* @param posXlim1 X座標制限端その1
* @param posXlim2 X座標制限端その2
* @param posYlim1 Y座標制限端その1
/**
* ジョイント回転制限の通知を受け取る。
+ *
* <p>{@link #JOINT_LIST}ループの構成要素。
+ *
* <p>※ [制限端 その1 <= その2] 条件を満たす必要はあるか?
+ *
* @param radXlim1 X軸制限端その1(radian)
* @param radXlim2 X軸制限端その2(radian)
* @param radYlim1 Y軸制限端その1(radian)
/**
* ジョイントのばね移動情報の通知を受け取る。
+ *
* <p>{@link #JOINT_LIST}ループの構成要素。
+ *
* @param elasticPosX X座標
* @param elasticPosY Y座標
* @param elasticPosZ Z座標
/**
* ジョイントのばね回転情報の通知を受け取る。
+ *
* <p>{@link #JOINT_LIST}ループの構成要素。
+ *
* @param elasticDegX X軸変量(degree)
* @param elasticDegY Y軸変量(degree)
* @param elasticDegZ Z軸変量(degree)
/**
* 材質の拡散光成分の通知を受け取る。
+ *
* <p>{@link #MATERIAL_LIST}ループの構成要素。
+ *
* @param red 0.0~1.0の範囲の赤成分
* @param green 0.0~1.0の範囲の緑成分
* @param blue 0.0~1.0の範囲の青成分
* @param alpha 0.0(透明)~1.0(不透明)のアルファ値。
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void pmdMaterialDiffuse(float red, float green, float blue,
float alpha )
/**
* 材質の反射光成分の通知を受け取る。
+ *
* <p>{@link #MATERIAL_LIST}ループの構成要素。
+ *
* @param red 0.0~1.0の範囲の赤成分
* @param green 0.0~1.0の範囲の緑成分
* @param blue 0.0~1.0の範囲の青成分
* @param shininess 光沢強度(1~15ぐらい)
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void pmdMaterialSpecular(float red, float green, float blue,
float shininess)
/**
* 材質の環境色成分の通知を受け取る。
+ *
* <p>{@link #MATERIAL_LIST}ループの構成要素。
+ *
* @param red 0.0~1.0の範囲の赤成分
* @param green 0.0~1.0の範囲の緑成分
* @param blue 0.0~1.0の範囲の青成分
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void pmdMaterialAmbient(float red, float green, float blue)
throws MmdFormatException;
/**
* シェーディング情報の通知を受け取る。
+ *
* <p>{@link #MATERIAL_LIST}ループの構成要素。
+ *
* @param toonIdx トゥーンファイル番号。
- * 0ならtoon01.bmp。9ならtoon10.bmp。0xffならtoon0.bmp。
+ * 0ならtoon01.bmp。9ならtoon10.bmp。0xffならtoon0.bmp。
* @param textureFile テクスチャファイル名。
- * 無ければ空文字。
+ * 無ければ空文字。
* @param sphereFile スフィアマップファイル名。
- * 無ければ空文字。
+ * 無ければ空文字。
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void pmdMaterialShading(int toonIdx,
String textureFile, String sphereFile )
/**
* 材質情報の通知を受け取る。
+ *
* <p>{@link #MATERIAL_LIST}ループの構成要素。
+ *
* @param hasEdge エッジを表示するならtrue
* @param vertexNum 面頂点数。
- * 3の倍数のはず。
- * 3で割ると、材質に属する面の数を表す。
- * <p>通算した面数を面情報通知順と突き合わせることにより、
- * 材質に属する面の集合を得ることが可能。
+ * 3の倍数のはず。
+ * 3で割ると、材質に属する面の数を表す。
+ *
+ * <p>通算した面数を面情報通知順と突き合わせることにより、
+ * 材質に属する面の集合を得ることが可能。
+ *
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
* @see PmdShapeHandler#pmdSurfaceTriangle(int, int, int)
*/
void pmdMaterialInfo(boolean hasEdge, int vertexNum)
/**
* モーフ情報の通知を受け取る。
+ *
* <p>{@link #MORPH_LIST}ループの構成要素
+ *
* @param morphName モーフ名
* @param morphType モーフ種別。
* <ul>
/**
* モーフ形状の通知を受け取る。
+ *
* <p>{@link #MORPH_LIST}ループの下位{@link #MORPHVERTEX_LIST}の構成要素。
+ *
* <p>※ base型頂点IDの出現順がモーフ頂点IDとなる。
+ *
* @param serialId base型の場合は頂点ID、それ以外はモーフ頂点ID
* @param xPos base型の場合はX座標、それ以外はX軸変位
* @param yPos base型の場合はY座標、それ以外はY軸変位
/**
* 各モーフ種別内のGUI表示順の通知を受け取る。
+ *
* <p>{@link #MORPHORDER_LIST}ループの構成要素
+ *
* @param morphId モーフ通し番号。同一モーフ種別内の大小関係のみ意味がある。
* @throws MmdFormatException 不正フォーマットによる
* パース処理の中断をパーサに指示
/**
* PMDモデルファイルのパーサ最新版。
+ *
* <p>将来のリリースにおいて、
* 常に最新のPMDモデルファイルフォーマットに対応したパーサの
* 別名であることが保証される。つもり。
/**
* 文字列の最後がLF(0x0a)の場合削除する。
+ *
* <p>ボーングループ名対策。
+ *
* @param name 文字列
* @return 末尾LFが削除された文字列
*/
/**
* 指定されたバイト長に収まるゼロ終端(0x00)文字列を読み込む。
+ *
* <p>入力バイト列はwindows-31jエンコーディングとして解釈される。
+ *
* <p>ゼロ終端以降のデータは無視されるが、
* IO入力は指定バイト数だけ読み進められる。
* ゼロ終端が見つからないまま指定バイト数が読み込み終わった場合、
* そこまでのデータから文字列を構成する。
+ *
* @param byteLen 読み込みバイト数
* @return デコードされた文字列
* @throws IOException IOエラー
/**
* PMDモデルファイルのパーサ拡張その1。
+ *
* <p>※ 英名対応
*/
public class PmdParserExt1 extends PmdParserBase {
/**
* PMDモデルファイルのパーサ拡張その2。
+ *
* <p>※ 独自トゥーンテクスチャファイル名対応
*/
public class PmdParserExt2 extends PmdParserExt1 {
/**
* PMDモデルファイルのパーサ拡張その3。
+ *
* <p>※ 剛体情報対応
*/
public class PmdParserExt3 extends PmdParserExt2 {
*/
private void parseRigidDynamics()
throws IOException, MmdFormatException{
- float mass = parseLeFloat();
- float dampingPos = parseLeFloat();
- float dampingRot = parseLeFloat();
- float restitution = parseLeFloat();
- float friction = parseLeFloat();
+ float mass = parseLeFloat();
+ float dampingPos = parseLeFloat();
+ float dampingRot = parseLeFloat();
+ float restitution = parseLeFloat();
+ float friction = parseLeFloat();
- this.rigidHandler.pmdRigidPhysics(
- mass, dampingPos, dampingRot, restitution, friction
- );
+ this.rigidHandler.pmdRigidPhysics(
+ mass, dampingPos, dampingRot, restitution, friction
+ );
return;
}
posXlim1, posXlim2,
posYlim1, posYlim2,
posZlim1, posZlim2
- );
+ );
float rotXlim1 = parseLeFloat();
float rotYlim1 = parseLeFloat();
rotXlim1, rotXlim2,
rotYlim1, rotYlim2,
rotZlim1, rotZlim2
- );
+ );
return;
}
elasticPosX,
elasticPosY,
elasticPosZ
- );
+ );
float elasticRotX = parseLeFloat();
float elasticRotY = parseLeFloat();
elasticRotX,
elasticRotY,
elasticRotZ
- );
+ );
return;
}
/**
* PMDモデルの各種剛体情報の通知用ハンドラ。
+ *
* <p>MMDでの剛体力学では「Bullet Physics Library」が用いられる。
+ *
* @see <a href="http://www.bulletphysics.org/">Bullet Physics Library</a>
*/
public interface PmdRigidHandler extends LoopHandler {
/**
* 剛体名の通知を受け取る。
+ *
* <p>{@link #RIGID_LIST}ループの構成要素。
+ *
* @param rigidName 剛体名
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void pmdRigidName(String rigidName)
throws MmdFormatException;
/**
* 剛体基本情報の通知を受け取る。
+ *
* <p>{@link #RIGID_LIST}ループの構成要素。
+ *
* @param rigidGroupId 剛体グループ番号から1引いた数。(0-15)
* @param linkedBoneId 接続先ボーンID。
- * [ 0x0000 - 0xfffe ] に収まらない場合は接続先ボーン無し。
+ * [ 0x0000 - 0xfffe ] に収まらない場合は接続先ボーン無し。
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void pmdRigidInfo(int rigidGroupId,
int linkedBoneId)
/**
* 剛体形状の通知を受け取る。
+ *
* <p>{@link #RIGID_LIST}ループの構成要素。
+ *
* @param shapeType 形状種別。
* <ul>
* <li>0x00:球
* @param height 箱orカプセルの高さ
* @param depth 箱の奥行き
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void pmdRigidShape(byte shapeType,
float width, float height, float depth)
/**
* 剛体位置の通知を受け取る。
+ *
* <p>{@link #RIGID_LIST}ループの構成要素。
+ *
* @param posX X座標
* @param posY Y座標
* @param posZ Z座標
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void pmdRigidPosition(float posX, float posY, float posZ)
throws MmdFormatException;
/**
* 剛体姿勢の通知を受け取る。
+ *
* <p>{@link #RIGID_LIST}ループの構成要素。
+ *
* @param radX X軸回転量(radian)
* @param radY Y軸回転量(radian)
* @param radZ Z軸回転量(radian)
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void pmdRigidRotation(float radX, float radY, float radZ)
throws MmdFormatException;
/**
* 剛体物理系数の通知を受け取る。
+ *
* <p>{@link #RIGID_LIST}ループの構成要素。
+ *
* @param mass 質量
* @param dampingPos 移動減衰率
* @param dampingRot 回転減衰率
* @param restitution 反発力
* @param friction 摩擦力
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void pmdRigidPhysics(float mass,
float dampingPos, float dampingRot,
/**
* 剛体の振る舞い情報の通知を受け取る。
+ *
* <p>{@link #RIGID_LIST}ループの構成要素。
+ *
* @param behaveType 剛体タイプ。
* <ul>
* <li>0:ボーン追従
* <li>2:物理演算+ボーン位置合わせ
* </ul>
* @param collisionMap 非衝突剛体グループビットマップ。
- * <p>
- * (衝突グループ番号-1)位置のビット位置は1に、
- * (非衝突グループ番号-1)位置のビット位置は0になる。
- * 例)グループ1と8のみが非衝突指定の場合、0xff7eになる。
+ * <p>(衝突グループ番号-1)位置のビット位置は1に、
+ * (非衝突グループ番号-1)位置のビット位置は0になる。
+ * 例)グループ1と8のみが非衝突指定の場合、0xff7eになる。
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void pmdRigidBehavior(byte behaveType, short collisionMap)
throws MmdFormatException;
/**
* PMDモデルの各種形状(頂点、面)の通知用ハンドラ。
+ *
* <p>0から始まる頂点ID順に頂点は出現する。
+ *
* <p>0から始まる面ID順に面は出現する。
*/
public interface PmdShapeHandler extends LoopHandler {
/**
* 頂点の座標の通知を受け取る。
+ *
* <p>{@link #VERTEX_LIST}ループの構成要素
+ *
* @param xPos X座標
* @param yPos Y座標
* @param zPos Z座標
/**
* 頂点の法線情報の通知を受け取る。
+ *
* <p>{@link #VERTEX_LIST}ループの構成要素
+ *
* <p>※単位ベクトル化必須?
+ *
* @param xVec 法線ベクトルX成分
* @param yVec 法線ベクトルY成分
* @param zVec 法線ベクトルZ成分
/**
* 頂点のUVマッピング情報の通知を受け取る。
* (頂点UV)
+ *
* <p>{@link #VERTEX_LIST}ループの構成要素
+ *
* @param uVal テクスチャのU座標
* @param vVal テクスチャのV座標
* @throws MmdFormatException 不正フォーマットによる
/**
* 頂点のボーン間ウェイトバランス情報の通知を受け取る。
+ *
* <p>{@link #VERTEX_LIST}ループの構成要素
+ *
* @param boneId1 ボーンその1識別ID
* @param boneId2 ボーンその2識別ID
* @param weightForB1 ボーンその1への影響度。0(min)~100(max)
/**
* 頂点のエッジ表現情報の通知を受け取る。
* 材質単位でのエッジ表現指定に優先される。
+ *
* <p>{@link #VERTEX_LIST}ループの構成要素
+ *
* @param hideEdge エッジ無効ならtrue
* @throws MmdFormatException 不正フォーマットによる
* パース処理の中断をパーサに指示
/**
* 3つの頂点から構成される面情報の通知を受け取る。
+ *
* <p>{@link #SURFACE_LIST}ループの構成要素。
+ *
* <p>3頂点の指定順は、面カリングにおいて意味を持つ。
+ *
* @param vertexId1 頂点IDその1
* @param vertexId2 頂点IDその1
* @param vertexId3 頂点IDその1
/**
* 独自トゥーンテクスチャファイル名の通知を受け取る。
+ *
* <p>{@link #TOON_LIST}ループの構成要素
+ *
* @param toonName 独自トゥーンテクスチャファイル名
* @throws MmdFormatException 不正フォーマットによる
* パース処理の中断をパーサに指示
/**
* PMDモデルファイル(*.pmd)用パーサライブラリ。
+ *
* <p>コールバックインタフェースを実装したオブジェクトをパーサに渡し、
* PMDモデルファイルのパースを開始すると、
* 各種データの出現に応じてコールバックメソッドを次々と呼び出してくれる。
/**
* NFKC正規化されたUnicode文字列を返す。
+ *
* <p>等価な全半角、濁点、丸付き数字などの表現の正規化を目的とする。
* <ul>
* <li>「ボーン」は「ボーン」になる
* <li>「ホ゛ーン9」は「ボーン9」になる
* </ul>
+ *
* @param name 正規化対象文字列
* @return 正規化済み文字列
*/
/**
* 別名管理オブジェクトを登録。
+ *
* <p>キーとなる名前は、事前にNFKC正規化で
* 揺らぎ表記が吸収されたプライマリ名およびグローバル名。
+ *
* <p>登録キーが衝突した時は後の方が有効となる。
+ *
* @param alias 別名管理オブジェクト
*/
void addAlias(T alias){
/**
* 別名管理オブジェクトと正規化プライマリ名を対応づける。
+ *
* <p>事前にNFKC正規化されたプライマリ名が登録キーとなる。
+ *
* <p>登録キーが衝突した時は後の方が有効となる。
+ *
* @param alias 別名管理オブジェクト
*/
private void addPrimary(T alias){
/**
* 別名管理オブジェクトと正規化グローバル名を対応づける。
+ *
* <p>事前にNFKC正規化されたグローバル名が登録キーとなる。
+ *
* <p>登録キーが衝突した時は後の方が有効となる。
+ *
* @param alias 別名管理オブジェクト
*/
private void addGlobal(T alias){
/**
* 名前から別名管理オブジェクトを得る。
+ *
* <p>プライマリ名、グローバル名の順で検索される。
+ *
* <p>名前は事前にNFKC正規化された後、検索キーとなる。
+ *
* @param name 名前
* @return 別名管理オブジェクト。見つからなければnull
*/
/**
* プライマリ名から別名管理オブジェクトを得る。
+ *
* <p>プライマリ名は事前にNFKC正規化された後、検索キーとなる。
+ *
* @param primaryName プライマリ名
* @return 別名管理オブジェクト。見つからなければnull
*/
/**
* グローバル名から別名管理オブジェクトを得る。
+ *
* <p>グローバル名は事前にNFKC正規化された後、検索キーとなる。
+ *
* @param globalName グローバル名
* @return 別名管理オブジェクト。見つからなければnull
*/
/**
* プライマリ名から代表グローバル名を得る。
+ *
* <p>プライマリ名は事前にNFKC正規化された後、検索キーとなる。
+ *
* @param primaryName プライマリ名
* @return 代表グローバル名。見つからなければnull
*/
/**
* グローバル名から代表プライマリ名を得る。
+ *
* <p>グローバル名は事前にNFKC正規化された後、検索キーとなる。
+ *
* @param globalName グローバル名
* @return 代表プライマリ名。見つからなければnull
*/
- String global2primary(String globalName){
+ String global2primary(String globalName){
T alias = getAliasByGlobal(globalName);
if(alias == null) return null;
String primary = alias.getTopPrimaryName();
/**
* 国際化&別名管理オブジェクトの実装基板。
+ *
* <p>別名管理オブジェクトは、
* 各々のリストの先頭が代表名となる、
* プライマリ名の不変リストとグローバル名の不変リストを持つ。
+ *
* <p>国産モデルではプライマリ名に日本語名が収められることが多い。
* プライマリ名は必ず一つ以上なければならない。
+ *
* <p>国産モデルではグローバル名に英語名が収められることが多いが、
* プライマリ名と同一の日本語名が収められている場合も多い。
+ *
* <p>別名管理オブジェクトは、
* インスタンス間での順序を定義するためのオーダー番号を持つ。
*/
/**
* コンストラクタ。
+ *
* <p>各初期数が0以下の場合は、
* 状況に応じて伸長する連結リストが用意される。
+ *
* @param primaryNum プライマリ名初期数。
* @param globalNum グローバル名初期数。
*/
/**
* コンストラクタ。
+ *
* <p>プライマリ名、グローバル名共、
* 状況に応じて伸長する連結リストが用意される。
*/
/**
* プライマリ名の代表をひとつ返す。
+ *
* <p>必ず存在しなければならない。
+ *
* @return 最初のプライマリ名
*/
public String getTopPrimaryName(){
/**
* 一般的な標準ボーン構成に関する情報。
+ *
* <p>各ボーン情報はひとつ以上のプライマリ名(≒日本語名)と
* ゼロ個以上のグローバル名(≒英語名)を持つ。
+ *
* <p>選択基準は独断。
+ *
* <p>和英対訳はMMD Ver7.39の同梱モデルにほぼ準拠。
*/
public final class TypicalBone extends I18nAlias {
/**
* コンストラクタ。
+ *
* <p>各初期数が0以下の場合は、
* 状況に応じて伸長する連結リストが用意される。
+ *
* @param primaryNum プライマリ名初期数。
* @param globalNum グローバル名初期数。
*/
/**
* 全ボーン情報に通し番号を付ける。
+ *
* <p>XMLでの定義順が反映される。
*/
private static void numbering(){
/**
* このボーンが親を持たないルートボーンとして扱われる慣習なのか
* 判定する。
+ *
* <p>※「全親」ボーンに関する慣習は無視される。
+ *
* @return 親を持たなければtrue
*/
public boolean isRoot(){
/**
* 一般的な標準モーフに関する情報。
+ *
* <p>各モーフ情報はひとつ以上のプライマリ名(≒日本語名)と
* ゼロ個以上のグローバル名(≒英語名)を持つ。
+ *
* <p>選択基準は独断。
+ *
* <p>和英対訳はMMD Ver7.39の同梱モデルにほぼ準拠。
*/
public final class TypicalMorph extends I18nAlias {
/**
* コンストラクタ。
+ *
* <p>各初期数が0以下の場合は、
* 状況に応じて伸長する連結リストが用意される。
+ *
* @param type モーフ種別
* @param primaryNum プライマリ名初期数。
* @param globalNum グローバル名初期数。
/**
* 全モーフ情報に通し番号を付ける。
+ *
* <p>同一グループ内ではXMLでの定義順が反映される。
*/
private static void numbering(){
/**
* IK演算時の回転方向に制限を受ける「ひざボーン」か否か、
* ボーン名で判定する。
+ *
* <p>ボーンのプライマリ名が「左ひざ」もしくは「右ひざ」で始まれば
* ひざボーンとする。
+ *
* <p>ひざボーン名の例
* <ul>
* <li>「左ひざ」
* <li>「左ひざげり」
* </ul>
+ *
* <p>ひざボーン名ではない例
* <ul>
* <li>「左ひ」
* <li>「左膝」
* <li>「Knee_L」
* </ul>
+ *
* @param boneNameJp プライマリボーン名
* @return ひざボーンならtrue
*/
/**
* MMDコミュニティにおける一般的な慣例に関する情報を提供する。
+ *
* <p>例)ボーン名やモーフ名の一般的な名前、対訳など
+ *
* <p>MikuMikuDance Ver.7.39同梱のモデルなどが主な情報源。
*/
/**
* IK ON/OFFスイッチ用ボーン名最大長。バイト単位。
+ *
* <p>※MikuMikuDance Ver7.40からの機能。
+ *
* <p>モーション指定用ボーン名と長さが違うので注意。
*/
public static final int IKSWBONENAME_MAX = 20;
/**
* カメラやライティングなどのステージ演出データの可能性があるか、
* モデル名から推測する。
+ *
* <p>モデル名が「カメラ・照明」である場合、
* そのモーションファイルはほぼ
* カメラ・ライティング用ステージ演出データであると推測される。
+ *
* @param modelName モデル名
* @return モデル名にカメラもしくはライティングの可能性があるならtrue
*/
/**
* VMDモーションファイルの基本情報(ボーンモーション/モーフモーション)
* の通知用ハンドラ。
+ *
* <p>フレーム番号は相対的なものとなる。
* 一番若いモーションのフレーム番号が0となる模様。
+ *
* <p>位置情報の座標基準は左手系ワールド座標で表される。
+ *
* <p>モーション補間情報は三次ベジェ曲線により記述される。
* 三次ベジェ曲線は4つの制御点P0,P1,P2,P3により定義される。
* P0は(0,0)、P3は(127,127)で固定。
* P1,P2はP0,P3を対角線とする正方形の内部になければならない。
* 直線補間の場合、P1には(20,20)、P2には(107,107)が使われることが多い。
+ *
* <p>補間情報は直後のボーンモーション情報との差分に関するもの。
*/
public interface VmdBasicHandler extends LoopHandler {
/**
* モーションの適用先モデル名に関する情報を通知する。
+ *
* <p>カメラやライティングなどの演出データには
* 特殊なモデル名が使われる。
+ *
* @param modelName モデル名
* @throws MmdFormatException 不正フォーマットによる
* パース処理の中断をパーサに指示
/**
* ボーンモーションのボーン名及びキーフレーム番号に関する情報を通知する。
+ *
* <p>{@link #BONEMOTION_LIST}ループの構成要素。
+ *
* @param boneName ボーン名
* @param keyFrameNo キーフレーム番号
* @throws MmdFormatException 不正フォーマットによる
/**
* ボーン移動モーション情報の通知を受け取る。
+ *
* <p>座標基準は親ボーンもしくはワールド座標。
+ *
* <p>{@link #BONEMOTION_LIST}ループの構成要素。
+ *
* @param xPos X座標
* @param yPos Y座標
* @param zPos Z座標
/**
* ボーン回転モーション情報の通知を受け取る。
+ *
* <p>回転及び姿勢はクォータニオンによって記述される。
* MMDUI上のボーン数値入力YXZオイラー角と等価な回転。
+ *
* <p>座標基準は親ボーンもしくはワールド座標。
+ *
* <p>※ボーン種別によっては、無意味な情報。
+ *
* <p>{@link #BONEMOTION_LIST}ループの構成要素。
+ *
* @param qx クォータニオン虚部 X
* @param qy クォータニオン虚部 Y
* @param qz クォータニオン虚部 Z
/**
* ボーンモーションX軸移動補間情報の通知を受け取る。
+ *
* <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
+ *
* <p>{@link #BONEMOTION_LIST}ループの構成要素。
+ *
* @param xP1x P1点のX座標
* @param xP1y P1点のY座標
* @param xP2x P2点のX座標
/**
* ボーンモーションY軸移動補間情報の通知を受け取る。
+ *
* <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
+ *
* <p>{@link #BONEMOTION_LIST}ループの構成要素。
+ *
* @param yP1x P1点のX座標
* @param yP1y P1点のY座標
* @param yP2x P2点のX座標
/**
* ボーンモーションZ軸移動補間情報の通知を受け取る。
+ *
* <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
+ *
* <p>{@link #BONEMOTION_LIST}ループの構成要素。
+ *
* @param zP1x P1点のX座標
* @param zP1y P1点のY座標
* @param zP2x P2点のX座標
/**
* ボーンモーション回転量補間情報の通知を受け取る。
+ *
* <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
+ *
* <p>{@link #BONEMOTION_LIST}ループの構成要素。
+ *
* <p>クォータニオン間のslerp処理に利用される。
+ *
* @param rP1x P1点のX座標
* @param rP1y P1点のY座標
* @param rP2x P2点のX座標
/**
* モーフモーション情報の通知を受け取る。
+ *
* <p>{@link #MORPH_LIST}ループの構成要素。
+ *
* @param morphName モーフ名。特殊モーフ名「base」は無視してもよい?
* @param keyFrameNo フレーム番号
* @param flex モーフ変量。通常は0.0以上1.0以下。
/**
* VMDモーションファイルの基本部パーサ。
+ *
* <p>ボーンのモーション情報およびモーフモーション情報のパース処理を含む。
*/
class VmdBasicParser extends ProxyParser{
/**
* 補間情報の冗長箇所の整合性チェックを行う。
+ *
* <p>※ MMDの版数によって微妙に詳細が異なる場合がある。
+ *
* @throws MmdFormatException 冗長箇所の不整合を検出した。
*/
private void checkIntpltStrict() throws MmdFormatException{
/**
* VMDモーションファイルの各種ON/OFF情報(モデル表示・IK有効無効)
* の通知用ハンドラ。
+ *
* <p>MikuMikuDance Ver7.40よりVMDファイルに導入された新仕様。
*/
public interface VmdBoolHandler extends LoopHandler {
/**
* モデルの表示フラグを通知する。
+ *
* <p>{@link #MODELSIGHT_LIST}ループの構成要素。
+ *
* @param show モデルの表示が行われる場合true
* @param keyFrameNo キーフレーム番号
* @throws MmdFormatException 不正フォーマットによる
/**
* IKボーン別のIK処理のON/OFFを通知する。
+ *
* <p>{@link #MODELSIGHT_LIST}ループの下位
* {@link #IKSW_LIST}ループの構成要素。
+ *
* @param boneName IKボーン名
* @param validIk IK処理が無効になる場合false
* @param keyFrameNo キーフレーム番号
/**
* VMDモーションファイルの各種ON/OFF情報(モデル表示・IK有効無効)
* パーサ。
+ *
* <p>MikuMikuDance Ver7.40以降でサポート
*/
class VmdBoolParser extends ProxyParser {
/**
* VMDモーションファイルのカメラワーク情報の通知用ハンドラ。
+ *
* <p>フレーム番号は相対的なものとなる。
* カメラ・照明・シャドウのうち
* 一番若いモーションのフレーム番号が0となる模様。
+ *
* <p>ターゲット位置、カメラ回転量とも、座標基準はワールド座標。
+ *
* <p>カメラターゲットの座標は左手系で表される。
+ *
* <p>ターゲットに対するカメラ位置は極座標で表される。
+ *
* <p>補間情報は直前カメラ情報との差分に関するもの。
*/
public interface VmdCameraHandler extends LoopHandler {
/**
* カメラモーションのキーフレーム番号に関する情報を通知する。
+ *
* <p>{@link #CAMERA_LIST}ループの構成要素。
+ *
* @param keyFrameNo キーフレーム番号
- * @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * @throws MmdFormatException
+ * 不正フォーマットによるパース処理の中断をパーサに指示
*/
void vmdCameraMotion(int keyFrameNo)
throws MmdFormatException;
/**
* ターゲットとカメラ間の距離情報を通知する。
+ *
* <p>球座標(極座標)の動径に相当する。
* 通常はターゲットより手前に位置するカメラまでの距離が負の値で渡される。
+ *
* <p>カメラ位置がターゲットを突き抜けた場合は正の値もとりうる。
* ※MMDのUIと符号が逆なので注意。
+ *
* <p>{@link #CAMERA_LIST}ループの構成要素。
+ *
* @param range 距離
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void vmdCameraRange(float range)
throws MmdFormatException;
/**
* カメラのターゲット位置情報を通知する。
+ *
* <p>{@link #CAMERA_LIST}ループの構成要素。
+ *
* @param xPos ターゲットのX座標
* @param yPos ターゲットのY座標
* @param zPos ターゲットのZ座標
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void vmdCameraPosition(float xPos, float yPos, float zPos)
throws MmdFormatException;
/**
* カメラの回転および回転量情報を通知する。
+ *
* <p>極座標(球座標)が用いられる。
+ *
* <p>180度を超える値も回転量として意味を持つ。
+ *
* <p>{@link #CAMERA_LIST}ループの構成要素。
+ *
* @param latitude ターゲットから見たカメラの仰俯角(≒緯度)。
- * 単位はラジアン。
- * <p>Y軸回転量が0の時のZ正軸がY正軸へ倒れる方向が正回転。
- * (MMDのUIとは符号が逆になるので注意)
- * <p>仰俯角が0の場合、
- * カメラはターゲットに対しXZ平面(水平)と平行な箇所に位置する。
+ * 単位はラジアン。
+ *
+ * <p>Y軸回転量が0の時のZ正軸がY正軸へ倒れる方向が正回転。
+ * (MMDのUIとは符号が逆になるので注意)
+ *
+ * <p>仰俯角が0の場合、
+ * カメラはターゲットに対しXZ平面(水平)と平行な箇所に位置する。
+ *
* @param longitude Y軸周りの回転量(≒経度)。単位はラジアン。
- * <p>X正軸がZ正軸へ倒れる方向が正回転。(ボーン回転と逆)
- * <p>仰俯角およびY軸回転量が0の場合、
- * カメラレンズはZ軸-∞方向からZ軸+∞方向を向く。
+ *
+ * <p>X正軸がZ正軸へ倒れる方向が正回転。(ボーン回転と逆)
+ *
+ * <p>仰俯角およびY軸回転量が0の場合、
+ * カメラレンズはZ軸-∞方向からZ軸+∞方向を向く。
+ *
* @param roll レンズをターゲットを向けたカメラのロール回転量。
- * <p>仰俯角とY軸回転量が0の時にY正軸がX正軸に倒れる方向が正回転。
- * <p>仰俯角およびロール回転量が0の場合、カメラ上部はY軸+∞の方を向く。
+ *
+ * <p>仰俯角とY軸回転量が0の時にY正軸がX正軸に倒れる方向が正回転。
+ *
+ * <p>仰俯角およびロール回転量が0の場合、カメラ上部はY軸+∞の方を向く。
+ *
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void vmdCameraRotation(float latitude, float longitude, float roll)
throws MmdFormatException;
/**
* カメラを通じたスクリーン座標への投影に関する情報を通知する。
+ *
* <p>{@link #CAMERA_LIST}ループの構成要素。
+ *
* @param angle 縦画角。単位は度数法。MMDのUIでは1から125が指定可能。
* @param hasPerspective パースペクティブスイッチがONならtrue。
- * スイッチがOFFの場合、画角は無視され遠近感処理が行われなくなる。
- * (平行投影?)
+ * スイッチがOFFの場合、画角は無視され遠近感処理が行われなくなる。
+ * (平行投影?)
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void vmdCameraProjection(int angle, boolean hasPerspective)
throws MmdFormatException;
/**
* カメラターゲットX軸移動補間情報の通知を受け取る。
* 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
+ *
* <p>{@link #CAMERA_LIST}ループの構成要素。
+ *
* @param p1x P1点のX座標
* @param p1y P1点のY座標
* @param p2x P2点のX座標
* @param p2y P2点のY座標
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void vmdCameraIntpltXpos(byte p1x, byte p1y, byte p2x, byte p2y)
throws MmdFormatException;
/**
* カメラターゲットY軸移動補間情報の通知を受け取る。
* 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
+ *
* <p>{@link #CAMERA_LIST}ループの構成要素。
+ *
* @param p1x P1点のX座標
* @param p1y P1点のY座標
* @param p2x P2点のX座標
* @param p2y P2点のY座標
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void vmdCameraIntpltYpos(byte p1x, byte p1y, byte p2x, byte p2y)
throws MmdFormatException;
/**
* カメラターゲットZ軸移動補間情報の通知を受け取る。
* 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
+ *
* <p>{@link #CAMERA_LIST}ループの構成要素。
+ *
* @param p1x P1点のX座標
* @param p1y P1点のY座標
* @param p2x P2点のX座標
* @param p2y P2点のY座標
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void vmdCameraIntpltZpos(byte p1x, byte p1y, byte p2x, byte p2y)
throws MmdFormatException;
/**
* カメラ回転量補間情報の通知を受け取る。
* 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
+ *
* <p>{@link #CAMERA_LIST}ループの構成要素。
+ *
* <p>カメラ回転でクォータニオン補間は使われない。
+ *
* @param p1x P1点のX座標
* @param p1y P1点のY座標
* @param p2x P2点のX座標
* @param p2y P2点のY座標
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void vmdCameraIntpltRotation(byte p1x, byte p1y, byte p2x, byte p2y)
throws MmdFormatException;
/**
* カメラ-ターゲット間距離補間情報の通知を受け取る。
* 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
+ *
* <p>{@link #CAMERA_LIST}ループの構成要素。
+ *
* @param p1x P1点のX座標
* @param p1y P1点のY座標
* @param p2x P2点のX座標
* @param p2y P2点のY座標
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void vmdCameraIntpltRange(byte p1x, byte p1y, byte p2x, byte p2y)
throws MmdFormatException;
/**
* スクリーン投影補間情報の通知を受け取る。
* 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
+ *
* <p>{@link #CAMERA_LIST}ループの構成要素。
+ *
* @param p1x P1点のX座標
* @param p1y P1点のY座標
* @param p2x P2点のX座標
* @param p2y P2点のY座標
* @throws MmdFormatException 不正フォーマットによる
- * パース処理の中断をパーサに指示
+ * パース処理の中断をパーサに指示
*/
void vmdCameraIntpltProjection(byte p1x, byte p1y, byte p2x, byte p2y)
throws MmdFormatException;
/**
* VMDモーションファイルのライティング情報(照明光源・セルフシャドウ)
* の通知用ハンドラ。
+ *
* <p>フレーム番号は相対的なものとなる。
* カメラ・照明・シャドウのうち
* 一番若いモーションのフレーム番号が0となる模様。
/**
* 照明情報のキーフレーム番号に関する情報を通知する。
+ *
* <p>{@link #LUMINOUS_LIST}ループの構成要素。
+ *
* @param keyFrameNo キーフレーム番号
* @throws MmdFormatException 不正フォーマットによる
* パース処理の中断をパーサに指示
/**
* 光源の色情報を通知する。
+ *
* <p>色情報はRGB色空間で記述される。
+ *
* <p>MMDのUI上の各色成分指定0~255定義域に便宜上256を追加したものが、
* 0.0以上1.0以下にマップされる。
* <ul>
* <li>128は正しく0.5にマップされる。
* <li>255は1.0より少しだけ小さい数にマップされる。
* </ul>
+ *
* <p>{@link #LUMINOUS_LIST}ループの構成要素。
+ *
* @param rVal 赤成分(0.0以上1.0以下)
* @param gVal 緑成分(0.0以上1.0以下)
* @param bVal 青成分(0.0以上1.0以下)
/**
* 光源の方向情報を通知する。
+ *
* <p>照明方向は、
* ワールド座標原点から伸びる方向ベクトルとして記述される。
* この方向ベクトルに向けて、無限遠の光源から照明が当たる。
+ *
* <p>MMDのスライダUI上では各軸成分の定義域は-1.0以上+1.0以下だが、
* さらに絶対値の大きな値を指定することも可能。
+ *
* <p>方向ベクトルの長さは演出上の意味を持たないが、
* キーフレーム間の照明方向の補間に影響を及ぼすかもしれない。
+ *
* <p>方向ベクトルが零ベクトル(0,0,0)の場合、全ポリゴンに影が落ちる。
+ *
* <p>{@link #LUMINOUS_LIST}ループの構成要素。
+ *
* @param xVec 方向ベクトルX軸成分
* @param yVec 方向ベクトルY軸成分
* @param zVec 方向ベクトルZ軸成分
/**
* シャドウ演出情報のキーフレーム番号に関する情報を通知する。
+ *
* <p>{@link #SHADOW_LIST}ループの構成要素。
+ *
* @param keyFrameNo キーフレーム番号
* @throws MmdFormatException 不正フォーマットによる
* パース処理の中断をパーサに指示
/**
* セルフシャドウモードを通知する。
+ *
* <p>{@link #SHADOW_LIST}ループの構成要素。
+ *
* @param shadowMode シャドウモード指定。
* <ul>
* <li>0 : シャドウOFF
/**
* セルフシャドウの描画対象となるオブジェクトの範囲(カメラからの距離)
* を通知する。
+ *
* <p>通知されるのは幾何的な距離ではない。
* MMDのUI値(カメラからの距離の100倍?)を
* 10万で割った商を0.1から引いた値が通知される。
+ *
* <p>{@link #SHADOW_LIST}ループの構成要素。
+ *
* @param shadowScope 距離情報。
* @throws MmdFormatException 不正フォーマットによる
* パース処理の中断をパーサに指示
/**
* VMDモーションファイルのライティング情報パーサ。
* 照明光源演出データと影演出データを含む。
+ *
* <p>古い版のVMDファイルには影演出データが記述されていない場合がある。
*/
class VmdLightingParser extends ProxyParser {
/**
* ライティングデータのパースと通知。
+ *
* <p>影演出データが無ければ読みに行かない。
+ *
* @throws IOException IOエラー
* @throws MmdFormatException フォーマットエラー
*/
/**
* ボーンモーション補間情報冗長部のチェックを行うか否か設定する。
* デフォルトではチェックを行わない。
+ *
* <p>※MMDVer7.30前後のVMD出力不具合を回避したい場合は、
* オフにするとパースに成功する場合がある。
+ *
* <p>※MMD Ver7.39x64以降はチェック回避必須。
+ *
* @param mode チェックさせたければtrue
*/
public void setRedundantCheck(boolean mode){
/**
* VMDモーションファイル(*.vmd)用パーサライブラリ。
+ *
* <p>コールバックインタフェースを実装したオブジェクトをパーサに渡し、
* VMDモーションファイルのパースを開始すると、
* 各種データの出現に応じてコールバックメソッドを次々と呼び出してくれる。
/**
* ASCIIコード相当(UCS:Basic-Latin)の文字か否か判定する。
+ *
* <p>※ Basic-Latinには各種制御文字も含まれる。
+ *
* @param ch 判定対象文字
* @return Basic-Latin文字ならtrue
* <a href="http://www.unicode.org/charts/PDF/U0000.pdf">
/**
* DOMユーティリティ(名前空間対応)。
+ *
* <p>各種名前空間引数にnullが渡された場合、全ての名前空間にマッチする。
+ *
* <p>各種ローカル名引数にnullが渡された場合、全てのローカル名にマッチする。
+ *
* <p>ノードの持つ名前空間がnullの場合、全ての名前空間引数にマッチする。
*/
public final class DomNsUtils {
/**
* 指定された名前空間とローカル名に合致する最初の直下子要素を返す。
+ *
* <p>見つからなければ例外を投げる。
+ *
* @param parent 親要素
* @param nsuri 名前空間URI
* @param localName ローカル名
/**
* 代用ローカルリソースの管理を行う。
+ *
* <p>ネットワークを介したグローバルなリソースと、
* アプリ上のローカルな代用リソースとを対応付ける。
*/
XMLConstants.W3C_XML_SCHEMA_NS_URI
);
-// schemaFactory.setFeature(name, value);
-// schemaFactory.setProperty(name, object);
+ // schemaFactory.setFeature(name, value);
+ // schemaFactory.setProperty(name, object);
schemaFactory.setErrorHandler(BotherHandler.HANDLER);
schemaFactory.setResourceResolver(resolver);
/**
* ローカルスキーマをロードする。
+ *
* <p>任意のリゾルバを指定可能
+ *
* @param resolver リゾルバ
* @param resArray ローカルスキーマ情報並び
* @return スキーマ
/**
* 兄弟要素間用Iterator。
+ *
* <p>同じ親と名前空間とローカル名を持つ要素同士を「兄弟要素」とする。
+ *
* <p>ノードの持つ名前空間がnullの場合、全ての名前空間引数にマッチする。
+ *
* <p>削除操作は未サポート。
*/
public class SiblingElemIterator implements Iterator<Element> {
/**
* コンストラクタ。
+ *
* <p>名前空間引数にnullが渡された場合、全ての名前空間にマッチする。
+ *
* <p>ローカル名引数にnullが渡された場合、全てのローカル名にマッチする。
+ *
* @param parent 親要素
* @param nsuri 子要素の名前空間URI
* @param localName 子要素のローカル名
/**
* インデント単位文字列を設定する。
+ *
* <p>デフォルトでは空白2個。
+ *
* @param indUnit インデント単位文字列。
* @throws NullPointerException 引数がnull
*/
/**
* インデントレベルを返す。
+ *
* <p>深さ1の場合1を返す。
+ *
* @return インデントレベル
*/
int getIndentLevel();
/**
* BasicLatin文字だけを出力する状態か判定する。
+ *
* <p>コメント部中身は対象外。
+ *
* @return BasicLatin文字だけで出力するならtrue
*/
boolean isBasicLatinOnlyOut();
/**
* BasicLatin文字だけで出力するか設定する。
+ *
* <p>BasicLatin以外の文字(≒日本語)を、そのまま出力するか、
* 文字参照で出力するか、の設定が可能。
+ *
* <p>コメント部中身は対象外。
+ *
* @param bool BasicLatin文字だけで出力するならtrue
*/
void setBasicLatinOnlyOut(boolean bool);
/**
* 指定された文字を16進2桁の文字参照形式で出力する。
+ *
* <p>「A」は「&#x41;」になる。
+ *
* <p>2桁で出力できない場合(>0x00ff)は4桁で出力する。
+ *
* @param ch 文字
* @return this本体
* @throws IOException 出力エラー
/**
* 指定された文字を16進4桁の文字参照形式で出力する。
+ *
* <p>「亜」は「&#x4E9C;」になる。
+ *
* <p>UCS4に伴うサロゲートペアは未サポート
+ *
* @param ch 文字
* @return this本体
* @throws IOException 出力エラー
/**
* 要素の中身および属性値中身を出力する。
+ *
* <p>XMLの構文規則を守る上で必要な各種エスケープ処理が行われる。
+ *
* @param ch 文字
* @return this本体
* @throws IOException 出力エラー
/**
* 要素の中身および属性値中身を出力する。
+ *
* <p>必要に応じてXML定義済み実体文字が割り振られた文字、
* コントロールコード、および非BasicLatin文字がエスケープされる。
+ *
* <p>半角円通貨記号U+00A5はバックスラッシュU+005Cに置換される。
+ *
* <p>連続するスペースU+0020の2文字目以降は文字参照化される。
+ *
* <p>全角スペースその他空白文字は無条件に文字参照化される。
+ *
* @param content 内容
* @return this本体
* @throws IOException 出力エラー
/**
* コメントの内容を出力する。
+ *
* <p>コメント中の'\n'記号出現に伴い、
* あらかじめ指定された改行文字が出力される。
+ *
* <p>コメント中の'\n'以外のコントロールコードは
* Control Pictures(U+2400〜)で代替される。
+ *
* <p>それ以外の非BasicLatin文字はそのまま出力される。
+ *
* <p>連続するハイフン(-)記号間には強制的にスペースが挿入される。
+ *
* @param comment コメント内容
* @return this本体
* @throws IOException 出力エラー
/**
* ブロックコメントを出力する。
+ *
* <p>コメント内部の頭の前に改行が出力される。
+ *
* <p>コメント内部の末尾が改行でない場合、改行が挿入される。
+ *
* <p>ブロックコメント末尾は改行で終わる。
+ *
* <p>インデント設定は無視される。
+ *
* @param comment コメント内容
* @return this本体
* @throws IOException 出力エラー
* @param originalURI オリジナルURI
* @return 入力ストリーム。リダイレクト先が未登録の場合はnull
* @throws java.io.IOException 入出力エラー。
- * もしくはリソースが見つからない。
+ * もしくはリソースが見つからない。
*/
private InputStream getXMLResourceAsStream(URI originalURI)
throws IOException{