Files
2025-12-05 08:54:02 +01:00

88 lines
1.9 KiB
Plaintext

// Copyright (C) 2010, Guy Barrand. All rights reserved.
// See the file tools.license for terms.
#ifndef tools_sg_nodekit
#define tools_sg_nodekit
#include "pick_action"
#include "group"
namespace tools {
namespace sg {
inline void nodekit_pick(pick_action& a_action,node& a_sg,node* a_node) {
if(a_action.stop_at_first()){
a_sg.pick(a_action);
if(a_action.done()) {
a_action.set_node(a_node);
a_action.save_state(a_action.state());
}
} else {
// have a local pick_action to override node in the found pick list.
pick_action action(a_action);
a_sg.pick(action);
typedef pick_action::pick_t pick_t;
const std::vector<pick_t>& pks = action.picks();
std::vector<pick_t>::const_iterator it;
for(it=pks.begin();it!=pks.end();++it) {
a_action.add_pick(*a_node,(*it).zs(),(*it).ws(),(*it).state());
}
}
}
}}
#include "render_action"
#include "bbox_action"
namespace tools {
namespace sg {
class nodekit : public node {
TOOLS_HEADER(nodekit,tools::sg::nodekit,node)
public:
virtual void update_sg(std::ostream&) = 0;
public:
virtual void render(render_action& a_action) {
update_if_touched(a_action.out());
m_group.render(a_action);
}
virtual void search(search_action& a_action) {
update_if_touched(a_action.out());
parent::search(a_action);
if(a_action.done()) return;
m_group.search(a_action);
}
virtual void bbox(bbox_action& a_action) {
update_if_touched(a_action.out());
m_group.bbox(a_action);
}
public:
nodekit()
:parent()
{}
virtual ~nodekit(){}
public:
nodekit(const nodekit& a_from)
:parent(a_from)
{}
nodekit& operator=(const nodekit& a_from){
parent::operator=(a_from);
return *this;
}
protected:
void update_if_touched(std::ostream& a_out) {
if(touched()) {
update_sg(a_out);
reset_touched();
}
}
protected:
group m_group;
};
}}
#endif