22#define TINYGLTF_IMPLEMENTATION 
   23#define TINYGLTF_NO_STB_IMAGE          
   24#define TINYGLTF_NO_STB_IMAGE_WRITE    
   31QString QgsB3DMToGltfAlgorithm::name()
 const 
   33  return QStringLiteral( 
"b3dmtogltf" );
 
   36QString QgsB3DMToGltfAlgorithm::displayName()
 const 
   38  return QObject::tr( 
"Convert B3DM to GLTF" );
 
   41QStringList QgsB3DMToGltfAlgorithm::tags()
 const 
   43  return QObject::tr( 
"3d,tiles,cesium" ).split( 
',' );
 
   46QString QgsB3DMToGltfAlgorithm::group()
 const 
   48  return QObject::tr( 
"3D Tiles" );
 
   51QString QgsB3DMToGltfAlgorithm::groupId()
 const 
   53  return QStringLiteral( 
"3dtiles" );
 
   56QString QgsB3DMToGltfAlgorithm::shortHelpString()
 const 
   58  return QObject::tr( 
"Converts files from the legacy B3DM format to GLTF." );
 
   61QgsB3DMToGltfAlgorithm *QgsB3DMToGltfAlgorithm::createInstance()
 const 
   63  return new QgsB3DMToGltfAlgorithm();
 
   66void QgsB3DMToGltfAlgorithm::initAlgorithm( 
const QVariantMap & )
 
   69                QStringLiteral( 
"b3dm" ), QVariant(), 
false, QStringLiteral( 
"B3DM (*.b3dm *.B3DM)" ) ) );
 
   76  const QString path = parameterAsFile( parameters, QStringLiteral( 
"INPUT" ), context );
 
   77  const QString outputPath = parameterAsFile( parameters, QStringLiteral( 
"OUTPUT" ), context );
 
   79  if ( !QFile::exists( path ) )
 
   83  QByteArray fileContent;
 
   84  if ( f.open( QIODevice::ReadOnly ) )
 
   86    fileContent = f.readAll();
 
   98  tinygltf::Model model;
 
  101  const bool res = QgsGltfUtils::loadGltfModel( b3dmContent.
gltf, model, &errors, &warnings );
 
  102  if ( !errors.isEmpty() )
 
  106  if ( !warnings.isEmpty() )
 
  113    QFile outputFile( outputPath );
 
  114    if ( !outputFile.open( QFile::WriteOnly ) )
 
  118    outputFile.write( b3dmContent.
gltf );
 
  122    bool sceneOk = 
false;
 
  123    const std::size_t sceneIndex = QgsGltfUtils::sourceSceneForModel( model, sceneOk );
 
  129    feedback->
pushDebugInfo( QObject::tr( 
"Found %1 scenes" ).arg( model.scenes.size() ) );
 
  131    const tinygltf::Scene &scene = model.scenes[sceneIndex];
 
  132    feedback->
pushDebugInfo( QObject::tr( 
"Found %1 nodes in default scene [%2]" ).arg( scene.nodes.size() ).arg( sceneIndex ) );
 
  133    if ( !scene.nodes.empty() )
 
  135      const int nodeIndex = scene.nodes[0];
 
  136      const tinygltf::Node &gltfNode = model.nodes[nodeIndex];
 
  137      if ( gltfNode.mesh >= 0 )
 
  139        const tinygltf::Mesh &mesh = model.meshes[gltfNode.mesh];
 
  140        feedback->
pushDebugInfo( QObject::tr( 
"Found %1 primitives in default scene node [%2]" ).arg( mesh.primitives.size() ).arg( nodeIndex ) );
 
  147      tinygltf::Value::Object cesiumRtc;
 
  148      cesiumRtc[
"center"] = tinygltf::Value( tinygltf::Value::Array
 
  155      model.extensions[
"CESIUM_RTC"] = tinygltf::Value( cesiumRtc );
 
  156      model.extensionsRequired.emplace_back( 
"CESIUM_RTC" );
 
  157      model.extensionsUsed.emplace_back( 
"CESIUM_RTC" );
 
  160    const QString outputExtension = QFileInfo( outputPath ).suffix();
 
  161    const bool isGlb = outputExtension.compare( QLatin1String( 
"glb" ), Qt::CaseInsensitive ) == 0;
 
  162    const QByteArray outputFile = QFile::encodeName( outputPath );
 
  163    std::ofstream of( outputFile.constData(), std::ios::binary | std::ios::trunc );
 
  167    tinygltf::TinyGLTF writer;
 
  168    if ( !writer.WriteGltfSceneToStream( &model, of, 
true, isGlb ) )
 
  177  outputs.insert( QStringLiteral( 
"OUTPUT" ), outputPath );
 
@ File
Parameter is a single file.
 
static B3DMContents extractGltfFromB3dm(const QByteArray &tileContent)
Extracts GLTF binary data and other contents from the legacy b3dm (Batched 3D Model) tile format.
 
Contains information about the context in which a processing algorithm is executed.
 
Custom exception class for processing related exceptions.
 
Base class for providing feedback from a processing algorithm.
 
virtual void pushWarning(const QString &warning)
Pushes a warning informational message from the algorithm.
 
virtual void pushDebugInfo(const QString &info)
Pushes an informational message containing debugging helpers from the algorithm.
 
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
 
A generic file based destination parameter, for specifying the destination path for a file (non-map l...
 
An input file or folder parameter for processing algorithms.
 
double y() const
Returns Y coordinate.
 
double z() const
Returns Z coordinate.
 
bool isNull() const
Returns true if all three coordinates are zero.
 
double x() const
Returns X coordinate.
 
Encapsulates the contents of a B3DM file.
 
QByteArray gltf
GLTF binary content.
 
QgsVector3D rtcCenter
Optional RTC center.