| 40 | class wayfire_cube : public wf::per_output_plugin_instance_t, public wf::pointer_interaction_t |
| 41 | { |
| 42 | class cube_render_node_t : public wf::scene::node_t |
| 43 | { |
| 44 | class cube_render_instance_t : public wf::scene::render_instance_t |
| 45 | { |
| 46 | std::shared_ptr<cube_render_node_t> self; |
| 47 | wf::scene::damage_callback push_damage; |
| 48 | |
| 49 | std::vector<std::vector<wf::scene::render_instance_uptr>> ws_instances; |
| 50 | std::vector<wf::region_t> ws_damage; |
| 51 | std::vector<wf::auxilliary_buffer_t> framebuffers; |
| 52 | |
| 53 | wf::signal::connection_t<wf::scene::node_damage_signal> on_cube_damage = |
| 54 | [=] (wf::scene::node_damage_signal *ev) |
| 55 | { |
| 56 | push_damage(ev->region); |
| 57 | }; |
| 58 | |
| 59 | public: |
| 60 | cube_render_instance_t(cube_render_node_t *self, wf::scene::damage_callback push_damage) |
| 61 | { |
| 62 | this->self = std::dynamic_pointer_cast<cube_render_node_t>(self->shared_from_this()); |
| 63 | this->push_damage = push_damage; |
| 64 | self->connect(&on_cube_damage); |
| 65 | |
| 66 | ws_damage.resize(self->workspaces.size()); |
| 67 | framebuffers.resize(self->workspaces.size()); |
| 68 | ws_instances.resize(self->workspaces.size()); |
| 69 | for (int i = 0; i < (int)self->workspaces.size(); i++) |
| 70 | { |
| 71 | auto push_damage_child = [=] (const wf::region_t& damage) |
| 72 | { |
| 73 | ws_damage[i] |= damage; |
| 74 | push_damage(self->get_bounding_box()); |
| 75 | }; |
| 76 | |
| 77 | self->workspaces[i]->gen_render_instances(ws_instances[i], |
| 78 | push_damage_child, self->cube->output); |
| 79 | |
| 80 | ws_damage[i] |= self->workspaces[i]->get_bounding_box(); |
| 81 | } |
| 82 | } |
| 83 | |
| 84 | ~cube_render_instance_t() |
| 85 | {} |
| 86 | |
| 87 | void schedule_instructions( |
| 88 | std::vector<wf::scene::render_instruction_t>& instructions, |
| 89 | const wf::render_target_t& target, wf::region_t& damage) override |
| 90 | { |
| 91 | instructions.push_back(wf::scene::render_instruction_t{ |
| 92 | .instance = this, |
| 93 | .target = target.translated(-wf::origin(self->get_bounding_box())), |
| 94 | .damage = damage & self->get_bounding_box(), |
| 95 | }); |
| 96 | |
| 97 | auto bbox = self->get_bounding_box(); |
| 98 | |
| 99 | damage ^= bbox; |
nothing calls this directly
no outgoing calls
no test coverage detected