OSDN Git Service

Add GeometryOptimizer
[mikumikustudio/MikuMikuStudio.git] / src / projectkyoto / mmd / file / util2 / SkinMeshData.java
1 /*
2  * Copyright (c) 2011 Kazuhiko Kobayashi
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  *   notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  *   notice, this list of conditions and the following disclaimer in the
14  *   documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of 'MMDLoaderJME' nor the names of its contributors
17  *   may be used to endorse or promote products derived from this software
18  *   without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32
33 package projectkyoto.mmd.file.util2;
34
35 import java.io.Serializable;
36 import java.util.ArrayList;
37 import java.util.HashMap;
38 import java.util.List;
39 import java.util.Map;
40 import projectkyoto.mmd.file.PMDMaterial;
41 import projectkyoto.mmd.file.PMDModel;
42 import projectkyoto.mmd.file.PMDSkinData;
43 import projectkyoto.mmd.file.PMDVertex;
44
45 /**
46  *
47  * @author kobayasi
48  */
49 public class SkinMeshData implements Serializable{
50
51     PMDModel model;
52     List<Integer> boneList = new ArrayList<Integer>();
53     List<PMDVertex> vertexList = new ArrayList<PMDVertex>();
54     Map<PMDMaterial, List<Integer>> indexMap = new HashMap<PMDMaterial, List<Integer>>();
55
56     public SkinMeshData(MeshConverter mc, PMDModel model) {
57         this.model = model;
58         for(PMDSkinData sd : model.getSkinData()) {
59             if (sd.getSkinType() == 0) {
60                 for(int i=0;i<sd.getSkinVertCount();i++) {
61                     PMDVertex v = model.getVertex(sd.getSkinVertData()[i].getSkinVertIndex());
62                     vertexList.add(v);
63                     mc.skinTmpVertMap.put(sd.getSkinVertData()[i].getSkinVertIndex(), i);
64                 }
65             }
66         }
67     }
68
69     public void addTriangle(MeshConverter mc, PMDMaterial material, int i1, int i2, int i3) {
70         addBoneList(i1);
71         addBoneList(i2);
72         addBoneList(i3);
73         List<Integer> indexList = indexMap.get(material);
74         if (indexList == null) {
75             indexList = new ArrayList<Integer>();
76             indexMap.put(material, indexList);
77         }
78         addVertex(mc, indexList,i1);
79         addVertex(mc, indexList,i2);
80         addVertex(mc, indexList,i3);
81     }
82
83     private void addBoneList(int vertIndex) {
84         PMDVertex v = model.getVertex(vertIndex);
85         if (!boneList.contains(v.getBoneNum1())) {
86             boneList.add(v.getBoneNum1());
87         }
88         if (!boneList.contains(v.getBoneNum2())) {
89             boneList.add(v.getBoneNum2());
90         }
91     }
92
93     private void addVertex(MeshConverter mc, List<Integer>indexList, int vertIndex) {
94         PMDVertex v = model.getVertex(vertIndex);
95         Integer index = mc.skinTmpVertMap.get(vertIndex);
96         int newVertIndex;
97         if (index != null /*vertexList.contains(v)*/) {
98             newVertIndex = index.intValue(); //vertexList.indexOf(v);
99         } else {
100             newVertIndex = vertexList.size();
101             vertexList.add(v);
102             mc.skinTmpVertMap.put(vertIndex, newVertIndex);
103             index = newVertIndex;
104         }
105         indexList.add(index/*newVertIndex*/);
106     }
107
108     public List<Integer> getBoneList() {
109         return boneList;
110     }
111
112     public void setBoneList(List<Integer> boneList) {
113         this.boneList = boneList;
114     }
115
116
117     public PMDModel getModel() {
118         return model;
119     }
120
121     public void setModel(PMDModel model) {
122         this.model = model;
123     }
124
125     public List<PMDVertex> getVertexList() {
126         return vertexList;
127     }
128
129     public void setVertexList(List<PMDVertex> vertexList) {
130         this.vertexList = vertexList;
131     }
132
133     public Map<PMDMaterial, List<Integer>> getIndexMap() {
134         return indexMap;
135     }
136
137     public void setIndexMap(Map<PMDMaterial, List<Integer>> indexMap) {
138         this.indexMap = indexMap;
139     }
140 }