Optimize audio preview rendering when zoom is very high

#519
This commit is contained in:
Wojtek Figat
2021-08-23 13:39:07 +02:00
parent 347eaa9d07
commit 052366be66

View File

@@ -145,18 +145,31 @@ namespace FlaxEditor.Viewport.Previews
const uint maxSamplesPerIndex = 64;
uint samplesPerIndexDiff = Math.Max(1, samplesPerIndex / Math.Min(samplesPerIndex, maxSamplesPerIndex));
// Calculate the clip range in the view to optimize drawing (eg. if only part fo the clip is visible)
Render2D.PeekClip(out var globalClipping);
Render2D.PeekTransform(out var globalTransform);
var globalRect = new Rectangle(globalTransform.M31, globalTransform.M32, width * globalTransform.M11, height * globalTransform.M22);
var globalMask = Rectangle.Shared(globalClipping, globalRect);
var globalTransformInv = Matrix3x3.Invert(globalTransform);
var localRect = Rectangle.FromPoints(Matrix3x3.Transform2D(globalMask.UpperLeft, globalTransformInv), Matrix3x3.Transform2D(globalMask.BottomRight, globalTransformInv));
var localRectMin = localRect.UpperLeft;
var localRectMax = localRect.BottomRight;
// Render each clip separately
for (uint clipIndex = 0; clipIndex < Mathf.CeilToInt(clipsInView); clipIndex++)
{
var clipX = clipWidth * clipIndex;
var clipRight = Mathf.Min(width, clipX + clipWidth);
var clipStart = clipWidth * clipIndex;
var clipEnd = clipStart + clipWidth;
var xStart = Mathf.Max(clipStart, localRectMin.X);
var xEnd = Mathf.Min(Mathf.Min(width, clipEnd), localRectMax.X);
var samplesOffset = (uint)((xStart - clipStart) * samplesPerIndex);
// Render every audio channel separately
for (uint channelIndex = 0; channelIndex < info.NumChannels; channelIndex++)
{
uint currentSample = channelIndex;
uint currentSample = channelIndex + samplesOffset;
float yCenter = Y + ((2 * channelIndex) + 1) * height / (2.0f * info.NumChannels);
for (float pixelX = clipX; pixelX < clipRight; pixelX++)
for (float pixelX = xStart; pixelX < xEnd; pixelX++)
{
float samplesSum = 0;
int samplesInPixel = 0;