// Copyright (c) 2007, Rodrigo Braz Monteiro // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * 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. // * Neither the name of the Aegisub Group 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 OWNER 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. // // Aegisub Project http://www.aegisub.org/ // // $Id$ /// @file gl_wrap.cpp /// @brief Convenience functions for drawing various geometric primitives on an OpenGL surface /// @ingroup video_output /// /////////// // Headers #include "config.h" #ifndef AGI_PRE #include #endif #include "gl_wrap.h" #include "options.h" #ifdef __APPLE__ #include #include #else #include #include "gl/glext.h" #endif ////////////////////////// // Extension get function #ifdef __WIN32__ /// @brief DOCME /// @param str /// @return /// void* glGetProc(const char *str) { return wglGetProcAddress(str); } #else /// DOCME #define glGetProc(a) glXGetProcAddress((const GLubyte *)(a)) #endif /// @brief Constructor /// OpenGLWrapper::OpenGLWrapper() { r1 = g1 = b1 = a1 = 1.0f; r2 = g2 = b2 = a2 = 1.0f; lw = 1; } /// @brief Draw line /// @param x1 /// @param y1 /// @param x2 /// @param y2 /// void OpenGLWrapper::DrawLine(float x1,float y1,float x2,float y2) { SetModeLine(); glBegin(GL_LINES); glVertex2f(x1,y1); glVertex2f(x2,y2); glEnd(); } /// @brief Draw line /// @param x1 /// @param y1 /// @param x2 /// @param y2 /// @param step /// void OpenGLWrapper::DrawDashedLine(float x1,float y1,float x2,float y2,float step) { float dist = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); int steps = (int)((dist-20)/step); double stepx = double(x2-x1)/steps; double stepy = double(y2-y1)/steps; for (int i=0;i r1) { float temp = r1; r1 = r2; r2 = temp; } // Arc range bool hasEnds = arcStart != arcEnd; float pi = 3.1415926535897932384626433832795f; arcEnd *= pi / 180.f; arcStart *= pi / 180.f; if (arcEnd <= arcStart) arcEnd += 2.0f*pi; float range = arcEnd - arcStart; // Math int steps = int((r1 + r1*ar) * range / (2.0f*pi))*4; if (steps < 12) steps = 12; //float end = arcEnd; float step = range/steps; float curAngle = arcStart; // Fill if (a2 != 0.0) { SetModeFill(); // Annulus if (r1 != r2) { glBegin(GL_QUADS); for (int i=0;i