GSaha567/seq_level_training_data
052
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{