//*****************************************************************************************
// Truevision - a 3d modeler for povray
//
// polygon.h
//
// Vincent LE PRINCE <vincentleprince@users.sourceforge.net>
// Copyright (C) 2000-2005 Vincent LE PRINCE
// This file is part of the TRUEVISION Package
// 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.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
//*******************************************************************************************
#ifndef TV_POLYGON_H
#define TV_POLYGON_H
using namespace std;
#include "object3d.h"
#include "include/obj3dcsg.h"
#include <vector>
#include "include/utils3d.h"
#include "include/vertex.h"
class Mesh;
class ExtractTool;
// Mesh Quads
class Polygon {
friend class ExtractTool;
private:
vector<Vertex*> points;
int pickname;
bool selected;
double normal[3];
double center[3];
public:
Polygon() { selected = false; }
Polygon( Polygon & ref );
~Polygon() { points.clear(); }
void add_point( Vertex *point ) { points.push_back( point ); }
void clear_points() { points.clear(); }
void display( int smooth_type, bool trans = false, int pick = -1 );
void push_normal();
void select() { selected = true; }
void unselect() { selected = false; }
void toggle_selection() { selected = ! selected; }
bool is_selected() { return selected; }
bool is_picked( int pick ) { return ( pick == pickname ) ? true : false; }
void output_to_povray( ofstream & file, int smooth_type );
void save( ofstream & file, Mesh *mesh );
void load( ifstream & file, char *tag, Mesh *mesh );
int get_size() { return points.size(); }
Vertex *get_point( int i ) { return points[i]; }
void compute_normal();
double *get_poly_normal() { compute_normal(); return normal; }
void compute_center();
double *get_poly_center() { compute_center(); return center; }
void swap_points( Vertex *orig, Vertex *changed );
bool use_point( Vertex *pt );
void push_edges( Mesh *mesh );
void extract( Mesh *mesh );
void tesselate( Mesh *mesh );
void flatten();
};
#endif