43#include <ACG/GL/acg_glew.hh>
44#include "ToonRenderer.hh"
48#include <ACG/GL/ShaderCache.hh>
49#include <ACG/GL/ScreenQuad.hh>
50#include <ACG/GL/GLError.hh>
54#define CELSHADING_INCLUDE_FILE "ToonRenderer/celshading.glsl"
55#define OUTLINE_VERTEXSHADER_FILE "ToonRenderer/screenquad.glsl"
56#define OUTLINE_FRAGMENTSHADER_FILE "ToonRenderer/outline.glsl"
67 _shader->
addUniform(
"float g_celPaletteSize",
"//number of palettes/intensity levels for cel shading");
83 _shader->
addUniform(
"float g_celPaletteSize",
"//number of palettes/intensity levels for cel shading");
88 _code->push_back(
"outDepth = gl_FragCoord.z;");
100 case ACG::SG_LIGHT_DIRECTIONAL:
101 buf = QString(
"sg_cColor.xyz += LitDirLight_Cel(sg_vPosVS.xyz, sg_vNormalVS, g_vLightDir_%1, g_cLightAmbient_%2, g_cLightDiffuse_%3, g_cLightSpecular_%4, g_celPaletteSize);").arg(_lightId).arg(_lightId).arg(_lightId).arg(_lightId);
104 case ACG::SG_LIGHT_POINT:
105 buf = QString(
"sg_cColor.xyz += LitPointLight_Cel(sg_vPosVS.xyz, sg_vNormalVS, g_vLightPos_%1, g_cLightAmbient_%2, g_cLightDiffuse_%3, g_cLightSpecular_%4, g_vLightAtten_%5, g_celPaletteSize);").arg(_lightId).arg(_lightId).arg(_lightId).arg(_lightId).arg(_lightId);
108 case ACG::SG_LIGHT_SPOT:
109 buf = QString(
"sg_cColor.xyz += LitSpotLight_Cel(sg_vPosVS.xyz, sg_vNormalVS, g_vLightPos_%1, g_vLightDir_%2, g_cLightAmbient_%3, g_cLightDiffuse_%4, g_cLightSpecular_%5, g_vLightAtten_%6, g_vLightAngleExp_%7, g_celPaletteSize);").arg(_lightId).arg(_lightId).arg(_lightId).arg(_lightId).arg(_lightId).arg(_lightId).arg(_lightId);
115 _code->push_back(buf);
127ToonRenderer::ToonRenderer()
128 : progOutline_(0), paletteSize_(2.0f), outlineCol_(0.0f, 0.0f, 0.0f)
134ToonRenderer::~ToonRenderer() {
137QString ToonRenderer::checkOpenGL() {
139 return QString(
"Insufficient OpenGL Version! OpenGL 3.2 or higher required");
147 missing +=
"GL_ARB_vertex_buffer_object extension missing\n";
153 missing +=
"GL_ARB_vertex_program extension missing\n";
159void ToonRenderer::initializePlugin() {
162void ToonRenderer::exit() {
170 std::vector<ACG::ShaderModifier*> modifiers;
171 modifiers.push_back(&CelShadingModifier::instance);
194 glColorMask(1,1,1,1);
197 viewRes->scene_->bind();
202 glDrawBuffer(GL_COLOR_ATTACHMENT1);
203 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
204 glClear(GL_COLOR_BUFFER_BIT);
207 glDrawBuffer(GL_COLOR_ATTACHMENT0);
209 glClearColor(clearColor[0], clearColor[1], clearColor[2], 1.0f);
210 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
214 GLenum colorDepthTarget[2] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
215 glDrawBuffers(2, colorDepthTarget);
241 viewRes->scene_->unbind();
255 glColorMask(1,1,1,1);
261 glEnable(GL_DEPTH_TEST);
262 glDepthFunc(GL_ALWAYS);
273 glActiveTexture(GL_TEXTURE1);
274 glBindTexture(GL_TEXTURE_2D, viewRes->scene_->getAttachment(GL_COLOR_ATTACHMENT1));
276 glActiveTexture(GL_TEXTURE0);
277 glBindTexture(GL_TEXTURE_2D, viewRes->scene_->getAttachment(GL_COLOR_ATTACHMENT0));
285 glDepthFunc(GL_LESS);
297 QAction * action =
new QAction(
"Toon Renderer Options" ,
this );
299 connect(action,SIGNAL(triggered(
bool )),
this,SLOT(actionDialog(
bool )));
304void ToonRenderer::paletteSizeChanged(
int _val ) {
308void ToonRenderer::outlineColorChanged( QColor _col ) {
314void ToonRenderer::ViewerResources::resize(
int _newWidth,
int _newHeight ) {
315 if (!_newHeight || !_newWidth)
return;
324 scene_->
attachTexture2D(GL_COLOR_ATTACHMENT0, _newWidth, _newHeight, GL_RGBA, GL_RGBA);
325 scene_->
attachTexture2D(GL_COLOR_ATTACHMENT1, _newWidth, _newHeight, GL_R32F, GL_RED);
329 if (scene_->
height() == _newHeight &&
330 scene_->
width() == _newWidth)
333 scene_->
resize(_newWidth, _newHeight);
void resize(GLsizei _width, GLsizei _height, bool _forceResize=false)
resize function (if textures created by this class)
GLsizei width() const
get width of fbo texture
GLsizei height() const
get height of fbo texture
void attachTexture2D(GLenum _attachment, GLsizei _width, GLsizei _height, GLuint _internalFmt, GLenum _format, GLint _wrapMode=GL_CLAMP_TO_EDGE, GLint _minFilter=GL_NEAREST, GLint _magFilter=GL_NEAREST)
function to attach a texture to fbo
void init()
function to generate the framebuffer object
void attachTexture2DDepth(GLsizei _width, GLsizei _height, GLuint _internalFmt=GL_DEPTH_COMPONENT32, GLenum _format=GL_DEPTH_COMPONENT)
function to attach a depth-buffer texture to fbo (using GL_DEPTH_ATTACHMENT)
double far_plane() const
get far clipping distance
int viewport_width() const
get viewport width
int viewport_height() const
get viewport height
double near_plane() const
get near clipping distance
std::vector< ACG::RenderObject * > sortedObjects_
sorted list of renderobjects without overlay objects (sorted in rendering order)
int getNumRenderObjects() const
Get the number of collected render objects (not including overlay objects or gl4.2 line objects)
virtual void renderObject(ACG::RenderObject *_obj, GLSL::Program *_prog=0, bool _constRenderStates=false, const std::vector< unsigned int > *_shaderModifiers=0)
Render one renderobject.
virtual void finishRenderingPipeline(bool _drawOverlay=true)
Draw overlay objects and reset OpenGL state.
virtual void prepareRenderingPipeline(ACG::GLState *_glState, ACG::SceneGraph::DrawModes::DrawMode _drawMode, ACG::SceneGraph::BaseNode *_scenegraphRoot)
Prepares renderer and OpenGL for any draw-related calls including.
virtual QString dumpCurrentRenderObjectsToString(ACG::RenderObject **_list=0, bool _outputShaders=false, std::vector< ACG::ShaderModifier * > *_modifiers=0)
Outputs the current render objects to the string.
virtual void restoreInputFbo()
Restore the previously saved input Fbo configuration (fbo id + viewport)
static void draw(GLSL::Program *_prog=0)
Draw the screen quad.
static ShaderCache * getInstance()
Return instance of the ShaderCache singleton.
GLSL::Program * getProgram(const ShaderGenDesc *_desc, const std::vector< unsigned int > &_mods)
Query a dynamically generated program from cache.
void addOutput(const QString &_output)
Add one GLSL output specifier.
void addUniform(QString _uniform, QString _comment="")
Add one GLSL uniform specifier.
void addIncludeFile(QString _fileName)
Imports another shader, same as #include.
static QString getShaderDir()
static unsigned int registerModifier(ShaderModifier *_modifier)
Shader modifiers have to be registered before they can be used. They also must remain allocated for t...
void modifyLightingCode(QStringList *_code, int _lightId, ACG::ShaderGenLightType _lightType)
Modify the default lighting code of the shader generator.
bool replaceDefaultLightingCode()
Specify whether this modifier replaces or extends the default lighting code.
void modifyFragmentEndCode(QStringList *_code)
Append code the the fragment shader.
void modifyFragmentIO(ACG::ShaderGenerator *_shader)
Add your own inputs/outputs to the fragment shader.
void modifyVertexIO(ACG::ShaderGenerator *_shader)
Add your own inputs/outputs to the vertex shader.
int getFragDataLocation(const char *_name)
Get location of the fragment data output.
void disable()
Resets to standard rendering pipeline.
void link()
Links the shader objects to the program.
void use()
Enables the program object for using.
void setUniform(const char *_name, GLint _value)
Set int uniform to specified value.
void bindFragDataLocation(unsigned int _index, const char *_name)
Bind fragment output data to name.
QString renderObjectsInfo(bool _outputShaderInfo)
Return a qstring of the current render objects.
QAction * optionsAction()
Return options menu.
GLSL::Program * progOutline_
outline shader: multiply scene color with edge factor derived from edges in depth buffer
std::map< int, ViewerResources > viewerRes_
float paletteSize_
size of cel shading palette
ACG::Vec3f outlineCol_
outline color
int viewerId()
Get the id of the viewer this viewerproperties belongs to.
ACG::Vec4f backgroundColor()
Get current background color.
void drawMode(ACG::SceneGraph::DrawModes::DrawMode _mode)
set draw mode (No test if this mode is available!)
bool checkExtensionSupported(const std::string &_extension)
bool openGLVersion(const int _major, const int _minor, bool _verbose)
GLSL::PtrProgram loadProgram(const char *vertexShaderFile, const char *tessControlShaderFile, const char *tessEvaluationShaderFile, const char *geometryShaderFile, const char *fragmentShaderFile, const GLSL::StringList *macros, bool verbose)
ACG::SceneGraph::BaseNode * getSceneGraphRootNode()
get scenegraph root node