surface_radiance.h 4.21 KB
Newer Older
1 2 3 4 5
#ifndef _SURFACE_RADIANCE_PLUGIN_H_
#define _SURFACE_RADIANCE_PLUGIN_H_

#include "plugin_interaction.h"
#include "surface_radiance_dockTab.h"
6
#include "dialog_computeRadianceDistance.h"
7 8 9

#include "Utils/sphericalHarmonics.h"
#include "Utils/Shaders/shaderRadiancePerVertex.h"
10
#include "Utils/drawer.h"
11

12
#include "Algo/Decimation/decimation.h"
13 14 15 16 17 18 19 20 21 22 23 24 25

namespace CGoGN
{

namespace SCHNApps
{

struct MapParameters
{
	MapParameters() :
		positionVBO(NULL),
		normalVBO(NULL),
		radianceTexture(NULL),
26 27 28 29 30
		paramVBO(NULL),
		positionApproximator(NULL),
		normalApproximator(NULL),
		radianceApproximator(NULL),
		selector(NULL)
31 32
	{}

33 34
	unsigned int nbVertices;

35 36 37 38 39
	Utils::VBO* positionVBO;
	Utils::VBO* normalVBO;

	CGoGN::Utils::ShaderRadiancePerVertex* radiancePerVertexShader;

40
	VertexAttribute<Utils::SphericalHarmonics<PFP2::REAL, PFP2::VEC3>, PFP2::MAP> radiance;
41 42 43
	Utils::Texture<2, Geom::Vec3f>* radianceTexture;
	VertexAttribute<Geom::Vec2i, PFP2::MAP> param;
	Utils::VBO* paramVBO;
44

45
//	DartAttribute<PFP2::REAL, PFP2::MAP> halfedgeError;
46

47 48 49
	Algo::Surface::Decimation::ApproximatorGen<PFP2>* positionApproximator;
	Algo::Surface::Decimation::ApproximatorGen<PFP2>* normalApproximator;
	Algo::Surface::Decimation::ApproximatorGen<PFP2>* radianceApproximator;
50 51

	Algo::Surface::Decimation::Selector<PFP2>* selector;
52 53 54 55 56 57
};

class Surface_Radiance_Plugin : public PluginInteraction
{
	Q_OBJECT
	Q_INTERFACES(CGoGN::SCHNApps::Plugin)
Sylvain Thery's avatar
Sylvain Thery committed
58 59 60
#if CGOGN_QT_DESIRED_VERSION == 5
	Q_PLUGIN_METADATA(IID "CGoGN.SCHNapps.Plugin")
#endif
61

62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
	friend class Surface_Radiance_DockTab;

public:
	Surface_Radiance_Plugin()
	{}

	~Surface_Radiance_Plugin()
	{}

	virtual bool enable();
	virtual void disable();

	virtual void draw(View *view) {}
	virtual void drawMap(View* view, MapHandlerGen* map);

	virtual void keyPress(View* view, QKeyEvent* event) {}
	virtual void keyRelease(View* view, QKeyEvent* event) {}
	virtual void mousePress(View* view, QMouseEvent* event) {}
	virtual void mouseRelease(View* view, QMouseEvent* event) {}
	virtual void mouseMove(View* view, QMouseEvent* event) {}
	virtual void wheelEvent(View* view, QWheelEvent* event) {}

	virtual void viewLinked(View *view) {}
	virtual void viewUnlinked(View *view) {}

private slots:
	// slots called from SCHNApps signals
	void selectedViewChanged(View* prev, View* cur);
	void selectedMapChanged(MapHandlerGen* prev, MapHandlerGen* cur);
	void mapAdded(MapHandlerGen* map);
	void mapRemoved(MapHandlerGen* map);
93
	void schnappsClosing();
94 95 96 97 98 99 100 101

	// slots called from MapHandler signals
	void vboAdded(Utils::VBO* vbo);
	void vboRemoved(Utils::VBO* vbo);
	void attributeModified(unsigned int orbit, QString nameAttr);

	void importFromFileDialog();

102 103 104
	void openComputeRadianceDistanceDialog();
	void computeRadianceDistanceFromDialog();

105 106 107 108 109
public slots:
	// slots for Python calls
	void changePositionVBO(const QString& map, const QString& vbo);
	void changeNormalVBO(const QString& map, const QString& vbo);
	MapHandlerGen* importFromFile(const QString& fileName);
110 111 112 113 114
	void decimate(
		const QString& mapName,
		const QString& positionAttributeName,
		const QString& normalAttributeName,
		float decimationGoal,
115 116 117
		bool halfCollapse = false,
		bool exportMeshes = false
	);
118
	void computeRadianceDistance(
119
		const QString& mapName1,
120 121 122 123 124
		const QString& positionAttributeName1,
		const QString& distanceAttributeName1,
		const QString& mapName2,
		const QString& positionAttributeName2,
		const QString& distanceAttributeName2
125
	);
126 127 128 129 130
	void exportPLY(
		const QString& mapName,
		const QString& positionAttributeName,
		const QString& normalAttributeName,
		const QString& filename
131
	);
132 133

protected:
134
	MapHandlerGen* currentlyDecimatedMap() { return m_currentlyDecimatedMap; }
135
	bool currentDecimationHalf() { return m_currentDecimationHalf; }
136 137
	static void checkNbVerticesAndExport(Surface_Radiance_Plugin* p, const unsigned int* nbVertices);

138
	Surface_Radiance_DockTab* m_dockTab;
139 140 141 142

	Dialog_ComputeRadianceDistance* m_computeRadianceDistanceDialog;
	QAction* m_computeRadianceDistanceAction;

143 144
	QHash<MapHandlerGen*, MapParameters> h_mapParameterSet;

145
	MapHandlerGen* m_currentlyDecimatedMap;
146
	bool m_currentDecimationHalf;
147 148 149
	std::vector<unsigned int> exportNbVert;
	unsigned int nextExportIndex;

150 151 152 153 154 155 156
	QAction* m_importAction;
};

} // namespace SCHNApps

} // namespace CGoGN

157
#endif // _SURFACE_RADIANCE_PLUGIN_H_