Faits: Faits: A. Par jugement du 29 janvier 2004, le Tribunal correctionnel de l'arrondissement de Lausanne a reconnu X._, ressortissant de la Guinée Bissau, coupable d'infraction à la LStup et à la LArm, ainsi que de blanchiment d'argent. Il l'a condamné de ce fait à la peine de huit ans de réclusion, sous déduction de quatre-cent huit jours de détention préventive, ainsi qu'à l'expulsion à vie du territoire suisse. Le Tribunal correctionnel a retenu que X._ aurait acquis et possédé 2,750 kg de cocaïne présentant un haut degré de pureté. Il aurait coupé et conditionné la drogue, pour la confier à des revendeurs. Il en aurait lui-même écoulé plus de 300 g auprès de consommateurs réguliers. Il aurait également revendu et fumé de la marijuana, consommé de l'ecstasy et porté sans autorisation un couteau assimilé à une arme. Par arrêt du 29 avril 2004, notifié le 11 août suivant, la Cour de cassation pénale du Tribunal cantonal du canton de Vaud a rejeté le recours formé par X._ contre le jugement du 29 janvier 2004, qu'elle a confirmé. Par arrêt du 29 avril 2004, notifié le 11 août suivant, la Cour de cassation pénale du Tribunal cantonal du canton de Vaud a rejeté le recours formé par X._ contre le jugement du 29 janvier 2004, qu'elle a confirmé. B. Agissant par la voie du recours de droit public, X._ demande au Tribunal fédéral d'annuler l'arrêt du 29 avril 2004. Il invoque les art. 9, 29 et 32 Cst., ainsi que l'art. 6 par. 2 CEDH. Il requiert l'assistance judiciaire. La Cour de cassation se réfère à son arrêt. Le Ministère public propose le rejet du recours.