Skip to content
Snippets Groups Projects
Commit ff49b7fb authored by Dan Lipsa's avatar Dan Lipsa Committed by Kitware Robot
Browse files

Merge topic 'can_read_3dtiles'


fb10adb7 Parameter not used warning
b005a8fd Add CanReadFile to Cesium3DTilesReader

Acked-by: default avatarKitware Robot <kwrobot@kitware.com>
Tested-by: default avatarbuildbot <buildbot@kitware.com>
Merge-request: !10678
parents 9fc0c97c fb10adb7
Branches
Tags
No related merge requests found
......@@ -88,21 +88,29 @@ bool vtkCesium3DTilesReader::Implementation::Open(const char* fileName)
{
try
{
if (!fileName || std::string(fileName).empty())
{
vtkErrorWithObjectMacro(this->Reader, "Invalid input filename: nullptr or empty");
return false;
}
if (this->IsOpen())
{
if (this->Reader->GetFileName() == fileName)
{
return true;
}
TileFileNames.clear();
Transforms.clear();
this->Close();
}
this->Reader->SetFileName(fileName);
this->TilesetStream.exceptions(std::ifstream::failbit | std::ifstream::badbit);
this->TilesetStream.open(fileName);
this->Tileset = json::parse(this->TilesetStream);
this->Reader->NumberOfLevels = this->GetNumberOfLevels(this->GetRoot());
std::array<double, 16> transform;
vtkMatrix4x4::Identity(&transform[0]);
vtkMatrix4x4::Identity(transform.data());
this->AddPartitions(this->GetRoot(), 0, transform);
std::cerr << "The number of tiles on level " << this->Reader->Level << " is "
<< TileFileNames.size() << std::endl;
this->DirectoryName = vtksys::SystemTools::GetParentDirectory(fileName);
}
catch (std::exception& e)
......@@ -243,7 +251,7 @@ void vtkCesium3DTilesReader::Implementation::AddContentPartition(
std::string contentString("content");
std::array<double, 16> transformYUpToZUp{ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 0.0, 1.0 };
vtkMatrix4x4::Multiply4x4(&transform[0], &transformYUpToZUp[0], &transform[0]);
vtkMatrix4x4::Multiply4x4(transform.data(), transformYUpToZUp.data(), transform.data());
// there is a tile at the current node
std::string tileFileName = node[contentString]["uri"];
this->TileFileNames.push_back(tileFileName);
......@@ -277,8 +285,8 @@ bool vtkCesium3DTilesReader::Implementation::AddPartitions(
{
auto columnNodeTransform = node[transformString].get<std::array<double, 16>>();
std::array<double, 16> nodeTransform;
vtkMatrix4x4::Transpose(&columnNodeTransform[0], &nodeTransform[0]);
vtkMatrix4x4::Multiply4x4(&transform[0], &nodeTransform[0], &transform[0]);
vtkMatrix4x4::Transpose(columnNodeTransform.data(), nodeTransform.data());
vtkMatrix4x4::Multiply4x4(transform.data(), nodeTransform.data(), transform.data());
}
if (!node.contains(contentString) && !node.contains(childrenString))
{
......@@ -371,4 +379,32 @@ int vtkCesium3DTilesReader::RequestData(
return 1;
}
//----------------------------------------------------------------------------
int vtkCesium3DTilesReader::CanReadFile(const char* filename)
{
try
{
if (!filename || std::string(filename).empty())
{
vtkErrorWithObjectMacro(this, "Invalid input filename: nullptr or empty");
return 0;
}
std::ifstream s;
s.exceptions(std::ifstream::failbit | std::ifstream::badbit);
s.open(filename);
json fileJson = json::parse(s);
// check for {asset: {version: ...}}
json j = fileJson.at("asset");
j = j.at("version");
// check for {root: {geometricError: ...}}
j = fileJson.at("root");
j = j.at("geometricError");
}
catch (std::exception& vtkNotUsed(e))
{
return 0;
}
return 1;
}
VTK_ABI_NAMESPACE_END
......@@ -67,6 +67,11 @@ public:
vtkGetMacro(NumberOfLevels, int);
///@}
/**
* Returns true if it can read the json file (it is a 3D Tiles tileset), false otherwise
*/
virtual int CanReadFile(VTK_FILEPATH const char* name);
protected:
vtkCesium3DTilesReader();
~vtkCesium3DTilesReader() override;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment