Minor refactoring
This commit is contained in:
parent
0a5a3b653d
commit
592e008914
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
@ -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>
|
||||||
|
|
||||||
|
|
||||||
@ -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 {
|
||||||
@ -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
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
217
Game.h → src/Game.h
Executable file → Normal 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
|
||||||
@ -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 {
|
||||||
@ -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>
|
||||||
@ -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>
|
||||||
@ -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>
|
||||||
|
|
||||||
|
|
||||||
@ -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>
|
||||||
@ -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
0
gl/glext.h → src/gl/glext.h
Executable file → Normal file
176
main.cpp → src/main.cpp
Executable file → Normal file
176
main.cpp → src/main.cpp
Executable file → Normal 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;
|
||||||
}
|
}
|
||||||
@ -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>
|
||||||
@ -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"
|
||||||
|
|
||||||
@ -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 {
|
||||||
|
|
||||||
@ -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 {
|
||||||
@ -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
670
OpenGlExtensions.cpp → src/render/OpenGlExtensions.cpp
Executable file → Normal 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
318
OpenGlExtensions.h → src/render/OpenGlExtensions.h
Executable file → Normal 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
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
286
Renderer.h → src/render/Renderer.h
Executable file → Normal 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
428
ShaderManager.cpp → src/render/ShaderManager.cpp
Executable file → Normal 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
126
ShaderManager.h → src/render/ShaderManager.h
Executable file → Normal 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
859
TextureManager.cpp → src/render/TextureManager.cpp
Executable file → Normal 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
112
TextureManager.h → src/render/TextureManager.h
Executable file → Normal 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
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -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
210
Utils.cpp → src/utils/Utils.cpp
Executable file → Normal 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
38
Utils.h → src/utils/Utils.h
Executable file → Normal 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);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -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
358
ZLMath.h → src/utils/ZLMath.h
Executable file → Normal 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);
|
||||||
|
|
||||||
};
|
};
|
||||||
Loading…
Reference in New Issue
Block a user