Starting from 2021-07-01, all LRZ GitLab users will be required to explicitly accept the GitLab Terms of Service. Please see the detailed information at https://doku.lrz.de/display/PUBLIC/GitLab and make sure that your projects conform to the requirements.

Commit 0e27f529 authored by schultezub's avatar schultezub
Browse files

Started implementing geometry data structures:

 * added GeometryData base class
 * added early FaceGeometry class

git-svn-id: https://camplinux.in.tum.de/svn/campvis/trunk@270 bb408c1c-ae56-11e1-83d9-df6b3e0c105e
parent 8d2101f4
// ================================================================================================
//
// This file is part of the TUMVis Visualization Framework.
//
// If not explicitly stated otherwise: Copyright (C) 2012, all rights reserved,
// Christian Schulte zu Berge (christian.szb@in.tum.de)
// Chair for Computer Aided Medical Procedures
// Technische Universitt Mnchen
// Boltzmannstr. 3, 85748 Garching b. Mnchen, Germany
//
// The licensing of this softare is not yet resolved. Until then, redistribution in source or
// binary forms outside the CAMP chair is not permitted, unless explicitly stated in legal form.
// However, the names of the original authors and the above copyright notice must retain in its
// original state in any case.
//
// Legal disclaimer provided by the BSD license:
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// ================================================================================================
#include "facegeometry.h"
#include "tgt/assert.h"
#include "tgt/logmanager.h"
#include "tgt/buffer.h"
#include "tgt/vertexarrayobject.h"
namespace TUMVis {
const std::string FaceGeometry::loggerCat_ = "TUMVis.core.datastructures.FaceGeometry";
FaceGeometry::FaceGeometry(const std::vector<tgt::vec3>& vertices, const std::vector<tgt::vec3>& textureCoordinates /*= std::vector<tgt::vec3>()*/, const std::vector<tgt::vec4>& colors /*= std::vector<tgt::vec4>()*/, const std::vector<tgt::vec3>& normals /*= std::vector<tgt::vec3>() */)
: AbstractData()
, _vertices(vertices)
, _textureCoordinates(textureCoordinates)
, _colors(colors)
, _normals(normals)
, _faceNormal(0.f)
, _buffersInitialized(false)
, _verticesBuffer(0)
, _texCoordsBuffer(0)
, _colorsBuffer(0)
, _normalsBuffer(0)
, _vao(0)
{
tgtAssert(textureCoordinates.empty() || textureCoordinates.size() == vertices.size(), "Texture coordinates vector must be either empty or of the same size as the vertex vector.");
tgtAssert(colors.empty() || colors.size() == vertices.size(), "Colors vector must be either empty or of the same size as the vertex vector.");
tgtAssert(normals.empty() || normals.size() == vertices.size(), "Normals vector must be either empty or of the same size as the vertex vector.");
// compute normal (class invariant states, that all vertices lie in the same plane):
if (_vertices.size() > 2) {
_faceNormal = tgt::normalize(tgt::cross(vertices[1] - vertices[0], vertices[2] - vertices[0]));
}
}
FaceGeometry::~FaceGeometry() {
delete _vao;
delete _verticesBuffer;
delete _texCoordsBuffer;
delete _colorsBuffer;
delete _normalsBuffer;
}
FaceGeometry* FaceGeometry::clone() const {
return new FaceGeometry(_vertices, _textureCoordinates, _colors, _normals);
}
size_t FaceGeometry::size() const {
return _vertices.size();
}
const std::vector<tgt::vec3>& FaceGeometry::getVertices() const {
return _vertices;
}
const std::vector<tgt::vec4>& FaceGeometry::getColors() const {
return _colors;
}
const std::vector<tgt::vec3>& FaceGeometry::getNormals() const {
return _normals;
}
const std::vector<tgt::vec3>& FaceGeometry::getTextureCoordinates() const {
return _textureCoordinates;
}
const tgt::vec3& FaceGeometry::getFaceNormal() const {
return _faceNormal;
}
void FaceGeometry::render() {
createGLBuffers();
if (! _buffersInitialized) {
LERROR("Cannot render without initialized OpenGL buffers.");
return;
}
tgt::VertexArrayObject vao;
if (_verticesBuffer)
vao.addVertexAttribute(tgt::VertexArrayObject::VerticesAttribute, _verticesBuffer);
if (_texCoordsBuffer)
vao.addVertexAttribute(tgt::VertexArrayObject::TextureCoordinatesAttribute, _texCoordsBuffer);
if (_colorsBuffer)
vao.addVertexAttribute(tgt::VertexArrayObject::ColorsAttribute, _colorsBuffer);
if (_normalsBuffer)
vao.addVertexAttribute(tgt::VertexArrayObject::NormalsAttribute, _normalsBuffer);
if (_vertices.size() > 2)
glDrawArrays(GL_POLYGON, 0, _vertices.size());
else
glDrawArrays(GL_LINES, 0, _vertices.size());
}
void FaceGeometry::createGLBuffers() {
if (! _buffersInitialized) {
try {
_verticesBuffer = new tgt::BufferObject();
_verticesBuffer->data(tgt::BufferObject::ARRAY_BUFFER, tgt::BufferObject::USAGE_STATIC_DRAW, &_vertices.front(), _vertices.size() * sizeof(tgt::vec3), tgt::BufferObject::FLOAT, 3);
if (! _textureCoordinates.empty()) {
_texCoordsBuffer = new tgt::BufferObject();
_texCoordsBuffer->data(tgt::BufferObject::ARRAY_BUFFER, tgt::BufferObject::USAGE_STATIC_DRAW, &_textureCoordinates.front(), _textureCoordinates.size() * sizeof(tgt::vec3), tgt::BufferObject::FLOAT, 3);
}
if (! _colors.empty()) {
_colorsBuffer = new tgt::BufferObject();
_colorsBuffer->data(tgt::BufferObject::ARRAY_BUFFER, tgt::BufferObject::USAGE_STATIC_DRAW, &_colors.front(), _colors.size() * sizeof(tgt::vec4), tgt::BufferObject::FLOAT, 4);
}
if (! _normals.empty()) {
_normalsBuffer = new tgt::BufferObject();
_normalsBuffer->data(tgt::BufferObject::ARRAY_BUFFER, tgt::BufferObject::USAGE_STATIC_DRAW, &_normals.front(), _normals.size() * sizeof(tgt::vec3), tgt::BufferObject::FLOAT, 3);
}
}
catch (tgt::Exception& e) {
LERROR("Error creating OpenGL Buffer objects: " << e.what());
_buffersInitialized = false;
return;
}
_buffersInitialized = true;
}
}
}
\ No newline at end of file
// ================================================================================================
//
// This file is part of the TUMVis Visualization Framework.
//
// If not explicitly stated otherwise: Copyright (C) 2012, all rights reserved,
// Christian Schulte zu Berge (christian.szb@in.tum.de)
// Chair for Computer Aided Medical Procedures
// Technische Universität München
// Boltzmannstr. 3, 85748 Garching b. München, Germany
//
// The licensing of this softare is not yet resolved. Until then, redistribution in source or
// binary forms outside the CAMP chair is not permitted, unless explicitly stated in legal form.
// However, the names of the original authors and the above copyright notice must retain in its
// original state in any case.
//
// Legal disclaimer provided by the BSD license:
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
// CONTRIBUTORS BE LIABLE FLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// ================================================================================================
#ifndef FACEGEOMETRY_H__
#define FACEGEOMETRY_H__
#include "tgt/vector.h"
#include "core/datastructures/abstractdata.h"
#include <vector>
namespace tgt {
class BufferObject;
class VertexArrayObject;
}
namespace TUMVis {
/**
* Class for face geometry.
* Every FaceGeometry has a list of vertices which also defines the number of elements (size).
* Colors, normals and texture coordinates are optional. Their lists are either empty or as
* large as the vertex list. Furthermore, each FaceGeometry has a face normal.
*
* The internal OpenGL buffers are lazy-instantiated.
*
* \note This class expects all vertices lying within one plane. Everything other that that
* leads to undefined behavior.
* \note Like all Geometry classes FaceGeometry has value-sematics: Once created, the
* vertices/colors/etc. cannot be altered anymore.
*/
class FaceGeometry : public AbstractData {
public:
/**
* Creates a new FaceGeometry.
* \param vertices The list of the vertex positions of the face.
* \param textureCoordinates The list of vertex texture coordinates, may be empty.
* \param colors The list of vertex colors, may be empty.
* \param normals The list of vertex normals, may be empty.
*/
FaceGeometry(
const std::vector<tgt::vec3>& vertices,
const std::vector<tgt::vec3>& textureCoordinates = std::vector<tgt::vec3>(),
const std::vector<tgt::vec4>& colors = std::vector<tgt::vec4>(),
const std::vector<tgt::vec3>& normals = std::vector<tgt::vec3>()
);
/**
* Destructor, deletes VBOs/VAO if necessary. Hence, needs a valid OpenGL context
*/
virtual ~FaceGeometry();
/// \see AbstractData::clone()
virtual FaceGeometry* clone() const;
/**
* Returns the number of vertices of this face.
* \return _vertices.size()
*/
size_t size() const;
/**
* The list of the vertex positions of the face.
* \return _vertices
*/
const std::vector<tgt::vec3>& getVertices() const;
/**
* The list of vertex colors, may be empty.
* \return _colors
*/
const std::vector<tgt::vec4>& getColors() const;
/**
* The list of vertex normals, may be empty.
* \return _normals
*/
const std::vector<tgt::vec3>& getNormals() const;
/**
* The list of vertex texture coordinates, may be empty.
* \return _textureCoordinates
*/
const std::vector<tgt::vec3>& getTextureCoordinates() const;
/**
* The normal vector of this face.
* \return _faceNormal
*/
const tgt::vec3& getFaceNormal() const;
/**
* Renders this FaceGeometry.
* Must be called from a valid OpenGL context.
*/
void render();
/**
* Creates the OpenGL VBOs and the VAO for this face's geometry.
* Must be called from a valid OpenGL context.
*/
void createGLBuffers();
protected:
FaceGeometry(const FaceGeometry& rhs);
FaceGeometry& operator=(const FaceGeometry& rhs);
std::vector<tgt::vec3> _vertices; ///< The list of the vertex positions of the face.
std::vector<tgt::vec3> _textureCoordinates; ///< The list of vertex texture coordinates, may be empty.
std::vector<tgt::vec4> _colors; ///< The list of vertex colors, may be empty.
std::vector<tgt::vec3> _normals; ///< The list of vertex normals, may be empty.
tgt::vec3 _faceNormal; ///< The normal vector of this face.
bool _buffersInitialized;
tgt::BufferObject* _verticesBuffer;
tgt::BufferObject* _texCoordsBuffer;
tgt::BufferObject* _colorsBuffer;
tgt::BufferObject* _normalsBuffer;
tgt::VertexArrayObject* _vao;
static const std::string loggerCat_;
};
}
#endif // FACEGEOMETRY_H__
// ================================================================================================
//
// This file is part of the TUMVis Visualization Framework.
//
// If not explicitly stated otherwise: Copyright (C) 2012, all rights reserved,
// Christian Schulte zu Berge (christian.szb@in.tum.de)
// Chair for Computer Aided Medical Procedures
// Technische Universität München
// Boltzmannstr. 3, 85748 Garching b. München, Germany
//
// The licensing of this softare is not yet resolved. Until then, redistribution in source or
// binary forms outside the CAMP chair is not permitted, unless explicitly stated in legal form.
// However, the names of the original authors and the above copyright notice must retain in its
// original state in any case.
//
// Legal disclaimer provided by the BSD license:
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// ================================================================================================
#include "geometrydata.h"
namespace TUMVis {
GeometryData::GeometryData()
: AbstractData()
{
}
GeometryData::~GeometryData() {
}
}
\ No newline at end of file
// ================================================================================================
//
// This file is part of the TUMVis Visualization Framework.
//
// If not explicitly stated otherwise: Copyright (C) 2012, all rights reserved,
// Christian Schulte zu Berge (christian.szb@in.tum.de)
// Chair for Computer Aided Medical Procedures
// Technische Universität München
// Boltzmannstr. 3, 85748 Garching b. München, Germany
//
// The licensing of this softare is not yet resolved. Until then, redistribution in source or
// binary forms outside the CAMP chair is not permitted, unless explicitly stated in legal form.
// However, the names of the original authors and the above copyright notice must retain in its
// original state in any case.
//
// Legal disclaimer provided by the BSD license:
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// ================================================================================================
#ifndef GEOMETRYDATA_H__
#define GEOMETRYDATA_H__
#include "core/datastructures/abstractdata.h"
namespace TUMVis {
/**
* Abstract base class for data handled by a DataHandle and stored in a DataContainer.
*
* \todo
*/
class GeometryData : public AbstractData {
public:
GeometryData();
virtual ~GeometryData();
virtual AbstractData* clone() const = 0;
protected:
};
}
#endif // GEOMETRYDATA_H__
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment