Qt3DCore::QEntity *QgsDemTerrainTileLoader::createEntity( Qt3DCore::QEntity *parent ) { QgsTerrainTileEntity *entity = new QgsTerrainTileEntity; // create geometry renderer Qt3DRender::QGeometryRenderer *mesh = new Qt3DRender::QGeometryRenderer; mesh->setGeometry( new DemTerrainTileGeometry( mResolution, mHeightMap, mesh ) ); entity->addComponent( mesh ); // takes ownership if the component has no parent // create material createTextureComponent( entity ); // create transform Qt3DCore::QTransform *transform; transform = new Qt3DCore::QTransform(); entity->addComponent( transform ); float zMin, zMax; _heightMapMinMax( mHeightMap, zMin, zMax ); const Qgs3DMapSettings &map = terrain()->map3D(); QgsRectangle extent = map.terrainGenerator()->tilingScheme().tileToExtent( mNode->tileX(), mNode->tileY(), mNode->tileZ() ); //node->extent; double x0 = extent.xMinimum() - map.originX(); double y0 = extent.yMinimum() - map.originY(); double side = extent.width(); double half = side / 2; transform->setScale3D( QVector3D( side, map.terrainVerticalScale(), side ) ); transform->setTranslation( QVector3D( x0 + half, 0, - ( y0 + half ) ) ); mNode->setExactBbox( QgsAABB( x0, zMin * map.terrainVerticalScale(), -y0, x0 + side, zMax * map.terrainVerticalScale(), -( y0 + side ) ) ); entity->setEnabled( false ); entity->setParent( parent ); return entity; }
virtual Qt3DCore::QEntity *createEntity( Qt3DCore::QEntity *parent ) { Qt3DCore::QEntity *entity = new Qt3DCore::QEntity; // create geometry renderer Qt3DRender::QGeometryRenderer *mesh = new Qt3DRender::QGeometryRenderer; mesh->setGeometry( new QuantizedMeshGeometry( qmt, mTerrain->map3D(), mapSettings.mapToPixel(), mTerrain->terrainToMapTransform(), mesh ) ); entity->addComponent( mesh ); // create material createTextureComponent( entity ); // create transform Qt3DCore::QTransform *transform; transform = new Qt3DCore::QTransform(); entity->addComponent( transform ); const Map3D &map = mTerrain->map3D(); transform->setScale3D( QVector3D( 1.f, map.zExaggeration, 1.f ) ); QgsRectangle mapExtent = mapSettings.extent(); float x0 = mapExtent.xMinimum() - map.originX; float y0 = mapExtent.yMinimum() - map.originY; float x1 = mapExtent.xMaximum() - map.originX; float y1 = mapExtent.yMaximum() - map.originY; float z0 = qmt->header.MinimumHeight, z1 = qmt->header.MaximumHeight; node->setExactBbox( AABB( x0, z0 * map.zExaggeration, -y0, x1, z1 * map.zExaggeration, -y1 ) ); //epsilon = mapExtent.width() / map.tileTextureSize; entity->setEnabled( false ); entity->setParent( parent ); return entity; }
Qt3DCore::QEntity *FlatTerrainChunkLoader::createEntity( Qt3DCore::QEntity *parent ) { QgsTerrainTileEntity *entity = new QgsTerrainTileEntity; // make geometry renderer // simple quad geometry shared by all tiles // QPlaneGeometry by default is 1x1 with mesh resolution QSize(2,2), centered at 0 // TODO: the geometry could be shared inside Terrain instance (within terrain-generator specific data?) mTileGeometry = new Qt3DExtras::QPlaneGeometry; Qt3DRender::QGeometryRenderer *mesh = new Qt3DRender::QGeometryRenderer; mesh->setGeometry( mTileGeometry ); // takes ownership if the component has no parent entity->addComponent( mesh ); // takes ownership if the component has no parent // create material createTextureComponent( entity ); // create transform Qt3DCore::QTransform *transform = nullptr; transform = new Qt3DCore::QTransform(); entity->addComponent( transform ); // set up transform according to the extent covered by the quad geometry QgsAABB bbox = mNode->bbox(); double side = bbox.xMax - bbox.xMin; double half = side / 2; transform->setScale( side ); transform->setTranslation( QVector3D( bbox.xMin + half, 0, bbox.zMin + half ) ); entity->setEnabled( false ); entity->setParent( parent ); return entity; }