Skip to content

Commit 8b16ded

Browse files
committed
Revert "Error fixes and cleanup for i3dm metadata"
This reverts commit a43ef7b.
1 parent a43ef7b commit 8b16ded

File tree

2 files changed

+27
-42
lines changed

2 files changed

+27
-42
lines changed

Cesium3DTilesContent/src/BatchTableToGltfStructuralMetadata.cpp

Lines changed: 26 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2034,16 +2034,9 @@ template <> int32_t componentTypeFromCpp<uint32_t>() {
20342034
return Accessor::ComponentType::UNSIGNED_INT;
20352035
}
20362036

2037-
template <class... Ts> struct overloaded : Ts... {
2038-
using Ts::operator()...;
2039-
};
2040-
template <class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
2041-
2042-
// encapsulation of the binary batch id data in an I3dm. If byteSize is 0, then
2043-
// the semantic is invalid for some reason.
2037+
// encapsulation of the binary batch id data in an I3dm
20442038
struct BatchIdSemantic {
20452039
std::variant<
2046-
std::monostate,
20472040
std::span<const uint8_t>,
20482041
std::span<const uint16_t>,
20492042
std::span<const uint32_t>>
@@ -2073,65 +2066,62 @@ struct BatchIdSemantic {
20732066
const auto byteOffsetIt = batchIdIt->value.FindMember("byteOffset");
20742067
if (byteOffsetIt == batchIdIt->value.MemberEnd() ||
20752068
!byteOffsetIt->value.IsUint()) {
2076-
return;
2069+
// Warning
20772070
}
20782071
uint32_t byteOffset = byteOffsetIt->value.GetUint();
20792072
const auto componentTypeIt = batchIdIt->value.FindMember("componentType");
2080-
if (componentTypeIt != batchIdIt->value.MemberEnd() &&
2073+
if (componentTypeIt != featureTableJson.MemberEnd() &&
20812074
componentTypeIt->value.IsString()) {
20822075
const std::string& componentTypeString =
20832076
componentTypeIt->value.GetString();
2084-
if (MetadataProperty::stringToMetadataComponentType.count(
2085-
componentTypeString) == 0) {
2086-
return;
2077+
if (MetadataProperty::stringToMetadataComponentType.find(
2078+
componentTypeString) ==
2079+
MetadataProperty::stringToMetadataComponentType.end()) {
2080+
// Warning
20872081
}
20882082
MetadataProperty::ComponentType componentType =
20892083
MetadataProperty::stringToMetadataComponentType.at(
20902084
componentTypeString);
20912085
rawData = featureTableJsonData.data();
2092-
numElements = numInstances;
20932086
if (componentType == MetadataProperty::ComponentType::UNSIGNED_BYTE) {
20942087
batchSpan = makeSpan<uint8_t>(rawData, byteOffset, numInstances);
2088+
numElements = numInstances;
20952089
byteSize = numElements * sizeof(uint8_t);
20962090
} else if (
20972091
componentType == MetadataProperty::ComponentType::UNSIGNED_SHORT) {
2098-
batchSpan = makeSpan<uint16_t>(rawData, byteOffset, numInstances);
2092+
batchSpan = makeSpan<uint8_t>(rawData, byteOffset, numInstances);
2093+
numElements = numInstances;
20992094
byteSize = numElements * sizeof(uint16_t);
21002095
} else if (
21012096
componentType == MetadataProperty::ComponentType::UNSIGNED_INT) {
21022097
batchSpan = makeSpan<uint32_t>(rawData, byteOffset, numInstances);
2098+
numElements = numInstances;
21032099
byteSize = numElements * sizeof(uint32_t);
21042100
}
21052101
}
21062102
}
21072103

21082104
size_t idSize() const {
21092105
return std::visit(
2110-
overloaded(
2111-
[](const std::monostate&) -> size_t { return 0; },
2112-
[](auto&& batchIds) -> size_t { return sizeof(batchIds[0]); }),
2106+
[](auto&& batchIds) { return sizeof(batchIds[0]); },
21132107
batchSpan);
21142108
}
21152109

21162110
uint32_t maxBatchId() const {
21172111
return std::visit(
2118-
overloaded(
2119-
[](const std::monostate&) -> uint32_t { return 0; },
2120-
[](auto&& batchIds) -> uint32_t {
2121-
auto itr = std::max_element(batchIds.begin(), batchIds.end());
2122-
return *itr;
2123-
}),
2112+
[](auto&& batchIds) {
2113+
auto itr = std::max_element(batchIds.begin(), batchIds.end());
2114+
return static_cast<uint32_t>(*itr);
2115+
},
21242116
batchSpan);
21252117
}
21262118

21272119
int32_t componentType() const {
21282120
return std::visit(
2129-
overloaded(
2130-
[](const std::monostate&) { return -1; },
2131-
[](auto&& batchIds) {
2132-
using span_type = std::remove_reference_t<decltype(batchIds)>;
2133-
return componentTypeFromCpp<typename span_type::value_type>();
2134-
}),
2121+
[](auto&& batchIds) {
2122+
using span_type = std::remove_reference_t<decltype(batchIds)>;
2123+
return componentTypeFromCpp<typename span_type::value_type>();
2124+
},
21352125
batchSpan);
21362126
}
21372127
};
@@ -2185,7 +2175,7 @@ ErrorList BatchTableToGltfStructuralMetadata::convertFromI3dm(
21852175
// IDs, the number of instances.
21862176
int64_t featureCount = 0;
21872177
std::optional<BatchIdSemantic> optBatchIds;
2188-
bool hasBatchIds = featureTableJson.HasMember("BATCH_ID");
2178+
const auto batchIdIt = featureTableJson.FindMember("BATCH_ID");
21892179
std::optional<uint32_t> optInstancesLength =
21902180
GltfConverterUtility::getValue<uint32_t>(
21912181
featureTableJson,
@@ -2194,20 +2184,15 @@ ErrorList BatchTableToGltfStructuralMetadata::convertFromI3dm(
21942184
result.emplaceError("Required INSTANCES_LENGTH semantic is missing");
21952185
return result;
21962186
}
2197-
featureCount = *optInstancesLength;
2198-
if (hasBatchIds) {
2187+
if (batchIdIt == featureTableJson.MemberEnd()) {
2188+
featureCount = *optInstancesLength;
2189+
} else {
21992190
optBatchIds = BatchIdSemantic(
22002191
featureTableJson,
22012192
*optInstancesLength,
22022193
featureTableJsonData);
2203-
if (optBatchIds->byteSize == 0) {
2204-
result.emplaceError("Invalid Batch ID Semantic");
2205-
optBatchIds.reset();
2206-
} else {
2207-
featureCount = optBatchIds->maxBatchId() + 1;
2208-
}
2209-
} else {
2210-
featureCount = *optInstancesLength;
2194+
uint32_t maxBatchId = optBatchIds->maxBatchId();
2195+
featureCount = maxBatchId + 1;
22112196
}
22122197

22132198
convertBatchTableToGltfStructuralMetadataExtension(

Cesium3DTilesContent/src/I3dmToGltfConverter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ void validateI3dmDataSections(
256256
return;
257257
}
258258
dataSectionOffset += header.batchTableJsonByteLength;
259-
if (dataSectionOffset + header.batchTableBinaryByteLength >
259+
if (dataSectionOffset + header.batchTableJsonByteLength >
260260
instancesBinary.size()) {
261261
errors.emplaceError(fmt::format(
262262
"Invalid I3dm batch table binary offset {} length {} "

0 commit comments

Comments
 (0)