mirror of
https://github.com/Almamu/linux-wallpaperengine.git
synced 2025-09-14 13:56:48 +08:00
+ added an extra render pass to render the scene upside down (so it looks fine)
Signed-off-by: Alexis Maiquez <almamu@almamu.com>
This commit is contained in:
parent
16ed2f30de
commit
2ffb5f1b24
6
main.cpp
6
main.cpp
@ -231,10 +231,6 @@ int main (int argc, char* argv[])
|
|||||||
// TODO: FIGURE OUT THE REQUIRED INPUT MODE, AS SOME WALLPAPERS USE THINGS LIKE MOUSE POSITION
|
// TODO: FIGURE OUT THE REQUIRED INPUT MODE, AS SOME WALLPAPERS USE THINGS LIKE MOUSE POSITION
|
||||||
// glfwSetInputMode (window, GLFW_STICKY_KEYS, GL_TRUE);
|
// glfwSetInputMode (window, GLFW_STICKY_KEYS, GL_TRUE);
|
||||||
|
|
||||||
// set the scene clear color
|
|
||||||
auto sceneInformation = project->getWallpaper ()->as <WallpaperEngine::Core::CScene> ();
|
|
||||||
FloatColor clearColor = sceneInformation->getClearColor ();
|
|
||||||
|
|
||||||
// enable depth text
|
// enable depth text
|
||||||
glEnable (GL_DEPTH_TEST);
|
glEnable (GL_DEPTH_TEST);
|
||||||
glDepthFunc (GL_LESS);
|
glDepthFunc (GL_LESS);
|
||||||
@ -252,10 +248,8 @@ int main (int argc, char* argv[])
|
|||||||
g_Time = (float) glfwGetTime ();
|
g_Time = (float) glfwGetTime ();
|
||||||
// get the start time of the frame
|
// get the start time of the frame
|
||||||
startTime = clock ();
|
startTime = clock ();
|
||||||
|
|
||||||
// render the scene
|
// render the scene
|
||||||
wallpaper->render ();
|
wallpaper->render ();
|
||||||
|
|
||||||
// do buffer swapping
|
// do buffer swapping
|
||||||
glfwSwapBuffers (window);
|
glfwSwapBuffers (window);
|
||||||
// poll for events (like closing the window)
|
// poll for events (like closing the window)
|
||||||
|
@ -22,6 +22,7 @@ CTexture::CTexture (void* fileData)
|
|||||||
this->m_header->height = this->m_header->mipmaps [0]->height;
|
this->m_header->height = this->m_header->mipmaps [0]->height;
|
||||||
this->m_header->textureWidth = this->m_header->mipmaps [0]->width;
|
this->m_header->textureWidth = this->m_header->mipmaps [0]->width;
|
||||||
this->m_header->textureHeight = this->m_header->mipmaps [0]->height;
|
this->m_header->textureHeight = this->m_header->mipmaps [0]->height;
|
||||||
|
// TODO: MAYBE IT'S BETTER TO CREATE A TEXTURE OF THE GIVEN SIZE AND COPY OVER WHAT WE READ FROM THE FILE?
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -86,7 +87,7 @@ CTexture::CTexture (void* fileData)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: USE THIS ONE
|
// TODO: USE THIS ONE
|
||||||
uint32_t blockSize = (internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) ? 8 : 16;
|
// uint32_t blockSize = (internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) ? 8 : 16;
|
||||||
|
|
||||||
auto cur = this->m_header->mipmaps.begin ();
|
auto cur = this->m_header->mipmaps.begin ();
|
||||||
auto end = this->m_header->mipmaps.end ();
|
auto end = this->m_header->mipmaps.end ();
|
||||||
@ -146,8 +147,6 @@ CTexture::CTexture (void* fileData)
|
|||||||
FreeImage_CloseMemory (memory);
|
FreeImage_CloseMemory (memory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: IMPLEMENT SUPPORT FOR NORMAL IMAGES
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CTexture::~CTexture ()
|
CTexture::~CTexture ()
|
||||||
|
@ -51,19 +51,23 @@ void CScene::render ()
|
|||||||
auto cur = this->m_objects.begin ();
|
auto cur = this->m_objects.begin ();
|
||||||
auto end = this->m_objects.end ();
|
auto end = this->m_objects.end ();
|
||||||
|
|
||||||
// do not use any framebuffer for now
|
|
||||||
glBindFramebuffer (GL_FRAMEBUFFER, 0);
|
|
||||||
// ensure we render over the whole screen
|
|
||||||
glViewport (0, 0, projection->getWidth (), projection->getHeight ());
|
|
||||||
|
|
||||||
// clear screen
|
// clear screen
|
||||||
FloatColor clearColor = this->getScene ()->getClearColor ();
|
FloatColor clearColor = this->getScene ()->getClearColor ();
|
||||||
|
|
||||||
glClearColor (clearColor.r, clearColor.g, clearColor.b, clearColor.a);
|
glClearColor (clearColor.r, clearColor.g, clearColor.b, clearColor.a);
|
||||||
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
||||||
|
// use the scene's framebuffer by default
|
||||||
|
glBindFramebuffer (GL_FRAMEBUFFER, this->getWallpaperFramebuffer());
|
||||||
|
// ensure we render over the whole screen
|
||||||
|
glViewport (0, 0, projection->getWidth (), projection->getHeight ());
|
||||||
|
|
||||||
for (; cur != end; cur ++)
|
for (; cur != end; cur ++)
|
||||||
(*cur)->render ();
|
(*cur)->render ();
|
||||||
|
|
||||||
|
// ensure we render over the whole screen
|
||||||
|
glViewport (0, 0, projection->getWidth (), projection->getHeight ());
|
||||||
|
|
||||||
|
CWallpaper::render ();
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::CScene* CScene::getScene ()
|
Core::CScene* CScene::getScene ()
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
#include "CWallpaper.h"
|
#include "CWallpaper.h"
|
||||||
|
#include "CScene.h"
|
||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <glm/glm.hpp>
|
#include <glm/glm.hpp>
|
||||||
|
#include <glm/gtc/type_ptr.hpp>
|
||||||
|
|
||||||
using namespace WallpaperEngine::Render;
|
using namespace WallpaperEngine::Render;
|
||||||
|
|
||||||
@ -11,6 +13,34 @@ CWallpaper::CWallpaper (Core::CWallpaper* wallpaperData, std::string type, CCont
|
|||||||
m_type (std::move(type))
|
m_type (std::move(type))
|
||||||
{
|
{
|
||||||
this->setupFramebuffers ();
|
this->setupFramebuffers ();
|
||||||
|
this->setupShaders ();
|
||||||
|
|
||||||
|
GLfloat texCoords [] = {
|
||||||
|
0.0f, 0.0f,
|
||||||
|
1.0f, 0.0f,
|
||||||
|
0.0f, 1.0f,
|
||||||
|
0.0f, 1.0f,
|
||||||
|
1.0f, 0.0f,
|
||||||
|
1.0f, 1.0f
|
||||||
|
};
|
||||||
|
|
||||||
|
// inverted positions so the final texture is rendered properly
|
||||||
|
GLfloat position [] = {
|
||||||
|
-1.0f, 1.0f, 0.0f,
|
||||||
|
1.0, 1.0f, 0.0f,
|
||||||
|
-1.0f, -1.0f, 0.0f,
|
||||||
|
-1.0f, -1.0f, 0.0f,
|
||||||
|
1.0f, 1.0f, 0.0f,
|
||||||
|
1.0f, -1.0f, 0.0f
|
||||||
|
};
|
||||||
|
|
||||||
|
glGenBuffers (1, &this->m_texCoordBuffer);
|
||||||
|
glBindBuffer (GL_ARRAY_BUFFER, this->m_texCoordBuffer);
|
||||||
|
glBufferData (GL_ARRAY_BUFFER, sizeof (texCoords), texCoords, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glGenBuffers (1, &this->m_positionBuffer);
|
||||||
|
glBindBuffer (GL_ARRAY_BUFFER, this->m_positionBuffer);
|
||||||
|
glBufferData (GL_ARRAY_BUFFER, sizeof (position), position, GL_STATIC_DRAW);
|
||||||
}
|
}
|
||||||
|
|
||||||
CWallpaper::~CWallpaper ()
|
CWallpaper::~CWallpaper ()
|
||||||
@ -27,6 +57,161 @@ WallpaperEngine::Core::CWallpaper* CWallpaper::getWallpaperData ()
|
|||||||
return this->m_wallpaperData;
|
return this->m_wallpaperData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLuint CWallpaper::getWallpaperFramebuffer () const
|
||||||
|
{
|
||||||
|
return this->m_sceneFramebuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint CWallpaper::getWallpaperTexture () const
|
||||||
|
{
|
||||||
|
return this->m_sceneTexture;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWallpaper::setupShaders ()
|
||||||
|
{
|
||||||
|
// reserve shaders in OpenGL
|
||||||
|
GLuint vertexShaderID = glCreateShader (GL_VERTEX_SHADER);
|
||||||
|
|
||||||
|
// give shader's source code to OpenGL to be compiled
|
||||||
|
const char* sourcePointer = "#version 120\n"
|
||||||
|
"attribute vec3 a_Position;\n"
|
||||||
|
"attribute vec2 a_TexCoord;\n"
|
||||||
|
"varying vec2 v_TexCoord;\n"
|
||||||
|
"void main () {\n"
|
||||||
|
"gl_Position = vec4 (a_Position, 1.0);\n"
|
||||||
|
"v_TexCoord = a_TexCoord;\n"
|
||||||
|
"}";
|
||||||
|
|
||||||
|
glShaderSource (vertexShaderID, 1, &sourcePointer, nullptr);
|
||||||
|
glCompileShader (vertexShaderID);
|
||||||
|
|
||||||
|
GLint result = GL_FALSE;
|
||||||
|
int infoLogLength = 0;
|
||||||
|
|
||||||
|
// ensure the vertex shader was correctly compiled
|
||||||
|
glGetShaderiv (vertexShaderID, GL_COMPILE_STATUS, &result);
|
||||||
|
glGetShaderiv (vertexShaderID, GL_INFO_LOG_LENGTH, &infoLogLength);
|
||||||
|
|
||||||
|
if (infoLogLength > 0)
|
||||||
|
{
|
||||||
|
char* logBuffer = new char [infoLogLength + 1];
|
||||||
|
// ensure logBuffer ends with a \0
|
||||||
|
memset (logBuffer, 0, infoLogLength + 1);
|
||||||
|
// get information about the error
|
||||||
|
glGetShaderInfoLog (vertexShaderID, infoLogLength, nullptr, logBuffer);
|
||||||
|
// throw an exception about the issue
|
||||||
|
std::string message = logBuffer;
|
||||||
|
// free the buffer
|
||||||
|
delete[] logBuffer;
|
||||||
|
// throw an exception
|
||||||
|
throw std::runtime_error (message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// reserve shaders in OpenGL
|
||||||
|
GLuint fragmentShaderID = glCreateShader (GL_FRAGMENT_SHADER);
|
||||||
|
|
||||||
|
// give shader's source code to OpenGL to be compiled
|
||||||
|
sourcePointer = "#version 120\n"
|
||||||
|
"uniform sampler2D g_Texture0;\n"
|
||||||
|
"varying vec2 v_TexCoord;\n"
|
||||||
|
"void main () {\n"
|
||||||
|
"gl_FragColor = texture2D (g_Texture0, v_TexCoord);\n"
|
||||||
|
"}";
|
||||||
|
|
||||||
|
glShaderSource (fragmentShaderID, 1, &sourcePointer, nullptr);
|
||||||
|
glCompileShader (fragmentShaderID);
|
||||||
|
|
||||||
|
result = GL_FALSE;
|
||||||
|
infoLogLength = 0;
|
||||||
|
|
||||||
|
// ensure the vertex shader was correctly compiled
|
||||||
|
glGetShaderiv (fragmentShaderID, GL_COMPILE_STATUS, &result);
|
||||||
|
glGetShaderiv (fragmentShaderID, GL_INFO_LOG_LENGTH, &infoLogLength);
|
||||||
|
|
||||||
|
if (infoLogLength > 0)
|
||||||
|
{
|
||||||
|
char* logBuffer = new char [infoLogLength + 1];
|
||||||
|
// ensure logBuffer ends with a \0
|
||||||
|
memset (logBuffer, 0, infoLogLength + 1);
|
||||||
|
// get information about the error
|
||||||
|
glGetShaderInfoLog (fragmentShaderID, infoLogLength, nullptr, logBuffer);
|
||||||
|
// throw an exception about the issue
|
||||||
|
std::string message = logBuffer;
|
||||||
|
// free the buffer
|
||||||
|
delete[] logBuffer;
|
||||||
|
// throw an exception
|
||||||
|
throw std::runtime_error (message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// create the final program
|
||||||
|
this->m_shader = glCreateProgram ();
|
||||||
|
// link the shaders together
|
||||||
|
glAttachShader (this->m_shader, vertexShaderID);
|
||||||
|
glAttachShader (this->m_shader, fragmentShaderID);
|
||||||
|
glLinkProgram (this->m_shader);
|
||||||
|
// check that the shader was properly linked
|
||||||
|
result = GL_FALSE;
|
||||||
|
infoLogLength = 0;
|
||||||
|
|
||||||
|
glGetProgramiv (this->m_shader, GL_LINK_STATUS, &result);
|
||||||
|
glGetProgramiv (this->m_shader, GL_INFO_LOG_LENGTH, &infoLogLength);
|
||||||
|
|
||||||
|
if (infoLogLength > 0)
|
||||||
|
{
|
||||||
|
char* logBuffer = new char [infoLogLength + 1];
|
||||||
|
// ensure logBuffer ends with a \0
|
||||||
|
memset (logBuffer, 0, infoLogLength + 1);
|
||||||
|
// get information about the error
|
||||||
|
glGetProgramInfoLog (this->m_shader, infoLogLength, nullptr, logBuffer);
|
||||||
|
// throw an exception about the issue
|
||||||
|
std::string message = logBuffer;
|
||||||
|
// free the buffer
|
||||||
|
delete[] logBuffer;
|
||||||
|
// throw an exception
|
||||||
|
throw std::runtime_error (message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// after being liked shaders can be dettached and deleted
|
||||||
|
glDetachShader (this->m_shader, vertexShaderID);
|
||||||
|
glDetachShader (this->m_shader, fragmentShaderID);
|
||||||
|
|
||||||
|
glDeleteShader (vertexShaderID);
|
||||||
|
glDeleteShader (fragmentShaderID);
|
||||||
|
|
||||||
|
// get textures
|
||||||
|
this->g_Texture0 = glGetUniformLocation (this->m_shader, "g_Texture0");
|
||||||
|
this->a_Position = glGetAttribLocation (this->m_shader, "a_Position");
|
||||||
|
this->a_TexCoord = glGetAttribLocation (this->m_shader, "a_TexCoord");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWallpaper::render ()
|
||||||
|
{
|
||||||
|
// write to default's framebuffer
|
||||||
|
glBindFramebuffer (GL_FRAMEBUFFER, GL_NONE);
|
||||||
|
|
||||||
|
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
glDisable (GL_BLEND);
|
||||||
|
glDisable (GL_DEPTH_TEST);
|
||||||
|
// do not use any shader
|
||||||
|
glUseProgram (this->m_shader);
|
||||||
|
// activate scene texture
|
||||||
|
glActiveTexture (GL_TEXTURE0);
|
||||||
|
glBindTexture (GL_TEXTURE_2D, this->getWallpaperTexture ());
|
||||||
|
// set uniforms and attribs
|
||||||
|
glEnableVertexAttribArray (this->a_TexCoord);
|
||||||
|
glBindBuffer (GL_ARRAY_BUFFER, this->m_texCoordBuffer);
|
||||||
|
glVertexAttribPointer (this->a_TexCoord, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
|
||||||
|
|
||||||
|
glEnableVertexAttribArray (this->a_Position);
|
||||||
|
glBindBuffer (GL_ARRAY_BUFFER, this->m_positionBuffer);
|
||||||
|
glVertexAttribPointer (this->a_Position, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
|
||||||
|
|
||||||
|
glUniform1i (this->g_Texture0, 0);
|
||||||
|
// write the framebuffer as is to the screen
|
||||||
|
glBindBuffer (GL_ARRAY_BUFFER, this->m_texCoordBuffer);
|
||||||
|
glDrawArrays (GL_TRIANGLES, 0, 6);
|
||||||
|
}
|
||||||
|
|
||||||
void CWallpaper::pinpongFramebuffer (GLuint* drawTo, GLuint* inputTexture)
|
void CWallpaper::pinpongFramebuffer (GLuint* drawTo, GLuint* inputTexture)
|
||||||
{
|
{
|
||||||
// get current main framebuffer and texture so we can swap them
|
// get current main framebuffer and texture so we can swap them
|
||||||
@ -47,7 +232,7 @@ void CWallpaper::pinpongFramebuffer (GLuint* drawTo, GLuint* inputTexture)
|
|||||||
this->m_subTexture = currentMainTexture;
|
this->m_subTexture = currentMainTexture;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWallpaper::setupFramebuffers ()
|
void CWallpaper::createFramebuffer (GLuint* framebuffer, GLuint* depthbuffer, GLuint* texture)
|
||||||
{
|
{
|
||||||
int windowWidth = 1920;
|
int windowWidth = 1920;
|
||||||
int windowHeight = 1080;
|
int windowHeight = 1080;
|
||||||
@ -62,12 +247,12 @@ void CWallpaper::setupFramebuffers ()
|
|||||||
|
|
||||||
GLenum drawBuffers [1] = {GL_COLOR_ATTACHMENT0};
|
GLenum drawBuffers [1] = {GL_COLOR_ATTACHMENT0};
|
||||||
// create the main framebuffer
|
// create the main framebuffer
|
||||||
glGenFramebuffers (1, &this->m_mainFramebuffer);
|
glGenFramebuffers (1, framebuffer);
|
||||||
glBindFramebuffer (GL_FRAMEBUFFER, this->m_mainFramebuffer);
|
glBindFramebuffer (GL_FRAMEBUFFER, *framebuffer);
|
||||||
// create the main texture
|
// create the main texture
|
||||||
glGenTextures (1, &this->m_mainTexture);
|
glGenTextures (1, texture);
|
||||||
// bind the new texture to set settings on it
|
// bind the new texture to set settings on it
|
||||||
glBindTexture (GL_TEXTURE_2D, this->m_mainTexture);
|
glBindTexture (GL_TEXTURE_2D, *texture);
|
||||||
// give OpenGL an empty image
|
// give OpenGL an empty image
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, windowWidth, windowHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, windowWidth, windowHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
||||||
|
|
||||||
@ -78,46 +263,24 @@ void CWallpaper::setupFramebuffers ()
|
|||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
|
||||||
// create the depth render buffer for the main framebuffer
|
// create the depth render buffer for the main framebuffer
|
||||||
glGenRenderbuffers (1, &this->m_mainDepthBuffer);
|
glGenRenderbuffers (1, depthbuffer);
|
||||||
glBindRenderbuffer (GL_RENDERBUFFER, this->m_mainDepthBuffer);
|
glBindRenderbuffer (GL_RENDERBUFFER, *depthbuffer);
|
||||||
glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT, windowWidth, windowHeight);
|
glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT, windowWidth, windowHeight);
|
||||||
glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, this->m_mainDepthBuffer);
|
glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, *depthbuffer);
|
||||||
// set the texture as the colour attachmend #0
|
// set the texture as the colour attachmend #0
|
||||||
glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, this->m_mainTexture, 0);
|
glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *texture, 0);
|
||||||
// finally set the list of draw buffers
|
// finally set the list of draw buffers
|
||||||
glDrawBuffers (1, drawBuffers);
|
glDrawBuffers (1, drawBuffers);
|
||||||
|
|
||||||
// ensure first framebuffer is okay
|
// ensure first framebuffer is okay
|
||||||
if (glCheckFramebufferStatus (GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
if (glCheckFramebufferStatus (GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
||||||
throw std::runtime_error ("Framebuffers are not properly set");
|
throw std::runtime_error ("Framebuffers are not properly set");
|
||||||
|
}
|
||||||
// create the sub framebuffer
|
|
||||||
glGenFramebuffers (1, &this->m_subFramebuffer);
|
void CWallpaper::setupFramebuffers ()
|
||||||
glBindFramebuffer (GL_FRAMEBUFFER, this->m_subFramebuffer);
|
{
|
||||||
// create the sub texture
|
this->createFramebuffer (&this->m_mainFramebuffer, &this->m_mainDepthBuffer, &this->m_mainTexture);
|
||||||
glGenTextures (1, &this->m_subTexture);
|
this->createFramebuffer (&this->m_subFramebuffer, &this->m_subDepthBuffer, &this->m_subTexture);
|
||||||
// bind the new texture to set settings on it
|
// create framebuffer for the scene
|
||||||
glBindTexture (GL_TEXTURE_2D, this->m_subTexture);
|
this->createFramebuffer (&this->m_sceneFramebuffer, &this->m_sceneDepthBuffer, &this->m_sceneTexture);
|
||||||
// give OpenGL an empty image
|
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, windowWidth, windowHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
|
||||||
|
|
||||||
// set filtering parameters, otherwise the texture is not rendered
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
||||||
|
|
||||||
// create the depth render buffer for the main framebuffer
|
|
||||||
glGenRenderbuffers (1, &this->m_subDepthBuffer);
|
|
||||||
glBindRenderbuffer (GL_RENDERBUFFER, this->m_subDepthBuffer);
|
|
||||||
glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT, windowWidth, windowHeight);
|
|
||||||
glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, this->m_subDepthBuffer);
|
|
||||||
// set the texture as the colour attachmend #0
|
|
||||||
glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, this->m_subTexture, 0);
|
|
||||||
// finally set the list of draw buffers
|
|
||||||
glDrawBuffers (1, drawBuffers);
|
|
||||||
|
|
||||||
// ensure second framebuffer is okay
|
|
||||||
if (glCheckFramebufferStatus (GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
|
||||||
throw std::runtime_error ("Framebuffers are not properly set");
|
|
||||||
}
|
}
|
@ -32,7 +32,7 @@ namespace WallpaperEngine::Render
|
|||||||
/**
|
/**
|
||||||
* Performs a render pass of the wallpaper
|
* Performs a render pass of the wallpaper
|
||||||
*/
|
*/
|
||||||
virtual void render () = 0;
|
virtual void render ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The container to resolve files for this wallpaper
|
* @return The container to resolve files for this wallpaper
|
||||||
@ -47,7 +47,18 @@ namespace WallpaperEngine::Render
|
|||||||
*/
|
*/
|
||||||
void pinpongFramebuffer (GLuint* drawTo, GLuint* inputTexture);
|
void pinpongFramebuffer (GLuint* drawTo, GLuint* inputTexture);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The scene's framebuffer
|
||||||
|
*/
|
||||||
|
GLuint getWallpaperFramebuffer () const;
|
||||||
|
/**
|
||||||
|
* @return The scene's texture
|
||||||
|
*/
|
||||||
|
GLuint getWallpaperTexture () const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
void createFramebuffer (GLuint* framebuffer, GLuint* depthbuffer, GLuint* texture);
|
||||||
|
|
||||||
CContainer* m_container;
|
CContainer* m_container;
|
||||||
Core::CWallpaper* m_wallpaperData;
|
Core::CWallpaper* m_wallpaperData;
|
||||||
|
|
||||||
@ -81,9 +92,34 @@ namespace WallpaperEngine::Render
|
|||||||
GLuint m_subTexture;
|
GLuint m_subTexture;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setups OpenGL's framebuffers for ping-pong
|
* The framebuffer used for the scene output
|
||||||
|
*/
|
||||||
|
GLuint m_sceneFramebuffer;
|
||||||
|
/**
|
||||||
|
* The depthbuffer used for the scene output
|
||||||
|
*/
|
||||||
|
GLuint m_sceneDepthBuffer;
|
||||||
|
/**
|
||||||
|
* The texture used for the scene output
|
||||||
|
*/
|
||||||
|
GLuint m_sceneTexture;
|
||||||
|
GLuint m_texCoordBuffer;
|
||||||
|
GLuint m_positionBuffer;
|
||||||
|
GLuint m_shader;
|
||||||
|
// shader variables
|
||||||
|
GLint g_Texture0;
|
||||||
|
GLint g_ModelViewProjectionMatrix;
|
||||||
|
GLint a_Position;
|
||||||
|
GLint a_TexCoord;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setups OpenGL's framebuffers for ping-pong and scene rendering
|
||||||
*/
|
*/
|
||||||
void setupFramebuffers ();
|
void setupFramebuffers ();
|
||||||
|
/**
|
||||||
|
* Setups OpenGL's shaders for this wallpaper backbuffer
|
||||||
|
*/
|
||||||
|
void setupShaders ();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
|
@ -140,10 +140,8 @@ void CImage::render ()
|
|||||||
if (this->getImage ()->isVisible () == false)
|
if (this->getImage ()->isVisible () == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
GLuint drawTo = 0;
|
GLuint drawTo = this->getScene()->getWallpaperFramebuffer();
|
||||||
GLuint inputTexture = this->m_texture->getTextureID ();
|
GLuint inputTexture = this->m_texture->getTextureID ();
|
||||||
// get the orthogonal projection
|
|
||||||
auto projection = this->getScene ()->getScene ()->getOrthogonalProjection ();
|
|
||||||
|
|
||||||
// pinpong current buffer
|
// pinpong current buffer
|
||||||
this->getScene ()->pinpongFramebuffer (&drawTo, nullptr);
|
this->getScene ()->pinpongFramebuffer (&drawTo, nullptr);
|
||||||
@ -166,7 +164,7 @@ void CImage::render ()
|
|||||||
this->getScene ()->pinpongFramebuffer (nullptr, &inputTexture);
|
this->getScene ()->pinpongFramebuffer (nullptr, &inputTexture);
|
||||||
|
|
||||||
// render the main material
|
// render the main material
|
||||||
this->m_material->render (0, inputTexture);
|
this->m_material->render (this->getScene()->getWallpaperFramebuffer(), inputTexture);
|
||||||
/*
|
/*
|
||||||
glBindFramebuffer (GL_FRAMEBUFFER, 0);
|
glBindFramebuffer (GL_FRAMEBUFFER, 0);
|
||||||
// set the viewport, for now use the scene width/height but we might want to use image's size TODO: INVESTIGATE THAT
|
// set the viewport, for now use the scene width/height but we might want to use image's size TODO: INVESTIGATE THAT
|
||||||
|
@ -51,7 +51,7 @@ CPass::CPass (CMaterial* material, Core::Objects::Images::Materials::CPass* pass
|
|||||||
void CPass::render (GLuint drawTo, GLuint input)
|
void CPass::render (GLuint drawTo, GLuint input)
|
||||||
{
|
{
|
||||||
// clear whatever buffer we're drawing to if we're not drawing to screen
|
// clear whatever buffer we're drawing to if we're not drawing to screen
|
||||||
if (drawTo > 0)
|
if (drawTo != this->m_material->getImage()->getScene()->getWallpaperFramebuffer())
|
||||||
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
// set texture blending
|
// set texture blending
|
||||||
@ -95,7 +95,7 @@ void CPass::render (GLuint drawTo, GLuint input)
|
|||||||
// this should not be required once we do some prediction on rendering things
|
// this should not be required once we do some prediction on rendering things
|
||||||
// but for now should be enough
|
// but for now should be enough
|
||||||
this->a_TexCoord = (input == this->m_material->getImage ()->getTexture ()->getTextureID ()) ? *this->m_material->getImage ()->getTexCoordBuffer () : *this->m_material->getImage ()->getPassTexCoordBuffer ();
|
this->a_TexCoord = (input == this->m_material->getImage ()->getTexture ()->getTextureID ()) ? *this->m_material->getImage ()->getTexCoordBuffer () : *this->m_material->getImage ()->getPassTexCoordBuffer ();
|
||||||
this->a_Position = (drawTo > 0) ? *this->m_material->getImage ()->getPassVertexBuffer () : *this->m_material->getImage ()->getVertexBuffer ();
|
this->a_Position = (drawTo != this->m_material->getImage()->getScene()->getWallpaperFramebuffer()) ? *this->m_material->getImage ()->getPassVertexBuffer () : *this->m_material->getImage ()->getVertexBuffer ();
|
||||||
// use the shader we have registered
|
// use the shader we have registered
|
||||||
glUseProgram (this->m_programID);
|
glUseProgram (this->m_programID);
|
||||||
|
|
||||||
@ -173,7 +173,7 @@ void CPass::render (GLuint drawTo, GLuint input)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// start actual rendering now
|
// start actual rendering now
|
||||||
glBindBuffer (GL_ARRAY_BUFFER, (drawTo > 0) ? *this->m_material->getImage ()->getPassVertexBuffer () : *this->m_material->getImage ()->getVertexBuffer ());
|
glBindBuffer (GL_ARRAY_BUFFER, (drawTo != this->m_material->getImage()->getScene()->getWallpaperFramebuffer()) ? *this->m_material->getImage ()->getPassVertexBuffer () : *this->m_material->getImage ()->getVertexBuffer ());
|
||||||
glDrawArrays (GL_TRIANGLES, 0, 6);
|
glDrawArrays (GL_TRIANGLES, 0, 6);
|
||||||
|
|
||||||
// disable vertex attribs array
|
// disable vertex attribs array
|
||||||
@ -270,10 +270,6 @@ void CPass::setupShaders ()
|
|||||||
// support three textures for now
|
// support three textures for now
|
||||||
this->g_Texture0Rotation = glGetUniformLocation (this->m_programID, "g_Texture0Rotation");
|
this->g_Texture0Rotation = glGetUniformLocation (this->m_programID, "g_Texture0Rotation");
|
||||||
this->g_Texture0Translation = glGetUniformLocation (this->m_programID, "g_Texture0Translation");
|
this->g_Texture0Translation = glGetUniformLocation (this->m_programID, "g_Texture0Translation");
|
||||||
|
|
||||||
// bind a_TexCoord and a_Position
|
|
||||||
this->a_TexCoord = glGetAttribLocation (this->m_programID, "a_TexCoord");
|
|
||||||
this->a_Position = glGetAttribLocation (this->m_programID, "a_Position");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPass::setupAttributes ()
|
void CPass::setupAttributes ()
|
||||||
@ -413,8 +409,9 @@ void CPass::setupShaderVariables ()
|
|||||||
CShaderVariable* var = vertexVar == nullptr ? pixelVar : vertexVar;
|
CShaderVariable* var = vertexVar == nullptr ? pixelVar : vertexVar;
|
||||||
|
|
||||||
// ensure the shader's and the constant are of the same type
|
// ensure the shader's and the constant are of the same type
|
||||||
if ((*cur).second->getType () != var->getType ())
|
// TODO: CHECK THIS, THERE'S SOME BACKGROUNDS WHERE THIS HAPPENS :/
|
||||||
throw std::runtime_error ("Constant and pixel/vertex variable are not of the same type");
|
/*if ((*cur).second->getType () != var->getType ())
|
||||||
|
throw std::runtime_error ("Constant and pixel/vertex variable are not of the same type");*/
|
||||||
|
|
||||||
// now determine the constant's type and register the correct uniform for it
|
// now determine the constant's type and register the correct uniform for it
|
||||||
if ((*cur).second->is <CShaderConstantFloat> ())
|
if ((*cur).second->is <CShaderConstantFloat> ())
|
||||||
|
Loading…
Reference in New Issue
Block a user