CoolFace
Datasetpublic

GSaha567/seq_level_training_data

sourceHugging Faceupdated 8mo agoView on Hugging Face
0likes52downloads
shard_000052.csv84442 linesDownload Raw Back to root
1text,length,is_long_context,metric_val,label_metric2"= La circulation des contenus3 4== Le Web5 6=== L'importance du Web7Le terme « numérique » a désormais acquis une signification culturelle très large [Doueihi, 2011].8Il n'est plus utilisé seulement comme un adjectif, mais aussi comme un substantif : le numérique.9Cela signifie que ce terme ne réfère plus seulement à des outils ou à des technologies particulières, mais aussi à un ensemble de transformations sociales, culturelles,  politiques,  économiques  et  anthropologiques  déclenchées  par  le  développement technologique, mais ne dépendant plus exclusivement de ce dernier.10En particulier, lorsque l'on parle des changements que les technologies numériques ont déterminés dans le champ de l'édition, on peut faire référence à une multiplicité d'outils et d'instruments informatiques, mais on parle aussi de changements institutionnels, sociaux, politiques, etc.11Cependant, on ne peut pas nier que la naissance et la diffusion du Web a eu un impact particulièrement fort sur le monde de la production, de la circulation et de la légitimation des contenus.12Le Web peut être considéré comme la première détermination des caractéristiques de ce que nous appelons le « numérique ».13En particulier, le changement majeur qu'il a apporté, entraînant ensuite des transformations dans l'ensemble des autres domaines, est la facilitation de la circulation et de l'accessibilité des contenus.14 15=== L'idée du Web : faciliter la circulation16En 1989, Tim Berners-Lee, un informaticien anglais qui travaillait au CERN de Genève, remarque un problème majeur dans la gestion des informations au sein du centre de recherche : les documents ne sont pas assez accessibles et il est très difficile de trouver les informations dont on a besoin, malgré le fait qu'elles soient potentiellement disponibles.17Le problème identifié par Tim Berners-Lee concerne la circulation de l'information : les employés du CERN changent souvent et les nouveaux arrivants ont du mal à récupérer les informations dont ils ont besoin, car la seule manière d'y parvenir est d'en discuter avec les autres.18Parce que les documents concernant le centre sont en perpétuelle évolution, ils sont difficilement organisables en une structure figée (comme le permettrait un livre imprimé).19C'est en cherchant la solution à ce problème que l'informaticien jette les bases, en 1989, du World Wide Web [Berners-Lee, 1989].20L'idée fondamentale est de trouver une manière de rendre accessibles l'ensemble des documents en réseau et de les raccorder entre eux via un système de liens.21Concrètement, cela signifie : 1) attribuer à chaque document un nom unique sur tout le réseau (le principe des URL, pour uniform resource locator) ; 2) établir un format universel pour les documents (le HTML, pour hypertext markup language) ; 3) définir un protocole de transmission de ces documents via Internet (le HTTP, pour hypertext transfert protocol).22Ces trois principes permettent la création d'une nouvelle forme de circulation des contenus : les documents deviennent accessibles à tous ceux qui disposent d'une connexion Internet.23À partir de 1990, formater un document en HTML et le déposer sur un serveur signifie le rendre public, le « publier ».24La fonction de diffusion des contenus propre à l'édition a trouvé une nouvelle expression.25Par ailleurs, en raison de la généralisation de la connexion Internet, la diffusion via le Web produit une accessibilité incomparablement plus élevée que celle pouvant être offerte par une maison d'édition à travers l'impression.26 27=== Du Web 1.0 au Web 3.028L'idée initiale du Web était de mettre à disposition des documents.29Les documents formatés en HTML sont déposés sur des ordinateurs connectés (des serveurs) et deviennent des « pages » accessibles.30Cette première époque du Web, qui va de sa naissance jusqu'à la fin des années 1990, correspond à ce qu'on appelle le Web 1.0, ou Web statique.31Le modèle du Web 1.0 est assez proche de celui de l'édition papier, car il est fondé sur une idée du document comme une ressource stable – exactement comme une page imprimée.32Il y a d'une part un producteur du document et d'autre part des lecteurs de ce document : les rôles sont clairement établis.33À partir de la fin des années 1990, le Web commence à s'orienter vers une nouvelle forme d'organisation des contenus : alors qu'il se contentait de mettre en relation une série de documents, il commence à inclure des relations avec des individus.34Le Web est alors fait de documents et de personnes.35C'est ce que Darcy DiNucci [1999] appelle le Web 2.0 et qu'on qualifiera par la suite de « Web social ».36Les contenus deviennent dynamiques, car les usagers commencent à pouvoir ajouter eux-mêmes des informations : commentaires,  recommandations,  images,  informations  sur  leurs  profils,  etc.37 TripAdvisor, qui permet aux usagers d'évaluer restaurants et hôtels, apparaît en 2000.38Wikipédia, l'encyclopédie participative, est lancée en 2001.39Quant à Facebook et Twitter, ils apparaissent en 2006.40Le rôle des « lecteurs » change radicalement : le lecteur devient contributeur.41En même temps, les contenus perdent leur stabilité : ils sont susceptibles de changer à tout moment.42Ce sont deux transformations majeures par rapport au modèle de l'édition papier.43Le Web 3.0, ou Web sémantique, ajoute aux relations entre documents et personnes d'autres relations avec les machines.44Les informations, à partir du moment où elles sont correctement structurées et balisées, peuvent ainsi être utilisées, comprises et réagencées non seulement par les lecteurs, mais aussi par des algorithmes.45Les machines deviennent à leur tour des instances éditoriales, capables d'organiser les contenus.46 47//todo: tableau à mettre en forme48 Encadré 1.49L'histoire d'Internet et du Web 1969  Première connexion du ARPANET, réseau physique créé à des fins militaires.50Le réseau fera l'objet d'une présentation officielle en 1972 à l'International Computer Communication Conference, date à laquelle soixante terminaux seront connectés à l'ARPANET.51 1970  Sous la supervision de Stephen Crocker, le Network Working Group crée le premier protocole de transmission de données d'ARPANET, le Network control protocol (NCP).52 1973  Création d'un second protocole, le Transmission control protocol (TCP), par Vinton Cerf et Robert Kahn.53 1982  Devant le nombre croissant d'hôtes se connectant au réseau, Paul Mockapetris crée le Domain Name System (DNS, protocole de correspondance entre IP et nom de domaine).54 1983  Réorganisation du TCP en un nouveau protocole, le Transmission control protocol/Internet protocol (TCP/IP).55ARPANET adopte le protocole TCP le 1er janvier 1983.56 1986  La National scientific foundation (NSF) adopte le protocole TCP/IP et finance la construction d'une dorsale (câble transocéanique) traversant les États-Unis.57 1990  S'inspirant de la notion d'hypertexte de Ted Nelson, Tim Berners-Lee développe le World Wide Web à partir du langage HTML (Hypertext markup language) et du protocole HTTP (Hypertext transfer protocol).58 1992  Développement du navigateur Mosaic, dont hériteront entre autres Netscape et Internet Explorer.59Premier navigateur à afficher directement les images, Mosaic contribue au gain exponentiel de popularité du World Wide Web.60 1994  Tim Berners-Lee fonde le World Wide Web Consortium (W3C), qui assure la standardisation des technologies web et l'évolution de ses différents protocoles.61 1995  L'introduction de Netscape ($NSCP) sur les marchés financiers marque le début de la bulle internet (« dot-com bubble ») et un gain d'intérêt marqué du secteur économique à l'égard du Web.62Après que l'indice NASDAQ a quintuplé en cinq ans, la bulle éclate vers mars 2000.63 1998  Fondation de Google par Larry Page et Sergueï Brin.64 2001  Suite à l'échec relatif de Nupedia, projet d'encyclopédie numérique dont la rédaction et la validation des articles devaient être assurées par des expert, Jimmy Wales et Larry Singer créent Wikipédia avec l'intégration de l'application libre wiki.65 2003  Dale Dougherty propose le terme « Web 2.0 », parfois référencé sous les noms de « Web social » ou « Web participatif », pour désigner une nouvelle phase interactive du Web— interactivité qui était d'emblée envisagée par Berners-Lee à la création du World Wide Web.66 2004  Création de Facebook, alors réservé aux étudiants de Harvard, par Mark Zuckerberg.67Le réseau social sera rendu public en 2006.68 2005  Création de YouTube par Steve Chen, Chad Hurley et Jawed Karim.69Le site web sera racheté par Google en 2006.70 2006  Création de Twitter par Jack Dorsey, Evan Williams, Biz Stone et Noah Glass.71 72=== Les limites de la circulation des contenus numériques73L'expansion du Web a rendue possible une circulation des contenus potentiellement sans limite.74La généralisation de la connexion Internet fait qu'un document, une fois mis en ligne, devient accessible à des millions de personnes.75Le rêve qui était à la base du projet de Tim Berners-Lee semble s'être réalisé.76Il faut souligner combien ce rêve s'insère parfaitement dans la tradition de l'édition, dont l'une des principales fonctions est la circulation des contenus.77L'invention de la presse à caractères mobiles au  XVe  siècle avait déjà permis de multiplier la puissance de diffusion des  contenus.78Les manuscrits, pour circuler, devaient être copiés manuellement : le coût et le temps requis par cette opération en limitaient très fortement la circulation.79Par ailleurs, la circulation était freinée par la difficulté physique de faire voyager le support : un livre arrivait en effet seulement là vers où on le transportait.80À première vue, la circulation sur le Web semble avoir abattu toutes ces frontières : la diffusion des contenus est désormais ubiquitaire, les fichiers peuvent être multipliés et copiés gratuitement, voyager à la vitesse de la lumière, etc.81Ce discours ne résiste pourtant pas totalement à une analyse plus attentive.82On compte au moins quatre limites principales à la circulation des contenus dans les environnements connectés : les barrières techniques et culturelles, les barrières géopolitiques, les barrières linguistiques et, enfin, la différence fondamentale entre accessibilité et visibilité.83 841. Les barrières techniques et culturelles se manifestent principalement à travers les phénomènes de « fracture numérique » (digital divide) et de « fracture culturelle » (cultural divide).85La fracture numérique renvoie à la division entre les zones géographiques ayant accès à une connexion Internet et celles qui n'en ont pas.86Cette fracture peut se manifester entre différents pays ou zones géographiques (l'Afrique centrale a par exemple un accès très modeste à la connexion par rapport à l'Europe occidentale et l'Amérique du Nord), mais aussi à l'intérieur d'un même pays – on sait par exemple que les campagnes sont moins connectées que les villes.87Cela crée une véritable différence sociale et culturelle entre les différentes parties de la population mondiale.882. À cela s'ajoutent les barrières géopolitiques, qui correspondent aux politiques de censure et de limitation de l'accès à l'information propres à certains pays, tels que la Chine.89Mais même dans des régions connectées et non soumises à la censure, on peut identifier une fracture culturelle : le fossé qui sépare les personnes dotées d'une culture numérique suffisante pour se servir des médias électroniques et ceux à qui cette culture fait défaut.90Ce problème est réel et particulièrement critique à une époque où plusieurs informations ne sont plus disponibles que sur un support informatique accessible via une connexion.913. Les barrières linguistiques semblent constituer un fait banal, et pourtant il est important de souligner combien la circulation des contenus continue à s'opérer à l'intérieur de communautés linguistiques bien délimitées.92Pour pallier cette difficulté, on assiste à une prédominance de l'anglais comme lingua franca – avec les conséquences politiques et culturelles que peuvent entraîner une telle suprématie.93C'est pourquoi la recherche sur les traductions – en particulier sur les traductions automatiques – est devenue fondamentale.94Cependant, les progrès récents réalisés dans le domaine de la traduction automatique sur base statistique par Google Translate, et l'association de cette approche à des algorithmes fondés sur l'apprentissage machine, n'ont fait que laisser dans les mains du géant de la Silicon Valley la gestion de cette limite et la possibilité de la dépasser.95Si bien que la circulation des contenus a tendance à acquérir une structure fortement centralisée, au lieu de favoriser la décentralisation et la dissémination des documents propre au projet initial du Web.964. Si ces deux premières barrières limitent l'accessibilité des contenus – en empêchant les usagers d'avoir, dans le premier cas, un accès matériel et, dans le second cas, un accès cognitif aux ressources –, une dernière barrière reste à prendre en compte : celle de la visibilité.97Car en raison de la quantité considérable de contenus existants (et donc potentiellement accessibles), un nombre très limité de documents est réellement visible.98En effet, pour être visible, un contenu doit être référencé, indexé ou recommandé sur d'autres plates-formes.99Dans le cas contraire, il est noyé dans la masse d'informations existantes et demeure invisible.100Mais quels sont les instances qui rendent un contenu visible – et qui, de fait, opèrent véritablement une fonction de diffusion ? Concrètement, il s'agit des moteurs de recherche – Google en premier lieu – et des réseaux sociaux – comme Twitter et Facebook.101En d'autres termes, nous sommes encore une fois face au risque d'une forte centralisation de la fonction éditoriale.102 103==  Les librairies et les maisons d'édition face à la circulation GAFAM104 105=== La constitution d'un oligopole à franges106La structuration progressive de l'écosystème numérique a fait émerger une forte concentration des acteurs.107Cette dynamique oligopolistique de concentration des activités numériques autour d'un nombre restreint de plates-formes est observable dès le début des années 2000 avec pour certaines plates-formes des externalités positives (retombées positives alimentant leur succès) et qui leur permet d'occuper progressivement des positions fortes sur leurs secteurs d'activités.108C'est ainsi que la paysage des moteurs de recherche est passé de quelques dizaines d'acteurs au début du Web à un marché structuré dans sa quasi-totalité autour de trois acteurs (Google, Yahoo, Bing), hors les exceptions notables de la Chine (Baidu) et de la Russie (Yandex).109Cette évolution est observable dans un grand nombre de secteurs d'activité avec comme corollaire une concentration des moyens et donc de la capacité à proposer des services innovants et coûteux en terme d'infrastructures.110Ces nouveaux services permettant de capter de nouveaux usages, ce qui renforce davantage ces positions.111La situation de ces marchés peut ainsi être qualifiée d'oligopole à franges, c'est-à-dire un marché structuré principalement autour d'un nombre réduit d'acteurs captant la majeure partie du marché et entourés d'un grand nombre d'acteurs de taille bien plus réduite se partageant une part très limitée du marché.112Cette tectonique des usages numériques a abouti à l'émergence d'acteurs largement dominants regroupés sous l'acronyme GAFAM pour Google, Apple, Facebook, Amazon et Microsoft.113Ces acteurs occupent aujourd'hui une place prépondérante sur leur marché.114Google dispose ainsi depuis plusieurs années d'une part de marché mondiale dans les recherches en ligne supérieure à 75 %.115Son système d'exploitation Android a capté plus de 80 % de la part de marché des OS mobiles et son système de messagerie Gmail est également largement en tête des services de messagerie.116Le cas d'Apple est un peu particulier : en effet, depuis l'arrivée de Samsung et d'Android sur le marché des smartphones, Apple a perdu sa première position en termes de ventes de smartphones et de part du parc des systèmes d'exploitation utilisés.117L'entreprise reste toutefois largement dominante en termes de valeur avec environ 90 % des profits sur le marché des smartphones en 2016.118Pour ces deux acteurs, la part du parc des OS installés induit également la part dans le marché des contenus associés (iTunes Store, App Store ou Google Play).119Ainsi, iBooks représente en 2015 11 % du marché américain du livre numérique en volume et 12 % en valeur.120Sur le marché des réseaux sociaux la position de Facebook est également largement dominante avec, en 2017, plus de 50 % du trafic sur les réseaux sociaux et une base d'utilisateurs actifs nettement majoritaire avec plus de 1,8 milliard d'usagers en janvier 2017.121À la même époque, la part de marché de Facebook sur les réseaux sociaux était de 18 %, devant What's App à 11 %, également propriété de Facebook.122La place dominante de Microsoft dans le domaine des systèmes d'exploitation et bien connue, mais pour l'édition numérique, c'est Amazon qui est l'acteur le plus pertinent à observer.123En effet, avec 74 % du volume des ventes de livres numériques aux États-Unis en 2015, Amazon est nettement en position de leader sur ce marché.124Au-delà du livre numérique, la part estimé d'Amazon dans le commerce en ligne aux États-Unis est estimée à 43 % en 2016.125Les industries culturelles connaissent depuis longtemps ce type de marché, les niveaux de concentration atteints dans le domaine de la musique enregistrée ou de l'édition en témoignent.126Elles se retrouvent donc confrontées pour leurs activités numériques à une structuration du marché qui questionne leur propre place dans les filières.127L'édition académique a également été touchée par ces changements de modèles.128On peut distinguer deux périodes Au cours de la première période la logique de platesformes et de structuration oligopolistique du marché joua à plein, avec l'émergence d'acteurs atteignant des positions très fortes et rassemblant des volumes de ressources éditoriales de plus en plus importants.129Cette situation s'accompagna d'une augmentation des budgets d'acquisition des bibliothèques (principale clientèle de ce type de documentation) pour les ressources numériques.130Une seconde période s'est ensuite ouverte, en partie en réaction à l'augmentation des tarifs, avec le développement d'un modèle tourné vers un accès ouvert aux productions éditoriales scientifiques, s'appuyant sur les outils du Web permettant cette désintermédiation.131Pour l'ensemble des secteurs éditoriaux, les conséquences principales de cette situation doivent être analysées de façon précise tant elle conditionne les modèles susceptibles d'être déployés dans les différents filières et notamment dans celle de l'édition.132 133=== Poids des modèles, évolution et comparaison internationale134La première conséquence de l'arrivée des GAFAM dans le monde du livre est une évolution forte des modèles de circulation.135Nous en détaillerons trois : le modèle éditorial, le modèle de la publication Web et celui de l'édition académique.136 137*Le modèle éditorial.*138L'activité éditoriale s'est structurée depuis longtemps dans un modèle d'affaires et d'organisation de filière stabilisé dans lequel les éditeurs occupent une place centrale [Chartron, 2016].139Du fait de sa position très en amont dans la filière, l'éditeur dispose de plusieurs leviers de pilotage.140Ainsi, en sélectionnant les contenus qui seront édités, il joue un rôle clé dans l'alimentation du circuit de distribution.141Il maîtrise également, notamment en France, les prix de vente et la répartition de la remontée des recettes du fait de la présence dans les principaux groupes d'édition d'acteurs en charge de la distribution.142Ce dernier aspect est un élément central dans la construction des groupes d'édition (il a d'ailleurs joué un rôle important dans les mouvements de concentration qu'a connu l'édition française depuis les années 1980).143Cette intégration des plates-formes de distribution est en effet un facteur important puisqu'elle permet de fixer les conditions de vente et de remise qui influent directement sur les marges des libraires et des éditeurs, surtout sur un marché à prix unique comme en France.144Ce modèle est largement remis en question avec l'arrivée des GAFAM et le passage à l'édition numérique.145C'est l'arrivée d'Amazon et la croissance très rapide de sa part de marché dans la vente de livres en ligne qui a tout d'abord modifié les rapports de forces.146En se positionnant dès sa création sur le créneau de la vente en ligne de livres imprimés, Amazon a développé l'offre de titres de loin la plus importante aujourd'hui et des capacités logistiques de haut niveau.147Au cours de son développement mondial, l'entreprise a également constitué une base de clientèle de plusieurs centaines de millions de personnes.148En atteignant ce poids sur le marché du livre physique, Amazon a inversé en partie le rapport de forces entre l'amont de la filière (l'édition) et l'aval (la distribution).149Cette inversion est très importante, car elle ne se limite pas aux ouvrages sur support papier mais touche également le livre numérique.150Sur ce marché, Amazon occupe une place de leader, ayant largement participé au développement du marché aux États-Unis avec la commercialisation d'une liseuse, la Kindle.151Lancée en 2007 aux ÉtatsUnis et en 2009 en France, elle est régulièrement mise à jour et constitue pour Amazon un vecteur central dans la construction de son écosystème du livre numérique.152 Avec le développement du marché du livre numérique, les GAFAM bouleversent encore un peu plus le modèle éditorial.153L'ensemble de ces firmes ont investi d'une façon ou d'une autre dans le marché du livre numérique, à des niveaux et avec des stratégies différentes.154Google a, dès 2004, lancé Google Print (qui deviendra Google Books ou Google Livres), programme de numérisation de masse d'ouvrages essentiellement issus de bibliothèques partenaires.155S'il a donné lieu à plusieurs actions en justice, Google Livre constitue aujourd'hui un corpus de quelque 25 millions d'ouvrages.156Apple a ouvert son iBooks Store simultanément au lancement de l'iPad, en 2010.157Comme l'entreprise l'avait fait pour la musique, les applications ou les jeux, l'objectif est de proposer des contenus pouvant alimenter un dispositif numérique et ainsi encourager son achat.158Microsoft, qui s'était associé en 2012 à Barnes & Nobles et à sa liseuse Nook avant de mettre fin au partenariat en 2014, envisageait à nouveau en 2017 de proposer des livres numériques à la vente via une librairie intégrée à son système d'exploitation.159Enfin, Amazon a encore fait évoluer son offre numérique en lançant en 2014 Kindle Unlimited, qui propose par abonnement mensuel l'accès, sous conditions, à plusieurs centaines de milliers de livres numériques.160Ainsi, à l'exception de Facebook, les principaux acteurs du numérique et les plus importantes plates-formes en ligne ont tous une activité en lien avec le livre numérique.161Pourtant, celui-ci occupe une place particulière dans leurs modèles d'affaires.162En effet, pour l'ensemble de ces exemples, le livre numérique ne constitue pas une source directe de valeur ajoutée.163Il joue un rôle de « produit d'appel » dont la valeur sera réalisée au travers d'autres services ou offres.164Dans le cas d'Apple, c'est la vente de matériels qui constitue, de loin, la principale source de revenus.165Pour Google, la logique est différente : en proposant un corpus de cette taille, c'est une captation de l'attention qui est visée et donc sa valorisation via les mécanismes publicitaires qui produisent l'énorme majorité des bénéfices de Google (il convient d'ajouter que les ouvrages numérisés constituent également un outil précieux dans le développement des services de traduction automatique sur lesquels travaille la firme depuis de nombreuses années).166La part du livre numérique dans l'activité d'Amazon est compliquée à mesurer, mais il est probable qu'il joue également un rôle dans l'accroissement de sa base de clients, notamment à travers son service premium.167Cette analyse du rapport à l'édition des GAFAM souligne bien les enjeux actuels de l'édition numérique, s'agissant des rapports de forces entre éditeurs et plates-formes, mais aussi de la place du livre, en l'occurrence numérique, dans la stratégie de ces dernières.168 169*Le modèle de la publication Web.*170Nous proposons de rassembler sous cette terminologie un ensemble de modèles d'affaires qui sous-tendent en partie l'activité de publication numérique prise dans une acception large, couvrant aussi bien des textes que des contenus audiovisuels ou multimédia.171Dans l'ensemble de ces modèles le principe est le même, à savoir une dissociation nette entre les circuits de distribution/diffusion et les circuits de financement.172Dans les modèles traditionnels de publication, les mécanismes de remontée des recettes sont bien connus.173Soit il s'agit d'une logique de paiement à l'acte qui amorce une remontée financière tout au long de la filière (par exemple la vente d'un ouvrage correspond à la perception par le libraire, le distributeur, l'éditeur, l'auteur… d'un montant calculé comme une part du prix de vente).174Soit, et de façon non exclusive, il s'agit d'une logique de fructification de l'attention suscitée par le produit (le fameux « temps de cerveau disponible »).175Dans cette seconde logique, des annonceurs achètent au diffuseur une partie de cette attention via un support publicitaire dont le prix est calculé en fonction de l'audience captée par le produit (c'est le cas par exemple lorsqu'un annonceur achète un espace publicitaire sur une chaîne de télévision).176Ce faisant, ils alimentent également une remontée des recettes qui sera partagée entre les différents acteurs de la filière.177Ce type de marché, dit biface, combine une source de revenus issue de ventes à l'utilisateur final et un financement publicitaire.178Sur le Web, les modèles utilisés pour la publication se sont largement construits sur un seul versant, celui de la publicité.179Cette approche a longtemps été la principale solution de financement pour les publications en ligne : la vidéo est dans cette logique d'accès gratuit avec comme contrepartie des messages publicitaires ajoutés au début ou au cours de la vidéo.180La presse en ligne, comme la musique, ont également longtemps exploité ce modèle.181Pour le secteur de l'édition, cette approche ne s'est jamais réellement déployée, le poids symbolique du livre freinant sûrement la juxtaposition de messages publicitaires et de contenus éditoriaux.182De ce fait, la publication sur le Web utilise plusieurs mécanismes de financement : la publicité, le financement amont (subvention par exemple), le freemium (un accès gratuit au contenu mais proposant des formats ou services complémentaires payants) ou encore le financement participatif.183 184*Le modèle académique.*185L'édition académique est constituée de deux marchés différents, celui des ouvrages ou manuels de formation et celui des revues de recherche.186Historiquement, les auteurs d'articles parus dans les revues académiques ont très tôt investi la publication en ligne avec la création d'archives ouvertes dédiées à la publication et au partage d'articles.187Les acteurs commerciaux ont également proposé très tôt des offres numériques avec un accès à distance aux revues numériques.188À l'occasion de ce changement de support, les éditeurs scientifiques ont transposé leur modèle classique, celui de l'abonnement, en proposant aux institutions abonnées un accès en ligne à des « bouquets » de revues numériques.189Ces abonnements étaient onéreux mais, ramenés au nombre de titres, présentaient encore un intérêt pour les bibliothèques, même si cela s'est amenuisé avec la hausse importante des tarifs imposée par les grands éditeurs scientifiques.190Le modèle de l'abonnement utilisé pour les publications académiques (revues ou ouvrages), papier d'abord et numérique ensuite, demeure cependant particulièrement intéressant.191Du point de vue économique, l'abonnement, ou plus précisément la licence d'accès, correspond à un modèle dans lequel le tarif est partiellement décorrelé de l'usage.192En effet, le paiement par une institution académique ou une bibliothèque universitaire d'une licence pour des publications scientifiques ouvre l'accès à l'ensemble des usagers de cette institution.193Quels que soient les accès effectifs à ces ressources, le montant restera globalement forfaitaire.194Ce type d'offre présente deux caractéristiques : d'une part, le paiement d'un abonnement forfaitaire pour accéder à une offre de contenus ; et, d'autre part une collection de titres ou de contenus extrêmement importante.195Ce modèle de licences s'est également développé dans les secteurs de la musique avec Deezer en 2007 et Spotify en 2008, dans le secteur du jeu vidéo dès 2003 avec Steam ou dans celui de l'audiovisuel avec Netflix en 2010.196Il est également présent dans l'édition grand public via l'offre Kindle Unlimited d'Amazon depuis 2014.197Reconnaissance des formats et marché Le numérique, questionne également les modèles éditoriaux traditionnels du point de vue des formats – nous désignons ici par « format » des formes éditoriales et non des formats informatiques de fichiers.198Avec l'arrivée des nouveaux formats numériques, les libraires et éditeurs sont amenés à revoir leur pratiques dans la construction de gammes de produits, et ce à deux niveaux.199À un premier niveau, on assiste à un certain nivellement des livres numériques vers un type unique de format(age) éditorial, indépendamment du fichier, qui ne propose pas au lecteur d'expériences de lecture différenciées.200Il n'existe pas, pour le livre numérique, de logique de gamme ou de formats comme le support papier l'autorise : les éditions « grand format », « poche », « limitée », « luxe »… n'y ont en effet pas de sens, la perception qu'a le lecteur d'un livre numérique étant principalement conditionnée par le dispositif de lecture dont il dispose.201Il n'est donc pas possible de faire varier la forme de l'ouvrage numérique pour en proposer différentes déclinaisons.202Un des leviers disponible pour repenser cette construction de gamme est de segmenter l'offre selon le niveau de services accompagnant l'ouvrage numérique.203Ces services associés peuvent notamment consister en l'ajout de contenus illustratifs, d'approfondissement, etc.204Cela revient en réalité à produire deux versions (ou éditions) d'un ouvrage : une version complète et une version partielle proposant uniquement le texte, sans les enrichissements.205Les services complémentaires peuvent également être liés à la portabilité – c'est-à-dire la possibilité de lire le livre numérique sur plusieurs supports différents (smartphone, tablette, ordinateur, livre lu…) – ou à l'accessibilité de l'ouvrage numérique.206Il s'agit d'une approche déjà utilisée dans certains domaines avec au départ un accès à une version en ligne de l'ouvrage ou du texte, et, en montant en gamme, l'accès à d'autres versions, souvent autonomes, sous forme de fichiers à utiliser sur tablette ou liseuse.207Cette montée en gamme peut également correspondre à des accès simultanés ou multiples à l'ouvrage, permettant par exemple une lecture suivie sur plusieurs dispositifs.208Cette difficulté de segmentation du marché pour l'édition numérique est liée, à un deuxième niveau, à la question de la fixation des prix de vente.209Depuis les débuts de l'édition numérique, la question du prix du livre numérique s'est posée, du point de vue économique et législatif.210Du point de vue économique la difficulté consiste pour l'éditeur à définir un prix de vente qui intègre la nouvelle structure de coûts (plus de coûts d'impression mais des coûts de développement), le nouveau circuit de distribution, la disparition des gammes (moyenne entre grand format et poche) et l'acceptation par les acheteurs.211Cette équation est d'autant plus complexe à résoudre que certaines platesformes de distribution comme Amazon encouragent une uniformité des prix (9,99 $ pour un ouvrage), comme Apple l'a fait pour la musique (0,99 $ pour un titre).212Si la question de la fixation des prix n'est pas complètement nouvelle pour les éditeurs, la souplesse potentielle dans la variation des niveaux de prix est par contre une vraie nouveauté.213 Contrairement à l'édition papier, l'édition numérique dispose d'un nouveau levier marketing ou commercial via la possibilité de faire varier le prix du livre numérique tout au long du cycle de vie.214Cette possibilité (proposer un prix de lancement, remonter ensuite au tarif normal ou proposer des variations liées à l'actualité par exemple) est déjà largement utilisée sur le marché des applications mobiles mais nécessite, de la part des éditeurs, des compétences nouvelles dans l'analyse en temps réel des volumes de ventes déclencher ou mesurer les effets des fluctuations tarifaires.215 216== Les bibliothécaires face à la « grande bibliothèque numérique »217L'édition et le livre sont au cœur de l'idée de bibliothèque.218Les ouvrages sur support papier en ont conditionné le modèle même : ses espaces physiques, construits autour des rayonnages, l'identité de ses professionnels ou encore son inscription dans la cité.219Les développements du Web et du livre numérique amènent les bibliothèques vers un renouvellement de leur rapport à leur objet, de leurs pratiques et de leur définition en tant qu'institution.220 221=== Le Web comme grande bibliothèque222Depuis les débuts du Web, le parallèle avec les bibliothèques n'a cessé d'être développé et analysé.223Il s'appuie sur deux caractéristiques communes au Web et aux bibliothèques : la facilité d'accès à un coût très faible et la mise à disposition de vastes collections de ressources accessibles à tous.224Ce rapprochement entre Web et bibliothèques se fonde également sur un aspect que nous avons déjà évoqué précédemment, le paiement forfaitaire décorrelé de l'usage effectif des ressources proposées.225Ce modèle de licence ou d'abonnement, qui se diffuse aujourd'hui à un nombre croissant de secteurs d'activité en ligne, est historiquement celui de la bibliothèque.226L'analogie entre les modèles va même plus loin.227Dans les deux cas, s'il est proposé à l'utilisateur d'accéder gratuitement à une vaste collection de ressources, les services supplémentaires – comme le prêt, la suppression des publicités ou l'accès hors ligne (pour la musique par exemple) – seront payants ou nécessiteront une démarche d'identification.228Cette évolution importante des possibilités d'accès à des ressources, via la numérisation et ces nouveaux modèles, fait évoluer le rôle des bibliothèques et questionne la spécificité de leur modèle.229Le rapprochement entre les modèles de la bibliothèque et des industries culturelles est renforcé par la numérisation progressive des contenus proposés par les deux types d'acteurs.230Cette numérisation conduit à des pratiques de recherche, de consultation et d'accès qui passent par les mêmes dispositifs numériques.231La consultation en ligne des ressources proposées par la bibliothèque se fait via le même terminal que pour consulter librement des ressources publiées en ligne ou commercialisée.232Cette proximité entre les différents fournisseurs, rassemblés du point de vue de l'usager sur le même dispositif, renforce la mise en concurrence de l'ensemble des acteurs, bibliothèques comprises, dans l'offre de contenus numériques.233Cette mise en concurrence ne se limite pas à des questions de coûts mais couvre l'ensemble des aspects de l'expérience utilisateur : qualité des interfaces, facilité d'usage ou adéquation avec son propre écosystème numérique.234En effet, avec le passage au support numérique, l'ensemble des acteurs du livre entre dans un nouvel écosystème, en ligne, dans lequel chacun doit réinventer ses rôles, modèles et valeurs ajoutées.235Les bibliothèques n'échappent pas à ces enjeux.236Ainsi, plus encore que les médias qui le précédèrent dans le développement numérique, le livre joue un rôle majeur dans l'évolution des bibliothèques.237Cette évolution est observée et mesurée depuis plusieurs années pour les bibliothèques universitaires et académiques, en raison principalement du développement des offres numériques des revues spécialisées.238Le développement des pratiques et la croissance de l'offre de livres numériques entraînent les bibliothèques de lecture publique vers les mêmes questionnements.239Car il ne s'agit pas pour le livre numérique d'un « simple » changement de support comme le passage de la VHS au DVD ou du disque vinyle au CD.240Il s'agit d'un changement à la fois de modèle (l'acquisition, la sélection, l'indexation, la mise à disposition ou la conservation changent radicalement) mais aussi de place dans les écosystèmes de l'édition et plus largement dans les pratiques des usagers.241En intégrant le livre numérique à ses collections la bibliothèque se positionne dans une offre éditoriale numérique bien plus vaste, accessible en ligne.242Si ce rôle de repérage et de signalement de ressources en ligne n'est pas nouveau ou lié uniquement au livre numérique, il est toutefois aujourd'hui un enjeu fort de la visibilité des bibliothèques.243En effet, depuis les premiers temps du Web les modalités d'accès aux ressources publiées en ligne ont largement évolué.244D'une identification des différents acteurs, publics ou privés, via leur site web les usages sont passés à un accès direct aux ressources via les moteurs de recherche.245La visibilité institutionnelle des bibliothèques au travers de leur site web n'est donc plus suffisante, celui-ci ne constituant plus un point de passage obligé pour accéder aux collections.246L'enjeu, et les bibliothèques ont fortement investi ce champ, est donc la visibilité, la « trouvabilité » de l'offre des bibliothèques sur le chemin de navigation des internautes.247Cette nouvelle donne implique deux enjeux différents.248D'une part il est primordial pour les professionnels des bibliothèques de maîtriser les techniques d'intégration des ressources des bibliothèques dans les résultats des moteurs de recherche.249Cette intégration suppose une ouverture des catalogues au Web pour permettre aux moteurs de recherche d'indexer efficacement, titre à titre, l'offre des bibliothèques.250D'autre part, la diffusion des métadonnées des catalogues aux moteurs de recherche pose la double question de la visibilité des bibliothèques en tant qu'institution et de leur ancrage territorial.251 252=== Bibliothèques et algorithmes253Avec le passage sur support numérique de l'offre documentaire des bibliothèques une autre dimension du rôle des bibliothèques a également été modifiée.254En effet, il appartenait jusqu'à présent aux bibliothèques d'établir l'ensemble des relations entre les documents de leur fonds.255Cette mise en réseau s'incarne toujours aujourd'hui dans les pratiques de catalogage et de cotation des documents.256En attribuant à un document une côte et donc un emplacement, physique ou virtuel, dans une collection, les bibliothécaires construisent un maillage sémantique qui relie les éléments de la collection sur la base des métadonnées extraites ou produites autour des documents.257Il s'agit d'une expertise professionnelle au cœur des métiers des bibliothèques qui consiste à attribuer, via une notice par exemple, un ensemble d'attributs, libres ou prédéfinis.258Ces attributs, côte, mots-clés, thématiques… permettent de rassembler au sein d'une organisation tangible (les étagères d'une bibliothèque) ou virtuelle (la page de résultats du catalogue) des ressources documentaires.259Cette construction sémantique, à l'échelle de la collection ou d'un sous-ensemble, constitue une valeur ajoutée unique des bibliothèques.260Elle est établie sur un temps long et s'appuie sur des outils et des méthodes spécifiques et éprouvées.261Cet aspect du travail des bibliothèques ne leur est pas exclusif, il se retrouve dans de très nombreux secteurs d'activité, de la librairie au supermarché.262La particularité réside pour les bibliothèques dans deux aspects : le des documents traités, et le caractère intellectuel des ses traitements.263En effet, la production de métadonnées nécessite en bibliothèques une connaissance des domaines traités, une interprétation éventuelle des informations disponibles (titre, éditeur…), etc.264Cette expertise limitait jusqu'à présent l'automatisation d'une partie de ces tâches et a conduit les bibliothécaires à développer des pratiques renforcées de mutualisation et de partage.265Le glissement vers le numérique des documents peut être appréhendé au travers de trois aspects particuliers de ce type d'activité des bibliothèques.266Tout d'abord, comme nous l'avons évoqué, les bibliothécaires, en tant que professionnels de l'information, disposent de compétences élevées dans la production de métadonnées, la manipulation de données structurées et l'utilisation d'outils puissants d'interrogation de corpus.267La difficulté est de positionner la bibliothèque, soit comme point d'entrée vers des collections provenant en partie du Web (sur lesquelles le niveau de stabilité et de structuration des données n'est pas garanti) ou vers des ressources provenant de bases connues et identifiées (archives ouvertes par exemple) ; soit comme fournisseur de ressources, par exemple de données bibliographiques, qui seront utilisées et reprises par d'autres points d'accès comme les moteurs de recherche.268Dans ce dernier cas, c'est la perception de la bibliothèque par les usagers qui posera question.269Ensuite, les documents numériques autorisent une forme nouvelle de traitement algorithmique qui s'appuie sur les documents directement et non sur les métadonnées.270C'est déjà le cas pour les textes, aisément manipulables par des outils informatiques, mais cette capacité de traitement automatisé et algorithmique se déploie également pour les autres formats comme la vidéo ou la musique.271Cette capacité offerte par le numérique de confier la production des métadonnées (des index dans la plupart des cas) à un traitement logiciel fait glisser l'expertise du traitement documentaire des professionnels de l'information aux spécialistes des outils informatiques.272Cette approche n'est évidemment pas exempte de difficultés et de limites.273Le bruit, par exemple, dans les résultats d'une recherche, c'est à dire la propension du système à proposer des résultats non pertinents par rapport à une requête, est important (il suffit d'observer le nombre de résultats d'une requête sur un moteur de recherche) mais la masse de documents traités et la capacité de l'algorithme à ordonner les résultats selon des critères dits de « pertinence » suffisent apparemment à répondre aux attentes des usagers.274Il s'agit d'une évolution importante car elle place l'algorithme comme principal outil de traitement et d'interrogation des corpus documentaires, sans avoir recours à un traitement et une production humaine de métadonnées.275Enfin, la place centrale prise par les algorithmes dans l'indexation et l'interrogation des corpus documentaires a conduit les bibliothèques à déployer deux approches.276D'une part une évolution des interfaces d'interrogation des catalogues qui, en se rapprochant des moteurs de recherche, amène à masquer la complexité et la finesse des métadonnées exploitables.277Cette approche pose en creux la question du retour sur investissement du travail conséquent de production manuelle de métadonnées.278Cette interrogation est d'autant plus forte qu'on assiste à une forme d'externalisation des activités d'indexation (lorsque les ressources sont acquises avec des métadonnées déjà établies) et des outils d'interrogation (comme avec les outils de découverte, qui permettent une interrogation unique de multiples réservoirs de contenus).279D'autre part, les bibliothèques ont travaillé à la diffusion et à l'intégration de leurs propres métadonnées dans les index des moteurs de recherche.280Ce faisant elles se placent ainsi dans le champ de vision des usagers lorsqu'ils utilisent un moteur de recherche pour leurs recherches documentaires.281Le dernier aspect de la médiation algorithmique à l'œuvre sur le Web est l'exploitation par les algorithmes des données d'usage issues des pratiques des internautes.282Cela correspond à des logiques de recommandation bien connues sur les réseaux sociaux mais également utilisées par des moteurs de recherche.283Il s'agit d'exploiter les données d'usage provenant des navigations de l'internaute, des liens qu'il suit ou encore de ses achats.284À partir de ces données, il devient possible de construire un maillage de proximité entre des pages web ou des produits comme nous l'évoquions pour les bibliothèques.285À la différence principale que cette proximité est construite de façon automatisée et individualisée.286Dans cette confrontation des bibliothèques aux algorithmes d'indexation, d'interrogation et de recommandation celles-ci ne sont pas dépourvues d'atouts.287Leur statut d'acteur public leur permet en effet de proposer une véritable transparence concernant les algorithmes qu'utilisent leurs outils.288Par rapport aux moteurs de recherche, cette capacité de rendre public le fonctionnement de leurs outils représente une réelle valeur ajoutée.289Elle permet de mettre en avant le caractère neutre du traitement documentaire et de l'accès proposés en bibliothèques, cette neutralité et cette ouverture pouvant aujourd'hui rencontrer un écho favorable auprès des usagers.290Cette neutralité se retrouve également dans le fait que l'indexation, et donc les proximités entre les ouvrages, sont établies de manière stable, en amont et indépendamment des usages.291Cela induit une médiation et une recommandation basée uniquement sur une logique sémantique et non sur les intérêts commerciaux de la mise en avant d'un document ou d'un site Web en particulier.292 Ce déploiement des potentialités d'indexation algorithmiques offertes par le format numérique ouvrent, entre autres, deux champs de réflexion pour les bibliothèques.293Le premier champ concerne l'exploitation des données d'usage pour des services de recommandation ou de médiation.294Cette question est complexe pour les bibliothèques.295Elle s'inscrit dans une tension délicate entre d'une part la garantie d'une forme relative d'anonymat, c'est-à-dire la garantie que les données d'usage ne seront exploitées que pour permettre le fonctionnement  normal de l'établissement (prêts, retours,  l'identification auprès des fournisseurs de ressources en ligne…) et d'autre part la mise en œuvre de services exploitant ces données, de la forme « ce qui ont emprunté ça ont aussi emprunté ça ».296Cette réflexion doit prendre en compte plusieurs aspects : le cadre juridique qui définit les conditions de conservation et d'utilisation des données personnelles en bibliothèque, l'attente des usagers de retrouver dans leur bibliothèque des services similaires à ceux qu'ils utilisent ailleurs sur le Web ou encore l'importance qu'ils accordent à la protection de leurs données personnelles.297Le deuxième champ est celui de l'exploitation des potentialités offertes par la dématérialisation des collections pour proposer des interfaces d'exploration innovantes.298Avec le livre papier, les contraintes physiques liées au rangement de volumes dans l'espace réel amènent les bibliothèques à choisir des modalités d'organisation qui privilégient la proximité.299Ainsi, dans la plupart des bibliothèques, la disposition des espaces et des documents donne aux usagers une indication sur l'organisation, généralement thématique, des collections.300Les classifications utilisées en bibliothèques, comme la classification de Dewey, définissent l'arborescence de ces thématiques.301Cette classification choisie par la bibliothèque est la seule proposée aux usagers.302Celle-ci placera tel ouvrage à côté de tel autre, imposant ainsi une modalité unique de découverte et d'exploration.303L'édition numérique ouvre de nouvelles possibilités dans ce domaine.304Affranchie des contraintes physiques, les collections peuvent être structurées autour d'une multitude d'axes différents et ainsi être abordées selon des critères très différents (par exemple le nombre d'emprunts, la date d'acquisition, la longueur ou la mention d'une personne ou d'un lieu).305Ces possibilités de structuration autour de critères différents, choisis potentiellement par l'utilisateur, créent de nouvelles proximités entre les ouvrages.306Elles permettent une exploration et une sérendipité bien plus dynamiques que sur papier, à condition que les interfaces proposées le permettent.307Les listes proposées par les catalogues, bien que pouvant souvent être triées selon de multiples critères, restent encore trop limitées pour permettre la même facilité de découverte que la déambulation dans les espaces physiques des bibliothèques.308 309=== Communautés et circulation310En intégrant des produits éditoriaux numériques dans leurs collections, les bibliothèques déploient progressivement une offre documentaire adressée non plus à un territoire mais à une communauté d'usagers.311Cette communauté, caractérisée jusqu'alors par une proximité géographique avec les établissements peut s'affranchir des contraintes de déplacement pour se rassembler autour d'une thématique ou d'un corpus particulier (un exemple de ces communautés est celle rassemblée autour des ressources proposées dans Gallica par la BNF).312En utilisant les réseaux sociaux ou leur propre site web, les bibliothèques construisent des communautés d'usagers en ligne, qui ne s'inscrivent plus dans un territoire défini.313Plus largement, l'édition numérique amène les bibliothèques à interroger le maillage territorial existant à l'aune d'une offre dématérialisée accessible de n'importe où.314Dans certains établissements des aspects administratifs ou réglementaires limitent l'inscription des usagers à ceux issus d'une zone géographique précise, ce n'est pas le cas partout et cela n'apporte pas d'éléments de réponse quant à la pertinence de ce type de maillage d'un territoire virtuel.315En s'affranchissant des contraintes logistiques et matérielles d'accès physique aux ouvrages, l'édition numérique questionne le sens des communautés d'usagers construites autour des bibliothèques.316Elle ouvre des opportunités réelles de toucher un public plus large, disséminé sur des territoires plus vastes, parfois éloigné ou empêché dans son accès à la bibliothèque comme bâtiment.317Ces nouvelles communautés d'usagers amènent une nouvelle conception du rôle de la bibliothèque comme espace public, numérique, et comme espace de sociabilisation.318",12486,False,2370.2269069874515,median319"///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////320// Copyright (c) 2016, Intel Corporation321// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 322// documentation files (the ""Software""), to deal in the Software without restriction, including without limitation 323// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to324// permit persons to whom the Software is furnished to do so, subject to the following conditions:325// The above copyright notice and this permission notice shall be included in all copies or substantial portions of 326// the Software.327// THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO328// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 329// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 330// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 331// SOFTWARE.332///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////333//334// Author(s):  Filip Strugar (filip.strugar@intel.com)335//336///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////337 338#include ""vaAssetPack.h""339 340#include ""Rendering/vaRenderMesh.h""341 342#include ""Scene/vaAssetImporter.h""343 344#include ""Rendering/Misc/vaTextureReductionTestTool.h""345 346#include ""Core/System/vaCompressionStream.h""347 348#include ""Core/System/vaFileTools.h""349 350#include ""IntegratedExternals/vaImguiIntegration.h""351 352using namespace VertexAsylum;353 354vaAssetTexture::vaAssetTexture( vaAssetPack & pack, const shared_ptr<vaTexture> & texture, const string & name ) 355    : vaAsset( pack, vaAssetType::Texture, name, texture )356{ }357 358vaAssetRenderMesh::vaAssetRenderMesh( vaAssetPack & pack, const shared_ptr<vaRenderMesh> & mesh, const string & name ) 359    : vaAsset( pack, vaAssetType::RenderMesh, name, mesh )360{ }361 362vaAssetRenderMaterial::vaAssetRenderMaterial( vaAssetPack & pack, const shared_ptr<vaRenderMaterial> & material, const string & name ) 363    : vaAsset( pack, vaAssetType::RenderMaterial, name, material )364{ }365 366vaAssetPack::vaAssetPack( vaAssetPackManager & assetPackManager, const string & name ) : m_assetPackManager(assetPackManager), m_name( name ), vaUIPanel( ""asset"", 0, true, vaUIPanel::DockLocation::DockedRight, ""Assets"" )367{368    assert( vaThreading::IsMainThread() );369}370 371vaAssetPack::~vaAssetPack( )372{373    assert( vaThreading::IsMainThread() );374 375    WaitUntilIOTaskFinished( );376    RemoveAll( true );377}378 379void vaAssetPack::InsertAndTrackMe( shared_ptr<vaAsset> newAsset, bool lockMutex )380{381    std::unique_lock<mutex> assetStorageMutexLock(m_assetStorageMutex, std::defer_lock );    if( lockMutex ) assetStorageMutexLock.lock(); else m_assetStorageMutex.assert_locked_by_caller();382 383    m_assetMap.insert( std::pair< string, shared_ptr<vaAsset> >( vaStringTools::ToLower( newAsset->Name() ), newAsset ) );384    //    if( storagePath != L"""" )385    //        m_assetMapByStoragePath.insert( std::pair< wstring, shared_ptr<vaAsset> >( vaStringTools::ToLower(newAsset->storagePath), newAsset ) );386 387    assert( newAsset->m_parentPackStorageIndex == -1 );388    m_assetList.push_back( newAsset );389    newAsset->m_parentPackStorageIndex = ((int)m_assetList.size())-1;390 391    // it's ok if it's already tracked - for ex. render meshes are always tracked392    //if( !393        newAsset->GetResource()->UIDObject_Track( ); // )394    //    VA_LOG_ERROR_STACKINFO( ""Error registering asset '%s' - UID already used; this means there's another asset somewhere with the same UID"", newAsset->Name().c_str() );395}396 397string vaAssetPack::FindSuitableAssetName( const string & _nameSuggestion, bool lockMutex )398{399    std::unique_lock<mutex> assetStorageMutexLock(m_assetStorageMutex, std::defer_lock );    if( lockMutex ) assetStorageMutexLock.lock(); else m_assetStorageMutex.assert_locked_by_caller();400 401    const string & nameSuggestion = _nameSuggestion;402 403    if( Find( nameSuggestion, false ) == nullptr )404        return nameSuggestion;405 406    int index = 0;407    do 408    {409        string newSuggestion = vaStringTools::Format( ""%s_%d"", nameSuggestion.c_str(), index );410        if( Find( newSuggestion, false ) == nullptr )411            return newSuggestion;412 413        index++;414    } while ( true );415 416}417 418shared_ptr<vaAssetTexture> vaAssetPack::Add( const std::shared_ptr<vaTexture> & texture, const string & name, bool lockMutex )419{420    std::unique_lock<mutex> assetStorageMutexLock(m_assetStorageMutex, std::defer_lock );    if( lockMutex ) assetStorageMutexLock.lock(); else m_assetStorageMutex.assert_locked_by_caller();421 422    if( Find( name, false ) != nullptr )423    {424        assert( false );425        VA_LOG_ERROR( ""Unable to add asset '%s' to the asset pack '%s' because the name already exists"", name.c_str( ), m_name.c_str( ) );426        return nullptr;427    }428//    assert( ( storagePath == L"""" ) || ( FindByStoragePath( storagePath ) == nullptr ) );    // assets in packs must have unique names429    430    shared_ptr<vaAssetTexture> newItem = shared_ptr<vaAssetTexture>( new vaAssetTexture( *this, texture, name ) );431 432    InsertAndTrackMe( newItem, false );433 434    return newItem;435}436 437shared_ptr<vaAssetRenderMesh> vaAssetPack::Add( const std::shared_ptr<vaRenderMesh> & mesh, const string & name, bool lockMutex )438{439    std::unique_lock<mutex> assetStorageMutexLock(m_assetStorageMutex, std::defer_lock );    if( lockMutex ) assetStorageMutexLock.lock(); else m_assetStorageMutex.assert_locked_by_caller();440 441    if( Find( name, false ) != nullptr )442    {443        assert( false );444        VA_LOG_ERROR( ""Unable to add asset '%s' to the asset pack '%s' because the name already exists"", name.c_str( ), m_name.c_str( ) );445        return nullptr;446    }447//    assert( ( storagePath == L"""" ) || ( FindByStoragePath( storagePath ) == nullptr ) );    // assets in packs must have unique names448 449    shared_ptr<vaAssetRenderMesh> newItem = shared_ptr<vaAssetRenderMesh>( new vaAssetRenderMesh( *this, mesh, name ) );450 451    InsertAndTrackMe( newItem, false );452 453    return newItem;454}455 456shared_ptr<vaAssetRenderMaterial> vaAssetPack::Add( const std::shared_ptr<vaRenderMaterial> & material, const string & name, bool lockMutex )457{458    std::unique_lock<mutex> assetStorageMutexLock(m_assetStorageMutex, std::defer_lock );    if( lockMutex ) assetStorageMutexLock.lock(); else m_assetStorageMutex.assert_locked_by_caller();459 460    if( Find( name, false ) != nullptr )461    {462        assert( false );463        VA_LOG_ERROR( ""Unable to add asset '%s' to the asset pack '%s' because the name already exists"", name.c_str(), m_name.c_str() );464        return nullptr;465    }466//    assert( (storagePath == L"""") || (FindByStoragePath( storagePath ) == nullptr) );    // assets in packs must have unique names467 468    shared_ptr<vaAssetRenderMaterial> newItem = shared_ptr<vaAssetRenderMaterial>( new vaAssetRenderMaterial( *this, material, name ) );469 470    InsertAndTrackMe( newItem, false );471 472    return newItem;473}474 475string vaAsset::GetTypeNameString( vaAssetType assetType )476{477    switch( assetType )478    {479    case vaAssetType::Texture:          return ""texture"";       break;480    case vaAssetType::RenderMesh:       return ""rendermesh"";    break;481    case vaAssetType::RenderMaterial:   return ""material"";      break;482    default: assert( false );           return ""unknown"";       break;    483    }484}485 486bool vaAsset::Rename( const string & newName )    487{ 488    return m_parentPack.RenameAsset( *this, newName, true ); 489}490 491bool vaAssetPack::RenameAsset( vaAsset & asset, const string & newName, bool lockMutex )492{493    std::unique_lock<mutex> assetStorageMutexLock(m_assetStorageMutex, std::defer_lock );    if( lockMutex ) assetStorageMutexLock.lock(); else m_assetStorageMutex.assert_locked_by_caller();494 495    if( &asset.m_parentPack != this )496    {497        VA_LOG_ERROR( ""Unable to change asset name from '%s' to '%s' in asset pack '%s' - not correct parent pack!"", asset.Name().c_str(), newName.c_str(), this->m_name.c_str()  );498        return false;499    }500    if( newName == asset.Name() )501    {502        VA_LOG( ""Changing asset name from '%s' to '%s' in asset pack '%s' - same name requested? Nothing changed."", asset.Name().c_str(), newName.c_str(), this->m_name.c_str()  );503        return true;504    }505    if( Find( newName, false ) != nullptr )506    {507        VA_LOG_ERROR( ""Unable to change asset name from '%s' to '%s' in asset pack '%s' - name already used by another asset!"", asset.Name().c_str(), newName.c_str(), this->m_name.c_str()  );508        return false;509    }510 511    {512        auto it = m_assetMap.find( vaStringTools::ToLower( asset.Name() ) );513 514        shared_ptr<vaAsset> assetSharedPtr;515 516        if( it != m_assetMap.end() ) 517        {518            assetSharedPtr = it->second;519            assert( assetSharedPtr.get() == &asset );520            m_assetMap.erase( it );521        }522        else523        {524            VA_LOG_ERROR( ""Error changing asset name from '%s' to '%s' in asset pack '%s' - original asset not found!"", asset.Name().c_str(), newName.c_str(), this->m_name.c_str()  );525            return false;526        }527 528        assetSharedPtr->m_name = newName;529 530        m_assetMap.insert( std::pair< string, shared_ptr<vaAsset> >( vaStringTools::ToLower( assetSharedPtr->Name() ), assetSharedPtr ) );531    }532 533    VA_LOG( ""Changing asset name from '%s' to '%s' in asset pack '%s' - success!"", asset.Name().c_str(), newName.c_str(), this->m_name.c_str() );534    return true;535}536 537void vaAssetPack::Remove( const shared_ptr<vaAsset> & asset, bool lockMutex )538{539    std::unique_lock<mutex> assetStorageMutexLock(m_assetStorageMutex, std::defer_lock );    if( lockMutex ) assetStorageMutexLock.lock(); else m_assetStorageMutex.assert_locked_by_caller();540 541    if( asset == nullptr )542        return;543 544    if( !asset->GetResource()->UIDObject_Untrack( ) )545        VA_LOG_ERROR_STACKINFO( ""Error untracking asset '%s' - not sure why it wasn't properly tracked"", asset->Name().c_str() );546 547    assert( m_assetList[asset->m_parentPackStorageIndex] == asset );548    if( (int)m_assetList.size( ) != ( asset->m_parentPackStorageIndex + 1 ) )549    {550        m_assetList[ asset->m_parentPackStorageIndex ] = m_assetList[ m_assetList.size( ) - 1 ];551        m_assetList[ asset->m_parentPackStorageIndex ]->m_parentPackStorageIndex = asset->m_parentPackStorageIndex;552    }553    asset->m_parentPackStorageIndex = -1;554    m_assetList.pop_back();555 556    {557        auto it = m_assetMap.find( vaStringTools::ToLower(asset->Name()) );558 559        // possible memory leak! does the asset belong to another asset pack?560        assert( it != m_assetMap.end() );561        if( it == m_assetMap.end() ) 562            return; 563    564        m_assetMap.erase( it );565    }566    567//    if( asset->StoragePath != L"""" )568//    {569//        auto it = m_assetMapByStoragePath.find( vaStringTools::ToLower(asset->StoragePath) );570//571//        // can't not be in!572//        assert( it != m_assetMapByStoragePath.end( ) );573//        if( it == m_assetMapByStoragePath.end( ) )574//            return;575//576//        m_assetMapByStoragePath.erase( it );577//    }578 579}580 581void vaAssetPack::RemoveAll( bool lockMutex )582{583    std::unique_lock<mutex> assetStorageMutexLock(m_assetStorageMutex, std::defer_lock );    if( lockMutex ) assetStorageMutexLock.lock(); else m_assetStorageMutex.assert_locked_by_caller();584 585    assert( m_ioTask == nullptr || vaBackgroundTaskManager::GetInstance().IsFinished(m_ioTask) );586    m_storageMode = vaAssetPack::StorageMode::Unknown;587 588    // untrack the asset resources so no one can find them anymore using vaUIDObjectRegistrar589    for( int i = 0; i < m_assetList.size( ); i++ )590    {591        if( !m_assetList[i]->GetResource()->UIDObject_Untrack( ) )592            VA_LOG_ERROR_STACKINFO( ""Error untracking asset '%s' - not sure why it wasn't properly tracked"", m_assetList[i]->Name().c_str() );593    }594 595    m_assetList.clear( );596//    m_assetMapByStoragePath.clear( );597 598    for( auto it = m_assetMap.begin( ); it != m_assetMap.end( ); it++ )599    {600        // if this fails it means someone is still holding a reference to assets from this pack - this shouldn't ever happen, they should have been released!601        assert( it->second.unique() );602    }603    m_assetMap.clear();604}605 606const int c_packFileVersion = 3;607 608bool vaAssetPack::IsBackgroundTaskActive( ) const609{610    assert( vaThreading::IsMainThread() );611    if( m_ioTask != nullptr )612        return !vaBackgroundTaskManager::GetInstance().IsFinished( m_ioTask );613    return false;614}615 616void vaAssetPack::WaitUntilIOTaskFinished( bool breakIfSafe )617{618    assert( vaThreading::IsMainThread() );619    assert( !breakIfSafe ); // not implemented/tested620    breakIfSafe;621 622    if( m_ioTask != nullptr )623    {624        vaBackgroundTaskManager::GetInstance().WaitUntilFinished( m_ioTask );625        m_ioTask = nullptr;626    }627    {628        std::unique_lock<mutex> apackStorageLock(m_apackStorageMutex);629        assert( !m_apackStorage.IsOpen() );630    }631}632 633bool vaAssetPack::SaveAPACK( const wstring & fileName, bool lockMutex )634{635    WaitUntilIOTaskFinished( );636 637    std::unique_lock<mutex> apackStorageLock(m_apackStorageMutex);638    if( !m_apackStorage.Open( fileName, FileCreationMode::Create ) )639    {640        VA_LOG_ERROR( L""vaAssetPack::SaveAPACK(%s) - unable to create file for saving"", fileName.c_str() );641        return false;642    }643 644    vaStream & outStream = m_apackStorage;645 646    std::unique_lock<mutex> assetStorageMutexLock(m_assetStorageMutex, std::defer_lock );    if( lockMutex ) assetStorageMutexLock.lock(); else m_assetStorageMutex.assert_locked_by_caller();647 648    VERIFY_TRUE_RETURN_ON_FALSE( outStream.CanSeek( ) );649 650    int64 posOfSize = outStream.GetPosition( );651    VERIFY_TRUE_RETURN_ON_FALSE( outStream.WriteValue<int64>( 0 ) );652 653    VERIFY_TRUE_RETURN_ON_FALSE( outStream.WriteValue<int32>( c_packFileVersion ) );654 655    bool useWholeFileCompression = true;656    VERIFY_TRUE_RETURN_ON_FALSE( outStream.WriteValue<bool>( useWholeFileCompression ) );657 658    // If compressing, have to write into memory buffer for later compression because seeking while659    // writing directly to a compression stream is not supported, and it's used here.660    vaMemoryStream memStream( (int64)0, (useWholeFileCompression)?( 16*1024 ): (0) );661    vaStream & outStreamInner = (useWholeFileCompression)?( memStream ):( outStream );662 663    VERIFY_TRUE_RETURN_ON_FALSE( outStreamInner.WriteValue<int32>( (int)m_assetMap.size() ) );664 665    for( auto it = m_assetMap.begin( ); it != m_assetMap.end( ); it++ )666    {667        int64 posOfSubSize = outStreamInner.GetPosition( );668        VERIFY_TRUE_RETURN_ON_FALSE( outStreamInner.WriteValue<int64>( 0 ) );669 670        // write type671        VERIFY_TRUE_RETURN_ON_FALSE( outStreamInner.WriteValue<int32>( (int32)it->second->Type ) );672 673        // write name674        VERIFY_TRUE_RETURN_ON_FALSE( outStreamInner.WriteString( it->first ) );675        assert( vaStringTools::CompareNoCase( it->first, it->second->Name() ) == 0 );676 677        // write asset resource ID678        VERIFY_TRUE_RETURN_ON_FALSE( outStreamInner.WriteValue<vaGUID>( it->second->GetResourceObjectUID() ) );679 680        // write asset681        VERIFY_TRUE_RETURN_ON_FALSE( it->second->SaveAPACK( outStreamInner ) );682 683        int64 calculatedSubSize = outStreamInner.GetPosition() - posOfSubSize;684        // auto aaaa = outStreamInner.GetPosition();685        outStreamInner.Seek( posOfSubSize );686        VERIFY_TRUE_RETURN_ON_FALSE( outStreamInner.WriteValue<int64>( calculatedSubSize ) );687        outStreamInner.Seek( posOfSubSize + calculatedSubSize );688    }689 690    if( useWholeFileCompression )691    {692        vaCompressionStream outCompressionStream( false, &outStream );693        // just dump the whole buffer and we're done!694        VERIFY_TRUE_RETURN_ON_FALSE( outCompressionStream.Write( memStream.GetBuffer(), memStream.GetLength() ) );695    }696 697    int64 calculatedSize = outStream.GetPosition( ) - posOfSize;698    outStream.Seek( posOfSize );699    VERIFY_TRUE_RETURN_ON_FALSE( outStream.WriteValue<int64>( calculatedSize ) );700    outStream.Seek( posOfSize + calculatedSize );701 702    m_apackStorage.Close();703    m_storageMode = StorageMode::APACK;704 705    return true;706}707 708bool vaAssetPack::LoadAPACKInner( vaStream & inStream, vector< shared_ptr<vaAsset> > & loadedAssets, vaBackgroundTaskManager::TaskContext & taskContext )709{710    m_assetStorageMutex.assert_locked_by_caller();711 712    int32 numberOfAssets = 0;713    VERIFY_TRUE_RETURN_ON_FALSE( inStream.ReadValue<int32>( numberOfAssets ) );714 715    for( int i = 0; i < numberOfAssets; i++ )716    {717        taskContext.Progress = float(i) / float(numberOfAssets-1);718 719        int64 subSize = 0;720        VERIFY_TRUE_RETURN_ON_FALSE( inStream.ReadValue<int64>( subSize ) );721 722        // read type723        vaAssetType assetType;724        VERIFY_TRUE_RETURN_ON_FALSE( inStream.ReadValue<int32>( (int32&)assetType ) );725 726        // read name727        string newAssetName;728        VERIFY_TRUE_RETURN_ON_FALSE( inStream.ReadString( newAssetName ) );729 730        string suitableName = FindSuitableAssetName( newAssetName, false );731        if( suitableName != newAssetName )732        {733            VA_LOG_WARNING( ""There's already an asset with the name '%s' - renaming the new one to '%s'"", newAssetName.c_str(), suitableName.c_str() );734            newAssetName = suitableName;735        }736        if( Find( newAssetName, false ) != nullptr )737        {738            VA_LOG_ERROR( L""vaAssetPack::Load(): duplicated asset name, stopping loading."" );739            assert( false );740            return false;741        }742 743        shared_ptr<vaAsset> newAsset = nullptr;744 745        switch( assetType )746        {747        case VertexAsylum::vaAssetType::Texture:748            newAsset = shared_ptr<vaAsset>( vaAssetTexture::CreateAndLoadAPACK( *this, newAssetName, inStream ) );749            break;750        case VertexAsylum::vaAssetType::RenderMesh:751            newAsset = shared_ptr<vaAsset>( vaAssetRenderMesh::CreateAndLoadAPACK( *this, newAssetName, inStream ) );752            break;753        case VertexAsylum::vaAssetType::RenderMaterial:754            newAsset = shared_ptr<vaAsset>( vaAssetRenderMaterial::CreateAndLoadAPACK( *this, newAssetName, inStream ) );755            break;756        default:757            break;758        }759 760        if( newAsset == nullptr )761        {762            VA_LOG_ERROR( ""Error while loading an asset - see log file above for more info - aborting loading."" );763            return false;764        }765        else766        {767            VERIFY_TRUE_RETURN_ON_FALSE( newAsset != nullptr );768 769            InsertAndTrackMe( newAsset, false );770 771            loadedAssets.push_back( newAsset );772        }773    }774    return true;775}776 777bool vaAssetPack::LoadAPACK( const wstring & fileName, bool async, bool lockMutex )778{779    WaitUntilIOTaskFinished( );780 781    std::unique_lock<mutex> apackStorageLock(m_apackStorageMutex);782    if( !m_apackStorage.Open( fileName, FileCreationMode::Open, FileAccessMode::Read ) )783    {784        VA_LOG_ERROR( L""vaAssetPack::LoadAPACK(%s) - unable to open file for reading"", fileName.c_str() );785        return false;786    }787 788    vaStream & inStream = m_apackStorage;789 790    std::unique_lock<mutex> assetStorageMutexLock(m_assetStorageMutex, std::defer_lock );    if( lockMutex ) assetStorageMutexLock.lock(); else m_assetStorageMutex.assert_locked_by_caller();791 792    RemoveAll( false );793 794    int64 size = 0;795    VERIFY_TRUE_RETURN_ON_FALSE( inStream.ReadValue<int64>( size ) );796 797    int32 fileVersion = 0;798    VERIFY_TRUE_RETURN_ON_FALSE( inStream.ReadValue<int32>( fileVersion ) );799    if( fileVersion < 1 || fileVersion > 3 )800    {801        VA_LOG_ERROR( L""vaAssetPack::Load(): unsupported file version"" );802        return false;803    }804 805    m_storageMode = StorageMode::APACK;806 807    bool useWholeFileCompression = false;808    if( fileVersion >= 3 )809    {810        VERIFY_TRUE_RETURN_ON_FALSE( inStream.ReadValue<bool>( useWholeFileCompression ) );811    }812 813    // ok let the loading thread grab the locks again before continuing with file access 814    assetStorageMutexLock.unlock();815    apackStorageLock.unlock();816 817    // async stuff here. 818    auto loadingLambda = [this, &inStream, useWholeFileCompression]( vaBackgroundTaskManager::TaskContext & context ) 819    {820        vector< shared_ptr<vaAsset> > loadedAssets;821 822        std::unique_lock<mutex> apackStorageLock(m_apackStorageMutex);823        std::unique_lock<mutex> assetStorageMutexLock(m_assetStorageMutex);824 825        bool success;826        if( useWholeFileCompression )827        {828            vaCompressionStream decompressor( true, &inStream );829            success = LoadAPACKInner( decompressor, loadedAssets, context );830        }831        else832        {833            success = LoadAPACKInner( inStream, loadedAssets, context );834        }835 836        m_apackStorage.Close();837 838        if( !success )839        {840            VA_LOG_ERROR( L""vaAssetPack::Load(): internal error during loading"" );841            RemoveAll( false );842        }843 844        return success;845    };846 847    if( async )848    {849        m_ioTask = vaBackgroundTaskManager::GetInstance().Spawn( vaStringTools::Format(""Loading '%s.apack'"", m_name.c_str() ), vaBackgroundTaskManager::SpawnFlags::ShowInUI, loadingLambda );850    }851    else852    {853        // assetStorageMutexLock.unlock();854        return loadingLambda( vaBackgroundTaskManager::TaskContext() );855    }856 857    return true;858}859 860bool vaAssetPack::SaveUnpacked( const wstring & folderRoot, bool lockMutex )861{862    assert(vaThreading::IsMainThread()); 863    WaitUntilIOTaskFinished( );864 865    std::unique_lock<mutex> assetStorageMutexLock(m_assetStorageMutex, std::defer_lock );    if( lockMutex ) assetStorageMutexLock.lock(); else m_assetStorageMutex.assert_locked_by_caller();866 867    if( vaFileTools::DirectoryExists(folderRoot) && !vaFileTools::DeleteDirectory( folderRoot ) )868    {869        VA_LOG_ERROR( L""vaAssetPack::SaveUnpacked - Unable to delete current contents of the folder '%s'"", folderRoot.c_str( ) );870        return false;871    }872    vaFileTools::EnsureDirectoryExists( folderRoot );873 874    vaFileStream headerFile;875    if( !headerFile.Open( folderRoot + L""AssetPack.xml"", FileCreationMode::OpenOrCreate, FileAccessMode::Write ) )876    {877        VA_LOG_ERROR( L""vaAssetPack::SaveUnpacked - Unable to open '%s'"", (folderRoot + L""/AssetPack.xml"").c_str() );878        return false;879    }880 881    vaXMLSerializer serializer;882 883    serializer.SerializeOpenChildElement( ""VertexAsylumAssetPack"" );884 885    int32 packFileVersion = c_packFileVersion;886    serializer.Serialize<int32>( ""FileVersion"", packFileVersion );887    //serializer.WriteAttribute( ""Name"", m_name );888 889    bool hadError = false;890 891    for( vaAssetType assetType = (vaAssetType)0; assetType < vaAssetType::MaxVal; assetType = (vaAssetType)((int32)assetType+1) )892    {893        string assetTypeName = vaAsset::GetTypeNameString( assetType );894        wstring assetTypeFolder = folderRoot + vaStringTools::SimpleWiden(assetTypeName) + L""s"";895 896        if( !vaFileTools::EnsureDirectoryExists( assetTypeFolder ) )897        {898            assert( false );899            hadError = true;900        }901 902        for( auto it = m_assetMap.begin( ); it != m_assetMap.end( ); it++ )903        {904            shared_ptr<vaAsset> & asset = it->second;905            if( asset->Type != assetType ) continue;906            if( asset->GetResourceObjectUID( ) == vaCore::GUIDNull( ) )907            {908                assert( false );909                hadError = true;910                continue;911            }912 913            wstring assetFolder = assetTypeFolder + L""\\\\"" + vaStringTools::SimpleWiden( asset->Name() ) + L""."" + vaCore::GUIDToString( asset->GetResourceObjectUID() );914            if( !vaFileTools::EnsureDirectoryExists( assetFolder ) )915            {916                assert( false );917                hadError = true;918                continue;919            }920 921            vaFileStream assetHeaderFile;922            if( !assetHeaderFile.Open( assetFolder + L""\\\\Asset.xml"", FileCreationMode::OpenOrCreate, FileAccessMode::Write ) )923            {924                VA_LOG_ERROR( L""vaAssetPack::SaveUnpacked - Unable to open '%s'"", (assetFolder + L""\\\\Asset.xml"").c_str() );925                serializer.SerializePopToParentElement( ""VertexAsylumAssetPack"" );926                return false;927            }928            vaXMLSerializer assetSerializer;929            string storageName = string(""Asset_"") + assetTypeName;930            assetSerializer.SerializeOpenChildElement( storageName.c_str() );931            if( !it->second->SerializeUnpacked( assetSerializer, assetFolder ) )932            {933                assert( false );934                hadError = true;935            }936            assetSerializer.SerializePopToParentElement( storageName.c_str() );937            assetSerializer.WriterSaveToFile( assetHeaderFile );938            assetHeaderFile.Close();939        }940    }941 942    serializer.SerializePopToParentElement(""VertexAsylumAssetPack"");943 944    serializer.WriterSaveToFile( headerFile );945 946    headerFile.Close();947 948    m_storageMode = StorageMode::Unpacked;949 950    return !hadError;951}952 953bool vaAssetPack::LoadUnpacked( const wstring & folderRoot, bool lockMutex )954{955    std::unique_lock<mutex> assetStorageMutexLock(m_assetStorageMutex, std::defer_lock );    if( lockMutex ) assetStorageMutexLock.lock(); else m_assetStorageMutex.assert_locked_by_caller();956 957    RemoveAll( false );958 959    vaFileStream headerFile;960    if( !headerFile.Open( folderRoot + L""\\\\AssetPack.xml"", FileCreationMode::Open, FileAccessMode::Read ) )961    {962        VA_LOG_ERROR( L""vaAssetPack::LoadUnpacked - Unable to open '%s'"", (folderRoot + L""\\\\AssetPack.xml"").c_str() );963        return false;964    }965 966    vaXMLSerializer serializer( headerFile );967    headerFile.Close();968 969    VERIFY_TRUE_RETURN_ON_FALSE( serializer.SerializeOpenChildElement( ""VertexAsylumAssetPack"" ) );970 971    int32 fileVersion = -1;972    VERIFY_TRUE_RETURN_ON_FALSE( serializer.Serialize<int32>( ""FileVersion"", (int32)fileVersion ) );973    // VERIFY_TRUE_RETURN_ON_FALSE( fileVersion == c_packFileVersion );974 975    // already named at creation976    // VERIFY_TRUE_RETURN_ON_FALSE( serializer.ReadAttribute( ""Name"", m_name ) );977 978    bool hadError = false;979    vector< shared_ptr<vaAsset> > loadedAssets;980 981    for( vaAssetType assetType = (vaAssetType)0; assetType < vaAssetType::MaxVal; assetType = (vaAssetType)((int32)assetType+1) )982    {983        string assetTypeName = vaAsset::GetTypeNameString( assetType );984        wstring assetTypeFolder = folderRoot + L""\\\\"" + vaStringTools::SimpleWiden(assetTypeName) + L""s"";985 986        if( !vaFileTools::DirectoryExists( assetTypeFolder ) )987        {988            // ok, just no assets of this type989            continue;990        }991 992        vector<wstring> subDirs = vaFileTools::FindDirectories( assetTypeFolder + L""\\\\"" );993 994        for( const wstring & subDir : subDirs )995        { 996            size_t nameStartA = subDir.rfind('\\\\');997            size_t nameStartB = subDir.rfind('/');998            nameStartA = ( nameStartA == wstring::npos ) ? ( 0 ) : ( nameStartA + 1 );999            nameStartB = ( nameStartB == wstring::npos ) ? ( 0 ) : ( nameStartB + 1 );1000            wstring dirName = subDir.substr( vaMath::Max( nameStartA, nameStartB ) );1001            if( dirName.length() == 0 ) 1002                { assert( false ); continue; }1003            size_t separator = dirName.find('.');1004            if( separator == wstring::npos )1005                { assert( false ); continue; }1006            string assetName   = vaStringTools::SimpleNarrow( dirName.substr( 0, separator ) );1007            vaGUID assetGUID   = vaCore::GUIDFromString( dirName.substr( separator+1 ) );1008            if( assetName == """" )1009                { assert( false ); continue; }1010            if( assetGUID == vaCore::GUIDNull() )1011                { assert( false ); continue; }1012            1013            vaFileStream assetHeaderFile;1014            if( !assetHeaderFile.Open( subDir + L""\\\\Asset.xml"", FileCreationMode::Open, FileAccessMode::Read ) )1015            {1016                VA_LOG_ERROR( L""vaAssetPack::LoadUnpacked - Unable to open '%s'"", (subDir + L""\\\\Asset.xml"").c_str() );1017                return false;1018            }1019            vaXMLSerializer assetSerializer( assetHeaderFile );1020            assetHeaderFile.Close();1021 1022            string suitableName = FindSuitableAssetName( assetName, false );1023            if( suitableName != assetName )1024            {1025                VA_LOG_WARNING( ""There's already an asset with the name '%s' - renaming the new one to '%s'"", assetName.c_str(), suitableName.c_str() );1026                assetName = suitableName;1027            }1028            if( Find( assetName, false ) != nullptr )1029            {1030                VA_LOG_ERROR( L""vaAssetPack::LoadUnpacked(): duplicated asset name, stopping loading."" );1031                assert( false );1032                return false;1033            }1034 1035            string storageName = string(""Asset_"") + assetTypeName;1036 1037            VERIFY_TRUE_RETURN_ON_FALSE( assetSerializer.SerializeOpenChildElement( storageName.c_str() ) );1038 1039            shared_ptr<vaAsset> newAsset = nullptr;1040 1041            switch( assetType )1042            {1043            case VertexAsylum::vaAssetType::Texture:1044                newAsset = shared_ptr<vaAsset>( vaAssetTexture::CreateAndLoadUnpacked( *this, assetName, assetGUID, assetSerializer, subDir ) );1045                break;1046            case VertexAsylum::vaAssetType::RenderMesh:1047                newAsset = shared_ptr<vaAsset>( vaAssetRenderMesh::CreateAndLoadUnpacked( *this, assetName, assetGUID, assetSerializer, subDir ) );1048                break;1049            case VertexAsylum::vaAssetType::RenderMaterial:1050                newAsset = shared_ptr<vaAsset>( vaAssetRenderMaterial::CreateAndLoadUnpacked( *this, assetName, assetGUID, assetSerializer, subDir ) );1051                break;1052            default:1053                break;1054            }1055            VERIFY_TRUE_RETURN_ON_FALSE( newAsset != nullptr );1056 1057            InsertAndTrackMe( newAsset, false );1058 1059            loadedAssets.push_back( newAsset );1060 1061            // if( !it->second->SerializeUnpacked( assetSerializer, assetFolder ) )1062            // {1063            //     assert( false );1064            //     hadError = true;1065            // }1066            VERIFY_TRUE_RETURN_ON_FALSE( assetSerializer.SerializePopToParentElement( storageName.c_str() ) );1067        }1068    }1069 1070    VERIFY_TRUE_RETURN_ON_FALSE( serializer.SerializePopToParentElement( ""VertexAsylumAssetPack"" ) );1071 1072    if( !hadError )1073    {1074        m_storageMode = StorageMode::Unpacked;1075        return true;1076    }1077    else1078    {1079        RemoveAll( false );1080        return false;1081    }1082}1083 1084void vaAsset::ReplaceAsset( const shared_ptr<vaAssetResource> & newResource )1085{1086    assert( m_resource != nullptr );1087 1088    // m_parentPack.GetAssetStorageMutex() ?1089 1090    assert( m_resource->UIDObject_IsTracked() );1091 1092    // This is done so that all other assets or systems referencing the texture by the ID now1093    // point to the new one!1094    vaUIDObjectRegistrar::GetInstance( ).SwapIDs( *m_resource, *newResource );1095 1096    m_resource->SetParentAsset( nullptr );1097    m_resource = newResource;1098    m_resource->SetParentAsset( this );1099 1100    assert( m_resource->UIDObject_IsTracked() );1101}1102 1103bool vaAsset::SaveAPACK( vaStream & outStream )1104{1105    assert( m_resource != nullptr );1106    return m_resource->SaveAPACK( outStream );1107}1108 1109//void vaAsset::LoadAPACK( vaStream & inStream )1110//{1111//    assert( m_resource != nullptr );1112//    m_resource->SaveAPACK( inStream );1113//}1114 1115bool vaAsset::SerializeUnpacked( vaXMLSerializer & serializer, const wstring & assetFolder )1116{1117    assert( m_resource != nullptr );1118    return m_resource->SerializeUnpacked( serializer, assetFolder );1119}1120 1121vaAssetRenderMesh * vaAssetRenderMesh::CreateAndLoadAPACK( vaAssetPack & pack, const string & name, vaStream & inStream )1122{1123    vaGUID uid;1124    VERIFY_TRUE_RETURN_ON_FALSE( inStream.ReadValue<vaGUID>( uid ) );1125 1126    shared_ptr<vaRenderMesh> newResource = pack.GetRenderDevice().GetMeshManager().CreateRenderMesh( uid );1127 1128    if( newResource == nullptr )1129        return nullptr;1130 1131    if( newResource->LoadAPACK( inStream ) )1132    {1133        return new vaAssetRenderMesh( pack, newResource, name );1134    }1135    else1136    {1137        VA_LOG_ERROR_STACKINFO( ""Error loading asset render mesh"" );1138        return nullptr;1139    }1140}1141 1142vaAssetRenderMaterial * vaAssetRenderMaterial::CreateAndLoadAPACK( vaAssetPack & pack, const string & name, vaStream & inStream )1143{1144    vaGUID uid;1145    VERIFY_TRUE_RETURN_ON_FALSE( inStream.ReadValue<vaGUID>( uid ) );1146 1147    shared_ptr<vaRenderMaterial> newResource = pack.GetRenderDevice().GetMaterialManager().CreateRenderMaterial( uid );1148 1149    if( newResource == nullptr )1150        return nullptr;1151 1152    if( newResource->LoadAPACK( inStream ) )1153    {1154        return new vaAssetRenderMaterial( pack, newResource, name );1155    }1156    else1157    {1158        return nullptr;1159    }1160}1161 1162vaAssetTexture * vaAssetTexture::CreateAndLoadAPACK( vaAssetPack & pack, const string & name, vaStream & inStream )1163{1164    vaGUID uid;1165    VERIFY_TRUE_RETURN_ON_FALSE( inStream.ReadValue<vaGUID>( uid ) );1166 1167    shared_ptr<vaTexture> newResource = VA_RENDERING_MODULE_CREATE_SHARED( vaTexture, vaTextureConstructorParams( pack.GetRenderDevice(), uid ) );1168 1169    if( newResource == nullptr )1170        return nullptr;1171 1172    if( newResource->LoadAPACK( inStream ) )1173    {1174        return new vaAssetTexture( pack, newResource, name );1175    }1176    else1177    {1178        return nullptr;1179    }1180}1181 1182vaAssetRenderMesh * vaAssetRenderMesh::CreateAndLoadUnpacked( vaAssetPack & pack, const string & name, const vaGUID & uid, vaXMLSerializer & serializer, const wstring & assetFolder )1183{1184    shared_ptr<vaRenderMesh> newResource = pack.GetRenderDevice().GetMeshManager().CreateRenderMesh( uid );1185 1186    if( newResource == nullptr )1187        return nullptr;1188 1189    if( newResource->SerializeUnpacked( serializer, assetFolder ) )1190    {1191        return new vaAssetRenderMesh( pack, newResource, name );1192    }1193    else1194    {1195        return nullptr;1196    }1197}1198 1199vaAssetRenderMaterial * vaAssetRenderMaterial::CreateAndLoadUnpacked( vaAssetPack & pack, const string & name, const vaGUID & uid, vaXMLSerializer & serializer, const wstring & assetFolder )1200{

Showing the first 1,200 of 84442 lines. Download the file for the rest.