All parent transformations must be set if we want to avoid problems. Imagine A ( B ( C D ) ); if only C implements ShapeDrawable, A and B transformations still need to be performed. The relevant code is in libgdx's Group.drawChildren -- we can take other shortcuts (such as not actually computing the transform, just taking Group's batchTransform and hoping it has not changed since the last pass), but we cannot know if there will be ShapeDrawable children until we reach them, and by then, we must have applied all parent group transformations.