OSDN Git Service

typicalパッケージ導入
authorOlyutorskii <olyutorskii@users.osdn.me>
Tue, 23 Aug 2011 16:01:41 +0000 (01:01 +0900)
committerOlyutorskii <olyutorskii@users.osdn.me>
Tue, 23 Aug 2011 16:01:41 +0000 (01:01 +0900)
src/main/java/jp/sourceforge/mikutoga/typical/TypicalBone.java [new file with mode: 0644]
src/main/java/jp/sourceforge/mikutoga/typical/TypicalMorph.java [new file with mode: 0644]
src/main/java/jp/sourceforge/mikutoga/typical/TypicalObject.java [new file with mode: 0644]
src/main/java/jp/sourceforge/mikutoga/typical/package-info.java [new file with mode: 0644]
src/main/resources/jp/sourceforge/mikutoga/typical/resources/typicalBone.xml [new file with mode: 0644]
src/main/resources/jp/sourceforge/mikutoga/typical/resources/typicalMorph.xml [new file with mode: 0644]

diff --git a/src/main/java/jp/sourceforge/mikutoga/typical/TypicalBone.java b/src/main/java/jp/sourceforge/mikutoga/typical/TypicalBone.java
new file mode 100644 (file)
index 0000000..1be886a
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ * 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;
+    }
+
+}
diff --git a/src/main/java/jp/sourceforge/mikutoga/typical/TypicalMorph.java b/src/main/java/jp/sourceforge/mikutoga/typical/TypicalMorph.java
new file mode 100644 (file)
index 0000000..12c37d8
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * 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;
+    }
+
+}
diff --git a/src/main/java/jp/sourceforge/mikutoga/typical/TypicalObject.java b/src/main/java/jp/sourceforge/mikutoga/typical/TypicalObject.java
new file mode 100644 (file)
index 0000000..f1a4bd8
--- /dev/null
@@ -0,0 +1,172 @@
+/*
+ * 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;
+        }
+
+    }
+
+}
diff --git a/src/main/java/jp/sourceforge/mikutoga/typical/package-info.java b/src/main/java/jp/sourceforge/mikutoga/typical/package-info.java
new file mode 100644 (file)
index 0000000..93e1b33
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * typical information
+ *
+ * License : The MIT License
+ * Copyright(c) 2011 MikuToga Partners
+ */
+
+/**
+ * MMDコミュニティにおける一般的な慣例に関する情報を提供する。
+ * <p>例)ボーン名やモーフ名の一般的な名前など
+ * <p>MikuMikuDance Ver.7.39同梱のモデルなどが主な情報源。
+ */
+
+package jp.sourceforge.mikutoga.typical;
+
+/* EOF */
diff --git a/src/main/resources/jp/sourceforge/mikutoga/typical/resources/typicalBone.xml b/src/main/resources/jp/sourceforge/mikutoga/typical/resources/typicalBone.xml
new file mode 100644 (file)
index 0000000..dbd26fb
--- /dev/null
@@ -0,0 +1,413 @@
+<?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="&#x30BB;&#x30F3;&#x30BF;&#x30FC;" />  <!-- センター -->
+        <global name="center" />
+    </bone>
+
+    <bone>
+        <primary name="&#x4E0A;&#x534A;&#x8EAB;" />  <!-- 上半身 -->
+        <global name="upper body" />
+    </bone>
+
+    <bone>
+        <primary name="&#x9996;" />  <!-- 首 -->
+        <global name="neck" />
+    </bone>
+
+    <bone>
+        <primary name="&#x982D;" />  <!-- 頭 -->
+        <global name="head" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x76EE;" />  <!-- 左目 -->
+        <global name="eye_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x76EE;" />  <!-- 右目 -->
+        <global name="eye_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x4E0B;&#x534A;&#x8EAB;" />  <!-- 下半身 -->
+        <global name="lower body" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x80A9;" />  <!-- 左肩 -->
+        <global name="shoulder_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x8155;" />  <!-- 左腕 -->
+        <global name="arm_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x8155;&#x6369;" />  <!-- 左腕捩 -->
+        <global name="arm twist_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x3072;&#x3058;" />  <!-- 左ひじ -->
+        <global name="elbow_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x624B;&#x6369;" />  <!-- 左手捩 -->
+        <global name="wrist twist_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x624B;&#x9996;" />  <!-- 左手首 -->
+        <global name="wrist_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x8896;" />  <!-- 左袖 -->
+        <global name="sleeve_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x89AA;&#x6307;&#xFF11;" />  <!-- 左親指1 -->
+        <global name="thumb1_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x89AA;&#x6307;&#xFF12;" />  <!-- 左親指2 -->
+        <global name="thumb2_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x4EBA;&#x6307;&#xFF11;" />  <!-- 左人指1 -->
+        <global name="fore1_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x4EBA;&#x6307;&#xFF12;" />  <!-- 左人指2 -->
+        <global name="fore2_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x4EBA;&#x6307;&#xFF13;" />  <!-- 左人指3 -->
+        <global name="fore3_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x4E2D;&#x6307;&#xFF11;" />  <!-- 左中指1 -->
+        <global name="middle1_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x4E2D;&#x6307;&#xFF12;" />  <!-- 左中指2 -->
+        <global name="middle2_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x4E2D;&#x6307;&#xFF13;" />  <!-- 左中指3 -->
+        <global name="middle3_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x85AC;&#x6307;&#xFF11;" />  <!-- 左薬指1 -->
+        <global name="third1_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x85AC;&#x6307;&#xFF12;" />  <!-- 左薬指2 -->
+        <global name="third2_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x85AC;&#x6307;&#xFF13;" />  <!-- 左薬指3 -->
+        <global name="third3_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x5C0F;&#x6307;&#xFF11;" />  <!-- 左小指1 -->
+        <global name="little1_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x5C0F;&#x6307;&#xFF12;" />  <!-- 左小指2 -->
+        <global name="little2_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x5C0F;&#x6307;&#xFF13;" />  <!-- 左小指3 -->
+        <global name="little3_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x8DB3;" />  <!-- 左足 -->
+        <global name="leg_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x3072;&#x3056;" />  <!-- 左ひざ -->
+        <global name="knee_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x8DB3;&#x9996;" />  <!-- 左足首 -->
+        <global name="ankle_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x80A9;" />  <!-- 右肩 -->
+        <global name="shoulder_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x8155;" />  <!-- 右腕 -->
+        <global name="arm_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x8155;&#x6369;" />  <!-- 右腕捩 -->
+        <global name="arm twist_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x3072;&#x3058;" />  <!-- 右ひじ -->
+        <global name="elbow_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x624B;&#x6369;" />  <!-- 右手捩 -->
+        <global name="wrist twist_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x624B;&#x9996;" />  <!-- 右手首 -->
+        <global name="wrist_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x8896;" />  <!-- 右袖 -->
+        <global name="sleeve_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x89AA;&#x6307;&#xFF11;" />  <!-- 右親指1 -->
+        <global name="thumb1_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x89AA;&#x6307;&#xFF12;" />  <!-- 右親指2 -->
+        <global name="thumb2_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x4EBA;&#x6307;&#xFF11;" />  <!-- 右人指1 -->
+        <global name="fore1_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x4EBA;&#x6307;&#xFF12;" />  <!-- 右人指2 -->
+        <global name="fore2_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x4EBA;&#x6307;&#xFF13;" />  <!-- 右人指3 -->
+        <global name="fore3_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x4E2D;&#x6307;&#xFF11;" />  <!-- 右中指1 -->
+        <global name="middle1_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x4E2D;&#x6307;&#xFF12;" />  <!-- 右中指2 -->
+        <global name="middle2_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x4E2D;&#x6307;&#xFF13;" />  <!-- 右中指3 -->
+        <global name="middle3_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x85AC;&#x6307;&#xFF11;" />  <!-- 右薬指1 -->
+        <global name="third1_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x85AC;&#x6307;&#xFF12;" />  <!-- 右薬指2 -->
+        <global name="third2_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x85AC;&#x6307;&#xFF13;" />  <!-- 右薬指3 -->
+        <global name="third3_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x5C0F;&#x6307;&#xFF11;" />  <!-- 右小指1 -->
+        <global name="little1_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x5C0F;&#x6307;&#xFF12;" />  <!-- 右小指2 -->
+        <global name="little2_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x5C0F;&#x6307;&#xFF13;" />  <!-- 右小指3 -->
+        <global name="little3_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x8DB3;" />  <!-- 右足 -->
+        <global name="leg_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x3072;&#x3056;" />  <!-- 右ひざ -->
+        <global name="knee_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x8DB3;&#x9996;" />  <!-- 右足首 -->
+        <global name="ankle_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x4E21;&#x76EE;" />  <!-- 両目 -->
+        <global name="eyes" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x3064;&#x307E;&#x5148;" />  <!-- 左つま先 -->
+        <global name="L toe" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x3064;&#x307E;&#x5148;" />  <!-- 右つま先 -->
+        <global name="R toe" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x8DB3;&#xFF29;&#xFF2B;" />  <!-- 左足IK -->
+        <global name="leg IK_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x8DB3;&#xFF29;&#xFF2B;" />  <!-- 右足IK -->
+        <global name="leg IK_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#x5DE6;&#x3064;&#x307E;&#x5148;&#xFF29;&#xFF2B;" />  <!-- 左つま先IK -->
+        <global name="toe IK_L" />
+    </bone>
+
+    <bone>
+        <primary name="&#x53F3;&#x3064;&#x307E;&#x5148;&#xFF29;&#xFF2B;" />  <!-- 右つま先IK -->
+        <global name="toe IK_R" />
+    </bone>
+
+    <bone>
+        <primary name="&#xFF8E;&#xFF9E;&#xFF70;&#xFF9D;01" />  <!-- ボーン01 -->
+        <global name="bone01" />
+    </bone>
+
+    <bone>
+        <primary name="&#xFF8E;&#xFF9E;&#xFF70;&#xFF9D;02" />  <!-- ボーン02 -->
+        <global name="bone02" />
+    </bone>
+
+    <bone>
+        <primary name="&#xFF8E;&#xFF9E;&#xFF70;&#xFF9D;03" />  <!-- ボーン03 -->
+        <global name="bone03" />
+    </bone>
+
+    <bone>
+        <primary name="&#xFF8E;&#xFF9E;&#xFF70;&#xFF9D;04" />  <!-- ボーン04 -->
+        <global name="bone04" />
+    </bone>
+
+    <bone>
+        <primary name="&#xFF8E;&#xFF9E;&#xFF70;&#xFF9D;05" />  <!-- ボーン05 -->
+        <global name="bone05" />
+    </bone>
+
+    <bone>
+        <primary name="&#xFF8E;&#xFF9E;&#xFF70;&#xFF9D;06" />  <!-- ボーン06 -->
+        <global name="bone06" />
+    </bone>
+
+    <bone>
+        <primary name="&#xFF8E;&#xFF9E;&#xFF70;&#xFF9D;07" />  <!-- ボーン07 -->
+        <global name="bone07" />
+    </bone>
+
+    <bone>
+        <primary name="&#xFF8E;&#xFF9E;&#xFF70;&#xFF9D;08" />  <!-- ボーン08 -->
+        <global name="bone08" />
+    </bone>
+
+    <bone>
+        <primary name="&#xFF8E;&#xFF9E;&#xFF70;&#xFF9D;09" />  <!-- ボーン09 -->
+        <global name="bone09" />
+    </bone>
+
+    <bone>
+        <primary name="&#xFF8E;&#xFF9E;&#xFF70;&#xFF9D;10" />  <!-- ボーン10 -->
+        <global name="bone10" />
+    </bone>
+
+    <bone>
+        <primary name="&#xFF8E;&#xFF9E;&#xFF70;&#xFF9D;11" />  <!-- ボーン11 -->
+        <global name="bone11" />
+    </bone>
+
+    <bone>
+        <primary name="&#xFF8E;&#xFF9E;&#xFF70;&#xFF9D;12" />  <!-- ボーン12 -->
+        <global name="bone12" />
+    </bone>
+
+    <bone>
+        <primary name="&#xFF8E;&#xFF9E;&#xFF70;&#xFF9D;13" />  <!-- ボーン13 -->
+        <global name="bone13" />
+    </bone>
+
+    <bone>
+        <primary name="&#xFF8E;&#xFF9E;&#xFF70;&#xFF9D;14" />  <!-- ボーン14 -->
+        <global name="bone14" />
+    </bone>
+
+    <bone>
+        <primary name="&#xFF8E;&#xFF9E;&#xFF70;&#xFF9D;15" />  <!-- ボーン15 -->
+        <global name="bone15" />
+    </bone>
+
+
+</typicalBone>
+
+
+<!-- EOF -->
diff --git a/src/main/resources/jp/sourceforge/mikutoga/typical/resources/typicalMorph.xml b/src/main/resources/jp/sourceforge/mikutoga/typical/resources/typicalMorph.xml
new file mode 100644 (file)
index 0000000..ebbae48
--- /dev/null
@@ -0,0 +1,184 @@
+<?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="&#x771F;&#x9762;&#x76EE;" />  <!-- 真面目 -->
+        <global name="serious" />
+    </morph>
+
+    <morph>
+        <primary name="&#x56F0;&#x308B;" />  <!-- 困る -->
+        <global name="sadness" />
+    </morph>
+
+    <morph>
+        <primary name="&#x306B;&#x3053;&#x308A;" />  <!-- にこり -->
+        <global name="cheerful" />
+    </morph>
+
+    <morph>
+        <primary name="&#x6012;&#x308A;" />  <!-- 怒り -->
+        <global name="anger" />
+    </morph>
+
+    <morph>
+        <primary name="&#x4E0A;" />  <!-- 上 -->
+        <global name="go up" />
+    </morph>
+
+    <morph>
+        <primary name="&#x4E0B;" />  <!-- 下 -->
+        <global name="go down" />
+    </morph>
+
+</morphGroup>
+
+<morphGroup type="EYE" >  <!-- 目 -->
+
+    <morph>
+        <primary name="&#x307E;&#x3070;&#x305F;&#x304D;" />  <!-- まばたき -->
+        <global name="blink" />
+    </morph>
+
+    <morph>
+        <primary name="&#x7B11;&#x3044;" />  <!-- 笑い -->
+        <global name="smile" />
+    </morph>
+
+    <morph>
+        <primary name="&#x30A6;&#x30A3;&#x30F3;&#x30AF;" />  <!-- ウィンク -->
+        <global name="wink" />
+    </morph>
+
+    <morph>
+        <primary name="&#x306F;&#x3045;" />  <!-- はぅ -->
+        <global name="close&gt;&lt;" />
+    </morph>
+
+    <morph>
+        <primary name="&#x306A;&#x3054;&#x307F;" />  <!-- なごみ -->
+        <global name="calm" />
+    </morph>
+
+    <morph>
+        <primary name="&#x3073;&#x3063;&#x304F;&#x308A;" />  <!-- びっくり -->
+        <global name="surprise" />
+    </morph>
+
+    <morph>
+        <primary name="&#x3058;&#x3068;&#x76EE;" />  <!-- じと目 -->
+        <global name="doubt" />
+    </morph>
+
+</morphGroup>
+
+<morphGroup type="LIP" >  <!-- 唇 -->
+
+    <morph>
+        <primary name="&#x3042;" />  <!-- あ -->
+        <global name="a" />
+    </morph>
+
+    <morph>
+        <primary name="&#x3044;" />  <!-- い -->
+        <global name="i" />
+    </morph>
+
+    <morph>
+        <primary name="&#x3046;" />  <!-- う -->
+        <global name="u" />
+    </morph>
+
+    <morph>
+        <primary name="&#x3048;" />  <!-- え -->
+        <global name="e" />
+    </morph>
+
+    <morph>
+        <primary name="&#x304A;" />  <!-- お -->
+        <global name="o" />
+    </morph>
+
+    <morph>
+        <primary name="&#x306B;&#x3084;&#x308A;" />  <!-- にやり -->
+        <global name="grin" />
+    </morph>
+
+    <morph>
+        <primary name="&#x25B2;" />  <!-- ▲ -->
+        <primary name="&#x25B3;" />  <!-- △ -->
+        <global name="triangle" />
+    </morph>
+
+    <morph>
+        <primary name="&#x2227;" />  <!-- ∧ -->
+        <primary name="&#x3078;&#x306E;&#x5B57;" />  <!-- への字 -->
+        <global name="regret" />
+    </morph>
+
+    <morph>
+        <primary name="&#x306F;&#x3093;&#x3063;&#xFF01;" />  <!-- はんっ! -->
+        <global name="fool" />
+    </morph>
+
+    <morph>
+        <primary name="&#x03C9;" />  <!-- ω -->
+        <global name="omega" />
+    </morph>
+
+    <morph>
+        <primary name="&#x03C9;&#x25A1;" />  <!-- ω□ -->
+        <global name="omegabox" />
+    </morph>
+
+    <morph>
+        <primary name="&#x3048;&#x30FC;" />  <!-- えー -->
+        <global name="e-" />
+    </morph>
+
+</morphGroup>
+
+<morphGroup type="EXTRA" >  <!-- その他 -->
+
+    <morph>
+        <primary name="&#x77B3;&#x5C0F;" />  <!-- 瞳小 -->
+        <global name="pupil" />
+    </morph>
+
+    <morph>
+        <primary name="&#x3079;&#x30FC;" />  <!-- べー -->
+        <primary name="&#x307A;&#x308D;&#x3063;" />  <!-- ぺろっ -->
+        <global name="tongue" />
+    </morph>
+
+</morphGroup>
+
+
+</typicalMorph>
+
+
+<!-- EOF -->