Structs: referencia de los tipos de struct
Tipos de struct que expone el módulo LCC4UnrealRuntime.
| Módulo | LCC4UnrealRuntime |
| Cabecera | Core/LCCStructure.h |
#include "Core/LCCStructure.h"
Los structs marcados como BlueprintType se pueden descomponer y componer en Blueprint con nodos Break / Make.
Rendimiento
FRenderInfo
Parámetros comunes de rendimiento. Los usa ULCCComponentBase::Performance.
La característica de diseño de este struct es que cada valor viene con una casilla de activación. Mientras la casilla está desmarcada se usa el valor predeterminado interno del plugin, y el valor introducido solo se aplica una vez marcada. El Setter correspondiente del Component establece la casilla en true automáticamente.
| Campo | Tipo | Valor predeterminado | Casilla correspondiente | Descripción |
|---|---|---|---|---|
MaxDistance | uint32 | 300 | bDistanceLimit | Distancia máxima de renderizado, en metros |
MaxSplatNum | uint32 | 3000 | bMaxSplatNumLimit | Número máximo de splats por fotograma, en unidades de diez mil, límite superior 10000 |
LevelFactor | float | 1 | bCanSetLevelFactor | Factor de escala de la distancia del LOD, de 0.01 a 20 |
PreloadDistance | uint32 | 200 | bPreloadDistanceLimit | Distancia de precarga. El valor real es MaxDistance + 35 |
StartLevel | uint32 | 0 | bCanSetStartLevel | Start Level, de 0 a 20 |
EndLevel | uint32 | 20 | bCanSetEndLevel | End Level, de 0 a 20 |
CollisionLoadMaxDistance | uint32 | 300 | bCollisionDistanceLimit | Distancia máxima de carga de colisión, en metros |
bUseFullLoad | bool | true | bCanSetUseFullLoad | Interruptor de carga completa para escenas pequeñas. Reescrito a casilla activada, valor false cuando se construye ULCC2Component |
FullLoadSplatNum | uint32 | 1500 | bCanSetFullLoadNum | Umbral de la carga completa, en unidades de diez mil |
Métodos auxiliares:
bool HasMaxDistanceLimit() const; // si existe un límite de distancia
bool HasMaxNumLimit() const; // si existe un límite de cantidad
bool NeedPreload() const; // si es necesaria la precarga
uint32 GetMaxDistance() const; // distancia máxima efectiva
uint32 GetMaxSplatNum() const; // cantidad máxima efectiva
float GetLevelFactor() const; // factor de LOD efectivo
uint32 GetStartLevel() const; // Level inicial efectivo
uint32 GetEndLevel() const; // Level final efectivo
uint32 GetMaxCollisionDistance() const;
uint32 GetPreloadDistance() const; // devuelve GetMaxDistance() + 35
bool GetIfUseFullLoad(uint32 SplatNum) const; // si la cantidad indicada usa la carga completa
void Reset(); // restablece solo los campos de valor, no las casillas de activación
Dos trampas fáciles:
Reset()restablece solo los campos de valor (distancia, cantidad, Level, factor) y no restablece ninguna de las casillas de activaciónb*, nibUseFullLoadniFullLoadSplatNum.FRenderInfo::GetPreloadDistance()devuelveGetMaxDistance() + 35, mientras que la función del mismo nombre del componente,ULCCComponentBase::GetPreloadDistance(), devuelve el valor bruto del campo. Los dos resultados difieren.
Los Getters devuelven el valor efectivo: mientras la casilla está desmarcada devuelven el valor predeterminado interno, no el valor introducido antes. Esto se confunde con facilidad, y leer el campo directamente puede diferir de llamar al Getter.
Notas de uso:
- Modificarlos mediante el Setter del Component es la vía más sencilla y no requiere tratar las casillas manualmente.
- Al cambiar los campos del struct directamente, no hay que olvidar establecer también la casilla en
true; de lo contrario nada surte efecto.
// recomendado: usar el Setter, la casilla se trata automáticamente
Component->SetMaxDistance(200);
// cambiar el campo directamente requiere establecer la casilla manualmente
Component->Performance.bDistanceLimit = true;
Component->Performance.MaxDistance = 200;
FLCCRenderInfo
Parámetros de rendimiento específicos de LCC1. Los usa ULCCComponent::LCCPerformance.
| Campo | Tipo | Valor predeterminado | Casilla correspondiente | Descripción |
|---|---|---|---|---|
SortFactor | float | 1 | bCanSetSortFactor | Factor de escala de la frecuencia de ordenación, de 0.2 a 5. Un valor mayor implica menos ordenaciones y mejor rendimiento |
bAddExtraPreNodes | bool | Decidido por una macro | bEnableExtraPreNodes | Añade nodos de precarga adicionales, lo que mitiga los huecos en el borde de la pantalla al girar la vista rápidamente |
Métodos auxiliares:
float GetSortFactor() const;
bool GetIfAddExtraPreNodes() const;
void Reset();
Página relacionada: ULCCComponent
Metadatos
FMetaInfoBase
Struct base de los metadatos, del que heredan tanto FLCCMetaInfo como FLCC2MetaInfo. Tipo de retorno de ULCCComponentBase::GetMetaInfo.
| Campo | Tipo | Descripción |
|---|---|---|
Name | FString | Nombre de los datos |
Version | FString | Cadena de versión de los datos |
Description | FString | Descripción |
Source | FString | Origen |
DataType | FString | Tipo de datos |
FileType | FString | Tipo de archivo, que corresponde a EFileType |
Offset | TArray<float> | Desplazamiento de coordenadas, 3 elementos |
Shift | TArray<float> | Cantidad de traslación |
Epsg | int32 | Número del sistema de coordenadas EPSG, mayor que 0 significa que hay información de coordenadas geográficas |
Scale | TArray<int> | Escala, 3 elementos |
GUID | FString | Identificador único de los datos |
TotalLevel | int | Número total de Levels |
TotalSplats | int | Número total de splats |
Splats | TArray<int> | Número de splats de cada Level |
Métodos auxiliares:
bool IsValid() const; // si los metadatos son válidos
void Reset();
bool IsRTK() const; // si hay información geográfica RTK
FVector GetOffset() const; // desplazamiento como FVector, devuelve un vector cero con una advertencia si hay menos de 3 elementos
FVector3f GetScale(); // nota: no es const, y no comprueba el número de elementos
EFileType GetFileType() const; // enumeración del tipo de archivo
float GetVersion() const; // versión como float
uint32 GetLevel0SplatNum() const; // número de splats del Level 0, en unidades de diez mil
GetScale() y GetOffset() difieren en robustez: GetOffset() comprueba el número de elementos y devuelve un vector cero con una advertencia cuando hay menos de 3, mientras que GetScale() indexa los tres primeros elementos directamente y se sale de los límites cuando Scale tiene menos de 3 elementos.
IsRTK() decide por Epsg > 0 más un desplazamiento distinto de cero y solo se fija en los datos. No es equivalente a CanUseGeoPlace(), que además requiere que bEnableGeoPlace esté activado y que el sistema de referencia geográfica esté creado.
Notas de uso:
- Leerlos una vez terminada la carga; los campos tienen todos valores cero mientras los datos no están listos.
TotalSplatses la cantidad total de los datos.ULCCComponentBase::GetSplatNumber()devuelve precisamente ese campo, así que los dos son el mismo valor.
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 como texto:
[Get Meta Info]
Target = (LCC Component)
│ Return Value ──┐
▼ │
[Break FMetaInfoBase] ◀──┘
Name → [Print String]
Total Splats → [Print String]
Total Level → [Print String]
FLCCMetaInfo
Metadatos completos de LCC1, que heredan de FMetaInfoBase.
| Campo adicional | Tipo | Descripción |
|---|---|---|
CellLengthX | float | Tamaño de la celda en X |
CellLengthY | float | Tamaño de la celda en Y |
Attributes | TArray<FBoundingBoxInfoWithName> | Caja delimitadora de cada atributo, indexada por nombre |
IndexDataSize | int | Tamaño de los datos de índice |
Encoding | FString | Método de codificación |
BoundingBox | FBoundingBoxInfo | Caja delimitadora general |
La condición de IsValid() es más estricta que en la clase base: TotalLevel, TotalSplats, CellLengthX, CellLengthY e IndexDataSize deben ser todos mayores que 0.
Métodos de la caja delimitadora (todos devuelven FBox, solo C++):
FVector2f GetCellLength() const;
int32 GetXNum() const; // número de celdas en X
int32 GetYNum() const; // número de celdas en Y
FBox GetVisibleBoundingBox() const; // caja delimitadora visible
FBox GetScaleBox() const;
FBox GetEnvironmentScaleBox() const;
FBox GetEnvironmentVisibleBox() const;
FBox GetShcoef() const; // rango de valores de los armónicos esféricos
FBox GetEnvShcoef() const;
FBox GetNormal() const;
FBox GetEnvNormal() const;
FBox GetColor() const;
FVector2f GetOpacity() const;
FLCC2MetaInfo
Metadatos completos de LCC2, que heredan de FMetaInfoBase. Tipo de retorno de ULCC2Component::GetMetaInfo2.
| Campo adicional | Tipo | Descripción |
|---|---|---|
WorkPath | FString | Ruta del directorio LCC2 |
SplatType | EDataSourceType | Formato de origen de los datos, SOG / SPZ / PLY |
SHBands | int32 | Banda de armónicos esféricos más alta de este árbol, 0 significa ninguna, valores 1/2/3 |
EnvName | int32 | Índice del archivo de entorno, -1 significa ninguno |
Root | FTreeNode | Nodo raíz del octree |
Files | TArray<FString> | Lista de archivos de datos de splats |
MeshFiles | TArray<FString> | Lista de archivos de mesh |
BVHFiles | TArray<FString> | Lista de archivos BVH |
La condición de IsValid() es que Files no esté vacío.
Método auxiliar:
FBox GetBounds() const; // caja delimitadora del nodo raíz, ya convertida a centímetros
Sobre SHBands: decide el paso de las ranuras de armónicos esféricos, así que todos los orígenes de datos dentro del mismo buffer de armónicos esféricos tienen que coincidir. Un árbol que mezcla números de bandas distintos toma el más amplio. Los formatos de archivo único (.sog / .spz / .ply) leen el número exacto de bandas de la cabecera del decodificador; LCC2 no tiene el concepto de bandas por archivo y lo decide FileType, donde Portable no tiene armónicos esféricos y Quality tiene 3 bandas.
Resultado de la prueba de rayos
FLCCSplat
Resultado de impacto de una prueba de rayos. Lo usan las funciones de prueba de rayos de ULCCComponent.
| Campo | Tipo | Descripción |
|---|---|---|
Location | FVector | Coordenadas de mundo del punto de impacto |
NodeVector | FLCCVector | Información de nodo del punto de impacto |
FLCCSplat Hit;
if (LineTraceSingle(Start, End, Hit, false, 0.f, 0.f))
{
// posición del impacto
const FVector HitPos = Hit.Location;
// nivel de detalle cargado actualmente en ese lugar
const int32 Level = Hit.NodeVector.Level;
}
Página relacionada: Pruebas de rayos de ULCCComponent
FLCCVector
Coordenadas de nodo, que sitúan un nodo dentro del octree.
| Campo | Tipo | Descripción |
|---|---|---|
X | int32 | Índice X del nodo |
Y | int32 | Índice Y del nodo |
Level | int32 | Level al que pertenece el nodo |
El constructor con parámetros y el constructor de copia limitan los tres campos a valores no negativos, pero una asignación directa (escribir los campos después de la construcción predeterminada, o usar operator=) no los limita.
Métodos auxiliares:
FString ToString() const; // el formato es "X:%i,Y:%i,Level:%i"
void Reset();
static double Dist2D(const FLCCVector& A, const FLCCVector& B);
La igualdad compara solo X, Y y Level, no la información interna de cámara ni otros campos de tiempo de ejecución.
Level indica si los datos visibles actualmente son finos o gruesos; un valor menor es más fino.
Caja delimitadora
FBoundingBoxInfo
Información de la caja delimitadora.
| Campo | Tipo | Descripción |
|---|---|---|
Min | TArray<float> | Coordenadas del punto mínimo |
Max | TArray<float> | Coordenadas del punto máximo |
FBoundingBoxInfoWithName
Caja delimitadora con nombre, usada por la lista de atributos de los metadatos.
| Campo | Tipo | Descripción |
|---|---|---|
Name | FString | Nombre del atributo |
BoundingBoxInfo | FBoundingBoxInfo | Caja delimitadora |
La igualdad compara solo Name.
Metadatos SOG
Este grupo de structs describe los metadatos de un archivo .sog y lo generan las funciones de análisis SOG de ULCCUtilLibrary.
FLCC2SogMeta
Struct principal de los metadatos SOG.
| Campo | Tipo | Descripción |
|---|---|---|
Version | int32 | Versión del formato |
Count | int32 | Número de splats |
bAntialias | bool | Si el anti-aliasing está activado |
Instances | FLCC2SogInstances | Lista de archivos de instancias |
Means | FLCC2SogMeans | Datos de posición, con mínimo, máximo y lista de archivos |
Scales | FLCC2SogScales | Datos de escala, con un libro de códigos de 256 entradas y lista de archivos |
Quats | FLCC2SogQuats | Lista de archivos de los datos de rotación |
Semantics | FLCC2SogSemantics | Lista de archivos de los datos semánticos |
Sh0 | FLCC2SogSh0 | Armónicos esféricos de la banda 0, con un libro de códigos de 256 entradas y lista de archivos |
ShN | FLCC2SogShN | Armónicos esféricos de orden alto, con número de bandas, libro de códigos, cantidad y lista de archivos |
Método auxiliar:
bool HasShN() const; // si hay armónicos esféricos de orden alto, equivalente a que ShN.Files no esté vacío
Notas de uso:
- Leerlos con
ParseSogMetaFromFilesin cargar los datos de renderizado, con un coste muy bajo. - Revelan el número de puntos y la situación de los armónicos esféricos antes de cargar, así que la configuración de calidad se puede decidir por adelantado.
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
Datos de los armónicos esféricos de orden alto.
| Campo | Tipo | Descripción |
|---|---|---|
Bands | int32 | Bandas de armónicos esféricos |
Count | int32 | Cantidad |
Files | TArray<FString> | Lista de archivos |
Codebook | TStaticArray<float, 256> | Libro de códigos de cuantización, no visible para Blueprint |
Método auxiliar: bool HasShN() const.
FLCC2SogImageData
Datos de imagen SOG.
| Campo | Tipo | Descripción |
|---|---|---|
PixelData | TArray<uint8> | Datos de píxeles, formato RGBA, 4 bytes por píxel |
Width | int32 | Anchura |
Height | int32 | Altura |
Otros sub-structs
Los structs siguientes contienen solo una lista de archivos, algunos con un libro de códigos de cuantización:
| Struct | Campos |
|---|---|
FLCC2SogInstances | Files |
FLCC2SogSemantics | Files |
FLCC2SogQuats | Files |
FLCC2SogMeans | Mins, Maxs, Files |
FLCC2SogScales | Codebook (256 entradas), Files |
FLCC2SogSh0 | Codebook (256 entradas), Files |
Codebook es un TStaticArray<float, 256>, no es un UPROPERTY y no es visible en Blueprint.
Nodos del octree
Este grupo de structs describe el octree de LCC2. Son datos de bajo nivel que el desarrollo habitual no necesita tocar directamente.
FTreeNode
Nodo del octree.
| Campo | Tipo | Descripción |
|---|---|---|
Id | FString | Identificador del nodo |
XMin / YMin / ZMin | double | Punto mínimo del AABB |
XMax / YMax / ZMax | double | Punto máximo del AABB |
ChildNum | int32 | Número de nodos hijos |
Children | TArray<FTreeNode> | Array de nodos hijos, no es un UPROPERTY |
Data | FTreeNodeData | Datos del nodo |
Método auxiliar:
void ClearIterative();
Recoge todos los nodos en anchura y los limpia en orden inverso, evitando un desbordamiento de pila por la destrucción recursiva en un árbol muy profundo. Llamarlo antes de que un FTreeNode mantenido manualmente salga del ámbito.
FTreeNodeData
Contenedor de los datos del nodo, que marca con valores booleanos si cada tipo de dato está presente.
| Campo | Tipo | Descripción |
|---|---|---|
bHas3DGS | bool | Si hay datos 3DGS |
_3DGS | FTreeNodeData3DGS | Datos 3DGS |
bHasMesh | bool | Si hay datos de mesh |
Mesh | FTreeNodeDataMesh | Datos de mesh |
bHasBVH | bool | Si hay datos BVH |
BVH | FTreeNodeDataBVH | Datos BVH |
FTreeNodeData3DGS
| Campo | Tipo | Descripción |
|---|---|---|
Name | int32 | Índice del archivo |
Start | int32 | Desplazamiento inicial |
Count | int32 | Cantidad |
FTreeNodeDataMesh
| Campo | Tipo | Descripción |
|---|---|---|
Name | int32 | Índice del archivo |
Vertex | int32 | Número de vértices |
Face | int32 | Número de caras |
FTreeNodeDataBVH
| Campo | Tipo | Descripción |
|---|---|---|
Name | int32 | Índice del archivo |
Véase también
- ULCCComponentBase: uso de
FRenderInfoyFMetaInfoBase - ULCCComponent: uso de
FLCCSplatyFLCCRenderInfo - ULCCUtilLibrary: las funciones de análisis de los metadatos SOG
- Enumeraciones: los tipos de enumeración usados en estos structs