diff --git a/libs_required/ACG/Scenegraph/LineNode.cc b/libs_required/ACG/Scenegraph/LineNode.cc index 99f0e2596cf7405868794961fa3e2ad17c3c4c45..0f5ebe7c77c755db966b07942be01328f13861cc 100644 --- a/libs_required/ACG/Scenegraph/LineNode.cc +++ b/libs_required/ACG/Scenegraph/LineNode.cc @@ -232,6 +232,11 @@ void LineNode:: draw(GLState& _state , const DrawModes::DrawMode& _drawMode) { + if(_state.compatibilityProfile()) + drawCompat(_state, _drawMode); + else + { + /* //Node Based Drawing is not supported on Core profiles if (_drawMode & DrawModes::WIREFRAME) { ACG::GLState::disable(GL_LIGHTING); @@ -343,6 +348,7 @@ draw(GLState& _state , const DrawModes::DrawMode& _drawMode) } //glEnd(); + }*/ } } @@ -364,13 +370,15 @@ leave(GLState& _state , const DrawModes::DrawMode& _drawMode) void LineNode::pick(GLState& _state , PickTarget _target) { + if(_state.compatibilityProfile()) + pickCompat(_state, _target); + else + { if (n_points() == 0) return; // Bind the vertex array ACG::GLState::bindBuffer(GL_ARRAY_BUFFER_ARB, 0); - ACG::GLState::vertexPointer( &(points_)[0] ); - ACG::GLState::enableClientState(GL_VERTEX_ARRAY); const size_t n_edges = n_points() - 1; @@ -393,53 +401,14 @@ void LineNode::pick(GLState& _state , PickTarget _target) default: break; } - - //Disable the vertex array - ACG::GLState::disableClientState(GL_VERTEX_ARRAY); + } } //---------------------------------------------------------------------------- void LineNode::pick_edges(GLState& _state, unsigned int _offset) { - // Check if we have any edges to draw (% 0 causes division by zero on windows) - if (n_points() < 2) - return; - - const float line_width_old = _state.line_width(); - _state.set_line_width(picking_line_width()); - _state.pick_set_name (0); - - glDepthRange(0.0, 0.99); - - if (line_mode_ == PolygonMode) - { - const size_t n_edges = n_points() - 1; - for (size_t i = 0; i < n_edges; ++i) - { - _state.pick_set_name(i + _offset); - glBegin(GL_LINES); - glArrayElement(static_cast<GLint>(i)); - glArrayElement(static_cast<GLint>(i + 1)); - glEnd(); - } - } - else if (line_mode_ == LineSegmentsMode) - { - const size_t n_edges = n_points() / 2; - for (size_t i = 0; i < n_edges; ++i) - { - _state.pick_set_name(i + _offset); - glBegin(GL_LINES); - glArrayElement(static_cast<GLint>(2*i)); - glArrayElement(static_cast<GLint>(2*i + 1)); - glEnd(); - } - } - - glDepthRange(0.0, 1.0); - - _state.set_line_width(line_width_old); + //TODO: implement edge picking for lines in CoreProfile } //---------------------------------------------------------------------------- diff --git a/libs_required/ACG/Scenegraph/LineNode.hh b/libs_required/ACG/Scenegraph/LineNode.hh index 915e677488c4290c31773e6779b4bc744dc2c452..93806acb422a433353f741aca64ba6062599e621 100644 --- a/libs_required/ACG/Scenegraph/LineNode.hh +++ b/libs_required/ACG/Scenegraph/LineNode.hh @@ -136,12 +136,14 @@ public: /// draw lines and normals void draw(GLState& _state, const DrawModes::DrawMode& _drawMode); + void drawCompat(GLState& _state, const DrawModes::DrawMode& _drawMode); /// reset depth function to what it was before enter() void leave(GLState& _state, const DrawModes::DrawMode& _drawMode); /// Draw the line using the GL picking name stack void pick(GLState& _state , PickTarget _target); + void pickCompat(GLState& _state , PickTarget _target); /// reserve mem for _n lines void reserve_lines(unsigned int _n) { points_.reserve(2*_n); } @@ -222,6 +224,7 @@ protected: void pick_vertices(GLState& _state); void pick_edges (GLState& _state, unsigned int _offset); + void pick_edgesCompat (GLState& _state, unsigned int _offset); /// creates the vbo only if update was requested void createVBO(); diff --git a/libs_required/ACG/Scenegraph/LineNodeGLCompat.cc b/libs_required/ACG/Scenegraph/LineNodeGLCompat.cc new file mode 100644 index 0000000000000000000000000000000000000000..2c8c4834258c9b36d593f41180008c79f5c3641d --- /dev/null +++ b/libs_required/ACG/Scenegraph/LineNodeGLCompat.cc @@ -0,0 +1,274 @@ +/*===========================================================================*\ + * * + * OpenFlipper * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openflipper.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenFlipper. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * 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. * + * * +\*===========================================================================*/ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Author$ * + * $Date$ * + * * +\*===========================================================================*/ + + + + +//============================================================================= +// +// CLASS LineNode - IMPLEMENTATION +// +//============================================================================= + +//== INCLUDES ================================================================= +#include <ACG/GL/acg_glew.hh> +#include "LineNode.hh" +#include <ACG/GL/IRenderer.hh> + +//== NAMESPACES =============================================================== + +namespace ACG { +namespace SceneGraph { + +//== IMPLEMENTATION ========================================================== + +void +LineNode:: +drawCompat(GLState& _state , const DrawModes::DrawMode& _drawMode) +{ + if (_drawMode & DrawModes::WIREFRAME) + { + ACG::GLState::disable(GL_LIGHTING); + + + // if (line_mode_ == LineSegmentsMode) + // glBegin(GL_LINES); + // else + // glBegin(GL_LINE_STRIP); + + + if (line_mode_ == LineSegmentsMode) + { + // first check if (new standard) 4-channel colors are specified + if( (points_.size()/2 == colors4f_.size()) ) + { + // enable blending of lines + GLboolean blendb; + glGetBooleanv( GL_BLEND, &blendb); + glEnable(GL_BLEND); + // blend ontop of prev. drawn mesh + GLboolean depthmaskb; + glGetBooleanv( GL_DEPTH_WRITEMASK, &depthmaskb); + glDepthMask(GL_FALSE); + + glBegin(GL_LINES); + + ConstPointIter p_it=points_.begin(), p_end=points_.end(); + ConstColor4fIter c_it=colors4f_.begin(); + + Color4f c(1.0f,1.0f,1.0f,1.0f); + if(c_it != colors4f_.end()) { + c = *c_it; + } + + int cnt = 0; + for (; p_it!=p_end; ++p_it) + { + if ((cnt > 0) && (cnt % 2 == 0) && (c_it+1) != colors4f_.end()) { + ++c_it; + c = *c_it; + } + + glColor(c); + glVertex(*p_it); + + ++cnt; + } + + glEnd(); + + // disable blending of lines + if( blendb == GL_FALSE ) + glDisable(GL_BLEND); + + // enable depth mask + if( depthmaskb == GL_TRUE ) + glDepthMask(GL_TRUE); + + } + else if ((line_mode_ == LineSegmentsMode) && (points_.size()/2 == colors_.size()) ) + { + glBegin(GL_LINES); + ConstPointIter p_it=points_.begin(), p_end=points_.end(); + ConstColorIter c_it=colors_.begin(); + + Color c((char)255, (char)255, (char)255); + if(c_it != colors_.end()) { + c = *c_it; + } + + int cnt = 0; + for (; p_it!=p_end; ++p_it) + { + if ((cnt > 0) && (cnt % 2 == 0) && (c_it+1) != colors_.end()) { + ++c_it; + c = *c_it; + } + + glColor(c); + glVertex(*p_it); + + ++cnt; + } + glEnd(); + } + else + { + glBegin(GL_LINES); + + ConstPointIter p_it=points_.begin(), p_end=points_.end(); + + for (; p_it!=p_end; ++p_it) + { + glVertex(*p_it); + } + + glEnd(); + } + } + else + { + _state.set_color(_state.base_color()); + glBegin(GL_LINE_STRIP); + ConstPointIter p_it=points_.begin(), p_end=points_.end(); + for (; p_it!=p_end; ++p_it) + glVertex(*p_it); + glEnd(); + } + + //glEnd(); + } +} + +//---------------------------------------------------------------------------- + +void LineNode::pickCompat(GLState& _state , PickTarget _target) +{ + if (n_points() == 0) + return; + + // Bind the vertex array + ACG::GLState::bindBuffer(GL_ARRAY_BUFFER_ARB, 0); + ACG::GLState::vertexPointer( &(points_)[0] ); + ACG::GLState::enableClientState(GL_VERTEX_ARRAY); + + const size_t n_edges = n_points() - 1; + + switch (_target) + { + case PICK_EDGE: + { + _state.pick_set_maximum (n_edges); + pick_edgesCompat(_state, 0); + break; + } + + case PICK_ANYTHING: + { + _state.pick_set_maximum (n_edges); + pick_edgesCompat(_state, 0); + break; + } + + default: + break; + } + + //Disable the vertex array + ACG::GLState::disableClientState(GL_VERTEX_ARRAY); +} + +//---------------------------------------------------------------------------- + +void LineNode::pick_edgesCompat(GLState& _state, unsigned int _offset) +{ + // Check if we have any edges to draw (% 0 causes division by zero on windows) + if (n_points() < 2) + return; + + const float line_width_old = _state.line_width(); + _state.set_line_width(picking_line_width()); + _state.pick_set_name (0); + + glDepthRange(0.0, 0.99); + + if (line_mode_ == PolygonMode) + { + const size_t n_edges = n_points() - 1; + for (size_t i = 0; i < n_edges; ++i) + { + _state.pick_set_name(i + _offset); + glBegin(GL_LINES); + glArrayElement(static_cast<GLint>(i)); + glArrayElement(static_cast<GLint>(i + 1)); + glEnd(); + } + } + else if (line_mode_ == LineSegmentsMode) + { + const size_t n_edges = n_points() / 2; + for (size_t i = 0; i < n_edges; ++i) + { + _state.pick_set_name(i + _offset); + glBegin(GL_LINES); + glArrayElement(static_cast<GLint>(2*i)); + glArrayElement(static_cast<GLint>(2*i + 1)); + glEnd(); + } + } + + glDepthRange(0.0, 1.0); + + _state.set_line_width(line_width_old); +} + +//============================================================================= +} // namespace SceneGraph +} // namespace ACG +//============================================================================= diff --git a/libs_required/ACG/Scenegraph/TextNode.cc b/libs_required/ACG/Scenegraph/TextNode.cc index dabbaf88b5c742253b4f5e48248a6c163902cb15..18de3ebfc3959a8dbdad15eced659da897eccc26 100644 --- a/libs_required/ACG/Scenegraph/TextNode.cc +++ b/libs_required/ACG/Scenegraph/TextNode.cc @@ -246,31 +246,29 @@ createMap() { void TextNode:: -enter(GLState& _state, const DrawModes::DrawMode& /*_drawmode*/) { +enter(GLState& _state, const DrawModes::DrawMode& _drawmode) { + if(_state.compatibilityProfile()) + enterCompat(_state,_drawmode); + else + { if (text_.empty()) return; // store current gl state cullFaceEnabled_ = glIsEnabled(GL_CULL_FACE); - texture2dEnabled_ = glIsEnabled(GL_TEXTURE_2D); blendEnabled_ = glIsEnabled(GL_BLEND); depthEnabled_ = glIsEnabled(GL_DEPTH_TEST); - alphaTest_ = glIsEnabled(GL_ALPHA_TEST); - if (alphaTest_) - ACG::GLState::getAlphaFunc(&alphaTestFunc_, &alphaTestValue_); glGetIntegerv(GL_BLEND_SRC, &blendSrc_); glGetIntegerv(GL_BLEND_DST, &blendDest_); // set texture and drawing states ACG::GLState::disable(GL_CULL_FACE); - ACG::GLState::enable(GL_TEXTURE_2D); ACG::GLState::enable(GL_BLEND); - ACG::GLState::enable(GL_ALPHA_TEST); - ACG::GLState::alphaFunc(GL_GREATER, 0.2f); ACG::GLState::blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (alwaysOnTop_) ACG::GLState::disable(GL_DEPTH_TEST); + } } @@ -280,27 +278,26 @@ enter(GLState& _state, const DrawModes::DrawMode& /*_drawmode*/) { void TextNode:: -leave(GLState& /*_state*/, const DrawModes::DrawMode& /*_drawmode*/) { +leave(GLState& _state, const DrawModes::DrawMode& _drawmode) { + if(_state.compatibilityProfile()) + leaveCompat(_state, _drawmode); + else + { if (text_.empty()) return; // restore the GLState as it was when entering TextNode if (cullFaceEnabled_) - ACG::GLState::enable(GL_CULL_FACE); - if (!texture2dEnabled_) - ACG::GLState::disable(GL_TEXTURE_2D); + ACG::GLState::enable(GL_CULL_FACE); if (!blendEnabled_) ACG::GLState::disable(GL_BLEND); if (depthEnabled_) ACG::GLState::enable(GL_DEPTH_TEST); else - ACG::GLState::disable(GL_DEPTH_TEST); - if (!alphaTest_) - ACG::GLState::disable(GL_ALPHA_TEST); - else - ACG::GLState::alphaFunc(alphaTestFunc_, alphaTestValue_); + ACG::GLState::disable(GL_DEPTH_TEST); ACG::GLState::blendFunc(blendSrc_, blendDest_); + } } @@ -322,7 +319,7 @@ draw(GLState& _state, const DrawModes::DrawMode& /*_drawMode*/) _state.push_modelview_matrix(); _state.scale(size_); - glDrawArrays(GL_QUADS, 0, int(text_.size() * 4) ); + glDrawArrays(GL_TRIANGLES, 0, int(text_.size() * 6) ); _state.pop_modelview_matrix(); if (textMode_ == SCREEN_ALIGNED || textMode_ == SCREEN_ALIGNED_STATIC_SIZE) { @@ -500,6 +497,24 @@ updateVBO() { vertexBuffer_.push_back(avgWidth*0.15); vertexBuffer_.push_back(0.0f); + // texture coordinates + vertexBuffer_.push_back(rightTx); + vertexBuffer_.push_back(topTx); + + // bottom left + vertexBuffer_.push_back(left); + vertexBuffer_.push_back(0.0f); + vertexBuffer_.push_back(0.0f); + + // texture coordinates + vertexBuffer_.push_back(leftTx); + vertexBuffer_.push_back(bottomTx); + + // top right + vertexBuffer_.push_back(right); + vertexBuffer_.push_back(avgWidth*0.15); + vertexBuffer_.push_back(0.0f); + // texture coordinates vertexBuffer_.push_back(rightTx); vertexBuffer_.push_back(topTx); @@ -626,7 +641,7 @@ getRenderObjects(ACG::IRenderer* _renderer, ACG::GLState& _state , const ACG::S localMaterial.specularColor(ACG::Vec4f(0.0, 0.0, 0.0, 0.0 )); ro.setMaterial(&localMaterial); - ro.glDrawArrays(GL_QUADS, 0, static_cast<GLsizei>(text_.size()) * 4); + ro.glDrawArrays(GL_TRIANGLES, 0, static_cast<GLsizei>(text_.size()) * 6); _renderer->addRenderObject(&ro); } diff --git a/libs_required/ACG/Scenegraph/TextNode.hh b/libs_required/ACG/Scenegraph/TextNode.hh index 35a9b689d0554315356240c92a3509c7edc8beeb..46743092c8f0cc4b2a8c025ebc6d0f72413cb732 100644 --- a/libs_required/ACG/Scenegraph/TextNode.hh +++ b/libs_required/ACG/Scenegraph/TextNode.hh @@ -131,9 +131,11 @@ public: /// set texture and drawing states void enter(GLState& _state, const DrawModes::DrawMode& _drawmode); + void enterCompat(GLState& _state, const DrawModes::DrawMode& _drawmode); /// restore texture and drawing states void leave(GLState& _state, const DrawModes::DrawMode& _drawmode); + void leaveCompat(GLState& _state, const DrawModes::DrawMode& _drawmode); /// set RenderObject for Shader pipeline renderer void getRenderObjects(ACG::IRenderer* _renderer, ACG::GLState& _state , const ACG::SceneGraph::DrawModes::DrawMode& _drawMode , const ACG::SceneGraph::Material* _mat); diff --git a/libs_required/ACG/Scenegraph/TextNodeGLCompat.cc b/libs_required/ACG/Scenegraph/TextNodeGLCompat.cc new file mode 100644 index 0000000000000000000000000000000000000000..d3d4f610680c0358f0cae0107ab43faa8d861c29 --- /dev/null +++ b/libs_required/ACG/Scenegraph/TextNodeGLCompat.cc @@ -0,0 +1,139 @@ +/*===========================================================================*\ + * * + * OpenFlipper * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openflipper.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenFlipper. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * 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. * + * * +\*===========================================================================*/ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Author$ * + * $Date$ * + * * +\*===========================================================================*/ + + + + +//============================================================================= +// +// CLASS TextNode - IMPLEMENTATION +// +//============================================================================= + + + +//== INCLUDES ================================================================= + +#include <ACG/GL/acg_glew.hh> + +#include "TextNode.hh" +#include "../Utils/ImageConversion.hh" + + +//== NAMESPACES =============================================================== + +namespace ACG { +namespace SceneGraph { + + +//== IMPLEMENTATION ========================================================== + +void +TextNode:: +enterCompat(GLState& _state, const DrawModes::DrawMode& /*_drawmode*/) { + if (text_.empty()) + return; + + // store current gl state + cullFaceEnabled_ = glIsEnabled(GL_CULL_FACE); + texture2dEnabled_ = glIsEnabled(GL_TEXTURE_2D); + blendEnabled_ = glIsEnabled(GL_BLEND); + depthEnabled_ = glIsEnabled(GL_DEPTH_TEST); + //alphaTest_ = glIsEnabled(GL_ALPHA_TEST); + if (alphaTest_) + ACG::GLState::getAlphaFunc(&alphaTestFunc_, &alphaTestValue_); + + glGetIntegerv(GL_BLEND_SRC, &blendSrc_); + glGetIntegerv(GL_BLEND_DST, &blendDest_); + + // set texture and drawing states + ACG::GLState::disable(GL_CULL_FACE); + ACG::GLState::enable(GL_TEXTURE_2D); + ACG::GLState::enable(GL_BLEND); + ACG::GLState::enable(GL_ALPHA_TEST); + ACG::GLState::alphaFunc(GL_GREATER, 0.2f); + ACG::GLState::blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + if (alwaysOnTop_) + ACG::GLState::disable(GL_DEPTH_TEST); +} + + + +//---------------------------------------------------------------------------- + + +void +TextNode:: +leaveCompat(GLState& /*_state*/, const DrawModes::DrawMode& /*_drawmode*/) { + if (text_.empty()) + return; + + // restore the GLState as it was when entering TextNode + if (cullFaceEnabled_) + ACG::GLState::enable(GL_CULL_FACE); + if (!texture2dEnabled_) + ACG::GLState::disable(GL_TEXTURE_2D); + if (!blendEnabled_) + ACG::GLState::disable(GL_BLEND); + if (depthEnabled_) + ACG::GLState::enable(GL_DEPTH_TEST); + else + ACG::GLState::disable(GL_DEPTH_TEST); + if (!alphaTest_) + ACG::GLState::disable(GL_ALPHA_TEST); + else + ACG::GLState::alphaFunc(alphaTestFunc_, alphaTestValue_); + + ACG::GLState::blendFunc(blendSrc_, blendDest_); +} + +//============================================================================= +} // namespace SceneGraph +} // namespace ACG +//=============================================================================