<groupId>jp.sourceforge.mikutoga</groupId>
<artifactId>vmd2xml</artifactId>
- <version>1.101.5-SNAPSHOT</version>
+ <version>1.101.7-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Vmd2XML</name>
private boolean shown = true;
- private List<IkSwitch> ikSwList = new LinkedList<IkSwitch>();
+ private final List<IkSwitch> ikSwList = new LinkedList<IkSwitch>();
/**
StringBuilder submsg = new StringBuilder(msg);
for(IkSwitch sw : this.ikSwList){
- submsg.append('\n').append("\u0020").append(sw.toString());
+ submsg.append("\n\u0020").append(sw.toString());
}
return submsg.toString();
}
/**
+ * フラグモーションが存在するか否か判定する。
+ * <p>フラグモーションは、
+ * MMD Ver7.40以降のVMDフォーマットでなければ記録できない。
+ * @return 存在するならtrue
+ */
+ public boolean hasFlagMotion(){
+ if(this.flagList.isEmpty()) return false;
+ return true;
+ }
+
+ /**
* 順序保証されたボーンモーションマップを返す。
* @return ボーンモーションマップ
* @see java.util.LinkedHashMap
private static final Charset CS_ASCII = Charset.forName("US-ASCII");
- // '\0' * 5byte の版もあり
- private static final String HEADFILLER = "\u0000" + "JKLM";
+ private static final String HEADFILLER_OLD =
+ "\u0000" + "JKLM";
+ private static final String HEADFILLER =
+ "\u0000\u0000\u0000\u0000\u0000";
private static final byte[] FDFILLER =
{ (byte)0x00, (byte)0xfd };
- private static final byte[] INTPLT_FILLER = {
- (byte) 0x01, // 0x00の版もあり。
+ private static final byte[] FILLER_00 = { // MMD Ver7.39x64仕様
+ (byte) 0x00,
+ (byte) 0x00,
+ (byte) 0x00,
+ };
+ private static final byte[] FILLER_01 = {
+ (byte) 0x01,
(byte) 0x00,
(byte) 0x00,
};
+ static{
+ assert HEADFILLER.length() == HEADFILLER_OLD.length();
+ assert FILLER_00.length == FILLER_01.length;
+ }
+
private final byte[] motionIntplt = new byte[BZTOTAL_SIZE];
private final ByteBuffer intpltBuf;
private final ByteBuffer rdBuf;
+ private byte[] intpltFiller = FILLER_01;
+
/**
* コンストラクタ。
/**
* ヘッダ情報を出力する。
+ * @param motion モーションデータ
* @throws IOException 出力エラー
*/
- void dumpHeader() throws IOException{
- byte[] header = (VmdConst.MAGIC_TXT + HEADFILLER).getBytes(CS_ASCII);
+ void dumpHeader(VmdMotion motion) throws IOException{
+ String headerTxt = VmdConst.MAGIC_TXT;
+ if(motion.hasFlagMotion()) headerTxt += HEADFILLER;
+ else headerTxt += HEADFILLER_OLD;
+
+ byte[] header = headerTxt.getBytes(CS_ASCII);
assert header.length == VmdConst.HEADER_LENGTH;
dumpByteArray(header);
*/
void dumpBoneMotion(VmdMotion motion)
throws IOException, IllegalTextExportException{
+ if(motion.hasFlagMotion()){ // MMD Ver7.40仕様
+ this.intpltFiller = FILLER_00;
+ }else{
+ this.intpltFiller = FILLER_01;
+ }
+
Map<String, List<BoneMotion>> map = motion.getBonePartMap();
List<BoneMotion> bmotionList = new LinkedList<BoneMotion>();
for(int lack = 1; lack < BZ_REDUNDANT; lack++){
this.rdBuf.position(lack);
this.intpltBuf.put(this.rdBuf);
- this.intpltBuf.put(INTPLT_FILLER, 0, lack);
+ this.intpltBuf.put(this.intpltFiller, 0, lack);
}
assert this.intpltBuf.position() == BZTOTAL_SIZE;
* フラグ情報のビルダ。
* <p>MikuMikuDance Ver7.40以降でサポート
*/
-public class BoolLoader implements VmdBoolHandler{
+class BoolLoader implements VmdBoolHandler{
private final List<NumberedVmdFlag> flagList;
- private NumberedVmdFlag currentFlag;
- private IkSwitch currentSwitch;
+ private NumberedVmdFlag currentFlag = null;
+ private IkSwitch currentSwitch = null;
/**
* コンストラクタ。
*/
private void dumpVmdMotionImpl(VmdMotion motion)
throws IOException, IllegalVmdDataException{
- this.basicExporter.dumpHeader();
+ this.basicExporter.dumpHeader(motion);
try{
this.basicExporter.dumpModelName(motion);
import jp.sfjp.mikutoga.vmd.model.CameraRotation;
import jp.sfjp.mikutoga.vmd.model.PosCurve;
import jp.sfjp.mikutoga.vmd.model.VmdMotion;
-import jp.sourceforge.mikutoga.xml.ProxyXmlExporter;
+import jp.sfjp.mikutoga.xml.ProxyXmlExporter;
/**
*カメラ情報のXMLエクスポーター。
import java.io.IOException;
import jp.sfjp.mikutoga.vmd.model.BezierParam;
import jp.sfjp.mikutoga.vmd.model.PosCurve;
-import jp.sourceforge.mikutoga.xml.ProxyXmlExporter;
-import jp.sourceforge.mikutoga.xml.XmlExporter;
+import jp.sfjp.mikutoga.xml.ProxyXmlExporter;
+import jp.sfjp.mikutoga.xml.XmlExporter;
/**
* XML出力機構の共通部。
--- /dev/null
+/*
+ * flag xml exporter
+ *
+ * License : The MIT License
+ * Copyright(c) 2013 MikuToga Partners
+ */
+
+package jp.sfjp.mikutoga.vmd.model.xml;
+
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.util.List;
+import jp.sfjp.mikutoga.typical.TypicalBone;
+import jp.sfjp.mikutoga.vmd.model.IkSwitch;
+import jp.sfjp.mikutoga.vmd.model.NumberedVmdFlag;
+import jp.sfjp.mikutoga.vmd.model.VmdMotion;
+import jp.sfjp.mikutoga.xml.ProxyXmlExporter;
+
+/**
+ * フラグ情報のXMLエクスポーター。
+ */
+class FlagXmlExporter extends ProxyXmlExporter {
+
+ private static final String MSG_MAYBE = "Perhaps : [{0}]";
+
+
+ /**
+ * コンストラクタ。
+ * @param delegate 委譲先
+ */
+ FlagXmlExporter(VmdXmlExporter delegate) {
+ super(delegate);
+ return;
+ }
+
+
+ /**
+ * boolean値をXSD:booleanに準拠した文字列に変換する。
+ * @param bool boolean値
+ * @return XSD:boolean文字列
+ */
+ private static String toXsdBoolean(boolean bool){
+ String result;
+ if(bool) result = "true";
+ else result = "false";
+ return result;
+ }
+
+
+ /**
+ * 各種モーションフラグを出力する。
+ * @param vmdMotion モーションデータ
+ * @throws IOException 出力エラー
+ */
+ void putFlagSequence(VmdMotion vmdMotion)
+ throws IOException{
+ ind().putSimpleSTag(VmdTag.FLAG_SEQUENCE.tag()).ln();
+
+ pushNest();
+ List<NumberedVmdFlag> list = vmdMotion.getNumberedFlagList();
+ if( ! list.isEmpty() ) ln();
+ for(NumberedVmdFlag flag : list){
+ putFlagMotion(flag);
+ }
+ popNest();
+
+ ind().putETag(VmdTag.FLAG_SEQUENCE.tag()).ln(2);
+
+ return;
+ }
+
+ /**
+ * フラグリストを出力する。
+ * @param flag フラグモーション
+ * @throws IOException 出力エラー
+ */
+ private void putFlagMotion(NumberedVmdFlag flag)
+ throws IOException{
+ int frameNo = flag.getFrameNumber();
+ String showTxt = toXsdBoolean(flag.isModelShown());
+
+ ind().putOpenSTag(VmdTag.FLAG_MOTION.tag()).sp();
+ putIntAttr(XmlAttr.ATTR_FRAME, frameNo).sp();
+ putAttr(XmlAttr.ATTR_SHOWMODEL, showTxt).sp();
+
+ List<IkSwitch> ikList = flag.getIkSwitchList();
+ if(ikList.isEmpty()){
+ putCloseEmpty().ln(2);
+ }else{
+ putCloseSTag().ln(2);
+ pushNest();
+ for(IkSwitch ikSw : ikList){
+ putIkSwitch(ikSw);
+ }
+ popNest();
+ ind().putETag(VmdTag.FLAG_MOTION.tag()).ln(2);
+ }
+
+ return;
+ }
+
+ /**
+ * IK ON/OFFリストを出力する。
+ * @param ikSw IK ON/OFF スイッチ
+ * @throws IOException 出力エラー
+ */
+ private void putIkSwitch(IkSwitch ikSw)
+ throws IOException{
+ String boneName = ikSw.getBoneName();
+ String validTxt = toXsdBoolean(ikSw.isValid());
+
+ ind().putLineComment(boneName);
+ String globalName = TypicalBone.primary2global(boneName);
+ if(globalName != null){
+ String gname =
+ MessageFormat.format(MSG_MAYBE, globalName);
+ sp(2).putLineComment(gname);
+ }
+ ln();
+
+ ind().putOpenSTag(VmdTag.IK_SWITCH.tag()).sp();
+
+ putAttr(XmlAttr.ATTR_NAME, boneName).sp();
+ putAttr(XmlAttr.ATTR_VALID, validTxt).sp();
+
+ putCloseEmpty().ln(2);
+
+ return;
+ }
+
+}
import jp.sfjp.mikutoga.vmd.model.ShadowMode;
import jp.sfjp.mikutoga.vmd.model.ShadowMotion;
import jp.sfjp.mikutoga.vmd.model.VmdMotion;
-import jp.sourceforge.mikutoga.xml.ProxyXmlExporter;
-import jp.sourceforge.mikutoga.xml.XmlExporter;
+import jp.sfjp.mikutoga.xml.ProxyXmlExporter;
+import jp.sfjp.mikutoga.xml.XmlExporter;
/**
* ライティング情報のXMLエクスポーター。
+++ /dev/null
-/*
- * Sax 2 Xsd-types converter
- *
- * License : The MIT License
- * Copyright(c) 2013 MikuToga Partners
- */
-
-package jp.sfjp.mikutoga.vmd.model.xml;
-
-import javax.xml.bind.DatatypeConverter;
-import org.xml.sax.Attributes;
-
-/**
- * XSD各種型のSAX属性値をJavaプリミティブ型へ変換する。
- */
-public final class SaxAttr {
-
- /**
- * 隠しコンストラクタ。
- */
- private SaxAttr(){
- assert false;
- throw new AssertionError();
- }
-
-
- /**
- * 属性名に対応する属性値があるか否か判定する。
- * @param attr 属性群
- * @param name 属性名
- * @return 属性名に対応する属性値がある場合はtrue
- */
- public static boolean hasAttr(Attributes attr, String name){
- if(attr.getValue(name) == null) return false;
- return true;
- }
-
- /**
- * xsd:string型属性値の読み込み。
- * @param attr 属性群
- * @param name 属性名
- * @return 属性値。該当する属性が無ければnull。
- */
- public static String getStringAttr(Attributes attr, String name){
- String attrVal = attr.getValue(name);
- return attrVal;
- }
-
- /**
- * xsd:boolean型属性値の読み込み。
- * @param attr 属性群
- * @param name 属性名
- * @return 属性値。
- * @throws IllegalArgumentException boolean型表記ではない
- */
- public static boolean getBooleanAttr(Attributes attr, String name)
- throws IllegalArgumentException{
- String attrVal = attr.getValue(name);
- boolean bVal;
- bVal = DatatypeConverter.parseBoolean(attrVal);
- return bVal;
- }
-
- /**
- * xsd:boolean型属性値の読み込み。
- * @param attr 属性群
- * @param name 属性名
- * @param def 属性が無い場合のデフォルト値
- * @return 属性値。
- * @throws IllegalArgumentException boolean型表記ではない
- */
- public static boolean getBooleanAttr(Attributes attr,
- String name,
- boolean def )
- throws IllegalArgumentException{
- String attrVal = attr.getValue(name);
- if(attrVal == null) return def;
-
- boolean bVal;
- bVal = DatatypeConverter.parseBoolean(attrVal);
-
- return bVal;
- }
-
- /**
- * xsd:byte型属性の読み込み。
- * @param attr 属性群
- * @param name 属性名
- * @return 属性値。
- * @throws NumberFormatException byte型表記ではない
- */
- public static byte getByteAttr(Attributes attr, String name)
- throws NumberFormatException{
- String attrVal = attr.getValue(name);
- byte bVal;
- bVal = DatatypeConverter.parseByte(attrVal);
- return bVal;
- }
-
- /**
- * xsd:float型属性値の読み込み。
- * @param attr 属性群
- * @param name 属性名
- * @return 属性値。
- * @throws NumberFormatException float型表記ではない
- */
- public static float getFloatAttr(Attributes attr, String name)
- throws NumberFormatException {
- String attrVal = attr.getValue(name);
- float fVal;
- fVal = DatatypeConverter.parseFloat(attrVal);
- return fVal;
- }
-
- /**
- * xsd:int型属性値の読み込み。
- * @param attr 属性群
- * @param name 属性名
- * @return 属性値。
- * @throws NumberFormatException int型表記ではない
- */
- public static int getIntAttr(Attributes attr, String name)
- throws NumberFormatException {
- String attrVal = attr.getValue(name);
- int iVal;
- iVal = DatatypeConverter.parseInt(attrVal);
- return iVal;
- }
-
-}
import jp.sfjp.mikutoga.vmd.model.CameraRotation;
import jp.sfjp.mikutoga.vmd.model.PosCurve;
import jp.sfjp.mikutoga.vmd.model.VmdMotion;
+import jp.sfjp.mikutoga.xml.SaxAttr;
import org.xml.sax.Attributes;
/**
--- /dev/null
+/*
+ * motion flag listener from XML
+ *
+ * License : The MIT License
+ * Copyright(c) 2013 MikuToga Partners
+ */
+
+package jp.sfjp.mikutoga.vmd.model.xml;
+
+import java.util.List;
+import jp.sfjp.mikutoga.vmd.model.IkSwitch;
+import jp.sfjp.mikutoga.vmd.model.NumberedVmdFlag;
+import jp.sfjp.mikutoga.vmd.model.VmdMotion;
+import jp.sfjp.mikutoga.xml.SaxAttr;
+import org.xml.sax.Attributes;
+
+/**
+ * モーションフラグ関連のXML要素出現イベントを受信する。
+ */
+class SaxFlagListener extends SaxVmdListener {
+
+ private NumberedVmdFlag currentFlagMotion = null;
+
+
+ /**
+ * コンストラクタ。
+ */
+ SaxFlagListener(){
+ super();
+ return;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ * @param tag {@inheritDoc}
+ * @param attr {@inheritDoc}
+ */
+ @Override
+ void openTag(VmdTag tag, Attributes attr){
+ switch(tag){
+ case FLAG_MOTION:
+ openFlagMotion(attr);
+ break;
+ case IK_SWITCH:
+ openIkSwitch(attr);
+ break;
+ default:
+ break;
+ }
+
+ return;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @param tag {@inheritDoc}
+ */
+ @Override
+ void closeTag(VmdTag tag){
+ if(tag == VmdTag.FLAG_MOTION){
+ closeFlagMotion();
+ }
+ return;
+ }
+
+ /**
+ * flagMotion要素開始の通知。
+ * @param attr 属性群
+ */
+ private void openFlagMotion(Attributes attr){
+ this.currentFlagMotion = new NumberedVmdFlag();
+
+ int frameNo = SaxAttr.getIntAttr(attr, XmlAttr.ATTR_FRAME);
+ boolean showModel =
+ SaxAttr.getBooleanAttr(attr, XmlAttr.ATTR_SHOWMODEL);
+
+ this.currentFlagMotion.setFrameNumber(frameNo);
+ this.currentFlagMotion.setModelShown(showModel);
+
+ return;
+ }
+
+ /**
+ * flagMotion要素終了の通知。
+ */
+ private void closeFlagMotion(){
+ VmdMotion motion = getVmdMotion();
+ List<NumberedVmdFlag> flagList = motion.getNumberedFlagList();
+ flagList.add(this.currentFlagMotion);
+
+ this.currentFlagMotion = null;
+
+ return;
+ }
+
+ /**
+ * ikSwitch要素開始の通知。
+ * @param attr 属性群
+ */
+ private void openIkSwitch(Attributes attr){
+ String boneName = SaxAttr.getStringAttr(attr, XmlAttr.ATTR_NAME);
+ boolean valid =
+ SaxAttr.getBooleanAttr(attr, XmlAttr.ATTR_VALID);
+
+ IkSwitch ikSw = new IkSwitch();
+ ikSw.setBoneName(boneName);
+ ikSw.setValid(valid);
+
+ List<IkSwitch> ikList = this.currentFlagMotion.getIkSwitchList();
+ ikList.add(ikSw);
+
+ return;
+ }
+
+}
import jp.sfjp.mikutoga.vmd.model.ShadowMode;
import jp.sfjp.mikutoga.vmd.model.ShadowMotion;
import jp.sfjp.mikutoga.vmd.model.VmdMotion;
+import jp.sfjp.mikutoga.xml.SaxAttr;
import org.xml.sax.Attributes;
/**
import jp.sfjp.mikutoga.vmd.model.MorphMotion;
import jp.sfjp.mikutoga.vmd.model.PosCurve;
import jp.sfjp.mikutoga.vmd.model.VmdMotion;
+import jp.sfjp.mikutoga.xml.SaxAttr;
import org.xml.sax.Attributes;
/**
import jp.sfjp.mikutoga.vmd.model.BezierParam;
import jp.sfjp.mikutoga.vmd.model.PosCurve;
import jp.sfjp.mikutoga.vmd.model.VmdMotion;
+import jp.sfjp.mikutoga.xml.SaxAttr;
import org.xml.sax.Attributes;
/**
import java.net.URI;
import java.net.URISyntaxException;
-import jp.sourceforge.mikutoga.xml.LocalXmlResource;
+import jp.sfjp.mikutoga.xml.LocalXmlResource;
/**
* 110820形式XML各種リソースの定義。
--- /dev/null
+/*
+ * xml resources for VMD-XML
+ *
+ * License : The MIT License
+ * Copyright(c) 2013 MikuToga Partners
+ */
+
+package jp.sfjp.mikutoga.vmd.model.xml;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import jp.sfjp.mikutoga.xml.LocalXmlResource;
+
+/**
+ * 130609形式XML各種リソースの定義。
+ * <p>MikuMikuDance Ver7.40 の新VMDファイルフォーマット対応。
+ */
+public final class Schema130609 implements LocalXmlResource{
+
+ /** 唯一のシングルトン。 */
+ public static final Schema130609 SINGLETON;
+
+ /** XML名前空間識別子。 */
+ public static final String NS_VMDXML =
+ "http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609";
+ /** XMLスキーマURI名。 */
+ public static final String SCHEMA_VMDXML =
+ "http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-130609.xsd";
+ /** 定義の版数。 */
+ public static final String VER_VMDXML =
+ "130609";
+ /** ローカルなスキーマファイル名。 */
+ public static final String LOCAL_SCHEMA_VMDXML =
+ "resources/vmdxml-130609.xsd";
+
+ private static final URI URI_SCHEMA_VMDXML = URI.create(SCHEMA_VMDXML);
+ private static final URI RES_SCHEMA_VMDXML;
+
+ private static final Class<?> THISCLASS = Schema130609.class;
+
+ static{
+ try{
+ RES_SCHEMA_VMDXML =
+ THISCLASS.getResource(LOCAL_SCHEMA_VMDXML).toURI();
+ }catch(URISyntaxException e){
+ throw new ExceptionInInitializerError(e);
+ }
+
+ SINGLETON = new Schema130609();
+ }
+
+
+ /**
+ * コンストラクタ。
+ */
+ private Schema130609(){
+ super();
+ assert this.getClass() == THISCLASS;
+ return;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ * @return {@inheritDoc}
+ */
+ @Override
+ public URI getOriginalResource(){
+ return URI_SCHEMA_VMDXML;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @return {@inheritDoc}
+ */
+ @Override
+ public URI getLocalResource(){
+ return RES_SCHEMA_VMDXML;
+ }
+
+}
MORPH_PART ("morphPart"),
MORPH_MOTION ("morphMotion"),
+ FLAG_SEQUENCE ("flagSequence"),
+ FLAG_MOTION ("flagMotion"),
+ IK_SWITCH ("ikSwitch"),
+
CAMERA_SEQUENCE("cameraSequence"),
CAMERA_MOTION ("cameraMotion"),
CAMERA_TARGET ("cameraTarget"),
import jp.sfjp.mikutoga.vmd.model.MorphMotion;
import jp.sfjp.mikutoga.vmd.model.PosCurve;
import jp.sfjp.mikutoga.vmd.model.VmdMotion;
-import jp.sourceforge.mikutoga.xml.BasicXmlExporter;
-import jp.sourceforge.mikutoga.xml.XmlResourceResolver;
+import jp.sfjp.mikutoga.xml.BasicXmlExporter;
+import jp.sfjp.mikutoga.xml.XmlResourceResolver;
/**
* VMDモーションデータをXMLへエクスポートする。
private static final String MSG_MAYBE = "Perhaps : [{0}]";
+ private XmlMotionFileType xmlType = XmlMotionFileType.XML_110820;
+
private boolean isQuaternionMode = true;
private String generator = "";
private final CameraXmlExporter cameraXmlExporter;
private final LightingXmlExpoter lightingExporter;
private final ExtraXmlExporter extraExporter;
+ private final FlagXmlExporter flagXmlExporter;
/**
this.cameraXmlExporter = new CameraXmlExporter(this);
this.lightingExporter = new LightingXmlExpoter(this);
this.extraExporter = new ExtraXmlExporter(this);
+ this.flagXmlExporter = new FlagXmlExporter(this);
+
+ return;
+ }
+
+
+ /**
+ * 出力XMLファイル種別を設定する。
+ * @param type ファイル種別
+ */
+ public void setXmlFileType(XmlMotionFileType type){
+ switch(type){
+ case XML_110820:
+ case XML_130609:
+ this.xmlType = type;
+ break;
+ case XML_AUTO:
+ this.xmlType = XmlMotionFileType.XML_130609;
+ break;
+ default:
+ assert false;
+ throw new AssertionError();
+ }
+
+ assert this.xmlType == XmlMotionFileType.XML_110820
+ || this.xmlType == XmlMotionFileType.XML_130609;
return;
}
+ /**
+ * 出力XMLファイル種別を返す。
+ * @return ファイル種別
+ */
+ public XmlMotionFileType getXmlFileType(){
+ return this.xmlType;
+ }
/**
* ボーン回転量をクォータニオンで出力するか否か設定する。
*/
private void putVmdXmlImpl(VmdMotion vmdMotion)
throws IOException, IllegalVmdDataException{
- ind().putRawText(XML_DECL).ln(2);
-
- ind().putBlockComment(XmlComment.TOP_COMMENT).ln(2);
-
- ind().putOpenSTag(VmdTag.VMD_MOTION.tag()).ln();
- pushNest();
- ind().putAttr("xmlns", Schema110820.NS_VMDXML).ln();
- ind().putAttr("xmlns:" + XSINS, XmlResourceResolver.NS_XSD).ln();
-
- ind().putRawText(XSINS).putRawText(":schemaLocation=")
- .putRawCh('"');
- putRawText(Schema110820.NS_VMDXML).ln();
- ind().sp(2).putRawText(Schema110820.SCHEMA_VMDXML)
- .putRawCh('"')
- .ln();
-
- ind().putAttr(XmlAttr.ATTR_VERSION, Schema110820.VER_VMDXML).ln();
- popNest();
- putCloseSTag().ln(2);
+ putVmdRootOpen();
putGenerator();
putModelName(vmdMotion);
putBoneMotionSequence(vmdMotion);
putMorphSequence(vmdMotion);
+ if(this.xmlType == XmlMotionFileType.XML_130609){
+ this.flagXmlExporter.putFlagSequence(vmdMotion);
+ }
}else{
this.cameraXmlExporter.putCameraSequence(vmdMotion);
this.lightingExporter.putLuminousSequence(vmdMotion);
}
/**
+ * ルート要素がオープンするまでの各種宣言を出力する。
+ * @throws IOException 出力エラー
+ */
+ private void putVmdRootOpen() throws IOException{
+ ind().putRawText(XML_DECL).ln(2);
+
+ ind().putBlockComment(XmlComment.TOP_COMMENT).ln(2);
+
+ String namespace;
+ String schemaUrl;
+ String schemaVer;
+
+ switch(this.xmlType){
+ case XML_110820:
+ namespace = Schema110820.NS_VMDXML;
+ schemaUrl = Schema110820.SCHEMA_VMDXML;
+ schemaVer = Schema110820.VER_VMDXML;
+ break;
+ case XML_130609:
+ namespace = Schema130609.NS_VMDXML;
+ schemaUrl = Schema130609.SCHEMA_VMDXML;
+ schemaVer = Schema130609.VER_VMDXML;
+ break;
+ default:
+ assert false;
+ throw new AssertionError();
+ }
+
+ ind().putOpenSTag(VmdTag.VMD_MOTION.tag()).ln();
+ pushNest();
+ ind().putAttr("xmlns", namespace).ln();
+ ind().putAttr("xmlns:" + XSINS, XmlResourceResolver.NS_XSD).ln();
+
+ ind().putRawText(XSINS).putRawText(":schemaLocation=")
+ .putRawCh('"');
+ putRawText(namespace).ln();
+ ind().sp(2).putRawText(schemaUrl)
+ .putRawCh('"')
+ .ln();
+
+ ind().putAttr(XmlAttr.ATTR_VERSION, schemaVer).ln();
+ popNest();
+ putCloseSTag().ln(2);
+
+ return;
+ }
+
+ /**
* ジェネレータ名を出力する。
* @throws IOException 出力エラー
*/
static final String ATTR_MODE = "mode";
static final String ATTR_RAW_PARAM = "rawParam";
+ static final String ATTR_SHOWMODEL = "showModel";
+ static final String ATTR_VALID = "valid";
+
/**
* 隠しコンストラクタ。
package jp.sfjp.mikutoga.vmd.model.xml;
import jp.sfjp.mikutoga.vmd.model.VmdMotion;
+import jp.sfjp.mikutoga.xml.SaxAttr;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
private final SaxVmdListener motionListener;
private final SaxVmdListener cameraListener;
private final SaxVmdListener lightListener;
+ private final SaxVmdListener flagListener;
private SaxVmdListener currentListener = null;
this.motionListener = new SaxMotionListener();
this.cameraListener = new SaxCameraListener();
this.lightListener = new SaxLightingListener();
+ this.flagListener = new SaxFlagListener();
return;
}
this.motionListener.setVmdMotion(this.vmdMotion);
this.cameraListener.setVmdMotion(this.vmdMotion);
this.lightListener .setVmdMotion(this.vmdMotion);
+ this.flagListener .setVmdMotion(this.vmdMotion);
return;
}
@Override
public void startPrefixMapping(String prefix, String uri)
throws SAXException {
- if(Schema110820.NS_VMDXML.equals(uri)){
+ if( Schema110820.NS_VMDXML.equals(uri)
+ || Schema130609.NS_VMDXML.equals(uri) ){
this.nspfx = prefix;
this.nsuri = uri;
}
case SHADOW_SEQUENCE:
this.currentListener = this.lightListener;
break;
+ case FLAG_SEQUENCE:
+ this.currentListener = this.flagListener;
+ break;
default:
break;
}
--- /dev/null
+/*
+ * MMD motion xml file types.
+ *
+ * License : The MIT License
+ * Copyright(c) 2013 MikuToga Partners
+ */
+
+package jp.sfjp.mikutoga.vmd.model.xml;
+
+/**
+ * XMLファイルスキーマ種別。
+ */
+public enum XmlMotionFileType {
+
+ /**
+ * XMLファイル(自動判別)。
+ * <p>読み込み時のスキーマ判別は自動。
+ * <p>書き込み時のスキーマは最新。
+ */
+ XML_AUTO,
+
+ /**
+ * スキーマ
+ * http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-110820.xsd
+ * で定義されたXMLファイル。
+ */
+ XML_110820,
+
+ /**
+ * スキーマ
+ * http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-130609.xsd
+ * で定義されたXMLファイル。
+ * MikuMikuDance Ver7.40対応。
+ */
+ XML_130609,
+
+ ;
+
+}
import java.io.IOException;
import jp.sfjp.mikutoga.vmd.model.VmdMotion;
-import jp.sourceforge.mikutoga.xml.TogaXmlException;
+import jp.sfjp.mikutoga.xml.TogaXmlException;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
package jp.sfjp.mikutoga.vmd2xml;
+import jp.sfjp.mikutoga.vmd.model.xml.XmlMotionFileType;
+
/**
* モーションファイル種別。
*/
VMD,
/**
+ * XMLファイル(自動判別)。
+ * <p>読み込み時のスキーマ判別は自動。
+ * <p>書き込み時のスキーマは最新。
+ */
+ XML_AUTO,
+
+ /**
* スキーマ
* http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-110820.xsd
* で定義されたXMLファイル。
*/
XML_110820,
+ /**
+ * スキーマ
+ * http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-130609.xsd
+ * で定義されたXMLファイル。
+ * MikuMikuDance Ver7.40対応。
+ */
+ XML_130609,
+
;
return;
}
+
+ /**
+ * ファイル種別をXMLファイル種別に変換する。
+ * <p>未定義の場合はXML_AUTOを返す。
+ * @return XMLファイル種別
+ */
+ public XmlMotionFileType toXmlType(){
+ XmlMotionFileType result;
+
+ switch(this){
+ case XML_110820:
+ result = XmlMotionFileType.XML_110820;
+ break;
+ case XML_130609:
+ result = XmlMotionFileType.XML_130609;
+ break;
+ case XML_AUTO:
+ result = XmlMotionFileType.XML_AUTO;
+ break;
+ default:
+ result = XmlMotionFileType.XML_AUTO;
+ break;
+ }
+
+ return result;
+ }
+
/**
* ファイル種別がXMLか判定する。
* @return XMLならtrue
*/
public boolean isXml(){
- if(this == XML_110820) return true;
+ switch(this){
+ case XML_AUTO:
+ case XML_110820:
+ case XML_130609:
+ return true;
+ default:
+ break;
+ }
+
return false;
}
private static final String FORMAT_VMD = "vmd";
private static final String FORMAT_XML = "xml";
private static final String FORMAT_XML110820 = "xml110820";
+ private static final String FORMAT_XML130609 = "xml130609";
private static final String SFX_VMD = ".vmd";
private static final String SFX_XML = ".xml";
if (FORMAT_VMD.equals(arg)){
result = MotionFileType.VMD;
}else if(FORMAT_XML.equals(arg)){
- result = MotionFileType.XML_110820;
+ result = MotionFileType.XML_AUTO;
}else if(FORMAT_XML110820.equals(arg)){
result = MotionFileType.XML_110820;
+ }else if(FORMAT_XML130609.equals(arg)){
+ result = MotionFileType.XML_130609;
}else{
String errMsg = MessageFormat.format(ERRMSG_INVFORM, arg);
throw new CmdLineException(errMsg);
String lower = fileName.toLowerCase(Locale.ROOT);
if (lower.endsWith(SFX_VMD)) result = MotionFileType.VMD;
- else if(lower.endsWith(SFX_XML)) result = MotionFileType.XML_110820;
+ else if(lower.endsWith(SFX_XML)) result = MotionFileType.XML_AUTO;
return result;
}
+ " or \"true\" or \"false\""
+ " or \"yes\" or \"no\"\n"
+ " format : \"vmd\" or \"xml\" or"
- + " \"xml110820\"\n"
+ + " \"xml110820\" or \"xml130609\"\n"
+ " newline : \"lf\" or \"crlf\"\n"
;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
import java.nio.channels.FileChannel;
import java.text.MessageFormat;
import java.util.Properties;
import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
import jp.sfjp.mikutoga.vmd.IllegalVmdDataException;
-import jp.sourceforge.mikutoga.xml.TogaXmlException;
+import jp.sfjp.mikutoga.xml.TogaXmlException;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
"{0} {1}\n"
+ "\u0020\u0020License\u0020:\u0020{2}\n"
+ "\u0020\u0020{3}\n";
- private static final String MSG_NOINFILE = "Can't find input file:{0}";
+ private static final String MSG_NOINFILE = "Can''t find input file: {0}";
private static final String MSG_ABNFILE = "{0} is not file.";
private static final String MSG_OWOUTFILE =
"{0} already exists.\n"
exit(EXIT_IOERR);
}
- URI uri = inFile.toURI();
- URL url;
- try{
- url = uri.toURL();
- }catch(MalformedURLException e){
- // File由来のURLでは起こりえない
- assert false;
- throw new AssertionError(e);
- }
- String systemId = url.toString();
-
- InputSource source = new InputSource(systemId);
+ InputSource source = XmlInputUtil.fileToSource(inFile);
return source;
}
package jp.sfjp.mikutoga.vmd2xml;
-import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
-import java.net.URL;
import java.nio.charset.Charset;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.validation.Schema;
import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
import jp.sfjp.mikutoga.vmd.IllegalVmdDataException;
import jp.sfjp.mikutoga.vmd.model.VmdMotion;
import jp.sfjp.mikutoga.vmd.model.binio.VmdExporter;
import jp.sfjp.mikutoga.vmd.model.binio.VmdLoader;
-import jp.sfjp.mikutoga.vmd.model.xml.Schema110820;
import jp.sfjp.mikutoga.vmd.model.xml.VmdXmlExporter;
+import jp.sfjp.mikutoga.vmd.model.xml.XmlMotionFileType;
import jp.sfjp.mikutoga.vmd.model.xml.XmlVmdLoader;
-import jp.sourceforge.mikutoga.xml.BotherHandler;
-import jp.sourceforge.mikutoga.xml.SchemaUtil;
-import jp.sourceforge.mikutoga.xml.TogaXmlException;
-import jp.sourceforge.mikutoga.xml.XmlResourceResolver;
+import jp.sfjp.mikutoga.xml.TogaXmlException;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
/**
- * InputSourceからInputStreamを得る。
- * <p>入力ソースには、少なくともバイトストリームか
- * URL文字列(SystemId)のいずれかが設定されていなければならない。
- * @param source 入力ソース
- * @return 入力バイトストリーム
- * @throws IllegalArgumentException 入力ソースの設定が足りない。
- * @throws IOException 入力ソースにアクセス不能。
- */
- private static InputStream openInputSource(InputSource source)
- throws IllegalArgumentException, IOException{
- InputStream is;
-
- is = source.getByteStream();
-
- if(is == null){
- String systemId = source.getSystemId();
- if(systemId == null) throw new IllegalArgumentException();
-
- URL url = new URL(systemId);
- is = url.openStream();
- }
-
- is = new BufferedInputStream(is);
-
- return is;
- }
-
- /**
- * SAXパーサファクトリを生成する。
- * <ul>
- * <li>XML名前空間機能は有効になる。
- * <li>DTDによる形式検証は無効となる。
- * <li>XIncludeによる差し込み機能は無効となる。
- * </ul>
- * @param schema スキーマ
- * @return ファクトリ
- */
- private static SAXParserFactory buildFactory(Schema schema){
- SAXParserFactory factory = SAXParserFactory.newInstance();
-
- factory.setNamespaceAware(true);
- factory.setValidating(false);
- factory.setXIncludeAware(false);
-// factory.setFeature(name, value);
-
- factory.setSchema(schema);
-
- return factory;
- }
-
- /**
- * SAXパーサを生成する。
- * @param schema スキーマ
- * @return SAXパーサ
- */
- private static SAXParser buildParser(Schema schema){
- SAXParserFactory factory = buildFactory(schema);
-
- SAXParser parser;
- try{
- parser = factory.newSAXParser();
- }catch(ParserConfigurationException e){
- assert false;
- throw new AssertionError(e);
- }catch(SAXException e){
- assert false;
- throw new AssertionError(e);
- }
-
-// parser.setProperty(name, value);
-
- return parser;
- }
-
- /**
- * XMLリーダを生成する。
- * <p>エラーハンドラには{@link BotherHandler}が指定される。
- * @param resolver リゾルバ
- * @return XMLリーダ
- */
- private static XMLReader buildReader(XmlResourceResolver resolver){
- Schema schema;
- schema = SchemaUtil.newSchema(resolver, Schema110820.SINGLETON);
-
- SAXParser parser = buildParser(schema);
-
- XMLReader reader;
- try{
- reader = parser.getXMLReader();
- }catch(SAXException e){
- assert false;
- throw new AssertionError(e);
- }
-
- reader.setEntityResolver(resolver);
- reader.setErrorHandler(BotherHandler.HANDLER);
-
- return reader;
- }
-
- /**
* 入力ファイル種別を設定する。
* @param type ファイル種別
* @throws IllegalArgumentException 具体的な種別を渡さなかった
VmdMotion motion = null;
if(this.inTypes.isVmd()){
- InputStream is = openInputSource(source);
+ InputStream is = XmlInputUtil.openInputSource(source);
try{
motion = vmdRead(is);
}finally{
throws IOException,
SAXException,
TogaXmlException {
- XmlResourceResolver resolver = new XmlResourceResolver();
- XMLReader reader = buildReader(resolver);
+ XMLReader reader = XmlInputUtil.buildReader(this.inTypes);
XmlVmdLoader loader = new XmlVmdLoader(reader);
VmdMotion motion = loader.parse(source);
throws IOException, IllegalVmdDataException{
VmdXmlExporter exporter = new VmdXmlExporter();
+ XmlMotionFileType xmlType = this.outTypes.toXmlType();
+ exporter.setXmlFileType(xmlType);
exporter.setNewLine(this.newLine);
exporter.setGenerator(this.generator);
exporter.setQuaternionMode(this.isQuaternionMode);
--- /dev/null
+/*
+ * xml input utility
+ *
+ * License : The MIT License
+ * Copyright(c) 2013 MikuToga Partners
+ */
+
+package jp.sfjp.mikutoga.vmd2xml;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.validation.Schema;
+import jp.sfjp.mikutoga.vmd.model.xml.Schema110820;
+import jp.sfjp.mikutoga.vmd.model.xml.Schema130609;
+import jp.sfjp.mikutoga.xml.BotherHandler;
+import jp.sfjp.mikutoga.xml.LocalXmlResource;
+import jp.sfjp.mikutoga.xml.SchemaUtil;
+import jp.sfjp.mikutoga.xml.XmlResourceResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ * XML入力に関する各種ユーティリティ。
+ */
+final class XmlInputUtil {
+
+ /**
+ * 隠しコンストラクタ。
+ */
+ private XmlInputUtil(){
+ assert false;
+ throw new AssertionError();
+ }
+
+
+ /**
+ * 実在ファイルからXML入力ソースを得る。
+ * @param file 実在ファイル
+ * @return XML入力ソース
+ */
+ static InputSource fileToSource(File file){
+ assert file.exists();
+
+ URI uri = file.toURI();
+
+ URL url;
+ try{
+ url = uri.toURL();
+ }catch(MalformedURLException e){
+ // 実在File由来のURLでは起こりえない
+ assert false;
+ throw new AssertionError(e);
+ }
+
+ String systemId = url.toString();
+
+ InputSource source = new InputSource(systemId);
+
+ return source;
+ }
+
+ /**
+ * InputSourceからInputStreamを得る。
+ * <p>入力ソースには、少なくともバイトストリームか
+ * URL文字列(SystemId)のいずれかが設定されていなければならない。
+ * @param source 入力ソース
+ * @return 入力バイトストリーム
+ * @throws IllegalArgumentException 入力ソースの設定が足りない。
+ * @throws IOException 入力ソースにアクセス不能。
+ */
+ static InputStream openInputSource(InputSource source)
+ throws IllegalArgumentException, IOException{
+ InputStream is;
+
+ is = source.getByteStream();
+
+ if(is == null){
+ String systemId = source.getSystemId();
+ if(systemId == null) throw new IllegalArgumentException();
+
+ URL url = new URL(systemId);
+ is = url.openStream();
+ }
+
+ is = new BufferedInputStream(is);
+
+ return is;
+ }
+
+ /**
+ * SAXパーサファクトリを生成する。
+ * <ul>
+ * <li>XML名前空間機能は有効になる。
+ * <li>DTDによる形式検証は無効となる。
+ * <li>XIncludeによる差し込み機能は無効となる。
+ * </ul>
+ * @param schema スキーマ
+ * @return ファクトリ
+ */
+ private static SAXParserFactory buildFactory(Schema schema){
+ SAXParserFactory factory = SAXParserFactory.newInstance();
+
+ factory.setNamespaceAware(true);
+ factory.setValidating(false);
+ factory.setXIncludeAware(false);
+// factory.setFeature(name, value);
+
+ factory.setSchema(schema);
+
+ return factory;
+ }
+
+ /**
+ * SAXパーサを生成する。
+ * @param schema スキーマ
+ * @return SAXパーサ
+ */
+ private static SAXParser buildParser(Schema schema){
+ SAXParserFactory factory = buildFactory(schema);
+
+ SAXParser parser;
+ try{
+ parser = factory.newSAXParser();
+ }catch(ParserConfigurationException e){
+ assert false;
+ throw new AssertionError(e);
+ }catch(SAXException e){
+ assert false;
+ throw new AssertionError(e);
+ }
+
+// parser.setProperty(name, value);
+
+ return parser;
+ }
+
+ /**
+ * スキーマを生成する。
+ * @param resolver リゾルバ
+ * @param xmlInType 入力XML種別
+ * @return スキーマ
+ */
+ private static Schema builsSchema(XmlResourceResolver resolver,
+ MotionFileType xmlInType ){
+ LocalXmlResource[] schemaArray;
+ switch(xmlInType){
+ case XML_110820:
+ schemaArray = new LocalXmlResource[]{
+ Schema110820.SINGLETON,
+ };
+ break;
+ case XML_130609:
+ schemaArray = new LocalXmlResource[]{
+ Schema130609.SINGLETON,
+ };
+ break;
+ case XML_AUTO:
+ schemaArray = new LocalXmlResource[]{
+ Schema110820.SINGLETON,
+ Schema130609.SINGLETON,
+ };
+ break;
+ default:
+ throw new IllegalStateException();
+ }
+
+ Schema schema = SchemaUtil.newSchema(resolver, schemaArray);
+
+ return schema;
+ }
+
+ /**
+ * XMLリーダを生成する。
+ * <p>エラーハンドラには{@link BotherHandler}が指定される。
+ * @param xmlInType 入力XML種別
+ * @return XMLリーダ
+ */
+ static XMLReader buildReader(MotionFileType xmlInType){
+ XmlResourceResolver resolver = new XmlResourceResolver();
+
+ Schema schema = builsSchema(resolver, xmlInType);
+
+ SAXParser parser = buildParser(schema);
+
+ XMLReader reader;
+ try{
+ reader = parser.getXMLReader();
+ }catch(SAXException e){
+ assert false;
+ throw new AssertionError(e);
+ }
+
+ reader.setEntityResolver(resolver);
+ reader.setErrorHandler(BotherHandler.HANDLER);
+
+ return reader;
+ }
+
+}
<!DOCTYPE xsd:schema [
- <!ENTITY schemaVer "130609A" >
- <!ENTITY schemaNS "http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609A" >
+ <!ENTITY schemaVer "130609" >
+ <!ENTITY schemaNS "http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609" >
]>
package jp.sfjp.mikutoga.vmd2xml;
+import jp.sfjp.mikutoga.vmd.model.xml.XmlMotionFileType;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
@Test
public void testValues() {
System.out.println("values");
- assertEquals(3, MotionFileType.values().length);
+ assertEquals(5, MotionFileType.values().length);
return;
}
assertFalse(MotionFileType.NONE.isXml());
assertFalse(MotionFileType.VMD.isXml());
+ assertTrue(MotionFileType.XML_AUTO.isXml());
assertTrue(MotionFileType.XML_110820.isXml());
+ assertTrue(MotionFileType.XML_130609.isXml());
return;
}
assertFalse(MotionFileType.NONE.isVmd());
assertTrue(MotionFileType.VMD.isVmd());
+ assertFalse(MotionFileType.XML_AUTO.isVmd());
assertFalse(MotionFileType.XML_110820.isVmd());
+ assertFalse(MotionFileType.XML_130609.isVmd());
+
+ return;
+ }
+
+ /**
+ * Test of toXmlType method, of class MotionFileType.
+ */
+ @Test
+ public void testToXmlType() {
+ System.out.println("toXmlType");
+
+ assertSame(XmlMotionFileType.XML_AUTO, MotionFileType.NONE.toXmlType());
+ assertSame(XmlMotionFileType.XML_AUTO, MotionFileType.VMD.toXmlType());
+ assertSame(XmlMotionFileType.XML_AUTO, MotionFileType.XML_AUTO.toXmlType());
+ assertSame(XmlMotionFileType.XML_110820, MotionFileType.XML_110820.toXmlType());
+ assertSame(XmlMotionFileType.XML_130609, MotionFileType.XML_130609.toXmlType());
return;
}
assertFalse(result.needHelp());
assertSame(MotionFileType.VMD, result.getInFileType());
assertEquals("test.vmd", result.getInFilename());
- assertSame(MotionFileType.XML_110820, result.getOutFileType());
+ assertSame(MotionFileType.XML_AUTO, result.getOutFileType());
assertEquals("test.xml", result.getOutFilename());
assertEquals(Vmd2Xml.GENERATOR, result.getGenerator());
assertEquals("\n", result.getNewline());
assertEquals("input", result.getInFilename());
result = OptInfo.parseOption("-i", "input", "-o", "test.xml", "-iform", "xml");
- assertSame(MotionFileType.XML_110820, result.getInFileType());
+ assertSame(MotionFileType.XML_AUTO, result.getInFileType());
result = OptInfo.parseOption("-i", "input", "-o", "test.xml", "-iform", "xml110820");
assertSame(MotionFileType.XML_110820, result.getInFileType());
+ result = OptInfo.parseOption("-i", "input", "-o", "test.xml", "-iform", "xml130609");
+ assertSame(MotionFileType.XML_130609, result.getInFileType());
+
try{
OptInfo.parseOption("-i", "test.vmd", "-o", "output");
fail();
String xmlResource,
String expVmdResource )
throws Exception{
- InputStream xmlis =
- klass.getResourceAsStream(xmlResource);
- assertNotNull(xmlis);
- xmlis = new BufferedInputStream(xmlis);
-
- File destFile = openTempFile();
- OutputStream destOut;
- destOut = new FileOutputStream(destFile);
- destOut = new BufferedOutputStream(destOut);
-
Vmd2XmlConv converter = new Vmd2XmlConv();
- converter.setInType(MotionFileType.XML_110820);
+ converter.setInType(MotionFileType.XML_AUTO);
converter.setOutType(MotionFileType.VMD);
converter.setNewline("\n");
- converter.convert(xmlis, destOut);
-
- xmlis.close();
- destOut.close();
-
- assertSameFile(klass, expVmdResource, destFile);
+ assertConvert(klass, xmlResource, expVmdResource, converter);
return;
}
/**
- * PMDリソースをXMLに変換した結果がXMLリソースに等しいと表明する。
+ * VMDリソースを110820版XMLに変換した結果がXMLリソースに等しいと表明する。
* @param klass リソース元クラス
- * @param pmdResource PMDリソース名
+ * @param vmdResource VMDリソース名
* @param expXmlResource XMLリソース名
* @throws Exception エラー
*/
- public static void assertVmd2Xml(
+ public static void assertVmd2OldXml(
Class<?> klass,
- String pmdResource,
+ String vmdResource,
String expXmlResource )
throws Exception{
Vmd2XmlConv converter = new Vmd2XmlConv();
converter.setNewline("\n");
converter.setGenerator(null);
- assertVmd2Xml(klass, pmdResource, expXmlResource, converter);
+ assertConvert(klass, vmdResource, expXmlResource, converter);
return;
}
/**
- * VMDリソースをXMLに変換した結果がXMLリソースに等しいと表明する。
+ * VMDリソースを130609版XMLに変換した結果がXMLリソースに等しいと表明する。
* @param klass リソース元クラス
- * @param vmdResource PMDリソース名
+ * @param vmdResource VMDリソース名
* @param expXmlResource XMLリソース名
- * @param converter コンバータ
* @throws Exception エラー
*/
- public static void assertVmd2Xml(
+ public static void assertVmd2Xml13(
Class<?> klass,
String vmdResource,
- String expXmlResource,
+ String expXmlResource )
+ throws Exception{
+ Vmd2XmlConv converter = new Vmd2XmlConv();
+ converter.setInType(MotionFileType.VMD);
+ converter.setOutType(MotionFileType.XML_130609);
+ converter.setNewline("\n");
+ converter.setGenerator(null);
+
+ assertConvert(klass, vmdResource, expXmlResource, converter);
+
+ return;
+ }
+
+ /**
+ * コンバータの変換結果がリソースファイルに等しいと表明する。
+ * @param klass リソース元クラス
+ * @param fromResource リソース名
+ * @param toResource 結果リソース名
+ * @param converter コンバータ
+ * @throws Exception エラー
+ */
+ public static void assertConvert(
+ Class<?> klass,
+ String fromResource,
+ String toResource,
Vmd2XmlConv converter )
throws Exception{
InputStream vmdis =
- klass.getResourceAsStream(vmdResource);
+ klass.getResourceAsStream(fromResource);
assertNotNull(vmdis);
vmdis = new BufferedInputStream(vmdis);
vmdis.close();
destOut.close();
- assertSameFile(klass, expXmlResource, destFile);
+ assertSameFile(klass, toResource, destFile);
return;
}
@Test
public void vmd2xml() throws Exception{
System.out.println("vmd2xml");
- assertVmd2Xml(THISCLASS, "camera.vmd", "camera.xml");
+ assertVmd2OldXml(THISCLASS, "camera.vmd", "camera.xml");
return;
}
assertNull(converter.getGenerator());
assertFalse(converter.isQuaterniomMode());
- assertVmd2Xml(THISCLASS, "euler.vmd", "euler.xml", converter);
+ assertConvert(THISCLASS, "euler.vmd", "euler.xml", converter);
return;
}
@Test
public void vmd2xml() throws Exception{
System.out.println("vmd2xml");
- assertVmd2Xml(THISCLASS, "luminous.vmd", "luminous.xml");
+ assertVmd2OldXml(THISCLASS, "luminous.vmd", "luminous.xml");
return;
}
@Test
public void vmd2xml() throws Exception{
System.out.println("vmd2xml");
- assertVmd2Xml(THISCLASS, "minmotion.vmd", "minmotion.xml");
- assertVmd2Xml(THISCLASS, "mincam.vmd", "mincam.xml");
+ assertVmd2OldXml(THISCLASS, "minmotion.vmd", "minmotion.xml");
+ assertVmd2OldXml(THISCLASS, "mincam.vmd", "mincam.xml");
return;
}
@Test
public void vmd2xml() throws Exception{
System.out.println("vmd2xml");
- assertVmd2Xml(THISCLASS, "morph.vmd", "morph.xml");
+ assertVmd2OldXml(THISCLASS, "morph.vmd", "morph.xml");
return;
}
@Test
public void vmd2xml() throws Exception{
System.out.println("vmd2xml");
- assertVmd2Xml(THISCLASS, "motion.vmd", "motion.xml");
+ assertVmd2OldXml(THISCLASS, "motion.vmd", "motion.xml");
return;
}
@Test
public void vmd2xml() throws Exception{
System.out.println("vmd2xml");
- assertVmd2Xml(THISCLASS, "newvmd.vmd", "newvmd.xml");
+ assertVmd2OldXml(THISCLASS, "newvmd.vmd", "newvmd.xml");
return;
}
@Test
public void vmd2xml() throws Exception{
System.out.println("vmd2xml");
- assertVmd2Xml(THISCLASS, "allShadow.vmd", "allShadow.xml");
+ assertVmd2OldXml(THISCLASS, "allShadow.vmd", "allShadow.xml");
return;
}
@Test
public void vmd2xml() throws Exception{
System.out.println("vmd2xml");
- assertVmd2Xml(THISCLASS, "onlyBone.vmd", "onlyBone.xml");
- assertVmd2Xml(THISCLASS, "onlyMorph.vmd", "onlyMorph.xml");
- assertVmd2Xml(THISCLASS, "onlyCamera.vmd", "onlyCamera.xml");
- assertVmd2Xml(THISCLASS, "onlyLuminous.vmd", "onlyLuminous.xml");
- assertVmd2Xml(THISCLASS, "onlyShadow.vmd", "onlyShadow.xml");
+ assertVmd2OldXml(THISCLASS, "onlyBone.vmd", "onlyBone.xml");
+ assertVmd2OldXml(THISCLASS, "onlyMorph.vmd", "onlyMorph.xml");
+ assertVmd2OldXml(THISCLASS, "onlyCamera.vmd", "onlyCamera.xml");
+ assertVmd2OldXml(THISCLASS, "onlyLuminous.vmd", "onlyLuminous.xml");
+ assertVmd2OldXml(THISCLASS, "onlyShadow.vmd", "onlyShadow.xml");
return;
}
--- /dev/null
+/*
+ */
+
+package testdata.vmd130609.flag;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static testdata.CnvAssert.*;
+
+/**
+ *
+ */
+public class FlagTest {
+
+ static Class<?> THISCLASS = FlagTest.class;
+
+ public FlagTest() {
+ assert this.getClass() == THISCLASS;
+ return;
+ }
+
+ @BeforeClass
+ public static void setUpClass() {
+ }
+
+ @AfterClass
+ public static void tearDownClass() {
+ }
+
+ @Before
+ public void setUp() {
+ }
+
+ @After
+ public void tearDown() {
+ }
+
+ @Test
+ public void vmd2xml() throws Exception{
+ System.out.println("vmd2xml");
+ assertVmd2Xml13(THISCLASS, "flag.vmd", "flag.xml");
+ return;
+ }
+
+ @Test
+ public void xml2vmd() throws Exception{
+ System.out.println("xml2vmd");
+ assertXml2Vmd(THISCLASS, "flag.xml", "flag.vmd");
+ return;
+ }
+
+}
--- /dev/null
+/*
+ */
+
+package testdata.vmd130609.minimum;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static testdata.CnvAssert.*;
+
+/**
+ *
+ */
+public class MinimumTest {
+
+ static Class<?> THISCLASS = MinimumTest.class;
+
+ public MinimumTest() {
+ assert this.getClass() == THISCLASS;
+ return;
+ }
+
+ @BeforeClass
+ public static void setUpClass() {
+ }
+
+ @AfterClass
+ public static void tearDownClass() {
+ }
+
+ @Before
+ public void setUp() {
+ }
+
+ @After
+ public void tearDown() {
+ }
+
+ @Test
+ public void vmd2xml() throws Exception{
+ System.out.println("vmd2xml");
+ assertVmd2Xml13(THISCLASS, "minimum.vmd", "minimum.xml");
+ return;
+ }
+
+ @Test
+ public void xml2vmd() throws Exception{
+ System.out.println("xml2vmd");
+ assertXml2Vmd(THISCLASS, "minimum.xml", "minimum.vmd");
+ return;
+ }
+
+}
--- /dev/null
+/*
+ */
+
+package testdata.vmd130609.small;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static testdata.CnvAssert.*;
+
+/**
+ *
+ */
+public class SmallTest {
+
+ static Class<?> THISCLASS = SmallTest.class;
+
+ public SmallTest() {
+ assert this.getClass() == THISCLASS;
+ return;
+ }
+
+ @BeforeClass
+ public static void setUpClass() {
+ }
+
+ @AfterClass
+ public static void tearDownClass() {
+ }
+
+ @Before
+ public void setUp() {
+ }
+
+ @After
+ public void tearDown() {
+ }
+
+ @Test
+ public void vmd2xml() throws Exception{
+ System.out.println("vmd2xml");
+ assertVmd2Xml13(THISCLASS, "onlyFlag.vmd", "onlyFlag.xml");
+ return;
+ }
+
+ @Test
+ public void xml2vmd() throws Exception{
+ System.out.println("xml2vmd");
+ assertXml2Vmd(THISCLASS, "onlyFlag.xml", "onlyFlag.vmd");
+ return;
+ }
+
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ motion-data(*.vmd) on XML
+-->
+
+
+<vmdMotion
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609
+ http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-130609.xsd"
+ version="130609"
+>
+
+<!-- 初音ミク -->
+<modelName name="初音ミク" />
+
+<boneMotionSequence>
+</boneMotionSequence>
+
+<morphSequence>
+</morphSequence>
+
+<flagSequence>
+
+ <flagMotion frame="0" showModel="true" >
+
+ <!-- ネクタイIK -->
+ <ikSwitch name="ネクタイIK" valid="true" />
+
+ <!-- 左髪IK -->
+ <ikSwitch name="左髪IK" valid="true" />
+
+ <!-- 右髪IK -->
+ <ikSwitch name="右髪IK" valid="true" />
+
+ <!-- 左足IK --> <!-- Perhaps : [leg IK_L] -->
+ <ikSwitch name="左足IK" valid="true" />
+
+ <!-- 右足IK --> <!-- Perhaps : [leg IK_R] -->
+ <ikSwitch name="右足IK" valid="true" />
+
+ <!-- 左つま先IK --> <!-- Perhaps : [toe IK_L] -->
+ <ikSwitch name="左つま先IK" valid="true" />
+
+ <!-- 右つま先IK --> <!-- Perhaps : [toe IK_R] -->
+ <ikSwitch name="右つま先IK" valid="true" />
+
+ </flagMotion>
+
+ <flagMotion frame="5" showModel="false" >
+
+ <!-- ネクタイIK -->
+ <ikSwitch name="ネクタイIK" valid="true" />
+
+ <!-- 左髪IK -->
+ <ikSwitch name="左髪IK" valid="true" />
+
+ <!-- 右髪IK -->
+ <ikSwitch name="右髪IK" valid="true" />
+
+ <!-- 左足IK --> <!-- Perhaps : [leg IK_L] -->
+ <ikSwitch name="左足IK" valid="false" />
+
+ <!-- 右足IK --> <!-- Perhaps : [leg IK_R] -->
+ <ikSwitch name="右足IK" valid="false" />
+
+ <!-- 左つま先IK --> <!-- Perhaps : [toe IK_L] -->
+ <ikSwitch name="左つま先IK" valid="true" />
+
+ <!-- 右つま先IK --> <!-- Perhaps : [toe IK_R] -->
+ <ikSwitch name="右つま先IK" valid="true" />
+
+ </flagMotion>
+
+</flagSequence>
+
+</vmdMotion>
+
+<!-- EOF -->
<vmdMotion
- xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609A"
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609A
- http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-130609A.xsd"
- version="130609A"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609
+ http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-130609.xsd"
+ version="130609"
>
<!-- [NAMELESS] -->
<vmdMotion
- xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609A"
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609A
- http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-130609A.xsd"
- version="130609A"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/130609
+ http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-130609.xsd"
+ version="130609"
>
<!-- [NAMELESS] -->
</morphSequence>
<flagSequence>
- <flagMotion frame="9" showModel="true" />
- <flagMotion frame="99" showModel="false">
- <ikSwitch name="IKBONE1" valid="true" />
- <ikSwitch name="IKBONE2" valid="false" />
- </flagMotion>
+
+ <flagMotion frame="9" showModel="true" />
+
+ <flagMotion frame="99" showModel="false" >
+
+ <!-- IKBONE1 -->
+ <ikSwitch name="IKBONE1" valid="false" />
+
+ </flagMotion>
+
</flagSequence>
</vmdMotion>