Faits :
A.
Par jugement du 1er décembre 2020, le Tribunal correctionnel de l'arrondissement de Lausanne a constaté que A._ s'était rendu coupable de rupture de ban et d'infraction grave à la loi fédérale sur les stupéfiants, l'a condamné à une peine privative de liberté de 4,5 ans, sous déduction de 161 jours de détention provisoire et de 356 jours de détention en exécution anticipée de peine, a constaté que A._ avait subi 9 jours de détention dans des conditions de détention provisoire illicites et ordonné que 5 jours soient déduits de la peine fixée, a ordonné l'expulsion à vie de A._ du territoire suisse ainsi que l'inscription de cette mesure dans le Système d'Information Schengen (SIS) et a également ordonné son maintien en exécution anticipée de peine. Pour le surplus, le tribunal a prononcé des confiscations et statué sur les frais et indemnités.
B.
Par jugement du 20 mai 2021, la Cour d'appel pénale du Tribunal cantonal vaudois a rejeté l'appel formé par A._ contre la décision de première instance, qu'elle a confirmée. Ce jugement se fonde en substance sur les faits suivants.
B.a. A tout le moins entre l'année 2015 et le 4 juillet 2019, date de son interpellation, A._ a participé à un important trafic de cocaïne, dont l'ampleur n'a pas pu être déterminée avec précision. Toutefois, compte tenu des éléments recueillis en cours d'enquête, il a pu être établi que le trafic de A._ a porté sur une quantité totale minimale de 567.046 grammes de cocaïne pure. Le prénommé a ainsi réceptionné puis redistribué, respectivement revendu au moins 840 grammes bruts de cocaïne à d'autres trafiquants. A._ a également vendu des boulettes de cocaïne directement auprès de toxicomanes. En se basant sur un taux de pureté le plus favorable observé dans les statistiques pour des quantités comprises jusqu'à un gramme, il a vendu à divers consommateurs une quantité minimale de 45.846 grammes de cocaïne pure. Lors de la perquisition de son domicile clandestin, une quantité totale de 63.4 grammes de cocaïne pure a été découverte, sous forme de fingers, de boulettes et d'un sachet minigrip.
Entre le 19 octobre 2017, date à laquelle il a fini de purger diverses peines privatives de liberté prononcées à son encontre, et le 4 juillet 2019, A._ a persisté à séjourner illégalement en Suisse alors qu'il n'était titulaire d'aucune autorisation de séjour et qu'en outre, il faisait l'objet d'une mesure d'expulsion judiciaire d'une durée de cinq ans, prononcée le 31 janvier 2017.
B.b. Constatant que des éléments de preuve, sur lesquels se fondait le rapport d'investigation établi le 31 octobre 2019 par l'inspecteur B._, de la Police municipale de Lausanne, ne semblaient pas tous figurer au dossier en ce qui concernait les faits dénoncés sous chiffres 6.3.2 à 6.3.6 et 6.3.8 de ce rapport (lesquels correspondaient aux cas 2.1.2 à 2.1.6 et 2.1.8 de l'acte d'accusation du 7 mai 2020), le Président de la Cour d'appel pénale a, par plusieurs ordonnances successives, requis du ministère public qu'il produise les pièces à conviction manquantes, ce à quoi celui-ci a donné suite.
C.
A._ forme un recours en matière pénale au Tribunal fédéral. Il conclut, avec suite de frais et dépens, à l'admission du recours, à l'annulation du jugement de la Cour d'appel pénale du Tribunal cantonal vaudois et au renvoi de la cause à cette instance pour nouvelle décision. Il sollicite par ailleurs le bénéfice de l'assistance judiciaire.
Considérant en droit :
1.
Le recours en matière pénale est une voie de réforme (art. 107 al. 2 LTF). Le recourant ne peut se borner à demander l'annulation de la décision et le renvoi de la cause à l'autorité cantonale, mais doit également, sous peine d'irrecevabilité, prendre des conclusions sur le fond du litige. Il n'est fait exception à ce principe que lorsque le Tribunal fédéral, s'il admettait le recours, ne serait pas en mesure de statuer lui-même sur le fond et ne pourrait que renvoyer la cause à l'autorité cantonale (ATF 137 II 313 consid. 1.3 p. 317; 134 III 379 consid. 1.3 p. 383; 133 III 489 consid. 3.1 p. 489 s.; arrêt 6B_1463/2020 du 5 janvier 2022 consid. 1.1 et la référence citée).
En l'espèce, le recourant se borne à conclure à l'admission de son recours et à l'annulation du jugement attaqué. On parvient néanmoins à comprendre, sur le vu des motifs du recours, qu'il entend obtenir la réforme du jugement attaqué, dans le sens d'un renvoi de la cause à la cour cantonale pour qu'elle statue à nouveau sur l'affaire après avoir produit l'intégralité des dossiers d'enquête en lien avec sa condamnation. Cela suffit tout juste pour satisfaire aux exigences de forme déduites de l'art. 42 al. 1 et 2 LTF.
2.
Invoquant les art. 29 al. 2 Cst., 6 par. 1 et 3 CEDH, 3 al. 2 let. c et 107 CPP, le recourant se plaint de la violation de son droit d'être entendu, de son droit à un procès équitable ainsi que de son droit de faire administrer des preuves. Il fait grief à la cour cantonale d'avoir ordonné uniquement la production des éléments de preuve sur lesquels s'appuie le rapport d'investigation, et non l'entier des dossiers issus des enquêtes menées contre des tiers, le privant ainsi de la possibilité d'y puiser des éléments à décharge.
2.1. Compris comme l'un des aspects de la notion générale de procès équitable au sens de l'art. 29 Cst., le droit d'être entendu garantit notamment le droit pour l'intéressé de prendre connaissance du dossier et de participer à l'administration des preuves essentielles ou, à tout le moins, de s'exprimer sur son résultat lorsque cela est de nature à influer sur la décision à rendre (ATF 136 V 118 consid. 4.2.2 p. 125; 135 II 286 consid. 5.1 p. 293; arrêt 1B_273/2019 du 3 décembre 2019 consid. 2.1). Le prévenu doit pouvoir consulter le dossier pour connaître préalablement les éléments dont dispose l'autorité et jouir ainsi d'une réelle possibilité de faire valoir ses arguments dans une procédure. Pour que cette consultation soit utile, le dossier doit être complet afin que le prévenu puisse, cas échéant, soulever une objection contre leur validité. C'est une condition pour qu'il puisse sauvegarder d'une manière générale ses droits de la défense, comme l'exigent les art. 32 al. 2 Cst. et 6 par. 3 let. b CEDH (cf. ATF 129 I 85 consid. 4.1 p. 88 s.; arrêts 6B_1188/2020 du 7 juillet 2021 consid. 1.1.1; 1B_273/2019 du 3 décembre 2019 consid. 2.1).
Selon une jurisprudence constante, le droit du prévenu de participer à l'administration des preuves ne s'étend pas aux procédures conduites séparément contre d'autres prévenus, raison pour laquelle il ne peut pas invoquer l'art. 147 al. 1 CPP (ATF 141 IV 220 consid. 4.5 p. 229 s.; 140 IV 172 consid. 1.2 p. 174 ss). Si des pièces d'une procédure séparée sont consultées, les déclarations à charge de personnes prévenues dans l'autre procédure ainsi que de témoins et de personnes entendues aux fins de renseignement ne peuvent toutefois être exploitées à la charge de la personne prévenue que si celle-ci a eu au moins une fois l'occasion adéquate et suffisante de mettre en doute les déclarations à sa charge et de poser des questions aux personnes concernées (ATF 144 IV 97 consid. 2.2 p. 102; 141 IV 220 consid. 4.5 p. 230; arrêt 6B_236/2020 du 27 août 2020 consid. 1.3).
2.2. La cour cantonale a constaté qu'au moment de rendre son jugement, l'autorité de première instance ne disposait pas au dossier de tous les éléments de preuve mentionnés dans le rapport d'investigation du 31 octobre 2019, auquel se référaient pour l'essentiel les premiers juges dans les considérants de leur décision. Il en allait ainsi des cas 2.1.2 à 2.1.6 et 2.1.8 de l'acte d'accusation, où faisaient défaut les éléments de comptabilité de la plupart des fournisseurs de cocaïne auprès de qui le recourant s'était approvisionné, ainsi qu'un enregistrement d'une conversation téléphonique entre le recourant et un dépositaire non identifié. Dans cette mesure, le recourant n'avait pas eu la possibilité d'avoir accès à l'entier du dossier de la procédure instruite contre lui, avec pour conséquence une violation manifeste de son droit d'être entendu. La cour cantonale a donc requis ces éléments de preuve auprès du ministère public pour être versés au dossier de la cause (jugement entrepris, consid. 4.3 et 4.4). Dans son jugement, elle a constaté que tous les éléments de preuve nécessaires à l'établissement des faits retenus par l'autorité de première instance figuraient désormais au dossier. La violation du droit d'être entendu du recourant, en lien avec son droit d'accès au dossier, avait ainsi été réparée devant l'instance d'appel (jugement entrepris, consid. 4.4).
2.3. Conformément à ce qui précède (consid. 2.1 supra), le recourant peut uniquement déduire des principes qu'il invoque le droit d'être confronté aux éléments de preuve émanant de causes distinctes qui sont exploités à charge. Il ne conteste pas, d'ailleurs, avoir eu la possibilité de consulter et de s'exprimer sur les preuves retenues à l'appui de sa condamnation. En revanche, le respect des droits de la défense n'imposait pas de verser l'intégralité des dossiers d'autres enquêtes à la présente procédure. Le recourant n'explique du reste pas en quoi ces dossiers auraient été pertinents pour l'issue de la cause. On ne voit pas non plus que le prénommé eût été privé de la possibilité de requérir l'administration de preuves complémentaires. Le recourant s'est borné à solliciter la production de l'intégralité des dossiers de procédures tierces sans établir en quoi ils étaient nécessaires au traitement de l'appel (cf. art. 389 al. 3 CPP) et il ne conteste pas, devant la cour de céans, le rejet de cette requête par la cour cantonale. Dans cette mesure, le recourant n'établit pas de violation des droits qu'il invoque.
2.4. Pour le reste, le recourant ne se plaint pas d'avoir pu consulter les éléments à charge émanant des autres causes tardivement. Quoi qu'il en soit, même si le recourant n'a pas pu consulter le dossier complet avant le dépôt de son appel auprès de l'autorité précédente, il a pu faire valoir tous ses moyens - formels et matériels - auprès de celle-ci, qui disposait d'une pleine cognition en fait et en droit (art. 392 al. 3 CPP). Il n'y aurait, de toute façon, pas davantage de violation de ses droits de partie sous cet angle.
3.
Le recourant soutient qu'il a, dans le cadre de son appel, reproché aux juges de première instance d'avoir retenu des faits à charge sur la seule base du rapport de police, lequel ne constituait pas une preuve formelle. La cour cantonale aurait donc dû écarter les incriminations y relatives. Faute de l'avoir fait, elle avait établi l'état de fait du jugement entrepris de manière arbitraire au sens de l'art. 97 LTF.
3.1. Comme vu ci-dessus, la cour cantonale a complété le dossier de la cause en requérant du ministère public qu'il produise les éléments de preuve sur lesquels s'appuyait le rapport d'investigation de la police, lorsqu'ils étaient manquants. Puis, elle a repris chacun des cas concernés par l'appel pour vérifier si les moyens de preuve, sur lesquels s'étaient fondés les premiers juges au travers du rapport d'investigation du 31 octobre 2019, se trouvaient dorénavant tous au dossier de la cause et examiner s'ils permettaient effectivement d'établir les faits retenus par cette autorité (jugement entrepris, consid. 4.3). Elle a ainsi retenu six des sept cas admis par l'autorité de première instance, libérant le recourant du septième dans la mesure où elle a considéré qu'en l'absence d'indices suffisants, il existait un doute qui imposait d'exclure l'existence de la transaction en cause (jugement entrepris, consid. 4.3.1 à 4.3.8).
3.2. Dans la mesure où, aux termes de l'art. 398 al. 2 et 3 CPP, la juridiction d'appel jouit d'un plein pouvoir d'examen sur tous les points attaqués du jugement, la cour cantonale pouvait apprécier les preuves et établir les faits librement, ce qu'elle n'a pas manqué de faire une fois le dossier de la cause complété. C'est encore le lieu de préciser que, quoi qu'en dise le recourant, un rapport de police est susceptible de constituer un moyen de preuve (arrêts 6B_1253/2019 du 18 février 2020 consid. 3; 6B_446/2019 du 5 juillet 2019 consid. 2.1; 6B_1140/2014 du 3 mars 2016 consid. 1.3 [non publié aux ATF 142 IV 129]).
Le grief élevé par le recourant ne démontre donc nullement en quoi l'état de fait de la décision entreprise aurait été établi de manière arbitraire. Son grief est infondé.
4.
Compte tenu de ce qui précède, le recours doit être rejeté dans la mesure où il est recevable. Comme il était dénué de chances de succès, la demande d'assistance judiciaire doit être rejetée (art. 64 al. 1 LTF). Le recourant, qui succombe, supportera les frais judiciaires (art. 66 al. 1 LTF), dont le montant sera toutefois fixé en tenant compte de sa situation financière qui n'apparaît pas favorable.
Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté dans la mesure où il est recevable.
2.
La demande d'assistance judiciaire est rejetée.
3.
Les frais judiciaires, arrêtés à 1'200 fr., sont mis à la charge du recourant.
4.
Le présent arrêt est communiqué aux parties et à la Cour d'appel pénale du Tribunal cantonal du canton de Vaud.
Lausanne, le 10 février 2022
Au nom de la Cour de droit pénal
du Tribunal fédéral suisse
La Présidente : Jacquemoud-Rossari
La Greffière: Musy