*** empty log message ***
This commit is contained in:
parent
684904b915
commit
bb4000ba87
|
@ -64,6 +64,12 @@ public class Loader {
|
||||||
/** The source document */
|
/** The source document */
|
||||||
private final Document src;
|
private final Document src;
|
||||||
|
|
||||||
|
/** Expected number of vertices */
|
||||||
|
private int numVertices;
|
||||||
|
|
||||||
|
/** Expected number of bones */
|
||||||
|
private int numBones;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* C'tor
|
* C'tor
|
||||||
*/
|
*/
|
||||||
|
@ -78,13 +84,15 @@ public class Loader {
|
||||||
*/
|
*/
|
||||||
public Model load() throws Exception {
|
public Model load() throws Exception {
|
||||||
String material = XMLUtil.getString(src.getDocumentElement(), "material");
|
String material = XMLUtil.getString(src.getDocumentElement(), "material");
|
||||||
|
numVertices = XMLUtil.getInt(src.getDocumentElement(), "vertices");
|
||||||
if (XMLUtil.getString(src.getDocumentElement(), "type").equals("boned")) {
|
if (XMLUtil.getString(src.getDocumentElement(), "type").equals("boned")) {
|
||||||
// It's a boned model
|
// It's a boned model
|
||||||
|
numBones = XMLUtil.getInt(src.getDocumentElement(), "bones", 0);
|
||||||
return new BonedModel(
|
return new BonedModel(
|
||||||
material,
|
material,
|
||||||
loadTriangles(),
|
loadTriangles(),
|
||||||
loadSkin(),
|
loadSkin(),
|
||||||
loadBoneAnimations(XMLUtil.getInt(src.getDocumentElement(), "bones", 0)),
|
loadBoneAnimations(),
|
||||||
loadBonedVertices()
|
loadBonedVertices()
|
||||||
);
|
);
|
||||||
} else if (XMLUtil.getString(src.getDocumentElement(), "type").equals("meshed")) {
|
} else if (XMLUtil.getString(src.getDocumentElement(), "type").equals("meshed")) {
|
||||||
|
@ -107,6 +115,9 @@ public class Loader {
|
||||||
*/
|
*/
|
||||||
private BonedVertex[] loadBonedVertices() throws Exception {
|
private BonedVertex[] loadBonedVertices() throws Exception {
|
||||||
List vertexElements = XMLUtil.getChildren(src.getDocumentElement(), "vertex");
|
List vertexElements = XMLUtil.getChildren(src.getDocumentElement(), "vertex");
|
||||||
|
if (vertexElements.size() != numVertices) {
|
||||||
|
throw new Exception("Vertex count incorrect, got "+vertexElements.size()+", expected "+numVertices);
|
||||||
|
}
|
||||||
BonedVertex[] vertices = new BonedVertex[vertexElements.size()];
|
BonedVertex[] vertices = new BonedVertex[vertexElements.size()];
|
||||||
int vertexCount = 0;
|
int vertexCount = 0;
|
||||||
for (Iterator i = vertexElements.iterator(); i.hasNext(); ) {
|
for (Iterator i = vertexElements.iterator(); i.hasNext(); ) {
|
||||||
|
@ -123,6 +134,12 @@ public class Loader {
|
||||||
*/
|
*/
|
||||||
private Vector2f[] loadSkin() throws Exception {
|
private Vector2f[] loadSkin() throws Exception {
|
||||||
List skinElements = XMLUtil.getChildren(src.getDocumentElement(), "skin");
|
List skinElements = XMLUtil.getChildren(src.getDocumentElement(), "skin");
|
||||||
|
if (skinElements.size() == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (skinElements.size() != numVertices) {
|
||||||
|
throw new Exception("Skin count incorrect, got "+skinElements.size()+", expected "+numVertices);
|
||||||
|
}
|
||||||
Vector2f[] skins = new Vector2f[skinElements.size()];
|
Vector2f[] skins = new Vector2f[skinElements.size()];
|
||||||
int skinCount = 0;
|
int skinCount = 0;
|
||||||
for (Iterator i = skinElements.iterator(); i.hasNext(); ) {
|
for (Iterator i = skinElements.iterator(); i.hasNext(); ) {
|
||||||
|
@ -150,16 +167,15 @@ public class Loader {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load all the bone animations
|
* Load all the bone animations
|
||||||
* @param numBones The number of bones in the animations
|
|
||||||
* @return Map of animation names to BoneFrame[] animations
|
* @return Map of animation names to BoneFrame[] animations
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
private Map loadBoneAnimations(int numBones) throws Exception {
|
private Map loadBoneAnimations() throws Exception {
|
||||||
List animationElements = XMLUtil.getChildren(src.getDocumentElement(), "animation");
|
List animationElements = XMLUtil.getChildren(src.getDocumentElement(), "animation");
|
||||||
Map animations = new HashMap(animationElements.size());
|
Map animations = new HashMap(animationElements.size());
|
||||||
for (Iterator i = animationElements.iterator(); i.hasNext(); ) {
|
for (Iterator i = animationElements.iterator(); i.hasNext(); ) {
|
||||||
Element animationElement = (Element) i.next();
|
Element animationElement = (Element) i.next();
|
||||||
animations.put(XMLUtil.getString(animationElement, "name"), loadBonedAnimation(animationElement, numBones));
|
animations.put(XMLUtil.getString(animationElement, "name"), loadBonedAnimation(animationElement));
|
||||||
}
|
}
|
||||||
return animations;
|
return animations;
|
||||||
}
|
}
|
||||||
|
@ -187,11 +203,16 @@ public class Loader {
|
||||||
*/
|
*/
|
||||||
private BonedVertex loadBonedVertex(Element vertexElement) throws Exception {
|
private BonedVertex loadBonedVertex(Element vertexElement) throws Exception {
|
||||||
List weightElements = XMLUtil.getChildren(vertexElement, "weight");
|
List weightElements = XMLUtil.getChildren(vertexElement, "weight");
|
||||||
Weight[] weights = new Weight[weightElements.size()];
|
Weight[] weights;
|
||||||
int weightCount = 0;
|
if (weightElements.size() == 0) {
|
||||||
for (Iterator i = weightElements.iterator(); i.hasNext(); ) {
|
weights = null;
|
||||||
Element weightElement = (Element) i.next();
|
} else {
|
||||||
weights[weightCount++] = loadWeight(weightElement);
|
weights = new Weight[weightElements.size()];
|
||||||
|
int weightCount = 0;
|
||||||
|
for (Iterator i = weightElements.iterator(); i.hasNext(); ) {
|
||||||
|
Element weightElement = (Element) i.next();
|
||||||
|
weights[weightCount++] = loadWeight(weightElement);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new BonedVertex(
|
return new BonedVertex(
|
||||||
|
@ -200,11 +221,13 @@ public class Loader {
|
||||||
XMLUtil.getFloat(vertexElement, "y"),
|
XMLUtil.getFloat(vertexElement, "y"),
|
||||||
XMLUtil.getFloat(vertexElement, "z")
|
XMLUtil.getFloat(vertexElement, "z")
|
||||||
),
|
),
|
||||||
new Vector3f(
|
XMLUtil.hasAttribute(vertexElement, "nx") ?
|
||||||
XMLUtil.getFloat(vertexElement, "nx"),
|
new Vector3f(
|
||||||
XMLUtil.getFloat(vertexElement, "ny"),
|
XMLUtil.getFloat(vertexElement, "nx"),
|
||||||
XMLUtil.getFloat(vertexElement, "nz")
|
XMLUtil.getFloat(vertexElement, "ny"),
|
||||||
),
|
XMLUtil.getFloat(vertexElement, "nz")
|
||||||
|
)
|
||||||
|
: null,
|
||||||
weights
|
weights
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -222,11 +245,13 @@ public class Loader {
|
||||||
XMLUtil.getFloat(vertexElement, "y"),
|
XMLUtil.getFloat(vertexElement, "y"),
|
||||||
XMLUtil.getFloat(vertexElement, "z")
|
XMLUtil.getFloat(vertexElement, "z")
|
||||||
),
|
),
|
||||||
new Vector3f(
|
XMLUtil.hasAttribute(vertexElement, "nx") ?
|
||||||
XMLUtil.getFloat(vertexElement, "nx"),
|
new Vector3f(
|
||||||
XMLUtil.getFloat(vertexElement, "ny"),
|
XMLUtil.getFloat(vertexElement, "nx"),
|
||||||
XMLUtil.getFloat(vertexElement, "nz")
|
XMLUtil.getFloat(vertexElement, "ny"),
|
||||||
)
|
XMLUtil.getFloat(vertexElement, "nz")
|
||||||
|
)
|
||||||
|
: null
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,8 +262,12 @@ public class Loader {
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
private Weight loadWeight(Element element) throws Exception {
|
private Weight loadWeight(Element element) throws Exception {
|
||||||
|
int bone = XMLUtil.getInt(element, "bone");
|
||||||
|
if (bone < 0 || bone >= numBones) {
|
||||||
|
throw new Exception("Bone index out of range");
|
||||||
|
}
|
||||||
return new Weight(
|
return new Weight(
|
||||||
XMLUtil.getInt(element, "bone"),
|
bone,
|
||||||
XMLUtil.getFloat(element, "weight")
|
XMLUtil.getFloat(element, "weight")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -246,14 +275,31 @@ public class Loader {
|
||||||
/**
|
/**
|
||||||
* Load a Triangle from XML
|
* Load a Triangle from XML
|
||||||
* @param element
|
* @param element
|
||||||
|
* @param numVertices
|
||||||
* @return a Triangle
|
* @return a Triangle
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
private Triangle loadTriangle(Element element) throws Exception {
|
private Triangle loadTriangle(Element element) throws Exception {
|
||||||
|
// Perform sanity checks
|
||||||
|
int a = XMLUtil.getInt(element, "a");
|
||||||
|
if (a < 0 || a >= numVertices) {
|
||||||
|
throw new Exception("'a' is out of range");
|
||||||
|
}
|
||||||
|
int b = XMLUtil.getInt(element, "b");
|
||||||
|
if (b < 0 || b >= numVertices) {
|
||||||
|
throw new Exception("'b' is out of range");
|
||||||
|
}
|
||||||
|
int c = XMLUtil.getInt(element, "c");
|
||||||
|
if (c < 0 || c >= numVertices) {
|
||||||
|
throw new Exception("'c' is out of range");
|
||||||
|
}
|
||||||
|
if (a == b || a == c || b == c) {
|
||||||
|
throw new Exception("Degenerate triangle");
|
||||||
|
}
|
||||||
return new Triangle(
|
return new Triangle(
|
||||||
XMLUtil.getInt(element, "a"),
|
a,
|
||||||
XMLUtil.getInt(element, "b"),
|
b,
|
||||||
XMLUtil.getInt(element, "c"),
|
c,
|
||||||
XMLUtil.getInt(element, "adjacency", 0)
|
XMLUtil.getInt(element, "adjacency", 0)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -274,17 +320,16 @@ public class Loader {
|
||||||
/**
|
/**
|
||||||
* Load a boned Animation from XML
|
* Load a boned Animation from XML
|
||||||
* @param element
|
* @param element
|
||||||
* @param numBones
|
|
||||||
* @return BoneFrame[]
|
* @return BoneFrame[]
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
private BoneFrame[] loadBonedAnimation(Element element, int numBones) throws Exception {
|
private BoneFrame[] loadBonedAnimation(Element element) throws Exception {
|
||||||
List frameElements = XMLUtil.getChildren(element, "frame");
|
List frameElements = XMLUtil.getChildren(element, "frame");
|
||||||
BoneFrame[] frames = new BoneFrame[frameElements.size()];
|
BoneFrame[] frames = new BoneFrame[frameElements.size()];
|
||||||
int frameCount = 0;
|
int frameCount = 0;
|
||||||
for (Iterator i = frameElements.iterator(); i.hasNext(); ) {
|
for (Iterator i = frameElements.iterator(); i.hasNext(); ) {
|
||||||
Element frameElement = (Element) i.next();
|
Element frameElement = (Element) i.next();
|
||||||
frames[frameCount++] = loadBoneFrame(frameElement, numBones);
|
frames[frameCount++] = loadBoneFrame(frameElement);
|
||||||
}
|
}
|
||||||
return frames;
|
return frames;
|
||||||
}
|
}
|
||||||
|
@ -309,11 +354,10 @@ public class Loader {
|
||||||
/**
|
/**
|
||||||
* Load a Frame from XML
|
* Load a Frame from XML
|
||||||
* @param element
|
* @param element
|
||||||
* @param numBones
|
|
||||||
* @return BoneFrame
|
* @return BoneFrame
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
private BoneFrame loadBoneFrame(Element element, int numBones) throws Exception {
|
private BoneFrame loadBoneFrame(Element element) throws Exception {
|
||||||
List boneElements = XMLUtil.getChildren(element, "bone");
|
List boneElements = XMLUtil.getChildren(element, "bone");
|
||||||
if (boneElements.size() != numBones) {
|
if (boneElements.size() != numBones) {
|
||||||
throw new Exception("Expected "+numBones+" bones in frame, only got "+boneElements.size());
|
throw new Exception("Expected "+numBones+" bones in frame, only got "+boneElements.size());
|
||||||
|
@ -339,6 +383,9 @@ public class Loader {
|
||||||
private MeshFrame loadMeshFrame(Element element) throws Exception {
|
private MeshFrame loadMeshFrame(Element element) throws Exception {
|
||||||
List vertexElements = XMLUtil.getChildren(element, "vertex");
|
List vertexElements = XMLUtil.getChildren(element, "vertex");
|
||||||
Vertex[] vertices = new Vertex[vertexElements.size()];
|
Vertex[] vertices = new Vertex[vertexElements.size()];
|
||||||
|
if (vertices.length != numVertices) {
|
||||||
|
throw new Exception("Vertex count incorrect");
|
||||||
|
}
|
||||||
int vertexCount = 0;
|
int vertexCount = 0;
|
||||||
for (Iterator i = vertexElements.iterator(); i.hasNext(); ) {
|
for (Iterator i = vertexElements.iterator(); i.hasNext(); ) {
|
||||||
Element vertexElement = (Element) i.next();
|
Element vertexElement = (Element) i.next();
|
||||||
|
|
|
@ -153,6 +153,17 @@ final class XMLUtil {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true if the specified attribute is present and not empty or null in the element
|
||||||
|
*/
|
||||||
|
static boolean hasAttribute(Element element, String attribute) {
|
||||||
|
String s = element.getAttribute(attribute);
|
||||||
|
if (s == null || "".equals(s))
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue