Skip to content

Commit 905d265

Browse files
authored
Merge pull request #213 from ww-rm/dev/wpf
v0.16.28
2 parents 55f977f + 63b1bc2 commit 905d265

30 files changed

Lines changed: 1001 additions & 650 deletions

File tree

CHANGELOG.md

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
# CHANGELOG
22

3-
# v0.16.27
3+
## v0.16.28
4+
5+
- 首选项增加最大并行数参数
6+
- 优化渲染逻辑
7+
- 优化 ffmpeg 导出错误提示
8+
- 优化内存日志输出
9+
10+
## v0.16.27
411

512
- 修改居中和聚焦快捷键
613
- 聚焦增加缩放
714
- 允许列表双击项进行聚焦
815
- 增加重置视图按钮
916

10-
# v0.16.26
17+
## v0.16.26
1118

1219
- 列表右键菜单增加聚焦/居中命令, 支持快捷键操作
1320
- 增加模型导入时避免重叠首选项
@@ -19,7 +26,7 @@
1926
- 移除发布文件中的 pdb 文件
2027
- 修复某些模型包围盒 NaN 计算错误
2128

22-
# v0.16.25
29+
## v0.16.25
2330

2431
- 首选项增加选中模型高亮背景选项
2532
- 修复 CLI 工具预热物理效果无效问题

Spine/Exporters/CustomFFmpegExporter.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ private void SetOutputOptions(FFMpegArgumentOptions options)
6767

6868
public override void Export(string output, CancellationToken ct, params SpineObject[] spines)
6969
{
70+
if (!_hasFFmpeg)
71+
{
72+
_logger.Error("Failed to start ffmpeg, export is not available");
73+
return;
74+
}
75+
7076
var videoFramesSource = new RawVideoPipeSource(GetFrames(spines, output, ct)) { FrameRate = _fps };
7177
try
7278
{

Spine/Exporters/FFmpegVideoExporter.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,12 @@ public enum MovProfile
106106

107107
public override void Export(string output, CancellationToken ct, params SpineObject[] spines)
108108
{
109+
if (!_hasFFmpeg)
110+
{
111+
_logger.Error("Failed to start ffmpeg, export is not available");
112+
return;
113+
}
114+
109115
var videoFramesSource = new RawVideoPipeSource(GetFrames(spines, output, ct)) { FrameRate = _fps };
110116
Action<FFMpegArgumentOptions> setOutputOptions = _format switch
111117
{

Spine/Exporters/VideoExporter.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.Collections.Frozen;
66
using System.Collections.Generic;
7+
using System.Diagnostics;
78
using System.IO;
89
using System.Linq;
910
using System.Text;
@@ -16,6 +17,39 @@ namespace Spine.Exporters
1617
/// </summary>
1718
public abstract class VideoExporter : BaseExporter
1819
{
20+
/// <summary>
21+
/// 是否能启动 ffmpeg
22+
/// </summary>
23+
protected static readonly bool _hasFFmpeg;
24+
25+
static VideoExporter()
26+
{
27+
// 检查并设置 ffmpeg
28+
try
29+
{
30+
using var process = new Process();
31+
32+
process.StartInfo = new ProcessStartInfo
33+
{
34+
FileName = "ffmpeg",
35+
Arguments = "-version",
36+
RedirectStandardOutput = true,
37+
RedirectStandardError = true,
38+
UseShellExecute = false,
39+
CreateNoWindow = true
40+
};
41+
42+
process.Start();
43+
process.WaitForExit(3000);
44+
45+
_hasFFmpeg = process.ExitCode == 0;
46+
}
47+
catch
48+
{
49+
_hasFFmpeg = false;
50+
}
51+
}
52+
1953
private readonly object _frameOutputLock = new();
2054
private SFMLImageVideoFrame? _frameOutput;
2155

Spine/Spine.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<BaseOutputPath>$(SolutionDir)out</BaseOutputPath>
1212
<OutputPath>$(BaseOutputPath)\$(Configuration)\$(PlatformTarget)</OutputPath>
1313
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
14-
<Version>0.16.27</Version>
14+
<Version>0.16.28</Version>
1515
</PropertyGroup>
1616

1717
<PropertyGroup>

Spine/SpineObject.cs

Lines changed: 56 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -414,17 +414,29 @@ public void Update(float delta)
414414
/// <summary>
415415
/// 三角形顶点缓冲区
416416
/// </summary>
417-
protected readonly SFML.Graphics.VertexArray _triangleVertices = new(SFML.Graphics.PrimitiveType.Triangles);
417+
protected readonly SFMLVertexBuffer _triangleVertices = new(
418+
1024,
419+
SFML.Graphics.PrimitiveType.Triangles,
420+
SFML.Graphics.VertexBuffer.UsageSpecifier.Dynamic
421+
);
418422

419423
/// <summary>
420424
/// 无面积线条缓冲区
421425
/// </summary>
422-
protected readonly SFML.Graphics.VertexArray _lineVertices = new(SFML.Graphics.PrimitiveType.Lines);
426+
protected readonly SFMLVertexBuffer _lineVertices = new(
427+
1024,
428+
SFML.Graphics.PrimitiveType.Lines,
429+
SFML.Graphics.VertexBuffer.UsageSpecifier.Dynamic
430+
);
423431

424432
/// <summary>
425433
/// 有宽度线条缓冲区, 需要通过 <see cref="AddRectLine"/> 添加顶点
426434
/// </summary>
427-
protected readonly SFML.Graphics.VertexArray _rectLineVertices = new(SFML.Graphics.PrimitiveType.Quads);
435+
protected readonly SFMLVertexBuffer _rectLineVertices = new(
436+
1024,
437+
SFML.Graphics.PrimitiveType.Quads,
438+
SFML.Graphics.VertexBuffer.UsageSpecifier.Dynamic
439+
);
428440

429441
/// <summary>
430442
/// 有半径圆点临时缓存对象
@@ -459,10 +471,10 @@ protected void AddRectLine(SFML.System.Vector2f p1, SFML.System.Vector2f p2, SFM
459471
var t = new SFML.System.Vector2f(halfWidth * cosTheta, halfWidth * sinTheta);
460472
var v = new SFML.Graphics.Vertex() { Color = color };
461473

462-
v.Position = p1 + t; _rectLineVertices.Append(v);
463-
v.Position = p2 + t; _rectLineVertices.Append(v);
464-
v.Position = p2 - t; _rectLineVertices.Append(v);
465-
v.Position = p1 - t; _rectLineVertices.Append(v);
474+
v.Position = p1 + t; _rectLineVertices.AddVertex(v);
475+
v.Position = p2 + t; _rectLineVertices.AddVertex(v);
476+
v.Position = p2 - t; _rectLineVertices.AddVertex(v);
477+
v.Position = p1 - t; _rectLineVertices.AddVertex(v);
466478
}
467479

468480
/// <summary>
@@ -534,16 +546,12 @@ protected void DrawTexture(SFML.Graphics.RenderTarget target, SFML.Graphics.Rend
534546
continue;
535547
}
536548

537-
// 纹理或者混合模式发生变化则立即渲染
549+
// 纹理或者混合模式发生变化则记录状态
538550
var blendMode = slot.Blend;
539551
states.Texture ??= texture;
540552
if (states.BlendMode != blendMode || states.Texture != texture)
541553
{
542-
if (_triangleVertices.VertexCount > 0)
543-
{
544-
target.Draw(_triangleVertices, states);
545-
_triangleVertices.Clear();
546-
}
554+
_triangleVertices.AddStates(states);
547555
states.BlendMode = blendMode;
548556
states.Texture = texture;
549557
}
@@ -561,20 +569,24 @@ protected void DrawTexture(SFML.Graphics.RenderTarget target, SFML.Graphics.Rend
561569
var texW = texture.Size.X;
562570
var texH = texture.Size.Y;
563571

564-
SFML.Graphics.Vertex vt = new();
565-
vt.Color.R = (byte)(tintR * 255);
566-
vt.Color.G = (byte)(tintG * 255);
567-
vt.Color.B = (byte)(tintB * 255);
568-
vt.Color.A = (byte)(tintA * 255);
569-
570-
for (int i = 0; i < trianglesLength; i++)
572+
SFML.Graphics.Vertex vt = new()
573+
{
574+
Color = new(
575+
(byte)(tintR * 255),
576+
(byte)(tintG * 255),
577+
(byte)(tintB * 255),
578+
(byte)(tintA * 255)
579+
)
580+
};
581+
582+
for (uint i = 0; i < trianglesLength; i++)
571583
{
572584
var index = triangles[i] << 1;
573585
vt.Position.X = worldVertices[index];
574586
vt.Position.Y = worldVertices[index + 1];
575587
vt.TexCoords.X = uvs[index] * texW;
576588
vt.TexCoords.Y = uvs[index + 1] * texH;
577-
_triangleVertices.Append(vt);
589+
_triangleVertices.AddVertex(vt);
578590
}
579591

580592
clipping.ClipEnd(slot);
@@ -604,23 +616,23 @@ protected void DrawNonTexture(SFML.Graphics.RenderTarget target)
604616

605617
vt.Position.X = _worldVertices[0];
606618
vt.Position.Y = _worldVertices[1];
607-
_lineVertices.Append(vt);
619+
_lineVertices.AddVertex(vt);
608620

609621
vt.Position.X = _worldVertices[2];
610622
vt.Position.Y = _worldVertices[3];
611-
_lineVertices.Append(vt); _lineVertices.Append(vt);
623+
_lineVertices.AddVertex(vt); _lineVertices.AddVertex(vt);
612624

613625
vt.Position.X = _worldVertices[4];
614626
vt.Position.Y = _worldVertices[5];
615-
_lineVertices.Append(vt); _lineVertices.Append(vt);
627+
_lineVertices.AddVertex(vt); _lineVertices.AddVertex(vt);
616628

617629
vt.Position.X = _worldVertices[6];
618630
vt.Position.Y = _worldVertices[7];
619-
_lineVertices.Append(vt); _lineVertices.Append(vt);
631+
_lineVertices.AddVertex(vt); _lineVertices.AddVertex(vt);
620632

621633
vt.Position.X = _worldVertices[0];
622634
vt.Position.Y = _worldVertices[1];
623-
_lineVertices.Append(vt);
635+
_lineVertices.AddVertex(vt);
624636
}
625637
}
626638
}
@@ -643,19 +655,19 @@ protected void DrawNonTexture(SFML.Graphics.RenderTarget target)
643655

644656
vt.Position.X = _worldVertices[idx0];
645657
vt.Position.Y = _worldVertices[idx0 + 1];
646-
_lineVertices.Append(vt);
658+
_lineVertices.AddVertex(vt);
647659

648660
vt.Position.X = _worldVertices[idx1];
649661
vt.Position.Y = _worldVertices[idx1 + 1];
650-
_lineVertices.Append(vt); _lineVertices.Append(vt);
662+
_lineVertices.AddVertex(vt); _lineVertices.AddVertex(vt);
651663

652664
vt.Position.X = _worldVertices[idx2];
653665
vt.Position.Y = _worldVertices[idx2 + 1];
654-
_lineVertices.Append(vt); _lineVertices.Append(vt);
666+
_lineVertices.AddVertex(vt); _lineVertices.AddVertex(vt);
655667

656668
vt.Position.X = _worldVertices[idx0];
657669
vt.Position.Y = _worldVertices[idx0 + 1];
658-
_lineVertices.Append(vt);
670+
_lineVertices.AddVertex(vt);
659671
}
660672
}
661673
}
@@ -675,19 +687,19 @@ protected void DrawNonTexture(SFML.Graphics.RenderTarget target)
675687

676688
vt.Position.X = _worldVertices[0];
677689
vt.Position.Y = _worldVertices[1];
678-
_lineVertices.Append(vt);
690+
_lineVertices.AddVertex(vt);
679691

680692
for (int i = 2; i < hullLength - 1; i += 2)
681693
{
682694
vt.Position.X = _worldVertices[i];
683695
vt.Position.Y = _worldVertices[i + 1];
684-
_lineVertices.Append(vt);
685-
_lineVertices.Append(vt);
696+
_lineVertices.AddVertex(vt);
697+
_lineVertices.AddVertex(vt);
686698
}
687699

688700
vt.Position.X = _worldVertices[0];
689701
vt.Position.Y = _worldVertices[1];
690-
_lineVertices.Append(vt);
702+
_lineVertices.AddVertex(vt);
691703
}
692704
}
693705
}
@@ -718,19 +730,19 @@ protected void DrawNonTexture(SFML.Graphics.RenderTarget target)
718730

719731
vt.Position.X = _worldVertices[0];
720732
vt.Position.Y = _worldVertices[1];
721-
_lineVertices.Append(vt);
733+
_lineVertices.AddVertex(vt);
722734

723735
for (int i = 2; i < length - 1; i += 2)
724736
{
725737
vt.Position.X = _worldVertices[i];
726738
vt.Position.Y = _worldVertices[i + 1];
727-
_lineVertices.Append(vt);
728-
_lineVertices.Append(vt);
739+
_lineVertices.AddVertex(vt);
740+
_lineVertices.AddVertex(vt);
729741
}
730742

731743
vt.Position.X = _worldVertices[0];
732744
vt.Position.Y = _worldVertices[1];
733-
_lineVertices.Append(vt);
745+
_lineVertices.AddVertex(vt);
734746
}
735747
}
736748
}
@@ -744,23 +756,23 @@ protected void DrawNonTexture(SFML.Graphics.RenderTarget target)
744756

745757
vt.Position.X = x1;
746758
vt.Position.Y = y1;
747-
_lineVertices.Append(vt);
759+
_lineVertices.AddVertex(vt);
748760

749761
vt.Position.X = x2;
750762
vt.Position.Y = y1;
751-
_lineVertices.Append(vt); _lineVertices.Append(vt);
763+
_lineVertices.AddVertex(vt); _lineVertices.AddVertex(vt);
752764

753765
vt.Position.X = x2;
754766
vt.Position.Y = y2;
755-
_lineVertices.Append(vt); _lineVertices.Append(vt);
767+
_lineVertices.AddVertex(vt); _lineVertices.AddVertex(vt);
756768

757769
vt.Position.X = x1;
758770
vt.Position.Y = y2;
759-
_lineVertices.Append(vt); _lineVertices.Append(vt);
771+
_lineVertices.AddVertex(vt); _lineVertices.AddVertex(vt);
760772

761773
vt.Position.X = x1;
762774
vt.Position.Y = y1;
763-
_lineVertices.Append(vt);
775+
_lineVertices.AddVertex(vt);
764776
}
765777

766778
// 骨骼线放最后画
@@ -937,7 +949,7 @@ public virtual int IterDrawCount
937949
vt.Position.Y = worldVertices[index + 1];
938950
vt.TexCoords.X = uvs[index] * texW;
939951
vt.TexCoords.Y = uvs[index + 1] * texH;
940-
_triangleVertices.Append(vt);
952+
_triangleVertices.AddVertex(vt);
941953
}
942954

943955
clipping.ClipEnd(slot);

0 commit comments

Comments
 (0)