void scale_along_normal( CGEOMptr &obj, CWpt &scale_cent, CWpt &down_pt, CWvec &down_norm, CXYpt &cur ) { Wtransf xf (obj->xform()); Wpt dpt (xf * down_pt); Wpt spt (xf * scale_cent); Wvec upv ((xf * down_norm).normalized()); if (upv * (dpt - spt) < 0) upv = -upv; if ((cur - XYpt(dpt)).length() < 0.01) return; Wpt npt(Wline(dpt,upv).intersect(cur)); Wpt ctr(xf * scale_cent); double sval(((npt-dpt) * upv) / (dpt-ctr).length()); if ((npt-ctr) * (dpt-ctr) < 0) return; Wvec dnorm (fabs(down_norm[0]),fabs(down_norm[1]), fabs(down_norm[2])); ((GEOMptr)obj)->set_xform(xf * Wtransf::scaling(scale_cent, (dnorm*sval+Wvec(1,1,1)))); }
using mlib::Wpt; using mlib::Wvec; HASH *DATA_ITEM::_hash = 0; DATA_ITEM* (*DATA_ITEM::_decode_unknown)(STDdstream&, Cstr_ptr&, DATA_ITEM*) = 0; const str_ptr NAME_INT ("int"); const str_ptr NAME_DOUBLE ("double"); const str_ptr NAME_VEC3D ("vec3d"); const str_ptr NAME_COLOR ("color"); const str_ptr NAME_POINT3D("point3d"); const str_ptr NAME_STR_PTR("str_ptr"); static int im=DATA_ITEM::add_decoder(NAME(0), new TDI<int>(0), 1); static int dm=DATA_ITEM::add_decoder(NAME(0.0), new TDI<double>(0), 1); static int vm=DATA_ITEM::add_decoder(NAME(Wvec()),new TDI<Wvec>(Wvec(0,1,0)), 1); static int pm=DATA_ITEM::add_decoder(NAME(Wpt()), new TDI<Wpt>(Wpt()), 1); static int sm=DATA_ITEM::add_decoder(NAME(str_ptr()),new TDI<str_ptr>(str_ptr()), 1); // for some odd reason, we can't inline this on the Suns because // it generates link errors when we create subclasses of DATA_ITEM... // the odd thing is it doesn't seem to effect subclasses of DATA_ITEM // that *are* able to define static_name inline... // STAT_STR_RET DATA_ITEM::static_name() { RET_STAT_STR("DATA_ITEM"); } DATA_ITEM::~DATA_ITEM()