2 * morph listener from XML
4 * License : The MIT License
5 * Copyright(c) 2013 MikuToga Partners
8 package jp.sfjp.mikutoga.pmd.model.xml;
10 import java.util.LinkedList;
11 import java.util.List;
13 import jp.sfjp.mikutoga.corelib.I18nText;
14 import jp.sfjp.mikutoga.math.MkPos3D;
15 import jp.sfjp.mikutoga.pmd.MorphType;
16 import jp.sfjp.mikutoga.pmd.model.ListUtil;
17 import jp.sfjp.mikutoga.pmd.model.MorphPart;
18 import jp.sfjp.mikutoga.pmd.model.MorphVertex;
28 * モーフ関連のXML要素出現イベントを受信する。
30 class SaxMorphListener extends SaxListener{
32 private final RefHelper helper;
34 private MorphPart currentMorph = null;
41 SaxMorphListener(RefHelper helper) {
49 * morphListタグ終了の通知を受け取る。
50 * 各モーフは0番ではなく1番から採番される。
53 @CloseXmlMark(PmdTag.MORPH_LIST)
54 void closeMorphList(){
55 Map<MorphType, List<MorphPart>> morphMap =
56 getPmdModel().getMorphMap();
57 List<MorphPart> tempList = new LinkedList<>();
59 tempList.addAll(morphMap.get(MorphType.EYEBROW));
60 tempList.addAll(morphMap.get(MorphType.EYE));
61 tempList.addAll(morphMap.get(MorphType.LIP));
62 tempList.addAll(morphMap.get(MorphType.EXTRA));
64 MorphPart baseDummy = new MorphPart();
65 tempList.add(0, baseDummy); // BASE dummy
67 ListUtil.assignIndexedSerial(tempList);
75 @OpenXmlMark(PmdTag.MORPH)
77 this.currentMorph = new MorphPart();
79 String name = getStringAttr(PmdAttr.NAME);
80 I18nText morphName = this.currentMorph.getMorphName();
81 morphName.setPrimaryText(name);
83 String type = getStringAttr(PmdAttr.TYPE);
84 MorphType morphType = MorphType.valueOf(type);
85 this.currentMorph.setMorphType(morphType);
93 @CloseXmlMark(PmdTag.MORPH)
95 Map<MorphType, List<MorphPart>> morphMap =
96 getPmdModel().getMorphMap();
98 MorphType morphType = this.currentMorph.getMorphType();
99 List<MorphPart> morphList = morphMap.get(morphType);
100 morphList.add(this.currentMorph);
102 this.currentMorph = null;
108 * i18nTextタグ開始の通知を受け取る。
110 @OpenXmlMark(PmdTag.I18N_NAME)
112 String lang = getStringAttr(PmdAttr.LANG);
113 String name = getStringAttr(PmdAttr.NAME);
115 I18nText morphName = this.currentMorph.getMorphName();
116 morphName.setI18nText(lang, name);
122 * morphVertexタグ開始の通知を受け取る。
124 @OpenXmlMark(PmdTag.MORPH_VERTEX)
125 void openMorphVertex(){
126 MorphVertex morphVertex = new MorphVertex();
128 String vertexIdRef = getStringAttr(PmdAttr.VERTEX_IDREF);
129 this.helper.addMorphVertexIdRef(morphVertex, vertexIdRef);
131 float xOff = getFloatAttr(PmdAttr.XOFF);
132 float yOff = getFloatAttr(PmdAttr.YOFF);
133 float zOff = getFloatAttr(PmdAttr.ZOFF);
134 MkPos3D offset = morphVertex.getOffset();
135 offset.setPosition(xOff, yOff, zOff);
137 List<MorphVertex> morphVertexList =
138 this.currentMorph.getMorphVertexList();
139 morphVertexList.add(morphVertex);