Minor refactoring

This commit is contained in:
Vladislav Khorev 2025-12-30 16:16:50 +03:00
parent 0a5a3b653d
commit 592e008914
43 changed files with 3589 additions and 3594 deletions

View File

@ -413,45 +413,45 @@ set_target_properties(libzip_external_lib PROPERTIES
# Основной проект space-game001 # Основной проект space-game001
# =========================================== # ===========================================
add_executable(space-game001 add_executable(space-game001
main.cpp src/main.cpp
Game.cpp src/Game.cpp
Game.h src/Game.h
Environment.cpp src/Environment.cpp
Environment.h src/Environment.h
Renderer.cpp src/render/Renderer.cpp
Renderer.h src/render/Renderer.h
ShaderManager.cpp src/render/ShaderManager.cpp
ShaderManager.h src/render/ShaderManager.h
TextureManager.cpp src/render/TextureManager.cpp
TextureManager.h src/render/TextureManager.h
TextModel.cpp src/TextModel.cpp
TextModel.h src/TextModel.h
AudioPlayerAsync.cpp src/AudioPlayerAsync.cpp
AudioPlayerAsync.h src/AudioPlayerAsync.h
BoneAnimatedModel.cpp src/BoneAnimatedModel.cpp
BoneAnimatedModel.h src/BoneAnimatedModel.h
ZLMath.cpp src/utils/ZLMath.cpp
ZLMath.h src/utils/ZLMath.h
OpenGlExtensions.cpp src/render/OpenGlExtensions.cpp
OpenGlExtensions.h src/render/OpenGlExtensions.h
Utils.cpp src/utils/Utils.cpp
Utils.h src/utils/Utils.h
SparkEmitter.cpp src/SparkEmitter.cpp
SparkEmitter.h src/SparkEmitter.h
PlanetObject.cpp src/planet/PlanetObject.cpp
PlanetObject.h src/planet/PlanetObject.h
PlanetData.cpp src/planet/PlanetData.cpp
PlanetData.h src/planet/PlanetData.h
Perlin.cpp src/utils/Perlin.cpp
Perlin.h src/utils/Perlin.h
StoneObject.cpp src/planet/StoneObject.cpp
StoneObject.h src/planet/StoneObject.h
FrameBuffer.cpp src/render/FrameBuffer.cpp
FrameBuffer.h src/render/FrameBuffer.h
UiManager.cpp src/UiManager.cpp
UiManager.h src/UiManager.h
Projectile.h src/Projectile.h
Projectile.cpp src/Projectile.cpp
) )
# Установка проекта по умолчанию для Visual Studio # Установка проекта по умолчанию для Visual Studio
@ -459,12 +459,8 @@ set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT s
# include-пути проекта # include-пути проекта
target_include_directories(space-game001 PRIVATE target_include_directories(space-game001 PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/src"
#"${CMAKE_CURRENT_SOURCE_DIR}/gl" "${CMAKE_CURRENT_SOURCE_DIR}/external"
#"${CMAKE_CURRENT_SOURCE_DIR}/cmakeaudioplayer/include"
#"${SDL2_INSTALL_DIR}/include"
#"${SDL2_INSTALL_DIR}/include/SDL2"
#"${LIBZIP_INSTALL_DIR}-Release/include" # Добавил include-путь для libzip
) )
set_target_properties(space-game001 PROPERTIES set_target_properties(space-game001 PROPERTIES

View File

@ -1,8 +1,8 @@
#pragma once #pragma once
#include "Renderer.h" #include "render/Renderer.h"
#include "TextureManager.h" #include "render/TextureManager.h"
namespace ZL namespace ZL
{ {

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#include "ZLMath.h" #include "utils/ZLMath.h"
#include "Renderer.h" #include "render/Renderer.h"
#include <unordered_map> #include <unordered_map>

View File

@ -1,6 +1,6 @@
#include "Environment.h" #include "Environment.h"
#include "Utils.h" #include "utils/Utils.h"
#include <GL/gl.h> #include <GL/gl.h>
namespace ZL { namespace ZL {

View File

@ -1,9 +1,9 @@
#pragma once #pragma once
#include "ZLMath.h" #include "utils/ZLMath.h"
#ifdef __linux__ #ifdef __linux__
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#endif #endif
#include "OpenGlExtensions.h" #include "render/OpenGlExtensions.h"
namespace ZL { namespace ZL {

1565
Game.cpp → src/Game.cpp Executable file → Normal file

File diff suppressed because it is too large Load Diff

217
Game.h → src/Game.h Executable file → Normal file
View File

@ -1,110 +1,109 @@
#pragma once #pragma once
#include "OpenGlExtensions.h" #include "render/Renderer.h"
#include "Renderer.h" #include "Environment.h"
#include "Environment.h" #include "render/TextureManager.h"
#include "TextureManager.h" #include "SparkEmitter.h"
#include "SparkEmitter.h" #include "planet/PlanetObject.h"
#include "PlanetObject.h" #include "UiManager.h"
#include "UiManager.h" #include "Projectile.h"
#include "Projectile.h"
namespace ZL {
namespace ZL {
struct BoxCoords
struct BoxCoords {
{ Vector3f pos;
Vector3f pos; Matrix3f m;
Matrix3f m; };
};
class Game {
class Game { public:
public: Game();
Game(); ~Game();
~Game();
void setup();
void setup(); void update();
void update(); void render();
void render();
bool shouldExit() const { return Environment::exitGameLoop; }
bool shouldExit() const { return Environment::exitGameLoop; }
private:
private: void processTickCount();
void processTickCount(); void drawScene();
void drawScene(); void drawCubemap(float skyPercent);
void drawCubemap(float skyPercent); void drawShip();
void drawShip(); void drawBoxes();
void drawBoxes(); void drawUI();
void drawUI();
void fireProjectiles();
void fireProjectiles();
SDL_Window* window;
SDL_Window* window; SDL_GLContext glContext;
SDL_GLContext glContext; Renderer renderer;
Renderer renderer;
size_t newTickCount;
size_t newTickCount; size_t lastTickCount;
size_t lastTickCount;
std::shared_ptr<Texture> rockTexture;
std::shared_ptr<Texture> rockTexture;
std::vector<BoxCoords> boxCoordsArr;
std::vector<BoxCoords> boxCoordsArr; std::vector<VertexRenderStruct> boxRenderArr;
std::vector<VertexRenderStruct> boxRenderArr;
//std::shared_ptr<Texture> buttonTexture;
//std::shared_ptr<Texture> buttonTexture; //VertexRenderStruct button;
//VertexRenderStruct button;
//std::shared_ptr<Texture> musicVolumeBarTexture;
//std::shared_ptr<Texture> musicVolumeBarTexture; //VertexRenderStruct musicVolumeBar;
//VertexRenderStruct musicVolumeBar;
//std::shared_ptr<Texture> musicVolumeBarButtonTexture;
//std::shared_ptr<Texture> musicVolumeBarButtonTexture; //VertexRenderStruct musicVolumeBarButton;
//VertexRenderStruct musicVolumeBarButton;
//bool isDraggingVolume = false;
//bool isDraggingVolume = false;
float musicVolume = 0.0f;
float musicVolume = 0.0f; float volumeBarMinX = 1190.0f;
float volumeBarMinX = 1190.0f; float volumeBarMaxX = 1200.0f;
float volumeBarMaxX = 1200.0f; float volumeBarMinY = 100.0f;
float volumeBarMinY = 100.0f; float volumeBarMaxY = 600.0f;
float volumeBarMaxY = 600.0f; //float musicVolumeBarButtonButtonCenterX = 1195.0f;
//float musicVolumeBarButtonButtonCenterX = 1195.0f; //float musicVolumeBarButtonButtonRadius = 25.0f;
//float musicVolumeBarButtonButtonRadius = 25.0f; //void UpdateVolumeFromMouse(int mouseX, int mouseY);
//void UpdateVolumeFromMouse(int mouseX, int mouseY); //void UpdateVolumeKnob();
//void UpdateVolumeKnob();
static const size_t CONST_TIMER_INTERVAL = 10;
static const size_t CONST_TIMER_INTERVAL = 10; static const size_t CONST_MAX_TIME_INTERVAL = 1000;
static const size_t CONST_MAX_TIME_INTERVAL = 1000;
std::shared_ptr<Texture> sparkTexture;
std::shared_ptr<Texture> sparkTexture; std::shared_ptr<Texture> spaceshipTexture;
std::shared_ptr<Texture> spaceshipTexture; std::shared_ptr<Texture> cubemapTexture;
std::shared_ptr<Texture> cubemapTexture; VertexDataStruct spaceshipBase;
VertexDataStruct spaceshipBase; VertexRenderStruct spaceship;
VertexRenderStruct spaceship;
VertexRenderStruct cubemap;
VertexRenderStruct cubemap;
std::shared_ptr<Texture> boxTexture;
std::shared_ptr<Texture> boxTexture; VertexDataStruct boxBase;
VertexDataStruct boxBase;
SparkEmitter sparkEmitter;
SparkEmitter sparkEmitter; SparkEmitter projectileEmitter;
SparkEmitter projectileEmitter; PlanetObject planetObject;
PlanetObject planetObject; UiManager uiManager;
UiManager uiManager;
std::vector<std::unique_ptr<Projectile>> projectiles;
std::vector<std::unique_ptr<Projectile>> projectiles; std::shared_ptr<Texture> projectileTexture;
std::shared_ptr<Texture> projectileTexture; float projectileCooldownMs = 500.0f;
float projectileCooldownMs = 500.0f; uint64_t lastProjectileFireTime = 0;
uint64_t lastProjectileFireTime = 0; int maxProjectiles = 32;
int maxProjectiles = 32; std::vector<Vector3f> shipLocalEmissionPoints;
std::vector<Vector3f> shipLocalEmissionPoints; };
};
} // namespace ZL } // namespace ZL

View File

@ -1,8 +1,8 @@
#pragma once #pragma once
#include "ZLMath.h" #include "utils/ZLMath.h"
#include "Renderer.h" #include "render/Renderer.h"
#include "TextureManager.h" #include "render/TextureManager.h"
#include <memory> #include <memory>
namespace ZL { namespace ZL {

View File

@ -1,7 +1,7 @@
#include "SparkEmitter.h" #include "SparkEmitter.h"
#include <random> #include <random>
#include <cmath> #include <cmath>
#include "OpenGlExtensions.h" //#include "renderer/OpenGlExtensions.h"
#include <fstream> #include <fstream>
#include "external/nlohmann/json.hpp" #include "external/nlohmann/json.hpp"
#include <iostream> #include <iostream>

View File

@ -1,8 +1,8 @@
#pragma once #pragma once
#include "ZLMath.h" #include "utils/ZLMath.h"
#include "Renderer.h" #include "render/Renderer.h"
#include "TextureManager.h" #include "render/TextureManager.h"
#include <vector> #include <vector>
#include <chrono> #include <chrono>
#include <string> #include <string>

View File

@ -1,7 +1,7 @@
#pragma once #pragma once
#include "ZLMath.h" #include "utils/ZLMath.h"
#include "Renderer.h" #include "render/Renderer.h"
#include <unordered_map> #include <unordered_map>

View File

@ -1,5 +1,5 @@
#include "UiManager.h" #include "UiManager.h"
#include "Utils.h" #include "utils/Utils.h"
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <algorithm> #include <algorithm>

View File

@ -1,7 +1,7 @@
#pragma once #pragma once
#include "Renderer.h" #include "render/Renderer.h"
#include "TextureManager.h" #include "render/TextureManager.h"
#include "Environment.h" #include "Environment.h"
#include "external/nlohmann/json.hpp" #include "external/nlohmann/json.hpp"
#include <string> #include <string>

0
gl/glext.h → src/gl/glext.h Executable file → Normal file
View File

176
main.cpp → src/main.cpp Executable file → Normal file
View File

@ -1,88 +1,88 @@
#include "Game.h" #include "Game.h"
#include "Environment.h" #include "Environment.h"
#include <iostream> #include <iostream>
ZL::Game game; ZL::Game game;
void MainLoop() { void MainLoop() {
game.update(); game.update();
} }
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
try try
{ {
constexpr int CONST_WIDTH = 1280; constexpr int CONST_WIDTH = 1280;
constexpr int CONST_HEIGHT = 720; constexpr int CONST_HEIGHT = 720;
ZL::Environment::width = CONST_WIDTH; ZL::Environment::width = CONST_WIDTH;
ZL::Environment::height = CONST_HEIGHT; ZL::Environment::height = CONST_HEIGHT;
#ifdef EMSCRIPTEN #ifdef EMSCRIPTEN
if (SDL_Init(SDL_INIT_VIDEO) != 0) { if (SDL_Init(SDL_INIT_VIDEO) != 0) {
std::cerr << "SDL_Init failed: " << SDL_GetError() << std::endl; std::cerr << "SDL_Init failed: " << SDL_GetError() << std::endl;
return 1; return 1;
} }
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
SDL_Window* win = SDL_CreateWindow("Space Ship Game", SDL_Window* win = SDL_CreateWindow("Space Ship Game",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
CONST_WIDTH, CONST_HEIGHT, CONST_WIDTH, CONST_HEIGHT,
SDL_WINDOW_OPENGL); SDL_WINDOW_OPENGL);
if (!win) { if (!win) {
std::cerr << "SDL_CreateWindow failed: " << SDL_GetError() << std::endl; std::cerr << "SDL_CreateWindow failed: " << SDL_GetError() << std::endl;
return 1; return 1;
} }
SDL_GLContext glContext = SDL_GL_CreateContext(win); SDL_GLContext glContext = SDL_GL_CreateContext(win);
if (!glContext) { if (!glContext) {
std::cerr << "SDL_GL_CreateContext failed: " << SDL_GetError() << std::endl; std::cerr << "SDL_GL_CreateContext failed: " << SDL_GetError() << std::endl;
return 1; return 1;
} }
// Привязка контекста к окну — важно! // Привязка контекста к окну — важно!
SDL_GL_MakeCurrent(win, glContext); SDL_GL_MakeCurrent(win, glContext);
ZL::Environment::window = win; ZL::Environment::window = win;
#else #else
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS) != 0) { if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS) != 0) {
SDL_Log("SDL init failed: %s", SDL_GetError()); SDL_Log("SDL init failed: %s", SDL_GetError());
return 1; return 1;
} }
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
ZL::Environment::window = SDL_CreateWindow( ZL::Environment::window = SDL_CreateWindow(
"Space Ship Game", "Space Ship Game",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
CONST_WIDTH, CONST_HEIGHT, CONST_WIDTH, CONST_HEIGHT,
SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN
); );
SDL_GLContext ctx = SDL_GL_CreateContext(ZL::Environment::window); SDL_GLContext ctx = SDL_GL_CreateContext(ZL::Environment::window);
SDL_GL_MakeCurrent(ZL::Environment::window, ctx); SDL_GL_MakeCurrent(ZL::Environment::window, ctx);
#endif #endif
game.setup(); game.setup();
#ifdef EMSCRIPTEN #ifdef EMSCRIPTEN
emscripten_set_main_loop(MainLoop, 0, 1); emscripten_set_main_loop(MainLoop, 0, 1);
#else #else
while (!game.shouldExit()) { while (!game.shouldExit()) {
game.update(); game.update();
SDL_Delay(2); SDL_Delay(2);
} }
#endif #endif
} }
catch (const std::exception& e) catch (const std::exception& e)
{ {
std::cout << e.what() << std::endl; std::cout << e.what() << std::endl;
} }
return 0; return 0;
} }

View File

@ -1,8 +1,8 @@
#pragma once #pragma once
#include "ZLMath.h" #include "utils/ZLMath.h"
#include "Perlin.h" #include "utils/Perlin.h"
#include "Renderer.h" // Äëÿ VertexDataStruct #include "render/Renderer.h"
#include <vector> #include <vector>
#include <array> #include <array>
#include <string> #include <string>

View File

@ -1,7 +1,7 @@
#include "PlanetObject.h" #include "PlanetObject.h"
#include <random> #include <random>
#include <cmath> #include <cmath>
#include "OpenGlExtensions.h" #include "render/OpenGlExtensions.h"
#include "Environment.h" #include "Environment.h"
#include "StoneObject.h" #include "StoneObject.h"

View File

@ -1,8 +1,8 @@
#pragma once #pragma once
#include "ZLMath.h" #include "utils/ZLMath.h"
#include "Renderer.h" #include "render/Renderer.h"
#include "TextureManager.h" #include "render/TextureManager.h"
#include <vector> #include <vector>
#include <chrono> #include <chrono>
#include <iostream> #include <iostream>
@ -13,10 +13,10 @@
#include <algorithm> #include <algorithm>
#include <map> #include <map>
#include <set> #include <set>
#include "Perlin.h" #include "utils/Perlin.h"
#include "PlanetData.h" #include "PlanetData.h"
#include "StoneObject.h" #include "StoneObject.h"
#include "FrameBuffer.h" #include "render/FrameBuffer.h"
namespace ZL { namespace ZL {

View File

@ -1,10 +1,10 @@
#include "StoneObject.h" #include "StoneObject.h"
#include "Utils.h" #include "utils/Utils.h"
#include <GL/gl.h> #include <GL/gl.h>
#include <random> #include <random>
#include <cmath> #include <cmath>
#include "Renderer.h" #include "render/Renderer.h"
#include "PlanetData.h" #include "PlanetData.h"
namespace ZL { namespace ZL {

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#include "ZLMath.h" #include "utils/ZLMath.h"
#include "Renderer.h" #include "render/Renderer.h"
#include "PlanetData.h" #include "PlanetData.h"
namespace ZL { namespace ZL {

670
OpenGlExtensions.cpp → src/render/OpenGlExtensions.cpp Executable file → Normal file
View File

@ -1,335 +1,335 @@
#include "OpenGlExtensions.h" #include "OpenGlExtensions.h"
#include "Utils.h" #include "utils/Utils.h"
#include <iostream> #include <iostream>
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
//==================================================== //====================================================
//===================== GLSL Shaders ================= //===================== GLSL Shaders =================
//==================================================== //====================================================
//Requires GL_VERSION_2_0 //Requires GL_VERSION_2_0
PFNGLCREATEPROGRAMPROC glCreateProgram = NULL; PFNGLCREATEPROGRAMPROC glCreateProgram = NULL;
PFNGLDELETEPROGRAMPROC glDeleteProgram = NULL; PFNGLDELETEPROGRAMPROC glDeleteProgram = NULL;
PFNGLLINKPROGRAMPROC glLinkProgram = NULL; PFNGLLINKPROGRAMPROC glLinkProgram = NULL;
PFNGLVALIDATEPROGRAMPROC glValidateProgram = NULL; PFNGLVALIDATEPROGRAMPROC glValidateProgram = NULL;
PFNGLUSEPROGRAMPROC glUseProgram = NULL; PFNGLUSEPROGRAMPROC glUseProgram = NULL;
PFNGLGETPROGRAMIVPROC glGetProgramiv = NULL; PFNGLGETPROGRAMIVPROC glGetProgramiv = NULL;
PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog = NULL; PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog = NULL;
PFNGLCREATESHADERPROC glCreateShader = NULL; PFNGLCREATESHADERPROC glCreateShader = NULL;
PFNGLDELETESHADERPROC glDeleteShader = NULL; PFNGLDELETESHADERPROC glDeleteShader = NULL;
PFNGLSHADERSOURCEPROC glShaderSource = NULL; PFNGLSHADERSOURCEPROC glShaderSource = NULL;
PFNGLCOMPILESHADERPROC glCompileShader = NULL; PFNGLCOMPILESHADERPROC glCompileShader = NULL;
PFNGLATTACHSHADERPROC glAttachShader = NULL; PFNGLATTACHSHADERPROC glAttachShader = NULL;
PFNGLDETACHSHADERPROC glDetachShader = NULL; PFNGLDETACHSHADERPROC glDetachShader = NULL;
PFNGLGETSHADERIVPROC glGetShaderiv = NULL; PFNGLGETSHADERIVPROC glGetShaderiv = NULL;
PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog = NULL; PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog = NULL;
PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation = NULL; PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation = NULL;
PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = NULL; PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = NULL;
PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray = NULL; PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray = NULL;
PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray = NULL; PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray = NULL;
PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = NULL; PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = NULL;
PFNGLUNIFORMMATRIX3FVPROC glUniformMatrix3fv = NULL; PFNGLUNIFORMMATRIX3FVPROC glUniformMatrix3fv = NULL;
PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv = NULL; PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv = NULL;
PFNGLUNIFORM1IPROC glUniform1i = NULL; PFNGLUNIFORM1IPROC glUniform1i = NULL;
PFNGLUNIFORM1FVPROC glUniform1fv = NULL; PFNGLUNIFORM1FVPROC glUniform1fv = NULL;
PFNGLUNIFORM3FVPROC glUniform2fv = NULL; PFNGLUNIFORM3FVPROC glUniform2fv = NULL;
PFNGLUNIFORM3FVPROC glUniform3fv = NULL; PFNGLUNIFORM3FVPROC glUniform3fv = NULL;
PFNGLUNIFORM4FVPROC glUniform4fv = NULL; PFNGLUNIFORM4FVPROC glUniform4fv = NULL;
PFNGLVERTEXATTRIB1FPROC glVertexAttrib1f = NULL; PFNGLVERTEXATTRIB1FPROC glVertexAttrib1f = NULL;
PFNGLVERTEXATTRIB2FPROC glVertexAttrib2f = NULL; PFNGLVERTEXATTRIB2FPROC glVertexAttrib2f = NULL;
PFNGLVERTEXATTRIB3FPROC glVertexAttrib3f = NULL; PFNGLVERTEXATTRIB3FPROC glVertexAttrib3f = NULL;
PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f = NULL; PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f = NULL;
PFNGLVERTEXATTRIB2FVPROC glVertexAttrib2fv = NULL; PFNGLVERTEXATTRIB2FVPROC glVertexAttrib2fv = NULL;
PFNGLVERTEXATTRIB3FVPROC glVertexAttrib3fv = NULL; PFNGLVERTEXATTRIB3FVPROC glVertexAttrib3fv = NULL;
PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv = NULL; PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv = NULL;
PFNGLGETACTIVEATTRIBPROC glGetActiveAttrib = NULL; PFNGLGETACTIVEATTRIBPROC glGetActiveAttrib = NULL;
PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform = NULL; PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform = NULL;
//======================================= //=======================================
//=========== Multitexture ============== //=========== Multitexture ==============
//======================================= //=======================================
//Requires GL version 1.3 //Requires GL version 1.3
PFNGLACTIVETEXTUREPROC glActiveTexture = NULL; PFNGLACTIVETEXTUREPROC glActiveTexture = NULL;
//======================================= //=======================================
//========== Vertex buffer ============== //========== Vertex buffer ==============
//======================================= //=======================================
//Requires GL_VERSION_1_5 //Requires GL_VERSION_1_5
PFNGLGENBUFFERSPROC glGenBuffers = NULL; PFNGLGENBUFFERSPROC glGenBuffers = NULL;
PFNGLDELETEBUFFERSPROC glDeleteBuffers = NULL; PFNGLDELETEBUFFERSPROC glDeleteBuffers = NULL;
PFNGLBINDBUFFERPROC glBindBuffer = NULL; PFNGLBINDBUFFERPROC glBindBuffer = NULL;
PFNGLBUFFERDATAPROC glBufferData = NULL; PFNGLBUFFERDATAPROC glBufferData = NULL;
PFNGLBUFFERSUBDATAPROC glBufferSubData = NULL; PFNGLBUFFERSUBDATAPROC glBufferSubData = NULL;
PFNGLMAPBUFFERPROC glMapBuffer = NULL; PFNGLMAPBUFFERPROC glMapBuffer = NULL;
PFNGLUNMAPBUFFERPROC glUnmapBuffer = NULL; PFNGLUNMAPBUFFERPROC glUnmapBuffer = NULL;
//========================================= //=========================================
//============ Frame buffer =============== //============ Frame buffer ===============
//========================================= //=========================================
//Requires GL_ARB_framebuffer_object //Requires GL_ARB_framebuffer_object
PFNGLISRENDERBUFFERPROC glIsRenderbuffer = NULL; PFNGLISRENDERBUFFERPROC glIsRenderbuffer = NULL;
PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer = NULL; PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer = NULL;
PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers = NULL; PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers = NULL;
PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers = NULL; PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers = NULL;
PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage = NULL; PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage = NULL;
PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv = NULL; PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv = NULL;
PFNGLISFRAMEBUFFERPROC glIsFramebuffer = NULL; PFNGLISFRAMEBUFFERPROC glIsFramebuffer = NULL;
PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer = NULL; PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer = NULL;
PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers = NULL; PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers = NULL;
PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers = NULL; PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers = NULL;
PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus = NULL; PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus = NULL;
PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D = NULL; PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D = NULL;
PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D = NULL; PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D = NULL;
PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D = NULL; PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D = NULL;
PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer = NULL; PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer = NULL;
PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv = NULL; PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv = NULL;
PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer = NULL; PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer = NULL;
PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample = NULL;
PFNGLGENERATEMIPMAPPROC glGenerateMipmap = NULL; PFNGLGENERATEMIPMAPPROC glGenerateMipmap = NULL;
PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer = NULL; PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer = NULL;
//=========================================== //===========================================
//============ Uniform buffer =============== //============ Uniform buffer ===============
//=========================================== //===========================================
//Requires GL_ARB_uniform_buffer_object //Requires GL_ARB_uniform_buffer_object
PFNGLGETUNIFORMINDICESPROC glGetUniformIndices = NULL; PFNGLGETUNIFORMINDICESPROC glGetUniformIndices = NULL;
PFNGLGETACTIVEUNIFORMSIVPROC glGetActiveUniformsiv = NULL; PFNGLGETACTIVEUNIFORMSIVPROC glGetActiveUniformsiv = NULL;
PFNGLGETACTIVEUNIFORMNAMEPROC glGetActiveUniformName = NULL; PFNGLGETACTIVEUNIFORMNAMEPROC glGetActiveUniformName = NULL;
PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex = NULL; PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex = NULL;
PFNGLGETACTIVEUNIFORMBLOCKIVPROC glGetActiveUniformBlockiv = NULL; PFNGLGETACTIVEUNIFORMBLOCKIVPROC glGetActiveUniformBlockiv = NULL;
PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glGetActiveUniformBlockName = NULL; PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glGetActiveUniformBlockName = NULL;
PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding = NULL; PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding = NULL;
PFNGLBINDBUFFERBASEPROC glBindBufferBase = NULL; PFNGLBINDBUFFERBASEPROC glBindBufferBase = NULL;
PFNGLGENVERTEXARRAYSPROC glGenVertexArrays = NULL; PFNGLGENVERTEXARRAYSPROC glGenVertexArrays = NULL;
PFNGLBINDVERTEXARRAYPROC glBindVertexArray = NULL; PFNGLBINDVERTEXARRAYPROC glBindVertexArray = NULL;
PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArray = NULL; PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArray = NULL;
#endif #endif
namespace ZL { namespace ZL {
bool BindOpenGlFunctions() bool BindOpenGlFunctions()
{ {
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
//char* extensionList = (char*)glGetString(GL_EXTENSIONS); //char* extensionList = (char*)glGetString(GL_EXTENSIONS);
char* glVersion = (char*)glGetString(GL_VERSION); char* glVersion = (char*)glGetString(GL_VERSION);
bool ok = true; bool ok = true;
//Requires OpenGL 2.0 or above //Requires OpenGL 2.0 or above
if (glVersion[0] >= '2') if (glVersion[0] >= '2')
{ {
glActiveTexture = (PFNGLACTIVETEXTUREPROC)wglGetProcAddress("glActiveTexture"); glActiveTexture = (PFNGLACTIVETEXTUREPROC)wglGetProcAddress("glActiveTexture");
glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers"); glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers");
glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)wglGetProcAddress("glDeleteBuffers"); glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)wglGetProcAddress("glDeleteBuffers");
glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer"); glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData"); glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");
glBufferSubData = (PFNGLBUFFERSUBDATAPROC)wglGetProcAddress("glBufferSubData"); glBufferSubData = (PFNGLBUFFERSUBDATAPROC)wglGetProcAddress("glBufferSubData");
glMapBuffer = (PFNGLMAPBUFFERPROC)wglGetProcAddress("glMapBuffer"); glMapBuffer = (PFNGLMAPBUFFERPROC)wglGetProcAddress("glMapBuffer");
glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)wglGetProcAddress("glUnmapBuffer"); glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)wglGetProcAddress("glUnmapBuffer");
glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram"); glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
glDeleteProgram = (PFNGLDELETEPROGRAMPROC)wglGetProcAddress("glDeleteProgram"); glDeleteProgram = (PFNGLDELETEPROGRAMPROC)wglGetProcAddress("glDeleteProgram");
glLinkProgram = (PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram"); glLinkProgram = (PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram");
glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)wglGetProcAddress("glValidateProgram"); glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)wglGetProcAddress("glValidateProgram");
glUseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram"); glUseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram");
glGetProgramiv = (PFNGLGETPROGRAMIVPROC)wglGetProcAddress("glGetProgramiv"); glGetProgramiv = (PFNGLGETPROGRAMIVPROC)wglGetProcAddress("glGetProgramiv");
glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)wglGetProcAddress("glGetProgramInfoLog"); glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)wglGetProcAddress("glGetProgramInfoLog");
glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader"); glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");
glDeleteShader = (PFNGLDELETESHADERPROC)wglGetProcAddress("glDeleteShader"); glDeleteShader = (PFNGLDELETESHADERPROC)wglGetProcAddress("glDeleteShader");
glShaderSource = (PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource"); glShaderSource = (PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource");
glCompileShader = (PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader"); glCompileShader = (PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader");
glAttachShader = (PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader"); glAttachShader = (PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader");
glDetachShader = (PFNGLDETACHSHADERPROC)wglGetProcAddress("glDetachShader"); glDetachShader = (PFNGLDETACHSHADERPROC)wglGetProcAddress("glDetachShader");
glGetShaderiv = (PFNGLGETSHADERIVPROC)wglGetProcAddress("glGetShaderiv"); glGetShaderiv = (PFNGLGETSHADERIVPROC)wglGetProcAddress("glGetShaderiv");
glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)wglGetProcAddress("glGetShaderInfoLog"); glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)wglGetProcAddress("glGetShaderInfoLog");
glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)wglGetProcAddress("glGetAttribLocation"); glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)wglGetProcAddress("glGetAttribLocation");
glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)wglGetProcAddress("glVertexAttribPointer"); glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)wglGetProcAddress("glVertexAttribPointer");
glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glEnableVertexAttribArray"); glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glEnableVertexAttribArray");
glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glDisableVertexAttribArray"); glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glDisableVertexAttribArray");
glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)wglGetProcAddress("glGetUniformLocation"); glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)wglGetProcAddress("glGetUniformLocation");
glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)wglGetProcAddress("glUniformMatrix3fv"); glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)wglGetProcAddress("glUniformMatrix3fv");
glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)wglGetProcAddress("glUniformMatrix4fv"); glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)wglGetProcAddress("glUniformMatrix4fv");
glUniform1i = (PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i"); glUniform1i = (PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i");
glUniform1fv = (PFNGLUNIFORM1FVPROC)wglGetProcAddress("glUniform1fv"); glUniform1fv = (PFNGLUNIFORM1FVPROC)wglGetProcAddress("glUniform1fv");
glUniform2fv = (PFNGLUNIFORM2FVPROC)wglGetProcAddress("glUniform2fv"); glUniform2fv = (PFNGLUNIFORM2FVPROC)wglGetProcAddress("glUniform2fv");
glUniform3fv = (PFNGLUNIFORM3FVPROC)wglGetProcAddress("glUniform3fv"); glUniform3fv = (PFNGLUNIFORM3FVPROC)wglGetProcAddress("glUniform3fv");
glUniform4fv = (PFNGLUNIFORM4FVPROC)wglGetProcAddress("glUniform4fv"); glUniform4fv = (PFNGLUNIFORM4FVPROC)wglGetProcAddress("glUniform4fv");
glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)wglGetProcAddress("glVertexAttrib1f"); glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)wglGetProcAddress("glVertexAttrib1f");
glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)wglGetProcAddress("glVertexAttrib2f"); glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)wglGetProcAddress("glVertexAttrib2f");
glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)wglGetProcAddress("glVertexAttrib3f"); glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)wglGetProcAddress("glVertexAttrib3f");
glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)wglGetProcAddress("glVertexAttrib4f"); glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)wglGetProcAddress("glVertexAttrib4f");
glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)wglGetProcAddress("glVertexAttrib2fv"); glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)wglGetProcAddress("glVertexAttrib2fv");
glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)wglGetProcAddress("glVertexAttrib3fv"); glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)wglGetProcAddress("glVertexAttrib3fv");
glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)wglGetProcAddress("glVertexAttrib4fv"); glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)wglGetProcAddress("glVertexAttrib4fv");
glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)wglGetProcAddress("glGetActiveAttrib"); glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)wglGetProcAddress("glGetActiveAttrib");
glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)wglGetProcAddress("glGetActiveUniform"); glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)wglGetProcAddress("glGetActiveUniform");
if (glActiveTexture == NULL || if (glActiveTexture == NULL ||
glGenBuffers == NULL || glGenBuffers == NULL ||
glDeleteBuffers == NULL || glDeleteBuffers == NULL ||
glBindBuffer == NULL || glBindBuffer == NULL ||
glBufferData == NULL || glBufferData == NULL ||
glBufferSubData == NULL || glBufferSubData == NULL ||
glMapBuffer == NULL || glMapBuffer == NULL ||
glCreateProgram == NULL || glCreateProgram == NULL ||
glDeleteProgram == NULL || glDeleteProgram == NULL ||
glLinkProgram == NULL || glLinkProgram == NULL ||
glValidateProgram == NULL || glValidateProgram == NULL ||
glUseProgram == NULL || glUseProgram == NULL ||
glGetProgramiv == NULL || glGetProgramiv == NULL ||
glGetProgramInfoLog == NULL || glGetProgramInfoLog == NULL ||
glCreateShader == NULL || glCreateShader == NULL ||
glDeleteShader == NULL || glDeleteShader == NULL ||
glShaderSource == NULL || glShaderSource == NULL ||
glCompileShader == NULL || glCompileShader == NULL ||
glAttachShader == NULL || glAttachShader == NULL ||
glDetachShader == NULL || glDetachShader == NULL ||
glGetShaderiv == NULL || glGetShaderiv == NULL ||
glGetShaderInfoLog == NULL || glGetShaderInfoLog == NULL ||
glGetAttribLocation == NULL || glGetAttribLocation == NULL ||
glVertexAttribPointer == NULL || glVertexAttribPointer == NULL ||
glEnableVertexAttribArray == NULL || glEnableVertexAttribArray == NULL ||
glDisableVertexAttribArray == NULL || glDisableVertexAttribArray == NULL ||
glGetUniformLocation == NULL || glGetUniformLocation == NULL ||
glUniformMatrix3fv == NULL || glUniformMatrix3fv == NULL ||
glUniformMatrix4fv == NULL || glUniformMatrix4fv == NULL ||
glUniform1i == NULL || glUniform1i == NULL ||
glUniform1fv == NULL || glUniform1fv == NULL ||
glUniform2fv == NULL || glUniform2fv == NULL ||
glUniform3fv == NULL || glUniform3fv == NULL ||
glUniform4fv == NULL || glUniform4fv == NULL ||
glEnableVertexAttribArray == NULL || glEnableVertexAttribArray == NULL ||
glVertexAttrib1f == NULL || glVertexAttrib1f == NULL ||
glVertexAttrib2f == NULL || glVertexAttrib2f == NULL ||
glVertexAttrib3f == NULL || glVertexAttrib3f == NULL ||
glVertexAttrib4f == NULL || glVertexAttrib4f == NULL ||
glVertexAttrib2fv == NULL || glVertexAttrib2fv == NULL ||
glVertexAttrib3fv == NULL || glVertexAttrib3fv == NULL ||
glVertexAttrib4fv == NULL || glVertexAttrib4fv == NULL ||
glGetActiveAttrib == NULL || glGetActiveAttrib == NULL ||
glGetActiveUniform == NULL) glGetActiveUniform == NULL)
{ {
ok = false; ok = false;
} }
} }
else else
{ {
ok = false; ok = false;
} }
glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)wglGetProcAddress("glIsRenderbuffer"); glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)wglGetProcAddress("glIsRenderbuffer");
glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)wglGetProcAddress("glBindRenderbuffer"); glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)wglGetProcAddress("glBindRenderbuffer");
glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)wglGetProcAddress("glDeleteRenderbuffers"); glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)wglGetProcAddress("glDeleteRenderbuffers");
glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)wglGetProcAddress("glGenRenderbuffers"); glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)wglGetProcAddress("glGenRenderbuffers");
glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)wglGetProcAddress("glRenderbufferStorage"); glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)wglGetProcAddress("glRenderbufferStorage");
glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)wglGetProcAddress("glGetRenderbufferParameteriv"); glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)wglGetProcAddress("glGetRenderbufferParameteriv");
glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)wglGetProcAddress("glIsFramebuffer"); glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)wglGetProcAddress("glIsFramebuffer");
glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)wglGetProcAddress("glBindFramebuffer"); glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)wglGetProcAddress("glBindFramebuffer");
glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)wglGetProcAddress("glDeleteFramebuffers"); glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)wglGetProcAddress("glDeleteFramebuffers");
glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)wglGetProcAddress("glGenFramebuffers"); glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)wglGetProcAddress("glGenFramebuffers");
glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)wglGetProcAddress("glCheckFramebufferStatus"); glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)wglGetProcAddress("glCheckFramebufferStatus");
glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)wglGetProcAddress("glFramebufferTexture1D"); glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)wglGetProcAddress("glFramebufferTexture1D");
glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)wglGetProcAddress("glFramebufferTexture2D"); glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)wglGetProcAddress("glFramebufferTexture2D");
glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)wglGetProcAddress("glFramebufferTexture3D"); glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)wglGetProcAddress("glFramebufferTexture3D");
glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)wglGetProcAddress("glFramebufferRenderbuffer"); glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)wglGetProcAddress("glFramebufferRenderbuffer");
glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)wglGetProcAddress("glGetFramebufferAttachmentParameteriv"); glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)wglGetProcAddress("glGetFramebufferAttachmentParameteriv");
glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)wglGetProcAddress("glBlitFramebuffer"); glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)wglGetProcAddress("glBlitFramebuffer");
glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)wglGetProcAddress("glRenderbufferStorageMultisample"); glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)wglGetProcAddress("glRenderbufferStorageMultisample");
glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)wglGetProcAddress("glGenerateMipmap"); glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)wglGetProcAddress("glGenerateMipmap");
glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)wglGetProcAddress("glFramebufferTextureLayer"); glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)wglGetProcAddress("glFramebufferTextureLayer");
if (glIsRenderbuffer == NULL || if (glIsRenderbuffer == NULL ||
glBindRenderbuffer == NULL || glBindRenderbuffer == NULL ||
glDeleteRenderbuffers == NULL || glDeleteRenderbuffers == NULL ||
glGenRenderbuffers == NULL || glGenRenderbuffers == NULL ||
glRenderbufferStorage == NULL || glRenderbufferStorage == NULL ||
glGetRenderbufferParameteriv == NULL || glGetRenderbufferParameteriv == NULL ||
glIsFramebuffer == NULL || glIsFramebuffer == NULL ||
glBindFramebuffer == NULL || glBindFramebuffer == NULL ||
glDeleteFramebuffers == NULL || glDeleteFramebuffers == NULL ||
glGenFramebuffers == NULL || glGenFramebuffers == NULL ||
glCheckFramebufferStatus == NULL || glCheckFramebufferStatus == NULL ||
glFramebufferTexture1D == NULL || glFramebufferTexture1D == NULL ||
glFramebufferTexture2D == NULL || glFramebufferTexture2D == NULL ||
glFramebufferTexture3D == NULL || glFramebufferTexture3D == NULL ||
glFramebufferRenderbuffer == NULL || glFramebufferRenderbuffer == NULL ||
glGetFramebufferAttachmentParameteriv == NULL || glGetFramebufferAttachmentParameteriv == NULL ||
glBlitFramebuffer == NULL || glBlitFramebuffer == NULL ||
glRenderbufferStorageMultisample == NULL || glRenderbufferStorageMultisample == NULL ||
glGenerateMipmap == NULL || glGenerateMipmap == NULL ||
glFramebufferTextureLayer == NULL) glFramebufferTextureLayer == NULL)
{ {
ok = false; ok = false;
} }
glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)wglGetProcAddress("glGetUniformIndices"); glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)wglGetProcAddress("glGetUniformIndices");
glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)wglGetProcAddress("glGetActiveUniformsiv"); glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)wglGetProcAddress("glGetActiveUniformsiv");
glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)wglGetProcAddress("glGetActiveUniformName"); glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)wglGetProcAddress("glGetActiveUniformName");
glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)wglGetProcAddress("glGetUniformBlockIndex"); glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)wglGetProcAddress("glGetUniformBlockIndex");
glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)wglGetProcAddress("glGetActiveUniformBlockiv"); glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)wglGetProcAddress("glGetActiveUniformBlockiv");
glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)wglGetProcAddress("glGetActiveUniformBlockName"); glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)wglGetProcAddress("glGetActiveUniformBlockName");
glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)wglGetProcAddress("glUniformBlockBinding"); glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)wglGetProcAddress("glUniformBlockBinding");
glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)wglGetProcAddress("glBindBufferBase"); glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)wglGetProcAddress("glBindBufferBase");
if (glGetUniformIndices == NULL || if (glGetUniformIndices == NULL ||
glGetActiveUniformsiv == NULL || glGetActiveUniformsiv == NULL ||
glGetActiveUniformName == NULL || glGetActiveUniformName == NULL ||
glGetUniformBlockIndex == NULL || glGetUniformBlockIndex == NULL ||
glGetActiveUniformBlockiv == NULL || glGetActiveUniformBlockiv == NULL ||
glGetActiveUniformBlockName == NULL || glGetActiveUniformBlockName == NULL ||
glUniformBlockBinding == NULL || glUniformBlockBinding == NULL ||
glBindBufferBase == NULL) glBindBufferBase == NULL)
{ {
ok = false; ok = false;
} }
glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)wglGetProcAddress("glGenVertexArrays"); glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)wglGetProcAddress("glGenVertexArrays");
glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)wglGetProcAddress("glBindVertexArray"); glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)wglGetProcAddress("glBindVertexArray");
glDeleteVertexArray = (PFNGLDELETEVERTEXARRAYSPROC)wglGetProcAddress("glBindVertexArray"); glDeleteVertexArray = (PFNGLDELETEVERTEXARRAYSPROC)wglGetProcAddress("glBindVertexArray");
if (glGenVertexArrays == NULL || if (glGenVertexArrays == NULL ||
glBindVertexArray == NULL || glBindVertexArray == NULL ||
glDeleteVertexArray == NULL) glDeleteVertexArray == NULL)
{ {
ok = false; ok = false;
} }
return ok; return ok;
#else #else
return true; return true;
#endif #endif
} }
void CheckGlError() void CheckGlError()
{ {
size_t error = glGetError(); size_t error = glGetError();
if (error != GL_NO_ERROR) if (error != GL_NO_ERROR)
{ {
throw std::runtime_error("Gl error"); throw std::runtime_error("Gl error");
} }
} }
} }

318
OpenGlExtensions.h → src/render/OpenGlExtensions.h Executable file → Normal file
View File

@ -1,160 +1,160 @@
#pragma once #pragma once
#include "SDL.h" #include "SDL.h"
#ifdef EMSCRIPTEN #ifdef EMSCRIPTEN
//#define GL_GLEXT_PROTOTYPES 1 //#define GL_GLEXT_PROTOTYPES 1
//#define EGL_EGLEXT_PROTOTYPES 1 //#define EGL_EGLEXT_PROTOTYPES 1
//#include <SDL2/SDL_opengl.h> //#include <SDL2/SDL_opengl.h>
#include <GLES3/gl3.h> #include <GLES3/gl3.h>
#include "emscripten.h" #include "emscripten.h"
#endif #endif
#ifdef __linux__ #ifdef __linux__
#include <GL/gl.h> #include <GL/gl.h>
#include <GL/glu.h> #include <GL/glu.h>
#include <GLES3/gl3.h> #include <GLES3/gl3.h>
#endif #endif
#include <exception> #include <exception>
#include <stdexcept> #include <stdexcept>
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
#include "windows.h" #include "windows.h"
#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp)) #define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp)) #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
//#define GL_GLEXT_PROTOTYPES //#define GL_GLEXT_PROTOTYPES
#include "gl/gl.h" #include "gl/gl.h"
#include "gl/glu.h" #include "gl/glu.h"
#include "gl/glext.h" #include "gl/glext.h"
#include <memory> #include <memory>
#include <vector> #include <vector>
#include <array> #include <array>
#include <stack> #include <stack>
#include <unordered_map> #include <unordered_map>
#include <map> #include <map>
#define _USE_MATH_DEFINES #define _USE_MATH_DEFINES
#include <math.h> #include <math.h>
//Requires GL_VERSION_2_0 //Requires GL_VERSION_2_0
extern PFNGLCREATEPROGRAMPROC glCreateProgram; extern PFNGLCREATEPROGRAMPROC glCreateProgram;
extern PFNGLDELETEPROGRAMPROC glDeleteProgram; extern PFNGLDELETEPROGRAMPROC glDeleteProgram;
extern PFNGLLINKPROGRAMPROC glLinkProgram; extern PFNGLLINKPROGRAMPROC glLinkProgram;
extern PFNGLVALIDATEPROGRAMPROC glValidateProgram; extern PFNGLVALIDATEPROGRAMPROC glValidateProgram;
extern PFNGLUSEPROGRAMPROC glUseProgram; extern PFNGLUSEPROGRAMPROC glUseProgram;
extern PFNGLGETPROGRAMIVPROC glGetProgramiv; extern PFNGLGETPROGRAMIVPROC glGetProgramiv;
extern PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog; extern PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog;
extern PFNGLCREATESHADERPROC glCreateShader; extern PFNGLCREATESHADERPROC glCreateShader;
extern PFNGLDELETESHADERPROC glDeleteShader; extern PFNGLDELETESHADERPROC glDeleteShader;
extern PFNGLSHADERSOURCEPROC glShaderSource; extern PFNGLSHADERSOURCEPROC glShaderSource;
extern PFNGLCOMPILESHADERPROC glCompileShader; extern PFNGLCOMPILESHADERPROC glCompileShader;
extern PFNGLATTACHSHADERPROC glAttachShader; extern PFNGLATTACHSHADERPROC glAttachShader;
extern PFNGLDETACHSHADERPROC glDetachShader; extern PFNGLDETACHSHADERPROC glDetachShader;
extern PFNGLGETSHADERIVPROC glGetShaderiv; extern PFNGLGETSHADERIVPROC glGetShaderiv;
extern PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog; extern PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog;
extern PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation; extern PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation;
extern PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer; extern PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
extern PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray; extern PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
extern PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray; extern PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray;
extern PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation; extern PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
extern PFNGLUNIFORMMATRIX3FVPROC glUniformMatrix3fv; extern PFNGLUNIFORMMATRIX3FVPROC glUniformMatrix3fv;
extern PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv; extern PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv;
extern PFNGLUNIFORM1IPROC glUniform1i; extern PFNGLUNIFORM1IPROC glUniform1i;
extern PFNGLUNIFORM1FVPROC glUniform1fv; extern PFNGLUNIFORM1FVPROC glUniform1fv;
extern PFNGLUNIFORM3FVPROC glUniform2fv; extern PFNGLUNIFORM3FVPROC glUniform2fv;
extern PFNGLUNIFORM3FVPROC glUniform3fv; extern PFNGLUNIFORM3FVPROC glUniform3fv;
extern PFNGLUNIFORM4FVPROC glUniform4fv; extern PFNGLUNIFORM4FVPROC glUniform4fv;
extern PFNGLVERTEXATTRIB1FPROC glVertexAttrib1f; extern PFNGLVERTEXATTRIB1FPROC glVertexAttrib1f;
extern PFNGLVERTEXATTRIB2FPROC glVertexAttrib2f; extern PFNGLVERTEXATTRIB2FPROC glVertexAttrib2f;
extern PFNGLVERTEXATTRIB3FPROC glVertexAttrib3f; extern PFNGLVERTEXATTRIB3FPROC glVertexAttrib3f;
extern PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f; extern PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f;
extern PFNGLVERTEXATTRIB2FVPROC glVertexAttrib2fv; extern PFNGLVERTEXATTRIB2FVPROC glVertexAttrib2fv;
extern PFNGLVERTEXATTRIB3FVPROC glVertexAttrib3fv; extern PFNGLVERTEXATTRIB3FVPROC glVertexAttrib3fv;
extern PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv; extern PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv;
extern PFNGLGETACTIVEATTRIBPROC glGetActiveAttrib; extern PFNGLGETACTIVEATTRIBPROC glGetActiveAttrib;
extern PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform; extern PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform;
//======================================= //=======================================
//=========== Multitexture ============== //=========== Multitexture ==============
//======================================= //=======================================
//Requires GL version 1.3 //Requires GL version 1.3
extern PFNGLACTIVETEXTUREPROC glActiveTexture; extern PFNGLACTIVETEXTUREPROC glActiveTexture;
//======================================= //=======================================
//========== Vertex buffer ============== //========== Vertex buffer ==============
//======================================= //=======================================
//Requires GL_VERSION_1_5 //Requires GL_VERSION_1_5
extern PFNGLGENBUFFERSPROC glGenBuffers; extern PFNGLGENBUFFERSPROC glGenBuffers;
extern PFNGLDELETEBUFFERSPROC glDeleteBuffers; extern PFNGLDELETEBUFFERSPROC glDeleteBuffers;
extern PFNGLBINDBUFFERPROC glBindBuffer; extern PFNGLBINDBUFFERPROC glBindBuffer;
extern PFNGLBUFFERDATAPROC glBufferData; extern PFNGLBUFFERDATAPROC glBufferData;
extern PFNGLBUFFERSUBDATAPROC glBufferSubData; extern PFNGLBUFFERSUBDATAPROC glBufferSubData;
extern PFNGLMAPBUFFERPROC glMapBuffer; extern PFNGLMAPBUFFERPROC glMapBuffer;
extern PFNGLUNMAPBUFFERPROC glUnmapBuffer; extern PFNGLUNMAPBUFFERPROC glUnmapBuffer;
//========================================= //=========================================
//============ Frame buffer =============== //============ Frame buffer ===============
//========================================= //=========================================
//Requires GL_ARB_framebuffer_object //Requires GL_ARB_framebuffer_object
extern PFNGLISRENDERBUFFERPROC glIsRenderbuffer; extern PFNGLISRENDERBUFFERPROC glIsRenderbuffer;
extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
extern PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers; extern PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
extern PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv; extern PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv;
extern PFNGLISFRAMEBUFFERPROC glIsFramebuffer; extern PFNGLISFRAMEBUFFERPROC glIsFramebuffer;
extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
extern PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D; extern PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D;
extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
extern PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D; extern PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D;
extern PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; extern PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv; extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv;
extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample; extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample;
extern PFNGLGENERATEMIPMAPPROC glGenerateMipmap; extern PFNGLGENERATEMIPMAPPROC glGenerateMipmap;
extern PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer; extern PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer;
//=========================================== //===========================================
//============ Uniform buffer =============== //============ Uniform buffer ===============
//=========================================== //===========================================
//Requires GL_ARB_uniform_buffer_object //Requires GL_ARB_uniform_buffer_object
extern PFNGLGETUNIFORMINDICESPROC glGetUniformIndices; extern PFNGLGETUNIFORMINDICESPROC glGetUniformIndices;
extern PFNGLGETACTIVEUNIFORMSIVPROC glGetActiveUniformsiv; extern PFNGLGETACTIVEUNIFORMSIVPROC glGetActiveUniformsiv;
extern PFNGLGETACTIVEUNIFORMNAMEPROC glGetActiveUniformName; extern PFNGLGETACTIVEUNIFORMNAMEPROC glGetActiveUniformName;
extern PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex; extern PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex;
extern PFNGLGETACTIVEUNIFORMBLOCKIVPROC glGetActiveUniformBlockiv; extern PFNGLGETACTIVEUNIFORMBLOCKIVPROC glGetActiveUniformBlockiv;
extern PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glGetActiveUniformBlockName; extern PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glGetActiveUniformBlockName;
extern PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding; extern PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding;
extern PFNGLBINDBUFFERBASEPROC glBindBufferBase; extern PFNGLBINDBUFFERBASEPROC glBindBufferBase;
extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays; extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
extern PFNGLBINDVERTEXARRAYPROC glBindVertexArray; extern PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
extern PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArray; extern PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArray;
#else #else
#endif #endif
namespace ZL { namespace ZL {
bool BindOpenGlFunctions(); bool BindOpenGlFunctions();
void CheckGlError(); void CheckGlError();
} }

1666
Renderer.cpp → src/render/Renderer.cpp Executable file → Normal file

File diff suppressed because it is too large Load Diff

286
Renderer.h → src/render/Renderer.h Executable file → Normal file
View File

@ -1,144 +1,144 @@
#pragma once #pragma once
#include "OpenGlExtensions.h" #include "OpenGlExtensions.h"
#include "ZLMath.h" #include "utils/ZLMath.h"
#include <exception> #include <exception>
#include <stdexcept> #include <stdexcept>
#include "ShaderManager.h" #include "ShaderManager.h"
namespace ZL { namespace ZL {
constexpr size_t CONST_MATRIX_STACK_SIZE = 64; constexpr size_t CONST_MATRIX_STACK_SIZE = 64;
class VBOHolder { class VBOHolder {
GLuint Buffer; GLuint Buffer;
public: public:
VBOHolder(); VBOHolder();
VBOHolder(const VBOHolder& v) = delete; VBOHolder(const VBOHolder& v) = delete;
VBOHolder& operator=(const VBOHolder& v) = delete; VBOHolder& operator=(const VBOHolder& v) = delete;
~VBOHolder(); ~VBOHolder();
GLuint getBuffer(); GLuint getBuffer();
}; };
class VAOHolder { class VAOHolder {
GLuint vao; GLuint vao;
public: public:
VAOHolder(); VAOHolder();
VAOHolder(const VAOHolder& v) = delete; VAOHolder(const VAOHolder& v) = delete;
VAOHolder& operator=(const VAOHolder& v) = delete; VAOHolder& operator=(const VAOHolder& v) = delete;
~VAOHolder(); ~VAOHolder();
GLuint getBuffer(); GLuint getBuffer();
}; };
struct VertexDataStruct struct VertexDataStruct
{ {
std::vector<Vector3f> PositionData; std::vector<Vector3f> PositionData;
std::vector<Vector2f> TexCoordData; std::vector<Vector2f> TexCoordData;
std::vector<Vector3f> NormalData; std::vector<Vector3f> NormalData;
std::vector<Vector3f> TangentData; std::vector<Vector3f> TangentData;
std::vector<Vector3f> BinormalData; std::vector<Vector3f> BinormalData;
std::vector<Vector3f> ColorData; std::vector<Vector3f> ColorData;
void RotateByMatrix(Matrix3f m); void RotateByMatrix(Matrix3f m);
void Scale(float scale); void Scale(float scale);
void Move(Vector3f diff); void Move(Vector3f diff);
void SwapZandY(); void SwapZandY();
}; };
struct VertexRenderStruct struct VertexRenderStruct
{ {
VertexDataStruct data; VertexDataStruct data;
std::shared_ptr<VAOHolder> vao; std::shared_ptr<VAOHolder> vao;
std::shared_ptr<VBOHolder> positionVBO; std::shared_ptr<VBOHolder> positionVBO;
std::shared_ptr<VBOHolder> texCoordVBO; std::shared_ptr<VBOHolder> texCoordVBO;
std::shared_ptr<VBOHolder> normalVBO; std::shared_ptr<VBOHolder> normalVBO;
std::shared_ptr<VBOHolder> tangentVBO; std::shared_ptr<VBOHolder> tangentVBO;
std::shared_ptr<VBOHolder> binormalVBO; std::shared_ptr<VBOHolder> binormalVBO;
std::shared_ptr<VBOHolder> colorVBO; std::shared_ptr<VBOHolder> colorVBO;
void RefreshVBO(); void RefreshVBO();
void AssignFrom(const VertexDataStruct& v); void AssignFrom(const VertexDataStruct& v);
}; };
VertexDataStruct CreateRect2D(Vector2f center, Vector2f halfWidthHeight, float zLevel); VertexDataStruct CreateRect2D(Vector2f center, Vector2f halfWidthHeight, float zLevel);
VertexDataStruct CreateRectHorizontalSections2D(Vector2f center, Vector2f halfWidthHeight, float zLevel, size_t sectionCount); VertexDataStruct CreateRectHorizontalSections2D(Vector2f center, Vector2f halfWidthHeight, float zLevel, size_t sectionCount);
VertexDataStruct CreateCube3D(float scale); VertexDataStruct CreateCube3D(float scale);
VertexDataStruct CreateCubemap(float scale = 1000.f); VertexDataStruct CreateCubemap(float scale = 1000.f);
class Renderer class Renderer
{ {
protected: protected:
std::stack<Matrix4f> ProjectionMatrixStack; std::stack<Matrix4f> ProjectionMatrixStack;
std::stack<Matrix4f> ModelviewMatrixStack; std::stack<Matrix4f> ModelviewMatrixStack;
Matrix4f ProjectionModelViewMatrix; Matrix4f ProjectionModelViewMatrix;
public: public:
ShaderManager shaderManager; ShaderManager shaderManager;
void InitOpenGL(); void InitOpenGL();
void PushProjectionMatrix(float width, float height, float zNear = 0.f, float zFar = 1.f); void PushProjectionMatrix(float width, float height, float zNear = 0.f, float zFar = 1.f);
void PushProjectionMatrix(float xmin, float xmax, float ymin, float ymax, float zNear, float zFar); void PushProjectionMatrix(float xmin, float xmax, float ymin, float ymax, float zNear, float zFar);
void PushPerspectiveProjectionMatrix(float fovY, float aspectRatio, float zNear, float zFar); void PushPerspectiveProjectionMatrix(float fovY, float aspectRatio, float zNear, float zFar);
void PopProjectionMatrix(); void PopProjectionMatrix();
void PushMatrix(); void PushMatrix();
void LoadIdentity(); void LoadIdentity();
void TranslateMatrix(const Vector3f& p); void TranslateMatrix(const Vector3f& p);
void ScaleMatrix(float scale); void ScaleMatrix(float scale);
void ScaleMatrix(const Vector3f& scale); void ScaleMatrix(const Vector3f& scale);
void RotateMatrix(const Vector4f& q); void RotateMatrix(const Vector4f& q);
void RotateMatrix(const Matrix3f& m3); void RotateMatrix(const Matrix3f& m3);
void PushSpecialMatrix(const Matrix4f& m); void PushSpecialMatrix(const Matrix4f& m);
void PopMatrix(); void PopMatrix();
Matrix4f GetProjectionModelViewMatrix(); Matrix4f GetProjectionModelViewMatrix();
Matrix4f GetCurrentModelViewMatrix(); Matrix4f GetCurrentModelViewMatrix();
void SetMatrix(); void SetMatrix();
void EnableVertexAttribArray(const std::string& attribName); void EnableVertexAttribArray(const std::string& attribName);
void DisableVertexAttribArray(const std::string& attribName); void DisableVertexAttribArray(const std::string& attribName);
void RenderUniformMatrix3fv(const std::string& uniformName, bool transpose, const float* value); void RenderUniformMatrix3fv(const std::string& uniformName, bool transpose, const float* value);
void RenderUniformMatrix4fv(const std::string& uniformName, bool transpose, const float* value); void RenderUniformMatrix4fv(const std::string& uniformName, bool transpose, const float* value);
void RenderUniform1i(const std::string& uniformName, const int value); void RenderUniform1i(const std::string& uniformName, const int value);
void RenderUniform3fv(const std::string& uniformName, const float* value); void RenderUniform3fv(const std::string& uniformName, const float* value);
void RenderUniform1f(const std::string& uniformName, float value); void RenderUniform1f(const std::string& uniformName, float value);
void VertexAttribPointer2fv(const std::string& attribName, int stride, const char* pointer); void VertexAttribPointer2fv(const std::string& attribName, int stride, const char* pointer);
void VertexAttribPointer3fv(const std::string& attribName, int stride, const char* pointer); void VertexAttribPointer3fv(const std::string& attribName, int stride, const char* pointer);
void DrawVertexRenderStruct(const VertexRenderStruct& VertexRenderStruct); void DrawVertexRenderStruct(const VertexRenderStruct& VertexRenderStruct);
}; };
void worldToScreenCoordinates(Vector3f objectPos, void worldToScreenCoordinates(Vector3f objectPos,
Matrix4f projectionModelView, Matrix4f projectionModelView,
int screenWidth, int screenHeight, int screenWidth, int screenHeight,
int& screenX, int& screenY); int& screenX, int& screenY);
}; };

428
ShaderManager.cpp → src/render/ShaderManager.cpp Executable file → Normal file
View File

@ -1,215 +1,215 @@
#include "ShaderManager.h" #include "ShaderManager.h"
#include <iostream> #include <iostream>
namespace ZL { namespace ZL {
ShaderResource::ShaderResource(const std::string& vertexCode, const std::string& fragmentCode) ShaderResource::ShaderResource(const std::string& vertexCode, const std::string& fragmentCode)
{ {
const int CONST_INFOLOG_LENGTH = 256; const int CONST_INFOLOG_LENGTH = 256;
char infoLog[CONST_INFOLOG_LENGTH]; char infoLog[CONST_INFOLOG_LENGTH];
int infoLogLength; int infoLogLength;
char infoLog2[CONST_INFOLOG_LENGTH]; char infoLog2[CONST_INFOLOG_LENGTH];
int infoLogLength2; int infoLogLength2;
int vertexShaderCompiled; int vertexShaderCompiled;
int fragmentShaderCompiled; int fragmentShaderCompiled;
int programLinked; int programLinked;
GLuint vertexShader; GLuint vertexShader;
GLuint fragmentShader; GLuint fragmentShader;
int vertexCodeLength = static_cast<int>(strlen(vertexCode.c_str())); int vertexCodeLength = static_cast<int>(strlen(vertexCode.c_str()));
int fragmentCodeLength = static_cast<int>(strlen(fragmentCode.c_str())); int fragmentCodeLength = static_cast<int>(strlen(fragmentCode.c_str()));
const char* vc = &vertexCode[0]; const char* vc = &vertexCode[0];
const char* fc = &fragmentCode[0]; const char* fc = &fragmentCode[0];
vertexShader = glCreateShader(GL_VERTEX_SHADER); vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &(vc), &vertexCodeLength); glShaderSource(vertexShader, 1, &(vc), &vertexCodeLength);
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &(fc), &fragmentCodeLength); glShaderSource(fragmentShader, 1, &(fc), &fragmentCodeLength);
glCompileShader(vertexShader); glCompileShader(vertexShader);
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &vertexShaderCompiled); glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &vertexShaderCompiled);
glGetShaderInfoLog(vertexShader, CONST_INFOLOG_LENGTH, &infoLogLength, infoLog); glGetShaderInfoLog(vertexShader, CONST_INFOLOG_LENGTH, &infoLogLength, infoLog);
glCompileShader(fragmentShader); glCompileShader(fragmentShader);
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &fragmentShaderCompiled); glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &fragmentShaderCompiled);
glGetShaderInfoLog(fragmentShader, CONST_INFOLOG_LENGTH, &infoLogLength2, infoLog2); glGetShaderInfoLog(fragmentShader, CONST_INFOLOG_LENGTH, &infoLogLength2, infoLog2);
if (!vertexShaderCompiled) if (!vertexShaderCompiled)
{ {
throw std::runtime_error("Failed to compile vertex shader code!"); throw std::runtime_error("Failed to compile vertex shader code!");
} }
if (!fragmentShaderCompiled) if (!fragmentShaderCompiled)
{ {
throw std::runtime_error("Failed to compile fragment shader code!"); throw std::runtime_error("Failed to compile fragment shader code!");
} }
shaderProgram = glCreateProgram(); shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader); glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram); glLinkProgram(shaderProgram);
glDeleteShader(vertexShader); glDeleteShader(vertexShader);
glDeleteShader(fragmentShader); glDeleteShader(fragmentShader);
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &programLinked); glGetProgramiv(shaderProgram, GL_LINK_STATUS, &programLinked);
glGetProgramInfoLog(shaderProgram, CONST_INFOLOG_LENGTH, &infoLogLength, infoLog); glGetProgramInfoLog(shaderProgram, CONST_INFOLOG_LENGTH, &infoLogLength, infoLog);
if (!programLinked) if (!programLinked)
{ {
shaderProgram = 0; shaderProgram = 0;
throw std::runtime_error("Failed to link shader program!"); throw std::runtime_error("Failed to link shader program!");
} }
int dummySize; //Dummy int dummySize; //Dummy
int dummyLen; //Dummy int dummyLen; //Dummy
GLenum dummyEnum; GLenum dummyEnum;
//================= Parsing all uniforms ================ //================= Parsing all uniforms ================
int activeUniforms; int activeUniforms;
const int CONST_UNIFORM_NAME_LENGTH = 256; const int CONST_UNIFORM_NAME_LENGTH = 256;
char uniformName[CONST_UNIFORM_NAME_LENGTH]; char uniformName[CONST_UNIFORM_NAME_LENGTH];
glGetProgramiv(shaderProgram, GL_ACTIVE_UNIFORMS, &activeUniforms); glGetProgramiv(shaderProgram, GL_ACTIVE_UNIFORMS, &activeUniforms);
for (int i = 0; i < activeUniforms; i++) for (int i = 0; i < activeUniforms; i++)
{ {
glGetActiveUniform(shaderProgram, i, CONST_UNIFORM_NAME_LENGTH, &dummyLen, &dummySize, &dummyEnum, uniformName); glGetActiveUniform(shaderProgram, i, CONST_UNIFORM_NAME_LENGTH, &dummyLen, &dummySize, &dummyEnum, uniformName);
uniformList[uniformName] = glGetUniformLocation(shaderProgram, uniformName); uniformList[uniformName] = glGetUniformLocation(shaderProgram, uniformName);
} }
//================= Parsing all attributes ================ //================= Parsing all attributes ================
int activeAttribs; int activeAttribs;
const int CONST_ATTRIB_NAME_LENGTH = 256; const int CONST_ATTRIB_NAME_LENGTH = 256;
char attribName[CONST_ATTRIB_NAME_LENGTH]; char attribName[CONST_ATTRIB_NAME_LENGTH];
glGetProgramiv(shaderProgram, GL_ACTIVE_ATTRIBUTES, &activeAttribs); glGetProgramiv(shaderProgram, GL_ACTIVE_ATTRIBUTES, &activeAttribs);
for (int i = 0; i < activeAttribs; i++) for (int i = 0; i < activeAttribs; i++)
{ {
glGetActiveAttrib(shaderProgram, i, CONST_ATTRIB_NAME_LENGTH, &dummyLen, &dummySize, &dummyEnum, attribName); glGetActiveAttrib(shaderProgram, i, CONST_ATTRIB_NAME_LENGTH, &dummyLen, &dummySize, &dummyEnum, attribName);
attribList[attribName] = glGetAttribLocation(shaderProgram, attribName); attribList[attribName] = glGetAttribLocation(shaderProgram, attribName);
} }
} }
ShaderResource::~ShaderResource() ShaderResource::~ShaderResource()
{ {
if (shaderProgram != 0) if (shaderProgram != 0)
{ {
glDeleteProgram(shaderProgram); glDeleteProgram(shaderProgram);
shaderProgram = 0; shaderProgram = 0;
} }
} }
GLuint ShaderResource::getShaderProgram() GLuint ShaderResource::getShaderProgram()
{ {
return shaderProgram; return shaderProgram;
} }
void ShaderManager::AddShaderFromFiles(const std::string& shaderName, const std::string& vertexShaderFileName, const std::string& fragmentShaderFileName, const std::string& ZIPFileName) void ShaderManager::AddShaderFromFiles(const std::string& shaderName, const std::string& vertexShaderFileName, const std::string& fragmentShaderFileName, const std::string& ZIPFileName)
{ {
std::string vertexShader; std::string vertexShader;
std::string fragmentShader; std::string fragmentShader;
if (!ZIPFileName.empty()){ if (!ZIPFileName.empty()){
std::vector<char> vertexShaderData; std::vector<char> vertexShaderData;
std::vector<char> fragmentShaderData; std::vector<char> fragmentShaderData;
vertexShaderData = readFileFromZIP(vertexShaderFileName, ZIPFileName); vertexShaderData = readFileFromZIP(vertexShaderFileName, ZIPFileName);
fragmentShaderData = readFileFromZIP(fragmentShaderFileName, ZIPFileName); fragmentShaderData = readFileFromZIP(fragmentShaderFileName, ZIPFileName);
vertexShader = std::string(vertexShaderData.begin(), vertexShaderData.end()); vertexShader = std::string(vertexShaderData.begin(), vertexShaderData.end());
fragmentShader = std::string(fragmentShaderData.begin(), fragmentShaderData.end()); fragmentShader = std::string(fragmentShaderData.begin(), fragmentShaderData.end());
}else{ }else{
vertexShader = readTextFile(vertexShaderFileName); vertexShader = readTextFile(vertexShaderFileName);
fragmentShader = readTextFile(fragmentShaderFileName); fragmentShader = readTextFile(fragmentShaderFileName);
} }
///std::cout << "Shader: "<< vertexShader << std::endl; ///std::cout << "Shader: "<< vertexShader << std::endl;
shaderResourceMap[shaderName] = std::make_shared<ShaderResource>(vertexShader, fragmentShader); shaderResourceMap[shaderName] = std::make_shared<ShaderResource>(vertexShader, fragmentShader);
} }
void ShaderManager::PushShader(const std::string& shaderName) void ShaderManager::PushShader(const std::string& shaderName)
{ {
if (shaderStack.size() >= CONST_MAX_SHADER_STACK_SIZE) if (shaderStack.size() >= CONST_MAX_SHADER_STACK_SIZE)
{ {
throw std::runtime_error("Shader stack overflow!"); throw std::runtime_error("Shader stack overflow!");
} }
if (shaderResourceMap.find(shaderName) == shaderResourceMap.end()) if (shaderResourceMap.find(shaderName) == shaderResourceMap.end())
{ {
throw std::runtime_error("Shader does not exist!"); throw std::runtime_error("Shader does not exist!");
} }
shaderStack.push(shaderName); shaderStack.push(shaderName);
glUseProgram(shaderResourceMap[shaderName]->getShaderProgram()); glUseProgram(shaderResourceMap[shaderName]->getShaderProgram());
} }
void ShaderManager::PopShader() void ShaderManager::PopShader()
{ {
if (shaderStack.size() == 0) if (shaderStack.size() == 0)
{ {
throw std::runtime_error("Shader stack underflow!"); throw std::runtime_error("Shader stack underflow!");
} }
shaderStack.pop(); shaderStack.pop();
if (shaderStack.size() == 0) if (shaderStack.size() == 0)
{ {
glUseProgram(0); glUseProgram(0);
} }
else else
{ {
glUseProgram(shaderResourceMap[shaderStack.top()]->getShaderProgram()); glUseProgram(shaderResourceMap[shaderStack.top()]->getShaderProgram());
} }
} }
std::shared_ptr<ShaderResource> ShaderManager::GetCurrentShader() std::shared_ptr<ShaderResource> ShaderManager::GetCurrentShader()
{ {
if (shaderStack.size() == 0) if (shaderStack.size() == 0)
{ {
throw std::runtime_error("Shader stack underflow!"); throw std::runtime_error("Shader stack underflow!");
} }
return shaderResourceMap[shaderStack.top()]; return shaderResourceMap[shaderStack.top()];
} }
ShaderSetter::ShaderSetter(ShaderManager& inShaderManager, const std::string& shaderName) ShaderSetter::ShaderSetter(ShaderManager& inShaderManager, const std::string& shaderName)
: shaderManager(shaderManager) : shaderManager(shaderManager)
{ {
shaderManager.PushShader(shaderName); shaderManager.PushShader(shaderName);
} }
ShaderSetter::~ShaderSetter() ShaderSetter::~ShaderSetter()
{ {
shaderManager.PopShader(); shaderManager.PopShader();
} }
} }

126
ShaderManager.h → src/render/ShaderManager.h Executable file → Normal file
View File

@ -1,64 +1,64 @@
#pragma once #pragma once
#include "OpenGlExtensions.h" #include "OpenGlExtensions.h"
#include "Utils.h" #include "utils/Utils.h"
namespace ZL { namespace ZL {
constexpr size_t CONST_MAX_SHADER_STACK_SIZE = 16; constexpr size_t CONST_MAX_SHADER_STACK_SIZE = 16;
class ShaderResource class ShaderResource
{ {
protected: protected:
GLuint shaderProgram; GLuint shaderProgram;
std::unordered_map<std::string, GLuint> uniformList; std::unordered_map<std::string, GLuint> uniformList;
//std::unordered_map<std::string, std::pair<bool, size_t>> UniformList; //std::unordered_map<std::string, std::pair<bool, size_t>> UniformList;
std::map<std::string, GLuint> attribList; std::map<std::string, GLuint> attribList;
public: public:
GLuint getShaderProgram(); GLuint getShaderProgram();
ShaderResource(const std::string& vertexCode, const std::string& fragmentCode); ShaderResource(const std::string& vertexCode, const std::string& fragmentCode);
~ShaderResource(); ~ShaderResource();
public: public:
friend class ShaderManager; friend class ShaderManager;
friend class Renderer; friend class Renderer;
}; };
class ShaderManager { class ShaderManager {
protected: protected:
std::unordered_map<std::string, std::shared_ptr<ShaderResource>> shaderResourceMap; std::unordered_map<std::string, std::shared_ptr<ShaderResource>> shaderResourceMap;
std::stack<std::string> shaderStack; std::stack<std::string> shaderStack;
public: public:
void AddShaderFromFiles(const std::string& shaderName, const std::string& vertexShaderFileName, const std::string& fragmentShaderFileName, const std::string& ZIPFileName = ""); void AddShaderFromFiles(const std::string& shaderName, const std::string& vertexShaderFileName, const std::string& fragmentShaderFileName, const std::string& ZIPFileName = "");
void PushShader(const std::string& shaderName); void PushShader(const std::string& shaderName);
void PopShader(); void PopShader();
std::shared_ptr<ShaderResource> GetCurrentShader(); std::shared_ptr<ShaderResource> GetCurrentShader();
}; };
class ShaderSetter class ShaderSetter
{ {
protected: protected:
ShaderManager& shaderManager; ShaderManager& shaderManager;
public: public:
ShaderSetter(ShaderManager& inShaderManager, const std::string& shaderName); ShaderSetter(ShaderManager& inShaderManager, const std::string& shaderName);
~ShaderSetter(); ~ShaderSetter();
}; };
} }

859
TextureManager.cpp → src/render/TextureManager.cpp Executable file → Normal file
View File

@ -1,430 +1,431 @@
#include "TextureManager.h" #include "render/TextureManager.h"
#ifdef PNG_ENABLED #include "render/OpenGlExtensions.h"
#include "png.h" #ifdef PNG_ENABLED
#endif #include "png.h"
#include <iostream> #endif
#include <iostream>
namespace ZL
{ namespace ZL
{
Texture::Texture(const TextureDataStruct& texData)
{ Texture::Texture(const TextureDataStruct& texData)
{
width = texData.width;
height = texData.height; width = texData.width;
height = texData.height;
glGenTextures(1, &texID);
glGenTextures(1, &texID);
if (texID == 0)
{ if (texID == 0)
throw std::runtime_error("glGenTextures did not work"); {
} throw std::runtime_error("glGenTextures did not work");
}
glBindTexture(GL_TEXTURE_2D, texID);
glBindTexture(GL_TEXTURE_2D, texID);
CheckGlError();
CheckGlError();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
CheckGlError();
CheckGlError();
//This should be only for Windows
//glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); //This should be only for Windows
//glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
CheckGlError();
CheckGlError();
if (texData.bitSize == TextureDataStruct::BS_24BIT)
{ if (texData.bitSize == TextureDataStruct::BS_24BIT)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, static_cast<GLsizei>(texData.width), static_cast<GLsizei>(texData.height), 0, GL_RGB, GL_UNSIGNED_BYTE, &texData.data[0]); {
} glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, static_cast<GLsizei>(texData.width), static_cast<GLsizei>(texData.height), 0, GL_RGB, GL_UNSIGNED_BYTE, &texData.data[0]);
else }
{ else
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, static_cast<GLsizei>(texData.width), static_cast<GLsizei>(texData.height), 0, GL_RGBA, GL_UNSIGNED_BYTE, &texData.data[0]); {
} glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, static_cast<GLsizei>(texData.width), static_cast<GLsizei>(texData.height), 0, GL_RGBA, GL_UNSIGNED_BYTE, &texData.data[0]);
}
CheckGlError();
CheckGlError();
}
}
Texture::Texture(const std::array<TextureDataStruct, 6>& texDataArray)
{ Texture::Texture(const std::array<TextureDataStruct, 6>& texDataArray)
// Ïðîâåðêà, ÷òî âñå ãðàíè èìåþò îäèíàêîâûå ðàçìåðû {
width = texDataArray[0].width; // Ïðîâåðêà, ÷òî âñå ãðàíè èìåþò îäèíàêîâûå ðàçìåðû
height = texDataArray[0].height; width = texDataArray[0].width;
height = texDataArray[0].height;
for (size_t i = 1; i < 6; ++i) {
if (texDataArray[i].width != width || texDataArray[i].height != height) { for (size_t i = 1; i < 6; ++i) {
throw std::runtime_error("Cubemap faces must have the same dimensions"); if (texDataArray[i].width != width || texDataArray[i].height != height) {
} throw std::runtime_error("Cubemap faces must have the same dimensions");
} }
}
glGenTextures(1, &texID);
glGenTextures(1, &texID);
if (texID == 0)
{ if (texID == 0)
throw std::runtime_error("glGenTextures did not work for cubemap"); {
} throw std::runtime_error("glGenTextures did not work for cubemap");
}
glBindTexture(GL_TEXTURE_CUBE_MAP, texID);
glBindTexture(GL_TEXTURE_CUBE_MAP, texID);
CheckGlError();
CheckGlError();
// Íàñòðîéêà ïàðàìåòðîâ äëÿ Cubemap
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Íàñòðîéêà ïàðàìåòðîâ äëÿ Cubemap
// Èñïîëüçóåì GL_LINEAR äëÿ MIN_FILTER, òàê êàê ìèïìàïû çäåñü íå ãåíåðèðóþòñÿ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// Åñëè áû èñïîëüçîâàëèñü ìèïìàïû (e.g., GL_LINEAR_MIPMAP_LINEAR), íóæíî áûëî áû âûçâàòü glGenerateMipmap. // Èñïîëüçóåì GL_LINEAR äëÿ MIN_FILTER, òàê êàê ìèïìàïû çäåñü íå ãåíåðèðóþòñÿ
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Åñëè áû èñïîëüçîâàëèñü ìèïìàïû (e.g., GL_LINEAR_MIPMAP_LINEAR), íóæíî áûëî áû âûçâàòü glGenerateMipmap.
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// Îáÿçàòåëüíûå ïàðàìåòðû îáåðòêè äëÿ Cubemap
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // Îáÿçàòåëüíûå ïàðàìåòðû îáåðòêè äëÿ Cubemap
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// GL_TEXTURE_WRAP_R íå ïîääåðæèâàåòñÿ â WebGL 1.0/OpenGL ES 2.0 è âûçûâàåò îøèáêó.
// Îãðàíè÷èâàåì åãî âûçîâ òîëüêî äëÿ íàñòîëüíûõ ïëàòôîðì. // GL_TEXTURE_WRAP_R íå ïîääåðæèâàåòñÿ â WebGL 1.0/OpenGL ES 2.0 è âûçûâàåò îøèáêó.
#ifndef EMSCRIPTEN // Îãðàíè÷èâàåì åãî âûçîâ òîëüêî äëÿ íàñòîëüíûõ ïëàòôîðì.
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); #ifndef EMSCRIPTEN
#endif glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
#endif
CheckGlError(); // Ïðîâåðêà ïîñëå óñòàíîâêè ïàðàìåòðîâ
CheckGlError(); // Ïðîâåðêà ïîñëå óñòàíîâêè ïàðàìåòðîâ
// Çàãðóçêà äàííûõ äëÿ êàæäîé èç 6 ãðàíåé
// GL_TEXTURE_CUBE_MAP_POSITIVE_X + i äàåò ãðàíè: +X (0), -X (1), +Y (2), -Y (3), +Z (4), -Z (5) // Çàãðóçêà äàííûõ äëÿ êàæäîé èç 6 ãðàíåé
for (int i = 0; i < 6; ++i) // GL_TEXTURE_CUBE_MAP_POSITIVE_X + i äàåò ãðàíè: +X (0), -X (1), +Y (2), -Y (3), +Z (4), -Z (5)
{ for (int i = 0; i < 6; ++i)
GLint internalFormat; {
GLenum format; GLint internalFormat;
GLenum format;
// Â WebGL 1.0/OpenGL ES 2.0 âíóòðåííèé ôîðìàò (internalFormat)
// äîëæåí ñòðîãî ñîîòâåòñòâîâàòü ôîðìàòó äàííûõ (format). // Â WebGL 1.0/OpenGL ES 2.0 âíóòðåííèé ôîðìàò (internalFormat)
if (texDataArray[i].bitSize == TextureDataStruct::BS_24BIT) // äîëæåí ñòðîãî ñîîòâåòñòâîâàòü ôîðìàòó äàííûõ (format).
{ if (texDataArray[i].bitSize == TextureDataStruct::BS_24BIT)
internalFormat = GL_RGB; // internalFormat {
format = GL_RGB; // format internalFormat = GL_RGB; // internalFormat
} format = GL_RGB; // format
else // BS_32BIT }
{ else // BS_32BIT
internalFormat = GL_RGBA; // internalFormat {
format = GL_RGBA; // format internalFormat = GL_RGBA; // internalFormat
} format = GL_RGBA; // format
}
glTexImage2D(
GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, // Öåëåâàÿ ãðàíü glTexImage2D(
0, // Óðîâåíü MIP-òåêñòóðû GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, // Öåëåâàÿ ãðàíü
internalFormat, // Âíóòðåííèé ôîðìàò (äîëæåí ñîâïàäàòü ñ ôîðìàòîì) 0, // Óðîâåíü MIP-òåêñòóðû
static_cast<GLsizei>(width), internalFormat, // Âíóòðåííèé ôîðìàò (äîëæåí ñîâïàäàòü ñ ôîðìàòîì)
static_cast<GLsizei>(height), static_cast<GLsizei>(width),
0, // Ãðàíèöà (âñåãäà 0) static_cast<GLsizei>(height),
format, // Ôîðìàò èñõîäíûõ äàííûõ 0, // Ãðàíèöà (âñåãäà 0)
GL_UNSIGNED_BYTE, // Òèï äàííûõ format, // Ôîðìàò èñõîäíûõ äàííûõ
texDataArray[i].data.data() // Óêàçàòåëü íà äàííûå GL_UNSIGNED_BYTE, // Òèï äàííûõ
); texDataArray[i].data.data() // Óêàçàòåëü íà äàííûå
CheckGlError(); );
} CheckGlError();
}
// Ñíèìàåì ïðèâÿçêó äëÿ ÷èñòîòû
glBindTexture(GL_TEXTURE_CUBE_MAP, 0); // Ñíèìàåì ïðèâÿçêó äëÿ ÷èñòîòû
} glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
}
Texture::~Texture()
{ Texture::~Texture()
glDeleteTextures(1, &texID); {
texID = 0; glDeleteTextures(1, &texID);
} texID = 0;
}
GLuint Texture::getTexID()
{ GLuint Texture::getTexID()
return texID; {
} return texID;
}
size_t Texture::getWidth()
{ size_t Texture::getWidth()
return width; {
} return width;
}
size_t Texture::getHeight()
{ size_t Texture::getHeight()
return height; {
} return height;
}
TextureDataStruct CreateTextureDataFromBmp24(const std::string& fullFileName, const std::string& ZIPFileName)
{ TextureDataStruct CreateTextureDataFromBmp24(const std::string& fullFileName, const std::string& ZIPFileName)
{
TextureDataStruct texData;
std::vector<char> fileArr; TextureDataStruct texData;
std::vector<char> fileArr;
fileArr = !ZIPFileName.empty() ? readFileFromZIP(fullFileName, ZIPFileName) : readFile(fullFileName);
fileArr = !ZIPFileName.empty() ? readFileFromZIP(fullFileName, ZIPFileName) : readFile(fullFileName);
size_t fileSize = fileArr.size();
size_t fileSize = fileArr.size();
if (fileSize < 22)
{ if (fileSize < 22)
throw std::runtime_error("File is too short or not correct!"); {
} throw std::runtime_error("File is too short or not correct!");
}
//This refers to BITMAPV5HEADER
texData.width = *reinterpret_cast<uint32_t*>(&fileArr[18]); //This refers to BITMAPV5HEADER
texData.height = *reinterpret_cast<uint32_t*>(&fileArr[22]); texData.width = *reinterpret_cast<uint32_t*>(&fileArr[18]);
texData.height = *reinterpret_cast<uint32_t*>(&fileArr[22]);
texData.bitSize = TextureDataStruct::BS_24BIT;
texData.bitSize = TextureDataStruct::BS_24BIT;
size_t dataSize = texData.width * texData.height * 3;
size_t dataSize = texData.width * texData.height * 3;
texData.data.resize(dataSize);
texData.data.resize(dataSize);
size_t pos = *reinterpret_cast<uint32_t*>(&fileArr[10]);
size_t x = 0; size_t pos = *reinterpret_cast<uint32_t*>(&fileArr[10]);
size_t x = 0;
for (size_t i = 0; i < texData.width; i++)
for (size_t j = 0; j < texData.height; j++) for (size_t i = 0; i < texData.width; i++)
{ for (size_t j = 0; j < texData.height; j++)
{
if (pos + 3 > fileSize)
{ if (pos + 3 > fileSize)
throw std::runtime_error("File is too short!"); {
} throw std::runtime_error("File is too short!");
}
x = (i * texData.height + j) + (i * texData.height + j) + (i * texData.height + j);
x = (i * texData.height + j) + (i * texData.height + j) + (i * texData.height + j);
texData.data[x + 2] = fileArr[pos++];
texData.data[x + 1] = fileArr[pos++]; texData.data[x + 2] = fileArr[pos++];
texData.data[x + 0] = fileArr[pos++]; texData.data[x + 1] = fileArr[pos++];
texData.data[x + 0] = fileArr[pos++];
}
}
return texData;
} return texData;
}
TextureDataStruct CreateTextureDataFromBmp32(const std::string& fullFileName, const std::string& ZIPFileName)
{ TextureDataStruct CreateTextureDataFromBmp32(const std::string& fullFileName, const std::string& ZIPFileName)
{
TextureDataStruct texData;
std::vector<char> fileArr; TextureDataStruct texData;
std::vector<char> fileArr;
fileArr = !ZIPFileName.empty() ? readFileFromZIP(fullFileName, ZIPFileName) : readFile(fullFileName);
fileArr = !ZIPFileName.empty() ? readFileFromZIP(fullFileName, ZIPFileName) : readFile(fullFileName);
size_t fileSize = fileArr.size();
size_t fileSize = fileArr.size();
if (fileSize < 22)
{ if (fileSize < 22)
throw std::runtime_error("File is too short or not correct!"); {
} throw std::runtime_error("File is too short or not correct!");
}
//This refers to BITMAPV5HEADER
texData.width = *reinterpret_cast<uint32_t*>(&fileArr[18]); //This refers to BITMAPV5HEADER
texData.height = *reinterpret_cast<uint32_t*>(&fileArr[22]); texData.width = *reinterpret_cast<uint32_t*>(&fileArr[18]);
texData.height = *reinterpret_cast<uint32_t*>(&fileArr[22]);
texData.bitSize = TextureDataStruct::BS_32BIT;
texData.bitSize = TextureDataStruct::BS_32BIT;
size_t dataSize = texData.width * texData.height * 4;
size_t dataSize = texData.width * texData.height * 4;
texData.data.resize(dataSize);
texData.data.resize(dataSize);
size_t pos = *reinterpret_cast<uint32_t*>(&fileArr[10]);
size_t x = 0; size_t pos = *reinterpret_cast<uint32_t*>(&fileArr[10]);
size_t x = 0;
for (size_t i = 0; i < texData.width; i++)
for (size_t j = 0; j < texData.height; j++) for (size_t i = 0; i < texData.width; i++)
{ for (size_t j = 0; j < texData.height; j++)
{
if (pos + 4 > fileSize)
{ if (pos + 4 > fileSize)
throw std::runtime_error("File is too short!"); {
} throw std::runtime_error("File is too short!");
}
x = (i * texData.height + j) + (i * texData.height + j) + (i * texData.height + j) + (i * texData.height + j);
x = (i * texData.height + j) + (i * texData.height + j) + (i * texData.height + j) + (i * texData.height + j);
texData.data[x + 2] = fileArr[pos++];
texData.data[x + 1] = fileArr[pos++]; texData.data[x + 2] = fileArr[pos++];
texData.data[x + 0] = fileArr[pos++]; texData.data[x + 1] = fileArr[pos++];
texData.data[x + 3] = fileArr[pos++]; texData.data[x + 0] = fileArr[pos++];
texData.data[x + 3] = fileArr[pos++];
}
}
return texData;
} return texData;
}
#ifdef PNG_ENABLED
#ifdef PNG_ENABLED
// Ñòðóêòóðà äëÿ õðàíåíèÿ äàííûõ î ôàéëå/ìàññèâå è òåêóùåé ïîçèöèè ÷òåíèÿ
struct png_data_t { // Ñòðóêòóðà äëÿ õðàíåíèÿ äàííûõ î ôàéëå/ìàññèâå è òåêóùåé ïîçèöèè ÷òåíèÿ
const char* data; struct png_data_t {
size_t size; const char* data;
size_t offset; size_t size;
}; size_t offset;
};
// Ïîëüçîâàòåëüñêàÿ ôóíêöèÿ ÷òåíèÿ äëÿ libpng
// 'png_ptr' - óêàçàòåëü íà ñòðóêòóðó png // Ïîëüçîâàòåëüñêàÿ ôóíêöèÿ ÷òåíèÿ äëÿ libpng
// 'out_ptr' - êóäà çàïèñûâàòü ïðî÷èòàííûå äàííûå // 'png_ptr' - óêàçàòåëü íà ñòðóêòóðó png
// 'bytes_to_read' - ñêîëüêî áàéò íóæíî ïðî÷èòàòü // 'out_ptr' - êóäà çàïèñûâàòü ïðî÷èòàííûå äàííûå
void user_read_data(png_structp png_ptr, png_bytep out_ptr, png_size_t bytes_to_read) { // 'bytes_to_read' - ñêîëüêî áàéò íóæíî ïðî÷èòàòü
// Ïîëó÷àåì óêàçàòåëü íà íàøó ñòðóêòóðó png_data_t, êîòîðóþ ìû óñòàíîâèëè ñ ïîìîùüþ png_set_read_fn void user_read_data(png_structp png_ptr, png_bytep out_ptr, png_size_t bytes_to_read) {
png_data_t* data = (png_data_t*)png_get_io_ptr(png_ptr); // Ïîëó÷àåì óêàçàòåëü íà íàøó ñòðóêòóðó png_data_t, êîòîðóþ ìû óñòàíîâèëè ñ ïîìîùüþ png_set_read_fn
png_data_t* data = (png_data_t*)png_get_io_ptr(png_ptr);
if (data->offset + bytes_to_read > data->size) {
// Ïîïûòêà ïðî÷èòàòü áîëüøå, ÷åì åñòü â ìàññèâå. if (data->offset + bytes_to_read > data->size) {
// Âìåñòî âûçîâà ñòàíäàðòíîé îøèáêè, ìû ìîæåì ïðîñòî ïðî÷èòàòü îñòàòîê èëè âûçâàòü îøèáêó. // Ïîïûòêà ïðî÷èòàòü áîëüøå, ÷åì åñòü â ìàññèâå.
//  ýòîì ñëó÷àå ìû âûçîâåì îøèáêó libpng. // Âìåñòî âûçîâà ñòàíäàðòíîé îøèáêè, ìû ìîæåì ïðîñòî ïðî÷èòàòü îñòàòîê èëè âûçâàòü îøèáêó.
png_error(png_ptr, "PNG Read Error: Attempted to read past end of data buffer."); //  ýòîì ñëó÷àå ìû âûçîâåì îøèáêó libpng.
bytes_to_read = data->size - data->offset; // Óñòàíàâëèâàåì, ÷òîáû ïðî÷èòàòü îñòàâøååñÿ png_error(png_ptr, "PNG Read Error: Attempted to read past end of data buffer.");
} bytes_to_read = data->size - data->offset; // Óñòàíàâëèâàåì, ÷òîáû ïðî÷èòàòü îñòàâøååñÿ
}
// Êîïèðóåì äàííûå èç íàøåãî ìàññèâà â áóôåð libpng
std::memcpy(out_ptr, data->data + data->offset, bytes_to_read); // Êîïèðóåì äàííûå èç íàøåãî ìàññèâà â áóôåð libpng
std::memcpy(out_ptr, data->data + data->offset, bytes_to_read);
// Îáíîâëÿåì ñìåùåíèå
data->offset += bytes_to_read; // Îáíîâëÿåì ñìåùåíèå
} data->offset += bytes_to_read;
}
// Ïîëüçîâàòåëüñêàÿ ôóíêöèÿ ïðåäóïðåæäåíèé (ïî æåëàíèþ, ìîæíî èñïîëüçîâàòü nullptr)
void user_warning_fn(png_structp png_ptr, png_const_charp warning_msg) { // Ïîëüçîâàòåëüñêàÿ ôóíêöèÿ ïðåäóïðåæäåíèé (ïî æåëàíèþ, ìîæíî èñïîëüçîâàòü nullptr)
// Çäåñü ìîæíî ðåàëèçîâàòü ëîãèðîâàíèå ïðåäóïðåæäåíèé void user_warning_fn(png_structp png_ptr, png_const_charp warning_msg) {
//throw std::runtime_error(); // Çäåñü ìîæíî ðåàëèçîâàòü ëîãèðîâàíèå ïðåäóïðåæäåíèé
std::cout << "PNG Warning: " << warning_msg << std::endl; //throw std::runtime_error();
} std::cout << "PNG Warning: " << warning_msg << std::endl;
}
// Ïîëüçîâàòåëüñêàÿ ôóíêöèÿ îøèáîê (îáÿçàòåëüíà äëÿ setjmp)
void user_error_fn(png_structp png_ptr, png_const_charp error_msg) { // Ïîëüçîâàòåëüñêàÿ ôóíêöèÿ îøèáîê (îáÿçàòåëüíà äëÿ setjmp)
// Çäåñü ìîæíî ðåàëèçîâàòü ëîãèðîâàíèå îøèáîê void user_error_fn(png_structp png_ptr, png_const_charp error_msg) {
std::cout << "PNG Error: " << error_msg << std::endl; // Çäåñü ìîæíî ðåàëèçîâàòü ëîãèðîâàíèå îøèáîê
// Îáÿçàòåëüíî âûçûâàåì longjmp äëÿ âûõîäà èç ïðîöåññà ÷òåíèÿ/çàïèñè PNG std::cout << "PNG Error: " << error_msg << std::endl;
longjmp(png_jmpbuf(png_ptr), 1); // Îáÿçàòåëüíî âûçûâàåì longjmp äëÿ âûõîäà èç ïðîöåññà ÷òåíèÿ/çàïèñè PNG
} longjmp(png_jmpbuf(png_ptr), 1);
}
TextureDataStruct CreateTextureDataFromPng(const std::vector<char>& fileArr)
{ TextureDataStruct CreateTextureDataFromPng(const std::vector<char>& fileArr)
TextureDataStruct texData; {
TextureDataStruct texData;
// Ñòðóêòóðà äëÿ óïðàâëåíèÿ ÷òåíèåì èç ìàññèâà
png_data_t png_data = { fileArr.data(), fileArr.size(), 0 }; // Ñòðóêòóðà äëÿ óïðàâëåíèÿ ÷òåíèåì èç ìàññèâà
png_data_t png_data = { fileArr.data(), fileArr.size(), 0 };
png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
if (!png) { png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
throw std::runtime_error("Could not create PNG read structure"); if (!png) {
} throw std::runtime_error("Could not create PNG read structure");
}
png_infop info = png_create_info_struct(png);
if (!info) { png_infop info = png_create_info_struct(png);
png_destroy_read_struct(&png, nullptr, nullptr); if (!info) {
throw std::runtime_error("Could not create PNG info structure"); png_destroy_read_struct(&png, nullptr, nullptr);
} throw std::runtime_error("Could not create PNG info structure");
}
// === Óñòàíîâêà ïîëüçîâàòåëüñêèõ ôóíêöèé ÷òåíèÿ è îáðàáîòêè îøèáîê ===
// 1. Óñòàíîâêà îáðàáîò÷èêà îøèáîê è longjmp // === Óñòàíîâêà ïîëüçîâàòåëüñêèõ ôóíêöèé ÷òåíèÿ è îáðàáîòêè îøèáîê ===
if (setjmp(png_jmpbuf(png))) { // 1. Óñòàíîâêà îáðàáîò÷èêà îøèáîê è longjmp
png_destroy_read_struct(&png, &info, nullptr); if (setjmp(png_jmpbuf(png))) {
throw std::runtime_error("Error during PNG read (longjmp was executed)"); png_destroy_read_struct(&png, &info, nullptr);
} throw std::runtime_error("Error during PNG read (longjmp was executed)");
}
// 2. Óñòàíîâêà ïîëüçîâàòåëüñêèõ ôóíêöèé äëÿ îáðàáîòêè îøèáîê è ïðåäóïðåæäåíèé
// Âìåñòî nullptr â error_ptr è warning_ptr ìîæíî ïåðåäàòü óêàçàòåëü íà ñâîþ ñòðóêòóðó äàííûõ, åñëè íåîáõîäèìî // 2. Óñòàíîâêà ïîëüçîâàòåëüñêèõ ôóíêöèé äëÿ îáðàáîòêè îøèáîê è ïðåäóïðåæäåíèé
png_set_error_fn(png, nullptr, user_error_fn, user_warning_fn); // Âìåñòî nullptr â error_ptr è warning_ptr ìîæíî ïåðåäàòü óêàçàòåëü íà ñâîþ ñòðóêòóðó äàííûõ, åñëè íåîáõîäèìî
png_set_error_fn(png, nullptr, user_error_fn, user_warning_fn);
// 3. Óñòàíîâêà ïîëüçîâàòåëüñêîé ôóíêöèè ÷òåíèÿ è ïåðåäà÷à åé íàøåé ñòðóêòóðû png_data
png_set_read_fn(png, &png_data, user_read_data); // 3. Óñòàíîâêà ïîëüçîâàòåëüñêîé ôóíêöèè ÷òåíèÿ è ïåðåäà÷à åé íàøåé ñòðóêòóðû png_data
// =================================================================== png_set_read_fn(png, &png_data, user_read_data);
// ===================================================================
png_read_info(png, info);
png_read_info(png, info);
texData.width = png_get_image_width(png, info);
texData.height = png_get_image_height(png, info); texData.width = png_get_image_width(png, info);
png_byte color_type = png_get_color_type(png, info); texData.height = png_get_image_height(png, info);
png_byte bit_depth = png_get_bit_depth(png, info); png_byte color_type = png_get_color_type(png, info);
png_byte bit_depth = png_get_bit_depth(png, info);
// === Áëîê ïðåîáðàçîâàíèé (îñòàâëåí áåç èçìåíåíèé) ===
if (bit_depth == 16) // === Áëîê ïðåîáðàçîâàíèé (îñòàâëåí áåç èçìåíåíèé) ===
png_set_strip_16(png); if (bit_depth == 16)
png_set_strip_16(png);
if (color_type == PNG_COLOR_TYPE_PALETTE)
png_set_palette_to_rgb(png); if (color_type == PNG_COLOR_TYPE_PALETTE)
png_set_palette_to_rgb(png);
if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
png_set_expand_gray_1_2_4_to_8(png); if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
png_set_expand_gray_1_2_4_to_8(png);
if (png_get_valid(png, info, PNG_INFO_tRNS))
png_set_tRNS_to_alpha(png); if (png_get_valid(png, info, PNG_INFO_tRNS))
png_set_tRNS_to_alpha(png);
if (color_type == PNG_COLOR_TYPE_RGB ||
color_type == PNG_COLOR_TYPE_GRAY || if (color_type == PNG_COLOR_TYPE_RGB ||
color_type == PNG_COLOR_TYPE_PALETTE) color_type == PNG_COLOR_TYPE_GRAY ||
png_set_filler(png, 0xFF, PNG_FILLER_AFTER); color_type == PNG_COLOR_TYPE_PALETTE)
png_set_filler(png, 0xFF, PNG_FILLER_AFTER);
if (color_type == PNG_COLOR_TYPE_GRAY ||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA) if (color_type == PNG_COLOR_TYPE_GRAY ||
png_set_gray_to_rgb(png); color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
png_set_gray_to_rgb(png);
png_read_update_info(png, info);
// ==================================================== png_read_update_info(png, info);
// ====================================================
// === ×òåíèå ïèêñåëåé (îñòàâëåí áåç èçìåíåíèé) ===
png_bytep* row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * texData.height); // === ×òåíèå ïèêñåëåé (îñòàâëåí áåç èçìåíåíèé) ===
for (int y = 0; y < texData.height; y++) { png_bytep* row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * texData.height);
row_pointers[y] = (png_byte*)malloc(png_get_rowbytes(png, info)); for (int y = 0; y < texData.height; y++) {
} row_pointers[y] = (png_byte*)malloc(png_get_rowbytes(png, info));
}
png_read_image(png, row_pointers);
png_read_image(png, row_pointers);
bool has_alpha = (color_type & PNG_COLOR_MASK_ALPHA) || (png_get_valid(png, info, PNG_INFO_tRNS));
bool has_alpha = (color_type & PNG_COLOR_MASK_ALPHA) || (png_get_valid(png, info, PNG_INFO_tRNS));
size_t dataSize;
size_t dataSize;
if (has_alpha)
{ if (has_alpha)
texData.bitSize = TextureDataStruct::BS_32BIT; {
} texData.bitSize = TextureDataStruct::BS_32BIT;
else }
{ else
texData.bitSize = TextureDataStruct::BS_24BIT; {
} texData.bitSize = TextureDataStruct::BS_24BIT;
}
int channels = has_alpha ? 4 : 3;
int channels = has_alpha ? 4 : 3;
dataSize = texData.width * texData.height * channels;
texData.data.resize(dataSize); dataSize = texData.width * texData.height * channels;
texData.data.resize(dataSize);
for (int y = texData.height - 1; y >= 0; y--) {
png_bytep row = row_pointers[texData.height - 1 - y]; for (int y = texData.height - 1; y >= 0; y--) {
for (int x = 0; x < texData.width; x++) { png_bytep row = row_pointers[texData.height - 1 - y];
png_bytep px = &(row[x * 4]); for (int x = 0; x < texData.width; x++) {
texData.data[(y * texData.width + x) * channels + 0] = px[0]; // R png_bytep px = &(row[x * 4]);
texData.data[(y * texData.width + x) * channels + 1] = px[1]; // G texData.data[(y * texData.width + x) * channels + 0] = px[0]; // R
texData.data[(y * texData.width + x) * channels + 2] = px[2]; // B texData.data[(y * texData.width + x) * channels + 1] = px[1]; // G
if (has_alpha) { texData.data[(y * texData.width + x) * channels + 2] = px[2]; // B
texData.data[(y * texData.width + x) * channels + 3] = px[3]; // A if (has_alpha) {
} texData.data[(y * texData.width + x) * channels + 3] = px[3]; // A
} }
free(row_pointers[texData.height - 1 - y]); }
} free(row_pointers[texData.height - 1 - y]);
free(row_pointers); }
// ================================================== free(row_pointers);
// ==================================================
png_destroy_read_struct(&png, &info, nullptr);
png_destroy_read_struct(&png, &info, nullptr);
return texData;
} return texData;
}
TextureDataStruct CreateTextureDataFromPng(const std::string& fullFileName, const std::string& ZIPFileName)
{ TextureDataStruct CreateTextureDataFromPng(const std::string& fullFileName, const std::string& ZIPFileName)
std::vector<char> fileArr; {
std::vector<char> fileArr;
fileArr = !ZIPFileName.empty() ? readFileFromZIP(fullFileName, ZIPFileName) : readFile(fullFileName);
fileArr = !ZIPFileName.empty() ? readFileFromZIP(fullFileName, ZIPFileName) : readFile(fullFileName);
if (fileArr.empty()) {
throw std::runtime_error("Could not read file data into memory"); if (fileArr.empty()) {
} throw std::runtime_error("Could not read file data into memory");
}
// Âûçûâàåì íîâóþ ôóíêöèþ, êîòîðàÿ ðàáîòàåò ñ ìàññèâîì áàéò
return CreateTextureDataFromPng(fileArr); // Âûçûâàåì íîâóþ ôóíêöèþ, êîòîðàÿ ðàáîòàåò ñ ìàññèâîì áàéò
} return CreateTextureDataFromPng(fileArr);
}
#endif
#endif
} }

112
TextureManager.h → src/render/TextureManager.h Executable file → Normal file
View File

@ -1,56 +1,56 @@
#pragma once #pragma once
#include "OpenGlExtensions.h" #include "OpenGlExtensions.h"
#include "Utils.h" #include "utils/Utils.h"
#ifdef EMSCRIPTEN #ifdef EMSCRIPTEN
#define PNG_ENABLED #define PNG_ENABLED
#endif #endif
namespace ZL namespace ZL
{ {
struct TextureDataStruct struct TextureDataStruct
{ {
size_t width; size_t width;
size_t height; size_t height;
std::vector<char> data; std::vector<char> data;
enum BitSize { enum BitSize {
BS_24BIT, BS_24BIT,
BS_32BIT BS_32BIT
}; };
BitSize bitSize; BitSize bitSize;
}; };
class Texture class Texture
{ {
size_t width = 0; size_t width = 0;
size_t height = 0; size_t height = 0;
GLuint texID = 0; GLuint texID = 0;
public: public:
Texture(const TextureDataStruct& texData); Texture(const TextureDataStruct& texData);
//Cubemap texture: //Cubemap texture:
Texture(const std::array<TextureDataStruct, 6>& texDataArray); Texture(const std::array<TextureDataStruct, 6>& texDataArray);
~Texture(); ~Texture();
GLuint getTexID(); GLuint getTexID();
size_t getWidth(); size_t getWidth();
size_t getHeight(); size_t getHeight();
}; };
TextureDataStruct CreateTextureDataFromBmp24(const std::string& fullFileName, const std::string& ZIPFileName=""); TextureDataStruct CreateTextureDataFromBmp24(const std::string& fullFileName, const std::string& ZIPFileName="");
TextureDataStruct CreateTextureDataFromBmp32(const std::string& fullFileName, const std::string& ZIPFileName=""); TextureDataStruct CreateTextureDataFromBmp32(const std::string& fullFileName, const std::string& ZIPFileName="");
#ifdef PNG_ENABLED #ifdef PNG_ENABLED
TextureDataStruct CreateTextureDataFromPng(const std::string& fullFileName, const std::string& ZIPFileName = ""); TextureDataStruct CreateTextureDataFromPng(const std::string& fullFileName, const std::string& ZIPFileName = "");
#endif #endif
} }

View File

@ -2,7 +2,7 @@
#include <vector> #include <vector>
#include <cstdint> #include <cstdint>
#include "ZLMath.h" #include "utils/ZLMath.h"
namespace ZL { namespace ZL {

210
Utils.cpp → src/utils/Utils.cpp Executable file → Normal file
View File

@ -1,105 +1,105 @@
#include "Utils.h" #include "utils/Utils.h"
#include <cstring> #include <cstring>
#include <iterator> #include <iterator>
#include <vector> #include <vector>
#include <iostream> #include <iostream>
#include <algorithm> #include <algorithm>
#include <fstream> #include <fstream>
#ifdef EMSCRIPTEN #ifdef EMSCRIPTEN
#include <zip.h> #include <zip.h>
#endif #endif
namespace ZL namespace ZL
{ {
std::string readTextFile(const std::string& filename) std::string readTextFile(const std::string& filename)
{ {
std::ifstream f(filename); std::ifstream f(filename);
std::string str((std::istreambuf_iterator<char>(f)), std::istreambuf_iterator<char>()); std::string str((std::istreambuf_iterator<char>(f)), std::istreambuf_iterator<char>());
return str; return str;
} }
std::vector<char> readFile(const std::string& filename) std::vector<char> readFile(const std::string& filename)
{ {
std::ifstream file(filename, std::ios::binary); std::ifstream file(filename, std::ios::binary);
file.unsetf(std::ios::skipws); file.unsetf(std::ios::skipws);
std::streampos fileSize; std::streampos fileSize;
file.seekg(0, std::ios::end); file.seekg(0, std::ios::end);
fileSize = file.tellg(); fileSize = file.tellg();
file.seekg(0, std::ios::beg); file.seekg(0, std::ios::beg);
std::vector<char> vec; std::vector<char> vec;
vec.reserve(fileSize); vec.reserve(fileSize);
vec.insert(vec.begin(), vec.insert(vec.begin(),
std::istream_iterator<char>(file), std::istream_iterator<char>(file),
std::istream_iterator<char>()); std::istream_iterator<char>());
return vec; return vec;
} }
std::vector<char> readFileFromZIP(const std::string& filename, const std::string& zipfilename) { std::vector<char> readFileFromZIP(const std::string& filename, const std::string& zipfilename) {
#ifdef EMSCRIPTEN #ifdef EMSCRIPTEN
const std::string zipPath = zipfilename; const std::string zipPath = zipfilename;
int zipErr; int zipErr;
zip_t* archive = zip_open(zipPath.c_str(), ZIP_RDONLY, &zipErr); zip_t* archive = zip_open(zipPath.c_str(), ZIP_RDONLY, &zipErr);
if (!archive) { if (!archive) {
throw std::runtime_error("Ошибка открытия ZIP: " + zipPath); throw std::runtime_error("Ошибка открытия ZIP: " + zipPath);
} }
std::string cleanFilename = filename; std::string cleanFilename = filename;
if (cleanFilename.rfind("./", 0) == 0) { if (cleanFilename.rfind("./", 0) == 0) {
cleanFilename = cleanFilename.substr(2); cleanFilename = cleanFilename.substr(2);
} }
std::cout << "Ищем в ZIP: " << cleanFilename << std::endl; std::cout << "Ищем в ZIP: " << cleanFilename << std::endl;
zip_file_t* zipFile = zip_fopen(archive, cleanFilename.c_str(), 0); zip_file_t* zipFile = zip_fopen(archive, cleanFilename.c_str(), 0);
if (!zipFile) { if (!zipFile) {
zip_close(archive); zip_close(archive);
throw std::runtime_error("Файл не найден в ZIP: " + cleanFilename); throw std::runtime_error("Файл не найден в ZIP: " + cleanFilename);
} }
zip_stat_t fileStat; zip_stat_t fileStat;
if (zip_stat(archive, cleanFilename.c_str(), 0, &fileStat) != 0) { if (zip_stat(archive, cleanFilename.c_str(), 0, &fileStat) != 0) {
zip_fclose(zipFile); zip_fclose(zipFile);
zip_close(archive); zip_close(archive);
throw std::runtime_error("Ошибка чтения ZIP-статистики."); throw std::runtime_error("Ошибка чтения ZIP-статистики.");
} }
std::vector<char> fileData; std::vector<char> fileData;
fileData.resize(fileStat.size); fileData.resize(fileStat.size);
zip_fread(zipFile, fileData.data(), fileData.size()); zip_fread(zipFile, fileData.data(), fileData.size());
zip_fclose(zipFile); zip_fclose(zipFile);
zip_close(archive); zip_close(archive);
return fileData; return fileData;
#else #else
return {}; return {};
#endif #endif
} }
bool findString(const char* in, char* list) bool findString(const char* in, char* list)
{ {
size_t thisLength = strlen(in); size_t thisLength = strlen(in);
while (*list != 0) while (*list != 0)
{ {
size_t length = strcspn(list, " "); size_t length = strcspn(list, " ");
if (thisLength == length) if (thisLength == length)
if (!strncmp(in, list, length)) if (!strncmp(in, list, length))
return true; return true;
list += length; list += length;
list += 1; list += 1;
} }
return false; return false;
} }
}; };

38
Utils.h → src/utils/Utils.h Executable file → Normal file
View File

@ -1,20 +1,20 @@
#pragma once #pragma once
#include <string> #include <string>
#include <vector> #include <vector>
#include <exception> #include <exception>
#include <map> #include <map>
#include <stack> #include <stack>
#include <memory> #include <memory>
#include <unordered_map> #include <unordered_map>
namespace ZL namespace ZL
{ {
std::string readTextFile(const std::string& filename); std::string readTextFile(const std::string& filename);
std::vector<char> readFile(const std::string& filename); std::vector<char> readFile(const std::string& filename);
std::vector<char> readFileFromZIP(const std::string& filename, const std::string& zipfilename); std::vector<char> readFileFromZIP(const std::string& filename, const std::string& zipfilename);
bool findString(const char* in, char* list); bool findString(const char* in, char* list);
} }

View File

@ -1,4 +1,4 @@
#include "ZLMath.h" #include "utils/ZLMath.h"
#include <exception> #include <exception>
#include <cmath> #include <cmath>

358
ZLMath.h → src/utils/ZLMath.h Executable file → Normal file
View File

@ -1,179 +1,179 @@
#pragma once #pragma once
#include <array> #include <array>
#include <exception> #include <exception>
#include <stdexcept> #include <stdexcept>
#include <cmath> #include <cmath>
namespace ZL { namespace ZL {
struct Vector4f struct Vector4f
{ {
std::array<float, 4> v = { 0.f, 0.f, 0.f, 0.f }; std::array<float, 4> v = { 0.f, 0.f, 0.f, 0.f };
Vector4f normalized() const { Vector4f normalized() const {
double norm = std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3]); double norm = std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3]);
if (norm <= 0.000001f) { if (norm <= 0.000001f) {
return { 0,0, 0, 0}; return { 0,0, 0, 0};
} }
Vector4f r; Vector4f r;
r.v[0] = v[0] / norm; r.v[0] = v[0] / norm;
r.v[1] = v[1] / norm; r.v[1] = v[1] / norm;
r.v[2] = v[2] / norm; r.v[2] = v[2] / norm;
r.v[3] = v[3] / norm; r.v[3] = v[3] / norm;
return r; return r;
} }
double dot(const Vector4f& other) const { double dot(const Vector4f& other) const {
return v[0] * other.v[0] + v[1] * other.v[1] + v[2] * other.v[2] + v[3] * other.v[3]; return v[0] * other.v[0] + v[1] * other.v[1] + v[2] * other.v[2] + v[3] * other.v[3];
} }
}; };
struct Vector3f struct Vector3f
{ {
std::array<float, 3> v = { 0.f, 0.f, 0.f }; std::array<float, 3> v = { 0.f, 0.f, 0.f };
Vector3f() Vector3f()
{ {
} }
Vector3f(float x, float y, float z) Vector3f(float x, float y, float z)
: v{x,y,z} : v{x,y,z}
{ {
} }
Vector3f normalized() const { Vector3f normalized() const {
double norm = std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); double norm = std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
if (norm <= 0.000001f) { if (norm <= 0.000001f) {
return { 0,0,0 }; return { 0,0,0 };
} }
Vector3f r; Vector3f r;
r.v[0] = v[0] / norm; r.v[0] = v[0] / norm;
r.v[1] = v[1] / norm; r.v[1] = v[1] / norm;
r.v[2] = v[2] / norm; r.v[2] = v[2] / norm;
return r; return r;
} }
float squaredNorm() const { float squaredNorm() const {
return v[0] * v[0] + v[1] * v[1] + v[2] * v[2]; return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
} }
float length() const float length() const
{ {
return sqrt(squaredNorm()); return sqrt(squaredNorm());
} }
float dot(const Vector3f& other) const { float dot(const Vector3f& other) const {
return v[0] * other.v[0] + v[1] * other.v[1] + v[2] * other.v[2]; return v[0] * other.v[0] + v[1] * other.v[1] + v[2] * other.v[2];
} }
Vector3f cross(const Vector3f& other) const { Vector3f cross(const Vector3f& other) const {
return Vector3f( return Vector3f(
v[1] * other.v[2] - v[2] * other.v[1], v[1] * other.v[2] - v[2] * other.v[1],
v[2] * other.v[0] - v[0] * other.v[2], v[2] * other.v[0] - v[0] * other.v[2],
v[0] * other.v[1] - v[1] * other.v[0] v[0] * other.v[1] - v[1] * other.v[0]
); );
} }
bool operator<(const Vector3f& other) const { bool operator<(const Vector3f& other) const {
if (v[0] != other.v[0]) return v[0] < other.v[0]; if (v[0] != other.v[0]) return v[0] < other.v[0];
if (v[1] != other.v[1]) return v[1] < other.v[1]; if (v[1] != other.v[1]) return v[1] < other.v[1];
return v[2] < other.v[2]; return v[2] < other.v[2];
} }
}; };
struct Vector2f struct Vector2f
{ {
std::array<float, 2> v = {0.f, 0.f}; std::array<float, 2> v = {0.f, 0.f};
Vector2f() Vector2f()
{ {
} }
Vector2f(float x, float y) Vector2f(float x, float y)
: v{ x,y } : v{ x,y }
{ {
} }
}; };
Vector2f operator+(const Vector2f& x, const Vector2f& y); Vector2f operator+(const Vector2f& x, const Vector2f& y);
Vector2f operator-(const Vector2f& x, const Vector2f& y); Vector2f operator-(const Vector2f& x, const Vector2f& y);
Vector3f operator+(const Vector3f& x, const Vector3f& y); Vector3f operator+(const Vector3f& x, const Vector3f& y);
Vector3f operator-(const Vector3f& x, const Vector3f& y); Vector3f operator-(const Vector3f& x, const Vector3f& y);
Vector4f operator+(const Vector4f& x, const Vector4f& y); Vector4f operator+(const Vector4f& x, const Vector4f& y);
Vector4f operator-(const Vector4f& x, const Vector4f& y); Vector4f operator-(const Vector4f& x, const Vector4f& y);
Vector3f operator-(const Vector3f& x); Vector3f operator-(const Vector3f& x);
struct Matrix3f struct Matrix3f
{ {
std::array<float, 9> m = { 0.f, 0.f, 0.f, std::array<float, 9> m = { 0.f, 0.f, 0.f,
0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
0.f, 0.f, 0.f, }; 0.f, 0.f, 0.f, };
static Matrix3f Identity(); static Matrix3f Identity();
}; };
struct Matrix4f struct Matrix4f
{ {
std::array<float, 16> m = { 0.f, 0.f, 0.f, 0.f, std::array<float, 16> m = { 0.f, 0.f, 0.f, 0.f,
0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
0.f, 0.f, 0.f, 0.f }; 0.f, 0.f, 0.f, 0.f };
static Matrix4f Identity(); static Matrix4f Identity();
float& operator()(int row, int col) { float& operator()(int row, int col) {
//return m[row * 4 + col]; //OpenGL specific //return m[row * 4 + col]; //OpenGL specific
return m[col * 4 + row]; return m[col * 4 + row];
} }
const float& operator()(int row, int col) const { const float& operator()(int row, int col) const {
//return m[row * 4 + col]; //return m[row * 4 + col];
return m[col * 4 + row]; return m[col * 4 + row];
} }
}; };
Matrix4f operator*(const Matrix4f& m1, const Matrix4f& m2); Matrix4f operator*(const Matrix4f& m1, const Matrix4f& m2);
Matrix4f MakeOrthoMatrix(float width, float height, float zNear, float zFar); Matrix4f MakeOrthoMatrix(float width, float height, float zNear, float zFar);
Matrix4f MakeOrthoMatrix(float xmin, float xmax, float ymin, float ymax, float zNear, float zFar); Matrix4f MakeOrthoMatrix(float xmin, float xmax, float ymin, float ymax, float zNear, float zFar);
Matrix4f MakePerspectiveMatrix(float fovY, float aspectRatio, float zNear, float zFar); Matrix4f MakePerspectiveMatrix(float fovY, float aspectRatio, float zNear, float zFar);
Matrix3f QuatToMatrix(const Vector4f& q); Matrix3f QuatToMatrix(const Vector4f& q);
Vector4f MatrixToQuat(const Matrix3f& m); Vector4f MatrixToQuat(const Matrix3f& m);
Vector4f QuatFromRotateAroundX(float angle); Vector4f QuatFromRotateAroundX(float angle);
Vector4f QuatFromRotateAroundY(float angle); Vector4f QuatFromRotateAroundY(float angle);
Vector4f QuatFromRotateAroundZ(float angle); Vector4f QuatFromRotateAroundZ(float angle);
Vector2f operator*(Vector2f v, float scale); Vector2f operator*(Vector2f v, float scale);
Vector3f operator*(Vector3f v, float scale); Vector3f operator*(Vector3f v, float scale);
Vector4f operator*(Vector4f v, float scale); Vector4f operator*(Vector4f v, float scale);
Vector3f MultVectorMatrix(Vector3f v, Matrix3f mt); Vector3f MultVectorMatrix(Vector3f v, Matrix3f mt);
Vector4f MultVectorMatrix(Vector4f v, Matrix4f mt); Vector4f MultVectorMatrix(Vector4f v, Matrix4f mt);
Vector4f MultMatrixVector(Matrix4f mt, Vector4f v); Vector4f MultMatrixVector(Matrix4f mt, Vector4f v);
Vector3f MultMatrixVector(Matrix3f mt, Vector3f v); Vector3f MultMatrixVector(Matrix3f mt, Vector3f v);
Vector4f slerp(const Vector4f& q1, const Vector4f& q2, float t); Vector4f slerp(const Vector4f& q1, const Vector4f& q2, float t);
Matrix3f InverseMatrix(const Matrix3f& m); Matrix3f InverseMatrix(const Matrix3f& m);
Matrix4f InverseMatrix(const Matrix4f& m); Matrix4f InverseMatrix(const Matrix4f& m);
Matrix3f MultMatrixMatrix(const Matrix3f& m1, const Matrix3f& m2); Matrix3f MultMatrixMatrix(const Matrix3f& m1, const Matrix3f& m2);
Matrix4f MultMatrixMatrix(const Matrix4f& m1, const Matrix4f& m2); Matrix4f MultMatrixMatrix(const Matrix4f& m1, const Matrix4f& m2);
Matrix4f MakeMatrix4x4(const Matrix3f& m, const Vector3f pos); Matrix4f MakeMatrix4x4(const Matrix3f& m, const Vector3f pos);
}; };