Skip to content

Commit

Permalink
Merge pull request #1347 from CesiumGS/use-accessor-utility
Browse files Browse the repository at this point in the history
Use `AccessorUtility` in cesium-native instead of `GltfAccessors`
  • Loading branch information
kring authored Jan 31, 2024
2 parents ee46a87 + e80ea19 commit cf429d9
Show file tree
Hide file tree
Showing 19 changed files with 128 additions and 343 deletions.
50 changes: 20 additions & 30 deletions Source/CesiumRuntime/Private/CesiumFeatureIdAttribute.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// Copyright 2020-2023 CesiumGS, Inc. and Contributors

#include "CesiumFeatureIdAttribute.h"
#include "CesiumGltf/Accessor.h"
#include "CesiumGltf/Model.h"
#include <CesiumGltf/Accessor.h>
#include <CesiumGltf/Model.h>

using namespace CesiumGltf;

Expand All @@ -12,7 +12,7 @@ FCesiumFeatureIdAttribute::FCesiumFeatureIdAttribute(
const int64 FeatureIDAttribute,
const FString& PropertyTableName)
: _status(ECesiumFeatureIdAttributeStatus::ErrorInvalidAttribute),
_featureIDAccessor(),
_featureIdAccessor(),
_attributeIndex(FeatureIDAttribute),
_propertyTableName(PropertyTableName) {
const std::string attributeName =
Expand All @@ -26,32 +26,24 @@ FCesiumFeatureIdAttribute::FCesiumFeatureIdAttribute(
const Accessor* accessor =
Model.getSafe<Accessor>(&Model.accessors, featureID->second);
if (!accessor || accessor->type != Accessor::Type::SCALAR) {
_status = ECesiumFeatureIdAttributeStatus::ErrorInvalidAccessor;
this->_status = ECesiumFeatureIdAttributeStatus::ErrorInvalidAccessor;
return;
}

switch (accessor->componentType) {
case Accessor::ComponentType::BYTE:
this->_featureIDAccessor = AccessorView<int8_t>(Model, *accessor);
break;
case Accessor::ComponentType::UNSIGNED_BYTE:
this->_featureIDAccessor = AccessorView<uint8_t>(Model, *accessor);
break;
case Accessor::ComponentType::SHORT:
this->_featureIDAccessor = AccessorView<int16_t>(Model, *accessor);
break;
case Accessor::ComponentType::UNSIGNED_SHORT:
this->_featureIDAccessor = AccessorView<uint16_t>(Model, *accessor);
break;
case Accessor::ComponentType::FLOAT:
this->_featureIDAccessor = AccessorView<float>(Model, *accessor);
break;
default:
_status = ECesiumFeatureIdAttributeStatus::ErrorInvalidAccessor;
return;
}
this->_featureIdAccessor = CesiumGltf::getFeatureIdAccessorView(
Model,
Primitive,
this->_attributeIndex);

_status = ECesiumFeatureIdAttributeStatus::Valid;
this->_status = std::visit(
[](auto view) {
if (view.status() != AccessorViewStatus::Valid) {
return ECesiumFeatureIdAttributeStatus::ErrorInvalidAccessor;
}

return ECesiumFeatureIdAttributeStatus::Valid;
},
this->_featureIdAccessor);
}

const FString& UCesiumFeatureIdAttributeBlueprintLibrary::GetFeatureTableName(
Expand All @@ -67,15 +59,13 @@ UCesiumFeatureIdAttributeBlueprintLibrary::GetFeatureIDAttributeStatus(

int64 UCesiumFeatureIdAttributeBlueprintLibrary::GetVertexCount(
UPARAM(ref) const FCesiumFeatureIdAttribute& FeatureIDAttribute) {
return std::visit(
CesiumCountFromAccessor{},
FeatureIDAttribute._featureIDAccessor);
return std::visit(CountFromAccessor{}, FeatureIDAttribute._featureIdAccessor);
}

int64 UCesiumFeatureIdAttributeBlueprintLibrary::GetFeatureIDForVertex(
UPARAM(ref) const FCesiumFeatureIdAttribute& FeatureIDAttribute,
int64 VertexIndex) {
return std::visit(
CesiumFeatureIDFromAccessor{VertexIndex},
FeatureIDAttribute._featureIDAccessor);
FeatureIdFromAccessor{VertexIndex},
FeatureIDAttribute._featureIdAccessor);
}
11 changes: 6 additions & 5 deletions Source/CesiumRuntime/Private/CesiumFeatureIdSet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,17 +151,18 @@ int64 UCesiumFeatureIdSetBlueprintLibrary::GetFeatureIDFromHit(
// Find the first vertex of the face.
const UCesiumGltfPrimitiveComponent* pGltfComponent =
Cast<UCesiumGltfPrimitiveComponent>(Hit.Component);
if (!IsValid(pGltfComponent)) {
if (!IsValid(pGltfComponent) || !pGltfComponent->pMeshPrimitive) {
return -1;
}

auto faceIndices = std::visit(
CesiumFaceVertexIndicesFromAccessor{
auto VertexIndices = std::visit(
CesiumGltf::IndicesForFaceFromAccessor{
Hit.FaceIndex,
pGltfComponent->PositionAccessor.size()},
pGltfComponent->PositionAccessor.size(),
pGltfComponent->pMeshPrimitive->mode},
pGltfComponent->IndexAccessor);

int64 VertexIndex = faceIndices[0];
int64 VertexIndex = VertexIndices[0];

if (FeatureIDSet._featureIDSetType == ECesiumFeatureIdSetType::Attribute) {
FCesiumFeatureIdAttribute attribute =
Expand Down
4 changes: 2 additions & 2 deletions Source/CesiumRuntime/Private/CesiumFeatureIdTexture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ FCesiumFeatureIdTexture::FCesiumFeatureIdTexture(
// To maintain this functionality in EXT_mesh_features, the texture view will
// still be valid if the intended texcoords don't exist. However, feature IDs
// won't be retrievable by vertex index.
this->_texCoordAccessor = GetTexCoordAccessorView(
this->_texCoordAccessor = CesiumGltf::getTexCoordAccessorView(
Model,
Primitive,
this->_textureCoordinateSetIndex);
Expand Down Expand Up @@ -102,7 +102,7 @@ int64 UCesiumFeatureIdTextureBlueprintLibrary::GetFeatureIDForVertex(
UPARAM(ref) const FCesiumFeatureIdTexture& FeatureIDTexture,
int64 VertexIndex) {
const std::optional<glm::dvec2> texCoords = std::visit(
CesiumTexCoordFromAccessor{VertexIndex},
CesiumGltf::TexCoordFromAccessor{VertexIndex},
FeatureIDTexture._texCoordAccessor);
if (!texCoords) {
return -1;
Expand Down
48 changes: 28 additions & 20 deletions Source/CesiumRuntime/Private/CesiumGltfComponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,30 +6,13 @@
#include "CesiumEncodedFeaturesMetadata.h"
#include "CesiumEncodedMetadataUtility.h"
#include "CesiumFeatureIdSet.h"
#include "CesiumGeometry/Axis.h"
#include "CesiumGeometry/Rectangle.h"
#include "CesiumGeometry/Transforms.h"
#include "CesiumGltf/AccessorView.h"
#include "CesiumGltf/ExtensionExtMeshFeatures.h"
#include "CesiumGltf/ExtensionKhrMaterialsUnlit.h"
#include "CesiumGltf/ExtensionKhrTextureTransform.h"
#include "CesiumGltf/ExtensionMeshPrimitiveExtStructuralMetadata.h"
#include "CesiumGltf/ExtensionModelExtFeatureMetadata.h"
#include "CesiumGltf/ExtensionModelExtStructuralMetadata.h"
#include "CesiumGltf/PropertyType.h"
#include "CesiumGltf/TextureInfo.h"
#include "CesiumGltfContent/GltfUtilities.h"
#include "CesiumGltfPointsComponent.h"
#include "CesiumGltfPrimitiveComponent.h"
#include "CesiumMaterialUserData.h"
#include "CesiumRasterOverlays.h"
#include "CesiumRasterOverlays/RasterOverlay.h"
#include "CesiumRasterOverlays/RasterOverlayTile.h"
#include "CesiumRuntime.h"
#include "CesiumTextureUtility.h"
#include "CesiumTransforms.h"
#include "CesiumUtility/Tracing.h"
#include "CesiumUtility/joinToString.h"
#include "Chaos/AABBTree.h"
#include "Chaos/CollisionConvexMesh.h"
#include "Chaos/TriangleMeshImplicitObject.h"
Expand All @@ -51,6 +34,25 @@
#include "UObject/ConstructorHelpers.h"
#include "VecMath.h"
#include "mikktspace.h"

#include <CesiumGeometry/Axis.h>
#include <CesiumGeometry/Rectangle.h>
#include <CesiumGeometry/Transforms.h>
#include <CesiumGltf/AccessorUtility.h>
#include <CesiumGltf/AccessorView.h>
#include <CesiumGltf/ExtensionExtMeshFeatures.h>
#include <CesiumGltf/ExtensionKhrMaterialsUnlit.h>
#include <CesiumGltf/ExtensionKhrTextureTransform.h>
#include <CesiumGltf/ExtensionMeshPrimitiveExtStructuralMetadata.h>
#include <CesiumGltf/ExtensionModelExtFeatureMetadata.h>
#include <CesiumGltf/ExtensionModelExtStructuralMetadata.h>
#include <CesiumGltf/PropertyType.h>
#include <CesiumGltf/TextureInfo.h>
#include <CesiumGltfContent/GltfUtilities.h>
#include <CesiumRasterOverlays/RasterOverlay.h>
#include <CesiumRasterOverlays/RasterOverlayTile.h>
#include <CesiumUtility/Tracing.h>
#include <CesiumUtility/joinToString.h>
#include <cstddef>
#include <glm/ext/matrix_transform.hpp>
#include <glm/gtc/matrix_inverse.hpp>
Expand Down Expand Up @@ -518,7 +520,7 @@ static void createTexCoordAccessorsForFeaturesMetadata(
const FCesiumPrimitiveFeatures& primitiveFeatures,
const FCesiumPrimitiveMetadata& primitiveMetadata,
const FCesiumModelMetadata& modelMetadata,
std::unordered_map<int32_t, CesiumTexCoordAccessorType>&
std::unordered_map<int32_t, CesiumGltf::TexCoordAccessorType>&
texCoordAccessorsMap) {
auto featureIdTextures =
UCesiumPrimitiveFeaturesBlueprintLibrary::GetFeatureIDSetsOfType(
Expand All @@ -540,7 +542,10 @@ static void createTexCoordAccessorsForFeaturesMetadata(
}
texCoordAccessorsMap.emplace(
gltfTexCoordSetIndex,
GetTexCoordAccessorView(model, primitive, gltfTexCoordSetIndex));
CesiumGltf::getTexCoordAccessorView(
model,
primitive,
gltfTexCoordSetIndex));
}

auto propertyTextureIndices =
Expand All @@ -567,7 +572,10 @@ static void createTexCoordAccessorsForFeaturesMetadata(
}
texCoordAccessorsMap.emplace(
gltfTexCoordSetIndex,
GetTexCoordAccessorView(model, primitive, gltfTexCoordSetIndex));
CesiumGltf::getTexCoordAccessorView(
model,
primitive,
gltfTexCoordSetIndex));
}
}
}
Expand Down
5 changes: 3 additions & 2 deletions Source/CesiumRuntime/Private/CesiumGltfPrimitiveComponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@

#include "CesiumGltfPrimitiveComponent.h"
#include "CalcBounds.h"
#include "CesiumGltf/MeshPrimitive.h"
#include "CesiumGltf/Model.h"
#include "CesiumLifetime.h"
#include "CesiumMaterialUserData.h"
#include "Engine/StaticMesh.h"
#include "Engine/Texture.h"
#include "Materials/MaterialInstanceDynamic.h"
#include "PhysicsEngine/BodySetup.h"
#include "VecMath.h"

#include <CesiumGltf/MeshPrimitive.h>
#include <CesiumGltf/Model.h>
#include <variant>

// Prevent deprecation warnings while initializing deprecated metadata structs.
Expand Down
7 changes: 4 additions & 3 deletions Source/CesiumRuntime/Private/CesiumGltfPrimitiveComponent.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#include "CesiumRasterOverlays.h"
#include "Components/StaticMeshComponent.h"
#include "CoreMinimal.h"
#include "GltfAccessors.h"
#include <CesiumGltf/AccessorUtility.h>
#include <cstdint>
#include <glm/mat4x4.hpp>
#include <unordered_map>
Expand Down Expand Up @@ -87,7 +87,8 @@ class UCesiumGltfPrimitiveComponent : public UStaticMeshComponent {
* accessor views on texture coordinate sets that will be used by feature ID
* textures or property textures for picking.
*/
std::unordered_map<int32_t, CesiumTexCoordAccessorType> TexCoordAccessorMap;
std::unordered_map<int32_t, CesiumGltf::TexCoordAccessorType>
TexCoordAccessorMap;

/**
* The position accessor of the glTF primitive. This is used for computing
Expand All @@ -100,7 +101,7 @@ class UCesiumGltfPrimitiveComponent : public UStaticMeshComponent {
* The index accessor of the glTF primitive, if one is specified. This is used
* for computing the UV at a hit location on a primitive.
*/
CesiumIndexAccessorType IndexAccessor;
CesiumGltf::IndexAccessorType IndexAccessor;

std::optional<Cesium3DTilesSelection::BoundingVolume> boundingVolume;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ bool UCesiumMetadataPickingBlueprintLibrary::FindUVFromHit(
FVector2D& UV) {
const UCesiumGltfPrimitiveComponent* pGltfComponent =
Cast<UCesiumGltfPrimitiveComponent>(Hit.Component);
if (!IsValid(pGltfComponent)) {
if (!IsValid(pGltfComponent) || !pGltfComponent->pMeshPrimitive) {
return false;
}

Expand All @@ -100,20 +100,22 @@ bool UCesiumMetadataPickingBlueprintLibrary::FindUVFromHit(
return false;
}

std::array<int64, 3> VertexIndices = std::visit(
CesiumFaceVertexIndicesFromAccessor{
auto VertexIndices = std::visit(
CesiumGltf::IndicesForFaceFromAccessor{
Hit.FaceIndex,
pGltfComponent->PositionAccessor.size()},
pGltfComponent->PositionAccessor.size(),
pGltfComponent->pMeshPrimitive->mode},
pGltfComponent->IndexAccessor);

// Adapted from UBodySetup::CalcUVAtLocation. Compute the barycentric
// coordinates of the point relative to the face, then use those to
// interpolate the UVs.
std::array<FVector2D, 3> UVs;
const CesiumTexCoordAccessorType& accessor = accessorIt->second;
const CesiumGltf::TexCoordAccessorType& accessor = accessorIt->second;
for (size_t i = 0; i < UVs.size(); i++) {
auto maybeTexCoord =
std::visit(CesiumTexCoordFromAccessor{VertexIndices[i]}, accessor);
auto maybeTexCoord = std::visit(
CesiumGltf::TexCoordFromAccessor{VertexIndices[i]},
accessor);
if (!maybeTexCoord) {
return false;
}
Expand Down
Loading

0 comments on commit cf429d9

Please sign in to comment.