Structs: справочник структур
Структуры, которые модуль LCC4UnrealRuntime предоставляет вне себя.
| Модуль | LCC4UnrealRuntime |
| Заголовочный файл | Core/LCCStructure.h |
#include "Core/LCCStructure.h"
Структуры с пометкой BlueprintType можно разбирать и собирать в Blueprint узлами Break / Make.
Производительность
FRenderInfo
Общие параметры производительности. Используются в ULCCComponentBase::Performance.
Особенность этой структуры в том, что у каждого значения есть свой переключатель включения. Когда переключатель выключен, применяется встроенное значение по умолчанию, и только после включения используется введённое тобой значение. Соответствующий сеттер на Component автоматически устанавливает переключатель в true.
| Поле | Тип | По умолчанию | Парный переключатель | Описание |
|---|---|---|---|---|
MaxDistance | uint32 | 300 | bDistanceLimit | Максимальная дистанция рендеринга, в метрах |
MaxSplatNum | uint32 | 3000 | bMaxSplatNumLimit | Максимальное число splat на кадр, в десятках тысяч, предел 10000 |
LevelFactor | float | 1 | bCanSetLevelFactor | Коэффициент масштабирования дистанций LOD, диапазон 0.01~20 |
PreloadDistance | uint32 | 200 | bPreloadDistanceLimit | Дистанция предзагрузки. Фактическое значение равно MaxDistance + 35 |
StartLevel | uint32 | 0 | bCanSetStartLevel | Начальный Level, диапазон 0~20 |
EndLevel | uint32 | 20 | bCanSetEndLevel | Конечный Level, диапазон 0~20 |
CollisionLoadMaxDistance | uint32 | 300 | bCollisionDistanceLimit | Максимальная дистанция загрузки коллизий, в метрах |
bUseFullLoad | bool | true | bCanSetUseFullLoad | Переключатель полной загрузки для небольших сцен. При конструировании ULCC2Component переопределяется так, что переключатель включён, а значение равно false |
FullLoadSplatNum | uint32 | 1500 | bCanSetFullLoadNum | Порог полной загрузки, в десятках тысяч |
Вспомогательные методы:
bool HasMaxDistanceLimit() const; // whether a distance limit is set
bool HasMaxNumLimit() const; // whether a count limit is set
bool NeedPreload() const; // whether preloading is needed
uint32 GetMaxDistance() const; // the effective maximum distance
uint32 GetMaxSplatNum() const; // the effective maximum count
float GetLevelFactor() const; // the effective LOD factor
uint32 GetStartLevel() const; // the effective start Level
uint32 GetEndLevel() const; // the effective end Level
uint32 GetMaxCollisionDistance() const;
uint32 GetPreloadDistance() const; // returns GetMaxDistance() + 35
bool GetIfUseFullLoad(uint32 SplatNum) const; // whether a given count goes through full load
void Reset(); // resets only the value fields, not the enable switches
Два места, где легко ошибиться:
Reset()сбрасывает только поля значений (дистанцию, количество, Level, коэффициент) и не сбрасывает ни один переключательb*, а также не сбрасываетbUseFullLoadиFullLoadSplatNum.FRenderInfo::GetPreloadDistance()возвращаетGetMaxDistance() + 35, а одноимённая функция компонентаULCCComponentBase::GetPreloadDistance()возвращает исходное значение поля. Результаты у них разные.
Геттеры возвращают действующее значение: при выключенном переключателе возвращается встроенное значение по умолчанию, а не то, что ты вводил ранее. Это легко перепутать, поэтому чтение поля напрямую и вызов геттера могут дать разный результат.
Замечания по применению:
- Проще всего менять значения через сеттеры на Component, тогда переключателями управлять вручную не нужно.
- При прямом изменении полей структуры не забудь одновременно установить переключатель в
true, иначе значение не подействует.
// Recommended: use the setter, the switch is handled automatically
Component->SetMaxDistance(200);
// When changing the field directly you have to turn the switch on yourself
Component->Performance.bDistanceLimit = true;
Component->Performance.MaxDistance = 200;
FLCCRenderInfo
Параметры производительности, специфичные для LCC1. Используются в ULCCComponent::LCCPerformance.
| Поле | Тип | По умолчанию | Парный переключатель | Описание |
|---|---|---|---|---|
SortFactor | float | 1 | bCanSetSortFactor | Коэффициент масштабирования частоты сортировки, диапазон 0.2~5. Чем больше значение, тем реже сортировка и выше производительность |
bAddExtraPreNodes | bool | Определяется макросом | bEnableExtraPreNodes | Добавляет дополнительные узлы предзагрузки, что уменьшает пустоты у края экрана при быстром повороте обзора |
Вспомогательные методы:
float GetSortFactor() const;
bool GetIfAddExtraPreNodes() const;
void Reset();
Связанные страницы: ULCCComponent
Метаданные
FMetaInfoBase
Базовая структура метаданных, от которой наследуются FLCCMetaInfo и FLCC2MetaInfo. Тип возвращаемого значения ULCCComponentBase::GetMetaInfo.
| Поле | Тип | Описание |
|---|---|---|
Name | FString | Название данных |
Version | FString | Строка версии данных |
Description | FString | Описание |
Source | FString | Источник |
DataType | FString | Тип данных |
FileType | FString | Тип файла, соответствует EFileType |
Offset | TArray<float> | Смещение координат, 3 элемента |
Shift | TArray<float> | Величина сдвига |
Epsg | int32 | Номер системы координат EPSG; значение больше 0 означает наличие географических данных |
Scale | TArray<int> | Масштаб, 3 элемента |
GUID | FString | Уникальный идентификатор данных |
TotalLevel | int | Общее число уровней Level |
TotalSplats | int | Общее количество splat |
Splats | TArray<int> | Количество splat на каждом уровне Level |
Вспомогательные методы:
bool IsValid() const; // whether the metadata is valid
void Reset();
bool IsRTK() const; // whether it carries RTK geographic information
FVector GetOffset() const; // offset as an FVector; returns a zero vector with a warning when there are fewer than 3 elements
FVector3f GetScale(); // note: not const, and does not check the element count
EFileType GetFileType() const; // the file type enum
float GetVersion() const; // the version number as a float
uint32 GetLevel0SplatNum() const; // the splat count of Level 0, in ten thousands
Надёжность GetScale() и GetOffset() разная: GetOffset() проверяет количество элементов и при нехватке до 3 возвращает нулевой вектор и выводит предупреждение; GetScale() обращается к первым трём элементам напрямую, поэтому при менее чем 3 элементах в Scale произойдёт выход за границы.
IsRTK() опирается на условия Epsg > 0 и ненулевое смещение, то есть смотрит только на сами данные. Он не равнозначен CanUseGeoPlace(): последний дополнительно требует, чтобы bEnableGeoPlace был включён и географическая система отсчёта была создана.
Замечания по применению:
- Читай метаданные только после завершения загрузки: до готовности все поля содержат нулевые значения.
TotalSplats— это общее количество в данных. МетодULCCComponentBase::GetSplatNumber()возвращает именно это поле, значение у них одно и то же.
if (Component->CheckIfLoaded())
{
const FMetaInfoBase Meta = Component->GetMetaInfo();
UE_LOG(LogTemp, Log, TEXT("Name: %s"), *Meta.Name);
UE_LOG(LogTemp, Log, TEXT("Levels: %d, total splats: %d"),
Meta.TotalLevel, Meta.TotalSplats);
UE_LOG(LogTemp, Log, TEXT("Level 0 splats: %u (ten thousand)"),
Meta.GetLevel0SplatNum());
UE_LOG(LogTemp, Log, TEXT("Has SH: %s"),
Meta.GetFileType() == EFileType::Quality ? TEXT("yes") : TEXT("no"));
if (Meta.IsRTK())
{
UE_LOG(LogTemp, Log, TEXT("EPSG: %d, offset: %s"),
Meta.Epsg, *Meta.GetOffset().ToString());
}
}
Текстовое описание Blueprint:
[Get Meta Info]
Target = (LCC Component)
│ Return Value ──┐
▼ │
[Break FMetaInfoBase] ◀──┘
Name → [Print String]
Total Splats → [Print String]
Total Level → [Print String]
FLCCMetaInfo
Полные метаданные LCC1, наследует FMetaInfoBase.
| Дополнительное поле | Тип | Описание |
|---|---|---|
CellLengthX | float | Размер ячейки сетки по X |
CellLengthY | float | Размер ячейки сетки по Y |
Attributes | TArray<FBoundingBoxInfoWithName> | Ограничивающие боксы каждого атрибута, индексируются по имени |
IndexDataSize | int | Размер данных индекса |
Encoding | FString | Способ кодирования |
BoundingBox | FBoundingBoxInfo | Общий ограничивающий бокс |
Условие у IsValid() строже, чем у базовой структуры: TotalLevel, TotalSplats, CellLengthX, CellLengthY и IndexDataSize должны быть больше 0.
Методы, связанные с ограничивающими боксами (все возвращают FBox, только C++):
FVector2f GetCellLength() const;
int32 GetXNum() const; // the number of cells along X
int32 GetYNum() const; // the number of cells along Y
FBox GetVisibleBoundingBox() const; // the visible bounding box
FBox GetScaleBox() const;
FBox GetEnvironmentScaleBox() const;
FBox GetEnvironmentVisibleBox() const;
FBox GetShcoef() const; // the spherical harmonic value range
FBox GetEnvShcoef() const;
FBox GetNormal() const;
FBox GetEnvNormal() const;
FBox GetColor() const;
FVector2f GetOpacity() const;
FLCC2MetaInfo
Полные метаданные LCC2, наследует FMetaInfoBase. Тип возвращаемого значения ULCC2Component::GetMetaInfo2.
| Дополнительное поле | Тип | Описание |
|---|---|---|
WorkPath | FString | Путь к каталогу LCC2 |
SplatType | EDataSourceType | Формат источника данных, SOG / SPZ / PLY |
SHBands | int32 | Наибольшая степень сферических гармоник в этом дереве; 0 означает их отсутствие, значения 1/2/3 |
EnvName | int32 | Индекс файла окружения, -1 означает отсутствие |
Root | FTreeNode | Корневой узел октодерева |
Files | TArray<FString> | Список файлов данных splat |
MeshFiles | TArray<FString> | Список файлов мешей |
BVHFiles | TArray<FString> | Список файлов BVH |
Условие у IsValid() — непустой Files.
Вспомогательные методы:
FBox GetBounds() const; // the bounds of the root node, already converted to centimeters
О поле SHBands: оно определяет шаг слотов сферических гармоник, поэтому все источники данных в одном буфере гармоник должны иметь одинаковое значение. Для дерева со смешанными степенями берётся наибольшая. Одиночные форматы (.sog / .spz / .ply) читают точную степень из заголовка декодера; у LCC2 понятия степени для каждого файла нет, её определяет FileType: у Portable гармоник нет, у Quality степень равна 3.
Результат трассировки луча
FLCCSplat
Результат попадания при трассировке луча. Используется в функциях трассировки луча у ULCCComponent.
| Поле | Тип | Описание |
|---|---|---|
Location | FVector | Мировые координаты точки попадания |
NodeVector | FLCCVector | Информация об узле, которому принадлежит точка попадания |
FLCCSplat Hit;
if (LineTraceSingle(Start, End, Hit, false, 0.f, 0.f))
{
// the hit position
const FVector HitPos = Hit.Location;
// the level of detail currently loaded at that place
const int32 Level = Hit.NodeVector.Level;
}
Связанные страницы: Трассировка луча в ULCCComponent
FLCCVector
Координаты узла, задающие его положение в октодереве.
| Поле | Тип | Описание |
|---|---|---|
X | int32 | Индекс узла по X |
Y | int32 | Индекс узла по Y |
Level | int32 | Level, на котором находится узел |
Конструктор с параметрами и конструктор копирования ограничивают все три поля неотрицательными значениями, но прямое присваивание (запись полей после конструктора по умолчанию или использование operator=) такого ограничения не выполняет.
Вспомогательные методы:
FString ToString() const; // the format is "X:%i,Y:%i,Level:%i"
void Reset();
static double Dist2D(const FLCCVector& A, const FLCCVector& B);
При проверке на равенство сравниваются только X, Y и Level, а внутренние поля времени выполнения, например данные о камере, не сравниваются.
По полю Level можно понять, детальные данные видны сейчас или грубые: чем меньше значение, тем выше детальность.
Ограничивающие боксы
FBoundingBoxInfo
Информация об ограничивающем боксе.
| Поле | Тип | Описание |
|---|---|---|
Min | TArray<float> | Координаты минимальной точки |
Max | TArray<float> | Координаты максимальной точки |
FBoundingBoxInfoWithName
Ограничивающий бокс с именем, используется в списке атрибутов метаданных.
| Поле | Тип | Описание |
|---|---|---|
Name | FString | Имя атрибута |
BoundingBoxInfo | FBoundingBoxInfo | Ограничивающий бокс |
При проверке на равенство сравнивается только Name.
Метаданные SOG
Эта группа структур описывает метаданные файла .sog и выдаётся функциями разбора SOG из ULCCUtilLibrary.
FLCC2SogMeta
Главная структура метаданных SOG.
| Поле | Тип | Описание |
|---|---|---|
Version | int32 | Версия формата |
Count | int32 | Количество splat |
bAntialias | bool | Включено ли сглаживание |
Instances | FLCC2SogInstances | Список файлов экземпляров |
Means | FLCC2SogMeans | Данные положений, включая минимумы, максимумы и список файлов |
Scales | FLCC2SogScales | Данные масштабов, включая кодовую книгу из 256 элементов и список файлов |
Quats | FLCC2SogQuats | Список файлов данных поворотов |
Semantics | FLCC2SogSemantics | Список файлов семантических данных |
Sh0 | FLCC2SogSh0 | Сферические гармоники нулевой степени, включая кодовую книгу из 256 элементов и список файлов |
ShN | FLCC2SogShN | Сферические гармоники высокого порядка, включая степень, кодовую книгу, количество и список файлов |
Вспомогательные методы:
bool HasShN() const; // whether high-order spherical harmonics are present, equivalent to ShN.Files being non-empty
Замечания по применению:
- Читай их через
ParseSogMetaFromFile, не загружая данные для рендеринга: затраты невелики. - По ним можно ещё до загрузки оценить количество точек и наличие гармоник и заранее выбрать настройки качества изображения.
FLCC2SogMeta Meta;
if (ULCCUtilLibrary::ParseSogMetaFromFile(Path, Meta))
{
UE_LOG(LogTemp, Log, TEXT("Version: %d, count: %d, high-order SH: %s"),
Meta.Version, Meta.Count, Meta.HasShN() ? TEXT("yes") : TEXT("no"));
}
FLCC2SogShN
Данные сферических гармоник высокого порядка.
| Поле | Тип | Описание |
|---|---|---|
Bands | int32 | Степень сферических гармоник |
Count | int32 | Количество |
Files | TArray<FString> | Список файлов |
Codebook | TStaticArray<float, 256> | Кодовая книга квантования, в Blueprint не видна |
Вспомогательный метод: bool HasShN() const.
FLCC2SogImageData
Данные изображения SOG.
| Поле | Тип | Описание |
|---|---|---|
PixelData | TArray<uint8> | Данные пикселей в формате RGBA, 4 байта на пиксель |
Width | int32 | Ширина |
Height | int32 | Высота |
Прочие вложенные структуры
Все перечисленные структуры содержат только списки файлов, а некоторые ещё и кодовую книгу квантования:
| Структура | Поля |
|---|---|
FLCC2SogInstances | Files |
FLCC2SogSemantics | Files |
FLCC2SogQuats | Files |
FLCC2SogMeans | Mins, Maxs, Files |
FLCC2SogScales | Codebook (256 элементов), Files |
FLCC2SogSh0 | Codebook (256 элементов), Files |
Codebook имеет тип TStaticArray<float, 256>, не является UPROPERTY и в Blueprint не видна.
Узлы октодерева
Эта группа структур описывает октодерево LCC2 и относится к низкоуровневым данным: в обычной разработке работать с ними напрямую не требуется.
FTreeNode
Узел октодерева.
| Поле | Тип | Описание |
|---|---|---|
Id | FString | Идентификатор узла |
XMin / YMin / ZMin | double | Минимальная точка AABB |
XMax / YMax / ZMax | double | Максимальная точка AABB |
ChildNum | int32 | Количество дочерних узлов |
Children | TArray<FTreeNode> | Массив дочерних узлов, не UPROPERTY |
Data | FTreeNodeData | Данные узла |
Вспомогательные методы:
void ClearIterative();
Собирает все узлы в порядке обхода в ширину и очищает их в обратном порядке, что позволяет избежать переполнения стека при рекурсивном разрушении глубокого дерева. Вызывай его перед выходом FTreeNode из области видимости, если владеешь узлом вручную.
FTreeNodeData
Контейнер данных узла, где булевы поля отмечают наличие каждого вида данных.
| Поле | Тип | Описание |
|---|---|---|
bHas3DGS | bool | Есть ли данные 3DGS |
_3DGS | FTreeNodeData3DGS | Данные 3DGS |
bHasMesh | bool | Есть ли данные меша |
Mesh | FTreeNodeDataMesh | Данные меша |
bHasBVH | bool | Есть ли данные BVH |
BVH | FTreeNodeDataBVH | Данные BVH |
FTreeNodeData3DGS
| Поле | Тип | Описание |
|---|---|---|
Name | int32 | Индекс файла |
Start | int32 | Начальное смещение |
Count | int32 | Количество |
FTreeNodeDataMesh
| Поле | Тип | Описание |
|---|---|---|
Name | int32 | Индекс файла |
Vertex | int32 | Число вершин |
Face | int32 | Число полигонов |
FTreeNodeDataBVH
| Поле | Тип | Описание |
|---|---|---|
Name | int32 | Индекс файла |
Смотрите также
- ULCCComponentBase: применение
FRenderInfoиFMetaInfoBase - ULCCComponent: применение
FLCCSplatиFLCCRenderInfo - ULCCUtilLibrary: функции разбора метаданных SOG
- Enums: типы перечислений, используемые в этих структурах