Navigation Menu

Skip to content

Commit

Permalink
Merge pull request #33837 from vcloarec/3D_back_simple
Browse files Browse the repository at this point in the history
[Feature][Mesh][3D] new 3D mesh layer renderer
  • Loading branch information
wonder-sk committed Jan 16, 2020
2 parents a5c9b39 + 1b4de39 commit 5cb8997
Show file tree
Hide file tree
Showing 42 changed files with 2,632 additions and 334 deletions.
11 changes: 11 additions & 0 deletions src/3d/CMakeLists.txt
Expand Up @@ -62,6 +62,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 @@ -101,6 +107,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 @@ -122,6 +129,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 @@ -131,6 +141,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 @@ -59,6 +59,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

0 comments on commit 5cb8997

Please sign in to comment.