/**********************************************************************
Cube - Primitive class to encapsulate volumetric data
Copyright (C) 2008 Marcus D. Hanwell
This file is part of the Avogadro molecular editor project.
For more information, see
Avogadro 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.
Avogadro 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., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
**********************************************************************/
#include "mesh.h"
#include
#include
#include
using Eigen::Vector3f;
using std::vector;
namespace Avogadro {
Mesh::Mesh(QObject *parent) : Primitive(MeshType, parent), m_vertices(0),
m_normals(0), m_colors(0), m_stable(true), m_other(0), m_cube(0)
{
m_vertices.reserve(100);
m_normals.reserve(100);
m_colors.reserve(1);
}
Mesh::~Mesh()
{
}
bool Mesh::reserve(unsigned int size, bool colors)
{
QWriteLocker lock(m_lock);
m_vertices.reserve(size);
m_normals.reserve(size);
if (colors) m_colors.reserve(size);
return true;
}
void Mesh::setStable(bool stable)
{
QWriteLocker lock(m_lock);
m_stable = stable;
}
bool Mesh::stable()
{
QReadLocker lock(m_lock);
return m_stable;
}
const vector & Mesh::vertices() const
{
QReadLocker lock(m_lock);
return m_vertices;
}
const Vector3f * Mesh::vertex(int n) const
{
QReadLocker lock(m_lock);
return &(m_vertices[n]);
}
bool Mesh::setVertices(const vector &values)
{
QWriteLocker lock(m_lock);
m_vertices.clear();
m_vertices = values;
return true;
}
bool Mesh::addVertices(const vector &values)
{
QWriteLocker lock(m_lock);
if (m_vertices.capacity() < m_vertices.size() + values.size()) {
m_vertices.reserve(m_vertices.capacity()*2);
}
if (values.size() % 3 == 0) {
for (unsigned int i = 0; i < values.size(); ++i) {
m_vertices.push_back(values.at(i));
}
return true;
}
else {
qDebug() << "Error adding vertices." << values.size();
return false;
}
}
const vector & Mesh::normals() const
{
QReadLocker lock(m_lock);
return m_normals;
}
const Vector3f * Mesh::normal(int n) const
{
QReadLocker lock(m_lock);
return &(m_normals[n*3]);
}
bool Mesh::setNormals(const vector &values)
{
QWriteLocker lock(m_lock);
m_normals.clear();
m_normals = values;
return true;
}
bool Mesh::addNormals(const vector &values)
{
QWriteLocker lock(m_lock);
if (m_normals.capacity() < m_normals.size() + values.size()) {
m_normals.reserve(m_normals.capacity()*2);
}
if (values.size() % 3 == 0) {
for (unsigned int i = 0; i < values.size(); ++i) {
m_normals.push_back(values.at(i));
}
return true;
}
else {
qDebug() << "Error adding normals." << values.size();
return false;
}
}
const vector & Mesh::colors() const
{
QReadLocker lock(m_lock);
return m_colors;
}
const QColor * Mesh::color(int n) const
{
QReadLocker lock(m_lock);
// If there is only one color return that, otherwise colored by vertex
if (m_colors.size() == 1) {
return &(m_colors[0]);
}
else {
return &(m_colors[n*3]);
}
}
bool Mesh::setColors(const vector &values)
{
QWriteLocker lock(m_lock);
m_colors.clear();
m_colors = values;
return true;
}
bool Mesh::addColors(const vector &values)
{
QWriteLocker lock(m_lock);
if (m_colors.capacity() < m_colors.size() + values.size()) {
m_colors.reserve(m_colors.capacity()*2);
}
if (values.size() % 3 == 0) {
for (unsigned int i = 0; i < values.size(); ++i) {
m_colors.push_back(values.at(i));
}
return true;
}
else {
qDebug() << "Error adding colors." << values.size();
return false;
}
}
bool Mesh::valid() const
{
QWriteLocker lock(m_lock);
if (m_vertices.size() == m_normals.size()) {
if (m_colors.size() == 1 || m_colors.size() == m_vertices.size()) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
bool Mesh::clear()
{
QWriteLocker lock(m_lock);
m_vertices.clear();
m_normals.clear();
m_colors.clear();
return true;
}
Mesh& Mesh::operator=(const Mesh& other)
{
QWriteLocker lock(m_lock);
QReadLocker oLock(other.m_lock);
m_vertices = other.m_vertices;
m_normals = other.m_vertices;
m_colors = other.m_colors;
m_name = other.m_name;
return *this;
}
} // End namespace Avogadro
#include "mesh.moc"