public float getValue(int frame) { AnimKey f1 = null, f2 = null; for (int i = 0; i < keys.Count - 1; i++) { if ((keys [i].input - 1 <= frame && keys [i + 1].input - 1 >= frame)) { f1 = keys [i]; f2 = keys [i + 1]; break; } } if (f1 == null) { if (keys.Count <= 1) { return(keys [0].output); } else { f1 = keys [keys.Count - 2]; f2 = keys [keys.Count - 1]; } } return(CHR0.interHermite(frame + 1, f1.input, f2.input, weighted ? f1.t1 : 0, weighted ? f2.t1 : 0, f1.output, f2.output)); }
private Frame[] Bake(int bone) { Frame[] frames = new Frame[anim.frameCount]; for (int i = 0; i < frames.Length; i++) { frames[i] = new Frame(i); } foreach (DAT_Animation.DATAnimTrack track in anim.nodes[bone]) { int f = 0, ni = 0, currentFrame = 0, nextFrame = 0; DAT_Animation.KeyNode node = track.keys[ni++]; nextFrame = (int)node.frame; float cvalue = node.value, ctan = node.tan; while (f < anim.frameCount) { try { // calculate value float nvalue = -99, ntan = -99; for (int j = ni; j < track.keys.Count; j++) { //if (track.keys[j].interpolationType != DAT_Animation.InterpolationType.HermiteCurve) { if (track.keys[j].interpolationType == DAT_Animation.InterpolationType.HermiteCurve) { ctan = track.keys[j].tan; } else if (track.keys[j].tan != -99 && ntan == -99) { ntan = track.keys[j].tan; } if (track.keys[j].value != -99 && nvalue == -99) { nvalue = track.keys[j].value; } if (nvalue != -99 && ntan != -99) { break; } } } if (nvalue == -99) { nvalue = track.keys[0].value; } if (ntan == -99) { ntan = 0; } if (ctan == -99) { ctan = 0; } float value = 0; //Console.WriteLine(track.type + " " + node.interpolationType); switch (node.interpolationType) { case DAT_Animation.InterpolationType.Hermite: { cvalue = node.value; //value = Interpolate(f - currentFrame, nextFrame - currentFrame, cvalue, nvalue, ctan, ntan); value = CHR0.interHermite(f, currentFrame, nextFrame + 1, ctan, ntan, cvalue, nvalue); } break; case DAT_Animation.InterpolationType.HermiteValue: { cvalue = node.value; ctan = 0; //value = Interpolate(f - currentFrame, nextFrame - currentFrame, cvalue, nvalue, ctan, ntan); value = CHR0.interHermite(f, currentFrame, nextFrame + 1, 0, 0, cvalue, nvalue); } break; case DAT_Animation.InterpolationType.Step: { value = node.value; } break; case DAT_Animation.InterpolationType.Linear: { cvalue = node.value; value = CHR0.lerp(cvalue, nvalue, currentFrame, nextFrame, f); } break; default: Console.WriteLine(node.interpolationType); break; } if (float.IsNaN(value) || f == currentFrame) { value = node.value; } switch (track.type) { case DAT_Animation.AnimType.XROT: //Console.WriteLine(ctan + " " + ntan + " " + node.value + " " + nvalue + " " + f + " " + currentFrame + " " + nextFrame); frames[f].rx = value * 180 / (float)Math.PI; break; case DAT_Animation.AnimType.YROT: //Console.WriteLine(ctan + " " + ntan + " " + cvalue + " " + nvalue + " " + f + " " + currentFrame + " " + nextFrame); frames[f].ry = value * 180 / (float)Math.PI; break; case DAT_Animation.AnimType.ZROT: //Console.WriteLine(ctan + " " + ntan + " " + cvalue + " " + nvalue + " " + f + " " + currentFrame + " " + nextFrame); frames[f].rz = value * 180 / (float)Math.PI; break; case DAT_Animation.AnimType.XPOS: frames[f].x = value; break; case DAT_Animation.AnimType.YPOS: frames[f].y = value; break; case DAT_Animation.AnimType.ZPOS: frames[f].z = value; break; case DAT_Animation.AnimType.XSCA: frames[f].sx = value; break; case DAT_Animation.AnimType.YSCA: frames[f].sy = value; break; case DAT_Animation.AnimType.ZSCA: frames[f].sz = value; break; } f++; if (f > nextFrame) { if (ni >= track.keys.Count) { node = track.keys[0]; continue; } node = track.keys[ni++]; while (node.interpolationType == DAT_Animation.InterpolationType.HermiteCurve) { node = track.keys[ni++]; } currentFrame = f; nextFrame += (int)node.frame; switch (node.interpolationType) { case DAT_Animation.InterpolationType.Hermite: { ctan = node.tan; } break; } } } catch (IndexOutOfRangeException ex) { } } } return(frames); }