@Override
 protected Object clone() {
   TexCoordGenerationRetained tr = (TexCoordGenerationRetained) super.clone();
   tr.planeS = new Vector4f(planeS);
   tr.planeT = new Vector4f(planeT);
   tr.planeR = new Vector4f(planeR);
   // other attributes is copied in super.clone()
   return tr;
 }
 /**
  * Creates a mirror object, point the mirror object to the retained object if the object is not
  * editable
  */
 @Override
 synchronized void createMirrorObject() {
   if (mirror == null) {
     // Check the capability bits and let the mirror object
     // point to itself if is not editable
     if (isStatic()) {
       mirror = this;
     } else {
       TexCoordGenerationRetained mirrorTg = new TexCoordGenerationRetained();
       mirrorTg.set(this);
       mirrorTg.source = source;
       mirror = mirrorTg;
     }
   } else {
     ((TexCoordGenerationRetained) mirror).set(this);
   }
 }
  /** Update the "component" field of the mirror object with the given "value" */
  @Override
  synchronized void updateMirrorObject(int component, Object value) {

    TexCoordGenerationRetained mirrorTc = (TexCoordGenerationRetained) mirror;

    mirrorTc.mirrorCompDirty = true;

    if ((component & ENABLE_CHANGED) != 0) {
      mirrorTc.enable = ((Boolean) value).booleanValue();
    } else if ((component & PLANE_S_CHANGED) != 0) {
      mirrorTc.planeS = (Vector4f) value;
    } else if ((component & PLANE_T_CHANGED) != 0) {
      mirrorTc.planeT = (Vector4f) value;
    } else if ((component & PLANE_R_CHANGED) != 0) {
      mirrorTc.planeR = (Vector4f) value;
    } else if ((component & PLANE_Q_CHANGED) != 0) {
      mirrorTc.planeQ = (Vector4f) value;
    }
  }
 /**
  * Initializes a mirror object, point the mirror object to the retained object if the object is
  * not editable
  */
 @Override
 synchronized void initMirrorObject() {
   ((TexCoordGenerationRetained) mirror).set(this);
 }