ImmediateMesh
Последовательная сборка небольших неиндексированных поверхностей Mesh.
ImmediateMesh — ресурс Mesh, не команда рисования поверх кадра и не Entity. SurfaceBegin начинает одну поверхность, SurfaceAddVertex добавляет углы, SurfaceEnd публикует готовую поверхность. Для показа назначьте ресурс MeshInstance3D.Mesh и разместите экземпляр в дереве. Геометрия сохраняется между кадрами: повторный Begin/End добавляет ещё одну поверхность, а не заменяет предыдущую.
using var mesh = new ImmediateMesh();
mesh.SurfaceBegin(Mesh.PrimitiveType.Lines);
mesh.SurfaceSetColor(new Color(1, 0, 0));
mesh.SurfaceAddVertex(new Vector3(0, 0, 2));
mesh.SurfaceAddVertex(new Vector3(1, 0, 2));
mesh.SurfaceEnd();
int surfaceCount = mesh.GetSurfaceCount(); // 1Пример создаёт данные линии без видимого объекта. При назначении mesh экземпляру сохраняйте ресурс живым на всё время использования; не завершайте его using раньше. Для видимого цвета нужен материал, использующий vertex color, например StandardMaterial3D с VertexColorUseAsAlbedo = true. Сам SurfaceSetColor материал не настраивает. Unshaded-материал подходит для диагностических линий без зависимости от света. Толщина линии в пикселях этим API не задаётся.
Порядок работы: Begin → необязательные setters атрибутов → добавление вершин → End. Одновременно открыта только одна поверхность. End без вершин отклоняется и не закрывает сборку. Для Lines добавляйте пары, для Triangles — тройки углов; индексов, bones/weights, custom-каналов, blend shapes и LOD этот builder не создаёт. Большую повторяющуюся геометрию удобнее подготовить через ArrayMesh или SurfaceTool, а не пересобирать здесь каждый кадр.
Атрибуты запоминаются для следующих вершин. Первый вызов setter также заполняет уже добавленные вершины текущей поверхности этим значением. Следующий вызов меняет только будущие вершины. Это отличается от SurfaceTool: канал можно включить после первой вершины. После успешного End признаки каналов сбрасываются — задавайте нужные атрибуты заново при каждом Begin. Color хранится в 8 бит на канал: значения ограничиваются диапазоном 0…1 и квантуются. Normals/tangents упаковываются, поэтому чтение не обязано дать побитово исходные float.
SurfaceAddVertex2D задаёт Vector2 в буфере mesh; он не создаёт CanvasItem и не переключает сцену в 2D. В одной поверхности нельзя смешивать 2D и 3D. SurfaceEnd сбрасывает размерность для следующей поверхности. Известный дефект версии 1.0.0: ClearSurfaces во время незавершённой 2D-сборки не сбрасывает её размерность. Следующий первый Vector3 теряет Z, дальнейший Vector3 отклоняется. После такого прерывания создайте новый ImmediateMesh; повторный ClearSurfaces дефект не устраняет.
SurfaceEnd отправляет Changed, а ClearSurfaces — нет. Если зависимый код ждёт уведомление после очистки, отправьте EmitChanged явно. ClearSurfaces удаляет все готовые поверхности и отменяет текущую сборку. Полученные SurfaceGetArrays — снимок данных, не live-редактор. Формат и число вершин можно проверять по этим массивам; не переносите C++-виртуальные SurfaceGetArrayLen/SurfaceGetFormat в C# — этих публичных методов здесь нет.
Для треугольников подготовьте normals и UV самостоятельно. Если заданы normals без tangents, движок создаёт вспомогательный tangent из normal, не из UV-развёртки. Для normal mapping задайте согласованные tangents или используйте SurfaceTool.GenerateTangents. SurfaceSetUV2 только записывает координаты, не разворачивает геометрию и не запекает свет.
17 Windows headless-проверок подтвердили CPU-данные и воспроизвели дефект размерности. Полный native-прогон отмечен неуспешным из-за диагностического сообщения в этом сценарии, хотя его ожидаемое поведение зафиксировано. Видимая отрисовка, normal mapping, произвольная геометрия и производительность не подтверждены; движок не исправлялся.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
ImmediateMeshКонструктор
public ImmediateMesh();Создаёт собственный пустой Mesh с RID. Для отображения нужен потребитель, например MeshInstance3D. Освобождайте после завершения использования, не как временный объект одного вызова рисования.
Методы10
ClearSurfacesvoid
public void ClearSurfaces();Удаляет готовые поверхности и отменяет текущую сборку, очищает вершины/каналы. Не отправляет Changed. Дефект: после прерванной 2D-сборки vertex_2d сохраняется; для следующей 3D-сборки используйте новый ImmediateMesh.
SurfaceAddVertexvoid
public void SurfaceAddVertex(Vector3 vertex);Добавляет локальный 3D-угол с текущими атрибутами в активную поверхность. Не индексирует и не объединяет одинаковые позиции. Нельзя смешивать с 2D в одной поверхности.
| Имя | Тип | По умолчанию |
|---|---|---|
vertex | Vector3 | — |
vertexЛокальная конечная Vector3-позиция; выберите 3D для всей поверхности.
SurfaceAddVertex2Dvoid
public void SurfaceAddVertex2D(Vector2 vertex);Добавляет локальный 2D-угол в mesh-буфер с текущими атрибутами. Это не CanvasItem-отрисовка. Нельзя смешивать с 3D; после прерывания такой сборки через ClearSurfaces создайте новый ресурс.
| Имя | Тип | По умолчанию |
|---|---|---|
vertex | Vector2 | — |
vertexЛокальная позиция Vector2; выберите 2D для всей поверхности.
SurfaceBeginvoid
public void SurfaceBegin(Mesh.PrimitiveType primitive, Material material = null);Открывает новую поверхность, задаёт primitive и общий material. Не очищает готовые поверхности. Повторный Begin при открытой сборке отклоняется; setters и добавление вершин разрешены после Begin.
| Имя | Тип | По умолчанию |
|---|---|---|
primitive | Mesh.PrimitiveType | — |
material | Material | null |
primitiveСпособ сборки: пары для Lines, тройки для Triangles. Проверяйте кратность числа углов сами.
materialОбщий Material либо null. Vertex colors требуют соответствующей настройки материала; ссылка сохраняется в готовой поверхности.
SurfaceEndvoid
public void SurfaceEnd();Публикует непустую активную поверхность, сбрасывает временные каналы/размерность и отправляет Changed. Пустая поверхность отклоняется без закрытия сборки. Не генерирует UV или геометрические normals.
SurfaceSetColorvoid
public void SurfaceSetColor(Color color);Задаёт цвет будущих вершин. Первый вызов также заполняет ранее добавленные вершины текущей поверхности. Хранится как clamped RGBA8; материал должен использовать vertex color.
| Имя | Тип | По умолчанию |
|---|---|---|
color | Color | — |
colorRGBA; при публикации каждый компонент ограничивается 0…1 и квантуется в 8 бит.
SurfaceSetNormalvoid
public void SurfaceSetNormal(Vector3 normal);Задаёт normal будущих вершин; первый вызов заполняет предыдущие. Передавайте единичную normal. Без tangents создаётся вспомогательный tangent из normal, не UV-производная для корректного normal mapping.
| Имя | Тип | По умолчанию |
|---|---|---|
normal | Vector3 | — |
normalЕдиничная локальная normal для нужного освещения; направление упаковывается.
SurfaceSetTangentvoid
public void SurfaceSetTangent(Plane tangent);Задаёт tangent будущих вершин; первый вызов заполняет предыдущие. Plane.Normal хранит направление, D — handedness. Не геометрическая плоскость. Подготовьте согласованные normal и UV.
| Имя | Тип | По умолчанию |
|---|---|---|
tangent | Plane | — |
tangentPlane с единичным tangent xyz в Normal и handedness ±1 в D, согласованный с normal/UV.
SurfaceSetUVvoid
public void SurfaceSetUV(Vector2 uV);Задаёт UV будущих вершин; первый вызов заполняет предыдущие. Ничего не разворачивает автоматически. Координаты действуют только при использовании материала/шейдера соответствующего канала.
| Имя | Тип | По умолчанию |
|---|---|---|
uV | Vector2 | — |
uVЛокальные UV текстуры; обычно 0…1, но повторение зависит от материала/самплера.
SurfaceSetUV2void
public void SurfaceSetUV2(Vector2 uV2);Задаёт второй UV-канал с тем же правилом первого заполнения/последующих вершин. Не создаёт lightmap-развёртку и не запекает освещение.
| Имя | Тип | По умолчанию |
|---|---|---|
uV2 | Vector2 | — |
uV2Подготовленные координаты второго UV-канала; отсутствие overlap для lightmap метод не проверяет.