Files
geant4/source/analysis/g4tools/include/tools/sg/mnmx
T
2017-12-08 12:52:30 +01:00

107 lines
2.7 KiB
Plaintext

// Copyright (C) 2010, Guy Barrand. All rights reserved.
// See the file tools.license for terms.
#ifndef tools_sg_mnmx
#define tools_sg_mnmx
#include "node"
#include "bbox_action"
namespace tools {
inline bool mnmx(std::ostream& a_out,sg::node& a_node,vec3f& a_mn,vec3f& a_mx){
sg::bbox_action action(a_out);
a_node.bbox(action);
if(!action.end() || action.box().is_empty()) {
a_out << "tools::mnmx :"
<< " bbox problem."
<< std::endl;
a_mn.set_value(0,0,0);
a_mx.set_value(0,0,0);
return false;
}
a_mn = action.box().mn();
a_mx = action.box().mx();
return true;
}
}
#include "matrix"
namespace tools {
inline bool center_adjust(std::ostream& a_out,
sg::node& a_node,sg::matrix& a_tsf,
unsigned int a_ww,unsigned int a_wh,
float a_height,
float& a_dx,float& a_dy,float& a_dz,
bool a_verbose = true) {
//NOTE : we assume an ortho camera.
if(!a_ww||!a_wh) {
if(a_verbose) {
a_out << "tools::center_adjust :"
<< " null viewer width or height."
<< std::endl;
}
a_dx = 0;a_dy = 0;a_dz = 0;
return false;
}
sg::bbox_action _action(a_out);
a_node.bbox(_action);
if(!_action.box().get_size(a_dx,a_dy,a_dz)) {
if(a_verbose) {
a_out << "tools::center_adjust :"
<< " empty box."
<< std::endl;
}
a_dx = 0;a_dy = 0;a_dz = 0;
return false;
}
if(!a_dx||!a_dy) {
if(a_verbose) {
a_out << "tools::center_adjust :"
<< " dx or dy null."
<< std::endl;
}
a_dx = 0;a_dy = 0;a_dz = 0;
return false;
}
vec3f c;
if(!_action.box().center(c)) {
if(a_verbose) {
a_out << "tools::center_adjust :"
<< " can't get box center."
<< std::endl;
}
a_dx = 0;a_dy = 0;a_dz = 0;
return false;
}
float vp_aspect = float(a_ww)/float(a_wh);
float scene_aspect = float(a_dx)/float(a_dy);
//::printf("debug : set_tsf : %d %d : %g %g %g : %g %g\n",
// a_ww,a_wh,a_dx,a_dy,a_dz,vp_aspect,scene_aspect);
float scale;
if(vp_aspect>=scene_aspect) {
scale = a_height/a_dy;
} else {
scale = (vp_aspect*a_height)/a_dx;
}
a_tsf.set_scale(scale,scale,scale);
a_tsf.mul_translate(-c.x(),-c.y(),0);
return true;
}
inline bool center_adjust(std::ostream& a_out,
sg::node& a_node,sg::matrix& a_tsf,
unsigned int a_ww,unsigned int a_wh,
float a_height,bool a_verbose = true) {
float dx,dy,dz;
return center_adjust(a_out,a_node,a_tsf,a_ww,a_wh,a_height,
dx,dy,dz,a_verbose);
}
}
#endif