texture_stack.reserve(32);
}
-Renderer::~Renderer()
-{
-}
-
void Renderer::begin()
{
if(current_state)
throw invalid_operation("Renderer::begin");
- state_stack.push_back(State());
+ ++frame_index;
+ state_stack.emplace_back();
current_state = &state_stack.back();
+
+ RendererBackend::begin();
+
add_shader_data(standard_shdata);
+ commands.begin_frame(frame_index);
}
void Renderer::end()
if(!current_state || state_stack.size()>1)
throw invalid_operation("Renderer::end");
+ RendererBackend::end();
+
current_state = 0;
state_stack.clear();
texture_stack.clear();
shdata_stack.clear();
-
- commands.use_pipeline(0);
}
void Renderer::push_state()
changed |= MATRIX;
}
-void Renderer::transform(const Matrix &matrix)
-{
- get_state().model_matrix *= matrix;
- changed |= MATRIX;
-}
-
void Renderer::set_framebuffer(const Framebuffer *f)
{
get_state().framebuffer = f;
}
void Renderer::set_texture(Tag tag, const Texture *tex, const Sampler *samp)
+{
+ set_texture(tag, tex, -1, samp);
+}
+
+void Renderer::set_texture(Tag tag, const Texture *tex, int level, const Sampler *samp)
{
State &state = get_state();
break;
}
- texture_stack.push_back(BoundTexture());
+ texture_stack.emplace_back();
BoundTexture &bound_tex = texture_stack.back();
bound_tex.tag = tag;
bound_tex.texture = tex;
bound_tex.sampler = samp;
+ bound_tex.level = level;
state.texture_count = texture_stack.size();
}
{
apply_state();
batch.refresh();
+ pipeline_state.set_primitive_type(batch.get_type());
commands.use_pipeline(&pipeline_state);
commands.draw(batch);
}
{
apply_state();
batch.refresh();
+ pipeline_state.set_primitive_type(batch.get_type());
commands.use_pipeline(&pipeline_state);
commands.draw_instanced(batch, count);
}
if(t.binding<0 || shprog_changed)
t.binding = state.shprog->get_uniform_binding(t.tag);
if(t.binding>=0)
- pipeline_state.set_texture(t.binding, t.texture, t.sampler);
+ pipeline_state.set_texture(t.binding, t.texture, t.level, t.sampler);
}
pipeline_state.set_depth_test(state.depth_test);