diff --git a/BasLib/BasLib.csproj b/BasLib/BasLib.csproj
new file mode 100644
index 0000000..820d11d
--- /dev/null
+++ b/BasLib/BasLib.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net9.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/ParkanPlayground/BasParser.cs b/BasLib/BasParser.cs
similarity index 98%
rename from ParkanPlayground/BasParser.cs
rename to BasLib/BasParser.cs
index b7295e8..d188f92 100644
--- a/ParkanPlayground/BasParser.cs
+++ b/BasLib/BasParser.cs
@@ -1,6 +1,6 @@
using Common;
-namespace ParkanPlayground;
+namespace BasLib;
public record BasContours(InnerContour[] Inner, OuterContour[] Outer);
public record InnerContour(Vector3[] Points, uint[] Nums1, uint[] Nums2);
diff --git a/FxidLib/FxidLib.csproj b/FxidLib/FxidLib.csproj
new file mode 100644
index 0000000..568da04
--- /dev/null
+++ b/FxidLib/FxidLib.csproj
@@ -0,0 +1,14 @@
+
+
+
+ net9.0
+ enable
+ enable
+
+
+
+
+
+
+
+
diff --git a/ParkanPlayground/Effects/FxidReader.cs b/FxidLib/FxidReader.cs
similarity index 99%
rename from ParkanPlayground/Effects/FxidReader.cs
rename to FxidLib/FxidReader.cs
index 99be463..f760b41 100644
--- a/ParkanPlayground/Effects/FxidReader.cs
+++ b/FxidLib/FxidReader.cs
@@ -1,6 +1,6 @@
using Common;
-namespace ParkanPlayground.Effects;
+namespace FxidLib;
///
/// Static reader methods for parsing FXID effect definition structures from binary streams.
diff --git a/ParkanPlayground/Effects/FxidTypes.cs b/FxidLib/FxidTypes.cs
similarity index 99%
rename from ParkanPlayground/Effects/FxidTypes.cs
rename to FxidLib/FxidTypes.cs
index b0b4f70..914d8db 100644
--- a/ParkanPlayground/Effects/FxidTypes.cs
+++ b/FxidLib/FxidTypes.cs
@@ -1,6 +1,6 @@
using Common;
-namespace ParkanPlayground.Effects;
+namespace FxidLib;
///
/// Effect-level header at the start of each FXID file (60 bytes total).
diff --git a/ParkanPlayground/Msh0x01.cs b/MshLib/Msh0x01.cs
similarity index 99%
rename from ParkanPlayground/Msh0x01.cs
rename to MshLib/Msh0x01.cs
index cc04085..f2d1b21 100644
--- a/ParkanPlayground/Msh0x01.cs
+++ b/MshLib/Msh0x01.cs
@@ -1,7 +1,7 @@
using System.Buffers.Binary;
using NResLib;
-namespace ParkanPlayground;
+namespace MshLib;
///
/// MSH-компонент 0x01: таблица узлов модели.
diff --git a/ParkanPlayground/Msh0x02.cs b/MshLib/Msh0x02.cs
similarity index 99%
rename from ParkanPlayground/Msh0x02.cs
rename to MshLib/Msh0x02.cs
index 3ef3d1d..caf2e35 100644
--- a/ParkanPlayground/Msh0x02.cs
+++ b/MshLib/Msh0x02.cs
@@ -2,7 +2,7 @@
using Common;
using NResLib;
-namespace ParkanPlayground;
+namespace MshLib;
///
/// MSH-компонент 0x02: общий bounds header и таблица geometry slots.
diff --git a/ParkanPlayground/Msh0x03.cs b/MshLib/Msh0x03.cs
similarity index 98%
rename from ParkanPlayground/Msh0x03.cs
rename to MshLib/Msh0x03.cs
index 312b9b7..f0bbb6f 100644
--- a/ParkanPlayground/Msh0x03.cs
+++ b/MshLib/Msh0x03.cs
@@ -2,7 +2,7 @@ using System.Buffers.Binary;
using Common;
using NResLib;
-namespace ParkanPlayground;
+namespace MshLib;
///
/// MSH-компонент 0x03: позиции вершин
diff --git a/ParkanPlayground/Msh0x04.cs b/MshLib/Msh0x04.cs
similarity index 98%
rename from ParkanPlayground/Msh0x04.cs
rename to MshLib/Msh0x04.cs
index a27bc56..bccc58c 100644
--- a/ParkanPlayground/Msh0x04.cs
+++ b/MshLib/Msh0x04.cs
@@ -1,6 +1,6 @@
using NResLib;
-namespace ParkanPlayground;
+namespace MshLib;
///
/// MSH-компонент 0x04: упакованные нормали вершин. clamp(component / 127.0, -1..1).
diff --git a/ParkanPlayground/Msh0x05.cs b/MshLib/Msh0x05.cs
similarity index 98%
rename from ParkanPlayground/Msh0x05.cs
rename to MshLib/Msh0x05.cs
index 35c2b95..0c37534 100644
--- a/ParkanPlayground/Msh0x05.cs
+++ b/MshLib/Msh0x05.cs
@@ -1,7 +1,7 @@
using System.Buffers.Binary;
using NResLib;
-namespace ParkanPlayground;
+namespace MshLib;
///
/// MSH-компонент 0x05: упакованные UV0 (TEXCOORD0). component / 1024.0.
diff --git a/ParkanPlayground/Msh0x06.cs b/MshLib/Msh0x06.cs
similarity index 99%
rename from ParkanPlayground/Msh0x06.cs
rename to MshLib/Msh0x06.cs
index a04b299..092c9c3 100644
--- a/ParkanPlayground/Msh0x06.cs
+++ b/MshLib/Msh0x06.cs
@@ -1,7 +1,7 @@
using System.Buffers.Binary;
using NResLib;
-namespace ParkanPlayground;
+namespace MshLib;
///
/// MSH-компонент 0x06: индексный буфер.
diff --git a/ParkanPlayground/Msh0x07.cs b/MshLib/Msh0x07.cs
similarity index 99%
rename from ParkanPlayground/Msh0x07.cs
rename to MshLib/Msh0x07.cs
index 325fa65..c447467 100644
--- a/ParkanPlayground/Msh0x07.cs
+++ b/MshLib/Msh0x07.cs
@@ -2,7 +2,7 @@
using Common;
using NResLib;
-namespace ParkanPlayground;
+namespace MshLib;
///
/// MSH-компонент 0x07: triangle descriptors.
diff --git a/ParkanPlayground/Msh0x08.cs b/MshLib/Msh0x08.cs
similarity index 94%
rename from ParkanPlayground/Msh0x08.cs
rename to MshLib/Msh0x08.cs
index 7666853..44ed397 100644
--- a/ParkanPlayground/Msh0x08.cs
+++ b/MshLib/Msh0x08.cs
@@ -1,8 +1,7 @@
-using System.Buffers.Binary;
-using Common;
+using Common;
using NResLib;
-namespace ParkanPlayground;
+namespace MshLib;
public static class Msh0x08
{
diff --git a/ParkanPlayground/Msh0x0A.cs b/MshLib/Msh0x0A.cs
similarity index 98%
rename from ParkanPlayground/Msh0x0A.cs
rename to MshLib/Msh0x0A.cs
index 15b077b..42a3ae3 100644
--- a/ParkanPlayground/Msh0x0A.cs
+++ b/MshLib/Msh0x0A.cs
@@ -2,7 +2,7 @@
using System.Text;
using NResLib;
-namespace ParkanPlayground;
+namespace MshLib;
///
/// MSH-компонент 0x0A: строки узлов.
diff --git a/ParkanPlayground/Msh0x0D.cs b/MshLib/Msh0x0D.cs
similarity index 99%
rename from ParkanPlayground/Msh0x0D.cs
rename to MshLib/Msh0x0D.cs
index 2317050..80e9433 100644
--- a/ParkanPlayground/Msh0x0D.cs
+++ b/MshLib/Msh0x0D.cs
@@ -1,7 +1,7 @@
using System.Buffers.Binary;
using NResLib;
-namespace ParkanPlayground;
+namespace MshLib;
///
/// MSH-компонент 0x0D: таблица render/intersection batches.
diff --git a/ParkanPlayground/Msh0x14.cs b/MshLib/Msh0x14.cs
similarity index 99%
rename from ParkanPlayground/Msh0x14.cs
rename to MshLib/Msh0x14.cs
index b694a5b..8427ac3 100644
--- a/ParkanPlayground/Msh0x14.cs
+++ b/MshLib/Msh0x14.cs
@@ -2,7 +2,7 @@
using System.Numerics;
using NResLib;
-namespace ParkanPlayground;
+namespace MshLib;
///
/// MSH-компонент 0x14: таблица локальных directional/probe light entries.
diff --git a/ParkanPlayground/Msh0x15.cs b/MshLib/Msh0x15.cs
similarity index 99%
rename from ParkanPlayground/Msh0x15.cs
rename to MshLib/Msh0x15.cs
index 121796e..5e6372b 100644
--- a/ParkanPlayground/Msh0x15.cs
+++ b/MshLib/Msh0x15.cs
@@ -1,7 +1,7 @@
using System.Buffers.Binary;
using NResLib;
-namespace ParkanPlayground;
+namespace MshLib;
///
/// MSH-компонент 0x15: terrain-таблица треугольников
diff --git a/ParkanPlayground/MshConverter.cs b/MshLib/MshConverter.cs
similarity index 99%
rename from ParkanPlayground/MshConverter.cs
rename to MshLib/MshConverter.cs
index 352cc08..46aab0b 100644
--- a/ParkanPlayground/MshConverter.cs
+++ b/MshLib/MshConverter.cs
@@ -2,7 +2,7 @@ using System.Text;
using Common;
using NResLib;
-namespace ParkanPlayground;
+namespace MshLib;
public enum MshType
{
diff --git a/MshLib/MshLib.csproj b/MshLib/MshLib.csproj
new file mode 100644
index 0000000..568da04
--- /dev/null
+++ b/MshLib/MshLib.csproj
@@ -0,0 +1,14 @@
+
+
+
+ net9.0
+ enable
+ enable
+
+
+
+
+
+
+
+
diff --git a/ParkanPlayground/README_MSH.md b/MshLib/README.md
similarity index 94%
rename from ParkanPlayground/README_MSH.md
rename to MshLib/README.md
index d8947f0..426f586 100644
--- a/ParkanPlayground/README_MSH.md
+++ b/MshLib/README.md
@@ -1,4 +1,6 @@
-Допустим, игровой объект — **танк/бот с башней, пушкой и ракетницей**.
+## Из RE
+
+Допустим, игровой объект — **танк/бот с башней, пушкой и ракетницей**.
```text
CAniMesh of TankObject
@@ -74,8 +76,8 @@ load_id группирует pieces по исходному .msh,
## Вывод
По сути получается, что .msh это набор деталей.
-CAniMesh всегда имеет 1 root модель и может иметь "приклееные" детали.
-При этом он самостоятельно выполняет перепривязку "приклееных" деталей.
+CAniMesh всегда имеет 1 root модель и может иметь "приклееные" детали.
+При этом он самостоятельно выполняет перепривязку "приклееных" деталей.
Например, если "приклеиваемая" модель имеет 2 детали с каким-то parent, то
CAniMesh сдвинет их parent так, чтобы указывать в нужное место.
diff --git a/ParkanPlayground/CAniMesh.md b/MshLib/docs/CAniMesh.md
similarity index 100%
rename from ParkanPlayground/CAniMesh.md
rename to MshLib/docs/CAniMesh.md
diff --git a/ParkanPlayground/MSH_FORMAT.md b/MshLib/docs/MSH_FORMAT.md
similarity index 100%
rename from ParkanPlayground/MSH_FORMAT.md
rename to MshLib/docs/MSH_FORMAT.md
diff --git a/ParkanPlayground.slnx b/ParkanPlayground.slnx
index 1648a45..449019b 100644
--- a/ParkanPlayground.slnx
+++ b/ParkanPlayground.slnx
@@ -4,16 +4,19 @@
-
-
-
+
+
+
+
+
+
-
+
-
+
diff --git a/ParkanPlayground/ParkanPlayground.csproj b/ParkanPlayground/ParkanPlayground.csproj
index ae934d4..450b9b3 100644
--- a/ParkanPlayground/ParkanPlayground.csproj
+++ b/ParkanPlayground/ParkanPlayground.csproj
@@ -6,6 +6,7 @@
+
@@ -19,4 +20,8 @@
+
+
+
+
diff --git a/ParkanPlayground/Program.cs b/ParkanPlayground/Program.cs
index 283cea7..d8d9dcb 100644
--- a/ParkanPlayground/Program.cs
+++ b/ParkanPlayground/Program.cs
@@ -1,5 +1,5 @@
using Common;
-using ParkanPlayground;
+using MshLib;
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);