#include "renderable.h"
#include "renderer.h"
#include "resourcemanager.h"
+#include "resources.h"
#include "sampler.h"
#include "texture.h"
#include "vertexarray.h"
namespace Msp {
namespace GL {
-Renderer::Renderer()
+Renderer::Renderer():
+ placeholder_texture(Resources::get_global().get<Texture>("_placeholder.png"))
{
state_stack.reserve(16);
shdata_stack.reserve(32);
State &state = get_state();
if(tex)
+ {
if(ResourceManager *res_mgr = tex->get_manager())
res_mgr->resource_used(*tex);
+ if(!tex->is_loaded())
+ tex = &placeholder_texture;
+ }
if(texture_stack.size()>state.texture_count)
{
void Renderer::clear(const ClearValue *values)
{
- const State &state = get_state();
-
- pipeline_state.set_framebuffer(state.framebuffer);
- pipeline_state.set_viewport(state.viewport);
- pipeline_state.set_scissor(state.scissor);
+ apply_framebuffer();
commands.use_pipeline(&pipeline_state);
commands.clear(values);
}
commands.end_query(pool, index);
}
+void Renderer::apply_framebuffer()
+{
+ const State &state = get_state();
+
+ pipeline_state.set_framebuffer(state.framebuffer);
+ static const Rect default_rect = Rect::max();
+ pipeline_state.set_viewport(state.viewport ? *state.viewport : default_rect);
+ pipeline_state.set_scissor(state.scissor ? *state.scissor : default_rect);
+}
+
void Renderer::apply_state()
{
const State &state = get_state();
if(!state.shprog)
throw invalid_operation("Renderer::apply_state");
- pipeline_state.set_framebuffer(state.framebuffer);
- pipeline_state.set_viewport(state.viewport);
- pipeline_state.set_scissor(state.scissor);
+ apply_framebuffer();
bool shprog_changed = (state.shprog!=pipeline_state.get_shader_program());
pipeline_state.set_shader_program(state.shprog);
pipeline_state.set_texture(t.binding, t.texture, t.level, t.sampler);
}
- pipeline_state.set_depth_test(state.depth_test);
- pipeline_state.set_stencil_test(state.stencil_test);
- pipeline_state.set_blend(state.blend);
+ static const DepthTest default_depth_test;
+ pipeline_state.set_depth_test(state.depth_test ? *state.depth_test : default_depth_test);
+ static const StencilTest default_stencil_test;
+ pipeline_state.set_stencil_test(state.stencil_test ? *state.stencil_test : default_stencil_test);
+ static const Blend default_blend;
+ pipeline_state.set_blend(state.blend ? *state.blend : default_blend);
}