Switched from GLEW to glbinding, vcpkg is fucking amazing, cmake works on windows again

This commit is contained in:
Adrian Hedqvist 2017-12-27 21:54:11 +01:00
parent 999ea5bd71
commit 09730c4101
12 changed files with 817 additions and 31 deletions

4
.gitignore vendored
View File

@ -5,8 +5,7 @@
*.opensdf
*.sdf
*.pdb
*.sln
*.vcxproj*
*.user
[Dd]ebug
[Rr]elease
@ -33,3 +32,4 @@ build
imgui.ini
*.sublime*
*.dll
gitparams.h

View File

@ -12,28 +12,31 @@ execute_process(
file(WRITE "src/gitparams.h" "#define GIT_CUR_COMMIT ${GIT_COMMIT}")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -g -static-libgcc -static-libstdc++")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -static-libgcc -static-libstdc++")
project(dungeon LANGUAGES CXX)
set(TARGET dungeon)
project(${TARGET} LANGUAGES CXX)
find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
find_package(glbinding REQUIRED)
find_package(Lua REQUIRED)
find_package(SDL2 REQUIRED)
include_directories(
${OPENGL_INCLUDE_DIR}
${SDL2_INCLUDE_DIR}
${GLEW_INCLUDE_DIRS}
${GLBINDING_INCLUDE_DIRS}
${LUA_INCLUDE_DIR}
"libs/glm"
"libs/kaguya-1.3.2/include"
)
message(STATUS ${GLBINDING_LIBRARIES})
link_libraries(
${OPENGL_LIBRARIES}
${SDL2_LIBRARY}
${GLEW_LIBRARIES}
${LUA_LIBRARIES}
)
file(GLOB SOURCES "src/*.cpp" "src/*.c" "src/*.h")
add_executable(dungeon ${SOURCES})
target_link_libraries(${TARGET} PUBLIC glbinding::glbinding)

View File

@ -6,18 +6,18 @@ A work-in-progress, cross-platform roguelike written in C++ using SDL2 and OpenG
## Compiling
Dependencies: `SDL2`, `Lua53`, `glm`, and `glbinding`
### Linux
* Install SDL2, Lua53 and GLEW using your distro's package manager
* Install the dependencies using your distro's package manager
* Create a directory named "build" and run `cmake .. && make` inside it
* Move either the resulting binary to the root folder of the repository or copy the assets folder into the build directory
* You can now run the binary
### Windows
I really need to fix a hassle-free way to build this shit on windows.
Currently, you need to import the source as a new project in visual studio and set up the dependencies yourself. (SDL2, Lua53, GLEW, OpenGL)
CMake should work just fine on windows as well, but I heavily recommend you to use [vcpkg](https://github.com/Microsoft/vcpkg) to install the libraries.
## Future plans
@ -28,7 +28,8 @@ Currently, you need to import the source as a new project in visual studio and s
* [ ] Make entities and AI completely data-driven
* [ ] Implement Lua for item/effects/action scripting
* Might as well use it for basic data storage as well, since I can then skip creating my own parser or adding an additional library for json/yaml/toml/whatever.
* [x] Initial implementation
* [x] Get Lua to work
* [ ] Initial implementation
* [ ] Items
* [ ] Status Effects
* [ ] Spells

31
dungeon.sln Normal file
View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2010
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dungeon", "dungeon.vcxproj", "{47B30CB8-11E4-4B86-BB50-E3603FE99F9E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{47B30CB8-11E4-4B86-BB50-E3603FE99F9E}.Debug|x64.ActiveCfg = Debug|x64
{47B30CB8-11E4-4B86-BB50-E3603FE99F9E}.Debug|x64.Build.0 = Debug|x64
{47B30CB8-11E4-4B86-BB50-E3603FE99F9E}.Debug|x86.ActiveCfg = Debug|Win32
{47B30CB8-11E4-4B86-BB50-E3603FE99F9E}.Debug|x86.Build.0 = Debug|Win32
{47B30CB8-11E4-4B86-BB50-E3603FE99F9E}.Release|x64.ActiveCfg = Release|x64
{47B30CB8-11E4-4B86-BB50-E3603FE99F9E}.Release|x64.Build.0 = Release|x64
{47B30CB8-11E4-4B86-BB50-E3603FE99F9E}.Release|x86.ActiveCfg = Release|Win32
{47B30CB8-11E4-4B86-BB50-E3603FE99F9E}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {FDC70A19-9B1D-420D-8411-489CEB5FF3DE}
EndGlobalSection
EndGlobal

461
dungeon.vcxproj Normal file

File diff suppressed because one or more lines are too long

282
dungeon.vcxproj.filters Normal file
View File

@ -0,0 +1,282 @@
<?xml version="1.0" encoding="UTF-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\Actor.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\App.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\AttackEnemyNode.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\BehaviourTree.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\BehaviourTreeMemSelector.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\BehaviourTreeMemSequencer.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\BehaviourTreeNode.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\BehaviourTreeSelector.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\BehaviourTreeSequencer.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\Config.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\Entity.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\ExploreNode.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\FieldOfView.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\FleeNode.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\Gamestate.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\Goblin.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\HealFriendNode.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\Hero.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\IfHealthBelow.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\IfNotSeeEnemyNode.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\IfSeeEnemyNode.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\IfSeeFriendNode.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\Input.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\Main.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\Mapgen.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\Pathfinder.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\PlayState.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\RangedAttackNode.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\Renderer.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\RestNode.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\Shaman.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\Tilemap.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\Tileset.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\WanderNode.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\World.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\imgui.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\imgui_demo.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\imgui_draw.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\imgui_impl_sdl_gl3.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\Programmering\C++\Dungeon\src\imgui_user.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\Actor.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\App.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\AttackEnemyNode.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\BehaviourTree.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\BehaviourTreeMemSelector.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\BehaviourTreeMemSequencer.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\BehaviourTreeNode.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\BehaviourTreeSelector.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\BehaviourTreeSequencer.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\Color.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\Config.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\Entity.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\ExploreNode.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\FieldOfView.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\FleeNode.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\Gamestate.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\Goblin.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\HealFriendNode.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\Hero.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\IfHealthBelow.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\IfNotSeeEnemyNode.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\IfSeeEnemyNode.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\IfSeeFriendNode.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\Input.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\Logger.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\Mapgen.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\Pathfinder.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\PlayState.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\RangedAttackNode.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\Renderer.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\RestNode.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\Shaman.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\Stats.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\Tilemap.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\Tileset.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\WanderNode.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\World.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\gitparams.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\imconfig.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\imgui.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\imgui_impl_sdl_gl3.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\imgui_internal.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\imgui_user.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\stb_rect_pack.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\stb_textedit.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\stb_truetype.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\vec2i.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="E:\Programmering\C++\Dungeon\src\wglew.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="E:\Programmering\C++\Dungeon\CMakeLists.txt" />
</ItemGroup>
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{40E65D15-5F8D-3901-96F2-47322AD2F0D7}</UniqueIdentifier>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{FE34F69C-6EB7-3A06-A783-3BDA351EEAFE}</UniqueIdentifier>
</Filter>
</ItemGroup>
</Project>

View File

@ -3,7 +3,7 @@
//
#include "App.h"
#include <SDL.h>
#include <SDL2/SDL.h>
#include <ctime>
#include <fstream>
#include <string>

View File

@ -1,5 +1,5 @@
#include "Input.h"
#include <SDL.h>
#include <SDL2/SDL.h>
Input::Input()
{

View File

@ -1,6 +1,7 @@
#include <SDL2\SDL.h>
#include "App.h"
#undef main
int main(int argc, char* argv[]) {
App app{};
int err = 1;

View File

@ -173,6 +173,7 @@ Gamestate *PlayState::update(double delta) {
vec2i heropos = hero->get_position();
auto acts = tilemap.get_entities(heropos.x + dir.x, heropos.y + dir.y, 0, ENTITY_ACTOR);
if(acts.empty()) {
action = ACTION_NONE;
SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM, "Turn aborted: invalid player action.\n");
return nullptr; // unable to move and nothing to attack == abort turn
}

View File

@ -1,8 +1,8 @@
#include "Renderer.h"
#define GLEW_STATIC
#define GLEW_NO_GLU
#include <GL/glew.h>
#include <glbinding\gl\gl.h>
#include <glbinding\Binding.h>
#include <glbinding\gl\types.h>
#include <fstream>
#include <SDL2/SDL.h>
@ -12,6 +12,8 @@
#include <glm/matrix.hpp>
#include <utility>
using namespace gl;
const GLfloat rectVertData[]{
0,0,0, 1,0,0, 0,1,0, 1,1,0
};
@ -37,7 +39,7 @@ GLuint LoadShader(const char* path, GLenum shadertype) {
return 0;
}
GLint result = GL_FALSE;
GLboolean result = GL_FALSE;
int infologlength;
SDL_Log("Compiling shader: %s\n", path);
@ -63,7 +65,7 @@ GLuint CreateShaderProgram(GLuint vertshader, GLuint fragshader) {
glAttachShader(programId, fragshader);
glLinkProgram(programId);
GLint result = GL_FALSE;
GLboolean result = GL_FALSE;
int infologlength;
glGetShaderiv(programId, GL_LINK_STATUS, &result);
@ -128,6 +130,9 @@ bool Renderer::Init(std::string title, int width, int height) {
return false;
}
glbinding::Binding::initialize();
/*
GLenum err = glewInit();
if (err != GLEW_OK) {
SDL_LogCritical(SDL_LOG_CATEGORY_RENDER, "Failed to initialize OpenGl: %s\n", glewGetErrorString(err));
@ -138,7 +143,7 @@ bool Renderer::Init(std::string title, int width, int height) {
SDL_LogCritical(SDL_LOG_CATEGORY_RENDER,"OpenGl 3.2 is not supported, please try updating your drivers!\n");
return false;
}
*/
glClearColor(0, 0, 0, 1);
ImGui_ImplSdlGL3_Init(window);
@ -250,7 +255,7 @@ Texture * Renderer::LoadTexture(std::string path) {
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
int mode = GL_RGB;
GLenum mode = GL_RGB;
if (surface->format->BytesPerPixel == 4) {
mode = GL_RGBA;
}

View File

@ -12,8 +12,9 @@
// SDL,GL3W
#include <SDL2/SDL.h>
#include <SDL2/SDL_syswm.h>
#define GLEW_STATIC
#include <GL/glew.h> // This example is using gl3w to access OpenGL functions (because it is small). You may use glew/glad/glLoadGen/etc. whatever already works for you.
#include <glbinding\gl\gl.h>
#include <glbinding\gl\types.h>
using namespace gl;
// Data
static double g_Time = 0.0f;
@ -39,19 +40,19 @@ void ImGui_ImplSdlGL3_RenderDrawLists(ImDrawData* draw_data)
draw_data->ScaleClipRects(io.DisplayFramebufferScale);
// Backup GL state
GLint last_active_texture; glGetIntegerv(GL_ACTIVE_TEXTURE, &last_active_texture);
GLenum last_active_texture; glGetIntegerv(GL_ACTIVE_TEXTURE, &last_active_texture);
glActiveTexture(GL_TEXTURE0);
GLint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);
GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
GLint last_element_array_buffer; glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &last_element_array_buffer);
GLint last_vertex_array; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
GLint last_blend_src_rgb; glGetIntegerv(GL_BLEND_SRC_RGB, &last_blend_src_rgb);
GLint last_blend_dst_rgb; glGetIntegerv(GL_BLEND_DST_RGB, &last_blend_dst_rgb);
GLint last_blend_src_alpha; glGetIntegerv(GL_BLEND_SRC_ALPHA, &last_blend_src_alpha);
GLint last_blend_dst_alpha; glGetIntegerv(GL_BLEND_DST_ALPHA, &last_blend_dst_alpha);
GLint last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, &last_blend_equation_rgb);
GLint last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &last_blend_equation_alpha);
GLenum last_blend_src_rgb; glGetIntegerv(GL_BLEND_SRC_RGB, &last_blend_src_rgb);
GLenum last_blend_dst_rgb; glGetIntegerv(GL_BLEND_DST_RGB, &last_blend_dst_rgb);
GLenum last_blend_src_alpha; glGetIntegerv(GL_BLEND_SRC_ALPHA, &last_blend_src_alpha);
GLenum last_blend_dst_alpha; glGetIntegerv(GL_BLEND_DST_ALPHA, &last_blend_dst_alpha);
GLenum last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, &last_blend_equation_rgb);
GLenum last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &last_blend_equation_alpha);
GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);
GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box);
GLboolean last_enable_blend = glIsEnabled(GL_BLEND);