예제 #1
0
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))));
}
예제 #2
0
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()