138 |
class BoxPrimitiveTransform { }; |
class BoxPrimitiveTransform { }; |
139 |
|
|
140 |
|
|
141 |
|
/** A tag for a transform that is not invertible. |
142 |
|
* This is done this way because the non-invertible |
143 |
|
* transforms are rightly in a minority. |
144 |
|
*/ |
145 |
|
class NonInvertiblePrimitiveTransform { }; |
146 |
|
|
147 |
/** A tag for a primitive transform that can print out |
/** A tag for a primitive transform that can print out |
148 |
* stuff. |
* stuff. |
149 |
* Implies |
* Implies |
394 |
t.setParams(p); |
t.setParams(p); |
395 |
} |
} |
396 |
|
|
397 |
|
Transform *getInverse(const void *___) const { |
398 |
|
InverseHierarchicalTransform< |
399 |
|
typename Primitive::InverseType, |
400 |
|
Primitive> *inv |
401 |
|
= new InverseHierarchicalTransform< |
402 |
|
typename Primitive::InverseType, |
403 |
|
Primitive >( |
404 |
|
&(super->getInverse()), this); |
405 |
|
t.inverse(inv->t); |
406 |
|
return inv; |
407 |
|
} |
408 |
|
|
409 |
|
Transform *getInverse(const NonInvertiblePrimitiveTransform *t) const { |
410 |
|
// XXX Warn? |
411 |
|
return new RootCoords(); |
412 |
|
} |
413 |
|
|
414 |
|
|
415 |
void dumpParams(const DumpingPrimitiveTransform *__, std::ostream &out) const { |
void dumpParams(const DumpingPrimitiveTransform *__, std::ostream &out) const { |
416 |
t.dump(out); |
t.dump(out); |
417 |
} |
} |
473 |
|
|
474 |
virtual const Transform &getInverse() const { |
virtual const Transform &getInverse() const { |
475 |
if(!this->inverse) { |
if(!this->inverse) { |
|
InverseHierarchicalTransform< |
|
|
typename Primitive::InverseType, |
|
|
Primitive> *inv |
|
|
= new InverseHierarchicalTransform< |
|
|
typename Primitive::InverseType, |
|
|
Primitive >( |
|
|
&(super->getInverse()), this); |
|
|
t.inverse(inv->t); |
|
476 |
((PrimitiveHierarchicalTransform<Primitive> *)this) |
((PrimitiveHierarchicalTransform<Primitive> *)this) |
477 |
->inverse = inv; |
->inverse = getInverse(&t); |
478 |
} |
} |
479 |
return *inverse; |
return *inverse; |
480 |
} |
} |