X.XXX.X (20XX-XX_XX)
・Maven3対応。
+ ・オイラー角出力時の精度を向上させた。
+ ・ベジェ補間パラメータ冗長部がMMDの版により異なるため、検査をやめた。
1.101.2 (2011-08-25)
・初回リリース。
<dependency>
<groupId>jp.sourceforge.mikutoga</groupId>
<artifactId>togagem</artifactId>
- <version>2.101.3-SNAPSHOT</version>
+ <version>2.102.3-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
- <version>1.1.1</version>
+ <version>1.2</version>
<configuration>
<rules>
<requireMavenVersion>
- <version>[2.2,)</version>
+ <version>[3.0,)</version>
</requireMavenVersion>
<requireJavaVersion>
<version>[1.6,)</version>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
- <version>3.0</version>
+ <version>3.1</version>
<configuration>
<source>1.6</source> <!-- for NetBeans IDE -->
<target>1.6</target>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
- <version>2.12.4</version>
+ <version>2.14.1</version>
<configuration>
<skipTests>false</skipTests>
<enableAssertions>true</enableAssertions>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
- <version>2.9.1</version>
+ <version>2.10</version>
<!-- config from property value -->
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
- <version>2.7.1</version>
+ <version>3.0.1</version>
<configuration>
<targetJdk>${maven.compiler.target}</targetJdk>
<rulesets>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
- <version>2.12.4</version>
+ <version>2.14.1</version>
<configuration>
<showSuccess>false</showSuccess>
</configuration>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
- <version>2.9.1</version>
+ <version>2.10</version>
<configuration>
<skip>false</skip>
<!-- config from property value -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
- <version>2.7.1</version>
+ <version>3.0.1</version>
<configuration>
<skip>false</skip>
<targetJdk>${maven.compiler.target}</targetJdk>
<module name="ArrayTrailingComma" />
<module name="AvoidInlineConditionals" />
<module name="CovariantEquals" />
- <module name="DoubleCheckedLocking" />
+<!-- <module name="DoubleCheckedLocking" /> 5.6 obsolete -->
<module name="EmptyStatement" />
<module name="EqualsAvoidNull" />
<module name="EqualsHashCode" />
<!--
PMD用ルールセット定義
- PMD [ http://pmd.sourceforge.net/ ] 4.2.5 以降用に記述されています。
+ PMD [ http://pmd.sourceforge.net/ ] 5.0 以降用に記述されています。
Copyright(c) 2010 olyutorskii
-->
<ruleset
- xmlns="http://pmd.sf.net/ruleset/1.0.0"
+ xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0
- http://pmd.sf.net/ruleset_xml_schema.xsd"
- xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"
+ xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0
+ http://pmd.sourceforge.net/ruleset_2_0_0.xsd"
name="Custom ruleset"
>
custom rulesets for project
</description>
- <rule ref="rulesets/basic.xml">
- <exclude name="UnnecessaryReturn" />
- </rule>
+<!--
+ <rule ref="rulesets/java/android.xml" />
+-->
+
+ <rule ref="rulesets/java/basic.xml" />
- <rule ref="rulesets/braces.xml">
+ <rule ref="rulesets/java/braces.xml">
<exclude name="IfElseStmtsMustUseBraces" />
<exclude name="IfStmtsMustUseBraces" />
</rule>
- <rule ref="rulesets/codesize.xml">
+ <rule ref="rulesets/java/clone.xml" />
+
+ <rule ref="rulesets/java/codesize.xml">
<exclude name="TooManyMethods" />
</rule>
- <rule ref="rulesets/codesize.xml/TooManyMethods">
+ <rule ref="rulesets/java/codesize.xml/TooManyMethods">
<properties>
<property name="maxmethods" value="25"/>
</properties>
</rule>
- <rule ref="rulesets/clone.xml" />
+ <rule ref="rulesets/java/comments.xml">
+ <exclude name="CommentSize" />
+ </rule>
+ <rule ref="rulesets/java/comments.xml/CommentSize" >
+ <properties>
+ <property name="maxLines" value="25"/>
+ </properties>
+ </rule>
- <rule ref="rulesets/controversial.xml">
+ <rule ref="rulesets/java/controversial.xml">
<exclude name="NullAssignment" />
<exclude name="OnlyOneReturn" />
<exclude name="DefaultPackage" />
<exclude name="DataflowAnomalyAnalysis" />
<exclude name="AvoidUsingShortType" />
+ <exclude name="AvoidLiteralsInIfCondition" />
+ <exclude name="UseConcurrentHashMap" />
</rule>
- <rule ref="rulesets/coupling.xml" />
+ <rule ref="rulesets/java/coupling.xml">
+ <exclude name="LawOfDemeter" />
+ <exclude name="LoosePackageCoupling" /> <!-- 3.0.1 では読めない -->
+ </rule>
- <rule ref="rulesets/design.xml">
+ <rule ref="rulesets/java/design.xml">
<exclude name="ConfusingTernary" />
<exclude name="UnnecessaryLocalBeforeReturn" />
+ <exclude name="FieldDeclarationsShouldBeAtStartOfClass" />
</rule>
- <rule ref="rulesets/finalizers.xml" />
+ <rule ref="rulesets/java/empty.xml" />
+
+ <rule ref="rulesets/java/finalizers.xml" />
- <rule ref="rulesets/imports.xml" />
+ <rule ref="rulesets/java/imports.xml" />
- <rule ref="rulesets/logging-java.xml" />
+<!--
+ <rule ref="rulesets/java/j2ee.xml" />
+ <rule ref="rulesets/java/javabeans.xml" />
+-->
+
+ <rule ref="rulesets/java/junit.xml" />
+
+<!--
+ <rule ref="rulesets/java/logging-jakarta-commons.xml" />
+-->
- <rule ref="rulesets/migrating.xml" />
- <rule ref="rulesets/migrating_to_15.xml" />
+ <rule ref="rulesets/java/logging-java.xml" />
- <rule ref="rulesets/naming.xml">
+ <rule ref="rulesets/java/migrating.xml" />
+<!--
+ <rule ref="rulesets/java/migrating_to_XX.xml" />
+-->
+
+ <rule ref="rulesets/java/naming.xml">
<exclude name="ShortVariable" />
<exclude name="LongVariable" />
<exclude name="AvoidFieldNameMatchingMethodName" />
</rule>
- <rule ref="rulesets/naming.xml/LongVariable">
+ <rule ref="rulesets/java/naming.xml/LongVariable">
<properties>
<property name="minimum" value="25"/>
</properties>
</rule>
- <rule ref="rulesets/optimizations.xml">
+ <rule ref="rulesets/java/optimizations.xml">
<exclude name="LocalVariableCouldBeFinal" />
<exclude name="MethodArgumentCouldBeFinal" />
+ <exclude name="RedundantFieldInitializer" />
</rule>
- <rule ref="rulesets/strictexception.xml">
+ <rule ref="rulesets/java/strictexception.xml">
<exclude name="AvoidThrowingNullPointerException" />
</rule>
- <rule ref="rulesets/strings.xml" />
+ <rule ref="rulesets/java/strings.xml" />
- <rule ref="rulesets/sunsecure.xml" />
+ <rule ref="rulesets/java/sunsecure.xml" />
- <rule ref="rulesets/typeresolution.xml" />
+ <rule ref="rulesets/java/typeresolution.xml" />
+
+ <rule ref="rulesets/java/unnecessary.xml">
+ <exclude name="UnnecessaryReturn" />
+ <exclude name="UselessParentheses" />
+ </rule>
- <rule ref="rulesets/unusedcode.xml" />
+ <rule ref="rulesets/java/unusedcode.xml" />
</ruleset>
package jp.sourceforge.mikutoga.vmd.model;
-import jp.sourceforge.mikutoga.math.MkPos3D;
-import jp.sourceforge.mikutoga.math.MkQuat;
+import jp.sfjp.mikutoga.math.MkPos3D;
+import jp.sfjp.mikutoga.math.MkQuat;
import jp.sourceforge.mikutoga.vmd.AbstractNumbered;
/**
package jp.sourceforge.mikutoga.vmd.model;
-import jp.sourceforge.mikutoga.math.MkPos3D;
+import jp.sfjp.mikutoga.math.MkPos3D;
import jp.sourceforge.mikutoga.vmd.AbstractNumbered;
/**
import java.io.OutputStream;
import java.util.LinkedList;
import java.util.List;
-import jp.sourceforge.mikutoga.binio.BinaryExporter;
-import jp.sourceforge.mikutoga.binio.IllegalTextExportException;
-import jp.sourceforge.mikutoga.math.MkPos3D;
-import jp.sourceforge.mikutoga.math.MkQuat;
+import jp.sfjp.mikutoga.bin.export.BinaryExporter;
+import jp.sfjp.mikutoga.bin.export.IllegalTextExportException;
+import jp.sfjp.mikutoga.math.MkPos3D;
+import jp.sfjp.mikutoga.math.MkQuat;
import jp.sourceforge.mikutoga.vmd.VmdConst;
import jp.sourceforge.mikutoga.vmd.model.BezierParam;
import jp.sourceforge.mikutoga.vmd.model.BoneMotion;
package jp.sourceforge.mikutoga.vmd.model.binio;
-import jp.sourceforge.mikutoga.math.MkPos3D;
-import jp.sourceforge.mikutoga.math.MkQuat;
-import jp.sourceforge.mikutoga.parser.MmdFormatException;
-import jp.sourceforge.mikutoga.parser.ParseStage;
+import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
+import jp.sfjp.mikutoga.bin.parser.ParseStage;
+import jp.sfjp.mikutoga.math.MkPos3D;
+import jp.sfjp.mikutoga.math.MkQuat;
import jp.sourceforge.mikutoga.vmd.model.BezierParam;
import jp.sourceforge.mikutoga.vmd.model.BoneMotion;
import jp.sourceforge.mikutoga.vmd.model.MorphMotion;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
-import jp.sourceforge.mikutoga.binio.BinaryExporter;
-import jp.sourceforge.mikutoga.math.MkPos3D;
+import jp.sfjp.mikutoga.bin.export.BinaryExporter;
+import jp.sfjp.mikutoga.math.MkPos3D;
import jp.sourceforge.mikutoga.vmd.model.BezierParam;
import jp.sourceforge.mikutoga.vmd.model.CameraMotion;
import jp.sourceforge.mikutoga.vmd.model.CameraRotation;
package jp.sourceforge.mikutoga.vmd.model.binio;
import java.util.List;
-import jp.sourceforge.mikutoga.parser.MmdFormatException;
-import jp.sourceforge.mikutoga.parser.ParseStage;
+import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
+import jp.sfjp.mikutoga.bin.parser.ParseStage;
import jp.sourceforge.mikutoga.vmd.model.BezierParam;
import jp.sourceforge.mikutoga.vmd.model.CameraMotion;
import jp.sourceforge.mikutoga.vmd.model.CameraRotation;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
-import jp.sourceforge.mikutoga.binio.BinaryExporter;
+import jp.sfjp.mikutoga.bin.export.BinaryExporter;
import jp.sourceforge.mikutoga.vmd.model.LuminousColor;
import jp.sourceforge.mikutoga.vmd.model.LuminousMotion;
import jp.sourceforge.mikutoga.vmd.model.LuminousVector;
package jp.sourceforge.mikutoga.vmd.model.binio;
import java.util.List;
-import jp.sourceforge.mikutoga.parser.MmdFormatException;
-import jp.sourceforge.mikutoga.parser.ParseStage;
+import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
+import jp.sfjp.mikutoga.bin.parser.ParseStage;
import jp.sourceforge.mikutoga.vmd.model.LuminousColor;
import jp.sourceforge.mikutoga.vmd.model.LuminousMotion;
import jp.sourceforge.mikutoga.vmd.model.LuminousVector;
import java.io.IOException;
import java.io.OutputStream;
-import jp.sourceforge.mikutoga.binio.BinaryExporter;
-import jp.sourceforge.mikutoga.binio.IllegalTextExportException;
+import jp.sfjp.mikutoga.bin.export.BinaryExporter;
+import jp.sfjp.mikutoga.bin.export.IllegalTextExportException;
import jp.sourceforge.mikutoga.vmd.IllegalVmdDataException;
import jp.sourceforge.mikutoga.vmd.VmdConst;
import jp.sourceforge.mikutoga.vmd.model.VmdMotion;
import java.io.IOException;
import java.io.InputStream;
-import jp.sourceforge.mikutoga.parser.MmdFormatException;
+import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
import jp.sourceforge.mikutoga.vmd.model.VmdMotion;
import jp.sourceforge.mikutoga.vmd.parser.VmdParser;
parser.setCameraHandler(cameraBuilder);
parser.setLightingHandler(lightingBuilder);
+ parser.setStrictMode(false);
+
parser.parseVmd();
return result;
--- /dev/null
+/*
+ * xml resources for VMD-XML
+ *
+ * License : The MIT License
+ * Copyright(c) 2013 MikuToga Partners
+ */
+
+package jp.sourceforge.mikutoga.vmd.model.xml;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import jp.sourceforge.mikutoga.xml.LocalSchema;
+
+/**
+ * 110820形式XML各種リソースの定義。
+ */
+public class Schema110820 extends LocalSchema{
+
+ /** XML名前空間識別子。 */
+ public static final String NS_VMDXML =
+ "http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820";
+ /** XMLスキーマURI名。 */
+ public static final String SCHEMA_VMDXML =
+ "http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-110820.xsd";
+ /** 定義の版数。 */
+ public static final String VER_VMDXML =
+ "110820";
+ /** ローカルなスキーマファイル名。 */
+ public static final String LOCAL_SCHEMA_VMDXML =
+ "resources/vmdxml-110820.xsd";
+
+ private static final URI URI_SCHEMA_VMDXML = URI.create(SCHEMA_VMDXML);
+ private static final URI RES_SCHEMA_VMDXML;
+
+ private static final Class<?> THISCLASS = Schema110820.class;
+
+ static{
+ try{
+ RES_SCHEMA_VMDXML =
+ THISCLASS.getResource(LOCAL_SCHEMA_VMDXML).toURI();
+ }catch(URISyntaxException e){
+ throw new ExceptionInInitializerError(e);
+ }
+ }
+
+
+ /**
+ * 隠しコンストラクタ。
+ */
+ public Schema110820(){
+ super();
+ assert this.getClass() == THISCLASS;
+ return;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ * @return {@inheritDoc}
+ */
+ @Override
+ public URI getOriginalSchema(){
+ return URI_SCHEMA_VMDXML;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @return {@inheritDoc}
+ */
+ @Override
+ public URI getLocalSchema(){
+ return RES_SCHEMA_VMDXML;
+ }
+
+}
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
-import jp.sourceforge.mikutoga.math.EulerYXZ;
-import jp.sourceforge.mikutoga.math.MkPos3D;
-import jp.sourceforge.mikutoga.math.MkQuat;
-import jp.sourceforge.mikutoga.typical.TypicalBone;
-import jp.sourceforge.mikutoga.typical.TypicalMorph;
+import jp.sfjp.mikutoga.math.EulerYXZ;
+import jp.sfjp.mikutoga.math.MkPos3D;
+import jp.sfjp.mikutoga.math.MkQuat;
+import jp.sfjp.mikutoga.typical.TypicalBone;
+import jp.sfjp.mikutoga.typical.TypicalMorph;
import jp.sourceforge.mikutoga.vmd.IllegalVmdDataException;
import jp.sourceforge.mikutoga.vmd.VmdConst;
import jp.sourceforge.mikutoga.vmd.model.BezierParam;
/**
* Generatorメタ情報を設定する。
* @param generatorArg Generatorメタ情報
- * @throws NullPointerException 引数がnull
*/
- public void setGenerator(String generatorArg)
- throws NullPointerException{
- if(generatorArg == null) throw new NullPointerException();
+ public void setGenerator(String generatorArg){
this.generator = generatorArg;
return;
}
*/
private static XmlResourceResolver createResolver(){
XmlResourceResolver resolver = new XmlResourceResolver();
- resolver.putURIMap(URI_SCHEMA_VMDXML, RES_SCHEMA_VMDXML);
-// resolver.putURIMap(URI_DTD_VMDXML, RES_DTD_VMDXML);
+ resolver.putRedirected(URI_SCHEMA_VMDXML, RES_SCHEMA_VMDXML);
+// resolver.putRedirected(URI_DTD_VMDXML, RES_DTD_VMDXML);
return resolver;
}
import java.io.IOException;
import java.text.MessageFormat;
import javax.xml.parsers.DocumentBuilder;
-import jp.sourceforge.mikutoga.math.MkPos3D;
-import jp.sourceforge.mikutoga.math.MkQuat;
+import jp.sfjp.mikutoga.math.MkPos3D;
+import jp.sfjp.mikutoga.math.MkQuat;
import jp.sourceforge.mikutoga.vmd.model.BezierParam;
import jp.sourceforge.mikutoga.vmd.model.BoneMotion;
import jp.sourceforge.mikutoga.vmd.model.MorphMotion;
float xRad = (float)StrictMath.toRadians(xDeg);
float yRad = (float)StrictMath.toRadians(yDeg);
float zRad = (float)StrictMath.toRadians(zDeg);
- rotation.readEulerYXZ(xRad, yRad, zRad);
+ rotation.setEulerYXZ(xRad, yRad, zRad);
BezierParam rotationCurve = boneMotion.getIntpltRotation();
Xml.buildCurve(boneRotationElem, rotationCurve);
package jp.sourceforge.mikutoga.vmd.model.xml;
import java.util.List;
-import jp.sourceforge.mikutoga.math.MkPos3D;
+import jp.sfjp.mikutoga.math.MkPos3D;
import jp.sourceforge.mikutoga.vmd.model.BezierParam;
import jp.sourceforge.mikutoga.vmd.model.CameraMotion;
import jp.sourceforge.mikutoga.vmd.model.CameraRotation;
--- /dev/null
+/*
+ * MMD motion file types.
+ *
+ * License : The MIT License
+ * Copyright(c) 2013 MikuToga Partners
+ */
+
+package jp.sourceforge.mikutoga.vmd2xml;
+
+/**
+ * モーションファイル種別。
+ */
+public enum MotionFileType {
+
+ /**
+ * 不明。
+ */
+ NONE,
+
+ /**
+ * MikuMikuDance ver7 前後で読み書きが可能なVMDファイル。
+ */
+ VMD,
+
+ /**
+ * スキーマ
+ * http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-110820.xsd
+ * で定義されたXMLファイル。
+ */
+ XML_110820,
+
+ ;
+
+
+ /**
+ * コンストラクタ。
+ */
+ private MotionFileType(){
+ return;
+ }
+
+ /**
+ * ファイル種別がXMLか判定する。
+ * @return XMLならtrue
+ */
+ public boolean isXml(){
+ boolean result;
+
+ switch(this){
+ case XML_110820:
+ result = true;
+ break;
+ default:
+ result = false;
+ break;
+ }
+
+ return result;
+ }
+
+ /**
+ * ファイル種別がVMDか判定する。
+ * @return VMDならtrue
+ */
+ public boolean isVmd(){
+ boolean result;
+
+ switch(this){
+ case VMD:
+ result = true;
+ break;
+ default:
+ result = false;
+ break;
+ }
+
+ return result;
+ }
+
+}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.io.PrintStream;
+import java.nio.channels.FileChannel;
import java.text.MessageFormat;
import java.util.Properties;
import javax.xml.parsers.DocumentBuilder;
-import jp.sourceforge.mikutoga.binio.FileUtils;
-import jp.sourceforge.mikutoga.parser.MmdFormatException;
+import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
import jp.sourceforge.mikutoga.vmd.IllegalVmdDataException;
import jp.sourceforge.mikutoga.vmd.model.VmdMotion;
import jp.sourceforge.mikutoga.vmd.model.binio.VmdExporter;
*/
public final class Vmd2Xml {
- private static final Class<?> THISCLASS;
- private static final String APPNAME;
- private static final String APPVER;
- private static final String APPLICENSE;
- private static final String APPURL;
-
private static final int EXIT_OK = 0;
private static final int EXIT_IOERR = 1;
private static final int EXIT_ENVERR = 4;
private static final int EXIT_VMDERR = 7;
private static final int EXIT_XMLERR = 8;
+ /** アプリ名。 */
+ public static final String APPNAME;
+ /** バージョン識別子。 */
+ public static final String APPVER;
+ /** ライセンス種別。 */
+ public static final String APPLICENSE;
+
+ private static final String APPURL;
+
+ private static final Class<?> THISCLASS;
+
private static final String ERRMSG_TXTONLY =
"ERROR : {0}\n";
private static final String ERRMSG_SAXPARSE =
"ERROR : {0}\nline={1}, columun={2}\n";
+ private static final PrintStream ERROUT = System.err;
+
static{
THISCLASS = Vmd2Xml.class;
- InputStream verDef =
+ InputStream ver =
THISCLASS.getResourceAsStream("resources/version.properties");
Properties verProps = new Properties();
try{
try{
- verProps.load(verDef);
+ verProps.load(ver);
}finally{
- verDef.close();
+ ver.close();
}
}catch(IOException e){
throw new ExceptionInInitializerError(e);
/**
- * 隠しコンストラクタ。
+ * ダミーコンストラクタ。
*/
private Vmd2Xml(){
super();
/**
+ * VMを終了させる。
+ * @param code 終了コード
+ */
+ private static void exit(int code){
+ System.exit(code);
+ assert false;
+ throw new AssertionError();
+ }
+
+ /**
+ * 標準エラー出力に文字列出力を行う。
+ * @param obj 文字列
+ */
+ @SuppressWarnings("PMD.SystemPrintln")
+ private static void errprint(Object obj){
+ ERROUT.print(obj.toString());
+ return;
+ }
+
+ /**
+ * エラーを表示した後VMを終了させる。
+ * @param code 終了コード
+ * @param text メッセージ
+ */
+ private static void errExit(int code, CharSequence text){
+ errprint("ERROR:\n");
+ errprint(text);
+ exit(code);
+ return;
+ }
+
+ /**
+ * 入出力エラー処理。
+ * 例外を出力してVM終了する。
+ * @param ex 例外
+ */
+ private static void ioError(IOException ex){
+ errprint(ex);
+ errprint('\n');
+ exit(EXIT_IOERR);
+
+ return;
+ }
+
+ /**
+ * XML構文エラー処理。
+ * 例外を出力してVM終了する。
+ * @param ex 例外
+ */
+ private static void xmlError(SAXException ex){
+ if(ex instanceof SAXParseException){
+ xmlError((SAXParseException)ex);
+ }
+
+ String txt = ex.getLocalizedMessage();
+ String message = MessageFormat.format(ERRMSG_TXTONLY, txt);
+ errprint(message);
+
+ exit(EXIT_XMLERR);
+
+ return;
+ }
+
+ /**
+ * XML構文エラー処理。
+ * 例外を出力してVM終了する。
+ * @param ex 例外
+ */
+ private static void xmlError(SAXParseException ex){
+ String txt = ex.getLocalizedMessage();
+ int line = ex.getLineNumber();
+ int col = ex.getColumnNumber();
+
+ String message =
+ MessageFormat.format(ERRMSG_SAXPARSE, txt, line, col);
+ errprint(message);
+
+ exit(EXIT_XMLERR);
+
+ return;
+ }
+
+ /**
+ * XML構文エラー処理。
+ * 例外を出力してVM終了する。
+ * @param ex 例外
+ */
+ private static void xmlError(TogaXmlException ex){
+ String txt = ex.getLocalizedMessage();
+ String message = MessageFormat.format(ERRMSG_TXTONLY, txt);
+ errprint(message);
+
+ exit(EXIT_XMLERR);
+
+ return;
+ }
+
+ /**
+ * VMDファイルフォーマットエラー処理。
+ * 例外を出力してVM終了する。
+ * @param ex 例外
+ */
+ private static void vmdError(MmdFormatException ex){
+ errprint(ex);
+ errprint('\n');
+ ex.printStackTrace(ERROUT);
+ exit(EXIT_VMDERR);
+
+ return;
+ }
+
+ /**
+ * 内部エラー処理。
+ * 例外を出力してVM終了する。
+ * @param ex 例外
+ */
+ private static void internalError(Throwable ex){
+ errprint(ex);
+ errprint('\n');
+ ex.printStackTrace(ERROUT);
+ exit(EXIT_INTERR);
+
+ return;
+ }
+
+ /**
+ * JREのバージョン判定を行う。
+ * 不適切ならVMごと終了。
+ */
+ private static void checkJRE(){
+ Package jrePackage = java.lang.Object.class.getPackage();
+ if( ! jrePackage.isCompatibleWith("1.6")){
+ errExit(EXIT_ENVERR, "You need JRE 1.6 or later.\n");
+ }
+ return;
+ }
+
+ /**
+ * ヘルプメッセージを出力する。
+ */
+ private static void putHelp(){
+ StringBuilder text = new StringBuilder();
+
+ text.append(APPNAME).append(' ').append(APPVER).append('\n');
+ text.append(" License : ").append(APPLICENSE).append('\n');
+ text.append(" ").append(APPURL).append('\n');
+ text.append('\n');
+ text.append(ArgInfo.CMD_HELP);
+
+ errprint(text);
+
+ return;
+ }
+
+ /**
+ * ファイルサイズを0に切り詰める。
+ * @param file ファイル
+ * @throws IOException 入出力エラー
+ */
+ private static void trunc(File file) throws IOException{
+ if( ! file.exists() ) return;
+ if( ! file.isFile() ) return;
+
+ if(file.length() <= 0L) return;
+
+ FileOutputStream foStream = new FileOutputStream(file);
+ try{
+ FileChannel channnel = foStream.getChannel();
+ try{
+ channnel.truncate(0L);
+ }finally{
+ channnel.close();
+ }
+ }finally{
+ foStream.close();
+ }
+
+ return;
+ }
+
+ /**
+ * 入力ストリームを得る。
+ * @param fileName 入力ファイル名
+ * @return 入力ストリーム
+ * @throws FileNotFoundException 入力ファイルが見つからない。
+ */
+ private static InputStream openInputStream(String fileName)
+ throws FileNotFoundException {
+ File file = new File(fileName);
+ InputStream result = new FileInputStream(file);
+ result = new BufferedInputStream(result);
+ return result;
+ }
+
+ /**
+ * 出力ストリームを得る。
+ * @param fileName 出力ファイル名
+ * @return 出力ストリーム
+ * @throws FileNotFoundException 出力ファイルが見つからない
+ * @throws IOException 出力エラー
+ */
+ private static OutputStream openTruncatedOutputStream(String fileName)
+ throws FileNotFoundException, IOException {
+ File file = new File(fileName);
+ trunc(file);
+ OutputStream result = new FileOutputStream(file, false);
+ result = new BufferedOutputStream(result);
+ return result;
+ }
+
+ /**
* Mainエントリ。
* @param args コマンドパラメータ
*/
}
/**
- * JREのバージョン判定を行う。
- * 不適切ならVMごと終了。
+ * 既に存在する通常ファイルか否か判定する。
+ * @param file 判定対象
+ * @return 既に存在する通常ファイルならtrue
*/
- private static void checkJRE(){
- Package jrePackage = java.lang.Object.class.getPackage();
- if( ! jrePackage.isCompatibleWith("1.6")){
- errExit(EXIT_ENVERR, "You need JRE 1.6 or later.\n");
- }
- return;
+ private static boolean isExistsNormalFile(File file){
+ if( ! file.exists() ) return false;
+ if( ! file.isFile() ) return false;
+ return true;
}
/**
- * ヘルプメッセージを出力する。
+ * 既に存在する特殊ファイルか否か判定する。
+ * @param file 判定対象
+ * @return 既に存在する特殊ファイルならtrue
*/
- private static void putHelp(){
- StringBuilder text = new StringBuilder();
-
- text.append(APPNAME).append(' ').append(APPVER).append('\n');
- text.append(" License : ").append(APPLICENSE).append('\n');
- text.append(" ").append(APPURL).append('\n');
- text.append('\n');
- text.append(ArgInfo.CMD_HELP);
-
- errprint(text);
-
- return;
+ private static boolean isExistsUnnormalFile(File file){
+ if( ! file.exists() ) return false;
+ if( file.isFile() ) return false;
+ return true;
}
/**
File iFile = new File(input);
File oFile = new File(output);
- if( ! FileUtils.isExistsNormalFile(iFile) ){
+ if( ! isExistsNormalFile(iFile) ){
errExit(EXIT_IOERR, "Can't find input file:"
+ iFile.getAbsolutePath() + '\n');
}
if(argInfo.isForceMode()){
- if(FileUtils.isExistsUnnormalFile(oFile)){
+ if(isExistsUnnormalFile(oFile)){
errExit(EXIT_IOERR, oFile.getAbsolutePath()
+ " is not file.\n");
}
return;
}
- /**
- * 入力ストリームを得る。
- * @param fileName 入力ファイル名
- * @return 入力ストリーム
- * @throws FileNotFoundException 入力ファイルが見つからない。
- */
- private static InputStream openInputStream(String fileName)
- throws FileNotFoundException {
- File file = new File(fileName);
- InputStream result = new FileInputStream(file);
- result = new BufferedInputStream(result);
- return result;
- }
-
- /**
- * 出力ストリームを得る。
- * @param fileName 出力ファイル名
- * @return 出力ストリーム
- * @throws FileNotFoundException 出力ファイルが見つからない
- * @throws IOException 出力エラー
- */
- private static OutputStream openTruncatedOutputStream(String fileName)
- throws FileNotFoundException, IOException {
- File file = new File(fileName);
- FileUtils.trunc(file);
- OutputStream result = new FileOutputStream(file, false);
- result = new BufferedOutputStream(result);
- return result;
- }
-
- /**
- * 入出力エラー処理。
- * 例外を出力してVM終了する。
- * @param ex 例外
- */
- private static void ioError(IOException ex){
- errprint(ex);
- errprint('\n');
- exit(EXIT_IOERR);
-
- return;
- }
-
- /**
- * 内部エラー処理。
- * 例外を出力してVM終了する。
- * @param ex 例外
- */
- private static void internalError(Throwable ex){
- errprint(ex);
- errprint('\n');
- ex.printStackTrace(System.err);
- exit(EXIT_INTERR);
-
- return;
- }
-
- /**
- * VMDファイルフォーマットエラー処理。
- * 例外を出力してVM終了する。
- * @param ex 例外
- */
- private static void vmdError(MmdFormatException ex){
- errprint(ex);
- errprint('\n');
- ex.printStackTrace(System.err);
- exit(EXIT_VMDERR);
-
- return;
- }
-
- /**
- * XML構文エラー処理。
- * 例外を出力してVM終了する。
- * @param ex 例外
- */
- private static void xmlError(SAXException ex){
- if(ex instanceof SAXParseException){
- xmlError((SAXParseException)ex);
- }
-
- String txt = ex.getLocalizedMessage();
- String message = MessageFormat.format(ERRMSG_TXTONLY, txt);
- errprint(message);
-
- exit(EXIT_XMLERR);
-
- return;
- }
-
- /**
- * XML構文エラー処理。
- * 例外を出力してVM終了する。
- * @param ex 例外
- */
- private static void xmlError(SAXParseException ex){
- String txt = ex.getLocalizedMessage();
- int line = ex.getLineNumber();
- int col = ex.getColumnNumber();
-
- String message =
- MessageFormat.format(ERRMSG_SAXPARSE, txt, line, col);
- errprint(message);
-
- exit(EXIT_XMLERR);
-
- return;
- }
-
- /**
- * XML構文エラー処理。
- * 例外を出力してVM終了する。
- * @param ex 例外
- */
- private static void xmlError(TogaXmlException ex){
- String txt = ex.getLocalizedMessage();
- String message = MessageFormat.format(ERRMSG_TXTONLY, txt);
- errprint(message);
-
- exit(EXIT_XMLERR);
-
- return;
- }
-
- /**
- * VMを終了する。
- * @param code 終了コード
- */
- private static void exit(int code){
- System.exit(code);
- assert false;
- throw new AssertionError();
- }
-
- /**
- * 標準エラー出力に文字列出力を行う。
- * @param obj 文字列
- */
- @SuppressWarnings("PMD.SystemPrintln")
- private static void errprint(Object obj){
- System.err.print(obj.toString());
- return;
- }
-
- /**
- * エラーを表示した後VMを終了させる。
- * @param code 終了コード
- * @param text メッセージ
- */
- private static void errExit(int code, CharSequence text){
- errprint("ERROR:\n");
- errprint(text);
- exit(code);
- return;
- }
-
}
--- /dev/null
+/*
+ * vmd 2 xml converter
+ *
+ * License : The MIT License
+ * Copyright(c) 2013 MikuToga Partners
+ */
+
+package jp.sourceforge.mikutoga.vmd2xml;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.validation.Schema;
+import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
+import jp.sourceforge.mikutoga.vmd.IllegalVmdDataException;
+import jp.sourceforge.mikutoga.vmd.model.VmdMotion;
+import jp.sourceforge.mikutoga.vmd.model.binio.VmdExporter;
+import jp.sourceforge.mikutoga.vmd.model.binio.VmdLoader;
+import jp.sourceforge.mikutoga.vmd.model.xml.Schema110820;
+import jp.sourceforge.mikutoga.vmd.model.xml.VmdXmlExporter;
+import jp.sourceforge.mikutoga.vmd.model.xml.Xml2VmdLoader;
+import jp.sourceforge.mikutoga.xml.BotherHandler;
+import jp.sourceforge.mikutoga.xml.LocalSchema;
+import jp.sourceforge.mikutoga.xml.TogaXmlException;
+import jp.sourceforge.mikutoga.xml.XmlResourceResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * VMD-XML間コンバータ本体。
+ */
+public class Vmd2XmlConv {
+
+ private MotionFileType inTypes = MotionFileType.NONE;
+ private MotionFileType outTypes = MotionFileType.NONE;
+ private String newLine = "\r\n";
+ private String generator = null;
+
+
+ /**
+ * コンストラクタ。
+ */
+ public Vmd2XmlConv(){
+ super();
+ return;
+ }
+
+
+ /**
+ * ドキュメントビルダファクトリを初期化する。
+ * @param builderFactory ドキュメントビルダファクトリ
+ */
+ private static void initBuilderFactory(
+ DocumentBuilderFactory builderFactory ){
+ builderFactory.setCoalescing(true);
+ builderFactory.setExpandEntityReferences(true);
+ builderFactory.setIgnoringComments(true);
+ builderFactory.setIgnoringElementContentWhitespace(false);
+ builderFactory.setNamespaceAware(true);
+ builderFactory.setValidating(false);
+ builderFactory.setXIncludeAware(false);
+
+// builderFactory.setFeature(name, value);
+// builderFactory.setAttribute(name, value);
+
+ return;
+ }
+
+ /**
+ * DOMビルダ生成。
+ * @return DOMビルダ
+ */
+ private DocumentBuilder buildBuilder(){
+ XmlResourceResolver resolver = new XmlResourceResolver();
+
+ Schema schema;
+ schema = LocalSchema.newSchema(resolver, new Schema110820());
+
+ DocumentBuilderFactory builderFactory =
+ DocumentBuilderFactory.newInstance();
+ initBuilderFactory(builderFactory);
+ builderFactory.setSchema(schema);
+
+ DocumentBuilder result;
+ try{
+ result = builderFactory.newDocumentBuilder();
+ }catch(ParserConfigurationException e){
+ assert false;
+ throw new AssertionError(e);
+ }
+ result.setEntityResolver(resolver);
+ result.setErrorHandler(BotherHandler.HANDLER);
+
+ return result;
+ }
+
+ /**
+ * 入力ファイル種別を設定する。
+ * @param type ファイル種別
+ * @throws IllegalArgumentException 具体的な種別を渡さなかった
+ */
+ public void setInType(MotionFileType type){
+ if(type == null) throw new NullPointerException();
+ if(type == MotionFileType.NONE) throw new IllegalArgumentException();
+ this.inTypes = type;
+ return;
+ }
+
+ /**
+ * 入力ファイル種別を返す。
+ * @return ファイル種別
+ */
+ public MotionFileType getInTypes(){
+ return this.inTypes;
+ }
+
+ /**
+ * 出力ファイル種別を設定する。
+ * @param type ファイル種別
+ * @throws IllegalArgumentException 具体的な種別を渡さなかった
+ */
+ public void setOutType(MotionFileType type){
+ if(type == null) throw new NullPointerException();
+ if(type == MotionFileType.NONE) throw new IllegalArgumentException();
+ this.outTypes = type;
+ return;
+ }
+
+ /**
+ * 出力ファイル種別を返す。
+ * @return ファイル種別
+ */
+ public MotionFileType getOutTypes(){
+ return this.outTypes;
+ }
+
+ /**
+ * XML出力用改行文字列を設定する。
+ * @param newline 改行文字
+ */
+ public void setNewline(String newline){
+ this.newLine = newline;
+ return;
+ }
+
+ /**
+ * XML出力用改行文字列を返す。
+ * @return 改行文字
+ */
+ public String getNewLine(){
+ return this.newLine;
+ }
+
+ /**
+ * ジェネレータ名を設定する。
+ * @param generator ジェネレータ名。表示したくない場合はnull
+ */
+ public void setGenerator(String generator){
+ this.generator = generator;
+ return;
+ }
+
+ /**
+ * ジェネレータ名を返す。
+ * @return ジェネレータ名。非表示の場合はnullを返す。
+ */
+ public String getGenerator(){
+ return this.generator;
+ }
+
+ /**
+ * ファイル変換を行う。
+ * @param is 入力ストリーム
+ * @param os 出力ストリーム
+ * @throws IOException 入力エラー
+ * @throws MmdFormatException フォーマットエラー
+ * @throws SAXException XMLエラー
+ * @throws TogaXmlException XMLエラー
+ * @throws IllegalVmdDataException 内部エラー
+ */
+ public void convert(InputStream is, OutputStream os)
+ throws IOException,
+ MmdFormatException,
+ SAXException,
+ TogaXmlException,
+ IllegalVmdDataException {
+ VmdMotion motion = readMotion(is);
+ writeMotion(motion, os);
+ return;
+ }
+
+ /**
+ * モーションファイルを読み込む。
+ * @param is 入力ストリーム
+ * @return モーションデータ
+ * @throws IOException 入力エラー
+ * @throws MmdFormatException フォーマットエラー
+ * @throws SAXException XMLエラー
+ * @throws TogaXmlException XMLエラー
+ * @throws IllegalStateException ファイル種別がまた指定されていない
+ */
+ public VmdMotion readMotion(InputStream is)
+ throws IOException,
+ MmdFormatException,
+ SAXException,
+ TogaXmlException {
+ VmdMotion motion = null;
+
+ if(this.inTypes.isVmd()){
+ motion = vmdRead(is);
+ }else if(this.inTypes.isXml()){
+ motion = xmlRead(is);
+ }else{
+ throw new IllegalStateException();
+ }
+
+ return motion;
+ }
+
+ /**
+ * モーションファイルを出力する。
+ * @param motion モーションデータ
+ * @param os 出力ストリーム
+ * @throws IOException 出力エラー
+ * @throws IllegalVmdDataException データの不備
+ * @throws IllegalStateException ファイル種別がまた指定されていない
+ */
+ public void writeMotion(VmdMotion motion, OutputStream os)
+ throws IOException,
+ IllegalVmdDataException {
+ if(this.outTypes.isVmd()){
+ vmdOut(motion, os);
+ }else if(this.outTypes.isXml()){
+ xmlOut(motion, os);
+ }else{
+ throw new IllegalStateException();
+ }
+
+ return;
+ }
+
+ /**
+ * VMDファイルからモーションデータを読み込む。
+ * @param is 入力ストリーム
+ * @return モーションデータ
+ * @throws IOException 入力エラー
+ * @throws MmdFormatException 不正なVMDファイルフォーマット
+ */
+ private VmdMotion vmdRead(InputStream is)
+ throws IOException, MmdFormatException{
+ VmdMotion motion = VmdLoader.load(is);
+ return motion;
+ }
+
+ /**
+ * XMLファイルからモーションデータを読み込む。
+ * @param is 入力ストリーム
+ * @return モーションデータ
+ * @throws IOException 入力エラー
+ * @throws SAXException XML構文エラー
+ * @throws TogaXmlException 不正なXMLデータ
+ */
+ private VmdMotion xmlRead(InputStream is)
+ throws IOException,
+ SAXException,
+ TogaXmlException {
+ InputSource source = new InputSource(is);
+ VmdMotion result = xmlRead(source);
+ return result;
+ }
+
+ /**
+ * XMLファイルからモーションデータを読み込む。
+ * @param source 入力ソース
+ * @return モーションデータ
+ * @throws IOException 入力エラー
+ * @throws SAXException XML構文エラー
+ * @throws TogaXmlException 不正なXMLデータ
+ */
+ private VmdMotion xmlRead(InputSource source)
+ throws IOException,
+ SAXException,
+ TogaXmlException {
+ DocumentBuilder builder = buildBuilder();
+ Xml2VmdLoader loader = new Xml2VmdLoader(builder);
+ VmdMotion motion = loader.parse(source);
+ return motion;
+ }
+
+ /**
+ * モーションデータをVMDファイルに出力する。
+ * @param motion モーションデータ
+ * @param ostream 出力ストリーム
+ * @throws IOException 出力エラー
+ * @throws IllegalVmdDataException 不正なモーションデータ
+ */
+ private void vmdOut(VmdMotion motion, OutputStream ostream)
+ throws IOException, IllegalVmdDataException{
+ VmdExporter exporter = new VmdExporter(ostream);
+ exporter.dumpVmdMotion(motion);
+ ostream.close();
+ return;
+ }
+
+ /**
+ * モーションデータをXMLファイルに出力する。
+ * @param motion モーションデータ
+ * @param ostream 出力ストリーム
+ * @throws IOException 出力エラー
+ * @throws IllegalVmdDataException 不正なモーションデータ
+ */
+ private void xmlOut(VmdMotion motion, OutputStream ostream)
+ throws IOException, IllegalVmdDataException{
+ VmdXmlExporter exporter = new VmdXmlExporter(ostream);
+
+ exporter.setNewLine(this.newLine);
+ exporter.setGenerator(this.generator);
+
+ exporter.putVmdXml(motion);
+
+ exporter.close();
+
+ return;
+ }
+
+}
--- /dev/null
+/*
+ */
+
+package testdata;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import jp.sourceforge.mikutoga.vmd2xml.MotionFileType;
+import jp.sourceforge.mikutoga.vmd2xml.Vmd2XmlConv;
+
+import static org.junit.Assert.*;
+
+/**
+ *
+ */
+public class CnvAssert {
+
+ private CnvAssert(){
+ }
+
+ /**
+ * テスト出力用テンポラリファイルの生成。
+ * テスト終了時(VM終了時)に消える。
+ * @return テンポラリファイル
+ * @throws IOException エラー
+ */
+ public static File openTempFile() throws IOException{
+ File file = File.createTempFile("vmd2xml", null);
+ file.deleteOnExit();
+ return file;
+ }
+
+ /**
+ * XMLリソースをVMDに変換した結果がVMDリソースに等しいと表明する。
+ * @param klass リソース元クラス
+ * @param xmlResource XMLリソース名
+ * @param expVmdResource VMDリソース名
+ * @throws Exception エラー
+ */
+ public static void assertXml2Vmd(
+ Class<?> klass,
+ 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.setOutType(MotionFileType.VMD);
+ converter.setNewline("\n");
+
+ converter.convert(xmlis, destOut);
+
+ xmlis.close();
+ destOut.close();
+
+ assertSameFile(klass, expVmdResource, destFile);
+
+ return;
+ }
+
+ /**
+ * PMDリソースをXMLに変換した結果がXMLリソースに等しいと表明する。
+ * @param klass リソース元クラス
+ * @param pmdResource PMDリソース名
+ * @param expXmlResource XMLリソース名
+ * @throws Exception エラー
+ */
+ public static void assertVmd2Xml(
+ Class<?> klass,
+ String pmdResource,
+ String expXmlResource )
+ throws Exception{
+ InputStream pmdis =
+ klass.getResourceAsStream(pmdResource);
+ assertNotNull(pmdis);
+ pmdis = new BufferedInputStream(pmdis);
+
+ File destFile = openTempFile();
+ OutputStream destOut;
+ destOut = new FileOutputStream(destFile);
+ destOut = new BufferedOutputStream(destOut);
+
+ Vmd2XmlConv converter = new Vmd2XmlConv();
+ converter.setInType(MotionFileType.VMD);
+ converter.setOutType(MotionFileType.XML_110820);
+ converter.setNewline("\n");
+ converter.setGenerator(null);
+
+ converter.convert(pmdis, destOut);
+
+ pmdis.close();
+ destOut.close();
+
+ assertSameFile(klass, expXmlResource, destFile);
+
+ return;
+ }
+
+ /**
+ * リソースとファイルの内容が等しいと表明する。
+ * @param klass リソース元クラス
+ * @param resourceName リソース名
+ * @param resFile ファイル
+ * @throws IOException 入力エラー
+ */
+ public static void assertSameFile(
+ Class<?> klass,
+ String resourceName,
+ File resFile )
+ throws IOException{
+ InputStream expis =
+ klass.getResourceAsStream(resourceName);
+ assertNotNull(expis);
+
+ InputStream resIn = new FileInputStream(resFile);
+
+ try{
+ assertSameStream(expis, resIn);
+ }finally{
+ expis.close();
+ resIn.close();
+ }
+
+ return;
+ }
+
+ /**
+ * 2つの入力ストリーム内容が等しいと表明する。
+ * @param expIn 期待する入力ストリーム
+ * @param resIn 結果入力ストリーム
+ * @throws IOException 入力エラー
+ */
+ public static void assertSameStream(InputStream expIn, InputStream resIn)
+ throws IOException{
+ InputStream expis = new BufferedInputStream(expIn);
+ InputStream resis = new BufferedInputStream(resIn);
+
+
+ for(;;){
+ int expCh = expis.read();
+ int resCh = resis.read();
+
+ assertEquals(expCh, resCh);
+
+ if(expCh < 0) break;
+ }
+
+ return;
+ }
+
+}
--- /dev/null
+/*
+ */
+
+package testdata.vmd110820.camera;
+
+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 CameraTest {
+
+ static Class<?> THISCLASS = CameraTest.class;
+
+ public CameraTest() {
+ 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");
+ assertVmd2Xml(THISCLASS, "camera.vmd", "camera.xml");
+ return;
+ }
+
+ @Test
+ public void xml2vmd() throws Exception{
+ System.out.println("xml2vmd");
+ assertXml2Vmd(THISCLASS, "camera.xml", "camera.vmd");
+ return;
+ }
+
+}
--- /dev/null
+/*
+ */
+
+package testdata.vmd110820.luminous;
+
+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 LuminousTest {
+
+ static Class<?> THISCLASS = LuminousTest.class;
+
+ public LuminousTest() {
+ 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");
+ assertVmd2Xml(THISCLASS, "luminous.vmd", "luminous.xml");
+ return;
+ }
+
+ @Test
+ public void xml2vmd() throws Exception{
+ System.out.println("xml2vmd");
+ assertXml2Vmd(THISCLASS, "luminous.xml", "luminous.vmd");
+ return;
+ }
+
+}
--- /dev/null
+/*
+ */
+
+package testdata.vmd110820.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");
+ assertVmd2Xml(THISCLASS, "minmotion.vmd", "minmotion.xml");
+ assertVmd2Xml(THISCLASS, "mincam.vmd", "mincam.xml");
+ return;
+ }
+
+ @Test
+ public void xml2vmd() throws Exception{
+ System.out.println("xml2vmd");
+ assertXml2Vmd(THISCLASS, "minmotion.xml", "minmotion.vmd");
+ assertXml2Vmd(THISCLASS, "mincam.xml", "mincam.vmd");
+ return;
+ }
+
+}
--- /dev/null
+/*
+ */
+
+package testdata.vmd110820.shadow;
+
+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 ShadowTest {
+
+ static Class<?> THISCLASS = ShadowTest.class;
+
+ public ShadowTest() {
+ 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");
+ assertVmd2Xml(THISCLASS, "allShadow.vmd", "allShadow.xml");
+ return;
+ }
+
+ @Test
+ public void xml2vmd() throws Exception{
+ System.out.println("xml2vmd");
+ assertXml2Vmd(THISCLASS, "allShadow.xml", "allShadow.vmd");
+ return;
+ }
+
+}
--- /dev/null
+/*
+ */
+
+package testdata.vmd110820.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");
+ 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");
+ return;
+ }
+
+ @Test
+ public void xml2vmd() throws Exception{
+ System.out.println("xml2vmd");
+ assertXml2Vmd(THISCLASS, "onlyBone.xml", "onlyBone.vmd");
+ assertXml2Vmd(THISCLASS, "onlyMorph.xml", "onlyMorph.vmd");
+ assertXml2Vmd(THISCLASS, "onlyCamera.xml", "onlyCamera.vmd");
+ assertXml2Vmd(THISCLASS, "onlyLuminous.xml", "onlyLuminous.vmd");
+ assertXml2Vmd(THISCLASS, "onlyShadow.xml", "onlyShadow.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/110820"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820
+ http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-110820.xsd"
+ version="110820"
+>
+
+<!--
+ motion interpolation is defined by Bezier-cubic-curve.
+ implicit bezier curve point : P0=(0,0) P3=(127,127)
+ defLinear : MMD default linear curve. P1=(20,20) P2=(107,107) [DEFAULT]
+ defEaseInOut : MMD default ease-in-out curve. P1=(64,0) P2=(64,127)
+-->
+<!--
+ camera-rotation has polar-coordinates parameters.
+ xRad = -radian(UI_X) [latitude]
+ yRad = radian(UI_Y) [longitude]
+ zRad = radian(UI_Z) [roll]
+ range = -(UI_RANGE)
+-->
+<cameraSequence>
+
+ <cameraMotion frame="0" >
+ <cameraTarget xPos="0.0" yPos="10.0" zPos="0.0" />
+ <cameraRotation xRad="0.0" yRad="0.0" zRad="0.0" />
+ <cameraRange range="-35.0" />
+ <projection vertDeg="45" />
+ </cameraMotion>
+
+ <cameraMotion frame="5" hasPerspective="false" >
+ <cameraTarget xPos="0.0" yPos="0.0" zPos="0.0" >
+ <!-- X-Y-Z interpolation *3 -->
+ <bezier p1x="10" p1y="20" p2x="107" p2y="107" />
+ <defLinear />
+ <bezier p1x="30" p1y="20" p2x="107" p2y="107" />
+ </cameraTarget>
+ <cameraRotation xRad="-1.5707974" yRad="1.5707974" zRad="-1.5707974" >
+ <bezier p1x="40" p1y="20" p2x="107" p2y="107" />
+ </cameraRotation>
+ <cameraRange range="-0.0" >
+ <bezier p1x="50" p1y="20" p2x="107" p2y="107" />
+ </cameraRange>
+ <projection vertDeg="1" >
+ <bezier p1x="60" p1y="20" p2x="107" p2y="107" />
+ </projection>
+ </cameraMotion>
+
+ <cameraMotion frame="10" >
+ <cameraTarget xPos="0.0" yPos="10.0" zPos="-10.0" >
+ <!-- X-Y-Z interpolation *3 -->
+ <defLinear />
+ <defEaseInOut />
+ <defLinear />
+ </cameraTarget>
+ <cameraRotation xRad="0.0" yRad="0.0" zRad="0.0" />
+ <cameraRange range="5.0" />
+ <projection vertDeg="125" />
+ </cameraMotion>
+
+</cameraSequence>
+
+<luminousSequence>
+</luminousSequence>
+
+<!--
+ UI_VALUE = EFFECTIVE_RANGE * 100 ???
+ rawParam = 0.1 - (UI_VALUE / 1.0E+5)
+
+ NONE : no self-shadow
+ MODE_1 : reduce shadow-quality suddenly at range
+ MODE_2 : reduce shadow-quality gradually with range
+-->
+<shadowSequence>
+</shadowSequence>
+
+</vmdMotion>
+
+<!-- EOF -->
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ motion-data(*.vmd) on XML
+-->
+
+
+<vmdMotion
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820
+ http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-110820.xsd"
+ version="110820"
+>
+
+<!--
+ motion interpolation is defined by Bezier-cubic-curve.
+ implicit bezier curve point : P0=(0,0) P3=(127,127)
+ defLinear : MMD default linear curve. P1=(20,20) P2=(107,107) [DEFAULT]
+ defEaseInOut : MMD default ease-in-out curve. P1=(64,0) P2=(64,127)
+-->
+<!--
+ camera-rotation has polar-coordinates parameters.
+ xRad = -radian(UI_X) [latitude]
+ yRad = radian(UI_Y) [longitude]
+ zRad = radian(UI_Z) [roll]
+ range = -(UI_RANGE)
+-->
+<cameraSequence>
+</cameraSequence>
+
+<luminousSequence>
+
+ <luminousAct frame="0" >
+ <lumiColor rCol="0.602" gCol="0.602" bCol="0.602" />
+ <lumiDirection xVec="-0.5" yVec="-1.0" zVec="0.5" />
+ </luminousAct>
+
+ <luminousAct frame="5" >
+ <lumiColor rCol="0.0" gCol="0.0" bCol="0.0" />
+ <lumiDirection xVec="-1.0" yVec="-1.0" zVec="-1.0" />
+ </luminousAct>
+
+ <luminousAct frame="10" >
+ <lumiColor rCol="0.99609375" gCol="0.99609375" bCol="0.99609375" />
+ <lumiDirection xVec="1.0" yVec="1.0" zVec="1.0" />
+ </luminousAct>
+
+ <luminousAct frame="15" >
+ <lumiColor rCol="0.99609375" gCol="0.99609375" bCol="0.99609375" />
+ <lumiDirection xVec="0.0" yVec="0.0" zVec="0.0" />
+ </luminousAct>
+
+</luminousSequence>
+
+<!--
+ UI_VALUE = EFFECTIVE_RANGE * 100 ???
+ rawParam = 0.1 - (UI_VALUE / 1.0E+5)
+
+ NONE : no self-shadow
+ MODE_1 : reduce shadow-quality suddenly at range
+ MODE_2 : reduce shadow-quality gradually with range
+-->
+<shadowSequence>
+</shadowSequence>
+
+</vmdMotion>
+
+<!-- EOF -->
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ motion-data(*.vmd) on XML
+-->
+
+
+<vmdMotion
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820
+ http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-110820.xsd"
+ version="110820"
+>
+
+<!--
+ motion interpolation is defined by Bezier-cubic-curve.
+ implicit bezier curve point : P0=(0,0) P3=(127,127)
+ defLinear : MMD default linear curve. P1=(20,20) P2=(107,107) [DEFAULT]
+ defEaseInOut : MMD default ease-in-out curve. P1=(64,0) P2=(64,127)
+-->
+<!--
+ camera-rotation has polar-coordinates parameters.
+ xRad = -radian(UI_X) [latitude]
+ yRad = radian(UI_Y) [longitude]
+ zRad = radian(UI_Z) [roll]
+ range = -(UI_RANGE)
+-->
+<cameraSequence>
+</cameraSequence>
+
+<luminousSequence>
+</luminousSequence>
+
+<!--
+ UI_VALUE = EFFECTIVE_RANGE * 100 ???
+ rawParam = 0.1 - (UI_VALUE / 1.0E+5)
+
+ NONE : no self-shadow
+ MODE_1 : reduce shadow-quality suddenly at range
+ MODE_2 : reduce shadow-quality gradually with range
+-->
+<shadowSequence>
+</shadowSequence>
+
+</vmdMotion>
+
+<!-- EOF -->
version="110820"
>
-<meta name="generator" content="Vmd2XML 1.101.3-SNAPSHOT" />
-
<!-- -->
<modelName name="" />
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ motion-data(*.vmd) on XML
+-->
+
+
+<vmdMotion
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820
+ http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-110820.xsd"
+ version="110820"
+>
+
+<!--
+ motion interpolation is defined by Bezier-cubic-curve.
+ implicit bezier curve point : P0=(0,0) P3=(127,127)
+ defLinear : MMD default linear curve. P1=(20,20) P2=(107,107) [DEFAULT]
+ defEaseInOut : MMD default ease-in-out curve. P1=(64,0) P2=(64,127)
+-->
+<!--
+ camera-rotation has polar-coordinates parameters.
+ xRad = -radian(UI_X) [latitude]
+ yRad = radian(UI_Y) [longitude]
+ zRad = radian(UI_Z) [roll]
+ range = -(UI_RANGE)
+-->
+<cameraSequence>
+</cameraSequence>
+
+<luminousSequence>
+</luminousSequence>
+
+<!--
+ UI_VALUE = EFFECTIVE_RANGE * 100 ???
+ rawParam = 0.1 - (UI_VALUE / 1.0E+5)
+
+ NONE : no self-shadow
+ MODE_1 : reduce shadow-quality suddenly at range
+ MODE_2 : reduce shadow-quality gradually with range
+-->
+<shadowSequence>
+ <shadowAct frame="0" mode="NONE" rawParam="0.1" /> <!-- UI:0 -->
+ <shadowAct frame="5" mode="MODE_1" rawParam="0.01125" /> <!-- UI:8875 -->
+ <shadowAct frame="10" mode="MODE_2" rawParam="1.0E-5" /> <!-- UI:9999 -->
+</shadowSequence>
+
+</vmdMotion>
+
+<!-- EOF -->
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ motion-data(*.vmd) on XML
+-->
+
+
+<vmdMotion
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820
+ http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-110820.xsd"
+ version="110820"
+>
+
+<!-- model -->
+<modelName name="model" />
+
+<!--
+ bone-rotation has Quaternion parameters [boneRotQuat]
+ or YXZ-Euler angles [boneRotEyxz].
+ Quaternion is strongly recommended if you are data-exchanging.
+-->
+<!--
+ motion interpolation is defined by Bezier-cubic-curve.
+ implicit bezier curve point : P0=(0,0) P3=(127,127)
+ defLinear : MMD default linear curve. P1=(20,20) P2=(107,107) [DEFAULT]
+ defEaseInOut : MMD default ease-in-out curve. P1=(64,0) P2=(64,127)
+-->
+<boneMotionSequence>
+
+ <!-- センター --> <!-- Perhaps : [center] -->
+ <bonePart name="センター" >
+
+ <boneMotion frame="0" >
+ <boneRotQuat
+ qx="0.0"
+ qy="0.0"
+ qz="0.0"
+ qw="1.0"
+ />
+ </boneMotion>
+
+ </bonePart>
+
+</boneMotionSequence>
+
+<morphSequence>
+</morphSequence>
+
+</vmdMotion>
+
+<!-- EOF -->
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ motion-data(*.vmd) on XML
+-->
+
+
+<vmdMotion
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820
+ http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-110820.xsd"
+ version="110820"
+>
+
+<!--
+ motion interpolation is defined by Bezier-cubic-curve.
+ implicit bezier curve point : P0=(0,0) P3=(127,127)
+ defLinear : MMD default linear curve. P1=(20,20) P2=(107,107) [DEFAULT]
+ defEaseInOut : MMD default ease-in-out curve. P1=(64,0) P2=(64,127)
+-->
+<!--
+ camera-rotation has polar-coordinates parameters.
+ xRad = -radian(UI_X) [latitude]
+ yRad = radian(UI_Y) [longitude]
+ zRad = radian(UI_Z) [roll]
+ range = -(UI_RANGE)
+-->
+<cameraSequence>
+
+ <cameraMotion frame="0" >
+ <cameraTarget xPos="0.0" yPos="10.0" zPos="0.0" />
+ <cameraRotation xRad="0.0" yRad="0.0" zRad="0.0" />
+ <cameraRange range="-35.0" />
+ <projection vertDeg="45" />
+ </cameraMotion>
+
+</cameraSequence>
+
+<luminousSequence>
+</luminousSequence>
+
+<!--
+ UI_VALUE = EFFECTIVE_RANGE * 100 ???
+ rawParam = 0.1 - (UI_VALUE / 1.0E+5)
+
+ NONE : no self-shadow
+ MODE_1 : reduce shadow-quality suddenly at range
+ MODE_2 : reduce shadow-quality gradually with range
+-->
+<shadowSequence>
+</shadowSequence>
+
+</vmdMotion>
+
+<!-- EOF -->
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ motion-data(*.vmd) on XML
+-->
+
+
+<vmdMotion
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820
+ http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-110820.xsd"
+ version="110820"
+>
+
+<!--
+ motion interpolation is defined by Bezier-cubic-curve.
+ implicit bezier curve point : P0=(0,0) P3=(127,127)
+ defLinear : MMD default linear curve. P1=(20,20) P2=(107,107) [DEFAULT]
+ defEaseInOut : MMD default ease-in-out curve. P1=(64,0) P2=(64,127)
+-->
+<!--
+ camera-rotation has polar-coordinates parameters.
+ xRad = -radian(UI_X) [latitude]
+ yRad = radian(UI_Y) [longitude]
+ zRad = radian(UI_Z) [roll]
+ range = -(UI_RANGE)
+-->
+<cameraSequence>
+</cameraSequence>
+
+<luminousSequence>
+
+ <luminousAct frame="0" >
+ <lumiColor rCol="0.602" gCol="0.602" bCol="0.602" />
+ <lumiDirection xVec="-0.5" yVec="-1.0" zVec="0.5" />
+ </luminousAct>
+
+</luminousSequence>
+
+<!--
+ UI_VALUE = EFFECTIVE_RANGE * 100 ???
+ rawParam = 0.1 - (UI_VALUE / 1.0E+5)
+
+ NONE : no self-shadow
+ MODE_1 : reduce shadow-quality suddenly at range
+ MODE_2 : reduce shadow-quality gradually with range
+-->
+<shadowSequence>
+</shadowSequence>
+
+</vmdMotion>
+
+<!-- EOF -->
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ motion-data(*.vmd) on XML
+-->
+
+
+<vmdMotion
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820
+ http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-110820.xsd"
+ version="110820"
+>
+
+<!-- model -->
+<modelName name="model" />
+
+<!--
+ bone-rotation has Quaternion parameters [boneRotQuat]
+ or YXZ-Euler angles [boneRotEyxz].
+ Quaternion is strongly recommended if you are data-exchanging.
+-->
+<!--
+ motion interpolation is defined by Bezier-cubic-curve.
+ implicit bezier curve point : P0=(0,0) P3=(127,127)
+ defLinear : MMD default linear curve. P1=(20,20) P2=(107,107) [DEFAULT]
+ defEaseInOut : MMD default ease-in-out curve. P1=(64,0) P2=(64,127)
+-->
+<boneMotionSequence>
+</boneMotionSequence>
+
+<morphSequence>
+
+ <!-- あ --> <!-- Perhaps : [a] -->
+ <morphPart name="あ" >
+ <morphMotion frame="0" flex="0.5" />
+ </morphPart>
+
+</morphSequence>
+
+</vmdMotion>
+
+<!-- EOF -->
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ motion-data(*.vmd) on XML
+-->
+
+
+<vmdMotion
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/vmdxml/110820
+ http://mikutoga.sourceforge.jp/xml/xsd/vmdxml-110820.xsd"
+ version="110820"
+>
+
+<!--
+ motion interpolation is defined by Bezier-cubic-curve.
+ implicit bezier curve point : P0=(0,0) P3=(127,127)
+ defLinear : MMD default linear curve. P1=(20,20) P2=(107,107) [DEFAULT]
+ defEaseInOut : MMD default ease-in-out curve. P1=(64,0) P2=(64,127)
+-->
+<!--
+ camera-rotation has polar-coordinates parameters.
+ xRad = -radian(UI_X) [latitude]
+ yRad = radian(UI_Y) [longitude]
+ zRad = radian(UI_Z) [roll]
+ range = -(UI_RANGE)
+-->
+<cameraSequence>
+</cameraSequence>
+
+<luminousSequence>
+</luminousSequence>
+
+<!--
+ UI_VALUE = EFFECTIVE_RANGE * 100 ???
+ rawParam = 0.1 - (UI_VALUE / 1.0E+5)
+
+ NONE : no self-shadow
+ MODE_1 : reduce shadow-quality suddenly at range
+ MODE_2 : reduce shadow-quality gradually with range
+-->
+<shadowSequence>
+ <shadowAct frame="0" mode="MODE_1" rawParam="0.01125" /> <!-- UI:8875 -->
+</shadowSequence>
+
+</vmdMotion>
+
+<!-- EOF -->