Several fixes to animation loading.

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8235 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
Kae..pl 2011-09-10 19:57:29 +00:00
parent 7c1c6dc065
commit 45d1a0e772

View File

@ -299,9 +299,9 @@ public class ArmatureHelper extends AbstractBlenderHelper {
* additional bone transformation which indicates it's mesh parent and armature object transformations * additional bone transformation which indicates it's mesh parent and armature object transformations
* @return * @return
*/ */
public Bone[] buildBonesStructure(Long armatureOMA, Matrix4f additionalRootBoneTransformation) {//TODO: uwzględnić wiele szkieletów public Bone[] buildBonesStructure(Long armatureOMA, Matrix4f additionalRootBoneTransformation) {//TODO: consider many skeletons ???
List<Bone> bones = new ArrayList<Bone>(boneDataRoots.size() + 1); List<Bone> bones = new ArrayList<Bone>(boneDataRoots.size() + 1);
bones.add(new Bone(null)); bones.add(new Bone(""));
for (BoneTransformationData btd : boneDataRoots) { for (BoneTransformationData btd : boneDataRoots) {
this.assignBonesMatrices(btd, additionalRootBoneTransformation, bones); this.assignBonesMatrices(btd, additionalRootBoneTransformation, bones);
} }
@ -338,14 +338,46 @@ public class ArmatureHelper extends AbstractBlenderHelper {
return true; return true;
} }
/**
* This method retuns the bone tracks for animation.
*
* @param actionStructure
* the structure containing the tracks
* @param dataRepository
* the data repository
* @param objectName
* the name of the object that will use these tracks
* @param animationName
* the animation name
* @return a list of tracks for the specified animation
* @throws BlenderFileException
* an exception is thrown when there are problems with the blend
* file
*/
public BoneTrack[] getTracks(Structure actionStructure, DataRepository dataRepository, String objectName, String animationName) throws BlenderFileException { public BoneTrack[] getTracks(Structure actionStructure, DataRepository dataRepository, String objectName, String animationName) throws BlenderFileException {
if (blenderVersion < 250) { if (blenderVersion < 250) {
return this.getTracks250(actionStructure, dataRepository, objectName, animationName); return this.getTracks249(actionStructure, dataRepository, objectName, animationName);
} else { } else {
return this.getTracks249(actionStructure, dataRepository, objectName, animationName); return this.getTracks250(actionStructure, dataRepository, objectName, animationName);
} }
} }
/**
* This method retuns the bone tracks for animation for blender version 2.50 and higher.
*
* @param actionStructure
* the structure containing the tracks
* @param dataRepository
* the data repository
* @param objectName
* the name of the object that will use these tracks
* @param animationName
* the animation name
* @return a list of tracks for the specified animation
* @throws BlenderFileException
* an exception is thrown when there are problems with the blend
* file
*/
private BoneTrack[] getTracks250(Structure actionStructure, DataRepository dataRepository, String objectName, String animationName) throws BlenderFileException { private BoneTrack[] getTracks250(Structure actionStructure, DataRepository dataRepository, String objectName, String animationName) throws BlenderFileException {
LOGGER.log(Level.INFO, "Getting tracks!"); LOGGER.log(Level.INFO, "Getting tracks!");
int fps = dataRepository.getBlenderKey().getFps(); int fps = dataRepository.getBlenderKey().getFps();
@ -388,43 +420,43 @@ public class ArmatureHelper extends AbstractBlenderHelper {
return tracks.toArray(new BoneTrack[tracks.size()]); return tracks.toArray(new BoneTrack[tracks.size()]);
} }
/**
* This method retuns the bone tracks for animation for blender version 2.49 (and probably several lower versions too).
*
* @param actionStructure
* the structure containing the tracks
* @param dataRepository
* the data repository
* @param objectName
* the name of the object that will use these tracks
* @param animationName
* the animation name
* @return a list of tracks for the specified animation
* @throws BlenderFileException
* an exception is thrown when there are problems with the blend
* file
*/
private BoneTrack[] getTracks249(Structure actionStructure, DataRepository dataRepository, String objectName, String animationName) throws BlenderFileException { private BoneTrack[] getTracks249(Structure actionStructure, DataRepository dataRepository, String objectName, String animationName) throws BlenderFileException {
LOGGER.log(Level.INFO, "Getting tracks!"); LOGGER.log(Level.INFO, "Getting tracks!");
IpoHelper ipoHelper = dataRepository.getHelper(IpoHelper.class);
int fps = dataRepository.getBlenderKey().getFps(); int fps = dataRepository.getBlenderKey().getFps();
int[] animationFrames = dataRepository.getBlenderKey().getAnimationFrames(objectName, animationName); int[] animationFrames = dataRepository.getBlenderKey().getAnimationFrames(objectName, animationName);
Structure groups = (Structure) actionStructure.getFieldValue("groups"); Structure chanbase = (Structure) actionStructure.getFieldValue("chanbase");
List<Structure> actionGroups = groups.evaluateListBase(dataRepository);//bActionGroup List<Structure> actionChannels = chanbase.evaluateListBase(dataRepository);//bActionChannel
if (actionGroups != null && actionGroups.size() > 0 && (bonesMap == null || bonesMap.size() == 0)) { if (actionChannels != null && actionChannels.size() > 0 && (bonesMap == null || bonesMap.size() == 0)) {
throw new IllegalStateException("No bones found! Cannot proceed to calculating tracks!"); throw new IllegalStateException("No bones found! Cannot proceed to calculating tracks!");
} }
List<BoneTrack> tracks = new ArrayList<BoneTrack>(); List<BoneTrack> tracks = new ArrayList<BoneTrack>();
for (Structure actionGroup : actionGroups) { for (Structure bActionChannel : actionChannels) {
String name = actionGroup.getFieldValue("name").toString(); String name = bActionChannel.getFieldValue("name").toString();
Integer boneIndex = bonesMap.get(name); Integer boneIndex = bonesMap.get(name);
if (boneIndex != null) { if (boneIndex != null) {
List<Structure> channels = ((Structure) actionGroup.getFieldValue("channels")).evaluateListBase(dataRepository); Pointer p = (Pointer) bActionChannel.getFieldValue("ipo");
BezierCurve[] bezierCurves = new BezierCurve[channels.size()]; if (!p.isNull()) {
int channelCounter = 0; Structure ipoStructure = p.fetchData(dataRepository.getInputStream()).get(0);
for (Structure c : channels) { Ipo ipo = ipoHelper.createIpo(ipoStructure, dataRepository);
//reading rna path first tracks.add(ipo.calculateTrack(boneIndex.intValue(), animationFrames[0], animationFrames[1], fps));
BlenderInputStream bis = dataRepository.getInputStream();
int currentPosition = bis.getPosition();
Pointer pRnaPath = (Pointer) c.getFieldValue("rna_path");
FileBlockHeader dataFileBlock = dataRepository.getFileBlock(pRnaPath.getOldMemoryAddress());
bis.setPosition(dataFileBlock.getBlockPosition());
String rnaPath = bis.readString();
bis.setPosition(currentPosition);
int arrayIndex = ((Number) c.getFieldValue("array_index")).intValue();
int type = this.getCurveType(rnaPath, arrayIndex);
Pointer pBezTriple = (Pointer) c.getFieldValue("bezt");
List<Structure> bezTriples = pBezTriple.fetchData(dataRepository.getInputStream());
bezierCurves[channelCounter++] = new BezierCurve(type, bezTriples, 2);
} }
Ipo ipo = new Ipo(bezierCurves);
tracks.add(ipo.calculateTrack(boneIndex.intValue(), animationFrames[0], animationFrames[1], fps));
} }
} }
return tracks.toArray(new BoneTrack[tracks.size()]); return tracks.toArray(new BoneTrack[tracks.size()]);