OSDN Git Service

119bd46f9acc331de28265e955c629ab923531b7
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / pmd / Vertex.java
1 /*\r
2  * vertex information\r
3  *\r
4  * License : The MIT License\r
5  * Copyright(c) 2010 MikuToga Partners\r
6  */\r
7 \r
8 package jp.sourceforge.mikutoga.pmd;\r
9 \r
10 import jp.sourceforge.mikutoga.corelib.SerialNumbered;\r
11 \r
12 /**\r
13  * 頂点情報。\r
14  */\r
15 public class Vertex implements SerialNumbered {\r
16 \r
17     private static final int MIN_WEIGHT = 0;\r
18     private static final int MAX_WEIGHT = 100;\r
19 \r
20     private final Pos3d position = new Pos3d();\r
21     private final Vec3d normal = new Vec3d();\r
22 \r
23     private final Pos2d uvPosition = new Pos2d();\r
24 \r
25     private BoneInfo boneA = null;\r
26     private BoneInfo boneB = null;\r
27 \r
28     private int boneWeight = 50;\r
29 \r
30     private boolean edgeAppearance = true;\r
31 \r
32     private int serialNo = -1;\r
33 \r
34     /**\r
35      * コンストラクタ。\r
36      */\r
37     public Vertex(){\r
38         super();\r
39         return;\r
40     }\r
41 \r
42     /**\r
43      * 頂点位置座標を返す。\r
44      * @return 頂点の位置座標\r
45      */\r
46     public Pos3d getPosition(){\r
47         return this.position;\r
48     }\r
49 \r
50     /**\r
51      * 法線ベクトルを返す。\r
52      * @return 法線ベクトル\r
53      */\r
54     public Vec3d getNormal(){\r
55         return this.normal;\r
56     }\r
57 \r
58     /**\r
59      * UVマップ座標を返す。\r
60      * @return UVマップ情報\r
61      */\r
62     public Pos2d getUVPosition(){\r
63         return this.uvPosition;\r
64     }\r
65 \r
66     /**\r
67      * 頂点の属するボーンを設定する。\r
68      * @param boneA ボーンA\r
69      * @param boneB ボーンB\r
70      * @throws NullPointerException 引数がnull\r
71      */\r
72     public void setBonePair(BoneInfo boneA, BoneInfo boneB)\r
73             throws NullPointerException{\r
74         if(boneA == null || boneB == null) throw new NullPointerException();\r
75         this.boneA = boneA;\r
76         this.boneB = boneB;\r
77         return;\r
78     }\r
79 \r
80     /**\r
81      * ボーンAを返す。\r
82      * @return ボーンA\r
83      */\r
84     public BoneInfo getBoneA(){\r
85         return this.boneA;\r
86     }\r
87 \r
88     /**\r
89      * ボーンBを返す。\r
90      * @return ボーンB\r
91      */\r
92     public BoneInfo getBoneB(){\r
93         return this.boneB;\r
94     }\r
95 \r
96     /**\r
97      * ボーンAのウェイト値を設定する。\r
98      * @param weight ウェイト値。0(影響小)-100(影響大)\r
99      * @throws IllegalArgumentException ウェイト値が範囲外\r
100      */\r
101     public void setWeightA(int weight) throws IllegalArgumentException{\r
102         if(   weight < MIN_WEIGHT\r
103            || MAX_WEIGHT < weight ){\r
104             throw new IllegalArgumentException();\r
105         }\r
106         this.boneWeight = weight;\r
107         return;\r
108     }\r
109 \r
110     /**\r
111      * ボーンBのウェイト値を設定する。\r
112      * @param weight ウェイト値。0(影響小)-100(影響大)\r
113      * @throws IllegalArgumentException ウェイト値が範囲外\r
114      */\r
115     public void setWeightB(int weight) throws IllegalArgumentException{\r
116         setWeightA(MAX_WEIGHT - weight);\r
117         return;\r
118     }\r
119 \r
120     /**\r
121      * ボーンAのウェイト値を返す。\r
122      * @return ウェイト値\r
123      */\r
124     public int getWeightA(){\r
125         return this.boneWeight;\r
126     }\r
127 \r
128     /**\r
129      * ボーンBのウェイト値を返す。\r
130      * @return ウェイト値\r
131      */\r
132     public int getWeightB(){\r
133         int result = MAX_WEIGHT - this.boneWeight;\r
134         return result;\r
135     }\r
136 \r
137     /**\r
138      * ボーンAのウェイト率を返す。\r
139      * @return ウェイト率。0.0(影響小)-1.0(影響大)\r
140      */\r
141     public float getWeightRatioA(){\r
142         return ((float)this.boneWeight) / (float)MAX_WEIGHT;\r
143     }\r
144 \r
145     /**\r
146      * ボーンBのウェイト率を返す。\r
147      * @return ウェイト率。0.0(影響小)-1.0(影響大)\r
148      */\r
149     public float getWeightRatioB(){\r
150         return ((float)MAX_WEIGHT - (float)this.boneWeight)\r
151                 / (float)MAX_WEIGHT;\r
152     }\r
153 \r
154     /**\r
155      * エッジを表示するか設定する。\r
156      * マテリアル材質単位の設定より優先度は高い。\r
157      * @param show 表示するならtrue\r
158      */\r
159     public void setEdgeAppearance(boolean show){\r
160         this.edgeAppearance = show;\r
161         return;\r
162     }\r
163 \r
164     /**\r
165      * エッジを表示するか判定する。\r
166      * マテリアル材質単位の設定より優先度は高い。\r
167      * @return 表示するならtrue\r
168      */\r
169     public boolean getEdgeAppearance(){\r
170         return this.edgeAppearance;\r
171     }\r
172 \r
173     /**\r
174      * {@inheritDoc}\r
175      * @param num {@inheritDoc}\r
176      */\r
177     public void setSerialNumber(int num){\r
178         this.serialNo = num;\r
179         return;\r
180     }\r
181 \r
182     /**\r
183      * {@inheritDoc}\r
184      * @return {@inheritDoc}\r
185      */\r
186     public int getSerialNumber(){\r
187         return this.serialNo;\r
188     }\r
189 \r
190     /**\r
191      * {@inheritDoc}\r
192      * @return {@inheritDoc}\r
193      */\r
194     @Override\r
195     public String toString(){\r
196         StringBuilder result = new StringBuilder();\r
197 \r
198         result.append("Vertex(").append(this.serialNo).append(") ");\r
199         result.append(this.position).append(' ');\r
200         result.append(this.normal).append(' ');\r
201         result.append("UV").append(this.uvPosition).append(' ');\r
202 \r
203         result.append("[")\r
204               .append(this.boneA.getBoneName())\r
205               .append("<>")\r
206               .append(this.boneB.getBoneName())\r
207               .append("] ");\r
208 \r
209         result.append("weight=").append(this.boneWeight).append(' ');\r
210 \r
211         if(this.edgeAppearance) result.append("showEdge");\r
212         else                    result.append("hideEdge");\r
213 \r
214         return result.toString();\r
215     }\r
216 \r
217 }\r