1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
/**************************************************************************/
/* Copyright 2009 Tim Day */
/* */
/* This file is part of Fracplanet */
/* */
/* Fracplanet 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 3 of the License, or */
/* (at your option) any later version. */
/* */
/* Fracplanet 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 Fracplanet. If not, see <http://www.gnu.org/licenses/>. */
/**************************************************************************/
/*! \file
\brief Interface for class Vertex.
*/
#ifndef _vertex_h_
#define _vertex_h_
#include "rgb.h"
#include "xyz.h"
//! Class to store vertex state information
/*! There is no direct access to members.
Should probably be a protected member class of TriangleMesh.
sizeof(Vertex) should ideally be 3*4+3*4+2*4=32
*/
class Vertex
{
public:
//! Constructor. NB Almost no default values set.
Vertex()
{}
//! Copy constructor.
Vertex(const Vertex& v)
:_position(v._position)
,_normal(v._normal)
{
_colour[0]=v._colour[0];
_colour[1]=v._colour[1];
}
//! Construct from position only.
explicit Vertex(const XYZ& p)
:_position(p)
,_normal(0.0,0.0,0.0)
{
_colour[0]=ByteRGBA(0,0,0,255);
_colour[1]=ByteRGBA(0,0,0,255);
}
//! Accessor.
const XYZ& position() const
{
return _position;
}
//! Accessor.
const XYZ& normal() const
{
return _normal;
}
//! Accessor.
const ByteRGBA& colour(uint c) const
{
assert(c<2);
return _colour[c];
}
//! Accessor.
void position(const XYZ& p)
{
_position=p;
}
//! Accessor.
void normal(const XYZ& n)
{
_normal=n;
}
//! Accessor.
void colour(uint c,const ByteRGBA& col)
{
assert(c<2);
_colour[c]=col;
}
//! Accessor.
void colour(uint c,const FloatRGBA& col)
{
assert(c<2);
_colour[c]=ByteRGBA(col);
}
private:
//! Position of vertex.
XYZ _position;
//! Normal at vertex (for smooth shading).
XYZ _normal;
//! Colours at vertex (could be a different colour in different triangles).
/*! By convention, in triangle meshes with emissive in use, we overload the alpha
channel to indicate emissive (zero indicates emissive) shading is required.
Actual alpha or emissive are therefore mutually exclusive (anticipate alpha for clouds, emissive for ground).
*/
ByteRGBA _colour[2];
};
#endif
|