add textures and totally refactor