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:
parent
7c1c6dc065
commit
45d1a0e772
@ -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()]);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user