// Get the transformation matrices at a time private Frame GetTransformsAtTime(float time) { // Calculate the index of the current frame var frameIndex = (int)(time * Fps) % FrameCount; var t = ((time * Fps) - frameIndex) % 1; // Get current and next frame var frame1 = Frames[frameIndex]; var frame2 = Frames[(frameIndex + 1) % FrameCount]; // Create output frame var frame = new Frame(); var length = FrameCount / Fps; // Interpolate bone positions and angles foreach (var bonePair in frame1.Bones) { var position = Vector3.Lerp(frame1.Bones[bonePair.Key].Position, frame2.Bones[bonePair.Key].Position, t); var angle = Quaternion.Slerp(frame1.Bones[bonePair.Key].Angle, frame2.Bones[bonePair.Key].Angle, t); frame.Bones[bonePair.Key] = new FrameBone(position, angle); } return(frame); }
public override void Render(float partialTicks) { Vector3 partialPos = Vector3.Lerp(LastPos, Pos, partialTicks); Vector3 partialRot = Vector3.Lerp(_lastRot, _rot, partialTicks); float partialScale = LastParticleScale + (ParticleScale - LastParticleScale) * partialTicks; float partialAlpha = LastParticleAlpha + (ParticleAlpha - LastParticleAlpha) * partialTicks; partialPos.Y += partialScale / 2.0f; ModelBaked model = ParticleRenderer.ParticleModel; model.Shader.SetMatrix4("transformationMatrix", MatrixHelper.CreateTransformationMatrix(partialPos, partialRot, partialScale)); model.Shader.SetVector2("UVmin", UVmin); model.Shader.SetVector2("UVmax", UVmax); model.Shader.SetFloat("alpha", partialAlpha); GL.BindTexture(TextureTarget.Texture2D, TextureId); model.RawModel.Render(); }