Add swizzling for animations not authored with YZX rotations within blender (haven't updated the import/export yet)

This commit is contained in:
George Paton 2024-12-17 19:55:37 +08:00
parent 700e02223f
commit 67eb2be5a7
4 changed files with 35 additions and 11 deletions

View File

@ -51,14 +51,26 @@ public class AnimationLoader {
// The offsets are only required when sequences are played for an object, which is why we don't globally offset! The obj rendering handles the non-animated case fine
// Effectively, this removes double translation AND ensures that rotations occur around the individual object origin, rather than the weapon origin
HashMap<String, double[]> offsets = new HashMap<String, double[]>();
HashMap<String, double[]> rotModes = new HashMap<String, double[]>();
for(Map.Entry<String, JsonElement> root : json.getAsJsonObject("offset").entrySet()) {
double[] offset = new double[3];
JsonArray array = root.getValue().getAsJsonArray();
double[] offset = new double[3];
for(int i = 0; i < 3; i++) {
offset[i] = root.getValue().getAsJsonArray().get(i).getAsDouble();
offset[i] = array.get(i).getAsDouble();
}
offsets.put(root.getKey(), offset);
if(array.size() >= 6) {
double[] rotMode = new double[3];
for(int i = 0; i < 3; i++) {
rotMode[i] = array.get(i + 3).getAsDouble();
}
rotModes.put(root.getKey(), rotMode);
}
}
@ -71,8 +83,10 @@ public class AnimationLoader {
for(Map.Entry<String, JsonElement> model : entryObject.entrySet()) {
String modelName = model.getKey();
double[] offset = new double[3];
if (offsets.containsKey(modelName)) offset = offsets.get(modelName);
animation.addBus(modelName, loadSequence(model.getValue().getAsJsonObject(), offset));
double[] rotMode = new double[] { 0, 1, 2 };
if(offsets.containsKey(modelName)) offset = offsets.get(modelName);
if(rotModes.containsKey(modelName)) rotMode = rotModes.get(modelName);
animation.addBus(modelName, loadSequence(model.getValue().getAsJsonObject(), offset, rotMode));
}
animations.put(root.getKey(), animation);
@ -81,7 +95,7 @@ public class AnimationLoader {
return animations;
}
private static BusAnimationSequence loadSequence(JsonObject json, double[] offset) {
private static BusAnimationSequence loadSequence(JsonObject json, double[] offset, double[] rotMode) {
BusAnimationSequence sequence = new BusAnimationSequence();
// Location fcurves
@ -130,6 +144,7 @@ public class AnimationLoader {
}
sequence.offset = offset;
sequence.rotMode = rotMode;
return sequence;
}

View File

@ -26,6 +26,9 @@ public class BusAnimationSequence {
public double[] offset = new double[3];
// swizzle me timbers
public double[] rotMode = new double[] { 0, 1, 2 };
public BusAnimationSequence() {
// Initialise our keyframe storage, since it's multidimensional
@ -68,7 +71,7 @@ public class BusAnimationSequence {
//all transformation data is absolute, additive transformations have not yet been implemented
public double[] getTransformation(int millis) {
double[] transform = new double[12];
double[] transform = new double[15];
for(int i = 0; i < 9; i++) {
List<BusAnimationKeyframe> keyframes = transformKeyframes.get(i);
@ -109,6 +112,10 @@ public class BusAnimationSequence {
transform[10] = offset[1];
transform[11] = offset[2];
transform[12] = rotMode[0];
transform[13] = rotMode[1];
transform[14] = rotMode[2];
return transform;
}

View File

@ -110,18 +110,20 @@ public class HbmAnimations {
0, 0, 0, // position
0, 0, 0, // rotation
1, 1, 1, // scale
0, 0, 0 // offset
0, 0, 0, // offset
0, 1, 2, // XYZ order
};
}
public static void applyRelevantTransformation(String bus) { applyRelevantTransformation(bus, 0); }
public static void applyRelevantTransformation(String bus, int index) {
double[] transform = getRelevantTransformation(bus, index);
int[] rot = new int[] { (int)transform[12], (int)transform[13], (int)transform[14] };
GL11.glTranslated(transform[0], transform[1], transform[2]);
GL11.glRotated(transform[3], 1, 0, 0);
GL11.glRotated(transform[4], 0, 1, 0);
GL11.glRotated(transform[5], 0, 0, 1);
GL11.glRotated(transform[3 + rot[0]], rot[0] == 0 ? 1 : 0, rot[0] == 1 ? 1 : 0, rot[0] == 2 ? 1 : 0);
GL11.glRotated(transform[3 + rot[1]], rot[1] == 0 ? 1 : 0, rot[1] == 1 ? 1 : 0, rot[1] == 2 ? 1 : 0);
GL11.glRotated(transform[3 + rot[2]], rot[2] == 0 ? 1 : 0, rot[2] == 1 ? 1 : 0, rot[2] == 2 ? 1 : 0);
GL11.glTranslated(-transform[9], -transform[10], -transform[11]);
GL11.glScaled(transform[6], transform[7], transform[8]);
}

File diff suppressed because one or more lines are too long