private void updateSprite(int progress) {
    final boolean inWorld = inWorld() && sprite() != null ;
    //
    //  If you're not the first drill in the strip, just attach a simple model.
    if (strip[0] == this) {
      attachModel(DRILL_MODELS[spriteVariant()]) ;
      return ;
    }
    //
    //  Otherwise, put together a group sprite-
    final float xo = (size - 1) / -2f, yo = (size - 1) / -2f ;
    final GroupSprite s ;
    if (inWorld) {
      s = (GroupSprite) buildSprite().baseSprite() ;
    }
    else {
      s = new GroupSprite() ;
      s.attach(SHAFT_MODELS[spriteVariant()], 1.5f + xo, 0.5f + yo, 0) ;
      attachSprite(s) ;
    }
    //
    //  And attach mold sprites at the right intervals-
    final int fillThresh = progress / NUM_MOLD_LEVELS ;
    for (int i = 0, c = 0 ; i < NUM_MOLDS ; i++) {
      int moldLevel = 0 ;
      if (i < fillThresh) moldLevel = NUM_MOLD_LEVELS - 1 ;
      else if (i < fillThresh + 1) moldLevel = progress % NUM_MOLD_LEVELS ;
      final Model model = SMELTER_MOLD_MODELS[spriteVariant()][moldLevel] ;
      
      if (inWorld) {
        final ImageSprite oldMold = (ImageSprite) s.atIndex(i + 1) ;
        if (oldMold != null && oldMold.model() == model) continue ;
        final Sprite ghost = oldMold.model().makeSprite() ;
        ghost.position.setTo(oldMold.position) ;
        world().ephemera.addGhost(null, 1, ghost, 2.0f) ;
        oldMold.setModel((ImageModel) model) ;
      }
      else s.attach(model,
        MOLD_COORDS[c++] + xo,
        MOLD_COORDS[c++] + yo,
      0) ;
    }
  }