this is how i would lay it out (it’s not tested)
void TimberBoarding_mod::ModifyObject(TimeValue t, ModContext &mc, ObjectState *os, INode *node)
{
Object *obj = os->obj;
if(!obj) return;
Interval iv = FOREVER;
iv &= obj->ChannelValidity(t, GEOM_CHAN_NUM);
iv &= obj->ChannelValidity(t, TOPO_CHAN_NUM);
TimberBoarding_mod_params p;
GetParams(p,t,iv);
if(obj->IsSubClassOf(triObjectClassID)) // Handle any triobject types
{
ModifyTriObject((TriObject*)obj, p.normal, p.offset);
}
else if(obj->IsSubClassOf(polyObjectClassID)) // Handle any PolyObject types
{
ModifyPolyObject((PolyObject*)obj, p.normal, p.offset);
}
else if(obj->CanConvertToType(triObjectClassID)) // all others should try to convert to a triobject,
{
TriObject *triOb = (TriObject *)obj->ConvertToType(t, triObjectClassID);
os->obj = triOb; // Now stuff this into the pipeline!
ModifyTriObject(triOb, p.normal, p.offset);
}
obj->UpdateValidity(GEOM_CHAN_NUM, iv);
obj->UpdateValidity(TOPO_CHAN_NUM, iv);
}
void TimberBoarding_mod::ModifyTriObject(TriObject* tobj, Point3 &normal, float offset)
{
Mesh& mesh = tobj->GetMesh();
SliceMesh(mesh, normal, offset);
)
void TimberBoarding_mod::ModifyPolyObject(PolyObject* pobj, Point3 &normal, float offset)
{
MNMesh& pmesh = pobj->GetMesh();
pmesh.Slice(normal, offset, 0.0, false, true);
}
