X.XXX.X (20XX-XX-XX)
・Maven3対応。
・XML出力改行コードの指定が可能になる。
+ ・モーフ数0のモデルデータを読み書きできないバグに対処。(チケット#23394)
1.102.4 (2010-10-09)
・TogaGem1.105.2のバグ修正(接続ボーンを持たない剛体の件)に対処。
* Copyright(c) 2010 MikuToga Partners
*/
-package jp.sourceforge.mikutoga.pmd.model.xml;
+package jp.sfjp.mikutoga.pmd.xml101009;
import java.awt.Color;
import java.io.IOException;
import jp.sourceforge.mikutoga.xml.XmlResourceResolver;
/**
- * XML形式でPMDモデルデータを出力する。
+ * 101009形式XMLでPMDモデルデータを出力する。
*/
-public class PmdXmlExporter extends BasicXmlExporter{
+public class Xml101009Exporter extends BasicXmlExporter{
private static final String TOP_COMMENT =
- " MikuMikuDance\n model-data(*.pmd) on XML";
- private static final String SCHEMA_LOCATION =
- PmdXmlResources.NS_PMDXML + " " + PmdXmlResources.SCHEMA_PMDXML;
+ " MikuMikuDance\n"
+ + " model-data(*.pmd) on XML";
/** 改行文字列 CR。 */
private static final String CR = "\r"; // 0x0d
* 文字エンコーディングはUTF-8が用いられる。
* @param stream 出力ストリーム
*/
- public PmdXmlExporter(OutputStream stream){
+ public Xml101009Exporter(OutputStream stream){
super(stream);
return;
}
* @throws IOException {@inheritDoc}
*/
@Override
- public PmdXmlExporter ind() throws IOException{
+ public Xml101009Exporter ind() throws IOException{
super.ind();
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- protected PmdXmlExporter putUnescapedComment(CharSequence seq)
+ protected Xml101009Exporter putUnescapedComment(CharSequence seq)
throws IOException{
if( ! isBasicLatinOnlyOut() ) return this;
if(hasOnlyBasicLatin(seq)) return this;
* @return this本体
* @throws IOException 出力エラー
*/
- protected PmdXmlExporter putI18nName(I18nText text) throws IOException{
+ protected Xml101009Exporter putI18nName(I18nText text) throws IOException{
for(String lang639 : text.lang639CodeList()){
if(lang639.equals(I18nText.CODE639_PRIMARY)) continue;
String name = text.getI18nText(lang639);
- ind().put("<i18nName ");
+ ind().putRawText("<i18nName ");
putAttr("lang", lang639).sp();
putAttr("name", name);
- put(" />");
+ putRawText(" />");
putUnescapedComment(name);
ln();
}
* @return this本体
* @throws IOException 出力エラー
*/
- protected PmdXmlExporter putNumberedIdAttr(CharSequence attrName,
+ protected Xml101009Exporter putNumberedIdAttr(CharSequence attrName,
CharSequence prefix,
int num )
throws IOException{
- put(attrName).put("=\"");
- put(prefix).put(num);
- put('"');
+ putRawText(attrName).putRawText("=\"");
+ putRawText(prefix).putXsdInt(num);
+ putRawCh('"');
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- protected PmdXmlExporter putNumberedIdAttr(CharSequence attrName,
+ protected Xml101009Exporter putNumberedIdAttr(CharSequence attrName,
CharSequence prefix,
SerialNumbered numbered )
throws IOException{
* @return this本体
* @throws IOException 出力エラー
*/
- protected PmdXmlExporter putPosition(MkPos3D position)
+ protected Xml101009Exporter putPosition(MkPos3D position)
throws IOException{
- put("<position ");
+ putRawText("<position ");
putFloatAttr("x", (float) position.getXpos()).sp();
putFloatAttr("y", (float) position.getYpos()).sp();
putFloatAttr("z", (float) position.getZpos()).sp();
- put("/>");
+ putRawText("/>");
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- protected PmdXmlExporter putRadRotation(Rad3d rotation)
+ protected Xml101009Exporter putRadRotation(Rad3d rotation)
throws IOException{
- put("<radRotation ");
+ putRawText("<radRotation ");
putFloatAttr("xRad", rotation.getXRad()).sp();
putFloatAttr("yRad", rotation.getYRad()).sp();
putFloatAttr("zRad", rotation.getZRad()).sp();
- put("/>");
+ putRawText("/>");
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- protected PmdXmlExporter putLocalNameComment(I18nText name)
+ protected Xml101009Exporter putLocalNameComment(I18nText name)
throws IOException{
String localName = name.getText();
+ if(localName.isEmpty()){
+ localName = "[NAMELESS]";
+ }
ind().putLineComment(localName);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- protected PmdXmlExporter putPrimaryNameAttr(CharSequence attrName,
+ protected Xml101009Exporter putPrimaryNameAttr(CharSequence attrName,
I18nText name)
throws IOException{
String primaryName = name.getPrimaryText();
* @throws IOException 出力エラー
*/
public void putPmdModel(PmdModel model) throws IOException{
- ind().put("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>").ln(2);
+ ind().putRawText("<?xml")
+ .sp().putAttr("version","1.0")
+ .sp().putAttr("encoding","UTF-8")
+ .sp().putRawText("?>").ln(2);
ind().putBlockComment(TOP_COMMENT).ln(2);
- /*
- ind().put("<!DOCTYPE pmdModel").ln();
- ind().put(" SYSTEM \"")
- .put(PmdXmlResources.DTD_PMDXML)
- .put("\" >")
- .ln(3);
- */
-
I18nText modelName = model.getModelName();
ind().putLocalNameComment(modelName).ln();
- ind().put("<pmdModel").ln();
+ ind().putRawText("<pmdModel").ln();
pushNest();
- ind().putAttr("xmlns", PmdXmlResources.NS_PMDXML).ln();
+
+ ind().putAttr("xmlns", Xml101009Resources.NS_PMDXML).ln();
ind().putAttr("xmlns:xsi", XmlResourceResolver.NS_XSD).ln();
- ind().putAttr("xsi:schemaLocation", SCHEMA_LOCATION).ln();
- ind().putAttr("schemaVersion", PmdXmlResources.VER_PMDXML).ln(2);
+
+ ind().putRawText("xsi:schemaLocation").putRawText("=\"");
+ putRawText(Xml101009Resources.NS_PMDXML).ln();
+ pushNest();
+ ind().putRawText(Xml101009Resources.SCHEMA_PMDXML).putRawCh('"').ln();
+ popNest();
+
+ ind().putAttr("schemaVersion", Xml101009Resources.VER_PMDXML).ln(2);
ind().putPrimaryNameAttr("name", modelName).ln();
+
popNest();
- put(">").ln(2);
+ putRawText(">").ln(2);
putModelInfo(model).flush();
putMetaInfo(model).flush();
putSurfaceGroupList(model).flush();
putVertexList(model).flush();
- ind().put("</pmdModel>").ln(2);
- ind().put("<!-- EOF -->").ln();
+ ind().putRawText("</pmdModel>").ln(2);
+ ind().putRawText("<!-- EOF -->").ln();
return;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putModelInfo(PmdModel model)
+ private Xml101009Exporter putModelInfo(PmdModel model)
throws IOException{
I18nText modelName = model.getModelName();
putI18nName(modelName);
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putDescription(CharSequence lang639,
+ private Xml101009Exporter putDescription(CharSequence lang639,
CharSequence content)
throws IOException{
String text = content.toString();
text = text.replace(CRLF, LF);
text = text.replace(CR, LF);
- ind().put("<description");
+ ind().putRawText("<description");
if( ! I18nText.CODE639_PRIMARY.equals(lang639) ){
- sp();
- putAttr("lang", lang639);
+ sp().putAttr("lang", lang639).sp();
}
- put(">").ln();
+ putRawText(">").ln();
putBRedContent(text);
- ind().put("</description>").ln();
+ ind().putRawText("</description>").ln();
if( ! hasOnlyBasicLatin(text) && isBasicLatinOnlyOut() ){
putBlockComment(text);
char ch = content.charAt(idx);
if(ch == '\n'){
CharSequence seq = content.subSequence(startPos, idx);
- putContent(seq).put("<br/>").ln();
+ putContent(seq).putRawText("<br/>").ln();
startPos = idx + 1;
}
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putMetaInfo(PmdModel model) throws IOException{
- ind().put("<license>").ln();
- ind().put("</license>").ln(2);
+ private Xml101009Exporter putMetaInfo(PmdModel model) throws IOException{
+ ind().putRawText("<license>").ln();
+ ind().putRawText("</license>").ln(2);
- ind().put("<credits>").ln();
- ind().put("</credits>").ln(2);
+ ind().putRawText("<credits>").ln();
+ ind().putRawText("</credits>").ln(2);
if(this.generator != null){
- ind().put("<meta ");
+ ind().putRawText("<meta ");
putAttr("name", "generator").sp()
.putAttr("content", this.generator);
- put(" />").ln();
+ putRawText(" />").ln();
}
- ind().put("<meta ");
+ ind().putRawText("<meta ");
putAttr("name", "siteURL").sp().putAttr("content", "");
- put(" />").ln();
- ind().put("<meta ");
+ putRawText(" />").ln();
+ ind().putRawText("<meta ");
putAttr("name", "imageURL").sp().putAttr("content", "");
- put(" />").ln(2);
+ putRawText(" />").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putMaterialList(PmdModel model)
+ private Xml101009Exporter putMaterialList(PmdModel model)
throws IOException{
- ind().put("<materialList>").ln(2);
- pushNest();
+ ind().putRawText("<materialList>").ln();
+ pushNest();
int ct = 0;
- for(Material material : model.getMaterialList()){
+ boolean dumped = false;
+ List<Material> materialList = model.getMaterialList();
+ for(Material material : materialList){
+ if( ! dumped ) ln();
putMaterial(material, ct++);
+ dumped = true;
}
-
popNest();
- ind().put("</materialList>").ln(2);
+
+ ind().putRawText("</materialList>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putMaterial(Material material, int no)
+ private Xml101009Exporter putMaterial(Material material, int no)
throws IOException{
String bool;
if(material.getEdgeAppearance()) bool = "true";
if(local != null && local.length() > 0){
ind().putLineComment(local).ln();
}
- ind().put("<material ");
+ ind().putRawText("<material ");
if(primary != null && primary.length() > 0){
putAttr("name", primary).sp();
}
putAttr("showEdge", bool);
sp();
putNumberedIdAttr("surfaceGroupIdRef", PFX_SURFACEGROUP, no);
- put('>').ln();
+ sp().putRawCh('>').ln();
pushNest();
putI18nName(name);
Color diffuse = material.getDiffuseColor();
diffuse.getRGBComponents(rgba);
- ind().put("<diffuse ");
+ ind().putRawText("<diffuse ");
putFloatAttr("r", rgba[0]).sp();
putFloatAttr("g", rgba[1]).sp();
putFloatAttr("b", rgba[2]).sp();
putFloatAttr("alpha", rgba[3]).sp();
- put("/>").ln();
+ putRawText("/>").ln();
Color specular = material.getSpecularColor();
specular.getRGBComponents(rgba);
float shininess = material.getShininess();
- ind().put("<specular ");
+ ind().putRawText("<specular ");
putFloatAttr("r", rgba[0]).sp();
putFloatAttr("g", rgba[1]).sp();
putFloatAttr("b", rgba[2]).sp();
putFloatAttr("shininess", shininess).sp();
- put("/>").ln();
+ putRawText("/>").ln();
Color ambient = material.getAmbientColor();
ambient.getRGBComponents(rgba);
- ind().put("<ambient ");
+ ind().putRawText("<ambient ");
putFloatAttr("r", rgba[0]).sp();
putFloatAttr("g", rgba[1]).sp();
putFloatAttr("b", rgba[2]).sp();
- put("/>").ln();
+ putRawText("/>").ln();
ShadeInfo shade = material.getShadeInfo();
String textureFileName = shade.getTextureFileName();
String spheremapFileName = shade.getSpheremapFileName();
if(shade.isValidToonIndex()){
- ind().put("<toon ");
+ ind().putRawText("<toon ");
int toonIdx = shade.getToonIndex();
putNumberedIdAttr("toonFileIdRef", PFX_TOONFILE, toonIdx);
- put(" />");
+ putRawText(" />");
String toonFileName = shade.getToonFileName();
if(toonFileName != null && toonFileName.length() > 0){
sp().putLineComment(toonFileName);
}
if(textureFileName != null && textureFileName.length() > 0){
- ind().put("<textureFile ");
+ ind().putRawText("<textureFile ");
putAttr("winFileName", textureFileName);
- put(" />").ln();
+ putRawText(" />").ln();
}
if(spheremapFileName != null && spheremapFileName.length() > 0){
- ind().put("<spheremapFile ");
+ ind().putRawText("<spheremapFile ");
putAttr("winFileName", spheremapFileName);
- put(" />").ln();
+ putRawText(" />").ln();
}
popNest();
- ind().put("</material>").ln(2);
+ ind().putRawText("</material>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putToonMap(PmdModel model)
+ private Xml101009Exporter putToonMap(PmdModel model)
throws IOException{
- ind().put("<toonMap>").ln();
+ ind().putRawText("<toonMap>").ln();
pushNest();
ToonMap map = model.getToonMap();
}
popNest();
- ind().put("</toonMap>").ln(2);
+ ind().putRawText("</toonMap>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putToon(ToonMap map, int index)
+ private Xml101009Exporter putToon(ToonMap map, int index)
throws IOException{
- put("<toonDef ");
+ putRawText("<toonDef ");
putNumberedIdAttr("toonFileId", PFX_TOONFILE, index).sp();
putIntAttr("index", index).sp();
String toonFile = map.getIndexedToon(index);
putAttr("winFileName", toonFile);
- put(" />");
+ putRawText(" />");
putUnescapedComment(toonFile);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putSurfaceGroupList(PmdModel model)
+ private Xml101009Exporter putSurfaceGroupList(PmdModel model)
throws IOException{
- ind().put("<surfaceGroupList>").ln(2);
- pushNest();
+ ind().putRawText("<surfaceGroupList>").ln();
+ pushNest();
int ct = 0;
- for(Material material : model.getMaterialList()){
+ boolean dumped = false;
+ List<Material> materialList = model.getMaterialList();
+ for(Material material : materialList){
List<Surface> surfaceList = material.getSurfaceList();
+ if( ! dumped ) ln();
putSurfaceList(surfaceList, ct++);
+ dumped = true;
}
-
popNest();
- ind().put("</surfaceGroupList>").ln(2);
+
+ ind().putRawText("</surfaceGroupList>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putSurfaceList(List<Surface> surfaceList,
+ private Xml101009Exporter putSurfaceList(List<Surface> surfaceList,
int index)
throws IOException{
- ind().put("<surfaceGroup ");
+ ind().putRawText("<surfaceGroup ");
putNumberedIdAttr("surfaceGroupId", PFX_SURFACEGROUP, index);
- put(">").ln();
+ sp().putRawText(">").ln();
pushNest();
for(Surface surface : surfaceList){
}
popNest();
- ind().put("</surfaceGroup>").ln(2);
+ ind().putRawText("</surfaceGroup>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putSurface(Surface surface)
+ private Xml101009Exporter putSurface(Surface surface)
throws IOException{
- ind().put("<surface ");
+ ind().putRawText("<surface ");
Vertex vertex1 = surface.getVertex1();
Vertex vertex2 = surface.getVertex2();
putNumberedIdAttr("vtxIdRef2", PFX_VERTEX, vertex2).sp();
putNumberedIdAttr("vtxIdRef3", PFX_VERTEX, vertex3).sp();
- put("/>").ln();
+ putRawText("/>").ln();
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putVertexList(PmdModel model)
+ private Xml101009Exporter putVertexList(PmdModel model)
throws IOException{
- ind().put("<vertexList>").ln(2);
- pushNest();
+ ind().putRawText("<vertexList>").ln();
- for(Vertex vertex : model.getVertexList()){
+ pushNest();
+ boolean dumped = false;
+ List<Vertex> vertexList = model.getVertexList();
+ for(Vertex vertex : vertexList){
+ if( ! dumped ) ln();
putVertex(vertex);
+ dumped = true;
}
-
popNest();
- ind().put("</vertexList>").ln(2);
+
+ ind().putRawText("</vertexList>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putVertex(Vertex vertex)
+ private Xml101009Exporter putVertex(Vertex vertex)
throws IOException{
String bool;
if(vertex.getEdgeAppearance()) bool = "true";
else bool = "false";
- ind().put("<vertex ");
+ ind().putRawText("<vertex ");
putNumberedIdAttr("vtxId", PFX_VERTEX, vertex).sp();
putAttr("showEdge", bool);
- put(">").ln();
+ sp().putRawText(">").ln();
pushNest();
MkPos3D position = vertex.getPosition();
ind().putPosition(position).ln();
MkVec3D normal = vertex.getNormal();
- ind().put("<normal ");
+ ind().putRawText("<normal ");
putFloatAttr("x", (float) normal.getXVal()).sp();
putFloatAttr("y", (float) normal.getYVal()).sp();
putFloatAttr("z", (float) normal.getZVal()).sp();
- put("/>").ln();
+ putRawText("/>").ln();
MkPos2D uvPos = vertex.getUVPosition();
- ind().put("<uvMap ");
+ ind().putRawText("<uvMap ");
putFloatAttr("u", (float) uvPos.getXpos()).sp();
putFloatAttr("v", (float) uvPos.getYpos()).sp();
- put("/>").ln();
+ putRawText("/>").ln();
BoneInfo boneA = vertex.getBoneA();
BoneInfo boneB = vertex.getBoneB();
int weight = vertex.getWeightA();
- ind().put("<skinning ");
+ ind().putRawText("<skinning ");
putNumberedIdAttr("boneIdRef1", PFX_BONE, boneA).sp();
putNumberedIdAttr("boneIdRef2", PFX_BONE, boneB).sp();
putIntAttr("weightBalance", weight).sp();
- put("/>").ln();
+ putRawText("/>").ln();
popNest();
- ind().put("</vertex>").ln(2);
+ ind().putRawText("</vertex>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putBoneList(PmdModel model)
+ private Xml101009Exporter putBoneList(PmdModel model)
throws IOException{
- ind().put("<boneList>").ln(2);
+ ind().putRawText("<boneList>").ln();
pushNest();
- putBlockComment(BONETYPE_COMMENT).ln();
-
+ boolean dumped = false;
for(BoneInfo bone : model.getBoneList()){
+ if( ! dumped ){
+ ln().putBlockComment(BONETYPE_COMMENT).ln();
+ }
putBone(bone);
+ dumped = true;
}
popNest();
- ind().put("</boneList>").ln(2);
+ ind().putRawText("</boneList>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putBone(BoneInfo bone)
+ private Xml101009Exporter putBone(BoneInfo bone)
throws IOException{
I18nText i18nName = bone.getBoneName();
BoneType type = bone.getBoneType();
- putLocalNameComment(i18nName).putLineComment(type.getGuiName()).ln();
- ind().put("<bone ");
+ StringBuilder boneComment = new StringBuilder();
+ String boneName = i18nName.getText();
+ if(boneName.isEmpty()){
+ boneName = "[NAMELESS]";
+ }
+ boneComment.append(boneName);
+ String typeName = type.getGuiName();
+ boneComment.append(" [").append(typeName).append(']');
+ ind().putLineComment(boneComment.toString()).ln();
+
+ ind().putRawText("<bone ");
putPrimaryNameAttr("name", i18nName).sp();
putNumberedIdAttr("boneId", PFX_BONE, bone).sp();
putAttr("type", type.name());
- put(">").ln();
+ sp().putRawText(">").ln();
pushNest();
putI18nName(i18nName);
BoneInfo ikBone = bone.getIKBone();
if(bone.getBoneType() == BoneType.LINKEDROT){
- ind().put("<rotationRatio ");
+ ind().putRawText("<rotationRatio ");
putIntAttr("ratio", bone.getRotationRatio());
- put(" />").ln();
+ putRawText(" />").ln();
}else if(ikBone != null){
- ind().put("<ikBone ");
+ ind().putRawText("<ikBone ");
putNumberedIdAttr("boneIdRef", PFX_BONE, ikBone);
- put(" /> ");
+ putRawText(" /> ");
String ikBoneName = "Ref:" + ikBone.getBoneName().getText();
putLineComment(ikBoneName);
ln();
}
- StringBuilder chainComment = new StringBuilder();
- ind().put("<boneChain");
BoneInfo prev = bone.getPrevBone();
BoneInfo next = bone.getNextBone();
+
+ StringBuilder chainComment = new StringBuilder();
if(prev != null){
- sp();
- putNumberedIdAttr("prevBoneIdRef", PFX_BONE, prev);
chainComment.append('[')
.append(prev.getBoneName().getPrimaryText())
.append(']')
- .append("=> #");
+ .append(" >>#");
}
if(next != null){
- sp();
- putNumberedIdAttr("nextBoneIdRef", PFX_BONE, next);
if(chainComment.length() <= 0) chainComment.append("#");
- chainComment.append(" =>")
+ chainComment.append(">> ")
.append('[')
.append(next.getBoneName().getPrimaryText())
.append(']');
}
- put(" />").ln();
- ind().putLineComment(chainComment).ln();
+ if(chainComment.length() > 0){
+ ln();
+ ind().putLineComment(chainComment).ln();
+ }
+
+ ind().putRawText("<boneChain");
+ if(prev != null){
+ sp();
+ putNumberedIdAttr("prevBoneIdRef", PFX_BONE, prev);
+ }
+ if(next != null){
+ sp();
+ putNumberedIdAttr("nextBoneIdRef", PFX_BONE, next);
+ }
+ putRawText(" />").ln();
popNest();
- ind().put("</bone>").ln(2);
+ ind().putRawText("</bone>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putBoneGroupList(PmdModel model)
+ private Xml101009Exporter putBoneGroupList(PmdModel model)
throws IOException{
- ind().put("<boneGroupList>").ln(2);
- pushNest();
+ ind().putRawText("<boneGroupList>").ln();
- for(BoneGroup group : model.getBoneGroupList()){
+ pushNest();
+ boolean dumped = false;
+ List<BoneGroup> groupList = model.getBoneGroupList();
+ for(BoneGroup group : groupList){
if(group.isDefaultBoneGroup()) continue;
+ if( ! dumped ) ln();
putBoneGroup(group);
+ dumped = true;
}
-
popNest();
- ind().put("</boneGroupList>").ln(2);
+
+ ind().putRawText("</boneGroupList>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putBoneGroup(BoneGroup group)
+ private Xml101009Exporter putBoneGroup(BoneGroup group)
throws IOException{
I18nText i18nName = group.getGroupName();
putLocalNameComment(i18nName).ln();
- ind().put("<boneGroup ");
+ ind().putRawText("<boneGroup ");
putPrimaryNameAttr("name", i18nName);
- put(">").ln();
+ sp().putRawText(">").ln();
pushNest();
putI18nName(i18nName);
for(BoneInfo bone : group){
- ind().put("<boneGroupMember ");
+ ind().putRawText("<boneGroupMember ");
putNumberedIdAttr("boneIdRef", PFX_BONE, bone);
- put(" /> ");
+ putRawText(" /> ");
String boneName = "Ref:" + bone.getBoneName().getText();
putLineComment(boneName).ln();
}
popNest();
- ind().put("</boneGroup>").ln(2);
+ ind().putRawText("</boneGroup>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putIKChainList(PmdModel model)
+ private Xml101009Exporter putIKChainList(PmdModel model)
throws IOException{
- ind().put("<ikChainList>").ln(2);
- pushNest();
+ ind().putRawText("<ikChainList>").ln();
- for(IKChain chain : model.getIKChainList()){
+ pushNest();
+ boolean dumped = false;
+ List<IKChain> chainList = model.getIKChainList();
+ for(IKChain chain : chainList){
+ if( ! dumped ) ln();
putIKChain(chain);
+ dumped = true;
}
-
popNest();
- ind().put("</ikChainList>").ln(2);
+
+ ind().putRawText("</ikChainList>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putIKChain(IKChain chain)
+ private Xml101009Exporter putIKChain(IKChain chain)
throws IOException{
int depth = chain.getIKDepth();
float weight = chain.getIKWeight();
BoneInfo ikBone = chain.getIkBone();
ind().putLineComment("Ref:" + ikBone.getBoneName().getText()).ln();
- ind().put("<ikChain ");
+ ind().putRawText("<ikChain ");
putNumberedIdAttr("ikBoneIdRef", PFX_BONE, ikBone).sp();
putIntAttr("recursiveDepth", depth).sp();
putFloatAttr("weight", weight);
- put("> ").ln();
+ sp().putRawText(">").ln();
pushNest();
for(BoneInfo bone : chain){
- ind().put("<chainOrder ");
+ ind().putRawText("<chainOrder ");
putNumberedIdAttr("boneIdRef", PFX_BONE, bone);
- put(" /> ");
+ putRawText(" /> ");
putLineComment("Ref:" + bone.getBoneName().getText());
ln();
}
popNest();
- ind().put("</ikChain>").ln(2);
+ ind().putRawText("</ikChain>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putMorphList(PmdModel model)
+ private Xml101009Exporter putMorphList(PmdModel model)
throws IOException{
- ind().put("<morphList>").ln(2);
+ ind().putRawText("<morphList>").ln();
pushNest();
- putBlockComment(MORPHTYPE_COMMENT).ln();
-
+ boolean dumped = false;
Map<MorphType, List<MorphPart>> morphMap = model.getMorphMap();
for(MorphType type : MorphType.values()){
if(type == MorphType.BASE) continue;
List<MorphPart> partList = morphMap.get(type);
if(partList == null) continue;
for(MorphPart part : partList){
+ if( ! dumped ){
+ ln().putBlockComment(MORPHTYPE_COMMENT).ln();
+ }
putMorphPart(part);
+ dumped = true;
}
}
popNest();
- ind().put("</morphList>").ln(2);
+ ind().putRawText("</morphList>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putMorphPart(MorphPart part)
+ private Xml101009Exporter putMorphPart(MorphPart part)
throws IOException{
I18nText i18nName = part.getMorphName();
String primary = i18nName.getPrimaryText();
- ind().put("<morph ");
+ putLocalNameComment(i18nName).ln();
+ ind().putRawText("<morph ");
putAttr("name", primary).sp();
putAttr("type", part.getMorphType().name());
- put(">");
- putUnescapedComment(primary);
+ sp().putRawText(">");
ln();
pushNest();
MkPos3D offset = mvertex.getOffset();
Vertex base = mvertex.getBaseVertex();
- ind().put("<morphVertex ");
+ ind().putRawText("<morphVertex ");
putNumberedIdAttr("vtxIdRef", PFX_VERTEX, base).sp();
putFloatAttr("xOff", (float) offset.getXpos()).sp();
putFloatAttr("yOff", (float) offset.getYpos()).sp();
putFloatAttr("zOff", (float) offset.getZpos()).sp();
- put("/>");
+ putRawText("/>");
ln();
}
popNest();
- ind().put("</morph>").ln(2);
+ ind().putRawText("</morph>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putRigidList(PmdModel model)
+ private Xml101009Exporter putRigidList(PmdModel model)
throws IOException{
- ind().put("<rigidList>").ln(2);
+ ind().putRawText("<rigidList>").ln();
pushNest();
- putBlockComment(RIGIDBEHAVIOR_COMMENT).ln();
-
+ boolean dumped = false;
for(RigidInfo rigid : model.getRigidList()){
+ if( ! dumped ){
+ ln().putBlockComment(RIGIDBEHAVIOR_COMMENT).ln();
+ }
putRigid(rigid);
+ dumped = true;
}
popNest();
- ind().put("</rigidList>").ln(2);
+ ind().putRawText("</rigidList>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putRigid(RigidInfo rigid)
+ private Xml101009Exporter putRigid(RigidInfo rigid)
throws IOException{
BoneInfo linkedBone = rigid.getLinkedBone();
I18nText i18nName = rigid.getRigidName();
String primary = i18nName.getPrimaryText();
putLocalNameComment(i18nName).ln();
- ind().put("<rigid ");
+ ind().putRawText("<rigid ");
putAttr("name", primary).sp();
putNumberedIdAttr("rigidId", PFX_RIGID, rigid).sp();
putAttr("behavior", rigid.getBehaviorType().name());
- put(">").ln();
+ sp().putRawText(">").ln();
pushNest();
putI18nName(i18nName);
if(linkedBone != null){
- ind().put("<linkedBone ");
+ ind().putRawText("<linkedBone ");
putNumberedIdAttr("boneIdRef", PFX_BONE, linkedBone);
- put(" /> ");
+ putRawText(" /> ");
putLineComment("Ref:" + linkedBone.getBoneName().getText());
ln(2);
}
putDynamics(dynamics).ln();
for(RigidGroup group : rigid.getThroughGroupColl()){
- ind().put("<throughRigidGroup ");
+ ind().putRawText("<throughRigidGroup ");
putNumberedIdAttr("rigidGroupIdRef",
PFX_RIGIDGROUP,
group.getSerialNumber() + 1).sp();
- put(" />").ln();
+ putRawText(" />").ln();
}
popNest();
- ind().put("</rigid>").ln(2);
+ ind().putRawText("</rigid>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putRigidShape(RigidShape shape)
+ private Xml101009Exporter putRigidShape(RigidShape shape)
throws IOException{
RigidShapeType type = shape.getShapeType();
switch(type){
case BOX:
- ind().put("<rigidShapeBox ");
+ ind().putRawText("<rigidShapeBox ");
putFloatAttr("width", shape.getWidth()).sp();
putFloatAttr("height", shape.getHeight()).sp();
putFloatAttr("depth", shape.getDepth()).sp();
break;
case SPHERE:
- ind().put("<rigidShapeSphere ");
+ ind().putRawText("<rigidShapeSphere ");
putFloatAttr("radius", shape.getRadius()).sp();
break;
case CAPSULE:
- ind().put("<rigidShapeCapsule ");
+ ind().putRawText("<rigidShapeCapsule ");
putFloatAttr("height", shape.getHeight()).sp();
putFloatAttr("radius", shape.getRadius()).sp();
break;
throw new AssertionError();
}
- put("/>").ln();
+ putRawText("/>").ln();
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putDynamics(DynamicsInfo dynamics)
+ private Xml101009Exporter putDynamics(DynamicsInfo dynamics)
throws IOException{
- ind().put("<dynamics").ln();
+ ind().putRawText("<dynamics").ln();
pushNest();
ind().putFloatAttr("mass", dynamics.getMass()).ln();
ind().putFloatAttr("dampingPosition",
ind().putFloatAttr("restitution", dynamics.getRestitution()).ln();
ind().putFloatAttr("friction", dynamics.getFriction()).ln();
popNest();
- ind().put("/>").ln();
+ ind().putRawText("/>").ln();
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putRigidGroupList(PmdModel model)
+ private Xml101009Exporter putRigidGroupList(PmdModel model)
throws IOException{
- ind().put("<rigidGroupList>").ln(2);
+ ind().putRawText("<rigidGroupList>").ln(2);
pushNest();
+ boolean singleLast = false;
for(RigidGroup group : model.getRigidGroupList()){
- ind().put("<rigidGroup ");
+ List<RigidInfo> rigidList = group.getRigidList();
+ if(singleLast && ! rigidList.isEmpty()){
+ ln();
+ }
+ ind().putRawText("<rigidGroup ");
putNumberedIdAttr("rigidGroupId",
PFX_RIGIDGROUP,
group.getSerialNumber() + 1);
- List<RigidInfo> rigidList = group.getRigidList();
- if(rigidList.size() <= 0){
- put(" />").ln(2);
+ if(rigidList.isEmpty()){
+ putRawText(" />").ln();
+ singleLast = true;
continue;
}
- put(">").ln();
+ putRawText(" >").ln();
pushNest();
for(RigidInfo rigid : rigidList){
- ind().put("<rigidGroupMember ");
+ ind().putRawText("<rigidGroupMember ");
putNumberedIdAttr("rigidIdRef", PFX_RIGID, rigid).sp();
- put("/>");
+ putRawText("/>");
sp();
putLineComment("Ref:" + rigid.getRigidName().getText());
ln();
}
popNest();
- ind().put("</rigidGroup>").ln(2);
+ ind().putRawText("</rigidGroup>").ln(2);
+ singleLast = false;
+ }
+
+ if(singleLast){
+ ln();
}
popNest();
- ind().put("</rigidGroupList>").ln(2);
+ ind().putRawText("</rigidGroupList>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putJointList(PmdModel model)
+ private Xml101009Exporter putJointList(PmdModel model)
throws IOException{
- ind().put("<jointList>").ln(2);
- pushNest();
+ ind().putRawText("<jointList>").ln();
- for(JointInfo joint : model.getJointList()){
+ pushNest();
+ boolean dumped = false;
+ List<JointInfo> jointList = model.getJointList();
+ for(JointInfo joint : jointList){
+ if( ! dumped ) ln();
putJoint(joint);
+ dumped = true;
}
-
popNest();
- ind().put("</jointList>").ln(2);
+
+ ind().putRawText("</jointList>").ln(2);
return this;
}
* @return this本体
* @throws IOException 出力エラー
*/
- private PmdXmlExporter putJoint(JointInfo joint)
+ private Xml101009Exporter putJoint(JointInfo joint)
throws IOException{
I18nText i18nName = joint.getJointName();
putLocalNameComment(i18nName).ln();
- ind().put("<joint ");
+ ind().putRawText("<joint ");
putPrimaryNameAttr("name", i18nName);
- put(">").ln();
+ sp().putRawText(">").ln();
pushNest();
putI18nName(i18nName);
RigidInfo rigidA = joint.getRigidA();
RigidInfo rigidB = joint.getRigidB();
- ind().put("<jointedRigidPair ");
- putNumberedIdAttr("rigidIdRef1", PFX_RIGID, rigidA).sp();
- putNumberedIdAttr("rigidIdRef2", PFX_RIGID, rigidB).sp();
- put("/>").ln();
+
ind();
putLineComment("[" + rigidA.getRigidName().getText() + "]"
+ " <=> [" + rigidB.getRigidName().getText() + "]");
- ln(2);
+ ln();
+
+ ind().putRawText("<jointedRigidPair ");
+ putNumberedIdAttr("rigidIdRef1", PFX_RIGID, rigidA).sp();
+ putNumberedIdAttr("rigidIdRef2", PFX_RIGID, rigidB).sp();
+ putRawText("/>").ln(2);
MkPos3D position = joint.getPosition();
ind().putPosition(position).ln();
TripletRange posRange = joint.getPositionRange();
- ind().put("<limitPosition").ln();
+ ind().putRawText("<limitPosition").ln();
pushNest();
ind();
putFloatAttr("xFrom", posRange.getXFrom()).sp();
putFloatAttr("zFrom", posRange.getZFrom()).sp();
putFloatAttr("zTo", posRange.getZTo()).ln();
popNest();
- ind().put("/>").ln(2);
+ ind().putRawText("/>").ln(2);
Rad3d rotation = joint.getRotation();
ind().putRadRotation(rotation).ln();
TripletRange rotRange = joint.getRotationRange();
- ind().put("<limitRotation").ln();
+ ind().putRawText("<limitRotation").ln();
pushNest();
ind();
putFloatAttr("xFrom", rotRange.getXFrom()).sp();
putFloatAttr("zFrom", rotRange.getZFrom()).sp();
putFloatAttr("zTo", rotRange.getZTo()).ln();
popNest();
- ind().put("/>").ln(2);
+ ind().putRawText("/>").ln(2);
MkPos3D elaPosition = joint.getElasticPosition();
- ind().put("<elasticPosition ");
+ ind().putRawText("<elasticPosition ");
putFloatAttr("x", (float) elaPosition.getXpos()).sp();
putFloatAttr("y", (float) elaPosition.getYpos()).sp();
putFloatAttr("z", (float) elaPosition.getZpos()).sp();
- put("/>").ln();
+ putRawText("/>").ln();
Deg3d elaRotation = joint.getElasticRotation();
- ind().put("<elasticRotation ");
+ ind().putRawText("<elasticRotation ");
putFloatAttr("xDeg", elaRotation.getXDeg()).sp();
putFloatAttr("yDeg", elaRotation.getYDeg()).sp();
putFloatAttr("zDeg", elaRotation.getZDeg()).sp();
- put("/>").ln(2);
+ putRawText("/>").ln(2);
popNest();
- ind().put("</joint>").ln(2);
+ ind().putRawText("</joint>").ln(2);
return this;
}
* Copyright(c) 2010 MikuToga Partners
*/
-package jp.sourceforge.mikutoga.pmd.model.xml;
+package jp.sfjp.mikutoga.pmd.xml101009;
import java.awt.Color;
import java.io.IOException;
import org.xml.sax.SAXException;
/**
- * XML形式でのモデルファイルを読み込む。
+ * 101009形式XML形式でのモデルファイルを読み込む。
*/
-public class Xml2PmdLoader {
+public class Xml101009Loader {
private final DocumentBuilder builder;
* コンストラクタ。
* @param builder ビルダ
*/
- public Xml2PmdLoader(DocumentBuilder builder){
+ public Xml101009Loader(DocumentBuilder builder){
super();
this.builder = builder;
return;
* Copyright(c) 2010 MikuToga Partners
*/
-package jp.sourceforge.mikutoga.pmd.model.xml;
+package jp.sfjp.mikutoga.pmd.xml101009;
import java.net.URI;
import java.net.URISyntaxException;
import org.xml.sax.SAXException;
/**
- * XML各種リソースの定義。
+ * 101009形式XML各種リソースの定義。
*/
-public final class PmdXmlResources {
+public final class Xml101009Resources {
public static final String NS_PMDXML =
"http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009";
public static final URI RES_SCHEMA_PMDXML;
public static final URI RES_DTD_PMDXML;
- private static final Class THISCLASS = PmdXmlResources.class;
+ private static final Class THISCLASS = Xml101009Resources.class;
static{
- Object dummy = new PmdXmlResources();
+ Object dummy = new Xml101009Resources();
try{
RES_SCHEMA_PMDXML =
/**
* 隠しコンストラクタ。
*/
- private PmdXmlResources(){
+ private Xml101009Resources(){
super();
assert this.getClass().equals(THISCLASS);
return;
*/
/**
- * PMDモデル内容をXMLで出力するためのライブラリ。
+ * PMDモデル内容を101009版XMLで出力するためのライブラリ。
*/
-package jp.sourceforge.mikutoga.pmd.model.xml;
+package jp.sfjp.mikutoga.pmd.xml101009;
/* EOF */
this.currentBone = this.boneIt.next();
}
}else if(stage == PmdEngHandler.ENGMORPH_LIST){
+ if(this.morphPartList.isEmpty()){
+ return;
+ }
+
this.morphPartIt = this.morphPartList.iterator();
// 「base」モーフを読み飛ばす
- assert this.morphPartIt.hasNext();
MorphPart part = this.morphPartIt.next();
assert part != null;
+++ /dev/null
-/*
- * MMD model file types.
- *
- * License : The MIT License
- * Copyright(c) 2012 MikuToga Partners
- */
-
-package jp.sourceforge.mikutoga.pmd2xml;
-
-/**
- * モデルファイル種別。
- */
-public enum ModelFileTypes {
- /** 不明。 */
- NONE,
-
- /** MikuMikuDance ver7 前後で読み書きが可能なPMDファイル。 */
- PMD,
-
- /**
- * スキーマ
- * http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd
- * で定義されたXMLファイル。
- */
- XML_101009,
-
-}
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
+import jp.sourceforge.mikutoga.pmd.ModelFileType;
/**
* コマンドラインオプション情報。
private String errMsg = null;
private boolean needHelp = false;
- private ModelFileTypes inTypes = ModelFileTypes.NONE;
- private ModelFileTypes outTypes = ModelFileTypes.NONE;
+ private ModelFileType inTypes = ModelFileType.NONE;
+ private ModelFileType outTypes = ModelFileType.NONE;
private String inFilename = null;
private String outFilename = null;
private boolean overwrite = false;
result.overwrite = true;
break;
case OPT_PMD2XML:
- result.inTypes = ModelFileTypes.PMD;
- result.outTypes = ModelFileTypes.XML_101009;
+ result.inTypes = ModelFileType.PMD;
+ result.outTypes = ModelFileType.XML_101009;
break;
case OPT_XML2PMD:
- result.inTypes = ModelFileTypes.XML_101009;
- result.outTypes = ModelFileTypes.PMD;
+ result.inTypes = ModelFileType.XML_101009;
+ result.outTypes = ModelFileType.PMD;
break;
case OPT_INFILE:
argIdx++;
* @param result オプション情報
*/
private static void checkResult(OptInfo result){
- if( result.getInFileType() == ModelFileTypes.NONE
- || result.getOutFileType() == ModelFileTypes.NONE ){
+ if( result.getInFileType() == ModelFileType.NONE
+ || result.getOutFileType() == ModelFileType.NONE ){
result.putErrMsg(ERRMSG_NODIR);
return;
}
* 入力ファイル種別を返す。
* @return 入力ファイル種別
*/
- ModelFileTypes getInFileType(){
+ ModelFileType getInFileType(){
return this.inTypes;
}
* 出力ファイル種別を返す。
* @return 出力ファイル種別
*/
- ModelFileTypes getOutFileType(){
+ ModelFileType getOutFileType(){
return this.outTypes;
}
import java.io.OutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
+import jp.sfjp.mikutoga.pmd.xml101009.Xml101009Exporter;
+import jp.sfjp.mikutoga.pmd.xml101009.Xml101009Loader;
+import jp.sfjp.mikutoga.pmd.xml101009.Xml101009Resources;
import jp.sourceforge.mikutoga.parser.MmdFormatException;
import jp.sourceforge.mikutoga.pmd.IllegalPmdDataException;
+import jp.sourceforge.mikutoga.pmd.ModelFileType;
import jp.sourceforge.mikutoga.pmd.model.PmdModel;
import jp.sourceforge.mikutoga.pmd.model.binio.PmdExporter;
import jp.sourceforge.mikutoga.pmd.model.binio.PmdLoader;
-import jp.sourceforge.mikutoga.pmd.model.xml.PmdXmlExporter;
-import jp.sourceforge.mikutoga.pmd.model.xml.PmdXmlResources;
-import jp.sourceforge.mikutoga.pmd.model.xml.Xml2PmdLoader;
import jp.sourceforge.mikutoga.xml.TogaXmlException;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
*/
public class Pmd2XmlConv {
- private ModelFileTypes inTypes = ModelFileTypes.NONE;
- private ModelFileTypes outTypes = ModelFileTypes.NONE;
+ private ModelFileType inTypes = ModelFileType.NONE;
+ private ModelFileType outTypes = ModelFileType.NONE;
private String newLine = "\r\n";
private String generator = null;
super();
try{
- this.builder = PmdXmlResources.newBuilder(XmlHandler.HANDLER);
+ this.builder = Xml101009Resources.newBuilder(XmlHandler.HANDLER);
}catch(SAXException e){
throw new AssertionError(e);
}catch(ParserConfigurationException e){
* 入力ファイル種別を設定する。
* @param type ファイル種別
*/
- public void setInType(ModelFileTypes type){
+ public void setInType(ModelFileType type){
if(type == null) throw new NullPointerException();
this.inTypes = type;
return;
* 入力ファイル種別を返す。
* @return ファイル種別
*/
- public ModelFileTypes getInTypes(){
+ public ModelFileType getInTypes(){
return this.inTypes;
}
* 出力ファイル種別を設定する。
* @param type ファイル種別
*/
- public void setOutType(ModelFileTypes type){
+ public void setOutType(ModelFileType type){
if(type == null) throw new NullPointerException();
this.outTypes = type;
return;
* 出力ファイル種別を返す。
* @return ファイル種別
*/
- public ModelFileTypes getOutTypes(){
+ public ModelFileType getOutTypes(){
return this.outTypes;
}
throws IOException,
SAXException,
TogaXmlException {
- Xml2PmdLoader loader = new Xml2PmdLoader(this.builder);
+ Xml101009Loader loader = new Xml101009Loader(this.builder);
PmdModel model = loader.parse(source);
return model;
}
*/
private void xmlOut(PmdModel model, OutputStream ostream)
throws IOException, IllegalPmdDataException{
- PmdXmlExporter exporter = new PmdXmlExporter(ostream);
+ Xml101009Exporter exporter = new Xml101009Exporter(ostream);
exporter.setNewLine(this.newLine);
exporter.setGenerator(this.generator);
exporter.putPmdModel(model);
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import jp.sourceforge.mikutoga.pmd2xml.ModelFileTypes;
+import jp.sourceforge.mikutoga.pmd.ModelFileType;
import jp.sourceforge.mikutoga.pmd2xml.Pmd2XmlConv;
import static org.junit.Assert.*;
destOut = new BufferedOutputStream(destOut);
Pmd2XmlConv converter = new Pmd2XmlConv();
- converter.setInType(ModelFileTypes.XML_101009);
- converter.setOutType(ModelFileTypes.PMD);
+ converter.setInType(ModelFileType.XML_101009);
+ converter.setOutType(ModelFileType.PMD);
converter.setNewline("\n");
converter.convert(xmlis, destOut);
destOut = new BufferedOutputStream(destOut);
Pmd2XmlConv converter = new Pmd2XmlConv();
- converter.setInType(ModelFileTypes.PMD);
- converter.setOutType(ModelFileTypes.XML_101009);
+ converter.setInType(ModelFileType.PMD);
+ converter.setOutType(ModelFileType.XML_101009);
converter.setNewline("\n");
converter.setGenerator(null);
--- /dev/null
+/*
+ */
+
+package testdata;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * 使い捨てテスト用ドライバ。
+ */
+public class TestDriver {
+
+ static{
+ assert Test.class != null;
+ }
+
+ @BeforeClass
+ public static void setUpClass() {
+ }
+
+ @AfterClass
+ public static void tearDownClass() {
+ }
+
+ @Before
+ public void setUp() {
+ }
+
+ @After
+ public void tearDown() {
+ }
+
+ /**
+ * 使い捨てテスト本体。
+ * <p>テストが終わったら必ず元に戻して
+ * アノテーション"Test"をコメントアウトするように。
+ * @throws Exception テスト失敗
+ */
+ //@Test
+ public void main() throws Exception{
+ }
+
+}
--- /dev/null
+/*
+ */
+
+package testdata.pmd101009.bone;
+
+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 BoneTest {
+
+ static Class<?> THISCLASS = BoneTest.class;
+
+ public BoneTest() {
+ 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 pmd2xml() throws Exception{
+ System.out.println("pmd2xml");
+ assertPmd2Xml(THISCLASS, "allbone.pmd", "allbone.xml");
+ return;
+ }
+
+ @Test
+ public void xml2pmd() throws Exception{
+ System.out.println("xml2pmd");
+ assertXml2Pmd(THISCLASS, "allbone.xml", "allbone.pmd");
+ return;
+ }
+
+}
/*
*/
-package testdata.charset;
+package testdata.pmd101009.charset;
import org.junit.After;
import org.junit.AfterClass;
@Test
public void pmd2xml() throws Exception{
System.out.println("pmd2xml");
- assertPmd2Xml(THISCLASS, "test.pmd", "result.xml");
+ assertPmd2Xml(THISCLASS, "charset.pmd", "result.xml");
return;
}
@Test
public void xml2pmd() throws Exception{
System.out.println("xml2pmd");
- assertXml2Pmd(THISCLASS, "source.xml", "test.pmd");
+ assertXml2Pmd(THISCLASS, "source.xml", "charset.pmd");
return;
}
--- /dev/null
+/*
+ */
+
+package testdata.pmd101009.group;
+
+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 GroupTest {
+
+ static Class<?> THISCLASS = GroupTest.class;
+
+ public GroupTest() {
+ 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 pmd2xml() throws Exception{
+ System.out.println("pmd2xml");
+ assertPmd2Xml(THISCLASS, "boneGroup.pmd", "boneGroup.xml");
+ return;
+ }
+
+ @Test
+ public void xml2pmd() throws Exception{
+ System.out.println("xml2pmd");
+ assertXml2Pmd(THISCLASS, "boneGroup.xml", "boneGroup.pmd");
+ return;
+ }
+
+}
--- /dev/null
+/*
+ */
+
+package testdata.pmd101009.i18n;
+
+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 I18nTest {
+
+ static Class<?> THISCLASS = I18nTest.class;
+
+ public I18nTest() {
+ 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 pmd2xml() throws Exception{
+ System.out.println("pmd2xml");
+ assertPmd2Xml(THISCLASS, "i18n.pmd", "i18n.xml");
+ return;
+ }
+
+ @Test
+ public void xml2pmd() throws Exception{
+ System.out.println("xml2pmd");
+ assertXml2Pmd(THISCLASS, "i18n.xml", "i18n.pmd");
+ return;
+ }
+
+}
--- /dev/null
+/*
+ */
+
+package testdata.pmd101009.ik;
+
+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 IkBoneTest {
+
+ static Class<?> THISCLASS = IkBoneTest.class;
+
+ public IkBoneTest() {
+ 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 pmd2xml() throws Exception{
+ System.out.println("pmd2xml");
+ assertPmd2Xml(THISCLASS, "ikBone.pmd", "ikBone.xml");
+ return;
+ }
+
+ @Test
+ public void xml2pmd() throws Exception{
+ System.out.println("xml2pmd");
+ assertXml2Pmd(THISCLASS, "ikBone.xml", "ikBone.pmd");
+ return;
+ }
+
+}
--- /dev/null
+/*
+ */
+
+package testdata.pmd101009.material;
+
+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 MaterialTest {
+
+ static Class<?> THISCLASS = MaterialTest.class;
+
+ public MaterialTest() {
+ 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 pmd2xml() throws Exception{
+ System.out.println("pmd2xml");
+ assertPmd2Xml(THISCLASS, "material.pmd", "material.xml");
+ return;
+ }
+
+ @Test
+ public void xml2pmd() throws Exception{
+ System.out.println("xml2pmd");
+ assertXml2Pmd(THISCLASS, "material.xml", "material.pmd");
+ return;
+ }
+
+}
/*
*/
-package testdata.minimum;
+package testdata.pmd101009.minimum;
import org.junit.After;
import org.junit.AfterClass;
@Test
public void pmd2xml() throws Exception{
System.out.println("pmd2xml");
- assertPmd2Xml(THISCLASS, "test.pmd", "test.xml");
+ assertPmd2Xml(THISCLASS, "minimum.pmd", "minimum.xml");
return;
}
@Test
public void xml2pmd() throws Exception{
System.out.println("xml2pmd");
- assertXml2Pmd(THISCLASS, "test.xml", "test.pmd");
+ assertXml2Pmd(THISCLASS, "minimum.xml", "minimum.pmd");
return;
}
--- /dev/null
+/*
+ */
+
+package testdata.pmd101009.morph;
+
+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 MorphTest {
+
+ static Class<?> THISCLASS = MorphTest.class;
+
+ public MorphTest() {
+ 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 pmd2xml() throws Exception{
+ System.out.println("pmd2xml");
+ assertPmd2Xml(THISCLASS, "allmorph.pmd", "allmorph.xml");
+ return;
+ }
+
+ @Test
+ public void xml2pmd() throws Exception{
+ System.out.println("xml2pmd");
+ assertXml2Pmd(THISCLASS, "allmorph.xml", "allmorph.pmd");
+ return;
+ }
+
+}
--- /dev/null
+/*
+ */
+
+package testdata.pmd101009.numeric;
+
+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 NumericTest {
+
+ static Class<?> THISCLASS = NumericTest.class;
+
+ public NumericTest() {
+ 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 pmd2xml() throws Exception{
+ System.out.println("pmd2xml");
+ assertPmd2Xml(THISCLASS, "numeric.pmd", "result.xml");
+ return;
+ }
+
+ @Test
+ public void xml2pmd() throws Exception{
+ System.out.println("xml2pmd");
+ assertXml2Pmd(THISCLASS, "source.xml", "numeric.pmd");
+ return;
+ }
+
+}
--- /dev/null
+/*
+ */
+
+package testdata.pmd101009.rigid;
+
+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 RigidTest {
+
+ static Class<?> THISCLASS = RigidTest.class;
+
+ public RigidTest() {
+ 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 pmd2xml() throws Exception{
+ System.out.println("pmd2xml");
+ assertPmd2Xml(THISCLASS, "allrigid.pmd", "allrigid.xml");
+ return;
+ }
+
+ @Test
+ public void xml2pmd() throws Exception{
+ System.out.println("xml2pmd");
+ assertXml2Pmd(THISCLASS, "allrigid.xml", "allrigid.pmd");
+ return;
+ }
+
+}
--- /dev/null
+/*
+ */
+
+package testdata.pmd101009.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 pmd2xmlBone() throws Exception{
+ System.out.println("pmd2xmlBone");
+ assertPmd2Xml(THISCLASS, "onlybone.pmd", "onlybone.xml");
+ return;
+ }
+
+ @Test
+ public void pmd2xmlTriangle() throws Exception{
+ System.out.println("pmd2xmlTriangle");
+ assertPmd2Xml(THISCLASS, "onlytriangle.pmd", "onlytriangle.xml");
+ return;
+ }
+
+ @Test
+ public void pmd2xmlMorph() throws Exception{
+ System.out.println("pmd2xmlMorph");
+ assertPmd2Xml(THISCLASS, "onlymorph.pmd", "onlymorph.xml");
+ return;
+ }
+
+ @Test
+ public void pmd2xmlRigid() throws Exception{
+ System.out.println("pmd2xmlRigid");
+ assertPmd2Xml(THISCLASS, "onlyrigid.pmd", "onlyrigid.xml");
+ return;
+ }
+
+ @Test
+ public void pmd2xmlJoint() throws Exception{
+ System.out.println("pmd2xmlJoint");
+ assertPmd2Xml(THISCLASS, "onlyjoint.pmd", "onlyjoint.xml");
+ return;
+ }
+
+ @Test
+ public void xml2pmdBone() throws Exception{
+ System.out.println("xml2pmdBone");
+ assertXml2Pmd(THISCLASS, "onlybone.xml", "onlybone.pmd");
+ return;
+ }
+
+ @Test
+ public void xml2pmdTriangle() throws Exception{
+ System.out.println("xml2pmdTriangle");
+ assertXml2Pmd(THISCLASS, "onlytriangle.xml", "onlytriangle.pmd");
+ return;
+ }
+
+ @Test
+ public void xml2pmdMorph() throws Exception{
+ System.out.println("xml2pmdMorph");
+ assertXml2Pmd(THISCLASS, "onlymorph.xml", "onlymorph.pmd");
+ return;
+ }
+
+ @Test
+ public void xml2pmdRigid() throws Exception{
+ System.out.println("xml2pmdRigid");
+ assertXml2Pmd(THISCLASS, "onlyrigid.xml", "onlyrigid.pmd");
+ return;
+ }
+
+ @Test
+ public void xml2pmdJoint() throws Exception{
+ System.out.println("xml2pmdJoint");
+ assertXml2Pmd(THISCLASS, "onlyjoint.xml", "onlyjoint.pmd");
+ return;
+ }
+
+}
+++ /dev/null
-文字集合、エンコーディング、XML文字エスケープ、空白文字に関するテストデータ。
+++ /dev/null
-最小構成のPMDファイル。
-※ XMLの改行コードはLF。ジェネレータ名は非表示。
-
-名前は空
-説明文は空
-頂点0
-ボーン0
--- /dev/null
+[UTF8 Japanese]
+
+
+10種類全てのボーンを含むPMDファイル。
+※ XMLの改行コードはLF。ジェネレータ名は非表示。
+
+
+- allbone.pmd 10種類全てのボーンを含むテストデータ。
+- allbone.xml モデルデータのソースとなったXMLファイル。
+
+
+
+-- EOF --
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ model-data(*.pmd) on XML
+-->
+
+
+<!-- [NAMELESS] -->
+<pmdModel
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ schemaVersion="101009"
+
+ name=""
+>
+
+
+<description>
+</description>
+
+<license>
+</license>
+
+<credits>
+</credits>
+
+<meta name="siteURL" content="" />
+<meta name="imageURL" content="" />
+
+<materialList>
+</materialList>
+
+<toonMap>
+ <toonDef toonFileId="tf0" index="0" winFileName="toon01.bmp" />
+ <toonDef toonFileId="tf1" index="1" winFileName="toon02.bmp" />
+ <toonDef toonFileId="tf2" index="2" winFileName="toon03.bmp" />
+ <toonDef toonFileId="tf3" index="3" winFileName="toon04.bmp" />
+ <toonDef toonFileId="tf4" index="4" winFileName="toon05.bmp" />
+ <toonDef toonFileId="tf5" index="5" winFileName="toon06.bmp" />
+ <toonDef toonFileId="tf6" index="6" winFileName="toon07.bmp" />
+ <toonDef toonFileId="tf7" index="7" winFileName="toon08.bmp" />
+ <toonDef toonFileId="tf8" index="8" winFileName="toon09.bmp" />
+ <toonDef toonFileId="tf9" index="9" winFileName="toon10.bmp" />
+</toonMap>
+
+<boneList>
+
+<!--
+Bone types:
+[0 : ROTATE : Rotate : 回転 :]
+[1 : ROTMOV : Rotate/Move : 回転/移動 :]
+[2 : IK : IK : IK :]
+[3 : UNKNOWN : Unknown : 不明 :]
+[4 : UNDERIK : Under IK : IK影響下(回転) :]
+[5 : UNDERROT : Under rotate : 回転影響下 :]
+[6 : IKCONNECTED : IK connected : IK接続先 :]
+[7 : HIDDEN : Hidden : 非表示 :]
+[8 : TWIST : Twist : 捩り :]
+[9 : LINKEDROT : Linked Rotate: 回転連動 :]
+-->
+
+ <!-- base [回転/移動] -->
+ <bone name="base" boneId="bn0" type="ROTMOV" >
+ <position x="0.0" y="0.0" z="0.0" />
+
+ <!-- #>> [anchor] -->
+ <boneChain nextBoneIdRef="bn1" />
+ </bone>
+
+ <!-- anchor [非表示] -->
+ <bone name="anchor" boneId="bn1" type="HIDDEN" >
+ <position x="0.0" y="0.0" z="0.0" />
+
+ <!-- [base] >># -->
+ <boneChain prevBoneIdRef="bn0" />
+ </bone>
+
+ <!-- hub [回転] -->
+ <bone name="hub" boneId="bn2" type="ROTATE" >
+ <position x="0.0" y="0.0" z="0.0" />
+
+ <!-- [base] >>#>> [hinge1] -->
+ <boneChain prevBoneIdRef="bn0" nextBoneIdRef="bn3" />
+ </bone>
+
+ <!-- hinge1 [IK影響下(回転)] -->
+ <bone name="hinge1" boneId="bn3" type="UNDERIK" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <ikBone boneIdRef="bn7" /> <!-- Ref:ik -->
+
+ <!-- [hub] >>#>> [hinge2] -->
+ <boneChain prevBoneIdRef="bn2" nextBoneIdRef="bn4" />
+ </bone>
+
+ <!-- hinge2 [IK影響下(回転)] -->
+ <bone name="hinge2" boneId="bn4" type="UNDERIK" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <ikBone boneIdRef="bn7" /> <!-- Ref:ik -->
+
+ <!-- [hinge1] >>#>> [iktarget] -->
+ <boneChain prevBoneIdRef="bn3" nextBoneIdRef="bn5" />
+ </bone>
+
+ <!-- iktarget [IK影響下(回転)] -->
+ <bone name="iktarget" boneId="bn5" type="UNDERIK" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <ikBone boneIdRef="bn7" /> <!-- Ref:ik -->
+
+ <!-- [hinge2] >>#>> [toe] -->
+ <boneChain prevBoneIdRef="bn4" nextBoneIdRef="bn6" />
+ </bone>
+
+ <!-- toe [IK接続先] -->
+ <bone name="toe" boneId="bn6" type="IKCONNECTED" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <ikBone boneIdRef="bn7" /> <!-- Ref:ik -->
+
+ <!-- [iktarget] >># -->
+ <boneChain prevBoneIdRef="bn5" />
+ </bone>
+
+ <!-- ik [IK] -->
+ <bone name="ik" boneId="bn7" type="IK" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+ <!-- toeik [IK] -->
+ <bone name="toeik" boneId="bn8" type="IK" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+ <!-- botheye [回転] -->
+ <bone name="botheye" boneId="bn9" type="ROTATE" >
+ <position x="0.0" y="0.0" z="0.0" />
+
+ <!-- [hub] >># -->
+ <boneChain prevBoneIdRef="bn2" />
+ </bone>
+
+ <!-- monoeye [回転影響下] -->
+ <bone name="monoeye" boneId="bn10" type="UNDERROT" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <ikBone boneIdRef="bn9" /> <!-- Ref:botheye -->
+
+ <!-- [hub] >># -->
+ <boneChain prevBoneIdRef="bn2" />
+ </bone>
+
+ <!-- arm [回転] -->
+ <bone name="arm" boneId="bn11" type="ROTATE" >
+ <position x="0.0" y="0.0" z="0.0" />
+
+ <!-- [hub] >>#>> [elbow] -->
+ <boneChain prevBoneIdRef="bn2" nextBoneIdRef="bn13" />
+ </bone>
+
+ <!-- twist [捩り] -->
+ <bone name="twist" boneId="bn12" type="TWIST" >
+ <position x="0.0" y="0.0" z="0.0" />
+
+ <!-- [arm] >># -->
+ <boneChain prevBoneIdRef="bn11" />
+ </bone>
+
+ <!-- elbow [回転] -->
+ <bone name="elbow" boneId="bn13" type="ROTATE" >
+ <position x="0.0" y="0.0" z="0.0" />
+
+ <!-- [twist] >># -->
+ <boneChain prevBoneIdRef="bn12" />
+ </bone>
+
+ <!-- lr [回転連動] -->
+ <bone name="lr" boneId="bn14" type="LINKEDROT" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <rotationRatio ratio="25" />
+
+ <!-- [arm] >>#>> [twist] -->
+ <boneChain prevBoneIdRef="bn11" nextBoneIdRef="bn12" />
+ </bone>
+
+ <!-- unknown [不明] -->
+ <bone name="unknown" boneId="bn15" type="UNKNOWN" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+</boneList>
+
+<boneGroupList>
+</boneGroupList>
+
+<ikChainList>
+
+ <!-- Ref:ik -->
+ <ikChain ikBoneIdRef="bn7" recursiveDepth="10" weight="0.1" >
+ <chainOrder boneIdRef="bn5" /> <!-- Ref:iktarget -->
+ <chainOrder boneIdRef="bn4" /> <!-- Ref:hinge2 -->
+ <chainOrder boneIdRef="bn3" /> <!-- Ref:hinge1 -->
+ </ikChain>
+
+ <!-- Ref:toeik -->
+ <ikChain ikBoneIdRef="bn8" recursiveDepth="10" weight="0.1" >
+ <chainOrder boneIdRef="bn6" /> <!-- Ref:toe -->
+ <chainOrder boneIdRef="bn5" /> <!-- Ref:iktarget -->
+ </ikChain>
+
+</ikChainList>
+
+<morphList>
+</morphList>
+
+<rigidList>
+</rigidList>
+
+<rigidGroupList>
+
+ <rigidGroup rigidGroupId="rg1" />
+ <rigidGroup rigidGroupId="rg2" />
+ <rigidGroup rigidGroupId="rg3" />
+ <rigidGroup rigidGroupId="rg4" />
+ <rigidGroup rigidGroupId="rg5" />
+ <rigidGroup rigidGroupId="rg6" />
+ <rigidGroup rigidGroupId="rg7" />
+ <rigidGroup rigidGroupId="rg8" />
+ <rigidGroup rigidGroupId="rg9" />
+ <rigidGroup rigidGroupId="rg10" />
+ <rigidGroup rigidGroupId="rg11" />
+ <rigidGroup rigidGroupId="rg12" />
+ <rigidGroup rigidGroupId="rg13" />
+ <rigidGroup rigidGroupId="rg14" />
+ <rigidGroup rigidGroupId="rg15" />
+ <rigidGroup rigidGroupId="rg16" />
+
+</rigidGroupList>
+
+<jointList>
+</jointList>
+
+<surfaceGroupList>
+</surfaceGroupList>
+
+<vertexList>
+</vertexList>
+
+</pmdModel>
+
+<!-- EOF -->
--- /dev/null
+[UTF8 Japanese]
+
+
+文字集合、エンコーディング、空白文字に関するPMDテストデータ。
+※ XMLの改行コードはLF。ジェネレータ名は非表示。
+
+
+- charset.pmd モデル名とモデル説明文に色々な字が書き込まれたテストデータ。
+- source.xml モデルデータのソースとなったXMLファイル。
+- result.xml モデルデータをXML化したときのあるべきXMLファイル。
+
+
+PMDモデルファイル内の文字データは
+文字集合「JIS X 0208-1990」に
+マイクロソフトによる追加文字を加えた物を
+シフトJISで符号化したものと仮定する。
+
+この文字コード形式の一般的な規格名は
+・Windows-31J
+・CP932
+など
+
+MMDでは、濁点を伴う半角カタカナなどをそのまま識別子に使う機会も多い。
+Unicodeデータとの交換時には、不用意な正規化を行わないよう注意が必要。
+
+
+-- EOF --
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ model-data(*.pmd) on XML
+-->
+
+
+<!-- a A 9 亜'" -->
+<pmdModel
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ schemaVersion="101009"
+
+ name="a A  9 亜'""
+>
+
+
+<description>
+azAZ09ア<br/>
+AZ09あアゑヵヶ<br/>
+ヴウ゛ヴパハ゜パ<br/>
+ΩωЖж┴<br/>
+峠壺壷尭堯凜熙<br/>
+\\\¥<br/>
+髙⑨≒∵¬㈱Σ<br/>
+#$[\]^{|}~<br/>
+'"&<><br/>
+<!--fake comment--><br/>
+A B  C<br/>
+A	B		C<br/>
+A B  C<br/>
+AB<br/>
+</description>
+<!--
+azAZ09ア
+AZ09あアゑヵヶ
+ヴウ゛ヴパハ゜パ
+ΩωЖж┴
+峠壺壷尭堯凜熙
+\\\¥
+髙⑨≒∵¬㈱Σ
+#$[\]^{|}~
+'"&<>
+<!- -fake comment- ->
+A B C
+A␉B␉␉C
+A B C
+AB
+-->
+
+<license>
+</license>
+
+<credits>
+</credits>
+
+<meta name="siteURL" content="" />
+<meta name="imageURL" content="" />
+
+<materialList>
+</materialList>
+
+<toonMap>
+ <toonDef toonFileId="tf0" index="0" winFileName="toon01.bmp" />
+ <toonDef toonFileId="tf1" index="1" winFileName="toon02.bmp" />
+ <toonDef toonFileId="tf2" index="2" winFileName="toon03.bmp" />
+ <toonDef toonFileId="tf3" index="3" winFileName="toon04.bmp" />
+ <toonDef toonFileId="tf4" index="4" winFileName="toon05.bmp" />
+ <toonDef toonFileId="tf5" index="5" winFileName="toon06.bmp" />
+ <toonDef toonFileId="tf6" index="6" winFileName="toon07.bmp" />
+ <toonDef toonFileId="tf7" index="7" winFileName="toon08.bmp" />
+ <toonDef toonFileId="tf8" index="8" winFileName="toon09.bmp" />
+ <toonDef toonFileId="tf9" index="9" winFileName="toon10.bmp" />
+</toonMap>
+
+<boneList>
+</boneList>
+
+<boneGroupList>
+</boneGroupList>
+
+<ikChainList>
+</ikChainList>
+
+<morphList>
+</morphList>
+
+<rigidList>
+</rigidList>
+
+<rigidGroupList>
+
+ <rigidGroup rigidGroupId="rg1" />
+ <rigidGroup rigidGroupId="rg2" />
+ <rigidGroup rigidGroupId="rg3" />
+ <rigidGroup rigidGroupId="rg4" />
+ <rigidGroup rigidGroupId="rg5" />
+ <rigidGroup rigidGroupId="rg6" />
+ <rigidGroup rigidGroupId="rg7" />
+ <rigidGroup rigidGroupId="rg8" />
+ <rigidGroup rigidGroupId="rg9" />
+ <rigidGroup rigidGroupId="rg10" />
+ <rigidGroup rigidGroupId="rg11" />
+ <rigidGroup rigidGroupId="rg12" />
+ <rigidGroup rigidGroupId="rg13" />
+ <rigidGroup rigidGroupId="rg14" />
+ <rigidGroup rigidGroupId="rg15" />
+ <rigidGroup rigidGroupId="rg16" />
+
+</rigidGroupList>
+
+<jointList>
+</jointList>
+
+<surfaceGroupList>
+</surfaceGroupList>
+
+<vertexList>
+</vertexList>
+
+</pmdModel>
+
+<!-- EOF -->
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ model-data(*.pmd) on XML
+-->
+
+
+<pmdModel
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ schemaVersion="101009"
+
+ name="a A 9 亜'""
+>
+
+
+<description>
+azAZ09ア<br/><!-- 半角 -->
+AZ09あアゑヵヶ<br/><!-- 全角 -->
+ヴウ゛ヴパハ゜パ<br/><!-- 濁点 & 半濁点 -->
+ΩωЖж┴<br/><!-- ギリシャ & ロシア & 罫線 -->
+峠壺壷尭堯凜熙<br/><!-- 国字 JIS78 → JIS83 → JIS90 -->
+\\¥¥<br/><!-- 円通貨 & バックスラッシュ -->
+髙⑨≒∵¬㈱Σ<br/><!-- IBM漢字 & NEC漢字 & MS漢字 -->
+#$[\]^{|}~<br/><!-- ISO-646 バリアント -->
+<![CDATA['"&<>]]><br/><!-- XML 特殊文字 -->
+<![CDATA[<!--fake comment-->]]><br/><!-- コメントのCDATA化 -->
+A B C<br/><!-- 半角スペース -->
+A	B		C<br/><!-- タブ -->
+A B C<br/><!-- 全角スペース -->
+A
B<br/><!-- 無視される改行 -->
+</description>
+
+<license>
+</license>
+
+<credits>
+</credits>
+
+<meta name="siteURL" content="" />
+<meta name="imageURL" content="" />
+
+<materialList>
+
+</materialList>
+
+<toonMap>
+ <toonDef toonFileId="tf0" index="0" winFileName="toon01.bmp" />
+ <toonDef toonFileId="tf1" index="1" winFileName="toon02.bmp" />
+ <toonDef toonFileId="tf2" index="2" winFileName="toon03.bmp" />
+ <toonDef toonFileId="tf3" index="3" winFileName="toon04.bmp" />
+ <toonDef toonFileId="tf4" index="4" winFileName="toon05.bmp" />
+ <toonDef toonFileId="tf5" index="5" winFileName="toon06.bmp" />
+ <toonDef toonFileId="tf6" index="6" winFileName="toon07.bmp" />
+ <toonDef toonFileId="tf7" index="7" winFileName="toon08.bmp" />
+ <toonDef toonFileId="tf8" index="8" winFileName="toon09.bmp" />
+ <toonDef toonFileId="tf9" index="9" winFileName="toon10.bmp" />
+</toonMap>
+
+<boneList>
+</boneList>
+
+<boneGroupList>
+
+</boneGroupList>
+
+<ikChainList>
+
+</ikChainList>
+
+<morphList>
+</morphList>
+
+<rigidList>
+</rigidList>
+
+<rigidGroupList>
+
+ <rigidGroup rigidGroupId="rg1" />
+ <rigidGroup rigidGroupId="rg2" />
+ <rigidGroup rigidGroupId="rg3" />
+ <rigidGroup rigidGroupId="rg4" />
+ <rigidGroup rigidGroupId="rg5" />
+ <rigidGroup rigidGroupId="rg6" />
+ <rigidGroup rigidGroupId="rg7" />
+ <rigidGroup rigidGroupId="rg8" />
+ <rigidGroup rigidGroupId="rg9" />
+ <rigidGroup rigidGroupId="rg10" />
+ <rigidGroup rigidGroupId="rg11" />
+ <rigidGroup rigidGroupId="rg12" />
+ <rigidGroup rigidGroupId="rg13" />
+ <rigidGroup rigidGroupId="rg14" />
+ <rigidGroup rigidGroupId="rg15" />
+ <rigidGroup rigidGroupId="rg16" />
+
+</rigidGroupList>
+
+<jointList>
+
+</jointList>
+
+<surfaceGroupList>
+
+</surfaceGroupList>
+
+<vertexList>
+
+</vertexList>
+
+</pmdModel>
+
+<!-- EOF -->
--- /dev/null
+[UTF8 Japanese]
+
+
+ボーンをグループ分けしたPMDファイル。
+※ XMLの改行コードはLF。ジェネレータ名は非表示。
+
+
+- boneGroup.pmd グループ分けされたボーンを有するテストデータ。
+- boneGroup.xml モデルデータのソースとなったXMLファイル。
+
+
+test0からtest3までの名が付けられた4ボーンが
+ボーン枠「偶数ボーン」とボーン枠「奇数ボーン」に2つずつ振り分けられる。
+
+ボーン名「test」は0番ボーン扱い。
+
+
+-- EOF --
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ model-data(*.pmd) on XML
+-->
+
+
+<!-- [NAMELESS] -->
+<pmdModel
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ schemaVersion="101009"
+
+ name=""
+>
+
+
+<description>
+</description>
+
+<license>
+</license>
+
+<credits>
+</credits>
+
+<meta name="siteURL" content="" />
+<meta name="imageURL" content="" />
+
+<materialList>
+</materialList>
+
+<toonMap>
+ <toonDef toonFileId="tf0" index="0" winFileName="toon01.bmp" />
+ <toonDef toonFileId="tf1" index="1" winFileName="toon02.bmp" />
+ <toonDef toonFileId="tf2" index="2" winFileName="toon03.bmp" />
+ <toonDef toonFileId="tf3" index="3" winFileName="toon04.bmp" />
+ <toonDef toonFileId="tf4" index="4" winFileName="toon05.bmp" />
+ <toonDef toonFileId="tf5" index="5" winFileName="toon06.bmp" />
+ <toonDef toonFileId="tf6" index="6" winFileName="toon07.bmp" />
+ <toonDef toonFileId="tf7" index="7" winFileName="toon08.bmp" />
+ <toonDef toonFileId="tf8" index="8" winFileName="toon09.bmp" />
+ <toonDef toonFileId="tf9" index="9" winFileName="toon10.bmp" />
+</toonMap>
+
+<boneList>
+
+<!--
+Bone types:
+[0 : ROTATE : Rotate : 回転 :]
+[1 : ROTMOV : Rotate/Move : 回転/移動 :]
+[2 : IK : IK : IK :]
+[3 : UNKNOWN : Unknown : 不明 :]
+[4 : UNDERIK : Under IK : IK影響下(回転) :]
+[5 : UNDERROT : Under rotate : 回転影響下 :]
+[6 : IKCONNECTED : IK connected : IK接続先 :]
+[7 : HIDDEN : Hidden : 非表示 :]
+[8 : TWIST : Twist : 捩り :]
+[9 : LINKEDROT : Linked Rotate: 回転連動 :]
+-->
+
+ <!-- test [回転/移動] -->
+ <bone name="test" boneId="bn0" type="ROTMOV" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+ <!-- test0 [回転/移動] -->
+ <bone name="test0" boneId="bn1" type="ROTMOV" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+ <!-- test1 [回転/移動] -->
+ <bone name="test1" boneId="bn2" type="ROTMOV" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+ <!-- test2 [回転/移動] -->
+ <bone name="test2" boneId="bn3" type="ROTMOV" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+ <!-- test3 [回転/移動] -->
+ <bone name="test3" boneId="bn4" type="ROTMOV" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+</boneList>
+
+<boneGroupList>
+
+ <!-- 偶数グループ -->
+ <boneGroup name="偶数グループ" >
+ <boneGroupMember boneIdRef="bn1" /> <!-- Ref:test0 -->
+ <boneGroupMember boneIdRef="bn3" /> <!-- Ref:test2 -->
+ </boneGroup>
+
+ <!-- 奇数グループ -->
+ <boneGroup name="奇数グループ" >
+ <boneGroupMember boneIdRef="bn2" /> <!-- Ref:test1 -->
+ <boneGroupMember boneIdRef="bn4" /> <!-- Ref:test3 -->
+ </boneGroup>
+
+</boneGroupList>
+
+<ikChainList>
+</ikChainList>
+
+<morphList>
+</morphList>
+
+<rigidList>
+</rigidList>
+
+<rigidGroupList>
+
+ <rigidGroup rigidGroupId="rg1" />
+ <rigidGroup rigidGroupId="rg2" />
+ <rigidGroup rigidGroupId="rg3" />
+ <rigidGroup rigidGroupId="rg4" />
+ <rigidGroup rigidGroupId="rg5" />
+ <rigidGroup rigidGroupId="rg6" />
+ <rigidGroup rigidGroupId="rg7" />
+ <rigidGroup rigidGroupId="rg8" />
+ <rigidGroup rigidGroupId="rg9" />
+ <rigidGroup rigidGroupId="rg10" />
+ <rigidGroup rigidGroupId="rg11" />
+ <rigidGroup rigidGroupId="rg12" />
+ <rigidGroup rigidGroupId="rg13" />
+ <rigidGroup rigidGroupId="rg14" />
+ <rigidGroup rigidGroupId="rg15" />
+ <rigidGroup rigidGroupId="rg16" />
+
+</rigidGroupList>
+
+<jointList>
+</jointList>
+
+<surfaceGroupList>
+</surfaceGroupList>
+
+<vertexList>
+</vertexList>
+
+</pmdModel>
+
+<!-- EOF -->
--- /dev/null
+[UTF8 Japanese]
+
+
+各種英語名を記述したPMDファイル。
+※ XMLの改行コードはLF。ジェネレータ名は非表示。
+
+
+- i18n.pmd 英語名が記述されたテストデータ。
+- i18n.xml モデルデータのソースとなったXMLファイル。
+
+
+モデル名「テストモデル」に対応する英語名「TestModel」
+説明文「説明」に対応する英語文「Description」
+ボーン名「センター」に対応する英語名「Center」
+ボーン名「テストボーン」に対応する英語名「TestBone」
+グループ枠「テストグループ」に対応する英語名「TestGroup」
+モーフ名「テストモーフ」に対応する英語名「TestMorph」
+
+
+
+-- EOF --
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ model-data(*.pmd) on XML
+-->
+
+
+<!-- テストモデル -->
+<pmdModel
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ schemaVersion="101009"
+
+ name="テストモデル"
+>
+
+<i18nName lang="en" name="TestModel" />
+
+<description>
+説明
+</description>
+<!--
+説明
+-->
+
+<description lang="en" >
+Description
+</description>
+
+<license>
+</license>
+
+<credits>
+</credits>
+
+<meta name="siteURL" content="" />
+<meta name="imageURL" content="" />
+
+<materialList>
+
+ <material showEdge="true" surfaceGroupIdRef="sg0" >
+ <diffuse r="0.75" g="0.25" b="0.25" alpha="1.0" />
+ <specular r="0.0" g="0.0" b="0.0" shininess="5.0" />
+ <ambient r="0.25" g="0.75" b="0.25" />
+ </material>
+
+</materialList>
+
+<toonMap>
+ <toonDef toonFileId="tf0" index="0" winFileName="toon01.bmp" />
+ <toonDef toonFileId="tf1" index="1" winFileName="toon02.bmp" />
+ <toonDef toonFileId="tf2" index="2" winFileName="toon03.bmp" />
+ <toonDef toonFileId="tf3" index="3" winFileName="toon04.bmp" />
+ <toonDef toonFileId="tf4" index="4" winFileName="toon05.bmp" />
+ <toonDef toonFileId="tf5" index="5" winFileName="toon06.bmp" />
+ <toonDef toonFileId="tf6" index="6" winFileName="toon07.bmp" />
+ <toonDef toonFileId="tf7" index="7" winFileName="toon08.bmp" />
+ <toonDef toonFileId="tf8" index="8" winFileName="toon09.bmp" />
+ <toonDef toonFileId="tf9" index="9" winFileName="toon10.bmp" />
+</toonMap>
+
+<boneList>
+
+<!--
+Bone types:
+[0 : ROTATE : Rotate : 回転 :]
+[1 : ROTMOV : Rotate/Move : 回転/移動 :]
+[2 : IK : IK : IK :]
+[3 : UNKNOWN : Unknown : 不明 :]
+[4 : UNDERIK : Under IK : IK影響下(回転) :]
+[5 : UNDERROT : Under rotate : 回転影響下 :]
+[6 : IKCONNECTED : IK connected : IK接続先 :]
+[7 : HIDDEN : Hidden : 非表示 :]
+[8 : TWIST : Twist : 捩り :]
+[9 : LINKEDROT : Linked Rotate: 回転連動 :]
+-->
+
+ <!-- センター [回転/移動] -->
+ <bone name="センター" boneId="bn0" type="ROTMOV" >
+ <i18nName lang="en" name="Center" />
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+ <!-- テストボーン [回転/移動] -->
+ <bone name="テストボーン" boneId="bn1" type="ROTMOV" >
+ <i18nName lang="en" name="TestBone" />
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+</boneList>
+
+<boneGroupList>
+
+ <!-- テストグループ -->
+ <boneGroup name="テストグループ" >
+ <i18nName lang="en" name="TestGroup" />
+ <boneGroupMember boneIdRef="bn1" /> <!-- Ref:テストボーン -->
+ </boneGroup>
+
+</boneGroupList>
+
+<ikChainList>
+</ikChainList>
+
+<morphList>
+
+<!--
+Morph types:
+[1 : EYEBROW : まゆ ]
+[2 : EYE : 目 ]
+[3 : LIP : リップ ]
+[4 : EXTRA : その他 ]
+-->
+
+ <!-- テストモーフ -->
+ <morph name="テストモーフ" type="EXTRA" >
+ <i18nName lang="en" name="TestMorph" />
+ <morphVertex vtxIdRef="vtx0" xOff="0.0" yOff="3.0" zOff="0.0" />
+ </morph>
+
+</morphList>
+
+<rigidList>
+</rigidList>
+
+<rigidGroupList>
+
+ <rigidGroup rigidGroupId="rg1" />
+ <rigidGroup rigidGroupId="rg2" />
+ <rigidGroup rigidGroupId="rg3" />
+ <rigidGroup rigidGroupId="rg4" />
+ <rigidGroup rigidGroupId="rg5" />
+ <rigidGroup rigidGroupId="rg6" />
+ <rigidGroup rigidGroupId="rg7" />
+ <rigidGroup rigidGroupId="rg8" />
+ <rigidGroup rigidGroupId="rg9" />
+ <rigidGroup rigidGroupId="rg10" />
+ <rigidGroup rigidGroupId="rg11" />
+ <rigidGroup rigidGroupId="rg12" />
+ <rigidGroup rigidGroupId="rg13" />
+ <rigidGroup rigidGroupId="rg14" />
+ <rigidGroup rigidGroupId="rg15" />
+ <rigidGroup rigidGroupId="rg16" />
+
+</rigidGroupList>
+
+<jointList>
+</jointList>
+
+<surfaceGroupList>
+
+ <surfaceGroup surfaceGroupId="sg0" >
+ <surface vtxIdRef1="vtx0" vtxIdRef2="vtx1" vtxIdRef3="vtx2" />
+ </surfaceGroup>
+
+</surfaceGroupList>
+
+<vertexList>
+
+ <vertex vtxId="vtx0" showEdge="true" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <normal x="0.0" y="0.0" z="-1.0" />
+ <uvMap u="0.0" v="1.0" />
+ <skinning boneIdRef1="bn0" boneIdRef2="bn0" weightBalance="100" />
+ </vertex>
+
+ <vertex vtxId="vtx1" showEdge="true" >
+ <position x="-5.0" y="8.0" z="0.0" />
+ <normal x="0.0" y="0.0" z="-1.0" />
+ <uvMap u="0.0" v="1.0" />
+ <skinning boneIdRef1="bn0" boneIdRef2="bn0" weightBalance="100" />
+ </vertex>
+
+ <vertex vtxId="vtx2" showEdge="true" >
+ <position x="5.0" y="8.0" z="0.0" />
+ <normal x="0.0" y="0.0" z="-1.0" />
+ <uvMap u="0.0" v="1.0" />
+ <skinning boneIdRef1="bn0" boneIdRef2="bn0" weightBalance="100" />
+ </vertex>
+
+</vertexList>
+
+</pmdModel>
+
+<!-- EOF -->
--- /dev/null
+[UTF8 Japanese]
+
+
+IKボーンを記述したPMDファイル。
+※ XMLの改行コードはLF。ジェネレータ名は非表示。
+
+
+- ikBone.pmd IKボーンが記述されたテストデータ。
+- ikBone.xml モデルデータのソースとなったXMLファイル。
+
+
+左足首 → 左ひざ → 左足 → センター の順で親ボーンを参照する。
+左足首、左ひざ、左足、いずれのボーン分類も「IK影響下」
+
+IKボーン「左足IK」のターゲットは「左足首」。
+IKボーン「左足IK」の影響下にあるボーンは「左ひざ」と「左足」の順。
+IKボーン「左足IK」によるIK処理のループ回数は50、単位は0.5
+
+
+
+-- EOF --
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ model-data(*.pmd) on XML
+-->
+
+
+<!-- [NAMELESS] -->
+<pmdModel
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ schemaVersion="101009"
+
+ name=""
+>
+
+
+<description>
+</description>
+
+<license>
+</license>
+
+<credits>
+</credits>
+
+<meta name="siteURL" content="" />
+<meta name="imageURL" content="" />
+
+<materialList>
+</materialList>
+
+<toonMap>
+ <toonDef toonFileId="tf0" index="0" winFileName="toon01.bmp" />
+ <toonDef toonFileId="tf1" index="1" winFileName="toon02.bmp" />
+ <toonDef toonFileId="tf2" index="2" winFileName="toon03.bmp" />
+ <toonDef toonFileId="tf3" index="3" winFileName="toon04.bmp" />
+ <toonDef toonFileId="tf4" index="4" winFileName="toon05.bmp" />
+ <toonDef toonFileId="tf5" index="5" winFileName="toon06.bmp" />
+ <toonDef toonFileId="tf6" index="6" winFileName="toon07.bmp" />
+ <toonDef toonFileId="tf7" index="7" winFileName="toon08.bmp" />
+ <toonDef toonFileId="tf8" index="8" winFileName="toon09.bmp" />
+ <toonDef toonFileId="tf9" index="9" winFileName="toon10.bmp" />
+</toonMap>
+
+<boneList>
+
+<!--
+Bone types:
+[0 : ROTATE : Rotate : 回転 :]
+[1 : ROTMOV : Rotate/Move : 回転/移動 :]
+[2 : IK : IK : IK :]
+[3 : UNKNOWN : Unknown : 不明 :]
+[4 : UNDERIK : Under IK : IK影響下(回転) :]
+[5 : UNDERROT : Under rotate : 回転影響下 :]
+[6 : IKCONNECTED : IK connected : IK接続先 :]
+[7 : HIDDEN : Hidden : 非表示 :]
+[8 : TWIST : Twist : 捩り :]
+[9 : LINKEDROT : Linked Rotate: 回転連動 :]
+-->
+
+ <!-- センター [回転/移動] -->
+ <bone name="センター" boneId="bn0" type="ROTMOV" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+ <!-- 左足 [IK影響下(回転)] -->
+ <bone name="左足" boneId="bn1" type="UNDERIK" >
+ <position x="0.0" y="10.0" z="0.0" />
+ <ikBone boneIdRef="bn4" /> <!-- Ref:左足IK -->
+
+ <!-- [センター] >>#>> [左ひざ] -->
+ <boneChain prevBoneIdRef="bn0" nextBoneIdRef="bn2" />
+ </bone>
+
+ <!-- 左ひざ [IK影響下(回転)] -->
+ <bone name="左ひざ" boneId="bn2" type="UNDERIK" >
+ <position x="0.0" y="7.0" z="-0.01" />
+ <ikBone boneIdRef="bn4" /> <!-- Ref:左足IK -->
+
+ <!-- [左足] >>#>> [左足首] -->
+ <boneChain prevBoneIdRef="bn1" nextBoneIdRef="bn3" />
+ </bone>
+
+ <!-- 左足首 [IK影響下(回転)] -->
+ <bone name="左足首" boneId="bn3" type="UNDERIK" >
+ <position x="0.0" y="4.0" z="0.0" />
+ <ikBone boneIdRef="bn4" /> <!-- Ref:左足IK -->
+
+ <!-- [左ひざ] >># -->
+ <boneChain prevBoneIdRef="bn2" />
+ </bone>
+
+ <!-- 左足IK [IK] -->
+ <bone name="左足IK" boneId="bn4" type="IK" >
+ <position x="0.0" y="4.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+</boneList>
+
+<boneGroupList>
+</boneGroupList>
+
+<ikChainList>
+
+ <!-- Ref:左足IK -->
+ <ikChain ikBoneIdRef="bn4" recursiveDepth="50" weight="0.5" >
+ <chainOrder boneIdRef="bn3" /> <!-- Ref:左足首 -->
+ <chainOrder boneIdRef="bn2" /> <!-- Ref:左ひざ -->
+ <chainOrder boneIdRef="bn1" /> <!-- Ref:左足 -->
+ </ikChain>
+
+</ikChainList>
+
+<morphList>
+</morphList>
+
+<rigidList>
+</rigidList>
+
+<rigidGroupList>
+
+ <rigidGroup rigidGroupId="rg1" />
+ <rigidGroup rigidGroupId="rg2" />
+ <rigidGroup rigidGroupId="rg3" />
+ <rigidGroup rigidGroupId="rg4" />
+ <rigidGroup rigidGroupId="rg5" />
+ <rigidGroup rigidGroupId="rg6" />
+ <rigidGroup rigidGroupId="rg7" />
+ <rigidGroup rigidGroupId="rg8" />
+ <rigidGroup rigidGroupId="rg9" />
+ <rigidGroup rigidGroupId="rg10" />
+ <rigidGroup rigidGroupId="rg11" />
+ <rigidGroup rigidGroupId="rg12" />
+ <rigidGroup rigidGroupId="rg13" />
+ <rigidGroup rigidGroupId="rg14" />
+ <rigidGroup rigidGroupId="rg15" />
+ <rigidGroup rigidGroupId="rg16" />
+
+</rigidGroupList>
+
+<jointList>
+</jointList>
+
+<surfaceGroupList>
+</surfaceGroupList>
+
+<vertexList>
+</vertexList>
+
+</pmdModel>
+
+<!-- EOF -->
--- /dev/null
+[UTF8 Japanese]
+
+
+様々なマテリアル設定を含むPMDファイル。
+※ XMLの改行コードはLF。ジェネレータ名は非表示。
+
+
+- material.pmd 様々なマテリアル設定を含むテストデータ。
+- material.xml モデルデータのソースとなったXMLファイル。
+
+
+・マテリアル0番
+ エッジ表示フラグがオフな事を確認。
+
+・マテリアル1番
+ ビルトインのトゥーンマップ名"toon01.bmp"が指定されていることを確認。
+
+・マテリアル2番
+ カスタムトゥーンマップ名"test.bmp"が指定されていることを確認。
+
+・マテリアル3番
+ テクスチャマップファイル名に"Test.bmp"が指定されていることを確認。
+
+・マテリアル4番
+ スフィアマップファイル名に"Test.sph"が指定されていることを確認。
+
+・マテリアル5番
+ トゥーンマップとテクスチャマップとスフィアマップが
+ 同時に指定されていることを確認。
+
+・マテリアル6番
+ 加算スフィアマップファイル名に"Test.spa"が指定されていることを確認。
+
+
+
+-- EOF --
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ model-data(*.pmd) on XML
+-->
+
+
+<!-- [NAMELESS] -->
+<pmdModel
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ schemaVersion="101009"
+
+ name=""
+>
+
+
+<description>
+</description>
+
+<license>
+</license>
+
+<credits>
+</credits>
+
+<meta name="siteURL" content="" />
+<meta name="imageURL" content="" />
+
+<materialList>
+
+ <material showEdge="false" surfaceGroupIdRef="sg0" >
+ <diffuse r="0.25" g="0.5" b="0.75" alpha="0.875" />
+ <specular r="0.0" g="1.0" b="0.5" shininess="3.0" />
+ <ambient r="0.75" g="0.5" b="0.25" />
+ </material>
+
+ <material showEdge="true" surfaceGroupIdRef="sg1" >
+ <diffuse r="0.25" g="0.5" b="0.75" alpha="0.125" />
+ <specular r="0.0" g="1.0" b="0.5" shininess="0.0" />
+ <ambient r="0.75" g="0.5" b="0.25" />
+ <toon toonFileIdRef="tf0" /> <!-- toon01.bmp -->
+ </material>
+
+ <material showEdge="true" surfaceGroupIdRef="sg2" >
+ <diffuse r="0.25" g="0.5" b="0.75" alpha="0.125" />
+ <specular r="0.0" g="1.0" b="0.5" shininess="0.0" />
+ <ambient r="0.75" g="0.5" b="0.25" />
+ <toon toonFileIdRef="tf9" /> <!-- test.bmp -->
+ </material>
+
+ <material showEdge="true" surfaceGroupIdRef="sg3" >
+ <diffuse r="0.25" g="0.5" b="0.75" alpha="0.125" />
+ <specular r="0.0" g="1.0" b="0.5" shininess="0.0" />
+ <ambient r="0.75" g="0.5" b="0.25" />
+ <textureFile winFileName="Tex.bmp" />
+ </material>
+
+ <material showEdge="true" surfaceGroupIdRef="sg4" >
+ <diffuse r="0.25" g="0.5" b="0.75" alpha="0.125" />
+ <specular r="0.0" g="1.0" b="0.5" shininess="0.0" />
+ <ambient r="0.75" g="0.5" b="0.25" />
+ <spheremapFile winFileName="Tex.sph" />
+ </material>
+
+ <material showEdge="true" surfaceGroupIdRef="sg5" >
+ <diffuse r="0.25" g="0.5" b="0.75" alpha="0.125" />
+ <specular r="0.0" g="1.0" b="0.5" shininess="0.0" />
+ <ambient r="0.75" g="0.5" b="0.25" />
+ <toon toonFileIdRef="tf0" /> <!-- toon01.bmp -->
+ <textureFile winFileName="Tex.bmp" />
+ <spheremapFile winFileName="Tex.sph" />
+ </material>
+
+ <material showEdge="true" surfaceGroupIdRef="sg6" >
+ <diffuse r="0.25" g="0.5" b="0.75" alpha="0.125" />
+ <specular r="0.0" g="1.0" b="0.5" shininess="0.0" />
+ <ambient r="0.75" g="0.5" b="0.25" />
+ <spheremapFile winFileName="Tex.spa" />
+ </material>
+
+</materialList>
+
+<toonMap>
+ <toonDef toonFileId="tf0" index="0" winFileName="toon01.bmp" />
+ <toonDef toonFileId="tf1" index="1" winFileName="toon02.bmp" />
+ <toonDef toonFileId="tf2" index="2" winFileName="toon03.bmp" />
+ <toonDef toonFileId="tf3" index="3" winFileName="toon04.bmp" />
+ <toonDef toonFileId="tf4" index="4" winFileName="toon05.bmp" />
+ <toonDef toonFileId="tf5" index="5" winFileName="toon06.bmp" />
+ <toonDef toonFileId="tf6" index="6" winFileName="toon07.bmp" />
+ <toonDef toonFileId="tf7" index="7" winFileName="toon08.bmp" />
+ <toonDef toonFileId="tf8" index="8" winFileName="toon09.bmp" />
+ <toonDef toonFileId="tf9" index="9" winFileName="test.bmp" />
+</toonMap>
+
+<boneList>
+
+<!--
+Bone types:
+[0 : ROTATE : Rotate : 回転 :]
+[1 : ROTMOV : Rotate/Move : 回転/移動 :]
+[2 : IK : IK : IK :]
+[3 : UNKNOWN : Unknown : 不明 :]
+[4 : UNDERIK : Under IK : IK影響下(回転) :]
+[5 : UNDERROT : Under rotate : 回転影響下 :]
+[6 : IKCONNECTED : IK connected : IK接続先 :]
+[7 : HIDDEN : Hidden : 非表示 :]
+[8 : TWIST : Twist : 捩り :]
+[9 : LINKEDROT : Linked Rotate: 回転連動 :]
+-->
+
+ <!-- test [回転/移動] -->
+ <bone name="test" boneId="bn0" type="ROTMOV" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+</boneList>
+
+<boneGroupList>
+</boneGroupList>
+
+<ikChainList>
+</ikChainList>
+
+<morphList>
+</morphList>
+
+<rigidList>
+</rigidList>
+
+<rigidGroupList>
+
+ <rigidGroup rigidGroupId="rg1" />
+ <rigidGroup rigidGroupId="rg2" />
+ <rigidGroup rigidGroupId="rg3" />
+ <rigidGroup rigidGroupId="rg4" />
+ <rigidGroup rigidGroupId="rg5" />
+ <rigidGroup rigidGroupId="rg6" />
+ <rigidGroup rigidGroupId="rg7" />
+ <rigidGroup rigidGroupId="rg8" />
+ <rigidGroup rigidGroupId="rg9" />
+ <rigidGroup rigidGroupId="rg10" />
+ <rigidGroup rigidGroupId="rg11" />
+ <rigidGroup rigidGroupId="rg12" />
+ <rigidGroup rigidGroupId="rg13" />
+ <rigidGroup rigidGroupId="rg14" />
+ <rigidGroup rigidGroupId="rg15" />
+ <rigidGroup rigidGroupId="rg16" />
+
+</rigidGroupList>
+
+<jointList>
+</jointList>
+
+<surfaceGroupList>
+
+ <surfaceGroup surfaceGroupId="sg0" >
+ <surface vtxIdRef1="vtx0" vtxIdRef2="vtx1" vtxIdRef3="vtx2" />
+ </surfaceGroup>
+
+ <surfaceGroup surfaceGroupId="sg1" >
+ <surface vtxIdRef1="vtx0" vtxIdRef2="vtx1" vtxIdRef3="vtx2" />
+ </surfaceGroup>
+
+ <surfaceGroup surfaceGroupId="sg2" >
+ <surface vtxIdRef1="vtx0" vtxIdRef2="vtx1" vtxIdRef3="vtx2" />
+ </surfaceGroup>
+
+ <surfaceGroup surfaceGroupId="sg3" >
+ <surface vtxIdRef1="vtx0" vtxIdRef2="vtx1" vtxIdRef3="vtx2" />
+ </surfaceGroup>
+
+ <surfaceGroup surfaceGroupId="sg4" >
+ <surface vtxIdRef1="vtx0" vtxIdRef2="vtx1" vtxIdRef3="vtx2" />
+ </surfaceGroup>
+
+ <surfaceGroup surfaceGroupId="sg5" >
+ <surface vtxIdRef1="vtx0" vtxIdRef2="vtx1" vtxIdRef3="vtx2" />
+ </surfaceGroup>
+
+ <surfaceGroup surfaceGroupId="sg6" >
+ <surface vtxIdRef1="vtx0" vtxIdRef2="vtx1" vtxIdRef3="vtx2" />
+ </surfaceGroup>
+
+</surfaceGroupList>
+
+<vertexList>
+
+ <vertex vtxId="vtx0" showEdge="true" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <normal x="0.0" y="0.0" z="-1.0" />
+ <uvMap u="0.0" v="1.0" />
+ <skinning boneIdRef1="bn0" boneIdRef2="bn0" weightBalance="100" />
+ </vertex>
+
+ <vertex vtxId="vtx1" showEdge="true" >
+ <position x="-5.0" y="8.0" z="0.0" />
+ <normal x="0.0" y="0.0" z="-1.0" />
+ <uvMap u="0.0" v="1.0" />
+ <skinning boneIdRef1="bn0" boneIdRef2="bn0" weightBalance="100" />
+ </vertex>
+
+ <vertex vtxId="vtx2" showEdge="true" >
+ <position x="5.0" y="8.0" z="0.0" />
+ <normal x="0.0" y="0.0" z="-1.0" />
+ <uvMap u="0.0" v="1.0" />
+ <skinning boneIdRef1="bn0" boneIdRef2="bn0" weightBalance="100" />
+ </vertex>
+
+</vertexList>
+
+</pmdModel>
+
+<!-- EOF -->
--- /dev/null
+[UTF8 Japanese]
+
+
+最小構成のPMDファイル。
+※ XMLの改行コードはLF。ジェネレータ名は非表示。
+
+
+- minimum.pmd 最小構成のテストデータ。
+- minimum.xml モデルデータのソースとなったXMLファイル。
+
+
+・名前は空。
+・説明文は空。
+・0頂点。
+・0ボーン。
+
+
+-- EOF --
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ model-data(*.pmd) on XML
+-->
+
+
+<!-- [NAMELESS] -->
+<pmdModel
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ schemaVersion="101009"
+
+ name=""
+>
+
+
+<description>
+</description>
+
+<license>
+</license>
+
+<credits>
+</credits>
+
+<meta name="siteURL" content="" />
+<meta name="imageURL" content="" />
+
+<materialList>
+</materialList>
+
+<toonMap>
+ <toonDef toonFileId="tf0" index="0" winFileName="toon01.bmp" />
+ <toonDef toonFileId="tf1" index="1" winFileName="toon02.bmp" />
+ <toonDef toonFileId="tf2" index="2" winFileName="toon03.bmp" />
+ <toonDef toonFileId="tf3" index="3" winFileName="toon04.bmp" />
+ <toonDef toonFileId="tf4" index="4" winFileName="toon05.bmp" />
+ <toonDef toonFileId="tf5" index="5" winFileName="toon06.bmp" />
+ <toonDef toonFileId="tf6" index="6" winFileName="toon07.bmp" />
+ <toonDef toonFileId="tf7" index="7" winFileName="toon08.bmp" />
+ <toonDef toonFileId="tf8" index="8" winFileName="toon09.bmp" />
+ <toonDef toonFileId="tf9" index="9" winFileName="toon10.bmp" />
+</toonMap>
+
+<boneList>
+</boneList>
+
+<boneGroupList>
+</boneGroupList>
+
+<ikChainList>
+</ikChainList>
+
+<morphList>
+</morphList>
+
+<rigidList>
+</rigidList>
+
+<rigidGroupList>
+
+ <rigidGroup rigidGroupId="rg1" />
+ <rigidGroup rigidGroupId="rg2" />
+ <rigidGroup rigidGroupId="rg3" />
+ <rigidGroup rigidGroupId="rg4" />
+ <rigidGroup rigidGroupId="rg5" />
+ <rigidGroup rigidGroupId="rg6" />
+ <rigidGroup rigidGroupId="rg7" />
+ <rigidGroup rigidGroupId="rg8" />
+ <rigidGroup rigidGroupId="rg9" />
+ <rigidGroup rigidGroupId="rg10" />
+ <rigidGroup rigidGroupId="rg11" />
+ <rigidGroup rigidGroupId="rg12" />
+ <rigidGroup rigidGroupId="rg13" />
+ <rigidGroup rigidGroupId="rg14" />
+ <rigidGroup rigidGroupId="rg15" />
+ <rigidGroup rigidGroupId="rg16" />
+
+</rigidGroupList>
+
+<jointList>
+</jointList>
+
+<surfaceGroupList>
+</surfaceGroupList>
+
+<vertexList>
+</vertexList>
+
+</pmdModel>
+
+<!-- EOF -->
--- /dev/null
+[UTF8 Japanese]
+
+
+4種類全てのモーフを含むPMDファイル。
+※ XMLの改行コードはLF。ジェネレータ名は非表示。
+
+
+- allmorph.pmd 4種類全てのモーフを含むテストデータ。
+- allmorph.xml モデルデータのソースとなったXMLファイル。
+
+
+
+-- EOF --
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ model-data(*.pmd) on XML
+-->
+
+
+<!-- [NAMELESS] -->
+<pmdModel
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ schemaVersion="101009"
+
+ name=""
+>
+
+
+<description>
+</description>
+
+<license>
+</license>
+
+<credits>
+</credits>
+
+<meta name="siteURL" content="" />
+<meta name="imageURL" content="" />
+
+<materialList>
+
+ <material showEdge="true" surfaceGroupIdRef="sg0" >
+ <diffuse r="0.75" g="0.25" b="0.25" alpha="1.0" />
+ <specular r="0.0" g="0.0" b="0.0" shininess="5.0" />
+ <ambient r="0.25" g="0.75" b="0.25" />
+ </material>
+
+</materialList>
+
+<toonMap>
+ <toonDef toonFileId="tf0" index="0" winFileName="toon01.bmp" />
+ <toonDef toonFileId="tf1" index="1" winFileName="toon02.bmp" />
+ <toonDef toonFileId="tf2" index="2" winFileName="toon03.bmp" />
+ <toonDef toonFileId="tf3" index="3" winFileName="toon04.bmp" />
+ <toonDef toonFileId="tf4" index="4" winFileName="toon05.bmp" />
+ <toonDef toonFileId="tf5" index="5" winFileName="toon06.bmp" />
+ <toonDef toonFileId="tf6" index="6" winFileName="toon07.bmp" />
+ <toonDef toonFileId="tf7" index="7" winFileName="toon08.bmp" />
+ <toonDef toonFileId="tf8" index="8" winFileName="toon09.bmp" />
+ <toonDef toonFileId="tf9" index="9" winFileName="toon10.bmp" />
+</toonMap>
+
+<boneList>
+
+<!--
+Bone types:
+[0 : ROTATE : Rotate : 回転 :]
+[1 : ROTMOV : Rotate/Move : 回転/移動 :]
+[2 : IK : IK : IK :]
+[3 : UNKNOWN : Unknown : 不明 :]
+[4 : UNDERIK : Under IK : IK影響下(回転) :]
+[5 : UNDERROT : Under rotate : 回転影響下 :]
+[6 : IKCONNECTED : IK connected : IK接続先 :]
+[7 : HIDDEN : Hidden : 非表示 :]
+[8 : TWIST : Twist : 捩り :]
+[9 : LINKEDROT : Linked Rotate: 回転連動 :]
+-->
+
+ <!-- testbone [回転/移動] -->
+ <bone name="testbone" boneId="bn0" type="ROTMOV" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+</boneList>
+
+<boneGroupList>
+</boneGroupList>
+
+<ikChainList>
+</ikChainList>
+
+<morphList>
+
+<!--
+Morph types:
+[1 : EYEBROW : まゆ ]
+[2 : EYE : 目 ]
+[3 : LIP : リップ ]
+[4 : EXTRA : その他 ]
+-->
+
+ <!-- testEyebrow -->
+ <morph name="testEyebrow" type="EYEBROW" >
+ <morphVertex vtxIdRef="vtx0" xOff="3.0" yOff="0.0" zOff="0.001" />
+ </morph>
+
+ <!-- testEye -->
+ <morph name="testEye" type="EYE" >
+ <morphVertex vtxIdRef="vtx0" xOff="0.0" yOff="3.0" zOff="0.0" />
+ </morph>
+
+ <!-- testLip -->
+ <morph name="testLip" type="LIP" >
+ <morphVertex vtxIdRef="vtx0" xOff="0.0" yOff="0.0" zOff="3.0" />
+ </morph>
+
+ <!-- testExtra -->
+ <morph name="testExtra" type="EXTRA" >
+ <morphVertex vtxIdRef="vtx0" xOff="3.0" yOff="3.0" zOff="3.0" />
+ <morphVertex vtxIdRef="vtx1" xOff="2.0" yOff="2.0" zOff="2.0" />
+ </morph>
+
+</morphList>
+
+<rigidList>
+</rigidList>
+
+<rigidGroupList>
+
+ <rigidGroup rigidGroupId="rg1" />
+ <rigidGroup rigidGroupId="rg2" />
+ <rigidGroup rigidGroupId="rg3" />
+ <rigidGroup rigidGroupId="rg4" />
+ <rigidGroup rigidGroupId="rg5" />
+ <rigidGroup rigidGroupId="rg6" />
+ <rigidGroup rigidGroupId="rg7" />
+ <rigidGroup rigidGroupId="rg8" />
+ <rigidGroup rigidGroupId="rg9" />
+ <rigidGroup rigidGroupId="rg10" />
+ <rigidGroup rigidGroupId="rg11" />
+ <rigidGroup rigidGroupId="rg12" />
+ <rigidGroup rigidGroupId="rg13" />
+ <rigidGroup rigidGroupId="rg14" />
+ <rigidGroup rigidGroupId="rg15" />
+ <rigidGroup rigidGroupId="rg16" />
+
+</rigidGroupList>
+
+<jointList>
+</jointList>
+
+<surfaceGroupList>
+
+ <surfaceGroup surfaceGroupId="sg0" >
+ <surface vtxIdRef1="vtx0" vtxIdRef2="vtx1" vtxIdRef3="vtx2" />
+ </surfaceGroup>
+
+</surfaceGroupList>
+
+<vertexList>
+
+ <vertex vtxId="vtx0" showEdge="true" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <normal x="0.0" y="0.0" z="-1.0" />
+ <uvMap u="0.0" v="1.0" />
+ <skinning boneIdRef1="bn0" boneIdRef2="bn0" weightBalance="100" />
+ </vertex>
+
+ <vertex vtxId="vtx1" showEdge="true" >
+ <position x="-5.0" y="8.0" z="0.0" />
+ <normal x="0.0" y="0.0" z="-1.0" />
+ <uvMap u="0.0" v="1.0" />
+ <skinning boneIdRef1="bn0" boneIdRef2="bn0" weightBalance="100" />
+ </vertex>
+
+ <vertex vtxId="vtx2" showEdge="true" >
+ <position x="5.0" y="8.0" z="0.0" />
+ <normal x="0.0" y="0.0" z="-1.0" />
+ <uvMap u="0.0" v="1.0" />
+ <skinning boneIdRef1="bn0" boneIdRef2="bn0" weightBalance="100" />
+ </vertex>
+
+</vertexList>
+
+</pmdModel>
+
+<!-- EOF -->
--- /dev/null
+[UTF8 Japanese]
+
+
+きわどい数値データを含むPMDファイル。
+※ XMLの改行コードはLF。ジェネレータ名は非表示。
+
+
+- numeric.pmd 様々な数値が書き込まれたテストデータ。
+- source.xml モデルデータのソースとなったXMLファイル。
+- result.xml モデルデータをXML化したときのあるべきXMLファイル。
+
+
+MMDのモデルファイルでは、実数表現としてIEEE754単精度型を用いる。
+IEEE754単精度型は、Javaのfloat型値や、XML Schemaのfloat型値に該当する。
+参照URL: http://www.w3.org/TR/xmlschema-2/#float
+
+ソフトウェアによっては、単精度正規数の最小値
+ 1.175494350822287507968736537222245677818665556772087521508751706278
+ 4172594547271728515625E-38
+を下回る絶対値の値を扱おうとすると、
+演算トラップが発生して異常終了することがあるので注意。
+MMDやPMDEditorでは、このようなデータが出現しても異常終了しない。
+
+このモデルデータでは、各ボーンの座標にテスト用の数値を格納する。
+
+
+test01
+ 様々なゼロ表記。z値のゼロ値には負の符号が付かなければならない。
+ ※ PMDEditorは負のゼロを解釈できない?
+
+test02
+ 様々な指数形式での表記その1。
+
+test03
+ 様々な指数形式での表記その2。
+
+test04
+ 0、およびその次に小さい数、さらにその次に小さい数。
+
+test05
+ 最小の正符号の正規数、およびその前後値。
+ ※ PMDEditorはこれらのデータを区別できない?
+
+test06
+ 1.0、およびその前後値。
+ ※ PMDEditorは1.0とその次に大きい値を区別できない?
+
+
+-- EOF --
-->
-<!-- a A 9 亜'" -->
+<!-- [NAMELESS] -->
<pmdModel
xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009 http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
schemaVersion="101009"
- name="a A  9 亜'""
+ name=""
>
<description>
-azAZAZ0909あアアゑヵヶΩωЖж<br/>
-┐└漢峠凜熙<br/>
-ヴウ゛ヴパハ゜パ<br/>
-壺壷尭堯<br/>
-\\\¥<br/>
-髙⑨≒∵¬㈱Σ<br/>
-#$[\]^{|}~<br/>
-cdata'"&<>test<br/>
-<!--fake comment--><br/>
-A B  C	D		E F  GHI
</description>
-<!--
-azAZAZ0909あアアゑヵヶΩωЖж
-┐└漢峠凜熙
-ヴウ゛ヴパハ゜パ
-壺壷尭堯
-\\\¥
-髙⑨≒∵¬㈱Σ
-#$[\]^{|}~
-cdata'"&<>test
-<!- -fake comment- ->
-A B C␉D␉␉E F GHI
--->
<license>
</license>
<meta name="imageURL" content="" />
<materialList>
-
</materialList>
<toonMap>
[9 : LINKEDROT : Linked Rotate: 回転連動 :]
-->
+ <!-- test01 [回転/移動] -->
+ <bone name="test01" boneId="bn0" type="ROTMOV" >
+ <position x="0.0" y="0.0" z="-0.0" />
+ <boneChain />
+ </bone>
+
+ <!-- test02 [回転/移動] -->
+ <bone name="test02" boneId="bn1" type="ROTMOV" >
+ <position x="1200.0" y="1200.0" z="0.0012" />
+ <boneChain />
+ </bone>
+
+ <!-- test03 [回転/移動] -->
+ <bone name="test03" boneId="bn2" type="ROTMOV" >
+ <position x="1200.0" y="1.2" z="0.0" />
+ <boneChain />
+ </bone>
+
+ <!-- test04 [回転/移動] -->
+ <bone name="test04" boneId="bn3" type="ROTMOV" >
+ <position x="0.0" y="1.4E-45" z="2.8E-45" />
+ <boneChain />
+ </bone>
+
+ <!-- test05 [回転/移動] -->
+ <bone name="test05" boneId="bn4" type="ROTMOV" >
+ <position x="1.1754942E-38" y="1.17549435E-38" z="1.1754945E-38" />
+ <boneChain />
+ </bone>
+
+ <!-- test06 [回転/移動] -->
+ <bone name="test06" boneId="bn5" type="ROTMOV" >
+ <position x="0.99999994" y="1.0" z="1.0000001" />
+ <boneChain />
+ </bone>
+
</boneList>
<boneGroupList>
-
</boneGroupList>
<ikChainList>
-
</ikChainList>
<morphList>
-
-<!--
-Morph types:
-[1 : EYEBROW : まゆ ]
-[2 : EYE : 目 ]
-[3 : LIP : リップ ]
-[4 : EXTRA : その他 ]
--->
-
</morphList>
<rigidList>
-
-<!--
-Rigid behavior types:
-[0 : FOLLOWBONE : ボーン追従 ]
-[1 : ONLYDYNAMICS : 物理演算 ]
-[2 : BONEDDYNAMICS : ボーン位置合わせ ]
--->
-
</rigidList>
<rigidGroupList>
<rigidGroup rigidGroupId="rg1" />
-
<rigidGroup rigidGroupId="rg2" />
-
<rigidGroup rigidGroupId="rg3" />
-
<rigidGroup rigidGroupId="rg4" />
-
<rigidGroup rigidGroupId="rg5" />
-
<rigidGroup rigidGroupId="rg6" />
-
<rigidGroup rigidGroupId="rg7" />
-
<rigidGroup rigidGroupId="rg8" />
-
<rigidGroup rigidGroupId="rg9" />
-
<rigidGroup rigidGroupId="rg10" />
-
<rigidGroup rigidGroupId="rg11" />
-
<rigidGroup rigidGroupId="rg12" />
-
<rigidGroup rigidGroupId="rg13" />
-
<rigidGroup rigidGroupId="rg14" />
-
<rigidGroup rigidGroupId="rg15" />
-
<rigidGroup rigidGroupId="rg16" />
</rigidGroupList>
<jointList>
-
</jointList>
<surfaceGroupList>
-
</surfaceGroupList>
<vertexList>
-
</vertexList>
</pmdModel>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ model-data(*.pmd) on XML
+-->
+
+
+<!-- [NAMELESS] -->
+<pmdModel
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ schemaVersion="101009"
+
+ name=""
+>
+
+
+<description>
+</description>
+
+<license>
+</license>
+
+<credits>
+</credits>
+
+<meta name="siteURL" content="" />
+<meta name="imageURL" content="" />
+
+<materialList>
+</materialList>
+
+<toonMap>
+ <toonDef toonFileId="tf0" index="0" winFileName="toon01.bmp" />
+ <toonDef toonFileId="tf1" index="1" winFileName="toon02.bmp" />
+ <toonDef toonFileId="tf2" index="2" winFileName="toon03.bmp" />
+ <toonDef toonFileId="tf3" index="3" winFileName="toon04.bmp" />
+ <toonDef toonFileId="tf4" index="4" winFileName="toon05.bmp" />
+ <toonDef toonFileId="tf5" index="5" winFileName="toon06.bmp" />
+ <toonDef toonFileId="tf6" index="6" winFileName="toon07.bmp" />
+ <toonDef toonFileId="tf7" index="7" winFileName="toon08.bmp" />
+ <toonDef toonFileId="tf8" index="8" winFileName="toon09.bmp" />
+ <toonDef toonFileId="tf9" index="9" winFileName="toon10.bmp" />
+</toonMap>
+
+<boneList>
+
+<!--
+Bone types:
+[0 : ROTATE : Rotate : 回転 :]
+[1 : ROTMOV : Rotate/Move : 回転/移動 :]
+[2 : IK : IK : IK :]
+[3 : UNKNOWN : Unknown : 不明 :]
+[4 : UNDERIK : Under IK : IK影響下(回転) :]
+[5 : UNDERROT : Under rotate : 回転影響下 :]
+[6 : IKCONNECTED : IK connected : IK接続先 :]
+[7 : HIDDEN : Hidden : 非表示 :]
+[8 : TWIST : Twist : 捩り :]
+[9 : LINKEDROT : Linked Rotate: 回転連動 :]
+-->
+
+ <bone name="test01" boneId="bn0" type="ROTMOV" >
+ <position x="0" y="0.0" z="-0.0" />
+ <boneChain />
+ </bone>
+
+ <bone name="test02" boneId="bn1" type="ROTMOV" >
+ <position x="1.2E3" y="1.2E+3" z="1.2E-3" />
+ <boneChain />
+ </bone>
+
+ <bone name="test03" boneId="bn2" type="ROTMOV" >
+ <position x="1.2e3" y="1.2E0" z="0E0" />
+ <boneChain />
+ </bone>
+
+ <bone name="test04" boneId="bn3" type="ROTMOV" >
+ <position
+ x="0.0"
+ y="1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125E-45"
+ z="2.8025969286496341418474591665798322625605238837530315435141365677795821653717212029732763767242431640625E-45"
+ />
+ <boneChain />
+ </bone>
+
+ <bone name="test05" boneId="bn4" type="ROTMOV" >
+ <position
+ x="1.175494210692441075487029444849287348827052428745893333857174530571588870475618904265502351336181163787841796875E-38"
+ y="1.1754943508222875079687365372222456778186655567720875215087517062784172594547271728515625E-38"
+ z="1.175494490952133940450443629595204006810278684798281709160328881985245648433835441437622648663818836212158203125E-38"
+ />
+ <boneChain />
+ </bone>
+
+ <bone name="test06" boneId="bn5" type="ROTMOV" >
+ <position
+ x="0.999999940395355224609375"
+ y="1.0"
+ z="1.00000011920928955078125"
+ />
+ <boneChain />
+ </bone>
+
+</boneList>
+
+<boneGroupList>
+</boneGroupList>
+
+<ikChainList>
+</ikChainList>
+
+<morphList>
+</morphList>
+
+<rigidList>
+</rigidList>
+
+<rigidGroupList>
+
+ <rigidGroup rigidGroupId="rg1" />
+ <rigidGroup rigidGroupId="rg2" />
+ <rigidGroup rigidGroupId="rg3" />
+ <rigidGroup rigidGroupId="rg4" />
+ <rigidGroup rigidGroupId="rg5" />
+ <rigidGroup rigidGroupId="rg6" />
+ <rigidGroup rigidGroupId="rg7" />
+ <rigidGroup rigidGroupId="rg8" />
+ <rigidGroup rigidGroupId="rg9" />
+ <rigidGroup rigidGroupId="rg10" />
+ <rigidGroup rigidGroupId="rg11" />
+ <rigidGroup rigidGroupId="rg12" />
+ <rigidGroup rigidGroupId="rg13" />
+ <rigidGroup rigidGroupId="rg14" />
+ <rigidGroup rigidGroupId="rg15" />
+ <rigidGroup rigidGroupId="rg16" />
+
+</rigidGroupList>
+
+<jointList>
+</jointList>
+
+<surfaceGroupList>
+</surfaceGroupList>
+
+<vertexList>
+</vertexList>
+
+</pmdModel>
+
+<!-- EOF -->
--- /dev/null
+[UTF8 Japanese]
+
+
+全種類全形状の剛体を含むPMDファイル。
+※ XMLの改行コードはLF。ジェネレータ名は非表示。
+
+
+- allrigid.pmd 全種類全形状の剛体を含むテストデータ。
+- allrigid.xml モデルデータのソースとなったXMLファイル。
+
+
+
+-- EOF --
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ model-data(*.pmd) on XML
+-->
+
+
+<!-- [NAMELESS] -->
+<pmdModel
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ schemaVersion="101009"
+
+ name=""
+>
+
+
+<description>
+</description>
+
+<license>
+</license>
+
+<credits>
+</credits>
+
+<meta name="siteURL" content="" />
+<meta name="imageURL" content="" />
+
+<materialList>
+</materialList>
+
+<toonMap>
+ <toonDef toonFileId="tf0" index="0" winFileName="toon01.bmp" />
+ <toonDef toonFileId="tf1" index="1" winFileName="toon02.bmp" />
+ <toonDef toonFileId="tf2" index="2" winFileName="toon03.bmp" />
+ <toonDef toonFileId="tf3" index="3" winFileName="toon04.bmp" />
+ <toonDef toonFileId="tf4" index="4" winFileName="toon05.bmp" />
+ <toonDef toonFileId="tf5" index="5" winFileName="toon06.bmp" />
+ <toonDef toonFileId="tf6" index="6" winFileName="toon07.bmp" />
+ <toonDef toonFileId="tf7" index="7" winFileName="toon08.bmp" />
+ <toonDef toonFileId="tf8" index="8" winFileName="toon09.bmp" />
+ <toonDef toonFileId="tf9" index="9" winFileName="toon10.bmp" />
+</toonMap>
+
+<boneList>
+
+<!--
+Bone types:
+[0 : ROTATE : Rotate : 回転 :]
+[1 : ROTMOV : Rotate/Move : 回転/移動 :]
+[2 : IK : IK : IK :]
+[3 : UNKNOWN : Unknown : 不明 :]
+[4 : UNDERIK : Under IK : IK影響下(回転) :]
+[5 : UNDERROT : Under rotate : 回転影響下 :]
+[6 : IKCONNECTED : IK connected : IK接続先 :]
+[7 : HIDDEN : Hidden : 非表示 :]
+[8 : TWIST : Twist : 捩り :]
+[9 : LINKEDROT : Linked Rotate: 回転連動 :]
+-->
+
+ <!-- testbone [回転/移動] -->
+ <bone name="testbone" boneId="bn0" type="ROTMOV" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+</boneList>
+
+<boneGroupList>
+</boneGroupList>
+
+<ikChainList>
+</ikChainList>
+
+<morphList>
+</morphList>
+
+<rigidList>
+
+<!--
+Rigid behavior types:
+[0 : FOLLOWBONE : ボーン追従 ]
+[1 : ONLYDYNAMICS : 物理演算 ]
+[2 : BONEDDYNAMICS : ボーン位置合わせ ]
+-->
+
+ <!-- testrigid1 -->
+ <rigid name="testrigid1" rigidId="rd0" behavior="FOLLOWBONE" >
+ <linkedBone boneIdRef="bn0" /> <!-- Ref:testbone -->
+
+ <rigidShapeSphere radius="1.0" />
+ <position x="0.0" y="0.0" z="0.0" />
+ <radRotation xRad="0.0" yRad="0.0" zRad="0.0" />
+ <dynamics
+ mass="0.1"
+ dampingPosition="0.2"
+ dampingRotation="0.3"
+ restitution="0.4"
+ friction="0.5"
+ />
+
+ </rigid>
+
+ <!-- testrigid2 -->
+ <rigid name="testrigid2" rigidId="rd1" behavior="ONLYDYNAMICS" >
+ <rigidShapeBox width="1.0" height="1.0" depth="1.0" />
+ <position x="0.0" y="0.0" z="0.0" />
+ <radRotation xRad="0.0" yRad="0.0" zRad="0.0" />
+ <dynamics
+ mass="0.1"
+ dampingPosition="0.2"
+ dampingRotation="0.3"
+ restitution="0.4"
+ friction="0.5"
+ />
+
+ </rigid>
+
+ <!-- testrigid3 -->
+ <rigid name="testrigid3" rigidId="rd2" behavior="BONEDDYNAMICS" >
+ <linkedBone boneIdRef="bn0" /> <!-- Ref:testbone -->
+
+ <rigidShapeCapsule height="1.0" radius="1.0" />
+ <position x="0.0" y="0.0" z="0.0" />
+ <radRotation xRad="0.0" yRad="0.0" zRad="0.0" />
+ <dynamics
+ mass="0.1"
+ dampingPosition="0.2"
+ dampingRotation="0.3"
+ restitution="0.4"
+ friction="0.5"
+ />
+
+ <throughRigidGroup rigidGroupIdRef="rg1" />
+ </rigid>
+
+</rigidList>
+
+<rigidGroupList>
+
+ <rigidGroup rigidGroupId="rg1" >
+ <rigidGroupMember rigidIdRef="rd0" /> <!-- Ref:testrigid1 -->
+ </rigidGroup>
+
+ <rigidGroup rigidGroupId="rg2" >
+ <rigidGroupMember rigidIdRef="rd1" /> <!-- Ref:testrigid2 -->
+ </rigidGroup>
+
+ <rigidGroup rigidGroupId="rg3" >
+ <rigidGroupMember rigidIdRef="rd2" /> <!-- Ref:testrigid3 -->
+ </rigidGroup>
+
+ <rigidGroup rigidGroupId="rg4" />
+ <rigidGroup rigidGroupId="rg5" />
+ <rigidGroup rigidGroupId="rg6" />
+ <rigidGroup rigidGroupId="rg7" />
+ <rigidGroup rigidGroupId="rg8" />
+ <rigidGroup rigidGroupId="rg9" />
+ <rigidGroup rigidGroupId="rg10" />
+ <rigidGroup rigidGroupId="rg11" />
+ <rigidGroup rigidGroupId="rg12" />
+ <rigidGroup rigidGroupId="rg13" />
+ <rigidGroup rigidGroupId="rg14" />
+ <rigidGroup rigidGroupId="rg15" />
+ <rigidGroup rigidGroupId="rg16" />
+
+</rigidGroupList>
+
+<jointList>
+</jointList>
+
+<surfaceGroupList>
+</surfaceGroupList>
+
+<vertexList>
+</vertexList>
+
+</pmdModel>
+
+<!-- EOF -->
--- /dev/null
+[UTF8 Japanese]
+
+
+データの小さいPMDファイル。
+※ XMLの改行コードはLF。ジェネレータ名は非表示。
+
+
+========================================================================
+onlybone.pmd
+onlybone.xml
+
+ボーンが一つだけ定義されたPMDモデルデータ。
+ボーン名「テストボーン」
+種別「回転/移動」
+座標(0.0, 0.0, 0.0)
+親子関係なし
+
+========================================================================
+onlytriangle.pmd
+onlytriangle.xml
+
+onlybone.pmdに加え、
+三角ポリゴンとマテリアルが一つだけ定義されたPMDモデルデータ。
+
+ポリゴンは三頂点(0.0, 0.0, 0.0), (-5.0, 8.0, 0.0), (5.0, 8.0, 0.0)
+を結ぶ三角形。
+いずれの頂点も法線ベクトルは(0.0, 0.0, -1.0)。
+いずれの頂点もエッジ表示設定はオン。
+いずれの頂点もuv座標は(0.0, 1.0)
+いずれの頂点も唯一のテストボーンへのウェイト100%。
+
+マテリアル設定:
+Diffuse色 0.75, 0.25, 0.25
+Specular色 0.0, 0.0, 0.0
+Ambient色 0.25, 0.75, 0.26
+Alpha値 1.0
+Shininess値 5
+輪郭表示あり
+Toon設定はなし。
+
+========================================================================
+onlymorph.pmd
+onlymorph.xml
+
+onlytriangle.pmdに加え、
+頂点モーフが一つだけ定義されたPMDモデルデータ。
+
+モーフ名:テストモーフ
+モーフ種別:その他
+三角形の一番Y値の低い頂点(0.0, 0.0, 0.0)を
+(0.0, 3.0, 0.0)までモーフする。
+
+========================================================================
+onlyrigid.pmd
+onlyrigid.xml
+
+onlybone.pmdに加え、
+剛体が一つだけ定義されたPMDモデルデータ。
+
+剛体名:テスト剛体
+唯一のテストボーンに追従
+
+箱形状(W:1.0 H:2.0 D:3.0)
+剛体位置:(0.0, 0.0, 0.0)
+剛体姿勢:(0.0, 0.0, 0.0)
+
+剛体グループ1に所属。
+いかなる剛体グループとも衝突する。
+
+質量:0.1
+移動減衰:0.2
+回転減衰:0.3
+反発力:0.4
+摩擦力:0.5
+
+========================================================================
+onlyjoint.pmd
+onlyjoint.xml
+
+onlyrigid.pmdに加え、
+接続ボーンを持たない剛体「フリー剛体」を追加し、
+二つになった剛体を結ぶジョイントが一つだけ定義されたPMDモデルデータ。
+
+「フリー剛体」は、接続ボーンを持たないことと物理演算属性であること意外は
+「テスト剛体」と同じ設定。
+
+ジョイント名:テストジョイント
+テスト剛体とフリー剛体を結ぶ。
+
+ジョイント位置:(0.0,0.0,0.0)
+位置制限(0.0-0.0, 0.0-0.0, 0.0-0.0)
+
+ジョイント姿勢:(0.0,0.0,0.0)
+姿勢制限(0.0-0.0, 0.0-0.0, 0.0-0.0)
+
+バネ移動:(0.0, 0.0, 0.0)
+バネ姿勢:(0.0, 0.0, 0.0)
+
+
+========================================================================
+
+
+-- EOF --
-->
-<!-- -->
+<!-- [NAMELESS] -->
<pmdModel
xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009 http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
schemaVersion="101009"
name=""
<meta name="imageURL" content="" />
<materialList>
-
</materialList>
<toonMap>
[9 : LINKEDROT : Linked Rotate: 回転連動 :]
-->
+ <!-- テストボーン [回転/移動] -->
+ <bone name="テストボーン" boneId="bn0" type="ROTMOV" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
</boneList>
<boneGroupList>
-
</boneGroupList>
<ikChainList>
-
</ikChainList>
<morphList>
-
-<!--
-Morph types:
-[1 : EYEBROW : まゆ ]
-[2 : EYE : 目 ]
-[3 : LIP : リップ ]
-[4 : EXTRA : その他 ]
--->
-
</morphList>
<rigidList>
-
-<!--
-Rigid behavior types:
-[0 : FOLLOWBONE : ボーン追従 ]
-[1 : ONLYDYNAMICS : 物理演算 ]
-[2 : BONEDDYNAMICS : ボーン位置合わせ ]
--->
-
</rigidList>
<rigidGroupList>
<rigidGroup rigidGroupId="rg1" />
-
<rigidGroup rigidGroupId="rg2" />
-
<rigidGroup rigidGroupId="rg3" />
-
<rigidGroup rigidGroupId="rg4" />
-
<rigidGroup rigidGroupId="rg5" />
-
<rigidGroup rigidGroupId="rg6" />
-
<rigidGroup rigidGroupId="rg7" />
-
<rigidGroup rigidGroupId="rg8" />
-
<rigidGroup rigidGroupId="rg9" />
-
<rigidGroup rigidGroupId="rg10" />
-
<rigidGroup rigidGroupId="rg11" />
-
<rigidGroup rigidGroupId="rg12" />
-
<rigidGroup rigidGroupId="rg13" />
-
<rigidGroup rigidGroupId="rg14" />
-
<rigidGroup rigidGroupId="rg15" />
-
<rigidGroup rigidGroupId="rg16" />
</rigidGroupList>
<jointList>
-
</jointList>
<surfaceGroupList>
-
</surfaceGroupList>
<vertexList>
-
</vertexList>
</pmdModel>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ model-data(*.pmd) on XML
+-->
+
+
+<!-- [NAMELESS] -->
+<pmdModel
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ schemaVersion="101009"
+
+ name=""
+>
+
+
+<description>
+</description>
+
+<license>
+</license>
+
+<credits>
+</credits>
+
+<meta name="siteURL" content="" />
+<meta name="imageURL" content="" />
+
+<materialList>
+</materialList>
+
+<toonMap>
+ <toonDef toonFileId="tf0" index="0" winFileName="toon01.bmp" />
+ <toonDef toonFileId="tf1" index="1" winFileName="toon02.bmp" />
+ <toonDef toonFileId="tf2" index="2" winFileName="toon03.bmp" />
+ <toonDef toonFileId="tf3" index="3" winFileName="toon04.bmp" />
+ <toonDef toonFileId="tf4" index="4" winFileName="toon05.bmp" />
+ <toonDef toonFileId="tf5" index="5" winFileName="toon06.bmp" />
+ <toonDef toonFileId="tf6" index="6" winFileName="toon07.bmp" />
+ <toonDef toonFileId="tf7" index="7" winFileName="toon08.bmp" />
+ <toonDef toonFileId="tf8" index="8" winFileName="toon09.bmp" />
+ <toonDef toonFileId="tf9" index="9" winFileName="toon10.bmp" />
+</toonMap>
+
+<boneList>
+
+<!--
+Bone types:
+[0 : ROTATE : Rotate : 回転 :]
+[1 : ROTMOV : Rotate/Move : 回転/移動 :]
+[2 : IK : IK : IK :]
+[3 : UNKNOWN : Unknown : 不明 :]
+[4 : UNDERIK : Under IK : IK影響下(回転) :]
+[5 : UNDERROT : Under rotate : 回転影響下 :]
+[6 : IKCONNECTED : IK connected : IK接続先 :]
+[7 : HIDDEN : Hidden : 非表示 :]
+[8 : TWIST : Twist : 捩り :]
+[9 : LINKEDROT : Linked Rotate: 回転連動 :]
+-->
+
+ <!-- テストボーン [回転/移動] -->
+ <bone name="テストボーン" boneId="bn0" type="ROTMOV" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+</boneList>
+
+<boneGroupList>
+</boneGroupList>
+
+<ikChainList>
+</ikChainList>
+
+<morphList>
+</morphList>
+
+<rigidList>
+
+<!--
+Rigid behavior types:
+[0 : FOLLOWBONE : ボーン追従 ]
+[1 : ONLYDYNAMICS : 物理演算 ]
+[2 : BONEDDYNAMICS : ボーン位置合わせ ]
+-->
+
+ <!-- テスト剛体 -->
+ <rigid name="テスト剛体" rigidId="rd0" behavior="FOLLOWBONE" >
+ <linkedBone boneIdRef="bn0" /> <!-- Ref:テストボーン -->
+
+ <rigidShapeBox width="1.0" height="2.0" depth="3.0" />
+ <position x="0.0" y="0.0" z="0.0" />
+ <radRotation xRad="0.0" yRad="0.0" zRad="0.0" />
+ <dynamics
+ mass="0.1"
+ dampingPosition="0.2"
+ dampingRotation="0.3"
+ restitution="0.4"
+ friction="0.5"
+ />
+
+ </rigid>
+
+ <!-- フリー剛体 -->
+ <rigid name="フリー剛体" rigidId="rd1" behavior="ONLYDYNAMICS" >
+ <rigidShapeBox width="1.0" height="2.0" depth="3.0" />
+ <position x="0.0" y="0.0" z="0.0" />
+ <radRotation xRad="0.0" yRad="0.0" zRad="0.0" />
+ <dynamics
+ mass="0.1"
+ dampingPosition="0.2"
+ dampingRotation="0.3"
+ restitution="0.4"
+ friction="0.5"
+ />
+
+ </rigid>
+
+</rigidList>
+
+<rigidGroupList>
+
+ <rigidGroup rigidGroupId="rg1" >
+ <rigidGroupMember rigidIdRef="rd0" /> <!-- Ref:テスト剛体 -->
+ <rigidGroupMember rigidIdRef="rd1" /> <!-- Ref:フリー剛体 -->
+ </rigidGroup>
+
+ <rigidGroup rigidGroupId="rg2" />
+ <rigidGroup rigidGroupId="rg3" />
+ <rigidGroup rigidGroupId="rg4" />
+ <rigidGroup rigidGroupId="rg5" />
+ <rigidGroup rigidGroupId="rg6" />
+ <rigidGroup rigidGroupId="rg7" />
+ <rigidGroup rigidGroupId="rg8" />
+ <rigidGroup rigidGroupId="rg9" />
+ <rigidGroup rigidGroupId="rg10" />
+ <rigidGroup rigidGroupId="rg11" />
+ <rigidGroup rigidGroupId="rg12" />
+ <rigidGroup rigidGroupId="rg13" />
+ <rigidGroup rigidGroupId="rg14" />
+ <rigidGroup rigidGroupId="rg15" />
+ <rigidGroup rigidGroupId="rg16" />
+
+</rigidGroupList>
+
+<jointList>
+
+ <!-- テストジョイント -->
+ <joint name="テストジョイント" >
+ <!-- [テスト剛体] <=> [フリー剛体] -->
+ <jointedRigidPair rigidIdRef1="rd0" rigidIdRef2="rd1" />
+
+ <position x="0.0" y="0.0" z="0.0" />
+ <limitPosition
+ xFrom="0.0" xTo="0.0"
+ yFrom="0.0" yTo="0.0"
+ zFrom="0.0" zTo="0.0"
+ />
+
+ <radRotation xRad="0.0" yRad="0.0" zRad="0.0" />
+ <limitRotation
+ xFrom="0.0" xTo="0.0"
+ yFrom="0.0" yTo="0.0"
+ zFrom="0.0" zTo="0.0"
+ />
+
+ <elasticPosition x="0.0" y="0.0" z="0.0" />
+ <elasticRotation xDeg="0.0" yDeg="0.0" zDeg="0.0" />
+
+ </joint>
+
+</jointList>
+
+<surfaceGroupList>
+</surfaceGroupList>
+
+<vertexList>
+</vertexList>
+
+</pmdModel>
+
+<!-- EOF -->
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ model-data(*.pmd) on XML
+-->
+
+
+<!-- [NAMELESS] -->
+<pmdModel
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ schemaVersion="101009"
+
+ name=""
+>
+
+
+<description>
+</description>
+
+<license>
+</license>
+
+<credits>
+</credits>
+
+<meta name="siteURL" content="" />
+<meta name="imageURL" content="" />
+
+<materialList>
+
+ <material showEdge="true" surfaceGroupIdRef="sg0" >
+ <diffuse r="0.75" g="0.25" b="0.25" alpha="1.0" />
+ <specular r="0.0" g="0.0" b="0.0" shininess="5.0" />
+ <ambient r="0.25" g="0.75" b="0.25" />
+ </material>
+
+</materialList>
+
+<toonMap>
+ <toonDef toonFileId="tf0" index="0" winFileName="toon01.bmp" />
+ <toonDef toonFileId="tf1" index="1" winFileName="toon02.bmp" />
+ <toonDef toonFileId="tf2" index="2" winFileName="toon03.bmp" />
+ <toonDef toonFileId="tf3" index="3" winFileName="toon04.bmp" />
+ <toonDef toonFileId="tf4" index="4" winFileName="toon05.bmp" />
+ <toonDef toonFileId="tf5" index="5" winFileName="toon06.bmp" />
+ <toonDef toonFileId="tf6" index="6" winFileName="toon07.bmp" />
+ <toonDef toonFileId="tf7" index="7" winFileName="toon08.bmp" />
+ <toonDef toonFileId="tf8" index="8" winFileName="toon09.bmp" />
+ <toonDef toonFileId="tf9" index="9" winFileName="toon10.bmp" />
+</toonMap>
+
+<boneList>
+
+<!--
+Bone types:
+[0 : ROTATE : Rotate : 回転 :]
+[1 : ROTMOV : Rotate/Move : 回転/移動 :]
+[2 : IK : IK : IK :]
+[3 : UNKNOWN : Unknown : 不明 :]
+[4 : UNDERIK : Under IK : IK影響下(回転) :]
+[5 : UNDERROT : Under rotate : 回転影響下 :]
+[6 : IKCONNECTED : IK connected : IK接続先 :]
+[7 : HIDDEN : Hidden : 非表示 :]
+[8 : TWIST : Twist : 捩り :]
+[9 : LINKEDROT : Linked Rotate: 回転連動 :]
+-->
+
+ <!-- テストボーン [回転/移動] -->
+ <bone name="テストボーン" boneId="bn0" type="ROTMOV" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+</boneList>
+
+<boneGroupList>
+</boneGroupList>
+
+<ikChainList>
+</ikChainList>
+
+<morphList>
+
+<!--
+Morph types:
+[1 : EYEBROW : まゆ ]
+[2 : EYE : 目 ]
+[3 : LIP : リップ ]
+[4 : EXTRA : その他 ]
+-->
+
+ <!-- テストモーフ -->
+ <morph name="テストモーフ" type="EXTRA" >
+ <morphVertex vtxIdRef="vtx0" xOff="0.0" yOff="3.0" zOff="0.0" />
+ </morph>
+
+</morphList>
+
+<rigidList>
+</rigidList>
+
+<rigidGroupList>
+
+ <rigidGroup rigidGroupId="rg1" />
+ <rigidGroup rigidGroupId="rg2" />
+ <rigidGroup rigidGroupId="rg3" />
+ <rigidGroup rigidGroupId="rg4" />
+ <rigidGroup rigidGroupId="rg5" />
+ <rigidGroup rigidGroupId="rg6" />
+ <rigidGroup rigidGroupId="rg7" />
+ <rigidGroup rigidGroupId="rg8" />
+ <rigidGroup rigidGroupId="rg9" />
+ <rigidGroup rigidGroupId="rg10" />
+ <rigidGroup rigidGroupId="rg11" />
+ <rigidGroup rigidGroupId="rg12" />
+ <rigidGroup rigidGroupId="rg13" />
+ <rigidGroup rigidGroupId="rg14" />
+ <rigidGroup rigidGroupId="rg15" />
+ <rigidGroup rigidGroupId="rg16" />
+
+</rigidGroupList>
+
+<jointList>
+</jointList>
+
+<surfaceGroupList>
+
+ <surfaceGroup surfaceGroupId="sg0" >
+ <surface vtxIdRef1="vtx0" vtxIdRef2="vtx1" vtxIdRef3="vtx2" />
+ </surfaceGroup>
+
+</surfaceGroupList>
+
+<vertexList>
+
+ <vertex vtxId="vtx0" showEdge="true" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <normal x="0.0" y="0.0" z="-1.0" />
+ <uvMap u="0.0" v="1.0" />
+ <skinning boneIdRef1="bn0" boneIdRef2="bn0" weightBalance="100" />
+ </vertex>
+
+ <vertex vtxId="vtx1" showEdge="true" >
+ <position x="-5.0" y="8.0" z="0.0" />
+ <normal x="0.0" y="0.0" z="-1.0" />
+ <uvMap u="0.0" v="1.0" />
+ <skinning boneIdRef1="bn0" boneIdRef2="bn0" weightBalance="100" />
+ </vertex>
+
+ <vertex vtxId="vtx2" showEdge="true" >
+ <position x="5.0" y="8.0" z="0.0" />
+ <normal x="0.0" y="0.0" z="-1.0" />
+ <uvMap u="0.0" v="1.0" />
+ <skinning boneIdRef1="bn0" boneIdRef2="bn0" weightBalance="100" />
+ </vertex>
+
+</vertexList>
+
+</pmdModel>
+
+<!-- EOF -->
-->
+<!-- [NAMELESS] -->
<pmdModel
xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009 http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
schemaVersion="101009"
- name="a A 9 亜'""
+ name=""
>
<description>
-azAZAZ0909あアアゑヵヶΩωЖж<br/>
-┐└漢峠凜熙<br/>
-ヴウ゛ヴパハ゜パ<br/>
-壺壷尭堯<br/>
-\\¥¥<br/>
-髙⑨≒∵¬㈱Σ<br/>
-#$[\]^{|}~<br/>
-<![CDATA[cdata'"&<>test]]><br/>
-<![CDATA[<!--fake comment-->]]><br/>
-A B C	D		E F G
-H
I
</description>
<license>
<meta name="imageURL" content="" />
<materialList>
-
</materialList>
<toonMap>
[9 : LINKEDROT : Linked Rotate: 回転連動 :]
-->
+ <!-- テストボーン [回転/移動] -->
+ <bone name="テストボーン" boneId="bn0" type="ROTMOV" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
</boneList>
<boneGroupList>
-
</boneGroupList>
<ikChainList>
-
</ikChainList>
<morphList>
-
-<!--
-Morph types:
-[1 : EYEBROW : まゆ ]
-[2 : EYE : 目 ]
-[3 : LIP : リップ ]
-[4 : EXTRA : その他 ]
--->
-
</morphList>
<rigidList>
[2 : BONEDDYNAMICS : ボーン位置合わせ ]
-->
+ <!-- テスト剛体 -->
+ <rigid name="テスト剛体" rigidId="rd0" behavior="FOLLOWBONE" >
+ <linkedBone boneIdRef="bn0" /> <!-- Ref:テストボーン -->
+
+ <rigidShapeBox width="1.0" height="2.0" depth="3.0" />
+ <position x="0.0" y="0.0" z="0.0" />
+ <radRotation xRad="0.0" yRad="0.0" zRad="0.0" />
+ <dynamics
+ mass="0.1"
+ dampingPosition="0.2"
+ dampingRotation="0.3"
+ restitution="0.4"
+ friction="0.5"
+ />
+
+ </rigid>
+
</rigidList>
<rigidGroupList>
- <rigidGroup rigidGroupId="rg1" />
+ <rigidGroup rigidGroupId="rg1" >
+ <rigidGroupMember rigidIdRef="rd0" /> <!-- Ref:テスト剛体 -->
+ </rigidGroup>
<rigidGroup rigidGroupId="rg2" />
-
<rigidGroup rigidGroupId="rg3" />
-
<rigidGroup rigidGroupId="rg4" />
-
<rigidGroup rigidGroupId="rg5" />
-
<rigidGroup rigidGroupId="rg6" />
-
<rigidGroup rigidGroupId="rg7" />
-
<rigidGroup rigidGroupId="rg8" />
-
<rigidGroup rigidGroupId="rg9" />
-
<rigidGroup rigidGroupId="rg10" />
-
<rigidGroup rigidGroupId="rg11" />
-
<rigidGroup rigidGroupId="rg12" />
-
<rigidGroup rigidGroupId="rg13" />
-
<rigidGroup rigidGroupId="rg14" />
-
<rigidGroup rigidGroupId="rg15" />
-
<rigidGroup rigidGroupId="rg16" />
</rigidGroupList>
<jointList>
-
</jointList>
<surfaceGroupList>
-
</surfaceGroupList>
<vertexList>
-
</vertexList>
</pmdModel>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MikuMikuDance
+ model-data(*.pmd) on XML
+-->
+
+
+<!-- [NAMELESS] -->
+<pmdModel
+ xmlns="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/101009
+ http://mikutoga.sourceforge.jp/xml/xsd/pmdxml-101009.xsd"
+ schemaVersion="101009"
+
+ name=""
+>
+
+
+<description>
+</description>
+
+<license>
+</license>
+
+<credits>
+</credits>
+
+<meta name="siteURL" content="" />
+<meta name="imageURL" content="" />
+
+<materialList>
+
+ <material showEdge="true" surfaceGroupIdRef="sg0" >
+ <diffuse r="0.75" g="0.25" b="0.25" alpha="1.0" />
+ <specular r="0.0" g="0.0" b="0.0" shininess="5.0" />
+ <ambient r="0.25" g="0.75" b="0.25" />
+ </material>
+
+</materialList>
+
+<toonMap>
+ <toonDef toonFileId="tf0" index="0" winFileName="toon01.bmp" />
+ <toonDef toonFileId="tf1" index="1" winFileName="toon02.bmp" />
+ <toonDef toonFileId="tf2" index="2" winFileName="toon03.bmp" />
+ <toonDef toonFileId="tf3" index="3" winFileName="toon04.bmp" />
+ <toonDef toonFileId="tf4" index="4" winFileName="toon05.bmp" />
+ <toonDef toonFileId="tf5" index="5" winFileName="toon06.bmp" />
+ <toonDef toonFileId="tf6" index="6" winFileName="toon07.bmp" />
+ <toonDef toonFileId="tf7" index="7" winFileName="toon08.bmp" />
+ <toonDef toonFileId="tf8" index="8" winFileName="toon09.bmp" />
+ <toonDef toonFileId="tf9" index="9" winFileName="toon10.bmp" />
+</toonMap>
+
+<boneList>
+
+<!--
+Bone types:
+[0 : ROTATE : Rotate : 回転 :]
+[1 : ROTMOV : Rotate/Move : 回転/移動 :]
+[2 : IK : IK : IK :]
+[3 : UNKNOWN : Unknown : 不明 :]
+[4 : UNDERIK : Under IK : IK影響下(回転) :]
+[5 : UNDERROT : Under rotate : 回転影響下 :]
+[6 : IKCONNECTED : IK connected : IK接続先 :]
+[7 : HIDDEN : Hidden : 非表示 :]
+[8 : TWIST : Twist : 捩り :]
+[9 : LINKEDROT : Linked Rotate: 回転連動 :]
+-->
+
+ <!-- テストボーン [回転/移動] -->
+ <bone name="テストボーン" boneId="bn0" type="ROTMOV" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <boneChain />
+ </bone>
+
+</boneList>
+
+<boneGroupList>
+</boneGroupList>
+
+<ikChainList>
+</ikChainList>
+
+<morphList>
+</morphList>
+
+<rigidList>
+</rigidList>
+
+<rigidGroupList>
+
+ <rigidGroup rigidGroupId="rg1" />
+ <rigidGroup rigidGroupId="rg2" />
+ <rigidGroup rigidGroupId="rg3" />
+ <rigidGroup rigidGroupId="rg4" />
+ <rigidGroup rigidGroupId="rg5" />
+ <rigidGroup rigidGroupId="rg6" />
+ <rigidGroup rigidGroupId="rg7" />
+ <rigidGroup rigidGroupId="rg8" />
+ <rigidGroup rigidGroupId="rg9" />
+ <rigidGroup rigidGroupId="rg10" />
+ <rigidGroup rigidGroupId="rg11" />
+ <rigidGroup rigidGroupId="rg12" />
+ <rigidGroup rigidGroupId="rg13" />
+ <rigidGroup rigidGroupId="rg14" />
+ <rigidGroup rigidGroupId="rg15" />
+ <rigidGroup rigidGroupId="rg16" />
+
+</rigidGroupList>
+
+<jointList>
+</jointList>
+
+<surfaceGroupList>
+
+ <surfaceGroup surfaceGroupId="sg0" >
+ <surface vtxIdRef1="vtx0" vtxIdRef2="vtx1" vtxIdRef3="vtx2" />
+ </surfaceGroup>
+
+</surfaceGroupList>
+
+<vertexList>
+
+ <vertex vtxId="vtx0" showEdge="true" >
+ <position x="0.0" y="0.0" z="0.0" />
+ <normal x="0.0" y="0.0" z="-1.0" />
+ <uvMap u="0.0" v="1.0" />
+ <skinning boneIdRef1="bn0" boneIdRef2="bn0" weightBalance="100" />
+ </vertex>
+
+ <vertex vtxId="vtx1" showEdge="true" >
+ <position x="-5.0" y="8.0" z="0.0" />
+ <normal x="0.0" y="0.0" z="-1.0" />
+ <uvMap u="0.0" v="1.0" />
+ <skinning boneIdRef1="bn0" boneIdRef2="bn0" weightBalance="100" />
+ </vertex>
+
+ <vertex vtxId="vtx2" showEdge="true" >
+ <position x="5.0" y="8.0" z="0.0" />
+ <normal x="0.0" y="0.0" z="-1.0" />
+ <uvMap u="0.0" v="1.0" />
+ <skinning boneIdRef1="bn0" boneIdRef2="bn0" weightBalance="100" />
+ </vertex>
+
+</vertexList>
+
+</pmdModel>
+
+<!-- EOF -->