private int serialNo = -1;
+
/**
* コンストラクタ。
*/
return;
}
+
/**
* ボーングループ名を返す。
* @return ボーングループ名
*/
public class BoneInfo implements SerialNumbered {
+ private static final String NO_BONE = "NONE";
+
private final I18nText boneName = new I18nText();
private BoneType boneType;
private int rotationRatio;
- private int serialNo = -1;
+ private int boneSerialNo = -1;
+
/**
* コンストラクタ。
return;
}
+
/**
* ボーン名を返す。
* @return ボーン名
*/
@Override
public void setSerialNumber(int num){
- this.serialNo = num;
+ this.boneSerialNo = num;
return;
}
*/
@Override
public int getSerialNumber(){
- return this.serialNo;
+ return this.boneSerialNo;
}
/**
StringBuilder result = new StringBuilder();
result.append("Bone")
- .append(this.serialNo)
+ .append(this.boneSerialNo)
.append("(")
.append(this.boneName.getPrimaryText())
.append(")");
result.append(" prev=");
if(this.prevBone != null) result.append(this.prevBone.getBoneName());
- else result.append("NONE");
+ else result.append(NO_BONE);
result.append(" next=");
if(this.nextBone != null) result.append(this.nextBone.getBoneName());
- else result.append("NONE");
+ else result.append(NO_BONE);
if(this.boneType == BoneType.LINKEDROT){
result.append(" rotraio=").append(this.rotationRatio);
if(this.srcBone != null){
result.append(this.srcBone.getBoneName());
}else{
- result.append("NONE");
+ result.append(NO_BONE);
}
}
/** 摩擦力。 */
private float friction;
+
/**
* コンストラクタ。
*/
return;
}
+
/**
* 質量を返す。
* @return 質量
@Override
public String toString(){
StringBuilder result = new StringBuilder();
+ final String delim = ", ";
- result.append("mass=").append(this.mass).append(", ");
- result.append("damping(Pos)=").append(this.dampingPos).append(", ");
- result.append("damping(Rot)=").append(this.dampingRot).append(", ");
- result.append("restitution=").append(this.restitution).append(", ");
+ result.append("mass=").append(this.mass).append(delim);
+ result.append("damping(Pos)=").append(this.dampingPos).append(delim);
+ result.append("damping(Rot)=").append(this.dampingRot).append(delim);
+ result.append("restitution=").append(this.restitution).append(delim);
result.append("friction=").append(this.friction);
return result.toString();
private final List<BoneInfo> chainList = new ArrayList<BoneInfo>();
+
/**
* コンストラクタ。
*/
return;
}
+
/**
* IKボーンを設定する。
* @param bone IKボーン
private final TripletRange posRange = new TripletRange();
private final TripletRange rotRange = new TripletRange();
+
/**
* コンストラクタ。
*/
return;
}
+
/**
* ジョイント名を返す。
* @return ジョイント名
/**
* 連結する剛体を設定する。
- * @param rigidA 連結剛体A
- * @param rigidB 連結剛体B
+ * @param rigidAArg 連結剛体A
+ * @param rigidBArg 連結剛体B
*/
- public void setRigidPair(RigidInfo rigidA, RigidInfo rigidB){
- this.rigidA = rigidA;
- this.rigidB = rigidB;
+ public void setRigidPair(RigidInfo rigidAArg, RigidInfo rigidBArg){
+ this.rigidA = rigidAArg;
+ this.rigidB = rigidBArg;
return;
}
throw new AssertionError();
}
+
/**
* リストの出現順にシリアルナンバーを割り振る。
* シリアルナンバー先頭は0。
*/
public class Material implements Iterable<Surface> {
+ // sRGBカラー情報配列インデックス
+ private static final int IDX_RED = 0;
+ private static final int IDX_GREEN = 1;
+ private static final int IDX_BLUE = 2;
+ private static final int IDX_ALPHA = 3;
+
+
private final I18nText materialName = new I18nText();
private Color diffuseColor;
private final List<Surface> surfaceList = new ArrayList<Surface>();
+
/**
* コンストラクタ。
*/
return;
}
+
/**
* 色を不透明化する。
* @param color 色
return color;
}
- float[] rgba = new float[4];
- color.getRGBColorComponents(rgba);
+ float[] rgba = null;
+ rgba = color.getRGBColorComponents(rgba);
- Color result = new Color(rgba[0], rgba[1], rgba[2], 1.0f);
+ Color result = new Color(rgba[IDX_RED],
+ rgba[IDX_GREEN],
+ rgba[IDX_BLUE],
+ 1.0f );
return result;
}
+
/**
* マテリアル名を返す。
* PMDEditorのみでのサポート?
@Override
public String toString(){
StringBuilder result = new StringBuilder();
+ final String delim = ", ";
result.append("Material ");
- float[] rgba = new float[4];
+ float[] rgba = null;
- this.diffuseColor.getRGBComponents(rgba);
+ rgba = this.diffuseColor.getRGBComponents(rgba);
result.append("diffuse=[")
- .append(rgba[0]).append(", ")
- .append(rgba[1]).append(", ")
- .append(rgba[2]).append(", ")
- .append(rgba[3]).append(']')
+ .append(rgba[IDX_RED]).append(delim)
+ .append(rgba[IDX_GREEN]).append(delim)
+ .append(rgba[IDX_BLUE]).append(delim)
+ .append(rgba[IDX_ALPHA]).append(']')
.append(' ');
this.specularColor.getRGBComponents(rgba);
result.append("specular=[")
- .append(rgba[0]).append(", ")
- .append(rgba[1]).append(", ")
- .append(rgba[2]).append(", ")
- .append(rgba[3]).append(']')
+ .append(rgba[IDX_RED]).append(delim)
+ .append(rgba[IDX_GREEN]).append(delim)
+ .append(rgba[IDX_BLUE]).append(delim)
+ .append(rgba[IDX_ALPHA]).append(']')
.append(' ');
this.ambientColor.getRGBComponents(rgba);
result.append("ambient=[")
- .append(rgba[0]).append(", ")
- .append(rgba[1]).append(", ")
- .append(rgba[2]).append(", ")
- .append(rgba[3]).append(']')
+ .append(rgba[IDX_RED]).append(delim)
+ .append(rgba[IDX_GREEN]).append(delim)
+ .append(rgba[IDX_BLUE]).append(delim)
+ .append(rgba[IDX_ALPHA]).append(']')
.append(' ');
result.append("shininess=")
private final List<MorphVertex> morphVertexList =
new ArrayList<MorphVertex>();
- private int serialNo = -1;
+ private int morphSerialNo = -1;
+
/**
* コンストラクタ。
return;
}
+
/**
* モーフ名を返す。
* @return モーフ名
*/
@Override
public void setSerialNumber(int num){
- this.serialNo = num;
+ this.morphSerialNo = num;
return;
}
*/
@Override
public int getSerialNumber(){
- return this.serialNo;
+ return this.morphSerialNo;
}
@Override
public static final Comparator<MorphVertex> VIDCOMPARATOR =
new VertexIdComparator();
- private Vertex baseVertex;
+ private Vertex baseVertex = null;
private final MkPos3D offset = new MkPos3D();
- private int serialNo = -1;
+ private int morphVertexSerialNo = -1;
+
/**
* コンストラクタ。
return;
}
+
/**
* 移動元頂点情報を返す。
* @return 移動元頂点
*/
@Override
public void setSerialNumber(int num){
- this.serialNo = num;
+ this.morphVertexSerialNo = num;
return;
}
*/
@Override
public int getSerialNumber(){
- return this.serialNo;
+ return this.morphVertexSerialNo;
}
/**
return result.toString();
}
+
/**
* 頂点IDによる比較子Comparator。
*/
+ @SuppressWarnings("serial")
private static final class VertexIdComparator
implements Comparator<MorphVertex> {
/**
* コンストラクタ。
*/
- private VertexIdComparator(){
+ VertexIdComparator(){
super();
return;
}
private ToonMap toonMap = new ToonMap();
+
/**
* コンストラクタ。
*/
return;
}
+
/**
* モデル名を返す。
* @return モデル名
if(bone.getBoneName().hasGlobalText()) return true;
}
- List<MorphType> typeList = new ArrayList<MorphType>();
- typeList.addAll(this.morphMap.keySet());
- for(MorphType type : typeList){
- List<MorphPart> partList = this.morphMap.get(type);
+ for(List<MorphPart> partList : this.morphMap.values()){
for(MorphPart part : partList){
if(part.getMorphName().hasGlobalText()) return true;
}
}
/**
+ * 全モーフが使う全モーフ頂点の出現順リストを返す。
+ * モーフ種別毎に固まっている事が保証される。
+ * @return モーフ頂点リスト
+ */
+ private List<MorphVertex> getAllMorphVertexList(){
+ List<MorphVertex> allList = new ArrayList<MorphVertex>();
+
+ for(MorphType type : this.morphMap.keySet()){
+ if(type.isBase()) continue;
+
+ List<MorphPart> partList = this.morphMap.get(type);
+ if(partList == null) continue;
+
+ for(MorphPart part : partList){
+ List<MorphVertex> morphVertexList =
+ part.getMorphVertexList();
+ allList.addAll(morphVertexList);
+ }
+ }
+
+ return allList;
+ }
+
+ /**
+ * 重複する頂点参照を除いたモーフ頂点リストを返す。
+ * @param allList モーフ頂点リスト
+ * @return 重複が除かれたモーフ頂点リスト
+ */
+ private List<MorphVertex> getUniqueMorphVertexList(
+ List<MorphVertex> allList ){
+ List<MorphVertex> result = new ArrayList<MorphVertex>();
+
+ Set<Vertex> mergedVertexSet = new HashSet<Vertex>();
+
+ for(MorphVertex morphVertex : allList){
+ Vertex vertex = morphVertex.getBaseVertex();
+
+ if(mergedVertexSet.contains(vertex)) continue;
+
+ mergedVertexSet.add(vertex);
+ result.add(morphVertex);
+ }
+
+ return result;
+ }
+
+ /**
* モーフで使われる全てのモーフ頂点のリストを返す。
* モーフ間で重複する頂点はマージされる。
* 頂点IDでソートされる。
* @return モーフに使われるモーフ頂点のリスト
*/
public List<MorphVertex> mergeMorphVertex(){
- List<MorphVertex> result = new ArrayList<MorphVertex>();
+ List<MorphVertex> result;
- Set<Vertex> mergedVertexSet = new HashSet<Vertex>();
- for(MorphType type : this.morphMap.keySet()){
- if(type.isBase()) continue;
- List<MorphPart> partList = this.morphMap.get(type);
- if(partList == null) continue;
- for(MorphPart part : partList){
- for(MorphVertex morphVertex : part){
- Vertex vertex = morphVertex.getBaseVertex();
- if(mergedVertexSet.contains(vertex)) continue;
- mergedVertexSet.add(vertex);
- result.add(morphVertex);
- }
- }
- }
+ List<MorphVertex> allList = getAllMorphVertexList();
+ result = getUniqueMorphVertexList(allList);
Collections.sort(result, MorphVertex.VIDCOMPARATOR);
- for(int idx = 0; idx < result.size(); idx++){
- MorphVertex morphVertex = result.get(idx);
- morphVertex.setSerialNumber(idx);
- }
+ ListUtil.assignIndexedSerial(result);
Map<Vertex, MorphVertex> numberedMap =
new HashMap<Vertex, MorphVertex>();
for(MorphVertex morphVertex : result){
- numberedMap.put(morphVertex.getBaseVertex(), morphVertex);
+ Vertex vertex = morphVertex.getBaseVertex();
+ numberedMap.put(vertex, morphVertex);
}
- for(MorphType type : this.morphMap.keySet()){
- if(type.isBase()) continue;
- List<MorphPart> partList = this.morphMap.get(type);
- if(partList == null) continue;
- for(MorphPart part : partList){
- for(MorphVertex morphVertex : part){
- Vertex vertex = morphVertex.getBaseVertex();
- MorphVertex numbered = numberedMap.get(vertex);
- assert numbered != null;
- morphVertex.setSerialNumber(numbered.getSerialNumber());
- }
- }
+ for(MorphVertex morphVertex : allList){
+ Vertex vertex = morphVertex.getBaseVertex();
+
+ MorphVertex numbered = numberedMap.get(vertex);
+ assert numbered != null;
+
+ int serialNo = numbered.getSerialNumber();
+ morphVertex.setSerialNumber(serialNo);
}
return result;
*/
public class RigidGroup implements SerialNumbered, Iterable<RigidInfo> {
+ /** 剛体グループ総数。 */
public static final int MAX_RIGID_GROUP = 16;
private final List<RigidInfo> rigidList = new ArrayList<RigidInfo>();
- private int serialNo = -1;
+ private int rigidGroupSerialNo = -1;
+
/**
* コンストラクタ。
return;
}
+
/**
* 所属する剛体のリストを返す。
* @return 剛体リスト
*/
@Override
public void setSerialNumber(int num){
- this.serialNo = num;
+ this.rigidGroupSerialNo = num;
return;
}
*/
@Override
public int getSerialNumber(){
- return this.serialNo;
+ return this.rigidGroupSerialNo;
}
/**
* @return グループ番号
*/
public int getGroupNumber(){
- return this.serialNo + 1;
+ return this.rigidGroupSerialNo + 1;
}
/**
private RigidGroup rigidGroup;
- private int serialNo = -1;
+ private int rigidSerialNo = -1;
+
/**
* コンストラクタ。
return;
}
+
/**
* 剛体名を返す。
* @return 剛体名
*/
@Override
public void setSerialNumber(int num){
- this.serialNo = num;
+ this.rigidSerialNo = num;
return;
}
*/
@Override
public int getSerialNumber(){
- return this.serialNo;
+ return this.rigidSerialNo;
}
/**
*/
public class RigidShape {
+ private static final float DEF_DIM = 0.1f;
+
private RigidShapeType type = RigidShapeType.BOX;
- private float width = 0.1f;
- private float height = 0.1f;
- private float depth = 0.1f;
+
+ private float width = DEF_DIM;
+ private float height = DEF_DIM;
+ private float depth = DEF_DIM;
+
/**
* コンストラクタ。
return;
}
+
/**
* 剛体形状種別を返す。
* @return 剛体形状種別
/** 昇順での比較子。 */
Comparator<SerialNumbered> COMPARATOR = new SerialComparator();
+
/**
* 通し番号を設定する。
* @param num 通し番号
*/
int getSerialNumber();
+
/**
* 通し番号による比較子Comparator。
* 通し番号の昇順を定義づける。
*/
+ @SuppressWarnings("serial")
class SerialComparator
implements Comparator<SerialNumbered> {
return;
}
+
/**
* {@inheritDoc}
* @param o1 {@inheritDoc}
private String textureFileName = null;
private String spheremapFileName = null;
+
/**
* コンストラクタ。
*/
return;
}
+
/**
* トゥーンマップを設定する。
* @param map トゥーンマップ
* @return 有効ならtrue
*/
public boolean isValidToonIndex(){
- if(0 <= this.toonIdx && this.toonIdx <= 9) return true;
- return false;
+ boolean result;
+ result = (0 <= this.toonIdx)
+ && (this.toonIdx < ToonMap.MAX_CUSTOM_TOON);
+ return result;
}
/**
*/
public class Surface implements SerialNumbered, Iterable<Vertex> {
+ private static final int TRIANGLE = 3;
+
+
private Vertex vertex1;
private Vertex vertex2;
private Vertex vertex3;
- private int serialNo = -1;
+ private int surfaceSerialNo = -1;
+
/**
* コンストラクタ。
return;
}
+
/**
* 3頂点を設定する。
- * @param vertex1 頂点1
- * @param vertex2 頂点2
- * @param vertex3 頂点3
+ * @param vtx1 頂点1
+ * @param vtx2 頂点2
+ * @param vtx3 頂点3
* @throws IllegalArgumentException 重複する頂点が引数に含まれた
*/
- public void setTriangle(Vertex vertex1, Vertex vertex2, Vertex vertex3)
+ public void setTriangle(Vertex vtx1, Vertex vtx2, Vertex vtx3)
throws IllegalArgumentException{
- if(vertex1 != null && (vertex1 == vertex2 || vertex1 == vertex3)){
+ if(vtx1 != null && (vtx1 == vtx2 || vtx1 == vtx3)){
throw new IllegalArgumentException();
}
- if(vertex2 != null && vertex2 == vertex3){
+ if(vtx2 != null && vtx2 == vtx3){
throw new IllegalArgumentException();
}
- this.vertex1 = vertex1;
- this.vertex2 = vertex2;
- this.vertex3 = vertex3;
+ this.vertex1 = vtx1;
+ this.vertex2 = vtx2;
+ this.vertex3 = vtx3;
return;
}
*/
public Vertex[] getTriangle(Vertex[] store){
Vertex[] result;
- if(store == null || store.length < 3){
- result = new Vertex[3];
- }else{
+ if(store != null && store.length >= TRIANGLE){
result = store;
+ }else{
+ result = new Vertex[TRIANGLE];
}
result[0] = this.vertex1;
*/
@Override
public Iterator<Vertex> iterator(){
- List<Vertex> list = new ArrayList<Vertex>(3);
+ List<Vertex> list = new ArrayList<Vertex>(TRIANGLE);
list.add(this.vertex1);
list.add(this.vertex2);
* @return 3頂点とも非nullが設定されていればtrue
*/
public boolean isCompleted(){
- if( this.vertex1 != null
- && this.vertex2 != null
- && this.vertex3 != null ){
- return true;
- }
- return false;
+ boolean result;
+ result = this.vertex1 != null
+ && this.vertex2 != null
+ && this.vertex3 != null;
+ return result;
}
/**
*/
@Override
public void setSerialNumber(int num){
- this.serialNo = num;
+ this.surfaceSerialNo = num;
return;
}
*/
@Override
public int getSerialNumber(){
- return this.serialNo;
+ return this.surfaceSerialNo;
}
/**
*/
public class ToonMap {
+ /** カスタムトゥーンファイルの総数。 */
public static final int MAX_CUSTOM_TOON = 10;
+
private static final Map<Integer, String> DEF_TOONMAP;
+ private static final int IDX_SP = 0xff; // 特殊トゥーンのインデックス
+
static{
Map<Integer, String> map = new TreeMap<Integer, String>();
- map.put(0x00, "toon01.bmp");
- map.put(0x01, "toon02.bmp");
- map.put(0x02, "toon03.bmp");
- map.put(0x03, "toon04.bmp");
- map.put(0x04, "toon05.bmp");
- map.put(0x05, "toon06.bmp");
- map.put(0x06, "toon07.bmp");
- map.put(0x07, "toon08.bmp");
- map.put(0x08, "toon09.bmp");
- map.put(0x09, "toon10.bmp");
- map.put(0xff, "toon0.bmp");
+ int idx = 0x00;
+ map.put(idx++, "toon01.bmp");
+ map.put(idx++, "toon02.bmp");
+ map.put(idx++, "toon03.bmp");
+ map.put(idx++, "toon04.bmp");
+ map.put(idx++, "toon05.bmp");
+ map.put(idx++, "toon06.bmp");
+ map.put(idx++, "toon07.bmp");
+ map.put(idx++, "toon08.bmp");
+ map.put(idx++, "toon09.bmp");
+ map.put(idx++, "toon10.bmp");
+ map.put(IDX_SP, "toon0.bmp");
+
+ assert idx == MAX_CUSTOM_TOON;
DEF_TOONMAP = Collections.unmodifiableMap(map);
assert DEF_TOONMAP.size() == MAX_CUSTOM_TOON + 1;
}
- private final Map<Integer, String> toonMap =
+
+ private final Map<Integer, String> toonDefMap =
new TreeMap<Integer, String>(DEF_TOONMAP);
+
/**
* コンストラクタ。
*/
return;
}
+
/**
* 指定したインデックス値に対応したトゥーンファイル名を返す。
* @param idx インデックス値
* @return トゥーンファイル名。該当するものがなければnull
*/
public String getIndexedToon(int idx){
- String result = this.toonMap.get(idx);
+ String result = this.toonDefMap.get(idx);
return result;
}
public void setIndexedToon(int idx, String toonFileName)
throws NullPointerException{
if(toonFileName == null) throw new NullPointerException();
- this.toonMap.put(idx, toonFileName);
+ this.toonDefMap.put(idx, toonFileName);
return;
}
* @return 等しければtrue
*/
public boolean isDefaultMap(){
- boolean result = this.toonMap.equals(DEF_TOONMAP);
+ boolean result = this.toonDefMap.equals(DEF_TOONMAP);
return result;
}
* @return デフォルトと等しければtrue。
*/
public boolean isDefaultToon(int idx){
- String thisToon = this.toonMap.get(idx);
+ String thisToon = this.toonDefMap.get(idx);
if(thisToon == null) return false;
String defToon = DEF_TOONMAP.get(idx);
* このトゥーンファイル構成をデフォルト構成内容でリセットする。
*/
public void resetDefaultMap(){
- this.toonMap.clear();
- this.toonMap.putAll(DEF_TOONMAP);
+ this.toonDefMap.clear();
+ this.toonDefMap.putAll(DEF_TOONMAP);
return;
}
*/
public void resetIndexedToon(int idx){
String toonFile = DEF_TOONMAP.get(idx);
- this.toonMap.put(idx, toonFile);
+ this.toonDefMap.put(idx, toonFile);
return;
}
StringBuilder result = new StringBuilder();
boolean dumped = false;
- for(Map.Entry<Integer, String> entry : this.toonMap.entrySet()){
+ for(Map.Entry<Integer, String> entry : this.toonDefMap.entrySet()){
Integer idx = entry.getKey();
String toonFile = entry.getValue();
private static final int MIN_WEIGHT = 0;
private static final int MAX_WEIGHT = 100;
+ private static final int BALANCED = 50;
+
private final MkPos3D position = new MkPos3D();
private final MkVec3D normal = new MkVec3D();
private BoneInfo boneA = null;
private BoneInfo boneB = null;
- private int boneWeight = 50;
+ private int boneWeight = BALANCED;
private boolean edgeAppearance = true;
- private int serialNo = -1;
+ private int vertexSerialNo = -1;
+
/**
* コンストラクタ。
return;
}
+
/**
* 頂点位置座標を返す。
* @return 頂点の位置座標
/**
* 頂点の属するボーンを設定する。
- * @param boneA ボーンA
- * @param boneB ボーンB
+ * @param boneAArg ボーンA
+ * @param boneBArg ボーンB
* @throws NullPointerException 引数がnull
*/
- public void setBonePair(BoneInfo boneA, BoneInfo boneB)
+ public void setBonePair(BoneInfo boneAArg, BoneInfo boneBArg)
throws NullPointerException{
- if(boneA == null || boneB == null) throw new NullPointerException();
- this.boneA = boneA;
- this.boneB = boneB;
+ if(boneAArg == null || boneBArg == null)
+ throw new NullPointerException();
+
+ this.boneA = boneAArg;
+ this.boneB = boneBArg;
+
return;
}
*/
@Override
public void setSerialNumber(int num){
- this.serialNo = num;
+ this.vertexSerialNo = num;
return;
}
*/
@Override
public int getSerialNumber(){
- return this.serialNo;
+ return this.vertexSerialNo;
}
/**
public String toString(){
StringBuilder result = new StringBuilder();
- result.append("Vertex(").append(this.serialNo).append(") ");
+ result.append("Vertex(").append(this.vertexSerialNo).append(") ");
result.append(this.position).append(' ');
result.append(this.normal).append(' ');
result.append("UV").append(this.uvPosition).append(' ');
this.currentIkChain = this.ikChainIt.next();
}
}else if(stage == PmdBoneHandler.IKCHAIN_LIST){
- //NOTHING
+ assert true; // NOTHING
}else if(stage == PmdBoneHandler.BONEGROUP_LIST){
ListUtil.prepareDefConsList(this.boneGroupList,
BoneGroup.class,
this.currentBoneGroup = this.boneGroupIt.next();
}
}else if(stage == PmdBoneHandler.GROUPEDBONE_LIST){
- //NOTHING
+ assert true; // NOTHING
}else{
assert false;
throw new AssertionError();
this.currentIkChain = this.ikChainIt.next();
}
}else if(stage == PmdBoneHandler.IKCHAIN_LIST){
- //NOTHING
+ assert true; // NOTHING
}else if(stage == PmdBoneHandler.BONEGROUP_LIST){
if(this.boneGroupIt.hasNext()){
this.currentBoneGroup = this.boneGroupIt.next();
}
}else if(stage == PmdBoneHandler.GROUPEDBONE_LIST){
- //NOTHING
+ assert true; // NOTHING
}else{
assert false;
throw new AssertionError();
@Override
public void loopEnd(ParseStage stage){
if(stage == PmdBoneHandler.BONE_LIST){
- //NOTHING
+ assert true; // NOTHING
}else if(stage == PmdBoneHandler.IK_LIST){
- //NOTHING
+ assert true; // NOTHING
}else if(stage == PmdBoneHandler.IKCHAIN_LIST){
- //NOTHING
+ assert true; // NOTHING
}else if(stage == PmdBoneHandler.BONEGROUP_LIST){
- //NOTHING
+ assert true; // NOTHING
}else if(stage == PmdBoneHandler.GROUPEDBONE_LIST){
pickOrphanBone();
}else{
*/
class MaterialBuilder implements PmdMaterialHandler {
+ private static final int TRIANGLE = 3;
+
+
private final List<Material> materialList;
private Iterator<Material> materialIt;
private Material currentMaterial = null;
private final ToonMap toonMap;
+
/**
* コンストラクタ。
* @param model モデル
return;
}
+
/**
* {@inheritDoc}
* @param stage {@inheritDoc}
List<Surface> list = this.currentMaterial.getSurfaceList();
- int surfaceNum = vertexNum / 3;
+ int surfaceNum = vertexNum / TRIANGLE;
for(int ct = 1; ct <= surfaceNum; ct++){
Surface surface = this.surfaceIt.next();
list.add(surface);
this.currentMorphPart = this.morphPartIt.next();
}
}else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
- // NOTHING
+ assert true; // NOTHING
}else if(stage == PmdMorphHandler.MORPHORDER_LIST){
- // NOTHING
+ assert true; // NOTHING
}else{
assert false;
throw new AssertionError();
this.currentMorphPart = this.morphPartIt.next();
}
}else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
- // NOTHING
+ assert true; // NOTHING
}else if(stage == PmdMorphHandler.MORPHORDER_LIST){
- // NOTHING
+ assert true; // NOTHING
}else{
assert false;
throw new AssertionError();
@Override
public void loopEnd(ParseStage stage){
if(stage == PmdMorphHandler.MORPH_LIST){
- // NOTHING
+ assert true; // NOTHING
}else if(stage == PmdMorphHandler.MORPHVERTEX_LIST){
- // NOTHING
+ assert true; // NOTHING
}else if(stage == PmdMorphHandler.MORPHORDER_LIST){
- // NOTHING
+ assert true; // NOTHING
}else{
assert false;
throw new AssertionError();
/** 改行文字列 CRLF。 */
private static final String CRLF = CR + LF; // 0x0d, 0x0a
+ // sRGBカラー情報配列インデックス
+ private static final int IDX_RED = 0;
+ private static final int IDX_GREEN = 1;
+ private static final int IDX_BLUE = 2;
+ private static final int IDX_ALPHA = 3;
+
+ private static final int TRIANGLE = 3;
+
static{
assert NOPREVBONE_ID > PmdConst.MAX_BONE - 1;
}
+
+ private float[] rgbaBuf = null;
+
+
/**
* コンストラクタ。
* @param stream 出力ストリーム
*/
private void dumpBasic(PmdModel model)
throws IOException, IllegalTextExportException{
- for(int idx=0; idx < MAGIC_BYTES.length; idx++){
+ for(int idx = 0; idx < MAGIC_BYTES.length; idx++){
dumpByte(MAGIC_BYTES[idx]);
}
for(Material material : materialList){
surfaceNum += material.getSurfaceList().size();
}
- dumpLeInt(surfaceNum * 3);
+ dumpLeInt(surfaceNum * TRIANGLE);
- Vertex[] triangle = new Vertex[3];
+ Vertex[] triangle = new Vertex[TRIANGLE];
for(Material material : materialList){
for(Surface surface : material){
surface.getTriangle(triangle);
int materialNum = materialList.size();
dumpLeInt(materialNum);
- float[] rgba = new float[4];
-
for(Material material : materialList){
- Color diffuse = material.getDiffuseColor();
- diffuse.getRGBComponents(rgba);
- dumpLeFloat(rgba[0]);
- dumpLeFloat(rgba[1]);
- dumpLeFloat(rgba[2]);
- dumpLeFloat(rgba[3]);
-
- float shininess = material.getShininess();
- dumpLeFloat(shininess);
-
- Color specular = material.getSpecularColor();
- specular.getRGBComponents(rgba);
- dumpLeFloat(rgba[0]);
- dumpLeFloat(rgba[1]);
- dumpLeFloat(rgba[2]);
-
- Color ambient = material.getAmbientColor();
- ambient.getRGBComponents(rgba);
- dumpLeFloat(rgba[0]);
- dumpLeFloat(rgba[1]);
- dumpLeFloat(rgba[2]);
-
- ShadeInfo shade = material.getShadeInfo();
- int toonIdx = shade.getToonIndex();
- dumpByte(toonIdx);
-
- byte edgeFlag;
- boolean showEdge = material.getEdgeAppearance();
- if(showEdge) edgeFlag = 0x01;
- else edgeFlag = 0x00;
- dumpByte(edgeFlag);
-
- int surfaceNum = material.getSurfaceList().size();
- dumpLeInt(surfaceNum * 3);
-
- dumpShadeFileInfo(shade);
+ dumpColorInfo(material);
+ dumpShadeInfo(material);
}
flush();
}
/**
+ * フォンシェーディングの色情報を出力する。
+ * @param material マテリアル情報
+ * @throws IOException 出力エラー
+ */
+ private void dumpColorInfo(Material material)
+ throws IOException{
+ Color diffuse = material.getDiffuseColor();
+ this.rgbaBuf = diffuse.getRGBComponents(this.rgbaBuf);
+ dumpLeFloat(this.rgbaBuf[IDX_RED]);
+ dumpLeFloat(this.rgbaBuf[IDX_GREEN]);
+ dumpLeFloat(this.rgbaBuf[IDX_BLUE]);
+ dumpLeFloat(this.rgbaBuf[IDX_ALPHA]);
+
+ float shininess = material.getShininess();
+ dumpLeFloat(shininess);
+
+ Color specular = material.getSpecularColor();
+ this.rgbaBuf = specular.getRGBComponents(this.rgbaBuf);
+ dumpLeFloat(this.rgbaBuf[IDX_RED]);
+ dumpLeFloat(this.rgbaBuf[IDX_GREEN]);
+ dumpLeFloat(this.rgbaBuf[IDX_BLUE]);
+
+ Color ambient = material.getAmbientColor();
+ this.rgbaBuf = ambient.getRGBComponents(this.rgbaBuf);
+ dumpLeFloat(this.rgbaBuf[IDX_RED]);
+ dumpLeFloat(this.rgbaBuf[IDX_GREEN]);
+ dumpLeFloat(this.rgbaBuf[IDX_BLUE]);
+
+ return;
+ }
+
+ /**
+ * シェーディング情報を出力する。
+ * @param material マテリアル情報
+ * @throws IOException 出力エラー
+ * @throws IllegalTextExportException ファイル名が長すぎる
+ */
+ private void dumpShadeInfo(Material material)
+ throws IOException, IllegalTextExportException{
+ ShadeInfo shade = material.getShadeInfo();
+ int toonIdx = shade.getToonIndex();
+ dumpByte(toonIdx);
+
+ boolean showEdge = material.getEdgeAppearance();
+ byte edgeFlag;
+ if(showEdge) edgeFlag = 0x01;
+ else edgeFlag = 0x00;
+ dumpByte(edgeFlag);
+
+ int surfaceNum = material.getSurfaceList().size();
+ dumpLeInt(surfaceNum * TRIANGLE);
+
+ dumpShadeFileInfo(shade);
+
+ return;
+ }
+
+ /**
* シェーディングファイル情報を出力する。
* @param shade シェーディング情報
* @throws IOException 出力エラー
throws IOException, IllegalTextExportException{
Map<MorphType, List<MorphPart>> morphMap = model.getMorphMap();
Set<MorphType> typeSet = morphMap.keySet();
- List<MorphVertex> mergedMorphVertexList = model.mergeMorphVertex();
+ List<MorphPart> morphPartList = new LinkedList<MorphPart>();
- int totalMorphPart = 0;
for(MorphType type : typeSet){
List<MorphPart> partList = morphMap.get(type);
if(partList == null) continue;
- totalMorphPart += partList.size();
+ morphPartList.addAll(partList);
}
+ int totalMorphPart = morphPartList.size();
if(totalMorphPart <= 0){
dumpLeShort(0);
return;
dumpLeShort(totalMorphPart);
}
+ dumpBaseMorph(model);
+
+ for(MorphPart part : morphPartList){
+ dumpText(part.getMorphName().getPrimaryText(),
+ PmdConst.MAXBYTES_MORPHNAME );
+
+ List<MorphVertex> morphVertexList = part.getMorphVertexList();
+ dumpLeInt(morphVertexList.size());
+
+ dumpByte(part.getMorphType().encode());
+ for(MorphVertex morphVertex : morphVertexList){
+ dumpLeInt(morphVertex.getSerialNumber());
+ dumpPos3D(morphVertex.getOffset());
+ }
+ }
+
+ flush();
+
+ return;
+ }
+
+ /**
+ * BASEモーフを出力する。
+ * @param model モデルデータ
+ * @throws IOException 出力エラー
+ * @throws IllegalTextExportException モーフ名が長すぎる
+ */
+ private void dumpBaseMorph(PmdModel model)
+ throws IOException, IllegalTextExportException{
dumpText("base", PmdConst.MAXBYTES_MORPHNAME);
+
+ List<MorphVertex> mergedMorphVertexList = model.mergeMorphVertex();
int totalVertex = mergedMorphVertexList.size();
dumpLeInt(totalVertex);
+
dumpByte(MorphType.BASE.encode());
for(MorphVertex morphVertex : mergedMorphVertexList){
Vertex baseVertex = morphVertex.getBaseVertex();
dumpPos3D(baseVertex.getPosition());
}
- for(MorphType type : typeSet){
- List<MorphPart> partList = morphMap.get(type);
- if(partList == null) continue;
- for(MorphPart part : partList){
- dumpText(part.getMorphName().getPrimaryText(),
- PmdConst.MAXBYTES_MORPHNAME );
- List<MorphVertex> morphVertexList = part.getMorphVertexList();
- dumpLeInt(morphVertexList.size());
- dumpByte(part.getMorphType().encode());
-
- for(MorphVertex morphVertex : morphVertexList){
- dumpLeInt(morphVertex.getSerialNumber());
- dumpPos3D(morphVertex.getOffset());
- }
- }
- }
-
- flush();
-
return;
}
*/
class RigidBuilder implements PmdRigidHandler {
+ private static final int MAX_BONEID = 65534;
+
+
private final List<BoneInfo> boneList;
private final List<RigidInfo> rigidList;
*/
@Override
public void loopNext(ParseStage stage){
+ assert this.rigidIt != null;
if(this.rigidIt.hasNext()){
this.currentRigid = this.rigidIt.next();
}
@Override
public void pmdRigidInfo(int rigidGroupId, int linkedBoneId){
BoneInfo bone;
- if(linkedBoneId < 0 || 65535 <= linkedBoneId){
+ if(linkedBoneId < 0 || MAX_BONEID < linkedBoneId){
bone = null;
}else{
bone = this.boneList.get(linkedBoneId);
*/
@Override
public void pmdVertexEdge(boolean hideEdge){
- this.currentVertex.setEdgeAppearance( ! hideEdge );
+ boolean appearFlag = ! hideEdge;
+ this.currentVertex.setEdgeAppearance(appearFlag);
return;
}
import java.util.Iterator;
import java.util.List;
import jp.sfjp.mikutoga.bin.parser.ParseStage;
-import jp.sfjp.mikutoga.corelib.I18nText;
import jp.sfjp.mikutoga.pmd.model.BoneGroup;
import jp.sfjp.mikutoga.pmd.model.BoneInfo;
import jp.sfjp.mikutoga.pmd.model.MorphPart;
private final PmdModel model;
- private final I18nText modelName;
- private final I18nText description;
-
- private final List<BoneInfo> boneList;
private Iterator<BoneInfo> boneIt;
private BoneInfo currentBone = null;
private Iterator<MorphPart> morphPartIt;
private MorphPart currentMorphPart = null;
- private final List<BoneGroup> boneGroupList;
private Iterator<BoneGroup> boneGroupIt;
private BoneGroup currentBoneGroup = null;
*/
TextBuilder(PmdModel model){
super();
-
this.model = model;
-
- this.modelName = model.getModelName();
- this.description = model.getDescription();
-
- this.boneList = model.getBoneList();
- this.boneGroupList = model.getBoneGroupList();
-
return;
}
/**
* {@inheritDoc}
- * @param hasMoreData {@inheritDoc}
+ * @param hasMoreDataArg {@inheritDoc}
*/
@Override
- public void pmdParseEnd(boolean hasMoreData){
- this.hasMoreData = hasMoreData;
+ public void pmdParseEnd(boolean hasMoreDataArg){
+ this.hasMoreData = hasMoreDataArg;
return;
}
@Override
public void loopStart(ParseStage stage, int loops){
if(stage == PmdEngHandler.ENGBONE_LIST){
- this.boneIt = this.boneList.iterator();
+ this.boneIt = this.model.getBoneList().iterator();
if(this.boneIt.hasNext()){
this.currentBone = this.boneIt.next();
}
this.currentMorphPart = this.morphPartIt.next();
}
}else if(stage == PmdEngHandler.ENGBONEGROUP_LIST){
- this.boneGroupIt = this.boneGroupList.iterator();
+ this.boneGroupIt = this.model.getBoneGroupList().iterator();
// デフォルトボーングループを読み飛ばす
assert this.boneGroupIt.hasNext();
/**
* {@inheritDoc}
- * @param modelName {@inheritDoc}
- * @param description {@inheritDoc}
+ * @param modelNameArg {@inheritDoc}
+ * @param descriptionArg {@inheritDoc}
*/
@Override
- public void pmdModelInfo(String modelName, String description){
- this.modelName .setPrimaryText(modelName);
- this.description.setPrimaryText(description);
+ public void pmdModelInfo(String modelNameArg, String descriptionArg){
+ this.model.getModelName() .setPrimaryText(modelNameArg);
+ this.model.getDescription().setPrimaryText(descriptionArg);
return;
}
/**
* {@inheritDoc}
- * @param modelName {@inheritDoc}
- * @param description {@inheritDoc}
+ * @param modelNameArg {@inheritDoc}
+ * @param descriptionArg {@inheritDoc}
*/
@Override
- public void pmdEngModelInfo(String modelName, String description){
- this.modelName .setGlobalText(modelName);
- this.description.setGlobalText(description);
+ public void pmdEngModelInfo(String modelNameArg, String descriptionArg){
+ this.model.getModelName() .setGlobalText(modelNameArg);
+ this.model.getDescription().setGlobalText(descriptionArg);
return;
}
--- /dev/null
+/*
+ * package information for Javadoc
+ *
+ * License : The MIT License
+ * Copyright(c) 2013 MikuToga Partners
+ */
+
+/**
+ * PMDモデルファイル(*.pmd)用各種基本データ構造。
+ */
+
+package jp.sfjp.mikutoga.pmd.model;
+
+/* EOF */
private final ExtraExporter exp;
+ private float[] rgbaBuf = null;
/**
*/
private void putPhongShade(Material material)
throws IOException{
- float[] rgba = null;
-
ind().putOpenSTag(PmdTag.DIFFUSE.tag()).sp();
Color diffuse = material.getDiffuseColor();
- rgba = diffuse.getRGBComponents(rgba);
- putTriColor(rgba);
- putFloatAttr(PmdAttr.ALPHA.attr(), rgba[IDX_ALPHA]).sp();
+ this.rgbaBuf = diffuse.getRGBComponents(this.rgbaBuf);
+ putTriColor(this.rgbaBuf);
+ putFloatAttr(PmdAttr.ALPHA.attr(), this.rgbaBuf[IDX_ALPHA]).sp();
putCloseEmpty().ln();
float shininess = material.getShininess();
ind().putOpenSTag(PmdTag.SPECULAR.tag()).sp();
Color specular = material.getSpecularColor();
- rgba = specular.getRGBComponents(rgba);
- putTriColor(rgba);
+ this.rgbaBuf = specular.getRGBComponents(this.rgbaBuf);
+ putTriColor(this.rgbaBuf);
putFloatAttr(PmdAttr.SHININESS.attr(), shininess).sp();
putCloseEmpty().ln();
ind().putOpenSTag(PmdTag.AMBIENT.tag()).sp();
Color ambient = material.getAmbientColor();
- rgba = ambient.getRGBComponents(rgba);
- putTriColor(rgba);
+ this.rgbaBuf = ambient.getRGBComponents(this.rgbaBuf);
+ putTriColor(this.rgbaBuf);
putCloseEmpty().ln();
return;
/**
* {@inheritDoc}
* @return {@inheritDoc}
+ * ※101009版。
*/
@Override
public URI getOriginalResource(){
/**
* {@inheritDoc}
+ * ※101009版。
* @return {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ * ※130128版。
* @return {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ * ※130128版。
* @return {@inheritDoc}
*/
@Override
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.Charset;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.validation.Schema;
import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
import jp.sfjp.mikutoga.pmd.IllegalPmdDataException;
import jp.sfjp.mikutoga.pmd.model.PmdModel;
import jp.sfjp.mikutoga.pmd.model.binio.PmdExporter;
import jp.sfjp.mikutoga.pmd.model.binio.PmdLoader;
import jp.sfjp.mikutoga.pmd.model.xml.PmdXmlExporter;
-import jp.sfjp.mikutoga.pmd.model.xml.Schema101009;
-import jp.sfjp.mikutoga.pmd.model.xml.Schema130128;
import jp.sfjp.mikutoga.pmd.model.xml.XmlModelFileType;
import jp.sfjp.mikutoga.pmd.model.xml.XmlPmdLoader;
-import jp.sfjp.mikutoga.xml.BotherHandler;
-import jp.sfjp.mikutoga.xml.LocalXmlResource;
-import jp.sfjp.mikutoga.xml.SchemaUtil;
import jp.sfjp.mikutoga.xml.TogaXmlException;
-import jp.sfjp.mikutoga.xml.XmlResourceResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
/**
- * ドキュメントビルダファクトリを初期化する。
- * @param builderFactory ドキュメントビルダファクトリ
- */
- private static void initBuilderFactory(
- DocumentBuilderFactory builderFactory ){
- builderFactory.setCoalescing(true);
- builderFactory.setExpandEntityReferences(true);
- builderFactory.setIgnoringComments(true);
- builderFactory.setIgnoringElementContentWhitespace(false);
- builderFactory.setNamespaceAware(true);
- builderFactory.setValidating(false);
- builderFactory.setXIncludeAware(false);
-
-// builderFactory.setFeature(name, value);
-// builderFactory.setAttribute(name, value);
-
- return;
- }
-
- /**
- * DOMビルダ生成。
- * @return DOMビルダ
- */
- private DocumentBuilder buildBuilder(){
- XmlResourceResolver resolver = new XmlResourceResolver();
-
- LocalXmlResource[] schemaArray;
- switch(this.inTypes){
- case XML_101009:
- schemaArray = new LocalXmlResource[]{
- Schema101009.SINGLETON,
- };
- break;
- case XML_130128:
- schemaArray = new LocalXmlResource[]{
- Schema130128.SINGLETON,
- };
- break;
- case XML_AUTO:
- schemaArray = new LocalXmlResource[]{
- Schema101009.SINGLETON,
- Schema130128.SINGLETON,
- };
- break;
- default:
- throw new IllegalStateException();
- }
-
- Schema schema = SchemaUtil.newSchema(resolver, schemaArray);
-
- DocumentBuilderFactory builderFactory =
- DocumentBuilderFactory.newInstance();
- initBuilderFactory(builderFactory);
- builderFactory.setSchema(schema);
-
- DocumentBuilder result;
- try{
- result = builderFactory.newDocumentBuilder();
- }catch(ParserConfigurationException e){
- assert false;
- throw new AssertionError(e);
- }
- result.setEntityResolver(resolver);
- result.setErrorHandler(BotherHandler.HANDLER);
-
- return result;
- }
-
-
- /**
* 入力ファイル種別を設定する。
* @param type ファイル種別
* @throws NullPointerException 引数がnull
/**
* XML入力に関する各種ユーティリティ。
*/
-class XmlInputUtil {
+final class XmlInputUtil {
/**
* 隠しコンストラクタ。