Warning, /include/Geant4/tools/sg/back_area is written in an unsupported language. File is not indexed.
0001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
0002 // See the file tools.license for terms.
0003
0004 #ifndef tools_sg_back_area
0005 #define tools_sg_back_area
0006
0007 #include "node"
0008 #include "atb_vertices"
0009 #include "rgba"
0010 #include "draw_style"
0011 #include "../mathf"
0012
0013 #include "separator"
0014 #include "normal"
0015
0016 namespace tools {
0017 namespace sg {
0018
0019 class back_area : public node {
0020 TOOLS_NODE(back_area,tools::sg::back_area,node)
0021 public:
0022 static unsigned int corner_top_right() {return 1<<0;}
0023 static unsigned int corner_top_left() {return 1<<1;}
0024 static unsigned int corner_bottom_right() {return 1<<2;}
0025 static unsigned int corner_bottom_left() {return 1<<3;}
0026 static unsigned int corner_all() {
0027 return corner_top_right()|corner_top_left()|corner_bottom_right()|corner_bottom_left();
0028 }
0029 public:
0030 sf<float> width;
0031 sf<float> height;
0032
0033 sf_vec<colorf,float> color;
0034
0035 sf<bool> gradient;
0036 sf_vec<colorf,float> color_top;
0037
0038 sf<bool> border_visible;
0039 sf_vec<colorf,float> border_color;
0040 sf<float> border_line_width;
0041
0042 sf<float> shadow; //in percent of width.
0043
0044 sf<float> corner_radius; //percent of height.
0045 sf<unsigned int> corner_steps;
0046 sf<unsigned int> corner_mask;
0047 public:
0048 virtual const desc_fields& node_desc_fields() const {
0049 TOOLS_FIELD_DESC_NODE_CLASS(tools::sg::back_area)
0050 static const desc_fields s_v(parent::node_desc_fields(),12, //WARNING : take care of count.
0051 TOOLS_ARG_FIELD_DESC(width),
0052 TOOLS_ARG_FIELD_DESC(height),
0053 TOOLS_ARG_FIELD_DESC(color),
0054 TOOLS_ARG_FIELD_DESC(gradient),
0055 TOOLS_ARG_FIELD_DESC(color_top),
0056 TOOLS_ARG_FIELD_DESC(border_visible),
0057 TOOLS_ARG_FIELD_DESC(border_color),
0058 TOOLS_ARG_FIELD_DESC(border_line_width),
0059 TOOLS_ARG_FIELD_DESC(shadow),
0060 TOOLS_ARG_FIELD_DESC(corner_radius),
0061 TOOLS_ARG_FIELD_DESC(corner_steps),
0062 TOOLS_ARG_FIELD_DESC(corner_mask)
0063 );
0064 return s_v;
0065 }
0066 private:
0067 void add_fields(){
0068 add_field(&width);
0069 add_field(&height);
0070
0071 add_field(&color);
0072 add_field(&gradient);
0073 add_field(&color_top);
0074 add_field(&border_visible);
0075 add_field(&border_color);
0076 add_field(&border_line_width);
0077
0078 add_field(&shadow);
0079
0080 add_field(&corner_radius);
0081 add_field(&corner_steps);
0082 add_field(&corner_mask);
0083 }
0084 public:
0085 virtual void render(render_action& a_action) {
0086 if(touched()) {
0087 update_sg();
0088 reset_touched();
0089 }
0090 m_back_sep.render(a_action);
0091 }
0092 virtual void search(search_action& a_action) {
0093 if(touched()) {
0094 update_sg();
0095 reset_touched();
0096 }
0097 parent::search(a_action);
0098 if(a_action.done()) return;
0099 m_back_sep.search(a_action);
0100 if(a_action.done()) return;
0101 }
0102 virtual void pick(pick_action& a_action) {
0103 if(touched()) {
0104 update_sg();
0105 reset_touched();
0106 }
0107 m_back_sep.pick(a_action);
0108 }
0109 public:
0110 back_area()
0111 :parent()
0112 ,width(1)
0113 ,height(1)
0114 ,color(colorf_white())
0115 ,gradient(false)
0116 ,color_top(colorf_white())
0117 ,border_visible(true)
0118 ,border_color(colorf_black())
0119 ,border_line_width(1)
0120 ,shadow(0)
0121 ,corner_radius(0) //in percent of the height.
0122 ,corner_steps(12)
0123 ,corner_mask(corner_all())
0124 {
0125 add_fields();
0126 }
0127 virtual ~back_area(){}
0128 public:
0129 back_area(const back_area& a_from)
0130 :parent(a_from)
0131 ,width(a_from.width)
0132 ,height(a_from.height)
0133 ,color(a_from.color)
0134 ,gradient(a_from.gradient)
0135 ,color_top(a_from.color_top)
0136 ,border_visible(a_from.border_visible)
0137 ,border_color(a_from.border_color)
0138 ,border_line_width(a_from.border_line_width)
0139 ,shadow(a_from.shadow)
0140 ,corner_radius(a_from.corner_radius)
0141 ,corner_steps(a_from.corner_steps)
0142 ,corner_mask(a_from.corner_mask)
0143 {
0144 add_fields();
0145 }
0146 back_area& operator=(const back_area& a_from){
0147 parent::operator=(a_from);
0148 width = a_from.width;
0149 height = a_from.height;
0150 color = a_from.color;
0151 gradient = a_from.gradient;
0152 color_top = a_from.color_top;
0153 border_visible = a_from.border_visible;
0154 border_color = a_from.border_color;
0155 border_line_width = a_from.border_line_width;
0156 shadow = a_from.shadow;
0157 corner_radius = a_from.corner_radius;
0158 corner_steps = a_from.corner_steps;
0159 corner_mask = a_from.corner_mask;
0160 return *this;
0161 }
0162 protected:
0163 void update_sg() {
0164 m_back_sep.clear();
0165
0166 if(width.value()<=0) return;
0167 if(height.value()<=0) return;
0168
0169 float xb = -width*0.5f;
0170 float xe = width*0.5f;
0171 float yb = -height*0.5f;
0172
0173 float zshadow = -0.005f; //ok with gopaw and ROOT_default.
0174 float zback = 0;
0175 float zborder = 0.01f;
0176
0177 if(shadow.value()) {
0178 float zz = zback+zshadow;
0179 float ye = height*0.5f;
0180
0181 sg::rgba* mat = new sg::rgba();
0182 mat->color = colorf_black();
0183 m_back_sep.add(mat);
0184
0185 normal* nm = new normal;
0186 //nm->vec.value(); //default is z. ok.
0187 m_back_sep.add(nm);
0188
0189 vertices* vtxs = new vertices;
0190 vtxs->mode = gl::triangle_fan();
0191 m_back_sep.add(vtxs);
0192
0193 float dx = width*shadow;
0194 float dy = -dx;
0195 vtxs->add(xb+dx,yb+dy,zz);
0196 vtxs->add(xe+dx,yb+dy,zz);
0197 vtxs->add(xe+dx,ye+dy,zz);
0198 vtxs->add(xb+dx,ye+dy,zz);
0199 }
0200
0201 {//background :
0202 normal* nm = new normal;
0203 //nm->vec.value(); //default is z. ok.
0204 m_back_sep.add(nm);
0205
0206 if(gradient.value()) {
0207 //color gradient from (bottom,color) to (top,color_top)
0208
0209 atb_vertices* vtxs = new atb_vertices;
0210 vtxs->mode = gl::triangle_strip();
0211 m_back_sep.add(vtxs);
0212
0213 float zz = zback;
0214
0215 unsigned int ncol = 50;
0216 float dy = height/ncol;
0217 float ye = yb+dy;
0218
0219 colorf col_beg = color.value();
0220 colorf col_end = color_top.value();
0221
0222 float dr = (col_end.r()-col_beg.r())/ncol;
0223 float dg = (col_end.g()-col_beg.g())/ncol;
0224 float db = (col_end.b()-col_beg.b())/ncol;
0225 float da = (col_end.a()-col_beg.a())/ncol;
0226 vec4f dcol(dr,dg,db,da);
0227
0228 colorf col = col_beg;
0229
0230 vtxs->add(xb,yb,zz);
0231 vtxs->add_color(col);
0232
0233 vtxs->add(xe,yb,zz);
0234 vtxs->add_color(col);
0235
0236 for(unsigned int index=0;index<ncol;index++) {
0237 vtxs->add(xb,ye,zz);
0238 vtxs->add(xe,ye,zz);
0239
0240 vtxs->add_color(col);
0241 vtxs->add_color(col);
0242
0243 ye += dy;
0244 col += dcol;
0245 }
0246
0247 } else {
0248
0249 float zz = zback;
0250 float ye = height*0.5f;
0251
0252 sg::rgba* mat = new sg::rgba();
0253 mat->color = color;
0254 m_back_sep.add(mat);
0255
0256 vertices* vtxs = new vertices;
0257 vtxs->mode = gl::triangle_fan();
0258 m_back_sep.add(vtxs);
0259
0260 float r = height*corner_radius;
0261 if((r>(0.5f*height.value()))||(r>(0.5f*width.value()))) r = 0;
0262
0263 if((r>0) && corner_steps.value()) {
0264 float dangle = fhalf_pi()/float(corner_steps);
0265 unsigned int nslice = corner_steps;
0266
0267 vtxs->add(0,0,zz);
0268 vtxs->add(xe,yb+r,zz);
0269 vtxs->add(xe,ye-r,zz);
0270
0271 // top-right :
0272 float angle = dangle;
0273 if(corner_mask.value() & corner_top_right()) {
0274 float xc = xe-r;
0275 float yc = ye-r;
0276 for(unsigned int i=0;i<nslice;i++,angle+=dangle) {
0277 vtxs->add(r*fcos(angle)+xc,r*fsin(angle)+yc,zz);
0278 }
0279 } else {
0280 angle += fhalf_pi();
0281 vtxs->add(xe,ye,zz);
0282 vtxs->add(xe-r,ye,zz);
0283 }
0284
0285 vtxs->add(xb+r,ye,zz);
0286
0287 // top-left :
0288 if(corner_mask.value() & corner_top_left()) {
0289 float xc = xb+r;
0290 float yc = ye-r;
0291 for(unsigned int i=0;i<nslice;i++,angle+=dangle) {
0292 vtxs->add(r*fcos(angle)+xc,r*fsin(angle)+yc,zz);
0293 }
0294 } else {
0295 angle += fhalf_pi();
0296 vtxs->add(xb,ye,zz);
0297 vtxs->add(xb,ye-r,zz);
0298 }
0299
0300 vtxs->add(xb,yb+r,zz);
0301
0302 // bottom-left :
0303 if(corner_mask.value() & corner_bottom_left()) {
0304 float xc = xb+r;
0305 float yc = yb+r;
0306 for(unsigned int i=0;i<nslice;i++,angle+=dangle) {
0307 vtxs->add(r*fcos(angle)+xc,r*fsin(angle)+yc,zz);
0308 }
0309 } else {
0310 angle += fhalf_pi();
0311 vtxs->add(xb,yb,zz);
0312 vtxs->add(xb+r,yb,zz);
0313 }
0314
0315 vtxs->add(xe-r,yb,zz);
0316
0317 // bottom-right :
0318 if(corner_mask.value() & corner_bottom_right()) {
0319 float xc = xe-r;
0320 float yc = yb+r;
0321 for(unsigned int i=0;i<nslice;i++,angle+=dangle) {
0322 vtxs->add(r*fcos(angle)+xc,r*fsin(angle)+yc,zz);
0323 }
0324 } else {
0325 angle += fhalf_pi();
0326 vtxs->add(xe,yb,zz);
0327 vtxs->add(xe,yb+r,zz);
0328 }
0329
0330 } else {
0331 vtxs->add(xb,yb,zz);
0332 vtxs->add(xe,yb,zz);
0333 vtxs->add(xe,ye,zz);
0334 vtxs->add(xb,ye,zz);
0335 }
0336
0337 }}
0338
0339 if(border_visible.value()){
0340 float zz = zborder;
0341 float ye = height*0.5f;
0342
0343 sg::rgba* mat = new sg::rgba();
0344 mat->color = border_color;
0345 m_back_sep.add(mat);
0346
0347 draw_style* ds = new draw_style;
0348 ds->style = draw_lines;
0349 ds->line_width = border_line_width;
0350 m_back_sep.add(ds);
0351
0352 vertices* vtxs = new vertices;
0353 vtxs->mode = gl::line_strip();
0354 m_back_sep.add(vtxs);
0355
0356 float r = height*corner_radius;
0357 if((r>(0.5f*height.value()))||(r>(0.5f*width.value()))) r = 0;
0358
0359 if((r>0) && corner_steps.value()) {
0360 float dangle = fhalf_pi()/float(corner_steps);
0361 unsigned int nslice = corner_steps;
0362
0363 vtxs->add(xe,yb+r,zz);
0364 vtxs->add(xe,ye-r,zz);
0365
0366 // top-right :
0367 float angle = dangle;
0368 if(corner_mask.value() & corner_top_right()) {
0369 float xc = xe-r;
0370 float yc = ye-r;
0371 for(unsigned int i=0;i<nslice;i++,angle+=dangle) {
0372 vtxs->add(r*fcos(angle)+xc,r*fsin(angle)+yc,zz);
0373 }
0374 } else {
0375 angle += fhalf_pi();
0376 vtxs->add(xe,ye,zz);
0377 vtxs->add(xe-r,ye,zz);
0378 }
0379
0380 vtxs->add(xb+r,ye,zz);
0381
0382 // top-left :
0383 if(corner_mask.value() & corner_top_left()) {
0384 float xc = xb+r;
0385 float yc = ye-r;
0386 for(unsigned int i=0;i<nslice;i++,angle+=dangle) {
0387 vtxs->add(r*fcos(angle)+xc,r*fsin(angle)+yc,zz);
0388 }
0389 } else {
0390 angle += fhalf_pi();
0391 vtxs->add(xb,ye,zz);
0392 vtxs->add(xb,ye-r,zz);
0393 }
0394
0395 vtxs->add(xb,yb+r,zz);
0396
0397 // bottom-left :
0398 if(corner_mask.value() & corner_bottom_left()) {
0399 float xc = xb+r;
0400 float yc = yb+r;
0401 for(unsigned int i=0;i<nslice;i++,angle+=dangle) {
0402 vtxs->add(r*fcos(angle)+xc,r*fsin(angle)+yc,zz);
0403 }
0404 } else {
0405 angle += fhalf_pi();
0406 vtxs->add(xb,yb,zz);
0407 vtxs->add(xb+r,yb,zz);
0408 }
0409
0410 vtxs->add(xe-r,yb,zz);
0411
0412 // bottom-right :
0413 if(corner_mask.value() & corner_bottom_right()) {
0414 float xc = xe-r;
0415 float yc = yb+r;
0416 for(unsigned int i=0;i<nslice;i++,angle+=dangle) {
0417 vtxs->add(r*fcos(angle)+xc,r*fsin(angle)+yc,zz);
0418 }
0419 } else {
0420 angle += fhalf_pi();
0421 vtxs->add(xe,yb,zz);
0422 vtxs->add(xe,yb+r,zz);
0423 }
0424
0425 } else {
0426 vtxs->add(xb,yb,zz);
0427 vtxs->add(xe,yb,zz);
0428 vtxs->add(xe,ye,zz);
0429 vtxs->add(xb,ye,zz);
0430 vtxs->add(xb,yb,zz);
0431 }
0432 }
0433
0434 }
0435 protected:
0436 separator m_back_sep;
0437 };
0438
0439 }}
0440
0441 #endif