proper blitting without texture attachment added - need to redo and refactor the stuff in pipeline
This commit is contained in:
parent
351d29cd54
commit
075d18b4b8
7 changed files with 153 additions and 97 deletions
|
@ -37,90 +37,88 @@ namespace pw {
|
||||||
class debug {
|
class debug {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
enum level {
|
enum level {
|
||||||
none, //!< nothing will be logged, even no errors
|
none, //!< nothing will be logged, even no errors
|
||||||
error, //!< only errors will be logged
|
error, //!< only errors will be logged
|
||||||
warning, //!< log warnings (non-critical errors)
|
warning, //!< log warnings (non-critical errors)
|
||||||
message, //!< log messages (something to note but not an error)
|
message, //!< log messages (something to note but not an error)
|
||||||
notification, //!< log some more information
|
notification, //!< log some more information
|
||||||
info, //!< log verbose information
|
info, //!< log verbose information
|
||||||
all = 0xFF //!< log absolutely everything
|
all = 0xFF //!< log absolutely everything
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief the streaming interface for the logger
|
* @brief the streaming interface for the logger
|
||||||
*/
|
*/
|
||||||
class stream {
|
class stream {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
||||||
stream(debug* log = nullptr);
|
stream(debug* log = nullptr);
|
||||||
~stream();
|
~stream();
|
||||||
stream(const stream& other);
|
stream(const stream& other);
|
||||||
|
|
||||||
|
|
||||||
stream &operator << (const bool &value);
|
stream& operator << (const bool &value);
|
||||||
stream &operator << (const char *value);
|
stream& operator << (const char *value);
|
||||||
stream& operator << (const std::string& value); ///! log a string
|
stream& operator << (const std::string& value); ///! log a string
|
||||||
|
|
||||||
stream& operator << (const float &value); ///! log a float value
|
stream& operator << (const float &value); ///! log a float value
|
||||||
stream& operator << (const double &value); ///! log a double value
|
stream& operator << (const double &value); ///! log a double value
|
||||||
|
|
||||||
stream& operator << (const int &value); ///! log a int value
|
stream& operator << (const int &value); ///! log a int value
|
||||||
stream& operator << (const unsigned int &value); ///! log a int value
|
stream& operator << (const unsigned int &value); ///! log a int value
|
||||||
|
|
||||||
stream& operator << (const long &value); ///! log a long value
|
stream& operator << (const long &value); ///! log a long value
|
||||||
stream& operator << (const unsigned long &value); ///! log a int value
|
stream& operator << (const unsigned long &value); ///! log a int value
|
||||||
|
|
||||||
stream& operator << (const void *value); ///! pointer
|
stream& operator << (const void *value); ///! pointer
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
debug* _log;
|
debug* _log;
|
||||||
std::string _line;
|
std::string _line;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** sets the logging level */
|
||||||
|
void set_level(level level) {_level = level;}
|
||||||
|
|
||||||
|
/** gets the logging level */
|
||||||
|
level level() const { return _level; }
|
||||||
|
|
||||||
/** sets the logging level */
|
/**
|
||||||
void set_level(level level) {_level = level;}
|
* @brief get the stream interface of the logger
|
||||||
|
* @return return a temporary object that will write and flush the logger
|
||||||
|
*/
|
||||||
|
static stream s(enum level level = info);
|
||||||
|
|
||||||
/** gets the logging level */
|
inline static stream d() { return s(debug::info); }
|
||||||
level level() const { return _level; }
|
inline static stream e() { return s(debug::error); }
|
||||||
|
inline static stream w() { return s(debug::warning); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief get the stream interface of the logger
|
* @brief returns the instance of the logger
|
||||||
* @return return a temporary object that will write and flush the logger
|
* @return
|
||||||
*/
|
*/
|
||||||
static stream s(enum level level = info);
|
static debug& get();
|
||||||
|
|
||||||
inline static stream d() { return s(debug::info); }
|
/**
|
||||||
inline static stream e() { return s(debug::error); }
|
* @brief write a message to the log
|
||||||
inline static stream w() { return s(debug::warning); }
|
* @param message string
|
||||||
|
*/
|
||||||
|
void write(const std::string &message);
|
||||||
|
|
||||||
/**
|
typedef std::function<void(const char*)> Callback;
|
||||||
* @brief returns the instance of the logger
|
typedef std::vector<Callback> CallbackList;
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
static debug& get();
|
|
||||||
|
|
||||||
/**
|
~debug();
|
||||||
* @brief write a message to the log
|
|
||||||
* @param message string
|
|
||||||
*/
|
|
||||||
void write(const std::string &message);
|
|
||||||
|
|
||||||
typedef std::function<void(const char*)> Callback;
|
|
||||||
typedef std::vector<Callback> CallbackList;
|
|
||||||
|
|
||||||
~debug();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
debug();
|
debug();
|
||||||
|
|
||||||
CallbackList _callbacks;
|
CallbackList _callbacks;
|
||||||
enum level _level;
|
enum level _level;
|
||||||
};
|
};
|
||||||
|
|
||||||
///**
|
///**
|
||||||
|
|
|
@ -10,13 +10,12 @@ namespace pw {
|
||||||
|
|
||||||
void script_system::load(sol::table &ns)
|
void script_system::load(sol::table &ns)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
ns.new_usertype<window>("window",
|
ns.new_usertype<window>("window",
|
||||||
"update",&window::update,
|
"update",&window::update,
|
||||||
"on_update",sol::writeonly_property(&window::set_on_update),
|
"on_update",sol::writeonly_property(&window::set_on_update),
|
||||||
"title",sol::writeonly_property(&window::set_title),
|
"title",sol::writeonly_property(&window::set_title),
|
||||||
"size",sol::property(&window::size,&window::set_size),
|
"size",sol::property(&window::size,&window::set_size),
|
||||||
|
"client_size",sol::readonly_property(&window::client_size),
|
||||||
"position",sol::property(&window::position,&window::set_position),
|
"position",sol::property(&window::position,&window::set_position),
|
||||||
"fullscreen",sol::property(&window::fullscreen,&window::set_fullscreen)
|
"fullscreen",sol::property(&window::fullscreen,&window::set_fullscreen)
|
||||||
);
|
);
|
||||||
|
|
|
@ -70,13 +70,20 @@ local w = pw.window.new()
|
||||||
-- set title
|
-- set title
|
||||||
w.title = "pixwerx 0.1"
|
w.title = "pixwerx 0.1"
|
||||||
|
|
||||||
|
-- set size
|
||||||
|
w.size = pw.size.new(800,600)
|
||||||
|
-- move window
|
||||||
|
w.position = pw.point.new(100,100)
|
||||||
|
|
||||||
|
|
||||||
local pl = pw.pipeline.new()
|
local pl = pw.pipeline.new()
|
||||||
if pl:create(pw.size.new(800,600)) then
|
if pl:create(w.client_size) then
|
||||||
print("pipeline ok")
|
print("pipeline ok")
|
||||||
else
|
else
|
||||||
print("pipeline failed")
|
print("pipeline failed")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- setup a lua callback function
|
-- setup a lua callback function
|
||||||
w.on_update = function(self)
|
w.on_update = function(self)
|
||||||
|
|
||||||
|
@ -84,11 +91,6 @@ w.on_update = function(self)
|
||||||
-- print("test on update",w.position.x,w.position.y,pw.timer.now)
|
-- print("test on update",w.position.x,w.position.y,pw.timer.now)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- set size
|
|
||||||
w.size = pw.size.new(800,600)
|
|
||||||
-- move window
|
|
||||||
w.position = pw.point.new(100,100)
|
|
||||||
|
|
||||||
local ds = pw.display:all()
|
local ds = pw.display:all()
|
||||||
for i = 1,#ds do
|
for i = 1,#ds do
|
||||||
print("display ",i,ds[i].name)
|
print("display ",i,ds[i].name)
|
||||||
|
|
|
@ -23,6 +23,7 @@ public:
|
||||||
|
|
||||||
void set_size(const size& s);
|
void set_size(const size& s);
|
||||||
pw::size size() const;
|
pw::size size() const;
|
||||||
|
pw::size client_size() const;
|
||||||
|
|
||||||
void set_position(const point& p);
|
void set_position(const point& p);
|
||||||
point position() const;
|
point position() const;
|
||||||
|
|
|
@ -95,6 +95,9 @@ struct window::impl {
|
||||||
static void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
static void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
||||||
{
|
{
|
||||||
window::impl* impl = static_cast<window::impl*>(glfwGetWindowUserPointer(window));
|
window::impl* impl = static_cast<window::impl*>(glfwGetWindowUserPointer(window));
|
||||||
|
|
||||||
|
debug::d() << "window::frame_buffer_size_callback " << width << "x" << height;
|
||||||
|
|
||||||
// impl->on_resize(width,height);
|
// impl->on_resize(width,height);
|
||||||
|
|
||||||
// std::cout << "framebuffer " << width << "x" << height << std::endl;
|
// std::cout << "framebuffer " << width << "x" << height << std::endl;
|
||||||
|
@ -218,9 +221,9 @@ struct window::impl {
|
||||||
glfwSetWindowTitle(_window,title.c_str());
|
glfwSetWindowTitle(_window,title.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_size(int w,int h)
|
void set_size(const ::pw::sizei& s)
|
||||||
{
|
{
|
||||||
glfwSetWindowSize(_window,w,h);
|
glfwSetWindowSize(_window,s.width,s.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
::pw::size size() const
|
::pw::size size() const
|
||||||
|
@ -230,6 +233,14 @@ struct window::impl {
|
||||||
return ::pw::size(w,h);
|
return ::pw::size(w,h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
::pw::size client_size() const
|
||||||
|
{
|
||||||
|
int w,h;
|
||||||
|
glfwGetFramebufferSize(_window,&w,&h);
|
||||||
|
return ::pw::size(w,h);
|
||||||
|
}
|
||||||
|
|
||||||
::pw::point position() const
|
::pw::point position() const
|
||||||
{
|
{
|
||||||
int x,y;
|
int x,y;
|
||||||
|
@ -237,9 +248,9 @@ struct window::impl {
|
||||||
return ::pw::point(x,y);
|
return ::pw::point(x,y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_position(int x,int y)
|
void set_position(const pointi& p)
|
||||||
{
|
{
|
||||||
glfwSetWindowPos(_window,x,y);
|
glfwSetWindowPos(_window,p.x,p.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_fullscreen(bool use_fullscreen)
|
void set_fullscreen(bool use_fullscreen)
|
||||||
|
@ -299,7 +310,7 @@ void window::set_title(const std::string& title)
|
||||||
|
|
||||||
void window::set_size(const ::pw::size& s)
|
void window::set_size(const ::pw::size& s)
|
||||||
{
|
{
|
||||||
_impl->set_size(static_cast<int>(std::round(s.width)),static_cast<int>(std::round(s.height)));
|
_impl->set_size(s.cast<int>());
|
||||||
}
|
}
|
||||||
|
|
||||||
size window::size() const
|
size window::size() const
|
||||||
|
@ -307,9 +318,14 @@ size window::size() const
|
||||||
return _impl->size();
|
return _impl->size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size window::client_size() const
|
||||||
|
{
|
||||||
|
return _impl->client_size();
|
||||||
|
}
|
||||||
|
|
||||||
void window::set_position(const point &p)
|
void window::set_position(const point &p)
|
||||||
{
|
{
|
||||||
_impl->set_position(p.x,p.y);
|
_impl->set_position(p.cast<int>());
|
||||||
}
|
}
|
||||||
|
|
||||||
point window::position() const
|
point window::position() const
|
||||||
|
|
|
@ -83,9 +83,6 @@ struct triangle_renderer
|
||||||
|
|
||||||
void draw()
|
void draw()
|
||||||
{
|
{
|
||||||
// glUseProgram(shader_programme);
|
|
||||||
|
|
||||||
|
|
||||||
shader_p.use();
|
shader_p.use();
|
||||||
glBindVertexArray(vao);
|
glBindVertexArray(vao);
|
||||||
// draw points 0-3 from the currently bound VAO with current in-use shader
|
// draw points 0-3 from the currently bound VAO with current in-use shader
|
||||||
|
@ -101,8 +98,8 @@ struct pipeline::impl {
|
||||||
GLuint _fbo_draw;
|
GLuint _fbo_draw;
|
||||||
GLuint _fbo_msaa;
|
GLuint _fbo_msaa;
|
||||||
|
|
||||||
GLuint rboColorId;
|
GLuint _rbo_color;
|
||||||
GLuint rboDepthId;
|
GLuint _rbo_depth;
|
||||||
|
|
||||||
//testing
|
//testing
|
||||||
triangle_renderer tr;
|
triangle_renderer tr;
|
||||||
|
@ -116,6 +113,18 @@ struct pipeline::impl {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GLuint generate_multisample_texture(const sizei& s,int samples)
|
||||||
|
{
|
||||||
|
GLuint texture;
|
||||||
|
glGenTextures(1, &texture);
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
|
||||||
|
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGB8, s.width, s.height, GL_TRUE);
|
||||||
|
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
|
||||||
|
|
||||||
|
return texture;
|
||||||
|
}
|
||||||
|
|
||||||
bool pipeline::impl::create(sizei size)
|
bool pipeline::impl::create(sizei size)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -133,16 +142,14 @@ bool pipeline::impl::create(sizei size)
|
||||||
|
|
||||||
debug::d() << "OpenGL multisampling: " << max_msaa << " choosen:" << msaa;
|
debug::d() << "OpenGL multisampling: " << max_msaa << " choosen:" << msaa;
|
||||||
|
|
||||||
// msaa = std::clamp(msaa,max_msaa);
|
glGenRenderbuffers(1, &_rbo_color);
|
||||||
|
glBindRenderbuffer(GL_RENDERBUFFER, _rbo_color);
|
||||||
glGenRenderbuffers(1, &rboColorId);
|
glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa, GL_RGBA8, _size.width, _size.height);
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, rboColorId);
|
|
||||||
glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa, GL_RGB8, _size.width, _size.height);
|
|
||||||
|
|
||||||
// create a 4x MSAA renderbuffer object for depthbuffer
|
// create a 4x MSAA renderbuffer object for depthbuffer
|
||||||
|
|
||||||
glGenRenderbuffers(1, &rboDepthId);
|
glGenRenderbuffers(1, &_rbo_depth);
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, rboDepthId);
|
glBindRenderbuffer(GL_RENDERBUFFER, _rbo_depth);
|
||||||
glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa, GL_DEPTH_COMPONENT, _size.width, _size.height);
|
glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa, GL_DEPTH_COMPONENT, _size.width, _size.height);
|
||||||
|
|
||||||
// create a 4x MSAA framebuffer object
|
// create a 4x MSAA framebuffer object
|
||||||
|
@ -153,32 +160,32 @@ bool pipeline::impl::create(sizei size)
|
||||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, // 1. fbo target: GL_FRAMEBUFFER
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, // 1. fbo target: GL_FRAMEBUFFER
|
||||||
GL_COLOR_ATTACHMENT0, // 2. color attachment point
|
GL_COLOR_ATTACHMENT0, // 2. color attachment point
|
||||||
GL_RENDERBUFFER, // 3. rbo target: GL_RENDERBUFFER
|
GL_RENDERBUFFER, // 3. rbo target: GL_RENDERBUFFER
|
||||||
rboColorId); // 4. rbo ID
|
_rbo_color); // 4. rbo ID
|
||||||
|
|
||||||
// attach depthbuffer image to FBO
|
// attach depthbuffer image to FBO
|
||||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, // 1. fbo target: GL_FRAMEBUFFER
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, // 1. fbo target: GL_FRAMEBUFFER
|
||||||
GL_DEPTH_ATTACHMENT, // 2. depth attachment point
|
GL_DEPTH_ATTACHMENT, // 2. depth attachment point
|
||||||
GL_RENDERBUFFER, // 3. rbo target: GL_RENDERBUFFER
|
GL_RENDERBUFFER, // 3. rbo target: GL_RENDERBUFFER
|
||||||
rboDepthId); // 4. rbo ID
|
_rbo_depth); // 4. rbo ID
|
||||||
|
|
||||||
// check FBO status
|
// check FBO status
|
||||||
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// reset
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
|
|
||||||
|
|
||||||
tr.setup();
|
tr.setup();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pipeline::impl::draw()
|
void pipeline::impl::draw()
|
||||||
{
|
{
|
||||||
|
|
||||||
glBindBuffer(GL_DRAW_FRAMEBUFFER, _fbo_draw);
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo_msaa);
|
||||||
|
|
||||||
glClearColor(1,0,0,1);
|
glClearColor(1,0,0,1);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
@ -186,11 +193,13 @@ void pipeline::impl::draw()
|
||||||
tr.draw();
|
tr.draw();
|
||||||
|
|
||||||
// reset
|
// reset
|
||||||
glBindBuffer(GL_DRAW_FRAMEBUFFER, 0);
|
|
||||||
|
|
||||||
|
|
||||||
// actuall blitting
|
// actuall blitting
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
/* We are going to blit into the window (default framebuffer) */
|
/* We are going to blit into the window (default framebuffer) */
|
||||||
glBindFramebuffer (GL_DRAW_FRAMEBUFFER, 0);
|
glBindFramebuffer (GL_DRAW_FRAMEBUFFER, 0);
|
||||||
glDrawBuffer (GL_BACK); /* Use backbuffer as color dst. */
|
glDrawBuffer (GL_BACK); /* Use backbuffer as color dst. */
|
||||||
|
@ -203,7 +212,40 @@ void pipeline::impl::draw()
|
||||||
glBlitFramebuffer (0,0, _size.width, _size.height,
|
glBlitFramebuffer (0,0, _size.width, _size.height,
|
||||||
0,0, _size.width, _size.height,
|
0,0, _size.width, _size.height,
|
||||||
GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
|
GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
|
||||||
GL_LINEAR);
|
GL_NEAREST);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
|
||||||
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, _fbo_msaa); // src FBO (multi-sample)
|
||||||
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo_draw); // dst FBO (single-sample)
|
||||||
|
|
||||||
|
glBlitFramebuffer(0, 0, _size.width, _size.height, // src rect
|
||||||
|
0, 0, _size.width, _size.height, // dst rect
|
||||||
|
GL_COLOR_BUFFER_BIT, // buffer mask
|
||||||
|
GL_LINEAR); // scale filter
|
||||||
|
|
||||||
|
debug::d() << _size.width << "x" << _size.height;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
GLenum err;
|
||||||
|
while((err = glGetError()) != GL_NO_ERROR)
|
||||||
|
{
|
||||||
|
std::string error;
|
||||||
|
|
||||||
|
switch(err) {
|
||||||
|
case GL_INVALID_OPERATION: error="INVALID_OPERATION"; break;
|
||||||
|
case GL_INVALID_ENUM: error="INVALID_ENUM"; break;
|
||||||
|
case GL_INVALID_VALUE: error="INVALID_VALUE"; break;
|
||||||
|
case GL_OUT_OF_MEMORY: error="OUT_OF_MEMORY"; break;
|
||||||
|
case GL_INVALID_FRAMEBUFFER_OPERATION: error="INVALID_FRAMEBUFFER_OPERATION"; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
debug::e() << "OpenGL error:" << err << " " << error;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
#include "pw/visual/shader.hpp"
|
#include "pw/visual/shader.hpp"
|
||||||
#include "pw/core/debug.hpp"
|
#include "pw/core/debug.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include "glad/glad.h"
|
#include "glad/glad.h"
|
||||||
|
|
||||||
namespace pw {
|
namespace pw {
|
||||||
|
@ -91,7 +89,7 @@ struct shader::impl
|
||||||
glAttachShader(_shader_program,s);
|
glAttachShader(_shader_program,s);
|
||||||
|
|
||||||
|
|
||||||
// attribute binding ...
|
// TODO attribute binding ...
|
||||||
|
|
||||||
/* Bind attribute index 0 (coordinates) to in_Position and attribute index 1 (color) to in_Color */
|
/* Bind attribute index 0 (coordinates) to in_Position and attribute index 1 (color) to in_Color */
|
||||||
/* Attribute locations must be setup before calling glLinkProgram. */
|
/* Attribute locations must be setup before calling glLinkProgram. */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue