void Title_Sun::animate(RNG& rng){
    for(size_t i=0;i<shimmers.size();){
        shimmers[i].movement();

        if(shimmers[i].is_done(box.h)){
            shimmers.erase(shimmers.begin()+i);
        }
        else{
            i++;
        }
    }

    if(++shimmer_spawn>=Game_Constants::TITLE_SUN_SHIMMER_SPAWN_RATE*Engine::UPDATE_RATE/1000){
        shimmer_spawn=0;

        if(shimmers.size()<Game_Constants::TITLE_MAX_SUN_SHIMMERS && rng.random_range(0,99)<Game_Constants::TITLE_SUN_SHIMMER_SPAWN_CHANCE){
            double y_right_mod=rng.random_range(Game_Constants::TITLE_SUN_SHIMMER_Y_RIGHT_MOD_MIN,Game_Constants::TITLE_SUN_SHIMMER_Y_RIGHT_MOD_MAX);
            if(rng.random_range(0,99)<50){
                y_right_mod*=-1.0;
            }

            bool left_side=true;
            bool right_side=true;
            uint32_t random_side=rng.random_range(0,99);
            if(random_side<20){
                left_side=false;
            }
            else if(random_side<40){
                right_side=false;
            }

            shimmers.push_back(Title_Sun_Shimmer(0.0,y_right_mod,left_side,right_side,
                                                 0.01*(double)rng.random_range(Game_Constants::TITLE_SUN_SHIMMER_SPEED_MIN,Game_Constants::TITLE_SUN_SHIMMER_SPEED_MAX),
                                                 rng.random_range(Game_Constants::TITLE_SUN_SHIMMER_RADIUS_MIN,Game_Constants::TITLE_SUN_SHIMMER_RADIUS_MAX)));
        }
    }

    if(base_surface!=0){
        if(image.texture!=0){
            image.unload_image();
        }

        image.w=box.w;
        image.h=box.h;

        SDL_Surface* surface=SDL_CreateRGBSurface(base_surface->flags,base_surface->w,base_surface->h,32,base_surface->format->Rmask,base_surface->format->Gmask,base_surface->format->Bmask,base_surface->format->Amask);

        SDL_SetSurfaceBlendMode(surface,SDL_BLENDMODE_NONE);

        SDL_BlitSurface(base_surface,0,surface,0);

        if(SDL_MUSTLOCK(surface)){
            SDL_LockSurface(surface);
        }

        for(size_t i=0;i<shimmers.size();i++){
            shimmers[i].draw(surface);
        }

        if(SDL_MUSTLOCK(surface)){
            SDL_UnlockSurface(surface);
        }

        image.load_image(surface);

        SDL_FreeSurface(surface);
    }
}