Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature][Mesh][3D] new 3D mesh layer renderer #33837

Merged
merged 3 commits into from Jan 16, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/3d/CMakeLists.txt
Expand Up @@ -59,6 +59,12 @@ SET(QGIS_3D_SRCS
terrain/qgsterraintileloader_p.cpp
#terrain/quantizedmeshgeometry.cpp
#terrain/quantizedmeshterraingenerator.cpp

mesh/qgsmesh3dgeometry_p.cpp
mesh/qgsmesh3dentity_p.cpp
mesh/qgsmesh3dmaterial_p.cpp
mesh/qgsmeshterraingenerator.cpp

)

SET(QGIS_3D_HDRS
Expand Down Expand Up @@ -97,6 +103,7 @@ SET(QGIS_3D_HDRS
terrain/qgsterraintileloader_p.h
chunks/qgschunkloader_p.h
chunks/qgschunkqueuejob_p.h
mesh/qgsmeshterraingenerator.h
)

SET(QGIS_3D_PRIVATE_HDRS
Expand All @@ -116,6 +123,9 @@ SET(QGIS_3D_PRIVATE_HDRS
terrain/qgsterraintexturegenerator_p.h
terrain/qgsterraintextureimage_p.h
terrain/qgsterraintileentity_p.h
mesh/qgsmesh3dentity_p.h
mesh/qgsmesh3dgeometry_p.h
mesh/qgsmesh3dmaterial_p.h
)

QT5_ADD_RESOURCES(QGIS_3D_RCC_SRCS shaders.qrc)
Expand All @@ -125,6 +135,7 @@ QT5_ADD_RESOURCES(QGIS_3D_RCC_SRCS shaders.qrc)
INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/chunks
${CMAKE_CURRENT_SOURCE_DIR}/mesh
${CMAKE_CURRENT_SOURCE_DIR}/symbols
${CMAKE_CURRENT_SOURCE_DIR}/terrain
${CMAKE_SOURCE_DIR}/src/core/
Expand Down
3 changes: 3 additions & 0 deletions src/3d/chunks/qgschunkedentity_p.cpp
Expand Up @@ -56,6 +56,9 @@ static float screenSpaceError( float epsilon, float distance, float screenSize,

static float screenSpaceError( QgsChunkNode *node, const QgsChunkedEntity::SceneState &state )
{
if ( node->error() <= 0 ) //it happens for meshes
return 0;

float dist = node->bbox().distanceFromPoint( state.cameraPos );

// TODO: what to do when distance == 0 ?
Expand Down
108 changes: 108 additions & 0 deletions src/3d/mesh/qgsmesh3dentity_p.cpp
@@ -0,0 +1,108 @@
/***************************************************************************
qgsmesh3dentity.cpp
-------------------------
begin : january 2020
copyright : (C) 2020 by Vincent Cloarec
email : vcloarec at gmail dot com
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "qgsmesh3dentity_p.h"

#include <Qt3DRender/QGeometryRenderer>

#include "qgsmeshlayer.h"
#include "qgsmapsettings.h"
#include "qgs3dmapsettings.h"
#include "qgsmeshlayerrenderer.h"
#include "qgsterraintextureimage_p.h"
#include "qgsmesh3dmaterial_p.h"


QgsMesh3dEntity::QgsMesh3dEntity( const Qgs3DMapSettings &map,
const QgsTriangularMesh triangularMesh,
const QgsRectangle &extent,
const QgsMesh3DSymbol &symbol ):
mExtent( extent ),
mSymbol( symbol ),
mMapSettings( map ),
mTriangularMesh( triangularMesh )
{}

void QgsMesh3dEntity::build()
{
buildGeometry();
applyMaterial();
}

void QgsMesh3dEntity::buildGeometry()
{
Qt3DRender::QGeometryRenderer *mesh = new Qt3DRender::QGeometryRenderer;
QVector<double> fakeScalarMag( mTriangularMesh.vertices().count() );
for ( int i = 0; i < mTriangularMesh.vertices().count(); ++i )
{
fakeScalarMag[i] = mTriangularMesh.vertices().at( i ).z();
}

mesh->setGeometry( new QgsMesh3dGeometry( mTriangularMesh,
mExtent,
mSymbol.verticaleScale(),
mesh ) );

addComponent( mesh );

Qt3DCore::QTransform *tform = new Qt3DCore::QTransform;
tform->setTranslation( QVector3D( float( -mMapSettings.origin().x() ), 0, float( mMapSettings.origin().y() ) ) );
addComponent( tform );
}

void QgsMesh3dEntity::applyMaterial()
{
mMaterial = new QgsMesh3dMaterial( mSymbol );
addComponent( mMaterial );
}

QgsMesh3dTerrainTileEntity::QgsMesh3dTerrainTileEntity( const Qgs3DMapSettings &map,
const QgsTriangularMesh triangularMesh,
const QgsRectangle &extent,
const QgsMesh3DSymbol &symbol,
QgsChunkNodeId nodeId,
Qt3DCore::QNode *parent ):
QgsTerrainTileEntity( nodeId, parent ),
mExtent( extent ),
mSymbol( symbol ),
mMapSettings( map ),
mTriangularMesh( triangularMesh )
{}

void QgsMesh3dTerrainTileEntity::build()
{
buildGeometry();
applyMaterial();
}

void QgsMesh3dTerrainTileEntity::buildGeometry()
{
Qt3DRender::QGeometryRenderer *mesh = new Qt3DRender::QGeometryRenderer;

mesh->setGeometry( new QgsMesh3dGeometry( mTriangularMesh, mExtent, mSymbol.verticaleScale(), mesh ) );
addComponent( mesh );

Qt3DCore::QTransform *tform = new Qt3DCore::QTransform;
tform->setTranslation( QVector3D( float( -mMapSettings.origin().x() ), 0, float( mMapSettings.origin().y() ) ) );
addComponent( tform );
}

void QgsMesh3dTerrainTileEntity::applyMaterial()
{
mMaterial = new QgsMesh3dMaterial( mSymbol );
addComponent( mMaterial );
}
102 changes: 102 additions & 0 deletions src/3d/mesh/qgsmesh3dentity_p.h
@@ -0,0 +1,102 @@
/***************************************************************************
qgsmesh3dentity.h
-------------------------
begin : january 2020
copyright : (C) 2020 by Vincent Cloarec
email : vcloarec at gmail dot com
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#ifndef QGSMESHENTITY_H
#define QGSMESHENTITY_H

#include <Qt3DCore/QEntity>

#include "mesh/qgsmesh3dgeometry_p.h"
#include "qgs3dmapsettings.h"
#include "qgsmesh3dsymbol.h"
#include "qgsterraintileentity_p.h"

///@cond PRIVATE

//
// W A R N I N G
// -------------
//
// This file is not part of the QGIS API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//

class Qgs3DMapSettings;
class QgsTessellatedPolygonGeometry;
class QgsMesh3DSymbol;

class QgsMeshLayer;
class QgsMesh3dMaterial;

//! Entity that handles rendering of mesh
class QgsMesh3dEntity: public Qt3DCore::QEntity
{
public:
//! Constructor
QgsMesh3dEntity( const Qgs3DMapSettings &map,
const QgsTriangularMesh triangularMesh,
const QgsRectangle &extent,
const QgsMesh3DSymbol &symbol );

//! Builds the geometry and the material
void build();

private:
virtual void buildGeometry();
virtual void applyMaterial();

QgsRectangle mExtent;
QgsMesh3DSymbol mSymbol;
Qgs3DMapSettings mMapSettings;
QgsTriangularMesh mTriangularMesh;
QgsMesh3dMaterial *mMaterial = nullptr;

static int mMesh3DEntityCount;
QString name;
};

//! Entity that handles rendering of terrain mesh
class QgsMesh3dTerrainTileEntity: public QgsTerrainTileEntity
{
public:
QgsMesh3dTerrainTileEntity( const Qgs3DMapSettings &map,
const QgsTriangularMesh triangularMesh,
const QgsRectangle &extent,
const QgsMesh3DSymbol &symbol,
QgsChunkNodeId nodeId,
Qt3DCore::QNode *parent = nullptr );

void build();

private:
virtual void buildGeometry();
virtual void applyMaterial();

QgsRectangle mExtent;
QgsMesh3DSymbol mSymbol;
Qgs3DMapSettings mMapSettings;
QgsTriangularMesh mTriangularMesh;
QgsMesh3dMaterial *mMaterial = nullptr;

static int mMesh3DEntityCount;
QString name;
};

///@endcond

#endif // QGSMESHENTITY_H