Пример #1
0
void Exporter::CalcBoundingBox(INode *node, Box3& box, int all)
{
	if (nullptr == node)
		return;

	Matrix3 tm = node->GetObjTMAfterWSM(0);
	if (node->IsBoneShowing()) {
		box.IncludePoints(const_cast<Point3*>(&tm.GetTrans()), 1, nullptr);
	}
	else {
		if (Object *o = node->GetObjectRef()) {
			if (o->SuperClassID() == GEOMOBJECT_CLASS_ID) {
				if (o->ClassID() == BONE_OBJ_CLASSID
					|| o->ClassID() == Class_ID(BONE_CLASS_ID, 0)
					|| o->ClassID() == Class_ID(0x00009125, 0) /* Biped Twist Helpers */
					)
				{
					box.IncludePoints(const_cast<Point3*>(&tm.GetTrans()), 1, nullptr);
				}
				else
				{
					Box3 local;
#if VERSION_3DSMAX < (15000<<16) // Version 15 (2013)
					o->GetLocalBoundBox(0, node, mI->GetActiveViewport(), local);
#else
					o->GetLocalBoundBox(0, node, &mI->GetActiveViewExp(), local);
#endif
					box.IncludePoints(&local.Min(), 1, nullptr);
					box.IncludePoints(&local.Max(), 1, nullptr);
				}
			}
			else if (mExportCameras && o->SuperClassID() == CAMERA_CLASS_ID)
			{
				box.IncludePoints(const_cast<Point3*>(&tm.GetTrans()), 1, nullptr);
			}
		}
	}
	if (all < 0)
		return;

	all = (all>0 ? all : -1);
	for (int i = 0; i < node->NumberOfChildren(); i++) {
		CalcBoundingBox(node->GetChildNode(i), box, all);
	}
}
void CalcAxisAlignedBox(Mesh& mesh, Box3& box, Matrix3 *tm)
{
	int nv = mesh.getNumVerts();
	box.IncludePoints(mesh.getVertPtr(0), nv, tm);
}
void CalcAxisAlignedBox(Mesh& mesh, Box3& box)
{
	int nv = mesh.getNumVerts();
	box.IncludePoints(mesh.getVertPtr(0), nv, nullptr);
}