*** empty log message ***

This commit is contained in:
Caspian Rychlik-Prince 2004-04-20 21:02:40 +00:00
parent 684904b915
commit bb4000ba87
2 changed files with 86 additions and 28 deletions

View File

@ -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();

View File

@ -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;
}
} }