MeshDataTool
Рабочая копия треугольной поверхности со связями вершин, рёбер и граней.
MeshDataTool — собственный RefCounted, не Mesh и не Entity. CreateFromSurface читает одну Triangles-поверхность ArrayMesh и строит локальные связи по индексам. Совпадающие позиции с разными vertex indices не объединяются. UV/normal seams поэтому могут оставаться топологическими разрывами. Освобождайте свой tool через Dispose.
using var source = new ArrayMesh();
using var arrays = new Reckfell.Collections.Array();
arrays.Resize((int)Mesh.ArrayType.Max);
arrays[(int)Mesh.ArrayType.Vertex] = new Vector3[] {
Vector3.Zero, new Vector3(1, 0, 0), new Vector3(0, 1, 0)
};
source.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, arrays);
using var edit = new MeshDataTool();
if (edit.CreateFromSurface(source, 0) != Error.Ok)
throw new System.InvalidOperationException("Cannot read surface");
edit.SetVertex(0, new Vector3(0, 0, 1));
using var output = new ArrayMesh();
if (edit.CommitToSurface(output) != Error.Ok)
throw new System.InvalidOperationException("Cannot commit surface");Редактирование tool не меняет исходный Mesh. CommitToSurface добавляет новую поверхность в переданный ArrayMesh, не заменяя исходную; для безопасного получения отдельного результата используйте новый ArrayMesh. Чтобы отобразить его, затем назначьте результат нужному MeshInstance3D. В примере новые normals/UV намеренно не создаются автоматически: после изменения геометрии подготовьте нужные данные отдельно.
Vertex/edge/face ID — локальные индексы текущего импорта. У грани три угла и три ребра, у ребра два vertex endpoints. GetEdgeFaces может вернуть одну, две или больше граней: наличие связей не подтверждает manifold-меш. Сами методы не добавляют и не удаляют вершины/грани. Clear или новый импорт сбрасывают IDs/метаданные.
SetVertex меняет позицию, но не пересчитывает сохранённые vertex normals/tangents, UV и skin weights. GetFaceNormal вычисляется из текущих трёх позиций и может измениться немедленно. Setter атрибута включает канал всей поверхности: для нового канала заполните значения всех вершин. Bone/weight-пары здесь фиксированы на четыре значения; восемь влияний не поддержаны как корректный roundtrip.
Метаданные Vertex/Edge/Face живут только в tool и не сохраняются в committed-поверхности. Material — общая ссылка. Commit не переносит custom-каналы, blend shapes и LOD исходной поверхности; это не универсальное редактирование imported mesh без потерь. Предварительно проверьте используемые каналы.
Общий набор 34 Windows headless-проверок MeshDataTool/TriangleMesh использовал ArrayMesh CPU-хранилище, а не изображение GPU. Проверены topology, изменения атрибутов, append commit/reimport, metadata lifetime и BVH. Видимый рендер, деформация скелета, произвольная топология, custom/blend/LOD сохранность и производительность не подтверждены.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
MeshDataToolКонструктор
public MeshDataTool();Создаёт собственный RefCounted с нулевыми counts/format и без material. Перед доступом по индексам импортируйте Triangles surface.
Методы41
Clearvoid
public void Clear();Удаляет рабочие вершины, рёбра, грани и их metadata; сбрасывает material/format. Исходный Mesh не изменяется.
CommitToSurface2 перегрузки
public Error CommitToSurface(ArrayMesh mesh);Добавляет Triangles surface к mesh и назначает текущий material. Не заменяет старую surface и не очищает tool. Metadata/custom/blend shapes/LOD не сериализуются этим методом; bone/weight-каналы фиксированы на 4. Error.Ok не подтверждает визуальную корректность или сохранность неподдерживаемых каналов.
| Имя | Тип | По умолчанию |
|---|---|---|
mesh | ArrayMesh | — |
meshНепустой ArrayMesh назначения; метод добавит поверхность, не заменит существующую.
ErrorError результата wrapper; проверяйте свежую surface и журнал отдельно, не считайте Ok визуальной проверкой.
public Error CommitToSurface(ArrayMesh mesh, ulong compressionFlags = 0);Добавляет Triangles surface к mesh и назначает текущий material. Не заменяет старую surface и не очищает tool. Metadata/custom/blend shapes/LOD не сериализуются этим методом; bone/weight-каналы фиксированы на 4. Error.Ok не подтверждает визуальную корректность или сохранность неподдерживаемых каналов.
| Имя | Тип | По умолчанию |
|---|---|---|
mesh | ArrayMesh | — |
compressionFlags | ulong | 0 |
meshНепустой ArrayMesh назначения; метод добавит поверхность, не заменит существующую.
compressionFlagsulong-флаги поверхности/сжатия для AddSurfaceFromArrays, по умолчанию 0. Не преобразуют неподдерживаемые каналы автоматически.
ErrorError результата wrapper; проверяйте свежую surface и журнал отдельно, не считайте Ok визуальной проверкой.
CreateFromSurfaceError
public Error CreateFromSurface(ArrayMesh mesh, int surface);Читает одну Triangles surface из ArrayMesh, проверяя непустые vertices, кратность индексов трём и диапазон индексов. Без INDEX использует последовательные индексы, не weld по позициям. Успешный импорт заменяет состояние/material; старые IDs не используйте. Не валидирует произвольную manifold-топологию и все длины каналов.
| Имя | Тип | По умолчанию |
|---|---|---|
mesh | ArrayMesh | — |
surface | int | — |
meshНепустой ArrayMesh с существующей Triangles surface для импорта.
surfaceСуществующий индекс surface исходного ArrayMesh.
ErrorError.Ok при принятом импорте; ошибка не является доказательством проверки произвольных каналов.
GetEdgeCountint
public int GetEdgeCount();Число уникальных неориентированных пар vertex indices. Совпадающие позиции с разными индексами не объединяют рёбра.
intНеотрицательное число элементов текущего импорта.
GetEdgeFacesint[]
public int[] GetEdgeFaces(int idx);Возвращает face IDs, использующие ребро. Одна грань обычно граница, две общий край; больше двух возможно и не запрещено как nonmanifold.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxЛокальный edge ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
int[]Новый managed-массив данных/локальных IDs; изменение копии не меняет tool.
GetEdgeMetaVariant
public Variant GetEdgeMeta(int idx);Читает служебный Variant текущего элемента. Nil допустим и не означает только ошибку. Это tool-local metadata, не сохранённое поле поверхности.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxЛокальный edge ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
VariantПринадлежащий вызывающему Variant; Nil допустим. Освободите Variant после использования.
GetEdgeVertexint
public int GetEdgeVertex(int idx, int vertex);Возвращает один из двух vertex IDs ребра. Пара хранится по возрастанию индексов, не по направлению обхода грани.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
vertex | int | — |
idxЛокальный edge ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
vertexНомер конца ребра 0 или 1, не vertex ID.
intЛокальный vertex/edge ID, -1 при диагностике неверного индекса.
GetFaceCountint
public int GetFaceCount();Число треугольных граней, не число индексов.
intНеотрицательное число элементов текущего импорта.
GetFaceEdgeint
public int GetFaceEdge(int idx, int edge);Возвращает edge ID между локальным углом edge и (edge+1)%3. Направление endpoints самого ребра каноническое, не обязательно совпадает с гранью.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
edge | int | — |
idxЛокальный edge ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
edgeЛокальное ребро грани 0…2, не глобальный edge ID.
intЛокальный vertex/edge ID, -1 при диагностике неверного индекса.
GetFaceMetaVariant
public Variant GetFaceMeta(int idx);Читает служебный Variant текущего элемента. Nil допустим и не означает только ошибку. Это tool-local metadata, не сохранённое поле поверхности.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxЛокальный face ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
VariantПринадлежащий вызывающему Variant; Nil допустим. Освободите Variant после использования.
GetFaceNormalVector3
public Vector3 GetFaceNormal(int idx);Вычисляет единичную нормаль Plane из текущих позиций трёх углов. Не читает сохранённые vertex normals и не обновляет их. Вырожденная грань не даёт надёжного направления.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxЛокальный face ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
Vector3Геометрическая normal текущих позиций; не сохранённая vertex normal.
GetFaceVertexint
public int GetFaceVertex(int idx, int vertex);Возвращает vertex ID локального угла 0…2 в исходном порядке индексов треугольника.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
vertex | int | — |
idxЛокальный face ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
vertexЛокальный угол грани 0…2, не vertex ID.
intЛокальный vertex/edge ID, -1 при диагностике неверного индекса.
GetFormatulong
public ulong GetFormat();Возвращает ulong-маску импортированных/добавленных каналов. Не подтверждает, что Commit сохраняет каждый source-format bit: custom и 8-weight данные не имеют полного roundtrip.
ulongulong-битовая маска каналов; 0 у нового/очищенного tool.
GetMaterialMaterial
public Material GetMaterial();Возвращает общий Material текущей surface либо null. Не самостоятельная копия: не освобождайте полученный алиас, пока его использует владелец.
MaterialОбщий Material либо null; не копия.
GetVertexVector3
public Vector3 GetVertex(int idx);Читает позицию vertex record. Это рабочие данные, не преобразованные в world space.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
Vector3Текущее значение локального атрибута вершины; диагностический fallback не подтверждает корректный индекс.
GetVertexBonesint[]
public int[] GetVertexBones(int idx);Читает четыре bone indices vertex record. Возвращает отдельный managed-массив; его изменение не меняет tool.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
int[]Новый managed-массив данных/локальных IDs; изменение копии не меняет tool.
GetVertexColorColor
public Color GetVertexColor(int idx);Читает цвет vertex record. Это рабочие данные, не преобразованные в world space.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
ColorТекущее значение локального атрибута вершины; диагностический fallback не подтверждает корректный индекс.
GetVertexCountint
public int GetVertexCount();Число vertex records текущего импорта, не уникальных позиций.
intНеотрицательное число элементов текущего импорта.
GetVertexEdgesint[]
public int[] GetVertexEdges(int idx);Возвращает копию локальных edge IDs, инцидентных vertex record. Не обход всей связной компоненты.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxЛокальный edge ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
int[]Новый managed-массив данных/локальных IDs; изменение копии не меняет tool.
GetVertexFacesint[]
public int[] GetVertexFaces(int idx);Возвращает копию face IDs, содержащих vertex record. Не объединяет vertices по координатам.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxЛокальный face ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
int[]Новый managed-массив данных/локальных IDs; изменение копии не меняет tool.
GetVertexMetaVariant
public Variant GetVertexMeta(int idx);Читает служебный Variant текущего элемента. Nil допустим и не означает только ошибку. Это tool-local metadata, не сохранённое поле поверхности.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
VariantПринадлежащий вызывающему Variant; Nil допустим. Освободите Variant после использования.
GetVertexNormalVector3
public Vector3 GetVertexNormal(int idx);Читает сохранённую нормаль vertex record. Это рабочие данные, не преобразованные в world space.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
Vector3Текущее значение локального атрибута вершины; диагностический fallback не подтверждает корректный индекс.
GetVertexTangentPlane
public Plane GetVertexTangent(int idx);Читает тангенс в Plane (Normal=xyz, D=handedness) vertex record. Это рабочие данные, не преобразованные в world space.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
PlaneТекущее значение локального атрибута вершины; диагностический fallback не подтверждает корректный индекс.
GetVertexUVVector2
public Vector2 GetVertexUV(int idx);Читает первый UV vertex record. Это рабочие данные, не преобразованные в world space.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
Vector2Текущее значение локального атрибута вершины; диагностический fallback не подтверждает корректный индекс.
GetVertexUV2Vector2
public Vector2 GetVertexUV2(int idx);Читает второй UV vertex record. Это рабочие данные, не преобразованные в world space.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
Vector2Текущее значение локального атрибута вершины; диагностический fallback не подтверждает корректный индекс.
GetVertexWeightsfloat[]
public float[] GetVertexWeights(int idx);Читает четыре веса vertex record. Возвращает отдельный managed-массив; его изменение не меняет tool.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
float[]Новый managed-массив данных/локальных IDs; изменение копии не меняет tool.
SetEdgeMetavoid
public void SetEdgeMeta(int idx, Variant meta);Сохраняет Variant элемента только в tool. Контейнеры Variant не клонируются глубоко; Commit не сохраняет metadata, Clear/новый импорт её удаляет.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
meta | Variant | — |
idxЛокальный edge ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
metaVariant служебных данных; shared-контейнеры при необходимости копируйте явно.
SetFaceMetavoid
public void SetFaceMeta(int idx, Variant meta);Сохраняет Variant элемента только в tool. Контейнеры Variant не клонируются глубоко; Commit не сохраняет metadata, Clear/новый импорт её удаляет.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
meta | Variant | — |
idxЛокальный face ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
metaVariant служебных данных; shared-контейнеры при необходимости копируйте явно.
SetMaterialvoid
public void SetMaterial(Material material);Сохраняет общую ссылку для следующего CommitToSurface. Не меняет материал исходного Mesh немедленно. null снимает выбранный material.
| Имя | Тип | По умолчанию |
|---|---|---|
material | Material | — |
materialОбщий Material либо null для следующего Commit, не немедленная правка source mesh.
SetVertexvoid
public void SetVertex(int idx, Vector3 vertex);Записывает позицию vertex record. Не пересчитывает normals/tangents, UV, bounds исходного Mesh или topology.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
vertex | Vector3 | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
vertexНовая локальная позиция вершины.
SetVertexBones2 перегрузки
public void SetVertexBones(int idx, int[] bones);Записывает четыре bone indices vertex record. Требует ровно 4 значения и включает канал. При первом добавлении подготовьте парные bones/weights всех вершин; нормализация не выполняется.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
bones | int[] | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
bonesРовно четыре индекса костей; подготовьте соответствующие четыре weights.
public void SetVertexBones(int idx, ReadOnlySpan<int> bones);Записывает четыре bone indices vertex record. Требует ровно 4 значения и включает канал. При первом добавлении подготовьте парные bones/weights всех вершин; нормализация не выполняется.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
bones | ReadOnlySpan<int> | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
bonesРовно четыре индекса костей; подготовьте соответствующие четыре weights.
SetVertexColorvoid
public void SetVertexColor(int idx, Color color);Записывает цвет vertex record. Включает канал поверхности; заполните все вершины. Не выполняет автоматическую генерацию согласованных остальных атрибутов.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
color | Color | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
colorVertex color; материал должен использовать этот канал.
SetVertexMetavoid
public void SetVertexMeta(int idx, Variant meta);Сохраняет Variant элемента только в tool. Контейнеры Variant не клонируются глубоко; Commit не сохраняет metadata, Clear/новый импорт её удаляет.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
meta | Variant | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
metaVariant служебных данных; shared-контейнеры при необходимости копируйте явно.
SetVertexNormalvoid
public void SetVertexNormal(int idx, Vector3 normal);Записывает сохранённую нормаль vertex record. Включает канал поверхности; заполните все вершины. Не выполняет автоматическую генерацию согласованных остальных атрибутов.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
normal | Vector3 | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
normalЕдиничная локальная vertex normal; setter не нормализует её автоматически.
SetVertexTangentvoid
public void SetVertexTangent(int idx, Plane tangent);Записывает тангенс в Plane (Normal=xyz, D=handedness) vertex record. Включает канал поверхности; заполните все вершины. Не выполняет автоматическую генерацию согласованных остальных атрибутов.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
tangent | Plane | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
tangentPlane: Normal содержит tangent xyz, D — handedness, обычно ±1.
SetVertexUVvoid
public void SetVertexUV(int idx, Vector2 uV);Записывает первый UV vertex record. Включает канал поверхности; заполните все вершины. Не выполняет автоматическую генерацию согласованных остальных атрибутов.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
uV | Vector2 | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
uVЗначение соответствующего UV-канала, не позиция вершины.
SetVertexUV2void
public void SetVertexUV2(int idx, Vector2 uV2);Записывает второй UV vertex record. Включает канал поверхности; заполните все вершины. Не выполняет автоматическую генерацию согласованных остальных атрибутов.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
uV2 | Vector2 | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
uV2Значение соответствующего UV-канала, не позиция вершины.
SetVertexWeights2 перегрузки
public void SetVertexWeights(int idx, ReadOnlySpan<float> weights);Записывает четыре веса vertex record. Требует ровно 4 значения и включает канал. При первом добавлении подготовьте парные bones/weights всех вершин; нормализация не выполняется.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
weights | ReadOnlySpan<float> | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
weightsРовно четыре неотрицательных нормализованных веса; автоматической нормализации нет.
public void SetVertexWeights(int idx, float[] weights);Записывает четыре веса vertex record. Требует ровно 4 значения и включает канал. При первом добавлении подготовьте парные bones/weights всех вершин; нормализация не выполняется.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
weights | float[] | — |
idxЛокальный vertex ID: 0 ≤ idx < соответствующего Count. Не ID Entity/ресурса.
weightsРовно четыре неотрицательных нормализованных веса; автоматической нормализации нет.