bmh/FlightSimulation/Plugins/CesiumForUnreal_5.4/Source/CesiumRuntime/Private/CesiumPropertyTexture.cpp
2025-02-07 22:52:32 +08:00

161 lines
5.6 KiB
C++

// Copyright 2020-2024 CesiumGS, Inc. and Contributors
#include "CesiumPropertyTexture.h"
#include "CesiumGltf/Model.h"
#include "CesiumGltf/PropertyTexturePropertyView.h"
#include "CesiumGltf/PropertyTextureView.h"
#include "CesiumMetadataPickingBlueprintLibrary.h"
static FCesiumPropertyTextureProperty EmptyPropertyTextureProperty;
FCesiumPropertyTexture::FCesiumPropertyTexture(
const CesiumGltf::Model& Model,
const CesiumGltf::PropertyTexture& PropertyTexture)
: _status(ECesiumPropertyTextureStatus::ErrorInvalidPropertyTextureClass),
_name(PropertyTexture.name.value_or("").c_str()),
_className(PropertyTexture.classProperty.c_str()) {
CesiumGltf::PropertyTextureView propertyTextureView(Model, PropertyTexture);
switch (propertyTextureView.status()) {
case CesiumGltf::PropertyTextureViewStatus::Valid:
_status = ECesiumPropertyTextureStatus::Valid;
break;
default:
// Status was already set in initializer list.
return;
}
const CesiumGltf::Class* pClass = propertyTextureView.getClass();
for (const auto& classPropertyPair : pClass->properties) {
{
const auto& propertyPair =
PropertyTexture.properties.find(classPropertyPair.first);
if (propertyPair == PropertyTexture.properties.end()) {
continue;
}
CesiumGltf::TextureViewOptions options;
options.applyKhrTextureTransformExtension = true;
if (propertyPair->second.extras.find("makeImageCopy") !=
propertyPair->second.extras.end()) {
options.makeImageCopy = propertyPair->second.extras.at("makeImageCopy")
.getBoolOrDefault(false);
}
propertyTextureView.getPropertyView(
propertyPair->first,
[&properties = this->_properties](
const std::string& propertyId,
auto propertyValue) mutable {
FString key(UTF8_TO_TCHAR(propertyId.data()));
properties.Add(key, FCesiumPropertyTextureProperty(propertyValue));
},
options);
}
}
}
/*static*/ const ECesiumPropertyTextureStatus
UCesiumPropertyTextureBlueprintLibrary::GetPropertyTextureStatus(
UPARAM(ref) const FCesiumPropertyTexture& PropertyTexture) {
return PropertyTexture._status;
}
/*static*/ const FString&
UCesiumPropertyTextureBlueprintLibrary::GetPropertyTextureName(
UPARAM(ref) const FCesiumPropertyTexture& PropertyTexture) {
return PropertyTexture._name;
}
/*static*/ const TMap<FString, FCesiumPropertyTextureProperty>
UCesiumPropertyTextureBlueprintLibrary::GetProperties(
UPARAM(ref) const FCesiumPropertyTexture& PropertyTexture) {
return PropertyTexture._properties;
}
/*static*/ const TArray<FString>
UCesiumPropertyTextureBlueprintLibrary::GetPropertyNames(
UPARAM(ref) const FCesiumPropertyTexture& PropertyTexture) {
TArray<FString> names;
PropertyTexture._properties.GenerateKeyArray(names);
return names;
}
/*static*/ const FCesiumPropertyTextureProperty&
UCesiumPropertyTextureBlueprintLibrary::FindProperty(
UPARAM(ref) const FCesiumPropertyTexture& PropertyTexture,
const FString& PropertyName) {
const FCesiumPropertyTextureProperty* property =
PropertyTexture._properties.Find(PropertyName);
return property ? *property : EmptyPropertyTextureProperty;
}
/*static*/ TMap<FString, FCesiumMetadataValue>
UCesiumPropertyTextureBlueprintLibrary::GetMetadataValuesForUV(
UPARAM(ref) const FCesiumPropertyTexture& PropertyTexture,
const FVector2D& UV) {
TMap<FString, FCesiumMetadataValue> values;
for (const auto& propertyIt : PropertyTexture._properties) {
const FCesiumPropertyTextureProperty& property = propertyIt.Value;
ECesiumPropertyTexturePropertyStatus status =
UCesiumPropertyTexturePropertyBlueprintLibrary::
GetPropertyTexturePropertyStatus(property);
if (status == ECesiumPropertyTexturePropertyStatus::Valid) {
values.Add(
propertyIt.Key,
UCesiumPropertyTexturePropertyBlueprintLibrary::GetValue(
propertyIt.Value,
UV));
} else if (
status ==
ECesiumPropertyTexturePropertyStatus::EmptyPropertyWithDefault) {
values.Add(
propertyIt.Key,
UCesiumPropertyTexturePropertyBlueprintLibrary::GetDefaultValue(
propertyIt.Value));
}
}
return values;
}
/*static*/ TMap<FString, FCesiumMetadataValue>
UCesiumPropertyTextureBlueprintLibrary::GetMetadataValuesFromHit(
UPARAM(ref) const FCesiumPropertyTexture& PropertyTexture,
const FHitResult& Hit) {
TMap<FString, FCesiumMetadataValue> values;
for (const auto& propertyIt : PropertyTexture._properties) {
if (UCesiumPropertyTexturePropertyBlueprintLibrary::
GetPropertyTexturePropertyStatus(propertyIt.Value) ==
ECesiumPropertyTexturePropertyStatus::EmptyPropertyWithDefault) {
values.Add(
propertyIt.Key,
UCesiumPropertyTexturePropertyBlueprintLibrary::GetDefaultValue(
propertyIt.Value));
continue;
}
if (UCesiumPropertyTexturePropertyBlueprintLibrary::
GetPropertyTexturePropertyStatus(propertyIt.Value) !=
ECesiumPropertyTexturePropertyStatus::Valid) {
continue;
}
auto glTFTexCoordIndex = propertyIt.Value.getTexCoordSetIndex();
FVector2D UV;
if (UCesiumMetadataPickingBlueprintLibrary::FindUVFromHit(
Hit,
glTFTexCoordIndex,
UV)) {
values.Add(
propertyIt.Key,
UCesiumPropertyTexturePropertyBlueprintLibrary::GetValue(
propertyIt.Value,
UV));
}
}
return values;
}