--- /dev/null
+/*
+ * typical bone information
+ *
+ * License : The MIT License
+ * Copyright(c) 2011 MikuToga Partners
+ */
+
+package jp.sourceforge.mikutoga.typical;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import javax.xml.parsers.ParserConfigurationException;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/**
+ * 一般的な標準ボーン構成に関する情報。
+ * <p>各ボーン情報はひとつ以上のプライマリ名(≒日本語名)と
+ * ゼロ個以上のグローバル名(≒英語名)を持つ。
+ * <p>選択基準は独断。
+ * <p>和英対訳はMMD Ver7.39の同梱モデルにほぼ準拠。
+ */
+public final class TypicalBone extends TypicalObject {
+
+ private static final Class<?> THISCLASS = TypicalBone.class;
+ private static final String BONE_XML = "resources/typicalBone.xml";
+
+ private static final List<TypicalBone> TYP_BONE_LIST =
+ new LinkedList<TypicalBone>();
+ private static final Map<String, TypicalBone> PRIMARY_MAP =
+ new HashMap<String, TypicalBone>();
+ private static final Map<String, TypicalBone> GLOBAL_MAP =
+ new HashMap<String, TypicalBone>();
+
+
+ static{
+ InputStream is = THISCLASS.getResourceAsStream(BONE_XML);
+ Element top;
+ try{
+ top = TypicalObject.loadXml(is);
+ }catch(ParserConfigurationException e){
+ throw new ExceptionInInitializerError(e);
+ }catch(SAXException e){
+ throw new ExceptionInInitializerError(e);
+ }catch(IOException e){
+ throw new ExceptionInInitializerError(e);
+ }
+
+ parse(top);
+
+ numbering();
+ }
+
+
+ /**
+ * コンストラクタ。
+ * <p>各初期数が0以下の場合は、状況に応じて伸長する連結リストが用意される。
+ * @param primaryNo プライマリ名初期数。
+ * @param globalNo グローバル名初期数。
+ */
+ private TypicalBone(int primaryNo, int globalNo){
+ super(primaryNo, globalNo);
+ return;
+ }
+
+
+ /**
+ * XML文書の最上位構造を解読する。
+ * @param top 最上位要素
+ */
+ private static void parse(Element top) {
+ NodeList boneList = top.getElementsByTagName("bone");
+ int boneNo = boneList.getLength();
+ for(int idx = 0; idx < boneNo; idx++){
+ Element bone = (Element) boneList.item(idx);
+ TypicalBone typBone = parseBone(bone);
+ TYP_BONE_LIST.add(typBone);
+ }
+
+ return;
+ }
+
+ /**
+ * bone要素を解読する。
+ * @param bone bone要素
+ * @return ボーン情報
+ */
+ private static TypicalBone parseBone(Element bone){
+ NodeList primaryNodes = bone.getElementsByTagName("primary");
+ NodeList globalNodes = bone.getElementsByTagName("global");
+ int primaryNo = primaryNodes.getLength();
+ int globalNo = globalNodes.getLength();
+
+ TypicalBone typBone = new TypicalBone(primaryNo, globalNo);
+
+ for(int idx = 0; idx < primaryNo; idx++){
+ Element primary = (Element) primaryNodes.item(idx);
+ String name = primary.getAttribute("name");
+ typBone.primaryList.add(name);
+ }
+
+ for(int idx = 0; idx < globalNo; idx++){
+ Element global = (Element) globalNodes.item(idx);
+ String name = global.getAttribute("name");
+ typBone.globalList.add(name);
+ }
+
+ for(String primaryName : typBone.primaryList){
+ PRIMARY_MAP.put(primaryName, typBone);
+ }
+
+ for(String globalName : typBone.globalList){
+ GLOBAL_MAP.put(globalName, typBone);
+ }
+
+ return typBone;
+ }
+
+ /**
+ * 全ボーン情報を一意に順序付ける設定を行う。
+ * <p>XMLでの定義順が反映される。
+ */
+ private static void numbering(){
+ int order = 0;
+ for(TypicalBone bone : TYP_BONE_LIST){
+ bone.orderNo = order++;
+ }
+
+ return;
+ }
+
+ /**
+ * プライマリ名の合致するボーン情報を返す。
+ * @param primaryName プライマリ名
+ * @return モーフ情報。見つからなければnull
+ */
+ public static TypicalBone findWithPrimary(String primaryName){
+ TypicalBone result = PRIMARY_MAP.get(primaryName);
+ return result;
+ }
+
+ /**
+ * グローバル名の合致するボーン情報を返す。
+ * @param globalName グローバル名
+ * @return モーフ情報。見つからなければnull
+ */
+ public static TypicalBone findWithGlobal(String globalName){
+ TypicalBone result = GLOBAL_MAP.get(globalName);
+ return result;
+ }
+
+ /**
+ * プライマリ名をグローバル名に変換する。
+ * @param primaryName プライマリ名
+ * @return グローバル名。見つからなければnull
+ */
+ public static String primary2global(String primaryName){
+ TypicalBone bone = findWithPrimary(primaryName);
+ if(bone == null) return null;
+ String global = bone.getTopGlobalName();
+ return global;
+ }
+
+ /**
+ * グローバル名をプライマリ名へ変換する。
+ * @param globalName グローバル名
+ * @return プライマリ名。見つからなければnull
+ */
+ public static String global2primary(String globalName){
+ TypicalBone bone = findWithGlobal(globalName);
+ if(bone == null) return null;
+ String primary = bone.getTopPrimaryName();
+ return primary;
+ }
+
+}
--- /dev/null
+/*
+ * typical morph information
+ *
+ * License : The MIT License
+ * Copyright(c) 2011 MikuToga Partners
+ */
+
+package jp.sourceforge.mikutoga.typical;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.xml.parsers.ParserConfigurationException;
+import jp.sourceforge.mikutoga.pmd.MorphType;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+
+/**
+ * 一般的な標準モーフに関する情報。
+ * <p>各モーフ情報はひとつ以上のプライマリ名(≒日本語名)と
+ * ゼロ個以上のグローバル名(≒英語名)を持つ。
+ * <p>選択基準は独断。
+ * <p>和英対訳はMMD Ver7.39の同梱モデルにほぼ準拠。
+ */
+public final class TypicalMorph extends TypicalObject {
+
+ private static final Class<?> THISCLASS = TypicalMorph.class;
+ private static final String MORPH_XML = "resources/typicalMorph.xml";
+
+ private static final List<TypicalMorph> EMPTY = Collections.emptyList();
+
+ private static final Map<MorphType, List<TypicalMorph>> TYPED_MAP =
+ new EnumMap<MorphType, List<TypicalMorph>>(MorphType.class);
+
+ private static final Map<String, TypicalMorph> PRIMARY_MAP =
+ new HashMap<String, TypicalMorph>();
+ private static final Map<String, TypicalMorph> GLOBAL_MAP =
+ new HashMap<String, TypicalMorph>();
+
+
+ static{
+ InputStream is = THISCLASS.getResourceAsStream(MORPH_XML);
+ Element top;
+ try{
+ top = TypicalObject.loadXml(is);
+ }catch(ParserConfigurationException e){
+ throw new ExceptionInInitializerError(e);
+ }catch(SAXException e){
+ throw new ExceptionInInitializerError(e);
+ }catch(IOException e){
+ throw new ExceptionInInitializerError(e);
+ }
+
+ parse(top);
+
+ numbering();
+ }
+
+
+ private final MorphType type;
+
+
+ /**
+ * コンストラクタ。
+ * <p>各初期数が0以下の場合は、状況に応じて伸長する連結リストが用意される。
+ * @param type モーフ種別
+ * @param primaryNo プライマリ名初期数。
+ * @param globalNo グローバル名初期数。
+ */
+ private TypicalMorph(MorphType type, int primaryNo, int globalNo){
+ super(primaryNo, globalNo);
+ this.type = type;
+ return;
+ }
+
+
+ /**
+ * XML文書の最上位構造を解読する。
+ * @param top 最上位要素
+ */
+ private static void parse(Element top) {
+ NodeList groupList = top.getElementsByTagName("morphGroup");
+ int groupNo = groupList.getLength();
+ for(int idx = 0; idx < groupNo; idx++){
+ Element group = (Element) groupList.item(idx);
+ parseGroup(group);
+ }
+
+ // 空リスト登録
+ for(MorphType morphType : MorphType.values()){
+ if( ! TYPED_MAP.containsKey(morphType) ){
+ TYPED_MAP.put(morphType, EMPTY);
+ }
+ }
+
+ return;
+ }
+
+ /**
+ * モーフグループ構造を解読する。
+ * @param group morphGroup要素
+ */
+ private static void parseGroup(Element group){
+ String typeAttr = group.getAttribute("type");
+ MorphType morphType = MorphType.valueOf(typeAttr);
+
+ NodeList morphList = group.getElementsByTagName("morph");
+ int morphNo = morphList.getLength();
+ List<TypicalMorph> groupedList = new ArrayList<TypicalMorph>(morphNo);
+
+ for(int idx = 0; idx < morphNo; idx++){
+ Element morph = (Element) morphList.item(idx);
+ TypicalMorph common = parseMorph(morph, morphType);
+ groupedList.add(common);
+ }
+
+ TYPED_MAP.put(morphType, Collections.unmodifiableList(groupedList));
+
+ return;
+ }
+
+ /**
+ * morph要素を解読する。
+ * @param morph morph要素
+ * @param mtype モーフ種別
+ * @return モーフ情報
+ */
+ private static TypicalMorph parseMorph(Element morph, MorphType mtype){
+ NodeList primaryNodes = morph.getElementsByTagName("primary");
+ NodeList globalNodes = morph.getElementsByTagName("global");
+ int primaryNo = primaryNodes.getLength();
+ int globalNo = globalNodes.getLength();
+
+ TypicalMorph typMorph = new TypicalMorph(mtype, primaryNo, globalNo);
+
+ for(int idx = 0; idx < primaryNo; idx++){
+ Element primary = (Element) primaryNodes.item(idx);
+ String name = primary.getAttribute("name");
+ typMorph.primaryList.add(name);
+ }
+
+ for(int idx = 0; idx < globalNo; idx++){
+ Element global = (Element) globalNodes.item(idx);
+ String name = global.getAttribute("name");
+ typMorph.globalList.add(name);
+ }
+
+ for(String primaryName : typMorph.primaryList){
+ PRIMARY_MAP.put(primaryName, typMorph);
+ }
+
+ for(String globalName : typMorph.globalList){
+ GLOBAL_MAP.put(globalName, typMorph);
+ }
+
+ return typMorph;
+ }
+
+ /**
+ * 全モーフ情報を一意に順序付ける設定を行う。
+ * <p>同一グループ内ではXMLでの定義順が反映される。
+ */
+ private static void numbering(){
+ int order = 0;
+ for(MorphType morphType : MorphType.values()){
+ for(TypicalMorph common : TYPED_MAP.get(morphType)){
+ common.orderNo = order++;
+ }
+ }
+
+ return;
+ }
+
+
+ /**
+ * 種別ごとのモーフ情報リストを取得する。
+ * @param morphType モーフ種別
+ * @return モーフ情報リスト
+ */
+ public static List<TypicalMorph> getTypedMorphList(MorphType morphType){
+ List<TypicalMorph> result = TYPED_MAP.get(morphType);
+ return result;
+ }
+
+ /**
+ * プライマリ名の合致するモーフ情報を返す。
+ * @param primaryName プライマリ名
+ * @return モーフ情報。見つからなければnull
+ */
+ public static TypicalMorph findWithPrimary(String primaryName){
+ TypicalMorph result = PRIMARY_MAP.get(primaryName);
+ return result;
+ }
+
+ /**
+ * グローバル名の合致するモーフ情報を返す。
+ * @param globalName グローバル名
+ * @return モーフ情報。見つからなければnull
+ */
+ public static TypicalMorph findWithGlobal(String globalName){
+ TypicalMorph result = GLOBAL_MAP.get(globalName);
+ return result;
+ }
+
+ /**
+ * プライマリ名をグローバル名に変換する。
+ * @param primaryName プライマリ名
+ * @return グローバル名。見つからなければnull
+ */
+ public static String primary2global(String primaryName){
+ TypicalMorph morph = findWithPrimary(primaryName);
+ if(morph == null) return null;
+ String global = morph.getTopGlobalName();
+ return global;
+ }
+
+ /**
+ * グローバル名をプライマリ名へ変換する。
+ * @param globalName グローバル名
+ * @return プライマリ名。見つからなければnull
+ */
+ public static String global2primary(String globalName){
+ TypicalMorph morph = findWithGlobal(globalName);
+ if(morph == null) return null;
+ String primary = morph.getTopPrimaryName();
+ return primary;
+ }
+
+ /**
+ * モーフ種別を返す。
+ * @return モーフ種別
+ */
+ public MorphType getMorphType(){
+ return this.type;
+ }
+
+}
--- /dev/null
+/*
+ * typical object information
+ *
+ * License : The MIT License
+ * Copyright(c) 2011 MikuToga Partners
+ */
+
+package jp.sourceforge.mikutoga.typical;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedList;
+import java.util.List;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+/**
+ * 各種標準オブジェクトの実装基板。
+ * <p>国産モデルではプライマリ名に日本語名が収められることが多い。
+ * プライマリ名は必ず一つ以上なければならない。
+ * <p>国産モデルではグローバル名に英語名が収められることが多いが、
+ * プライマリ名と同一の日本語名が収められている場合も多い。
+ */
+class TypicalObject {
+
+ /** オーダ番号によるコンパレータ。 */
+ public static final Comparator<TypicalObject> ORDER_COMPARATOR =
+ new OrderComparator();
+
+ protected final List<String> primaryList;
+ protected final List<String> globalList;
+
+ protected final List<String> umodPrimaryList;
+ protected final List<String> umodGlobalList;
+
+ protected int orderNo;
+
+
+ /**
+ * コンストラクタ。
+ * <p>各初期数が0以下の場合は、状況に応じて伸長する連結リストが用意される。
+ * @param primaryNo プライマリ名初期数。
+ * @param globalNo グローバル名初期数。
+ */
+ protected TypicalObject(int primaryNo, int globalNo){
+ super();
+
+ if(primaryNo <= 0){
+ this.primaryList = new LinkedList<String>();
+ }else{
+ this.primaryList = new ArrayList<String>(primaryNo);
+ }
+
+ if(globalNo <= 0){
+ this.globalList = new LinkedList<String>();
+ }else{
+ this.globalList = new ArrayList<String>(globalNo);
+ }
+
+ this.umodPrimaryList =
+ Collections.unmodifiableList(this.primaryList);
+ this.umodGlobalList =
+ Collections.unmodifiableList(this.globalList);
+
+ return;
+ }
+
+ /**
+ * コンストラクタ。
+ * <p>プライマリ名、グローバル名共、状況に応じて伸長する連結リストが用意される。
+ */
+ protected TypicalObject(){
+ this(0, 0);
+ return;
+ }
+
+
+ /**
+ * XMLドキュメントをロードする。
+ * @param is 入力
+ * @return 最上位要素
+ * @throws ParserConfigurationException XMLの構成が変
+ * @throws SAXException XMLの内容が変
+ * @throws IOException 入力エラー
+ */
+ protected static Element loadXml(InputStream is)
+ throws ParserConfigurationException, SAXException, IOException {
+ DocumentBuilderFactory factory;
+ factory = DocumentBuilderFactory.newInstance();
+ factory.setNamespaceAware(true);
+
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ Document doc = builder.parse(is);
+
+ Element top = doc.getDocumentElement();
+
+ return top;
+ }
+
+
+ /**
+ * プライマリ名をひとつ返す。
+ * @return 最初のプライマリ名
+ */
+ public String getTopPrimaryName(){
+ String result = this.primaryList.get(0);
+ return result;
+ }
+
+ /**
+ * グローバル名をひとつ返す。
+ * @return 最初のグローバル名。ひとつもなければnull
+ */
+ public String getTopGlobalName(){
+ String result;
+ if(this.globalList.isEmpty()) result = null;
+ else result = this.globalList.get(0);
+ return result;
+ }
+
+ /**
+ * 全プライマリ名を返す。
+ * @return 全プライマリ名リスト。(不可変)
+ */
+ public List<String> getPrimaryList(){
+ return this.umodPrimaryList;
+ }
+
+ /**
+ * 全グローバル名を返す。
+ * @return 全グローバル名リスト。(不可変)
+ */
+ public List<String> getGlobalList(){
+ return this.umodGlobalList;
+ }
+
+ /**
+ * オーダ番号によるコンパレータ。
+ */
+ private static class OrderComparator
+ implements Comparator<TypicalObject> {
+
+ /**
+ * コンストラクタ。
+ */
+ private OrderComparator(){
+ super();
+ return;
+ }
+
+ /**
+ * オーダ番号を順序づける。
+ * @param o1 {@inheritDoc}
+ * @param o2 {@inheritDoc}
+ * @return {@inheritDoc}
+ */
+ @Override
+ public int compare(TypicalObject o1, TypicalObject o2){
+ int result = o1.orderNo - o2.orderNo;
+ return result;
+ }
+
+ }
+
+}
--- /dev/null
+/*
+ * typical information
+ *
+ * License : The MIT License
+ * Copyright(c) 2011 MikuToga Partners
+ */
+
+/**
+ * MMDコミュニティにおける一般的な慣例に関する情報を提供する。
+ * <p>例)ボーン名やモーフ名の一般的な名前など
+ * <p>MikuMikuDance Ver.7.39同梱のモデルなどが主な情報源。
+ */
+
+package jp.sourceforge.mikutoga.typical;
+
+/* EOF */
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+
+<!--
+ commonly bone settings
+ source : MikuMikuDance built-in models
+-->
+
+
+<!DOCTYPE typicalBone [
+ <!ELEMENT typicalBone (bone*) >
+ <!ELEMENT bone (primary+, global*) >
+ <!ELEMENT primary EMPTY >
+ <!ELEMENT global EMPTY >
+
+ <!ATTLIST primary name CDATA #REQUIRED >
+ <!ATTLIST global name CDATA #REQUIRED >
+]>
+
+
+<typicalBone>
+
+
+ <bone>
+ <primary name="センター" /> <!-- センター -->
+ <global name="center" />
+ </bone>
+
+ <bone>
+ <primary name="上半身" /> <!-- 上半身 -->
+ <global name="upper body" />
+ </bone>
+
+ <bone>
+ <primary name="首" /> <!-- 首 -->
+ <global name="neck" />
+ </bone>
+
+ <bone>
+ <primary name="頭" /> <!-- 頭 -->
+ <global name="head" />
+ </bone>
+
+ <bone>
+ <primary name="左目" /> <!-- 左目 -->
+ <global name="eye_L" />
+ </bone>
+
+ <bone>
+ <primary name="右目" /> <!-- 右目 -->
+ <global name="eye_R" />
+ </bone>
+
+ <bone>
+ <primary name="下半身" /> <!-- 下半身 -->
+ <global name="lower body" />
+ </bone>
+
+ <bone>
+ <primary name="左肩" /> <!-- 左肩 -->
+ <global name="shoulder_L" />
+ </bone>
+
+ <bone>
+ <primary name="左腕" /> <!-- 左腕 -->
+ <global name="arm_L" />
+ </bone>
+
+ <bone>
+ <primary name="左腕捩" /> <!-- 左腕捩 -->
+ <global name="arm twist_L" />
+ </bone>
+
+ <bone>
+ <primary name="左ひじ" /> <!-- 左ひじ -->
+ <global name="elbow_L" />
+ </bone>
+
+ <bone>
+ <primary name="左手捩" /> <!-- 左手捩 -->
+ <global name="wrist twist_L" />
+ </bone>
+
+ <bone>
+ <primary name="左手首" /> <!-- 左手首 -->
+ <global name="wrist_L" />
+ </bone>
+
+ <bone>
+ <primary name="左袖" /> <!-- 左袖 -->
+ <global name="sleeve_L" />
+ </bone>
+
+ <bone>
+ <primary name="左親指1" /> <!-- 左親指1 -->
+ <global name="thumb1_L" />
+ </bone>
+
+ <bone>
+ <primary name="左親指2" /> <!-- 左親指2 -->
+ <global name="thumb2_L" />
+ </bone>
+
+ <bone>
+ <primary name="左人指1" /> <!-- 左人指1 -->
+ <global name="fore1_L" />
+ </bone>
+
+ <bone>
+ <primary name="左人指2" /> <!-- 左人指2 -->
+ <global name="fore2_L" />
+ </bone>
+
+ <bone>
+ <primary name="左人指3" /> <!-- 左人指3 -->
+ <global name="fore3_L" />
+ </bone>
+
+ <bone>
+ <primary name="左中指1" /> <!-- 左中指1 -->
+ <global name="middle1_L" />
+ </bone>
+
+ <bone>
+ <primary name="左中指2" /> <!-- 左中指2 -->
+ <global name="middle2_L" />
+ </bone>
+
+ <bone>
+ <primary name="左中指3" /> <!-- 左中指3 -->
+ <global name="middle3_L" />
+ </bone>
+
+ <bone>
+ <primary name="左薬指1" /> <!-- 左薬指1 -->
+ <global name="third1_L" />
+ </bone>
+
+ <bone>
+ <primary name="左薬指2" /> <!-- 左薬指2 -->
+ <global name="third2_L" />
+ </bone>
+
+ <bone>
+ <primary name="左薬指3" /> <!-- 左薬指3 -->
+ <global name="third3_L" />
+ </bone>
+
+ <bone>
+ <primary name="左小指1" /> <!-- 左小指1 -->
+ <global name="little1_L" />
+ </bone>
+
+ <bone>
+ <primary name="左小指2" /> <!-- 左小指2 -->
+ <global name="little2_L" />
+ </bone>
+
+ <bone>
+ <primary name="左小指3" /> <!-- 左小指3 -->
+ <global name="little3_L" />
+ </bone>
+
+ <bone>
+ <primary name="左足" /> <!-- 左足 -->
+ <global name="leg_L" />
+ </bone>
+
+ <bone>
+ <primary name="左ひざ" /> <!-- 左ひざ -->
+ <global name="knee_L" />
+ </bone>
+
+ <bone>
+ <primary name="左足首" /> <!-- 左足首 -->
+ <global name="ankle_L" />
+ </bone>
+
+ <bone>
+ <primary name="右肩" /> <!-- 右肩 -->
+ <global name="shoulder_R" />
+ </bone>
+
+ <bone>
+ <primary name="右腕" /> <!-- 右腕 -->
+ <global name="arm_R" />
+ </bone>
+
+ <bone>
+ <primary name="右腕捩" /> <!-- 右腕捩 -->
+ <global name="arm twist_R" />
+ </bone>
+
+ <bone>
+ <primary name="右ひじ" /> <!-- 右ひじ -->
+ <global name="elbow_R" />
+ </bone>
+
+ <bone>
+ <primary name="右手捩" /> <!-- 右手捩 -->
+ <global name="wrist twist_R" />
+ </bone>
+
+ <bone>
+ <primary name="右手首" /> <!-- 右手首 -->
+ <global name="wrist_R" />
+ </bone>
+
+ <bone>
+ <primary name="右袖" /> <!-- 右袖 -->
+ <global name="sleeve_R" />
+ </bone>
+
+ <bone>
+ <primary name="右親指1" /> <!-- 右親指1 -->
+ <global name="thumb1_R" />
+ </bone>
+
+ <bone>
+ <primary name="右親指2" /> <!-- 右親指2 -->
+ <global name="thumb2_R" />
+ </bone>
+
+ <bone>
+ <primary name="右人指1" /> <!-- 右人指1 -->
+ <global name="fore1_R" />
+ </bone>
+
+ <bone>
+ <primary name="右人指2" /> <!-- 右人指2 -->
+ <global name="fore2_R" />
+ </bone>
+
+ <bone>
+ <primary name="右人指3" /> <!-- 右人指3 -->
+ <global name="fore3_R" />
+ </bone>
+
+ <bone>
+ <primary name="右中指1" /> <!-- 右中指1 -->
+ <global name="middle1_R" />
+ </bone>
+
+ <bone>
+ <primary name="右中指2" /> <!-- 右中指2 -->
+ <global name="middle2_R" />
+ </bone>
+
+ <bone>
+ <primary name="右中指3" /> <!-- 右中指3 -->
+ <global name="middle3_R" />
+ </bone>
+
+ <bone>
+ <primary name="右薬指1" /> <!-- 右薬指1 -->
+ <global name="third1_R" />
+ </bone>
+
+ <bone>
+ <primary name="右薬指2" /> <!-- 右薬指2 -->
+ <global name="third2_R" />
+ </bone>
+
+ <bone>
+ <primary name="右薬指3" /> <!-- 右薬指3 -->
+ <global name="third3_R" />
+ </bone>
+
+ <bone>
+ <primary name="右小指1" /> <!-- 右小指1 -->
+ <global name="little1_R" />
+ </bone>
+
+ <bone>
+ <primary name="右小指2" /> <!-- 右小指2 -->
+ <global name="little2_R" />
+ </bone>
+
+ <bone>
+ <primary name="右小指3" /> <!-- 右小指3 -->
+ <global name="little3_R" />
+ </bone>
+
+ <bone>
+ <primary name="右足" /> <!-- 右足 -->
+ <global name="leg_R" />
+ </bone>
+
+ <bone>
+ <primary name="右ひざ" /> <!-- 右ひざ -->
+ <global name="knee_R" />
+ </bone>
+
+ <bone>
+ <primary name="右足首" /> <!-- 右足首 -->
+ <global name="ankle_R" />
+ </bone>
+
+ <bone>
+ <primary name="両目" /> <!-- 両目 -->
+ <global name="eyes" />
+ </bone>
+
+ <bone>
+ <primary name="左つま先" /> <!-- 左つま先 -->
+ <global name="L toe" />
+ </bone>
+
+ <bone>
+ <primary name="右つま先" /> <!-- 右つま先 -->
+ <global name="R toe" />
+ </bone>
+
+ <bone>
+ <primary name="左足IK" /> <!-- 左足IK -->
+ <global name="leg IK_L" />
+ </bone>
+
+ <bone>
+ <primary name="右足IK" /> <!-- 右足IK -->
+ <global name="leg IK_R" />
+ </bone>
+
+ <bone>
+ <primary name="左つま先IK" /> <!-- 左つま先IK -->
+ <global name="toe IK_L" />
+ </bone>
+
+ <bone>
+ <primary name="右つま先IK" /> <!-- 右つま先IK -->
+ <global name="toe IK_R" />
+ </bone>
+
+ <bone>
+ <primary name="ボーン01" /> <!-- ボーン01 -->
+ <global name="bone01" />
+ </bone>
+
+ <bone>
+ <primary name="ボーン02" /> <!-- ボーン02 -->
+ <global name="bone02" />
+ </bone>
+
+ <bone>
+ <primary name="ボーン03" /> <!-- ボーン03 -->
+ <global name="bone03" />
+ </bone>
+
+ <bone>
+ <primary name="ボーン04" /> <!-- ボーン04 -->
+ <global name="bone04" />
+ </bone>
+
+ <bone>
+ <primary name="ボーン05" /> <!-- ボーン05 -->
+ <global name="bone05" />
+ </bone>
+
+ <bone>
+ <primary name="ボーン06" /> <!-- ボーン06 -->
+ <global name="bone06" />
+ </bone>
+
+ <bone>
+ <primary name="ボーン07" /> <!-- ボーン07 -->
+ <global name="bone07" />
+ </bone>
+
+ <bone>
+ <primary name="ボーン08" /> <!-- ボーン08 -->
+ <global name="bone08" />
+ </bone>
+
+ <bone>
+ <primary name="ボーン09" /> <!-- ボーン09 -->
+ <global name="bone09" />
+ </bone>
+
+ <bone>
+ <primary name="ボーン10" /> <!-- ボーン10 -->
+ <global name="bone10" />
+ </bone>
+
+ <bone>
+ <primary name="ボーン11" /> <!-- ボーン11 -->
+ <global name="bone11" />
+ </bone>
+
+ <bone>
+ <primary name="ボーン12" /> <!-- ボーン12 -->
+ <global name="bone12" />
+ </bone>
+
+ <bone>
+ <primary name="ボーン13" /> <!-- ボーン13 -->
+ <global name="bone13" />
+ </bone>
+
+ <bone>
+ <primary name="ボーン14" /> <!-- ボーン14 -->
+ <global name="bone14" />
+ </bone>
+
+ <bone>
+ <primary name="ボーン15" /> <!-- ボーン15 -->
+ <global name="bone15" />
+ </bone>
+
+
+</typicalBone>
+
+
+<!-- EOF -->
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+
+<!--
+ commonly morph settings
+ source : MikuMikuDance built-in models
+-->
+
+
+<!DOCTYPE typicalMorph [
+ <!ELEMENT typicalMorph (morphGroup*) >
+ <!ELEMENT morphGroup (morph*) >
+ <!ELEMENT morph (primary+, global*) >
+ <!ELEMENT primary EMPTY >
+ <!ELEMENT global EMPTY >
+
+ <!ATTLIST morphGroup type ( EYEBROW | EYE | LIP | EXTRA ) #REQUIRED >
+ <!ATTLIST primary name CDATA #REQUIRED >
+ <!ATTLIST global name CDATA #REQUIRED >
+]>
+
+
+<typicalMorph>
+
+
+<morphGroup type="EYEBROW" > <!-- まゆ -->
+
+ <morph>
+ <primary name="真面目" /> <!-- 真面目 -->
+ <global name="serious" />
+ </morph>
+
+ <morph>
+ <primary name="困る" /> <!-- 困る -->
+ <global name="sadness" />
+ </morph>
+
+ <morph>
+ <primary name="にこり" /> <!-- にこり -->
+ <global name="cheerful" />
+ </morph>
+
+ <morph>
+ <primary name="怒り" /> <!-- 怒り -->
+ <global name="anger" />
+ </morph>
+
+ <morph>
+ <primary name="上" /> <!-- 上 -->
+ <global name="go up" />
+ </morph>
+
+ <morph>
+ <primary name="下" /> <!-- 下 -->
+ <global name="go down" />
+ </morph>
+
+</morphGroup>
+
+<morphGroup type="EYE" > <!-- 目 -->
+
+ <morph>
+ <primary name="まばたき" /> <!-- まばたき -->
+ <global name="blink" />
+ </morph>
+
+ <morph>
+ <primary name="笑い" /> <!-- 笑い -->
+ <global name="smile" />
+ </morph>
+
+ <morph>
+ <primary name="ウィンク" /> <!-- ウィンク -->
+ <global name="wink" />
+ </morph>
+
+ <morph>
+ <primary name="はぅ" /> <!-- はぅ -->
+ <global name="close><" />
+ </morph>
+
+ <morph>
+ <primary name="なごみ" /> <!-- なごみ -->
+ <global name="calm" />
+ </morph>
+
+ <morph>
+ <primary name="びっくり" /> <!-- びっくり -->
+ <global name="surprise" />
+ </morph>
+
+ <morph>
+ <primary name="じと目" /> <!-- じと目 -->
+ <global name="doubt" />
+ </morph>
+
+</morphGroup>
+
+<morphGroup type="LIP" > <!-- 唇 -->
+
+ <morph>
+ <primary name="あ" /> <!-- あ -->
+ <global name="a" />
+ </morph>
+
+ <morph>
+ <primary name="い" /> <!-- い -->
+ <global name="i" />
+ </morph>
+
+ <morph>
+ <primary name="う" /> <!-- う -->
+ <global name="u" />
+ </morph>
+
+ <morph>
+ <primary name="え" /> <!-- え -->
+ <global name="e" />
+ </morph>
+
+ <morph>
+ <primary name="お" /> <!-- お -->
+ <global name="o" />
+ </morph>
+
+ <morph>
+ <primary name="にやり" /> <!-- にやり -->
+ <global name="grin" />
+ </morph>
+
+ <morph>
+ <primary name="▲" /> <!-- ▲ -->
+ <primary name="△" /> <!-- △ -->
+ <global name="triangle" />
+ </morph>
+
+ <morph>
+ <primary name="∧" /> <!-- ∧ -->
+ <primary name="への字" /> <!-- への字 -->
+ <global name="regret" />
+ </morph>
+
+ <morph>
+ <primary name="はんっ!" /> <!-- はんっ! -->
+ <global name="fool" />
+ </morph>
+
+ <morph>
+ <primary name="ω" /> <!-- ω -->
+ <global name="omega" />
+ </morph>
+
+ <morph>
+ <primary name="ω□" /> <!-- ω□ -->
+ <global name="omegabox" />
+ </morph>
+
+ <morph>
+ <primary name="えー" /> <!-- えー -->
+ <global name="e-" />
+ </morph>
+
+</morphGroup>
+
+<morphGroup type="EXTRA" > <!-- その他 -->
+
+ <morph>
+ <primary name="瞳小" /> <!-- 瞳小 -->
+ <global name="pupil" />
+ </morph>
+
+ <morph>
+ <primary name="べー" /> <!-- べー -->
+ <primary name="ぺろっ" /> <!-- ぺろっ -->
+ <global name="tongue" />
+ </morph>
+
+</morphGroup>
+
+
+</typicalMorph>
+
+
+<!-- EOF -->