OSDN Git Service

130128版スキーマ対応
[mikutoga/Pmd2XML.git] / src / main / java / jp / sfjp / mikutoga / pmd / binio / MorphBuilder.java
diff --git a/src/main/java/jp/sfjp/mikutoga/pmd/binio/MorphBuilder.java b/src/main/java/jp/sfjp/mikutoga/pmd/binio/MorphBuilder.java
new file mode 100644 (file)
index 0000000..6e49113
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * building morph information
+ *
+ * License : The MIT License
+ * Copyright(c) 2010 MikuToga Partners
+ */
+
+package jp.sfjp.mikutoga.pmd.binio;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import jp.sfjp.mikutoga.pmd.model.ListUtil;
+import jp.sfjp.mikutoga.pmd.model.MorphPart;
+import jp.sfjp.mikutoga.pmd.model.MorphVertex;
+import jp.sfjp.mikutoga.pmd.model.PmdModel;
+import jp.sfjp.mikutoga.pmd.model.Vertex;
+import jp.sourceforge.mikutoga.math.MkPos3D;
+import jp.sourceforge.mikutoga.parser.ParseStage;
+import jp.sourceforge.mikutoga.pmd.MorphType;
+import jp.sourceforge.mikutoga.pmd.parser.PmdMorphHandler;
+
+/**
+ * モーフ関係の通知をパーサから受け取る。
+ */
+class MorphBuilder implements PmdMorphHandler {
+
+    private final Map<MorphType, List<MorphPart>> morphMap;
+
+    private List<MorphPart> morphPartList;
+    private Iterator<MorphPart> morphPartIt;
+    private MorphPart currentMorphPart;
+    private final List<Vertex> vertexList;
+
+    private final List<Vertex> morphVertexList = new ArrayList<Vertex>();
+
+    /**
+     * コンストラクタ。
+     * @param model モデル
+     */
+    MorphBuilder(PmdModel model){
+        super();
+        this.vertexList = model.getVertexList();
+        this.morphMap = model.getMorphMap();
+        return;
+    }
+
+    /**
+     * PMDファイル中の出現順で各モーフを格納するためのリストを設定する。
+     * 主な用途はモーフ英名との突き合わせ作業。
+     * @param list モーフ格納リスト
+     */
+    void setMorphPartList(List<MorphPart> list){
+        this.morphPartList = list;
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param stage {@inheritDoc}
+     * @param loops {@inheritDoc}
+     */
+    @Override
+    public void loopStart(ParseStage stage, int loops){
+        if(stage == PmdMorphHandler.MORPH_LIST){
+            ListUtil.prepareDefConsList(this.morphPartList,
+                                        MorphPart.class,
+                                        loops );
+            ListUtil.assignIndexedSerial(this.morphPartList);
+
+            this.morphPartIt = this.morphPartList.iterator();
+            if(this.morphPartIt.hasNext()){
+                this.currentMorphPart = this.morphPartIt.next();
+            }
+        }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
+            // NOTHING
+        }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
+            // NOTHING
+        }else{
+            assert false;
+            throw new AssertionError();
+        }
+
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param stage {@inheritDoc}
+     */
+    @Override
+    public void loopNext(ParseStage stage){
+        if(stage == PmdMorphHandler.MORPH_LIST){
+            if(this.morphPartIt.hasNext()){
+                this.currentMorphPart = this.morphPartIt.next();
+            }
+        }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
+            // NOTHING
+        }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
+            // NOTHING
+        }else{
+            assert false;
+            throw new AssertionError();
+        }
+
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param stage {@inheritDoc}
+     */
+    @Override
+    public void loopEnd(ParseStage stage){
+        if(stage == PmdMorphHandler.MORPH_LIST){
+            // NOTHING
+        }else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
+            // NOTHING
+        }else if(stage == PmdMorphHandler.MORPHORDER_LIST){
+            // NOTHING
+        }else{
+            assert false;
+            throw new AssertionError();
+        }
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param morphName {@inheritDoc}
+     * @param morphType {@inheritDoc}
+     */
+    @Override
+    public void pmdMorphInfo(String morphName, byte morphType){
+        this.currentMorphPart.getMorphName().setPrimaryText(morphName);
+        MorphType type = MorphType.decode(morphType);
+        this.currentMorphPart.setMorphType(type);
+
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param serialId {@inheritDoc}
+     * @param xPos {@inheritDoc}
+     * @param yPos {@inheritDoc}
+     * @param zPos {@inheritDoc}
+     */
+    @Override
+    public void pmdMorphVertexInfo(int serialId,
+                                   float xPos, float yPos, float zPos){
+        MorphVertex morphVertex;
+        morphVertex = new MorphVertex();
+        MkPos3D position = morphVertex.getOffset();
+        position.setXpos(xPos);
+        position.setYpos(yPos);
+        position.setZpos(zPos);
+
+        Vertex vertex;
+        if(this.currentMorphPart.getMorphType().isBase()){
+            vertex = this.vertexList.get(serialId);
+            this.morphVertexList.add(vertex);
+        }else{
+            vertex = this.morphVertexList.get(serialId);
+        }
+        morphVertex.setBaseVertex(vertex);
+
+        this.currentMorphPart.getMorphVertexList().add(morphVertex);
+
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @param morphId {@inheritDoc}
+     */
+    @Override
+    public void pmdMorphOrderInfo(int morphId){
+        MorphPart part = this.morphPartList.get(morphId);
+        MorphType type = part.getMorphType();
+
+        List<MorphPart> partList = this.morphMap.get(type);
+        if(partList == null){
+            partList = new LinkedList<MorphPart>();
+            this.morphMap.put(type, partList);
+        }
+        partList.add(part);
+
+        return;
+    }
+
+}