Commit 0ebf86d3 authored by Jan Möbius's avatar Jan Möbius

Merge branch 'GLUT' into 'master'

Removed glut

Closes #1

See merge request !133
parents 7d591916 0c5383bd
......@@ -10,7 +10,6 @@ include_directories (
${CMAKE_CURRENT_BINARY_DIR}
${OPENGL_INCLUDE_DIR}
${GLEW_INCLUDE_DIR}
${GLUT_INCLUDE_DIR}
)
# Linking for apple is special here as the linker pulls in the dependencies, we have to set them like in PluginLib!
......@@ -156,7 +155,6 @@ if (WIN32)
-DUSEACG
-DPLUGINLIBDLL
-DUSEPLUGINLIBDLL
-DFREEGLUT_LIB_PRAGMAS=0
)
endif ()
......@@ -228,7 +226,6 @@ target_link_libraries (${OPENFLIPPER_PRODUCT_STRING}
${QT_LIBRARIES}
${OPENGL_LIBRARIES}
${GLEW_LIBRARY}
${GLUT_LIBRARIES}
${COREAPP_ADDITIONAL_LINK_LIBRARIES}
${OPENFLIPPER_STATIC_PLUGINS}
)
......
......@@ -10,7 +10,6 @@ OpenFlipper.
\section reqlibs Required libraries
<ul>
<li> 5.9 >= Qt >= 5.5.1 ( http://www.qt.io/download/ ) Use the OpenGL version for Qt >= 5.0</li>
<li> GLUT ( http://www.opengl.org/resources/libraries/glut/ )</li>
<li> GLEW (>=1.6) ( http://glew.sourceforge.net )</li>
</ul>
......@@ -82,9 +81,6 @@ directory.
<li> Download the glew library and install it (The best way is to install it to c:\\libs\\glew directory ).)<br />
The c:\\libs\\glew\\lib subdirectory should contain the dll and the *.lib files)<br />
The headers should be located in the c:\\libs\\glew\\include\\gl subdirectory</li>
<li> Rearrange the files in the glut-3.7 directory such that)<br />
all *.lib and *.dll files are in a c:\\libs\\glut-3.7\\lib subdirectory)<br />
and the glut.h file is moved to the subdirectory c:\\libs\\glut-3.7\\include\\gl\\glut.h</li>
<li> Get cmake for windows from http://www.cmake.org/cmake/resources/software.html </li>
<li> Start the cmake gui and select the OpenFlipper toplevel directory as source directory </li>
\image html cmake-source.png
......@@ -121,7 +117,6 @@ Don't forget setting up the "OpenFlipper" target as startup project as shown in
Install at least the following ports: <br />
qt4-mac +debug<br />
glew<br />
glut<br />
cmake<br />
br />
As additional ports we recommend the following<br />
......
......@@ -762,10 +762,6 @@ int main(int argc, char **argv)
return -1;
}
#ifndef __APPLE__
glutInit(&argc,argv);
#endif
// create core ( this also reads the ini files )
Core * w = new Core( );
#ifdef PYTHON_ENABLED
......
......@@ -43,7 +43,6 @@ include_directories (
${CMAKE_CURRENT_BINARY_DIR}
${OPENGL_INCLUDE_DIR}
${GLEW_INCLUDE_DIR}
${GLUT_INCLUDE_DIR}
${ADDITIONAL_PLUGINLIB_INCS}
${PACKAGE_INCLUDES}
)
......@@ -63,7 +62,6 @@ if (WIN32)
-DPLUGINLIBDLL
-DACGDLL
-DUSEACG
-DFREEGLUT_LIB_PRAGMAS=0
)
endif ()
......@@ -145,7 +143,6 @@ target_link_libraries (OpenFlipperPluginLib
${QT_LIBRARIES}
${OPENGL_LIBRARIES}
${GLEW_LIBRARY}
${GLUT_LIBRARIES}
${FTGL_LIBS}
${ADDITIONAL_PLUGINLIB_LIBS}
)
......
......@@ -202,7 +202,7 @@ include (ACGOutput)
acg_openmp ()
# check for OpenGL, GLEW and GLUT as our required dependencies
# check for OpenGL, GLEW as our required dependencies
find_package (OpenGL)
if (NOT OPENGL_FOUND)
message (FATAL_ERROR "OpengGL not found!")
......@@ -213,11 +213,6 @@ if (NOT GLEW_FOUND)
message (FATAL_ERROR "GLEW not found!")
endif ()
find_package (GLUT)
if (NOT GLUT_FOUND)
message (FATAL_ERROR "GLUT not found!")
endif ()
# using the internal openmesh delivered by the svn repo (default) or use some external installation
set (USE_INTERNAL_OPENMESH ON CACHE BOOL "Use and build internal version of OpenMesh found in libs_required")
......
# - try to find glut library and include files
# GLUT_INCLUDE_DIR, where to find GL/glut.h, etc.
# GLUT_LIBRARIES, the libraries to link against
# GLUT_FOUND, If false, do not try to use GLUT.
# Also defined, but not for general use are:
# GLUT_glut_LIBRARY = the full path to the glut library.
# GLUT_Xmu_LIBRARY = the full path to the Xmu library.
# GLUT_Xi_LIBRARY = the full path to the Xi Library.
#=============================================================================
# Copyright 2001-2009 Kitware, Inc.
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distributed this file outside of CMake, substitute the full
# License text for the above reference.)
IF (WIN32)
# Check if the base path is set
if ( NOT CMAKE_WINDOWS_LIBS_DIR )
# This is the base directory for windows library search used in the finders we shipp.
set(CMAKE_WINDOWS_LIBS_DIR "c:\libs" CACHE STRING "Default Library search dir on windows." )
endif()
if ( CMAKE_GENERATOR MATCHES "^Visual Studio 11.*Win64" )
SET(VS_SEARCH_PATH "${CMAKE_WINDOWS_LIBS_DIR}/vs2012/x64/")
elseif ( CMAKE_GENERATOR MATCHES "^Visual Studio 11.*" )
SET(VS_SEARCH_PATH "${CMAKE_WINDOWS_LIBS_DIR}/vs2012/x32/")
elseif ( CMAKE_GENERATOR MATCHES "^Visual Studio 12.*Win64" )
SET(VS_SEARCH_PATH "${CMAKE_WINDOWS_LIBS_DIR}/vs2013/x64/")
elseif ( CMAKE_GENERATOR MATCHES "^Visual Studio 12.*" )
SET(VS_SEARCH_PATH "${CMAKE_WINDOWS_LIBS_DIR}/vs2013/x32/")
elseif ( CMAKE_GENERATOR MATCHES "^Visual Studio 14.*Win64" )
SET(VS_SEARCH_PATH "${CMAKE_WINDOWS_LIBS_DIR}/vs2015/x64/")
elseif ( CMAKE_GENERATOR MATCHES "^Visual Studio 14.*" )
SET(VS_SEARCH_PATH "${CMAKE_WINDOWS_LIBS_DIR}/vs2015/x32/")
elseif ( CMAKE_GENERATOR MATCHES "^Visual Studio 15.*Win64" )
SET(VS_SEARCH_PATH "${CMAKE_WINDOWS_LIBS_DIR}/vs2017/x64/")
elseif ( CMAKE_GENERATOR MATCHES "^Visual Studio 15.*" )
SET(VS_SEARCH_PATH "${CMAKE_WINDOWS_LIBS_DIR}/vs2017/x32/")
endif()
FIND_PATH( GLUT_INCLUDE_DIR NAMES GL/glut.h
PATHS ${GLUT_ROOT_PATH}/include
"${CMAKE_WINDOWS_LIBS_DIR}/glut-3.7/include"
"${VS_SEARCH_PATH}/freeglut-3.0.0/include"
"${VS_SEARCH_PATH}/freeglut-2.8.1/include" )
FIND_LIBRARY( GLUT_release_LIBRARY NAMES glut32 glut freeglut
PATHS
${OPENGL_LIBRARY_DIR}
${GLUT_ROOT_PATH}/Release
"${CMAKE_WINDOWS_LIBS_DIR}/glut-3.7/lib"
"${VS_SEARCH_PATH}/freeglut-3.0.0/lib"
"${VS_SEARCH_PATH}/freeglut-2.8.1/lib"
)
GET_FILENAME_COMPONENT( GLUT_LIBRARY_DIR ${GLUT_release_LIBRARY} PATH )
FIND_LIBRARY( GLUT_debug_LIBRARY NAMES glut32d glutd freeglutd
PATHS
${OPENGL_LIBRARY_DIR}
${GLUT_ROOT_PATH}/Release
"${CMAKE_WINDOWS_LIBS_DIR}/glut-3.7/lib"
"${VS_SEARCH_PATH}/freeglut-3.0.0/lib"
"${VS_SEARCH_PATH}/freeglut-2.8.1/lib"
)
set(GLUT_glut_LIBRARY optimized ${GLUT_release_LIBRARY} debug ${GLUT_debug_LIBRARY} CACHE STRING "Path to the glut libraries")
ELSE (WIN32)
IF (APPLE)
# These values for Apple could probably do with improvement.
FIND_PATH( GLUT_INCLUDE_DIR glut.h
/System/Library/Frameworks/GLUT.framework/Versions/A/Headers
${OPENGL_LIBRARY_DIR}
)
SET(GLUT_glut_LIBRARY "-framework GLUT" CACHE STRING "GLUT library for OSX")
SET(GLUT_cocoa_LIBRARY "-framework Cocoa" CACHE STRING "Cocoa framework for OSX")
ELSE (APPLE)
FIND_PATH( GLUT_INCLUDE_DIR GL/glut.h
/usr/include/GL
/usr/openwin/share/include
/usr/openwin/include
/opt/graphics/OpenGL/include
/opt/graphics/OpenGL/contrib/libglut
)
FIND_LIBRARY( GLUT_glut_LIBRARY glut
/usr/openwin/lib
)
FIND_LIBRARY( GLUT_Xi_LIBRARY Xi
/usr/openwin/lib
)
FIND_LIBRARY( GLUT_Xmu_LIBRARY Xmu
/usr/openwin/lib
)
ENDIF (APPLE)
ENDIF (WIN32)
SET( GLUT_FOUND "NO" )
IF(GLUT_INCLUDE_DIR)
IF(GLUT_glut_LIBRARY)
# Is -lXi and -lXmu required on all platforms that have it?
# If not, we need some way to figure out what platform we are on.
SET( GLUT_LIBRARIES
${GLUT_glut_LIBRARY}
${GLUT_Xmu_LIBRARY}
${GLUT_Xi_LIBRARY}
${GLUT_cocoa_LIBRARY}
)
SET( GLUT_FOUND "YES" )
#The following deprecated settings are for backwards compatibility with CMake1.4
SET (GLUT_LIBRARY ${GLUT_LIBRARIES})
SET (GLUT_INCLUDE_PATH ${GLUT_INCLUDE_DIR})
ENDIF(GLUT_glut_LIBRARY)
ENDIF(GLUT_INCLUDE_DIR)
MARK_AS_ADVANCED(
GLUT_INCLUDE_DIR
GLUT_glut_LIBRARY
GLUT_Xmu_LIBRARY
GLUT_Xi_LIBRARY
)
......@@ -528,7 +528,6 @@ function (_build_openflipper_plugin plugin)
${${_PLUGIN}_INCDIRS}
${OPENGL_INCLUDE_DIR}
${GLEW_INCLUDE_DIR}
${GLUT_INCLUDE_DIR}
${CMAKE_BINARY_DIR}/OpenFlipper/PluginLib
${PACKAGE_INCLUDES}
${${_PLUGIN}_TYPE_INCLUDES}
......@@ -693,15 +692,12 @@ function (_build_openflipper_plugin plugin)
)
if (WIN32)
# Visual studio requires our plugins to link with GLUT
find_package (GLUT)
# generate dllinport defines
add_definitions (-DACGDLL -DUSEACG -DPLUGINLIBDLL -DUSEPLUGINLIBDLL -DFREEGLUT_LIB_PRAGMAS=0)
add_definitions (-DACGDLL -DUSEACG -DPLUGINLIBDLL -DUSEPLUGINLIBDLL )
target_link_libraries (Plugin-${plugin}
${OPENMESH_LIBRARIES}
ACG
OpenFlipperPluginLib
${GLUT_LIBRARIES}
)
# copy plugin dll file to "Build" directory
......
......@@ -17,7 +17,6 @@ if (WIN32)
-DBUILDOBJECTTYPEDLL
-DACGDLL
-DUSEACG
-DFREEGLUT_LIB_PRAGMAS=0
)
endif ()
......@@ -43,7 +42,6 @@ include_directories (
${CMAKE_CURRENT_BINARY_DIR}
${OPENGL_INCLUDE_DIR}
${GLEW_INCLUDE_DIR}
${GLUT_INCLUDE_DIR}
)
# remove template cc files from source file list
......@@ -73,7 +71,6 @@ target_link_libraries (${TYPENAME}
${QT_LIBRARIES}
${OPENGL_LIBRARIES}
${GLEW_LIBRARY}
${GLUT_LIBRARIES}
OpenFlipperPluginLib
)
......@@ -16,7 +16,7 @@ endif ()
acg_openmp ()
# check for OpenGL, GLEW and GLUT as our required dependencies
# check for OpenGL, GLEW as our required dependencies
find_package (OpenGL)
if (NOT OPENGL_FOUND)
message (FATAL_ERROR "OpengGL not found!")
......@@ -27,11 +27,6 @@ if (NOT GLEW_FOUND)
message (FATAL_ERROR "GLEW not found!")
endif ()
find_package (GLUT)
if (NOT GLUT_FOUND)
message (FATAL_ERROR "GLUT not found!")
endif ()
find_package (OpenMesh)
if (NOT OPENMESH_FOUND)
message (FATAL_ERROR "OpenMesh not found!")
......@@ -42,8 +37,7 @@ set(INCLUDE_DIRS ${OPENMESH_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}/ShaderUtils
${CMAKE_CURRENT_BINARY_DIR}
${OPENGL_INCLUDE_DIR}
${GLEW_INCLUDE_DIR}
${GLUT_INCLUDE_DIR} )
${GLEW_INCLUDE_DIR} )
set(ADDITIONAL_LINK_LIBRARIES "" )
set(ADDITIONAL_BUILD_DIRS "" )
......@@ -99,7 +93,7 @@ set (directories
# generate dllexport macros on windows
if (WIN32)
add_definitions(-DACGDLL -DFREEGLUT_LIB_PRAGMAS=0)
add_definitions(-DACGDLL )
remove_definitions(-DUSEACG)
endif ()
......@@ -142,7 +136,6 @@ target_link_libraries ( ACG ${OPENMESH_LIBRARIES}
${QT_LIBRARIES}
${OPENGL_LIBRARIES}
${GLEW_LIBRARY}
${GLUT_LIBRARIES}
${ADDITIONAL_LINK_LIBRARIES} )
#===================================================================
......
......@@ -55,7 +55,6 @@
#if defined(ARCH_DARWIN)
#include <glut.h>
#include <OpenGL/gl.h>
#elif defined(WIN32)
......@@ -65,11 +64,9 @@
// but a lot with static linking
// # define GLEW_STATIC 1
#include <gl/glew.h>
#include <gl/glut.h>
#else
#include <GL/glut.h>
#include <GL/gl.h>
#endif
......
/*===========================================================================*\
* *
* 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. *
* *
\*===========================================================================*/
//=============================================================================
//== INCLUDES =================================================================
#include "gltext.hh"
#include <ACG/Math/GLMatrixT.hh>
//=============================================================================
namespace ACG {
//=============================================================================
void glText(const Vec3f& _pos,
const std::string& _text,
void* _font)
{
glRasterPos3fv(_pos.data());
std::string::const_iterator s_it(_text.begin()), s_end(_text.end());
for (; s_it!=s_end; ++s_it)
glutBitmapCharacter(_font, *s_it);
}
//-----------------------------------------------------------------------------
void glText( const Vec2i& _pos,
const std::string& _text,
void* _font)
{
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
// set raster pos
glMatrixMode(GL_PROJECTION);
glPushMatrix();
GLMatrixf orthoProj;
orthoProj.identity();
orthoProj.ortho(0.0f, float(viewport[2]), 0.0f, float(viewport[3]), -1.0f, 1.0f);
glLoadMatrixf(orthoProj.data());
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glRasterPos2i(_pos[0], _pos[1]);
// draw characters
std::string::const_iterator s_it(_text.begin()), s_end(_text.end());
for (; s_it!=s_end; ++s_it)
glutBitmapCharacter(_font, *s_it);
// restore matrices
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
}
//=============================================================================
} // namespace ACG
//=============================================================================
/*===========================================================================*\
* *
* 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. *
* *
\*===========================================================================*/
//=============================================================================
// overload some GL functions
//=============================================================================
#ifndef ACG_GL_TEXT_HH
#define ACG_GL_TEXT_HH
//== INCLUDES =================================================================
#include "../Math/VectorT.hh"
#include "gl.hh"
#include <string>
//=============================================================================
namespace ACG {
//=============================================================================
/// Text output in OpenGL, given 2D text position
void glText(const Vec2i& _pos,
const std::string& _text,
void* _font = GLUT_BITMAP_8_BY_13);
/// Text output in OpenGL, given 3D text position
void glText(const Vec3f& _pos,
const std::string& _text,
void* _font = GLUT_BITMAP_8_BY_13);
//=============================================================================
} // namespace ACG
//=============================================================================
#endif // ACG_GL_TEXT_HH defined
//=============================================================================
......@@ -55,7 +55,6 @@
#include "CoordFrameNode.hh"
#include "SceneGraph.hh"
#include "../GL/gltext.hh"
#include "../GL/stipple_alpha.hh"
#include <cstdio>
......@@ -218,8 +217,8 @@ CoordFrameNode::draw(GLState& /* _state */ , const DrawModes::DrawMode& /* _draw
// text
sprintf(s, "%c=%f", axis, *p_it);
glText(v0, s); glText(v1, s); glText(v2, s); glText(v3, s);
//sprintf(s, "%c=%f", axis, *p_it);
//glText(v0, s); glText(v1, s); glText(v2, s); glText(v3, s);
++p_it;
......
......@@ -230,7 +230,6 @@ ManipulatorNode::draw(GLState& _state, const DrawModes::DrawMode& /* _drawMode *
sphere.draw_primitive();
glPolygonMode(GL_FRONT,previous[0]);
glPolygonMode(GL_BACK,previous[1]);
}
}
......
......@@ -434,8 +434,8 @@ updateVBO() {
// *--*--*----*-*
QFontMetricsF metric(qfont_);
qreal avgWidth = metric.averageCharWidth();
int height = nearestPowerOfTwo(metric.height());
float lastCharRight = 0.0f;
const int height = nearestPowerOfTwo(metric.height());
const float lastCharRight = 0.0f;
for (unsigned int i = 0; i < text_.size(); ++i) {
// left and right vertex coordinates
......@@ -459,14 +459,14 @@ updateVBO() {
metricWidth += leftBearing + rightBearing;
#endif
float widthTx = (float) metricWidth / (float) imageWidth_;
float heightTx = (float) height/ (float) imageHeight_;
const float widthTx = (float) metricWidth / (float) imageWidth_;
const float heightTx = (float) height/ (float) imageHeight_;
// get the starting position of the character in the texture
// note that the characters are drawn aligned to the bottom left in in the texture
float leftTx = ((float) charToIndex_[text_[i]].first ) / (float) columns_;
float rightTx = leftTx + widthTx;
float bottomTx = charToIndex_[text_[i]].second / (float) rows_;
float topTx = bottomTx + heightTx;
const float leftTx = ((float) charToIndex_[text_[i]].first ) / (float) columns_;
const float rightTx = leftTx + widthTx;
const float bottomTx = charToIndex_[text_[i]].second / (float) rows_;
const float topTx = bottomTx + heightTx;
// bottom left
vertexBuffer_.push_back(left);
......
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