triangulation.cpp 6.52 KB
Newer Older
Pierre Kraemer's avatar
Pierre Kraemer committed
1 2 3
/*******************************************************************************
* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps  *
* version 0.1                                                                  *
4
* Copyright (C) 2009-2012, IGG Team, LSIIT, University of Strasbourg           *
Pierre Kraemer's avatar
Pierre Kraemer committed
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
*                                                                              *
* This library is free software; you can redistribute it and/or modify it      *
* under the terms of the GNU Lesser General Public License as published by the *
* Free Software Foundation; either version 2.1 of the License, or (at your     *
* option) any later version.                                                   *
*                                                                              *
* This library is distributed in the hope that it will be useful, but WITHOUT  *
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or        *
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License  *
* for more details.                                                            *
*                                                                              *
* You should have received a copy of the GNU Lesser General Public License     *
* along with this library; if not, write to the Free Software Foundation,      *
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.           *
*                                                                              *
20
* Web site: http://cgogn.unistra.fr/                                           *
Pierre Kraemer's avatar
Pierre Kraemer committed
21 22 23 24 25 26 27 28
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

#include <iostream>

#include "Utils/glutwin.h"

29 30

#include "Topology/generic/parameters.h"
31
#include "Topology/map/embeddedMap2.h"
Pierre Kraemer's avatar
Pierre Kraemer committed
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

#include "Geometry/vector_gen.h"

#include "Algo/Import/import.h"
#include "Algo/Geometry/boundingbox.h"
#include "Algo/Render/vbo_MapRender.h"


using namespace CGoGN ;


/**
 * Struct that contains some informations about the types of the manipulated objects
 * Mainly here to be used by the algorithms that are parameterized by it
 */
47
struct PFP: public PFP_STANDARD
Pierre Kraemer's avatar
Pierre Kraemer committed
48
{
Pierre Kraemer's avatar
Pierre Kraemer committed
49
	// definition of the map
50
	typedef EmbeddedMap2 MAP;
Pierre Kraemer's avatar
Pierre Kraemer committed
51 52 53 54 55 56 57 58 59 60 61 62 63
};

/**
 * A class for a little interface and rendering
 */
class MyGlutWin: public Utils::SimpleGlutWin
{
public:
     void myRedraw();

     PFP::REAL gWidthObj;
     PFP::VEC3 gPosObj;

Sylvain Thery's avatar
Sylvain Thery committed
64
     Algo::Render::GL2::MapRender_VBO* m_render;
Pierre Kraemer's avatar
Pierre Kraemer committed
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

 	MyGlutWin(int* argc, char **argv, int winX, int winY) : SimpleGlutWin(argc, argv, winX, winY) {}
 	~MyGlutWin()
 	{
 		delete m_render ;
 	}
};

// Routine d'affichage
void MyGlutWin::myRedraw()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glPushMatrix();

	// center the object
	float sc = 50.0f / gWidthObj;
	glScalef(sc, sc, sc);
	glTranslatef(-gPosObj[0], -gPosObj[1], -gPosObj[2]);

	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	glDisable(GL_LIGHTING);

	// draw the lines
	glColor3f(1.0f, 1.0f, 0.0f);
Sylvain Thery's avatar
Sylvain Thery committed
89
	m_render->draw(Algo::Render::GL2::LINES);
Pierre Kraemer's avatar
Pierre Kraemer committed
90 91 92 93 94

	// draw the faces
	glEnable(GL_POLYGON_OFFSET_FILL);
	glPolygonOffset(1.0f, 1.0f);
	glColor3f(0.0f, 0.5f, 0.0f);
Sylvain Thery's avatar
Sylvain Thery committed
95
	m_render->draw(Algo::Render::GL2::TRIANGLES);
Pierre Kraemer's avatar
Pierre Kraemer committed
96 97 98 99 100 101 102 103 104 105 106 107
	glDisable(GL_POLYGON_OFFSET_FILL);

	glPopMatrix();
}

template<typename PFP>
void TriangulateFromIndices(const AttributeHandler<typename PFP::VEC3>& position, const std::vector<unsigned int> indices, std::vector<unsigned int>& triangles)
{
	// pour eviter le typename ...
	typedef typename PFP::VEC3 VEC3F;

	// combien de sommets ?
108
	CGoGNout << "Nombre de sommets: "<< indices.size()<< CGoGNendl;
Pierre Kraemer's avatar
Pierre Kraemer committed
109 110 111 112 113 114

	//juste une boucle pour les afficher
	unsigned int num=0;
	for (std::vector<unsigned int>::const_iterator it = indices.begin(); it != indices.end(); ++it)
	{
		VEC3F P = position[*it];
115
		CGoGNout << "Sommet num "<< num++ << " : indice "<< *it << " = "<< P << CGoGNendl;
Pierre Kraemer's avatar
Pierre Kraemer committed
116 117 118 119 120 121 122 123 124 125 126 127 128
	}

}

template<typename PFP>
void TriangulateFromDart(typename PFP::MAP& map, const AttributeHandler<typename PFP::VEC3>& position, Dart d, std::vector<unsigned int>& triangles)
{
	std::vector<unsigned int> indices;

	// fait le tour de la face et stock les indices des points
	Dart e = d;
	do
	{
129
		indices.push_back( map.getEmbedding(e,VERTEX) ); // recupere l'indice du point dans le handler
Pierre Kraemer's avatar
Pierre Kraemer committed
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
		e = map.phi1(e); // brin suivant dans la face
	} while (e != d); // tq par revenu au debut

	// appel à la fonction independante de la carte
	TriangulateFromIndices<PFP>(position,indices, triangles);
}






int main(int argc, char **argv)
{
	// declaration of the map
	PFP::MAP myMap;

	// creation of a new attribute on vertices of type 3D vector
	// a handler to this attribute is returned
149
	AttributeHandler<PFP::VEC3> position = myMap.addAttribute<PFP::VEC3>(VERTEX, "position");
Pierre Kraemer's avatar
Pierre Kraemer committed
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196

	// creation face 1 (convexe)
	Dart d1 = myMap.newFace(5);

	// affecte les positions aux sommets
	Dart d = d1;

	position[d] = PFP::VEC3(-5, 0, 0);
	d = myMap.phi1(d);
	position[d] = PFP::VEC3(-1, 0, 0.3);
	d = myMap.phi1(d);
	position[d] = PFP::VEC3(-1, 3, 0.1);
	d = myMap.phi1(d);
	position[d] = PFP::VEC3(-3, 6, 0.7);
	d = myMap.phi1(d);
	position[d] = PFP::VEC3(-5, 4, 0.2);
	d = myMap.phi1(d);

	// seconde face (concave)
	Dart d2 = myMap.newFace(5);
	d = d2;
	position[d] = PFP::VEC3(1, 0, 0);
	d = myMap.phi1(d);
	position[d] = PFP::VEC3(5, 0, 0.4);
	d = myMap.phi1(d);
	position[d] = PFP::VEC3(5, 4, 0.1);
	d = myMap.phi1(d);
	position[d] = PFP::VEC3(2, 2, 0);
	d = myMap.phi1(d);
	position[d] = PFP::VEC3(1, 3, 0.2);
	d = myMap.phi1(d);

	// vecteur d'indices pour les triangles
	std::vector<unsigned int> triangles;

	// triangule la deuxieme face
	TriangulateFromDart<PFP>(myMap, position, d2, triangles);

    // instanciation of the interface
	MyGlutWin mgw(&argc, argv, 800, 800);

    // computation of the bounding box
    Geom::BoundingBox<PFP::VEC3> bb = Algo::Geometry::computeBoundingBox<PFP>(myMap, position);
    mgw.gWidthObj = std::max<PFP::REAL>(std::max<PFP::REAL>(bb.size(0), bb.size(1)), bb.size(2));
    mgw.gPosObj = (bb.min() +  bb.max()) / PFP::REAL(2);

    // instanciation of the renderer (here using VBOs)
Sylvain Thery's avatar
Sylvain Thery committed
197
    mgw.m_render = new Algo::Render::GL2::MapRender_VBO();
Pierre Kraemer's avatar
Pierre Kraemer committed
198 199

    // update the renderer (primitives and geometry)
Sylvain Thery's avatar
Sylvain Thery committed
200 201 202
    mgw.m_render->initPrimitives<PFP>(myMap, allDarts, Algo::Render::GL2::TRIANGLES);
    mgw.m_render->initPrimitives<PFP>(myMap, allDarts, Algo::Render::GL2::LINES);
    mgw.m_render->updateData(Algo::Render::GL2::POSITIONS, position);
Pierre Kraemer's avatar
Pierre Kraemer committed
203 204 205 206 207

    mgw.mainLoop();

    return 0;
}