annotate src/modules/graphics/opengl/Graphics.cpp @ 1448:108ee2e81f65 default tip

Fix a case typo, imageData.h -> ImageData.h
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sat, 18 Jan 2014 13:57:44 +0100
parents d732e302eae6
children 923a594c28d1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1 /**
1282
b7f097053d74 Updated copyright text for the new year
Alex Szpakowski <slime73@gmail.com>
parents: 1250
diff changeset
2 * Copyright (c) 2006-2013 LOVE Development Team
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
3 *
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
4 * This software is provided 'as-is', without any express or implied
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
5 * warranty. In no event will the authors be held liable for any damages
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
6 * arising from the use of this software.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
7 *
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
8 * Permission is granted to anyone to use this software for any purpose,
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
9 * including commercial applications, and to alter it and redistribute it
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
10 * freely, subject to the following restrictions:
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
11 *
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
12 * 1. The origin of this software must not be misrepresented; you must not
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
13 * claim that you wrote the original software. If you use this software
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
14 * in a product, an acknowledgment in the product documentation would be
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
15 * appreciated but is not required.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
16 * 2. Altered source versions must be plainly marked as such, and must not be
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
17 * misrepresented as being the original software.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
18 * 3. This notice may not be removed or altered from any source distribution.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
19 **/
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
20
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
21 #include "common/config.h"
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
22 #include "common/math.h"
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
23 #include "common/Vector.h"
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
24
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
25 #include "Graphics.h"
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
26 #include "window/sdl/Window.h"
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
27
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
28 #include <vector>
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
29 #include <sstream>
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
30 #include <algorithm>
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
31 #include <iterator>
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
32
1111
9a6a533ac832 Use a flags table for setMode now, implement resizable and borderless windows, and add resize event
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1107
diff changeset
33 using love::window::WindowFlags;
9a6a533ac832 Use a flags table for setMode now, implement resizable and borderless windows, and add resize event
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1107
diff changeset
34
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
35 namespace love
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
36 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
37 namespace graphics
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
38 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
39 namespace opengl
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
40 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
41
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
42 Graphics::Graphics()
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
43 : currentFont(0)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
44 , lineStyle(LINE_SMOOTH)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
45 , lineWidth(1)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
46 , matrixLimit(0)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
47 , userMatrices(0)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
48 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
49 currentWindow = love::window::sdl::Window::getSingleton();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
50 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
51
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
52 Graphics::~Graphics()
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
53 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
54 if (currentFont != 0)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
55 currentFont->release();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
56
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
57 currentWindow->release();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
58 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
59
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
60 const char *Graphics::getName() const
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
61 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
62 return "love.graphics.opengl";
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
63 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
64
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
65 bool Graphics::checkMode(int width, int height, bool fullscreen) const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
66 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
67 return currentWindow->checkWindowSize(width, height, fullscreen);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
68 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
69
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
70 DisplayState Graphics::saveState()
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
71 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
72 DisplayState s;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
73
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
74 s.color = getColor();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
75 s.backgroundColor = getBackgroundColor();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
76
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
77 s.blendMode = getBlendMode();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
78 //get line style
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
79 s.lineStyle = lineStyle;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
80 //get the point size
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
81 glGetFloatv(GL_POINT_SIZE, &s.pointSize);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
82 //get point style
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
83 s.pointStyle = (glIsEnabled(GL_POINT_SMOOTH) == GL_TRUE) ? Graphics::POINT_SMOOTH : Graphics::POINT_ROUGH;
1438
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
84 // get alpha test status
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
85 s.alphaTest = isAlphaTestEnabled();
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
86 if (s.alphaTest)
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
87 {
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
88 // if alpha testing is enabled, store mode and reference alpha
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
89 s.alphaTestMode = getAlphaTestMode();
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
90 s.alphaTestRef = getAlphaTestRef();
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
91 }
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
92 //get scissor status
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
93 s.scissor = (glIsEnabled(GL_SCISSOR_TEST) == GL_TRUE);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
94 //do we have scissor, if so, store the box
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
95 if (s.scissor)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
96 glGetIntegerv(GL_SCISSOR_BOX, s.scissorBox);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
97
1328
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
98 for (int i = 0; i < 4; i++)
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
99 s.colorMask[i] = colorMask[i];
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
100
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
101 return s;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
102 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
103
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
104 void Graphics::restoreState(const DisplayState &s)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
105 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
106 setColor(s.color);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
107 setBackgroundColor(s.backgroundColor);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
108 setBlendMode(s.blendMode);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
109 setLine(lineWidth, s.lineStyle);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
110 setPoint(s.pointSize, s.pointStyle);
1438
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
111 if (s.alphaTest)
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
112 setAlphaTest(s.alphaTestMode, s.alphaTestRef);
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
113 else
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
114 setAlphaTest();
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
115 if (s.scissor)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
116 setScissor(s.scissorBox[0], s.scissorBox[1], s.scissorBox[2], s.scissorBox[3]);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
117 else
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
118 setScissor();
1328
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
119 setColorMask(s.colorMask[0], s.colorMask[1], s.colorMask[2], s.colorMask[3]);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
120 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
121
1111
9a6a533ac832 Use a flags table for setMode now, implement resizable and borderless windows, and add resize event
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1107
diff changeset
122 bool Graphics::setMode(int width, int height, WindowFlags *flags)
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
123 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
124 // This operation destroys the OpenGL context, so
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
125 // we must save the state.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
126 DisplayState tempState;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
127 if (isCreated())
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
128 tempState = saveState();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
129
1106
7428fd56552d Fix some typos in comments.
Marc Lepage <mlepage@antimeta.com>
parents: 1105
diff changeset
130 // Unload all volatile objects. These must be reloaded after
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
131 // the display mode change.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
132 Volatile::unloadAll();
1329
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
133
1203
a7567c5e400f improved GL texture binding api to take texture units into consideration
Alexander Szpakowski <amaranth72@gmail.com>
parents: 1200
diff changeset
134 uninitializeContext();
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
135
1111
9a6a533ac832 Use a flags table for setMode now, implement resizable and borderless windows, and add resize event
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1107
diff changeset
136 bool success = currentWindow->setWindow(width, height, flags);
1333
730ed5f01ab0 Merge in default, update changelog
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1196 1329
diff changeset
137
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
138 // Regardless of failure, we'll have to set up OpenGL once again.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
139 width = currentWindow->getWidth();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
140 height = currentWindow->getHeight();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
141
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
142 // Okay, setup OpenGL.
1203
a7567c5e400f improved GL texture binding api to take texture units into consideration
Alexander Szpakowski <amaranth72@gmail.com>
parents: 1200
diff changeset
143 initializeContext();
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
144
1250
8c3108ab0e95 Removed direct OpenGL calls in the SDL Window module
Alex Szpakowski <slime73@gmail.com>
parents: 1239
diff changeset
145 // Make sure antialiasing works when set elsewhere
1433
86757de71c7c Fixed an OpenGL error when MSAA isn't supported
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
146 if (GLEE_VERSION_1_3 || GLEE_ARB_multisample)
86757de71c7c Fixed an OpenGL error when MSAA isn't supported
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
147 glEnable(GL_MULTISAMPLE);
1250
8c3108ab0e95 Removed direct OpenGL calls in the SDL Window module
Alex Szpakowski <slime73@gmail.com>
parents: 1239
diff changeset
148
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
149 // Enable blending
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
150 glEnable(GL_BLEND);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
151
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
152 // "Normal" blending
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
153 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
154
1328
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
155 // Enable all color component writes.
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
156 setColorMask(true, true, true, true);
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
157
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
158 // Enable line/point smoothing.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
159 setLineStyle(LINE_SMOOTH);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
160 glEnable(GL_POINT_SMOOTH);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
161 glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
162
1250
8c3108ab0e95 Removed direct OpenGL calls in the SDL Window module
Alex Szpakowski <slime73@gmail.com>
parents: 1239
diff changeset
163 // Auto-generated mipmaps should be the best quality possible
8c3108ab0e95 Removed direct OpenGL calls in the SDL Window module
Alex Szpakowski <slime73@gmail.com>
parents: 1239
diff changeset
164 if (GLEE_VERSION_1_4 || GLEE_SGIS_generate_mipmap)
8c3108ab0e95 Removed direct OpenGL calls in the SDL Window module
Alex Szpakowski <slime73@gmail.com>
parents: 1239
diff changeset
165 glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
8c3108ab0e95 Removed direct OpenGL calls in the SDL Window module
Alex Szpakowski <slime73@gmail.com>
parents: 1239
diff changeset
166
1438
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
167 // Set default alpha test mode and value
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
168 glAlphaFunc(GL_GREATER, 0.0f);
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
169 setAlphaTest();
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
170
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
171 // Enable textures
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
172 glEnable(GL_TEXTURE_2D);
1232
f4a855e7b65d Improved clarity of some comments, variable names, and functions
Alexander Szpakowski <amaranth72@gmail.com>
parents: 1230
diff changeset
173 setActiveTextureUnit(0);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
174
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
175 // Set the viewport to top-left corner
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
176 glViewport(0, 0, width, height);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
177
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
178 // Reset the projection matrix
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
179 glMatrixMode(GL_PROJECTION);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
180 glLoadIdentity();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
181
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
182 // Set up orthographic view (no depth)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
183 glOrtho(0.0, width, height, 0.0, -1.0, 1.0);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
184
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
185 // Reset modelview matrix
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
186 glMatrixMode(GL_MODELVIEW);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
187 glLoadIdentity();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
188
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
189 // Set pixel row alignment
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
190 glPixelStorei(GL_UNPACK_ALIGNMENT, 2);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
191
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
192 // Reload all volatile objects.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
193 if (!Volatile::loadAll())
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
194 std::cerr << "Could not reload all volatile objects." << std::endl;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
195
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
196 // Restore the display state.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
197 restoreState(tempState);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
198
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
199 // Get the maximum number of matrices
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
200 // subtract a few to give the engine some room.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
201 glGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH, &matrixLimit);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
202 matrixLimit -= 5;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
203
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
204 return success;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
205 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
206
1333
730ed5f01ab0 Merge in default, update changelog
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1196 1329
diff changeset
207 void Graphics::getMode(int &width, int &height, WindowFlags &flags) const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
208 {
1111
9a6a533ac832 Use a flags table for setMode now, implement resizable and borderless windows, and add resize event
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1107
diff changeset
209 currentWindow->getWindow(width, height, flags);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
210 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
211
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
212 bool Graphics::toggleFullscreen()
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
213 {
1111
9a6a533ac832 Use a flags table for setMode now, implement resizable and borderless windows, and add resize event
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1107
diff changeset
214 int width, height;
9a6a533ac832 Use a flags table for setMode now, implement resizable and borderless windows, and add resize event
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1107
diff changeset
215 WindowFlags flags;
9a6a533ac832 Use a flags table for setMode now, implement resizable and borderless windows, and add resize event
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1107
diff changeset
216 currentWindow->getWindow(width, height, flags);
9a6a533ac832 Use a flags table for setMode now, implement resizable and borderless windows, and add resize event
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1107
diff changeset
217 flags.fullscreen = !flags.fullscreen;
9a6a533ac832 Use a flags table for setMode now, implement resizable and borderless windows, and add resize event
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1107
diff changeset
218 return setMode(width, height, &flags);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
219 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
220
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
221
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
222 void Graphics::reset()
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
223 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
224 DisplayState s;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
225 discardStencil();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
226 Canvas::bindDefaultCanvas();
1233
1cb8b929f662 Renamed all instances of 'ShaderEffect' (previously 'PixelEffect') to 'Shader'.
Alexander Szpakowski <amaranth72@gmail.com>
parents: 1232
diff changeset
227 Shader::detach();
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
228 restoreState(s);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
229 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
230
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
231 void Graphics::clear()
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
232 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
233 glClear(GL_COLOR_BUFFER_BIT);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
234 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
235
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
236 void Graphics::present()
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
237 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
238 currentWindow->swapBuffers();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
239 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
240
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
241 void Graphics::setIcon(Image *image)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
242 {
1425
4d66b8cbe5a9 Removed an unused graphics Image method
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
243 if (image->isCompressed())
1421
aa603d1b03bc Code cleanup
Alex Szpakowski <slime73@gmail.com>
parents: 1420
diff changeset
244 throw love::Exception("Cannot use compressed image data to set an icon.");
1425
4d66b8cbe5a9 Removed an unused graphics Image method
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
245
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
246 currentWindow->setIcon(image->getData());
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
247 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
248
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
249 void Graphics::setCaption(const char *caption)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
250 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
251 std::string title(caption);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
252 currentWindow->setWindowTitle(title);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
253 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
254
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
255 int Graphics::getCaption(lua_State *L) const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
256 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
257 std::string title = currentWindow->getWindowTitle();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
258 lua_pushstring(L, title.c_str());
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
259 return 1;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
260 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
261
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
262 int Graphics::getWidth() const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
263 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
264 return currentWindow->getWidth();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
265 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
266
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
267 int Graphics::getHeight() const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
268 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
269 return currentWindow->getHeight();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
270 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
271
1365
ed450b9c8bb4 love.graphics.newScreenshot now uses the size of the current canvas (if applicable), instead of adding transparency or clipping to match the screen size
Alex Szpakowski <slime73@gmail.com>
parents: 1364
diff changeset
272 int Graphics::getRenderWidth() const
ed450b9c8bb4 love.graphics.newScreenshot now uses the size of the current canvas (if applicable), instead of adding transparency or clipping to match the screen size
Alex Szpakowski <slime73@gmail.com>
parents: 1364
diff changeset
273 {
ed450b9c8bb4 love.graphics.newScreenshot now uses the size of the current canvas (if applicable), instead of adding transparency or clipping to match the screen size
Alex Szpakowski <slime73@gmail.com>
parents: 1364
diff changeset
274 if (Canvas::current)
ed450b9c8bb4 love.graphics.newScreenshot now uses the size of the current canvas (if applicable), instead of adding transparency or clipping to match the screen size
Alex Szpakowski <slime73@gmail.com>
parents: 1364
diff changeset
275 return Canvas::current->getWidth();
ed450b9c8bb4 love.graphics.newScreenshot now uses the size of the current canvas (if applicable), instead of adding transparency or clipping to match the screen size
Alex Szpakowski <slime73@gmail.com>
parents: 1364
diff changeset
276 return getWidth();
ed450b9c8bb4 love.graphics.newScreenshot now uses the size of the current canvas (if applicable), instead of adding transparency or clipping to match the screen size
Alex Szpakowski <slime73@gmail.com>
parents: 1364
diff changeset
277 }
ed450b9c8bb4 love.graphics.newScreenshot now uses the size of the current canvas (if applicable), instead of adding transparency or clipping to match the screen size
Alex Szpakowski <slime73@gmail.com>
parents: 1364
diff changeset
278
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
279 int Graphics::getRenderHeight() const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
280 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
281 if (Canvas::current)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
282 return Canvas::current->getHeight();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
283 return getHeight();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
284 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
285
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
286 bool Graphics::isCreated() const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
287 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
288 return currentWindow->isCreated();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
289 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
290
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
291 int Graphics::getModes(lua_State *L) const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
292 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
293 int n;
1418
357697c2e2a8 More internal code cleanup
Alex Szpakowski <slime73@gmail.com>
parents: 1410
diff changeset
294 love::window::Window::WindowSize *modes = currentWindow->getFullscreenSizes(n);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
295
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
296 if (modes == 0)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
297 return 0;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
298
1418
357697c2e2a8 More internal code cleanup
Alex Szpakowski <slime73@gmail.com>
parents: 1410
diff changeset
299 lua_createtable(L, n, 0);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
300
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
301 for (int i = 0; i < n ; i++)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
302 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
303 lua_pushinteger(L, i+1);
1418
357697c2e2a8 More internal code cleanup
Alex Szpakowski <slime73@gmail.com>
parents: 1410
diff changeset
304 lua_createtable(L, 0, 2);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
305
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
306 // Inner table attribs.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
307
1418
357697c2e2a8 More internal code cleanup
Alex Szpakowski <slime73@gmail.com>
parents: 1410
diff changeset
308 lua_pushinteger(L, modes[i].width);
357697c2e2a8 More internal code cleanup
Alex Szpakowski <slime73@gmail.com>
parents: 1410
diff changeset
309 lua_setfield(L, -2, "width");
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
310
1418
357697c2e2a8 More internal code cleanup
Alex Szpakowski <slime73@gmail.com>
parents: 1410
diff changeset
311 lua_pushinteger(L, modes[i].height);
357697c2e2a8 More internal code cleanup
Alex Szpakowski <slime73@gmail.com>
parents: 1410
diff changeset
312 lua_setfield(L, -2, "height");
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
313
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
314 // Inner table attribs end.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
315
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
316 lua_settable(L, -3);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
317 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
318
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
319 delete[] modes;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
320 return 1;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
321 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
322
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
323 void Graphics::setScissor(int x, int y, int width, int height)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
324 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
325 glEnable(GL_SCISSOR_TEST);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
326 glScissor(x, getRenderHeight() - (y + height), width, height); // Compensates for the fact that our y-coordinate is reverse of OpenGLs.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
327 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
328
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
329 void Graphics::setScissor()
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
330 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
331 glDisable(GL_SCISSOR_TEST);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
332 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
333
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
334 int Graphics::getScissor(lua_State *L) const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
335 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
336 if (glIsEnabled(GL_SCISSOR_TEST) == GL_FALSE)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
337 return 0;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
338
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
339 GLint scissor[4];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
340 glGetIntegerv(GL_SCISSOR_BOX, scissor);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
341
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
342 lua_pushnumber(L, scissor[0]);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
343 lua_pushnumber(L, getRenderHeight() - (scissor[1] + scissor[3])); // Compensates for the fact that our y-coordinate is reverse of OpenGLs.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
344 lua_pushnumber(L, scissor[2]);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
345 lua_pushnumber(L, scissor[3]);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
346
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
347 return 4;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
348 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
349
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
350 void Graphics::defineStencil()
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
351 {
1425
4d66b8cbe5a9 Removed an unused graphics Image method
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
352 // Disable color writes but don't save the mask values.
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
353 glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
1425
4d66b8cbe5a9 Removed an unused graphics Image method
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
354
4d66b8cbe5a9 Removed an unused graphics Image method
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
355 glClear(GL_STENCIL_BUFFER_BIT);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
356 glEnable(GL_STENCIL_TEST);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
357 glStencilFunc(GL_ALWAYS, 1, 1);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
358 glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
359 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
360
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
361 void Graphics::useStencil(bool invert)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
362 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
363 glStencilFunc(GL_EQUAL, (int)(!invert), 1); // invert ? 0 : 1
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
364 glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
1328
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
365 setColorMask(colorMask[0], colorMask[1], colorMask[2], colorMask[3]);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
366 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
367
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
368 void Graphics::discardStencil()
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
369 {
1328
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
370 setColorMask(colorMask[0], colorMask[1], colorMask[2], colorMask[3]);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
371 glDisable(GL_STENCIL_TEST);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
372 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
373
1438
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
374 void Graphics::setAlphaTest(Graphics::AlphaTestMode mode, unsigned char refalpha)
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
375 {
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
376 GLclampf ref = refalpha / 255.0f;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
377
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
378 glEnable(GL_ALPHA_TEST);
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
379
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
380 switch (mode)
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
381 {
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
382 case ALPHATEST_LESS:
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
383 glAlphaFunc(GL_LESS, ref);
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
384 break;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
385 case ALPHATEST_LEQUAL:
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
386 glAlphaFunc(GL_LEQUAL, ref);
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
387 break;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
388 case ALPHATEST_EQUAL:
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
389 glAlphaFunc(GL_EQUAL, ref);
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
390 break;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
391 case ALPHATEST_NOTEQUAL:
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
392 glAlphaFunc(GL_NOTEQUAL, ref);
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
393 break;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
394 case ALPHATEST_GEQUAL:
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
395 glAlphaFunc(GL_GEQUAL, ref);
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
396 break;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
397 case ALPHATEST_GREATER:
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
398 glAlphaFunc(GL_GREATER, ref);
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
399 break;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
400 default:
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
401 glDisable(GL_ALPHA_TEST);
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
402 break;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
403 }
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
404 }
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
405
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
406 void Graphics::setAlphaTest()
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
407 {
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
408 glDisable(GL_ALPHA_TEST);
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
409 }
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
410
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
411 bool Graphics::isAlphaTestEnabled()
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
412 {
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
413 return glIsEnabled(GL_ALPHA_TEST) == GL_TRUE;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
414 }
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
415
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
416 Graphics::AlphaTestMode Graphics::getAlphaTestMode()
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
417 {
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
418 GLint func;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
419 glGetIntegerv(GL_ALPHA_TEST_FUNC, &func);
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
420
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
421 switch (func)
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
422 {
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
423 case GL_LESS:
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
424 return ALPHATEST_LESS;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
425 case GL_LEQUAL:
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
426 return ALPHATEST_LEQUAL;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
427 case GL_EQUAL:
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
428 return ALPHATEST_EQUAL;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
429 case GL_NOTEQUAL:
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
430 return ALPHATEST_NOTEQUAL;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
431 case GL_GEQUAL:
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
432 return ALPHATEST_GEQUAL;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
433 case GL_GREATER:
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
434 return ALPHATEST_GREATER;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
435 default:
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
436 return ALPHATEST_MAX_ENUM;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
437 }
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
438 }
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
439
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
440 unsigned char Graphics::getAlphaTestRef()
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
441 {
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
442 GLfloat ref;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
443 glGetFloatv(GL_ALPHA_TEST_REF, &ref);
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
444
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
445 return ref * 255;
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
446 }
6f9dbdeae2c6 Added love.graphics.setAlphaTest (issue #534)
Alex Szpakowski <slime73@gmail.com>
parents: 1436
diff changeset
447
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
448 Image *Graphics::newImage(love::image::ImageData *data)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
449 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
450 // Create the image.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
451 Image *image = new Image(data);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
452 bool success;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
453 try
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
454 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
455 success = image->load();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
456 }
1182
639924c0fe39 Removed names of unused parameters to quiet noisy compilers
Alexander Szpakowski <amaranth72@gmail.com>
parents: 1179
diff changeset
457 catch(love::Exception &)
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
458 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
459 image->release();
1179
770ce115274a Code cleanup
Alexander Szpakowski <amaranth72@gmail.com>
parents: 1172
diff changeset
460 throw;
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
461 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
462 if (!success)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
463 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
464 image->release();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
465 return 0;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
466 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
467
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
468 return image;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
469 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
470
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
471 Image *Graphics::newImage(love::image::CompressedData *cdata)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
472 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
473 // Create the image.
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
474 Image *image = new Image(cdata);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
475 bool success;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
476 try
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
477 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
478 success = image->load();
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
479 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
480 catch(love::Exception &)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
481 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
482 image->release();
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
483 throw;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
484 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
485 if (!success)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
486 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
487 image->release();
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
488 return 0;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
489 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
490
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
491 return image;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
492 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents: 1418
diff changeset
493
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
494 Quad *Graphics::newQuad(float x, float y, float w, float h, float sw, float sh)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
495 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
496 Quad::Viewport v;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
497 v.x = x;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
498 v.y = y;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
499 v.w = w;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
500 v.h = h;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
501 return new Quad(v, sw, sh);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
502 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
503
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
504 Font *Graphics::newFont(love::font::Rasterizer *r, const Image::Filter &filter)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
505 {
1307
1c61424c6024 Cleaned up exception handling code when creating new fonts, spritebatches, and shaders
Alex Szpakowski <slime73@gmail.com>
parents: 1306
diff changeset
506 return new Font(r, filter);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
507 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
508
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
509 SpriteBatch *Graphics::newSpriteBatch(Image *image, int size, int usage)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
510 {
1307
1c61424c6024 Cleaned up exception handling code when creating new fonts, spritebatches, and shaders
Alex Szpakowski <slime73@gmail.com>
parents: 1306
diff changeset
511 return new SpriteBatch(image, size, usage);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
512 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
513
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
514 ParticleSystem *Graphics::newParticleSystem(Image *image, int size)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
515 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
516 return new ParticleSystem(image, size);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
517 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
518
1137
4296fccb2da4 Fix Issue #476: Add HDR Canvas (thanks, Alexander Szpakowski!).
vrld <vrld@vrld.org>
parents: 1107
diff changeset
519 Canvas *Graphics::newCanvas(int width, int height, Canvas::TextureType texture_type)
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
520 {
1399
fa3eabb3602a Added MRT support to canvases via love.graphics.setCanvases(c1, c2, ...), and an 'effects' callback function in shaders.
Alex Szpakowski <slime73@gmail.com>
parents: 1397
diff changeset
521 if (texture_type == Canvas::TYPE_HDR && !Canvas::isHDRSupported())
1137
4296fccb2da4 Fix Issue #476: Add HDR Canvas (thanks, Alexander Szpakowski!).
vrld <vrld@vrld.org>
parents: 1107
diff changeset
522 throw Exception("HDR Canvases are not supported by your OpenGL implementation");
4296fccb2da4 Fix Issue #476: Add HDR Canvas (thanks, Alexander Szpakowski!).
vrld <vrld@vrld.org>
parents: 1107
diff changeset
523
4296fccb2da4 Fix Issue #476: Add HDR Canvas (thanks, Alexander Szpakowski!).
vrld <vrld@vrld.org>
parents: 1107
diff changeset
524 while (GL_NO_ERROR != glGetError())
4296fccb2da4 Fix Issue #476: Add HDR Canvas (thanks, Alexander Szpakowski!).
vrld <vrld@vrld.org>
parents: 1107
diff changeset
525 /* clear opengl error flag */;
4296fccb2da4 Fix Issue #476: Add HDR Canvas (thanks, Alexander Szpakowski!).
vrld <vrld@vrld.org>
parents: 1107
diff changeset
526
4296fccb2da4 Fix Issue #476: Add HDR Canvas (thanks, Alexander Szpakowski!).
vrld <vrld@vrld.org>
parents: 1107
diff changeset
527 Canvas *canvas = new Canvas(width, height, texture_type);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
528 GLenum err = canvas->getStatus();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
529
1106
7428fd56552d Fix some typos in comments.
Marc Lepage <mlepage@antimeta.com>
parents: 1105
diff changeset
530 // everything ok, return canvas (early out)
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
531 if (err == GL_FRAMEBUFFER_COMPLETE)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
532 return canvas;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
533
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
534 // create error message
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
535 std::stringstream error_string;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
536 error_string << "Cannot create canvas: ";
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
537 switch (err)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
538 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
539
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
540 case GL_FRAMEBUFFER_UNSUPPORTED:
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
541 error_string << "Not supported by your OpenGL implementation.";
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
542 break;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
543
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
544 // remaining error codes are highly unlikely:
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
545 case GL_FRAMEBUFFER_UNDEFINED:
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
546 case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
547 case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
548 case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
549 case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
550 case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
551 error_string << "Error in implementation. Possible fix: Make canvas width and height powers of two.";
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
552 break;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
553
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
554 default:
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
555 // my intel hda card wrongly returns 0 to glCheckFramebufferStatus() but sets
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
556 // no error flag. I think it meant to return GL_FRAMEBUFFER_UNSUPPORTED, but who
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
557 // knows.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
558 if (glGetError() == GL_NO_ERROR)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
559 error_string << "May not be supported by your OpenGL implementation.";
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
560 // the remaining error is an indication of a serious fuckup since it should
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
561 // only be returned if glCheckFramebufferStatus() was called with the wrong
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
562 // arguments.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
563 else
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
564 error_string << "Cannot create canvas: Aliens did it (OpenGL error code: " << glGetError() << ")";
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
565 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
566
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
567 canvas->release();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
568 throw Exception(error_string.str().c_str());
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
569 return NULL; // never reached
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
570 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
571
1239
61021c783f82 Improved shader member variable names, fixed up XCode project file
Alex Szpakowski <slime73@gmail.com>
parents: 1235
diff changeset
572 Shader *Graphics::newShader(const Shader::ShaderSources &sources)
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
573 {
1307
1c61424c6024 Cleaned up exception handling code when creating new fonts, spritebatches, and shaders
Alex Szpakowski <slime73@gmail.com>
parents: 1306
diff changeset
574 return new Shader(sources);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
575 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
576
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
577 void Graphics::setColor(const Color &c)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
578 {
1442
d732e302eae6 Internally keep track of the value of the current color (issue #564)
Alex Szpakowski <slime73@gmail.com>
parents: 1439
diff changeset
579 opengl::setCurrentColor(c);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
580 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
581
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
582 Color Graphics::getColor() const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
583 {
1442
d732e302eae6 Internally keep track of the value of the current color (issue #564)
Alex Szpakowski <slime73@gmail.com>
parents: 1439
diff changeset
584 return opengl::getCurrentColor();
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
585 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
586
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
587 void Graphics::setBackgroundColor(const Color &c)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
588 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
589 glClearColor((float)c.r/255.0f, (float)c.g/255.0f, (float)c.b/255.0f, (float)c.a/255.0f);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
590 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
591
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
592 Color Graphics::getBackgroundColor() const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
593 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
594 float c[4];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
595 glGetFloatv(GL_COLOR_CLEAR_VALUE, c);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
596
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
597 Color t;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
598 t.r = (unsigned char)(255.0f*c[0]);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
599 t.g = (unsigned char)(255.0f*c[1]);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
600 t.b = (unsigned char)(255.0f*c[2]);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
601 t.a = (unsigned char)(255.0f*c[3]);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
602
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
603 return t;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
604 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
605
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
606 void Graphics::setFont(Font *font)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
607 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
608 if (currentFont != 0)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
609 currentFont->release();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
610
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
611 currentFont = font;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
612
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
613 if (font != 0)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
614 currentFont->retain();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
615 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
616
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
617 Font *Graphics::getFont() const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
618 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
619 return currentFont;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
620 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
621
1328
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
622 void Graphics::setColorMask(bool r, bool g, bool b, bool a)
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
623 {
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
624 colorMask[0] = r;
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
625 colorMask[1] = g;
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
626 colorMask[2] = b;
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
627 colorMask[3] = a;
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
628
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
629 glColorMask((GLboolean) r, (GLboolean) g, (GLboolean) b, (GLboolean) a);
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
630 }
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
631
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
632 const bool *Graphics::getColorMask() const
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
633 {
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
634 return colorMask;
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
635 }
0089652f335f Added love.graphics.setColorMask(r, g, b, a) and love.graphics.getColorMask()
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
636
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
637 void Graphics::setBlendMode(Graphics::BlendMode mode)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
638 {
1329
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
639 const int gl_1_4 = GLEE_VERSION_1_4;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
640
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
641 GLenum func = GL_FUNC_ADD;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
642 GLenum src_rgb = GL_ONE;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
643 GLenum src_a = GL_ONE;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
644 GLenum dst_rgb = GL_ZERO;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
645 GLenum dst_a = GL_ZERO;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
646
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
647 switch (mode)
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
648 {
1329
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
649 case BLEND_ALPHA:
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
650 if (gl_1_4 || GLEE_EXT_blend_func_separate)
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
651 {
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
652 src_rgb = GL_SRC_ALPHA;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
653 src_a = GL_ONE;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
654 dst_rgb = dst_a = GL_ONE_MINUS_SRC_ALPHA;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
655 }
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
656 else
1329
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
657 {
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
658 // Fallback for OpenGL implementations without support for separate blend functions.
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
659 // This will most likely only be used for the Microsoft software renderer and
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
660 // since it's still stuck with OpenGL 1.1, the only expected difference is a
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
661 // different alpha value when reading back the default framebuffer (newScreenshot).
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
662 src_rgb = src_a = GL_SRC_ALPHA;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
663 dst_rgb = dst_a = GL_ONE_MINUS_SRC_ALPHA;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
664 }
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
665 break;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
666 case BLEND_MULTIPLICATIVE:
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
667 src_rgb = src_a = GL_DST_COLOR;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
668 dst_rgb = dst_a = GL_ZERO;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
669 break;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
670 case BLEND_PREMULTIPLIED:
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
671 src_rgb = src_a = GL_ONE;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
672 dst_rgb = dst_a = GL_ONE_MINUS_SRC_ALPHA;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
673 break;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
674 case BLEND_SUBTRACTIVE:
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
675 func = GL_FUNC_REVERSE_SUBTRACT;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
676 case BLEND_ADDITIVE:
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
677 src_rgb = src_a = GL_SRC_ALPHA;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
678 dst_rgb = dst_a = GL_ONE;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
679 break;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
680 case BLEND_NONE:
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
681 default:
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
682 src_rgb = src_a = GL_ONE;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
683 dst_rgb = dst_a = GL_ZERO;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
684 break;
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
685 }
1329
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
686
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
687 if (gl_1_4 || GLEE_ARB_imaging)
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
688 glBlendEquation(func);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
689 else if (GLEE_EXT_blend_minmax && GLEE_EXT_blend_subtract)
1329
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
690 glBlendEquationEXT(func);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
691 else
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
692 {
1329
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
693 if (func == GL_FUNC_REVERSE_SUBTRACT)
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
694 throw Exception("This graphics card does not support the subtractive blend mode!");
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
695 // GL_FUNC_ADD is the default even without access to glBlendEquation, so that'll still work.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
696 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
697
1329
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
698 if (src_rgb == src_a && dst_rgb == dst_a)
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
699 glBlendFunc(src_rgb, dst_rgb);
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
700 else
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
701 {
1329
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
702 if (gl_1_4)
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
703 glBlendFuncSeparate(src_rgb, dst_rgb, src_a, dst_a);
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
704 else if (GLEE_EXT_blend_func_separate)
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
705 glBlendFuncSeparateEXT(src_rgb, dst_rgb, src_a, dst_a);
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
706 else
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
707 throw Exception("This graphics card does not support separated rgb and alpha blend functions!");
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
708 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
709 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
710
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
711 Graphics::BlendMode Graphics::getBlendMode() const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
712 {
1329
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
713 const int gl_1_4 = GLEE_VERSION_1_4;
1311
6cb3ba5f25c1 Fixed love.graphics.getBlendMode on systems which don't support the subtractive blend mode
Alex Szpakowski <slime73@gmail.com>
parents: 1310
diff changeset
714
1329
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
715 GLint src_rgb, src_a, dst_rgb, dst_a;
1311
6cb3ba5f25c1 Fixed love.graphics.getBlendMode on systems which don't support the subtractive blend mode
Alex Szpakowski <slime73@gmail.com>
parents: 1310
diff changeset
716 GLint equation = GL_FUNC_ADD;
6cb3ba5f25c1 Fixed love.graphics.getBlendMode on systems which don't support the subtractive blend mode
Alex Szpakowski <slime73@gmail.com>
parents: 1310
diff changeset
717
1329
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
718 if (gl_1_4 || GLEE_EXT_blend_func_separate)
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
719 {
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
720 glGetIntegerv(GL_BLEND_SRC_RGB, &src_rgb);
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
721 glGetIntegerv(GL_BLEND_SRC_ALPHA, &src_a);
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
722 glGetIntegerv(GL_BLEND_DST_RGB, &dst_rgb);
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
723 glGetIntegerv(GL_BLEND_DST_ALPHA, &dst_a);
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
724 }
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
725 else
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
726 {
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
727 glGetIntegerv(GL_BLEND_SRC, &src_rgb);
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
728 glGetIntegerv(GL_BLEND_DST, &dst_rgb);
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
729 src_a = src_rgb;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
730 dst_a = dst_rgb;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
731 }
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
732
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
733 if (gl_1_4 || GLEE_ARB_imaging || (GLEE_EXT_blend_minmax && GLEE_EXT_blend_subtract))
1311
6cb3ba5f25c1 Fixed love.graphics.getBlendMode on systems which don't support the subtractive blend mode
Alex Szpakowski <slime73@gmail.com>
parents: 1310
diff changeset
734 glGetIntegerv(GL_BLEND_EQUATION, &equation);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
735
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
736 if (equation == GL_FUNC_REVERSE_SUBTRACT) // && src == GL_SRC_ALPHA && dst == GL_ONE
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
737 return BLEND_SUBTRACTIVE;
1329
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
738 // Everything else has equation == GL_FUNC_ADD.
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
739 else if (src_rgb == src_a && dst_rgb == dst_a)
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
740 {
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
741 if (src_rgb == GL_SRC_ALPHA && dst_rgb == GL_ONE)
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
742 return BLEND_ADDITIVE;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
743 else if (src_rgb == GL_SRC_ALPHA && dst_rgb == GL_ONE_MINUS_SRC_ALPHA)
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
744 return BLEND_ALPHA; // alpha blend mode fallback for very old OpenGL versions.
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
745 else if (src_rgb == GL_DST_COLOR && dst_rgb == GL_ZERO)
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
746 return BLEND_MULTIPLICATIVE;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
747 else if (src_rgb == GL_ONE && dst_rgb == GL_ONE_MINUS_SRC_ALPHA)
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
748 return BLEND_PREMULTIPLIED;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
749 else if (src_rgb == GL_ONE && dst_rgb == GL_ZERO)
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
750 return BLEND_NONE;
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
751 }
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
752 else if (src_rgb == GL_SRC_ALPHA && src_a == GL_ONE &&
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
753 dst_rgb == GL_ONE_MINUS_SRC_ALPHA && dst_a == GL_ONE_MINUS_SRC_ALPHA)
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
754 return BLEND_ALPHA;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
755
1329
7888160f9a41 The "alpha" blend mode now outputs more useful/intuitive alpha values (thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
756 throw Exception("Unknown blend mode");
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
757 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
758
1396
c70b35593b3d Renamed love.graphics.setDefaultImageFilter to love.graphics.setDefaultFilter
Alex Szpakowski <slime73@gmail.com>
parents: 1394
diff changeset
759 void Graphics::setDefaultFilter(const Image::Filter &f)
1172
1bf09d0c4a54 Applied patch from issue #542 (texture filtering inconsistencies) in main LÖVE repository
Alexander Szpakowski <amaranth72@gmail.com>
parents: 1157
diff changeset
760 {
1bf09d0c4a54 Applied patch from issue #542 (texture filtering inconsistencies) in main LÖVE repository
Alexander Szpakowski <amaranth72@gmail.com>
parents: 1157
diff changeset
761 Image::setDefaultFilter(f);
1bf09d0c4a54 Applied patch from issue #542 (texture filtering inconsistencies) in main LÖVE repository
Alexander Szpakowski <amaranth72@gmail.com>
parents: 1157
diff changeset
762 }
1bf09d0c4a54 Applied patch from issue #542 (texture filtering inconsistencies) in main LÖVE repository
Alexander Szpakowski <amaranth72@gmail.com>
parents: 1157
diff changeset
763
1396
c70b35593b3d Renamed love.graphics.setDefaultImageFilter to love.graphics.setDefaultFilter
Alex Szpakowski <slime73@gmail.com>
parents: 1394
diff changeset
764 const Image::Filter &Graphics::getDefaultFilter() const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
765 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
766 return Image::getDefaultFilter();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
767 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
768
1394
8c7ef7189365 Moved anisotropic filtering to Image:setFilter(min, mag, anisotropy), added anisotropic filtering support to canvases and fonts
Alex Szpakowski <slime73@gmail.com>
parents: 1393
diff changeset
769 void Graphics::setDefaultMipmapFilter(Image::FilterMode filter, float sharpness)
1393
251c40067246 Added anisotropic filtering functionality for images, consolidated mipmap methods into Image:setMipmapFilter(filtermode, sharpness, anisotropy), added love.graphics.setDefaultMipmapFilter(filtermode, sharpness, anisotropy)
Alex Szpakowski <slime73@gmail.com>
parents: 1389
diff changeset
770 {
251c40067246 Added anisotropic filtering functionality for images, consolidated mipmap methods into Image:setMipmapFilter(filtermode, sharpness, anisotropy), added love.graphics.setDefaultMipmapFilter(filtermode, sharpness, anisotropy)
Alex Szpakowski <slime73@gmail.com>
parents: 1389
diff changeset
771 Image::setDefaultMipmapFilter(filter);
1394
8c7ef7189365 Moved anisotropic filtering to Image:setFilter(min, mag, anisotropy), added anisotropic filtering support to canvases and fonts
Alex Szpakowski <slime73@gmail.com>
parents: 1393
diff changeset
772 Image::setDefaultMipmapSharpness(sharpness);
1393
251c40067246 Added anisotropic filtering functionality for images, consolidated mipmap methods into Image:setMipmapFilter(filtermode, sharpness, anisotropy), added love.graphics.setDefaultMipmapFilter(filtermode, sharpness, anisotropy)
Alex Szpakowski <slime73@gmail.com>
parents: 1389
diff changeset
773 }
251c40067246 Added anisotropic filtering functionality for images, consolidated mipmap methods into Image:setMipmapFilter(filtermode, sharpness, anisotropy), added love.graphics.setDefaultMipmapFilter(filtermode, sharpness, anisotropy)
Alex Szpakowski <slime73@gmail.com>
parents: 1389
diff changeset
774
1394
8c7ef7189365 Moved anisotropic filtering to Image:setFilter(min, mag, anisotropy), added anisotropic filtering support to canvases and fonts
Alex Szpakowski <slime73@gmail.com>
parents: 1393
diff changeset
775 void Graphics::getDefaultMipmapFilter(Image::FilterMode *filter, float *sharpness) const
1393
251c40067246 Added anisotropic filtering functionality for images, consolidated mipmap methods into Image:setMipmapFilter(filtermode, sharpness, anisotropy), added love.graphics.setDefaultMipmapFilter(filtermode, sharpness, anisotropy)
Alex Szpakowski <slime73@gmail.com>
parents: 1389
diff changeset
776 {
251c40067246 Added anisotropic filtering functionality for images, consolidated mipmap methods into Image:setMipmapFilter(filtermode, sharpness, anisotropy), added love.graphics.setDefaultMipmapFilter(filtermode, sharpness, anisotropy)
Alex Szpakowski <slime73@gmail.com>
parents: 1389
diff changeset
777 *filter = Image::getDefaultMipmapFilter();
1394
8c7ef7189365 Moved anisotropic filtering to Image:setFilter(min, mag, anisotropy), added anisotropic filtering support to canvases and fonts
Alex Szpakowski <slime73@gmail.com>
parents: 1393
diff changeset
778 *sharpness = Image::getDefaultMipmapSharpness();
1393
251c40067246 Added anisotropic filtering functionality for images, consolidated mipmap methods into Image:setMipmapFilter(filtermode, sharpness, anisotropy), added love.graphics.setDefaultMipmapFilter(filtermode, sharpness, anisotropy)
Alex Szpakowski <slime73@gmail.com>
parents: 1389
diff changeset
779 }
251c40067246 Added anisotropic filtering functionality for images, consolidated mipmap methods into Image:setMipmapFilter(filtermode, sharpness, anisotropy), added love.graphics.setDefaultMipmapFilter(filtermode, sharpness, anisotropy)
Alex Szpakowski <slime73@gmail.com>
parents: 1389
diff changeset
780
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
781 void Graphics::setLineWidth(float width)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
782 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
783 lineWidth = width;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
784 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
785
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
786 void Graphics::setLineStyle(Graphics::LineStyle style)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
787 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
788 lineStyle = style;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
789 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
790
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
791 void Graphics::setLine(float width, Graphics::LineStyle style)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
792 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
793 setLineWidth(width);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
794
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
795 if (style == 0)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
796 return;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
797 setLineStyle(style);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
798 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
799
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
800 float Graphics::getLineWidth() const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
801 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
802 return lineWidth;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
803 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
804
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
805 Graphics::LineStyle Graphics::getLineStyle() const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
806 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
807 return lineStyle;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
808 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
809
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
810 void Graphics::setPointSize(float size)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
811 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
812 glPointSize((GLfloat)size);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
813 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
814
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
815 void Graphics::setPointStyle(Graphics::PointStyle style)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
816 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
817 if (style == POINT_SMOOTH)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
818 glEnable(GL_POINT_SMOOTH);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
819 else // love::POINT_ROUGH
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
820 glDisable(GL_POINT_SMOOTH);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
821 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
822
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
823 void Graphics::setPoint(float size, Graphics::PointStyle style)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
824 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
825 if (style == POINT_SMOOTH)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
826 glEnable(GL_POINT_SMOOTH);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
827 else // POINT_ROUGH
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
828 glDisable(GL_POINT_SMOOTH);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
829
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
830 glPointSize((GLfloat)size);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
831 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
832
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
833 float Graphics::getPointSize() const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
834 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
835 GLfloat size;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
836 glGetFloatv(GL_POINT_SIZE, &size);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
837 return (float)size;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
838 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
839
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
840 Graphics::PointStyle Graphics::getPointStyle() const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
841 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
842 if (glIsEnabled(GL_POINT_SMOOTH) == GL_TRUE)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
843 return POINT_SMOOTH;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
844 else
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
845 return POINT_ROUGH;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
846 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
847
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
848 int Graphics::getMaxPointSize() const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
849 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
850 GLint max;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
851 glGetIntegerv(GL_POINT_SIZE_MAX, &max);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
852 return (int)max;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
853 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
854
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
855 void Graphics::print(const char *str, float x, float y , float angle, float sx, float sy, float ox, float oy, float kx, float ky)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
856 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
857 if (currentFont != 0)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
858 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
859 std::string text(str);
1105
1bd1670a04e1 Close issue #408: printf-justify alignment.
vrld <vrld@vrld.org>
parents: 1096
diff changeset
860 currentFont->print(text, x, y, 0.0, angle, sx, sy, ox, oy, kx, ky);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
861 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
862 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
863
1389
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
864 void Graphics::printf(const char *str, float x, float y, float wrap, AlignMode align, float angle, float sx, float sy, float ox, float oy, float kx, float ky)
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
865 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
866 if (currentFont == 0)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
867 return;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
868
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
869 using namespace std;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
870 string text(str);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
871 vector<string> lines_to_draw = currentFont->getWrap(text, wrap);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
872
1389
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
873 glPushMatrix();
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
874
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
875 static Matrix t;
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
876 t.setTransformation(ceil(x), ceil(y), angle, sx, sy, ox, oy, kx, ky);
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
877 glMultMatrixf((const GLfloat *)t.getElements());
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
878
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
879 x = y = 0.0f;
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
880
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
881 try
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
882 {
1389
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
883 // now for the actual printing
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
884 vector<string>::const_iterator line_iter, line_end = lines_to_draw.end();
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
885 float letter_spacing = 0.0f;
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
886 for (line_iter = lines_to_draw.begin(); line_iter != line_end; ++line_iter)
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
887 {
1389
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
888 float width = static_cast<float>(currentFont->getWidth(*line_iter));
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
889 switch (align)
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
890 {
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
891 case ALIGN_RIGHT:
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
892 currentFont->print(*line_iter, ceil(x + (wrap - width)), ceil(y), 0.0f);
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
893 break;
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
894 case ALIGN_CENTER:
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
895 currentFont->print(*line_iter, ceil(x + (wrap - width) / 2), ceil(y), 0.0f);
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
896 break;
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
897 case ALIGN_JUSTIFY:
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
898 if (line_iter->length() > 1 && (line_iter+1) != line_end)
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
899 letter_spacing = (wrap - width) / float(line_iter->length() - 1);
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
900 else
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
901 letter_spacing = 0.0f;
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
902 currentFont->print(*line_iter, ceil(x), ceil(y), letter_spacing);
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
903 break;
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
904 case ALIGN_LEFT:
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
905 default:
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
906 currentFont->print(*line_iter, ceil(x), ceil(y), 0.0f);
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
907 break;
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
908 }
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
909 y += currentFont->getHeight() * currentFont->getLineHeight();
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
910 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
911 }
1389
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
912 catch (love::Exception &)
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
913 {
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
914 glPopMatrix();
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
915 throw;
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
916 }
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
917
ac121b0d7258 Added all standard optional draw parameters to love.graphics.printf: angle, sx, sy, ox, oy, kx, and ky
Alex Szpakowski <slime73@gmail.com>
parents: 1373
diff changeset
918 glPopMatrix();
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
919 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
920
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
921 /**
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
922 * Primitives
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
923 **/
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
924
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
925 void Graphics::point(float x, float y)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
926 {
1213
56db65b1f103 Bind texture id 0 (no texture) instead of disabling/re-enabling texturing entirely, when drawing graphics primitives. This both allows shaders to potentially use their own textures when drawing textureless primitives, and reduces overhead caused by constant GL state changes when drawing many graphics primitives.
Alexander Szpakowski <amaranth72@gmail.com>
parents: 1207
diff changeset
927 bindTexture(0);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
928 glBegin(GL_POINTS);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
929 glVertex2f(x, y);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
930 glEnd();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
931 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
932
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
933 // Calculate line boundary points u1 and u2. Sketch:
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
934 // u1
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
935 // -------------+---...___
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
936 // | ```'''-- ---
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
937 // p- - - - - - q- - . _ _ | w/2
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
938 // | ` ' ' r +
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
939 // -------------+---...___ | w/2
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
940 // u2 ```'''-- ---
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
941 //
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
942 // u1 and u2 depend on four things:
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
943 // - the half line width w/2
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
944 // - the previous line vertex p
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
945 // - the current line vertex q
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
946 // - the next line vertex r
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
947 //
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
948 // u1/u2 are the intersection points of the parallel lines to p-q and q-r,
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
949 // i.e. the point where
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
950 //
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
951 // (p + w/2 * n1) + mu * (q - p) = (q + w/2 * n2) + lambda * (r - q) (u1)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
952 // (p - w/2 * n1) + mu * (q - p) = (q - w/2 * n2) + lambda * (r - q) (u2)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
953 //
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
954 // with n1,n2 being the normals on the segments p-q and q-r:
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
955 //
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
956 // n1 = perp(q - p) / |q - p|
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
957 // n2 = perp(r - q) / |r - q|
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
958 //
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
959 // The intersection points can be calculated using cramers rule.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
960 static void pushIntersectionPoints(Vector *vertices, Vector *overdraw,
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
961 int pos, int count, float hw, float overdraw_factor,
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
962 const Vector &p, const Vector &q, const Vector &r)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
963 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
964 // calculate line directions
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
965 Vector s = (q - p);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
966 Vector t = (r - q);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
967
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
968 // calculate vertex displacement vectors
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
969 Vector n1 = s.getNormal();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
970 Vector n2 = t.getNormal();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
971 n1.normalize();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
972 n2.normalize();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
973 float det_norm = n1 ^ n2; // will be close to zero if the angle between the normals is sharp
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
974 n1 *= hw;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
975 n2 *= hw;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
976
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
977 // lines parallel -> assume intersection at displacement points
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
978 if (fabs(det_norm) <= .03)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
979 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
980 vertices[pos] = q - n2;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
981 vertices[pos+1] = q + n2;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
982 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
983 // real intersection -> calculate boundary intersection points with cramers rule
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
984 else
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
985 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
986 float det = s ^ t;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
987 Vector d = n1 - n2;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
988 Vector b = s - d; // s = q - p
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
989 Vector c = s + d;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
990 float lambda = (b ^ t) / det;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
991 float mu = (c ^ t) / det;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
992
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
993 // ordering for GL_TRIANGLE_STRIP
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
994 vertices[pos] = p + s*mu - n1; // u1
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
995 vertices[pos+1] = p + s*lambda + n1; // u2
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
996 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
997
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
998 if (overdraw)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
999 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1000 // displacement of the overdraw vertices
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1001 Vector x = (vertices[pos] - q) * overdraw_factor;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1002
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1003 overdraw[pos] = vertices[pos];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1004 overdraw[pos+1] = vertices[pos] + x;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1005
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1006 overdraw[2*count-pos-2] = vertices[pos+1];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1007 overdraw[2*count-pos-1] = vertices[pos+1] - x;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1008 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1009 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1010
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1011 // precondition:
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1012 // glEnableClientState(GL_VERTEX_ARRAY);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1013 static void draw_overdraw(Vector *overdraw, size_t count, float pixel_size, bool looping)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1014 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1015 // if not looping, the outer overdraw vertices need to be displaced
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1016 // to cover the line endings, i.e.:
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1017 // +- - - - //- - + +- - - - - //- - - +
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1018 // +-------//-----+ : +-------//-----+ :
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1019 // | core // line | --> : | core // line | :
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1020 // +-----//-------+ : +-----//-------+ :
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1021 // +- - //- - - - + +- - - //- - - - - +
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1022 if (!looping)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1023 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1024 Vector s = overdraw[1] - overdraw[3];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1025 s.normalize();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1026 s *= pixel_size;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1027 overdraw[1] += s;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1028 overdraw[2*count-1] += s;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1029
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1030 Vector t = overdraw[count-1] - overdraw[count-3];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1031 t.normalize();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1032 t *= pixel_size;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1033 overdraw[count-1] += t;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1034 overdraw[count+1] += t;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1035
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1036 // we need to draw two more triangles to close the
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1037 // overdraw at the line start.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1038 overdraw[2*count] = overdraw[0];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1039 overdraw[2*count+1] = overdraw[1];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1040 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1041
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1042 // prepare colors:
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1043 // even indices in overdraw* point to inner vertices => alpha = current-alpha,
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1044 // odd indices point to outer vertices => alpha = 0.
1442
d732e302eae6 Internally keep track of the value of the current color (issue #564)
Alex Szpakowski <slime73@gmail.com>
parents: 1439
diff changeset
1045 Color c = opengl::getCurrentColor();
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1046
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1047 Color *colors = new Color[2*count+2];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1048 for (size_t i = 0; i < 2*count+2; ++i)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1049 {
1442
d732e302eae6 Internally keep track of the value of the current color (issue #564)
Alex Szpakowski <slime73@gmail.com>
parents: 1439
diff changeset
1050 colors[i] = c;
d732e302eae6 Internally keep track of the value of the current color (issue #564)
Alex Szpakowski <slime73@gmail.com>
parents: 1439
diff changeset
1051 // avoids branching. equiv to if (i%2 == 1) colors[i].a = 0;
d732e302eae6 Internally keep track of the value of the current color (issue #564)
Alex Szpakowski <slime73@gmail.com>
parents: 1439
diff changeset
1052 colors[i].a *= GLubyte(i % 2 == 0);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1053 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1054
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1055 // draw faded out line halos
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1056 glEnableClientState(GL_COLOR_ARRAY);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1057 glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1058 glVertexPointer(2, GL_FLOAT, 0, (const GLvoid *)overdraw);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1059 glDrawArrays(GL_TRIANGLE_STRIP, 0, 2*count + 2 * int(!looping));
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1060 glDisableClientState(GL_COLOR_ARRAY);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1061 // "if GL_COLOR_ARRAY is enabled, the value of the current color is
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1062 // undefined after glDrawArrays executes"
1442
d732e302eae6 Internally keep track of the value of the current color (issue #564)
Alex Szpakowski <slime73@gmail.com>
parents: 1439
diff changeset
1063
d732e302eae6 Internally keep track of the value of the current color (issue #564)
Alex Szpakowski <slime73@gmail.com>
parents: 1439
diff changeset
1064 opengl::setCurrentColor(c);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1065
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1066 delete[] colors;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1067 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1068
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1069 void Graphics::polyline(const float *coords, size_t count)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1070 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1071 Vector *vertices = new Vector[count]; // two vertices for every line end-point
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1072 Vector *overdraw = NULL;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1073
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1074 Vector p,q,r;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1075 bool looping = (coords[0] == coords[count-2]) && (coords[1] == coords[count-1]);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1076
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1077 float halfwidth = lineWidth/2.f;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1078 float pixel_size = 1.f;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1079 float overdraw_factor = .0f;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1080
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1081 if (lineStyle == LINE_SMOOTH)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1082 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1083 overdraw = new Vector[2*count+2];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1084 // TODO: is there a better way to get the pixel size at the current scale?
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1085 GLfloat m[16];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1086 glGetFloatv(GL_MODELVIEW_MATRIX, m);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1087 float det = m[0]*m[5]*m[10] + m[4]*m[9]*m[2] + m[8]*m[1]*m[6];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1088 det -= m[2]*m[5]*m[8] + m[6]*m[9]*m[0] + m[10]*m[1]*m[4];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1089 pixel_size = 1.f / sqrt(det);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1090
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1091 overdraw_factor = pixel_size / halfwidth;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1092 halfwidth = std::max(.0f, halfwidth - .25f*pixel_size);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1093 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1094
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1095 // get line vertex boundaries
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1096 // if not looping, extend the line at the beginning, else use last point as `p'
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1097 r = Vector(coords[0], coords[1]);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1098 if (!looping)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1099 q = r * 2 - Vector(coords[2], coords[3]);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1100 else
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1101 q = Vector(coords[count-4], coords[count-3]);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1102
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1103 for (size_t i = 0; i+3 < count; i += 2)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1104 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1105 p = q;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1106 q = r;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1107 r = Vector(coords[i+2], coords[i+3]);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1108 pushIntersectionPoints(vertices, overdraw, i, count, halfwidth, overdraw_factor, p,q,r);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1109 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1110
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1111 // if not looping, extend the line at the end, else use first point as `r'
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1112 p = q;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1113 q = r;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1114 if (!looping)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1115 r += q - p;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1116 else
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1117 r = Vector(coords[2], coords[3]);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1118 pushIntersectionPoints(vertices, overdraw, count-2, count, halfwidth, overdraw_factor, p,q,r);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1119 // end get line vertex boundaries
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1120
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1121 // draw the core line
1213
56db65b1f103 Bind texture id 0 (no texture) instead of disabling/re-enabling texturing entirely, when drawing graphics primitives. This both allows shaders to potentially use their own textures when drawing textureless primitives, and reduces overhead caused by constant GL state changes when drawing many graphics primitives.
Alexander Szpakowski <amaranth72@gmail.com>
parents: 1207
diff changeset
1122 bindTexture(0);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1123 glEnableClientState(GL_VERTEX_ARRAY);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1124 glVertexPointer(2, GL_FLOAT, 0, (const GLvoid *)vertices);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1125 glDrawArrays(GL_TRIANGLE_STRIP, 0, count);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1126
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1127 // draw the line halo (antialiasing)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1128 if (lineStyle == LINE_SMOOTH)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1129 draw_overdraw(overdraw, count, pixel_size, looping);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1130
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1131 glDisableClientState(GL_VERTEX_ARRAY);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1132
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1133 // cleanup
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1134 delete[] vertices;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1135 if (lineStyle == LINE_SMOOTH)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1136 delete[] overdraw;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1137 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1138
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1139 void Graphics::rectangle(DrawMode mode, float x, float y, float w, float h)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1140 {
1373
4df5cb3bd028 Really fixed love.graphics.rectangle
Alex Szpakowski <slime73@gmail.com>
parents: 1372
diff changeset
1141 float coords[] = {x,y, x,y+h, x+w,y+h, x+w,y, x,y};
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1142 polygon(mode, coords, 5 * 2);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1143 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1144
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1145 void Graphics::circle(DrawMode mode, float x, float y, float radius, int points)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1146 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1147 float two_pi = static_cast<float>(LOVE_M_PI * 2);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1148 if (points <= 0) points = 1;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1149 float angle_shift = (two_pi / points);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1150 float phi = .0f;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1151
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1152 float *coords = new float[2 * (points + 1)];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1153 for (int i = 0; i < points; ++i, phi += angle_shift)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1154 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1155 coords[2*i] = x + radius * cos(phi);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1156 coords[2*i+1] = y + radius * sin(phi);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1157 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1158
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1159 coords[2*points] = coords[0];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1160 coords[2*points+1] = coords[1];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1161
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1162 polygon(mode, coords, (points + 1) * 2);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1163
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1164 delete[] coords;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1165 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1166
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1167 void Graphics::arc(DrawMode mode, float x, float y, float radius, float angle1, float angle2, int points)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1168 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1169 // Nothing to display with no points or equal angles. (Or is there with line mode?)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1170 if (points <= 0 || angle1 == angle2)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1171 return;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1172
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1173 // Oh, you want to draw a circle?
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1174 if (fabs(angle1 - angle2) >= 2.0f * (float) LOVE_M_PI)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1175 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1176 circle(mode, x, y, radius, points);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1177 return;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1178 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1179
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1180 float angle_shift = (angle2 - angle1) / points;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1181 // Bail on precision issues.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1182 if (angle_shift == 0.0)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1183 return;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1184
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1185 float phi = angle1;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1186 int num_coords = (points + 3) * 2;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1187 float *coords = new float[num_coords];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1188 coords[0] = coords[num_coords - 2] = x;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1189 coords[1] = coords[num_coords - 1] = y;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1190
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1191 for (int i = 0; i <= points; ++i, phi += angle_shift)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1192 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1193 coords[2 * (i+1)] = x + radius * cos(phi);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1194 coords[2 * (i+1) + 1] = y + radius * sin(phi);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1195 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1196
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1197 // GL_POLYGON can only fill-draw convex polygons, so we need to do stuff manually here
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1198 if (mode == DRAW_LINE)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1199 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1200 polyline(coords, num_coords); // Artifacts at sharp angles if set to looping.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1201 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1202 else
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1203 {
1213
56db65b1f103 Bind texture id 0 (no texture) instead of disabling/re-enabling texturing entirely, when drawing graphics primitives. This both allows shaders to potentially use their own textures when drawing textureless primitives, and reduces overhead caused by constant GL state changes when drawing many graphics primitives.
Alexander Szpakowski <amaranth72@gmail.com>
parents: 1207
diff changeset
1204 bindTexture(0);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1205 glEnableClientState(GL_VERTEX_ARRAY);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1206 glVertexPointer(2, GL_FLOAT, 0, (const GLvoid *) coords);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1207 glDrawArrays(GL_TRIANGLE_FAN, 0, points + 2);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1208 glDisableClientState(GL_VERTEX_ARRAY);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1209 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1210
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1211 delete[] coords;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1212 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1213
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1214 /// @param mode the draw mode
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1215 /// @param coords the coordinate array
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1216 /// @param count the number of coordinates/size of the array
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1217 void Graphics::polygon(DrawMode mode, const float *coords, size_t count)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1218 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1219 // coords is an array of a closed loop of vertices, i.e.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1220 // coords[count-2] = coords[0], coords[count-1] = coords[1]
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1221 if (mode == DRAW_LINE)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1222 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1223 polyline(coords, count);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1224 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1225 else
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1226 {
1213
56db65b1f103 Bind texture id 0 (no texture) instead of disabling/re-enabling texturing entirely, when drawing graphics primitives. This both allows shaders to potentially use their own textures when drawing textureless primitives, and reduces overhead caused by constant GL state changes when drawing many graphics primitives.
Alexander Szpakowski <amaranth72@gmail.com>
parents: 1207
diff changeset
1227 bindTexture(0);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1228 glEnableClientState(GL_VERTEX_ARRAY);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1229 glVertexPointer(2, GL_FLOAT, 0, (const GLvoid *)coords);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1230 glDrawArrays(GL_POLYGON, 0, count/2-1); // opengl will close the polygon for us
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1231 glDisableClientState(GL_VERTEX_ARRAY);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1232 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1233 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1234
1364
79162aad3481 love.graphics.newScreenshot replaces alpha with full opacity by default (issue #374, thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1340
diff changeset
1235 love::image::ImageData *Graphics::newScreenshot(love::image::Image *image, bool copyAlpha)
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1236 {
1365
ed450b9c8bb4 love.graphics.newScreenshot now uses the size of the current canvas (if applicable), instead of adding transparency or clipping to match the screen size
Alex Szpakowski <slime73@gmail.com>
parents: 1364
diff changeset
1237 int w = getRenderWidth();
ed450b9c8bb4 love.graphics.newScreenshot now uses the size of the current canvas (if applicable), instead of adding transparency or clipping to match the screen size
Alex Szpakowski <slime73@gmail.com>
parents: 1364
diff changeset
1238 int h = getRenderHeight();
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1239
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1240 int row = 4*w;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1241
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1242 int size = row*h;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1243
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1244 GLubyte *pixels = new GLubyte[size];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1245 GLubyte *screenshot = new GLubyte[size];
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1246
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1247 glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1248
1364
79162aad3481 love.graphics.newScreenshot replaces alpha with full opacity by default (issue #374, thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1340
diff changeset
1249 if (!copyAlpha)
79162aad3481 love.graphics.newScreenshot replaces alpha with full opacity by default (issue #374, thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1340
diff changeset
1250 {
79162aad3481 love.graphics.newScreenshot replaces alpha with full opacity by default (issue #374, thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1340
diff changeset
1251 // Replace alpha values with full opacity.
79162aad3481 love.graphics.newScreenshot replaces alpha with full opacity by default (issue #374, thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1340
diff changeset
1252 for (int i = 3; i < size; i += 4)
79162aad3481 love.graphics.newScreenshot replaces alpha with full opacity by default (issue #374, thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1340
diff changeset
1253 pixels[i] = 255;
79162aad3481 love.graphics.newScreenshot replaces alpha with full opacity by default (issue #374, thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1340
diff changeset
1254 }
79162aad3481 love.graphics.newScreenshot replaces alpha with full opacity by default (issue #374, thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1340
diff changeset
1255
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1256 // OpenGL sucks and reads pixels from the lower-left. Let's fix that.
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1257
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1258 GLubyte *src = pixels - row, *dst = screenshot + size;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1259
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1260 for (int i = 0; i < h; ++i)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1261 memcpy(dst-=row, src+=row, row);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1262
1364
79162aad3481 love.graphics.newScreenshot replaces alpha with full opacity by default (issue #374, thanks Boolsheet)
Alex Szpakowski <slime73@gmail.com>
parents: 1340
diff changeset
1263 love::image::ImageData *img = image->newImageData(w, h, (void *) screenshot);
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1264
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1265 delete [] pixels;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1266 delete [] screenshot;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1267
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1268 return img;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1269 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1270
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1271 void Graphics::push()
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1272 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1273 if (userMatrices == matrixLimit)
1157
29c84a47f61a Close issue #519: Maximum stack depth reached error message.
vrld <vrld@vrld.org>
parents: 1139
diff changeset
1274 throw Exception("Maximum stack depth reached. (More pushes than pops?)");
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1275 glPushMatrix();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1276 ++userMatrices;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1277 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1278
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1279 void Graphics::pop()
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1280 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1281 if (userMatrices < 1)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1282 throw Exception("Minimum stack depth reached. (More pops than pushes?)");
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1283 glPopMatrix();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1284 --userMatrices;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1285 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1286
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1287 void Graphics::rotate(float r)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1288 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1289 glRotatef(LOVE_TODEG(r), 0, 0, 1);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1290 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1291
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1292 void Graphics::scale(float x, float y)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1293 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1294 glScalef(x, y, 1);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1295 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1296
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1297 void Graphics::translate(float x, float y)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1298 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1299 glTranslatef(x, y, 0);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1300 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1301
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1302 void Graphics::shear(float kx, float ky)
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1303 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1304 Matrix t;
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1305 t.setShear(kx, ky);
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1306 glMultMatrixf((const GLfloat *)t.getElements());
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1307 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1308
1321
30d0e4cb3d2b Added love.graphics.origin(): resets the coordinate system (replaces the current transformation matrix with the identity)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
1309 void Graphics::origin()
30d0e4cb3d2b Added love.graphics.origin(): resets the coordinate system (replaces the current transformation matrix with the identity)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
1310 {
30d0e4cb3d2b Added love.graphics.origin(): resets the coordinate system (replaces the current transformation matrix with the identity)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
1311 glLoadIdentity();
30d0e4cb3d2b Added love.graphics.origin(): resets the coordinate system (replaces the current transformation matrix with the identity)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
1312 }
30d0e4cb3d2b Added love.graphics.origin(): resets the coordinate system (replaces the current transformation matrix with the identity)
Alex Szpakowski <slime73@gmail.com>
parents: 1311
diff changeset
1313
1310
2061cc4dc762 Constified many Graphics and Window methods
Alex Szpakowski <slime73@gmail.com>
parents: 1307
diff changeset
1314 bool Graphics::hasFocus() const
1096
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1315 {
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1316 return currentWindow->hasFocus();
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1317 }
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1318
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1319 } // opengl
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1320 } // graphics
86a44f2bc38f CRLF to LF
Bart van Strien <bart.bes+projects@gmail.com>
parents: 1086
diff changeset
1321 } // love