namespace Msp {
namespace GL {
+const Tag Renderer::world_obj_matrix_tag("world_obj_matrix");
+const Tag Renderer::world_obj_normal_matrix_tag("world_obj_normal_matrix");
+
Renderer::Renderer():
- placeholder_texture(Resources::get_global().get<Texture>("_placeholder.png"))
+ placeholder_texture(Resources::get_global().get<Texture>("_placeholder.png")),
+ default_sampler(Resources::get_global().get<Sampler>("_linear_clamp.samp"))
{
state_stack.reserve(16);
shdata_stack.reserve(32);
RendererBackend::begin();
- add_shader_data(standard_shdata);
commands.begin_frame(frame_index);
}
void Renderer::set_camera(const Camera &c)
{
get_state().camera = &c;
- add_shader_data(c.get_shader_data());
set_matrix(Matrix());
}
res_mgr->resource_used(*tex);
if(!tex->is_loaded())
tex = &placeholder_texture;
+ if(!samp)
+ samp = &default_sampler;
}
+ else
+ samp = 0;
if(texture_stack.size()>state.texture_count)
{
bool shprog_changed = (state.shprog!=ps.get_shader_program());
ps.set_shader_program(state.shprog);
+ bool shdata_changed = changed&SHADER_DATA;
+ for(auto i=shdata_stack.begin(); (!shdata_changed && i!=shdata_stack.end()); ++i)
+ shdata_changed = (i->shdata->get_generation()!=i->generation);
+ bool extra_shdata = (shdata_stack.size()>state.shdata_count);
+
+ if(changed&CAMERA)
+ {
+ shdata_changed = true;
+ changed &= ~CAMERA;
+ }
+
if(changed&MATRIX)
{
- standard_shdata.uniform("world_obj_matrix", state.model_matrix);
- LinAl::SquareMatrix<float, 3> nm = state.model_matrix.block<3, 3>(0, 0);
+ standard_shdata.uniform(world_obj_matrix_tag, state.model_matrix);
+ LinAl::Matrix<float, 3, 3> nm = state.model_matrix.block<3, 3>(0, 0);
nm = transpose(invert(nm));
- standard_shdata.uniform("world_obj_normal_matrix", nm);
+ standard_shdata.uniform(world_obj_normal_matrix_tag, nm);
changed &= ~MATRIX;
+ shdata_changed = true;
}
- bool shdata_changed = changed&SHADER_DATA;
- for(auto i=shdata_stack.begin(); (!shdata_changed && i!=shdata_stack.end()); ++i)
- shdata_changed = (i->shdata->get_generation()!=i->generation);
- bool extra_shdata = (shdata_stack.size()>state.shdata_count);
-
if(shdata_changed || shprog_changed || pipeline_changed || extra_shdata)
{
if(extra_shdata)
shdata_stack.erase(shdata_stack.begin()+state.shdata_count, shdata_stack.end());
+ standard_shdata.apply(*state.shprog, ps, frame_index);
+ if(state.camera)
+ state.camera->get_shader_data().apply(*state.shprog, ps, frame_index);
for(const BoundProgramData &d: shdata_stack)
{
d.shdata->apply(*state.shprog, ps, frame_index);