public ShaderResourceManager( GraphicsDevice graphicsDevice, StandardGraphicsResources standardGraphicsResources) { using (GameTrace.TraceDurationEvent("ShaderResourceManager()")) { Global = AddDisposable(new GlobalShaderResources(graphicsDevice, standardGraphicsResources.SolidWhiteTexture)); Mesh = AddDisposable(new MeshShaderResources(graphicsDevice)); RadiusCursor = AddDisposable(new RadiusCursorDecalShaderResources(graphicsDevice, standardGraphicsResources.Aniso4xClampSampler)); FixedFunction = AddDisposable(new FixedFunctionShaderResources(graphicsDevice, Global, Mesh)); MeshDepth = AddDisposable(new MeshDepthShaderResources(graphicsDevice, Global, Mesh)); Particle = AddDisposable(new ParticleShaderResources(graphicsDevice, Global)); Road = AddDisposable(new RoadShaderResources(graphicsDevice, Global, RadiusCursor)); Sprite = AddDisposable(new SpriteShaderResources(graphicsDevice)); Terrain = AddDisposable(new TerrainShaderResources(graphicsDevice, Global, RadiusCursor)); Water = AddDisposable(new WaterShaderResources(graphicsDevice, Global)); _shaderMaterialResources = new Dictionary <string, ShaderMaterialShaderResources> { { "NormalMapped", AddDisposable(new NormalMappedShaderResources(graphicsDevice, Global, Mesh)) }, { "Simple", AddDisposable(new SimpleShaderResources(graphicsDevice, Global, Mesh)) } }; } }
public GraphicsLoadContext( GraphicsDevice graphicsDevice, StandardGraphicsResources standardGraphicsResources, ShaderResourceManager shaderResources) { GraphicsDevice = graphicsDevice; StandardGraphicsResources = standardGraphicsResources; ShaderResources = shaderResources; }
public AssetLoadContext( FileSystem fileSystem, string language, GraphicsDevice graphicsDevice, StandardGraphicsResources standardGraphicsResources, ShaderResourceManager shaderResources, AssetStore assetStore) { FileSystem = fileSystem; Language = language; GraphicsDevice = graphicsDevice; StandardGraphicsResources = standardGraphicsResources; ShaderResources = shaderResources; AssetStore = assetStore; }
public GlobalShaderResourceData( GraphicsDevice graphicsDevice, GlobalShaderResources globalShaderResources, StandardGraphicsResources standardGraphicsResources) { _graphicsDevice = graphicsDevice; _globalShaderResources = globalShaderResources; _standardGraphicsResources = standardGraphicsResources; _globalConstantBuffer = AddDisposable(new ConstantBuffer <GlobalShaderResources.GlobalConstants>(graphicsDevice, "GlobalConstants")); GlobalConstantsResourceSet = AddDisposable(graphicsDevice.ResourceFactory.CreateResourceSet( new ResourceSetDescription( globalShaderResources.GlobalConstantsResourceLayout, _globalConstantBuffer.Buffer))); _globalLightingBufferVS = AddDisposable(new ConstantBuffer <GlobalShaderResources.LightingConstantsVS>(graphicsDevice, "GlobalLightingConstantsVS")); SetGlobalLightingBufferVS(graphicsDevice); _globalLightingBufferPS = AddDisposable(new ConstantBuffer <GlobalShaderResources.LightingConstantsPS>(graphicsDevice, "GlobalLightingConstantsPS")); }
internal AssetStore( SageGame sageGame, FileSystem fileSystem, string language, GraphicsDevice graphicsDevice, StandardGraphicsResources standardGraphicsResources, ShaderResourceManager shaderResources, OnDemandAssetLoadStrategy loadStrategy) { LoadContext = new AssetLoadContext( fileSystem, language, graphicsDevice, standardGraphicsResources, shaderResources, this); _scopedSingleAssetStorage = new List <IScopedSingleAssetStorage>(); _singleAssetStorageByTypeId = new Dictionary <uint, IScopedSingleAssetStorage>(); void AddSingleAssetStorage <TAsset>(ScopedSingleAsset <TAsset> assetStorage) where TAsset : BaseSingletonAsset, new() { _scopedSingleAssetStorage.Add(assetStorage); var typeId = AssetTypeUtility.GetAssetTypeId <TAsset>(sageGame); _singleAssetStorageByTypeId.Add(typeId, assetStorage); } AddSingleAssetStorage(AIData = new ScopedSingleAsset <AIData>()); AddSingleAssetStorage(AnimationSoundClientBehaviorGlobalSetting = new ScopedSingleAsset <AnimationSoundClientBehaviorGlobalSetting>()); AddSingleAssetStorage(AptButtonTooltipMap = new ScopedSingleAsset <AptButtonTooltipMap>()); AddSingleAssetStorage(ArmySummaryDescription = new ScopedSingleAsset <ArmySummaryDescription>()); AddSingleAssetStorage(AudioSettings = new ScopedSingleAsset <AudioSettings>()); AddSingleAssetStorage(AwardSystem = new ScopedSingleAsset <AwardSystem>()); AddSingleAssetStorage(BannerUI = new ScopedSingleAsset <BannerUI>()); AddSingleAssetStorage(ChallengeGenerals = new ScopedSingleAsset <ChallengeGenerals>()); AddSingleAssetStorage(CreateAHeroSystem = new ScopedSingleAsset <CreateAHeroSystem>()); AddSingleAssetStorage(Credits = new ScopedSingleAsset <Credits>()); AddSingleAssetStorage(DrawGroupInfo = new ScopedSingleAsset <DrawGroupInfo>()); AddSingleAssetStorage(Environment = new ScopedSingleAsset <Environment>()); AddSingleAssetStorage(Fire = new ScopedSingleAsset <Fire>()); AddSingleAssetStorage(FireLogicSystem = new ScopedSingleAsset <FireLogicSystem>()); AddSingleAssetStorage(FormationAssistant = new ScopedSingleAsset <FormationAssistant>()); AddSingleAssetStorage(GameData = new ScopedSingleAsset <GameData>()); AddSingleAssetStorage(InGameNotificationBox = new ScopedSingleAsset <InGameNotificationBox>()); AddSingleAssetStorage(InGameUI = new ScopedSingleAsset <InGameUI>()); AddSingleAssetStorage(Language = new ScopedSingleAsset <Language>()); AddSingleAssetStorage(LinearCampaign = new ScopedSingleAsset <LinearCampaign>()); AddSingleAssetStorage(LargeGroupAudioUnusedKnownKeys = new ScopedSingleAsset <LargeGroupAudioUnusedKnownKeys>()); AddSingleAssetStorage(LivingWorldMapInfo = new ScopedSingleAsset <LivingWorldMapInfo>()); AddSingleAssetStorage(LivingWorldAutoResolveResourceBonus = new ScopedSingleAsset <LivingWorldAutoResolveResourceBonus>()); AddSingleAssetStorage(LivingWorldAutoResolveSciencePurchasePointBonus = new ScopedSingleAsset <LivingWorldAutoResolveSciencePurchasePointBonus>()); AddSingleAssetStorage(MiscAudio = new ScopedSingleAsset <MiscAudio>()); AddSingleAssetStorage(MiscEvaData = new ScopedSingleAsset <MiscEvaData>()); AddSingleAssetStorage(MissionObjectiveList = new ScopedSingleAsset <MissionObjectiveList>()); AddSingleAssetStorage(MouseData = new ScopedSingleAsset <MouseData>()); AddSingleAssetStorage(MultiplayerSettings = new ScopedSingleAsset <MultiplayerSettings>()); AddSingleAssetStorage(OnlineChatColors = new ScopedSingleAsset <OnlineChatColors>()); AddSingleAssetStorage(Pathfinder = new ScopedSingleAsset <Pathfinder>()); AddSingleAssetStorage(StrategicHud = new ScopedSingleAsset <StrategicHud>()); AddSingleAssetStorage(WaterTransparency = new ScopedSingleAsset <WaterTransparency>()); AddSingleAssetStorage(Weather = new ScopedSingleAsset <Weather>()); _scopedAssetCollections = new List <IScopedAssetCollection>(); _byTypeId = new Dictionary <uint, IScopedAssetCollection>(); void AddAssetCollection <TAsset>(ScopedAssetCollection <TAsset> assetCollection) where TAsset : BaseAsset { _scopedAssetCollections.Add(assetCollection); var typeId = AssetTypeUtility.GetAssetTypeId <TAsset>(sageGame); _byTypeId.Add(typeId, assetCollection); } AddAssetCollection(AIBases = new ScopedAssetCollection <AIBase>(this)); AddAssetCollection(AIDozerAssignments = new ScopedAssetCollection <AIDozerAssignment>(this)); AddAssetCollection(AmbientStreams = new ScopedAssetCollection <AmbientStream>(this)); AddAssetCollection(Animations = new ScopedAssetCollection <Animation>(this)); AddAssetCollection(ArmorTemplates = new ScopedAssetCollection <ArmorTemplate>(this)); AddAssetCollection(ArmyDefinitions = new ScopedAssetCollection <ArmyDefinition>(this)); AddAssetCollection(AudioEvents = new ScopedAssetCollection <AudioEvent>(this)); AddAssetCollection(AudioFiles = new ScopedAssetCollection <AudioFile>(this, loadStrategy.CreateAudioFileLoader())); AddAssetCollection(AudioLods = new ScopedAssetCollection <AudioLod>(this)); AddAssetCollection(AutoResolveArmors = new ScopedAssetCollection <AutoResolveArmor>(this)); AddAssetCollection(AutoResolveBodies = new ScopedAssetCollection <AutoResolveBody>(this)); AddAssetCollection(AutoResolveCombatChains = new ScopedAssetCollection <AutoResolveCombatChain>(this)); AddAssetCollection(AutoResolveHandicapLevels = new ScopedAssetCollection <AutoResolveHandicapLevel>(this)); AddAssetCollection(AutoResolveLeaderships = new ScopedAssetCollection <AutoResolveLeadership>(this)); AddAssetCollection(AutoResolveReinforcementSchedules = new ScopedAssetCollection <AutoResolveReinforcementSchedule>(this)); AddAssetCollection(AutoResolveWeapons = new ScopedAssetCollection <AutoResolveWeapon>(this)); AddAssetCollection(BannerTypes = new ScopedAssetCollection <BannerType>(this)); AddAssetCollection(BenchProfiles = new ScopedAssetCollection <BenchProfile>(this)); AddAssetCollection(BridgeTemplates = new ScopedAssetCollection <BridgeTemplate>(this)); AddAssetCollection(CampaignTemplates = new ScopedAssetCollection <CampaignTemplate>(this)); AddAssetCollection(CommandButtons = new ScopedAssetCollection <CommandButton>(this)); AddAssetCollection(CommandMaps = new ScopedAssetCollection <CommandMap>(this)); AddAssetCollection(CommandSets = new ScopedAssetCollection <CommandSet>(this)); AddAssetCollection(ControlBarResizers = new ScopedAssetCollection <ControlBarResizer>(this)); AddAssetCollection(ControlBarSchemes = new ScopedAssetCollection <ControlBarScheme>(this)); AddAssetCollection(CrateDatas = new ScopedAssetCollection <CrateData>(this)); AddAssetCollection(CrowdResponses = new ScopedAssetCollection <CrowdResponse>(this)); AddAssetCollection(DamageFXs = new ScopedAssetCollection <DamageFX>(this)); AddAssetCollection(DialogEvents = new ScopedAssetCollection <DialogEvent>(this)); AddAssetCollection(DynamicGameLods = new ScopedAssetCollection <DynamicGameLod>(this)); AddAssetCollection(EmotionNuggets = new ScopedAssetCollection <EmotionNugget>(this)); AddAssetCollection(EvaEvents = new ScopedAssetCollection <EvaEvent>(this)); AddAssetCollection(ExperienceLevels = new ScopedAssetCollection <ExperienceLevel>(this)); AddAssetCollection(ExperienceScalarTables = new ScopedAssetCollection <ExperienceScalarTable>(this)); AddAssetCollection(FactionVictoryDatas = new ScopedAssetCollection <FactionVictoryData>(this)); AddAssetCollection(FontDefaultSettings = new ScopedAssetCollection <FontDefaultSetting>(this)); AddAssetCollection(FontSubstitutions = new ScopedAssetCollection <FontSubstitution>(this)); AddAssetCollection(FXLists = new ScopedAssetCollection <FXList>(this)); AddAssetCollection(FXParticleSystemTemplates = new ScopedAssetCollection <FXParticleSystemTemplate>(this)); AddAssetCollection(GuiTextures = new ScopedAssetCollection <GuiTextureAsset>(this, loadStrategy.CreateGuiTextureLoader())); AddAssetCollection(HeaderTemplates = new ScopedAssetCollection <HeaderTemplate>(this)); AddAssetCollection(HouseColors = new ScopedAssetCollection <HouseColor>(this)); AddAssetCollection(LargeGroupAudioMaps = new ScopedAssetCollection <LargeGroupAudioMap>(this)); AddAssetCollection(LivingWorldAITemplates = new ScopedAssetCollection <LivingWorldAITemplate>(this)); AddAssetCollection(LivingWorldAnimObjects = new ScopedAssetCollection <LivingWorldAnimObject>(this)); AddAssetCollection(LivingWorldArmyIcons = new ScopedAssetCollection <LivingWorldArmyIcon>(this)); AddAssetCollection(LivingWorldBuildings = new ScopedAssetCollection <LivingWorldBuilding>(this)); AddAssetCollection(LivingWorldBuildingIcons = new ScopedAssetCollection <LivingWorldBuildingIcon>(this)); AddAssetCollection(LivingWorldBuildPlotIcons = new ScopedAssetCollection <LivingWorldBuildPlotIcon>(this)); AddAssetCollection(LivingWorldCampaigns = new ScopedAssetCollection <LivingWorldCampaign>(this)); AddAssetCollection(LivingWorldObjects = new ScopedAssetCollection <LivingWorldObject>(this)); AddAssetCollection(LivingWorldPlayerArmies = new ScopedAssetCollection <LivingWorldPlayerArmy>(this)); AddAssetCollection(LivingWorldPlayerTemplates = new ScopedAssetCollection <LivingWorldPlayerTemplate>(this)); AddAssetCollection(LivingWorldRegionCampaigns = new ScopedAssetCollection <LivingWorldRegionCampaign>(this)); AddAssetCollection(LivingWorldRegionEffects = new ScopedAssetCollection <LivingWorldRegionEffects>(this)); AddAssetCollection(LivingWorldSounds = new ScopedAssetCollection <LivingWorldSound>(this)); AddAssetCollection(LocomotorTemplates = new ScopedAssetCollection <LocomotorTemplate>(this)); AddAssetCollection(LodPresets = new ScopedAssetCollection <LodPreset>(this)); AddAssetCollection(MapCaches = new ScopedAssetCollection <MapCache>(this)); AddAssetCollection(MappedImages = new ScopedAssetCollection <MappedImage>(this)); AddAssetCollection(MeshNameMatches = new ScopedAssetCollection <MeshNameMatches>(this)); AddAssetCollection(Models = new ScopedAssetCollection <Model>(this, loadStrategy.CreateModelLoader())); AddAssetCollection(ModelAnimations = new ScopedAssetCollection <Graphics.Animation.W3DAnimation>(this, loadStrategy.CreateAnimationLoader())); AddAssetCollection(ModelBoneHierarchies = new ScopedAssetCollection <ModelBoneHierarchy>(this, loadStrategy.CreateModelBoneHierarchyLoader())); AddAssetCollection(ModelMeshes = new ScopedAssetCollection <ModelMesh>(this)); // TODO: ModelMesh loader? AddAssetCollection(ModifierLists = new ScopedAssetCollection <ModifierList>(this)); AddAssetCollection(MouseCursors = new ScopedAssetCollection <MouseCursor>(this)); AddAssetCollection(MultiplayerColors = new ScopedAssetCollection <MultiplayerColor>(this)); AddAssetCollection(MultiplayerStartingMoneyChoices = new ScopedAssetCollection <MultiplayerStartingMoneyChoice>(this)); AddAssetCollection(Multisounds = new ScopedAssetCollection <Multisound>(this)); AddAssetCollection(MusicTracks = new ScopedAssetCollection <MusicTrack>(this)); AddAssetCollection(ObjectCreationLists = new ScopedAssetCollection <ObjectCreationList>(this)); AddAssetCollection(ObjectDefinitions = new ScopedAssetCollection <ObjectDefinition>(this)); AddAssetCollection(PlayerAITypes = new ScopedAssetCollection <PlayerAIType>(this)); AddAssetCollection(PlayerTemplates = new ScopedAssetCollection <PlayerTemplate>(this)); AddAssetCollection(Ranks = new ScopedAssetCollection <RankTemplate>(this)); AddAssetCollection(RegionCampaigns = new ScopedAssetCollection <RegionCampaign>(this)); AddAssetCollection(RoadTemplates = new ScopedAssetCollection <RoadTemplate>(this)); AddAssetCollection(Sciences = new ScopedAssetCollection <Science>(this)); AddAssetCollection(ScoredKillEvaAnnouncers = new ScopedAssetCollection <ScoredKillEvaAnnouncer>(this)); AddAssetCollection(ShellMenuSchemes = new ScopedAssetCollection <ShellMenuScheme>(this)); AddAssetCollection(SkirmishAIDatas = new ScopedAssetCollection <SkirmishAIData>(this)); AddAssetCollection(SkyboxTextureSets = new ScopedAssetCollection <SkyboxTextureSet>(this)); AddAssetCollection(SpecialPowers = new ScopedAssetCollection <SpecialPower>(this)); AddAssetCollection(StanceTemplates = new ScopedAssetCollection <StanceTemplate>(this)); AddAssetCollection(StaticGameLods = new ScopedAssetCollection <StaticGameLod>(this)); AddAssetCollection(StreamedSounds = new ScopedAssetCollection <StreamedSound>(this)); AddAssetCollection(Subsystems = new ScopedAssetCollection <LoadSubsystem>(this)); AddAssetCollection(TerrainTextures = new ScopedAssetCollection <TerrainTexture>(this)); AddAssetCollection(Textures = new ScopedAssetCollection <TextureAsset>(this, loadStrategy.CreateTextureLoader())); AddAssetCollection(Upgrades = new ScopedAssetCollection <UpgradeTemplate>(this)); AddAssetCollection(VictorySystemDatas = new ScopedAssetCollection <VictorySystemData>(this)); AddAssetCollection(Videos = new ScopedAssetCollection <Video>(this)); AddAssetCollection(WaterSets = new ScopedAssetCollection <WaterSet>(this)); AddAssetCollection(WaterTextureLists = new ScopedAssetCollection <WaterTextureList>(this)); AddAssetCollection(WeaponTemplates = new ScopedAssetCollection <WeaponTemplate>(this)); AddAssetCollection(WeatherDatas = new ScopedAssetCollection <WeatherData>(this)); AddAssetCollection(WindowTransitions = new ScopedAssetCollection <WindowTransition>(this)); }
public void CanReadIniFiles() { var gameDefinitions = new[] { GameDefinition.FromGame(SageGame.CncGenerals), GameDefinition.FromGame(SageGame.CncGeneralsZeroHour), GameDefinition.FromGame(SageGame.Bfme), GameDefinition.FromGame(SageGame.Bfme2), GameDefinition.FromGame(SageGame.Bfme2Rotwk), }; using var graphicsDevice = GraphicsDeviceUtility.CreateGraphicsDevice(null, null); using var standardGraphicsResources = new StandardGraphicsResources(graphicsDevice); using var shaderSetStore = new ShaderSetStore(graphicsDevice, RenderPipeline.GameOutputDescription); using var shaderResources = new ShaderResourceManager(graphicsDevice, standardGraphicsResources, shaderSetStore); var graphicsLoadContext = new GraphicsLoadContext(graphicsDevice, standardGraphicsResources, shaderResources, shaderSetStore); foreach (var gameDefinition in gameDefinitions) { foreach (var installation in InstallationLocators.FindAllInstallations(gameDefinition)) { using var fileSystem = installation.CreateFileSystem(); var assetStore = new AssetStore( gameDefinition.Game, fileSystem, LanguageUtility.ReadCurrentLanguage(gameDefinition, fileSystem), graphicsDevice, standardGraphicsResources, shaderResources, shaderSetStore, gameDefinition.CreateAssetLoadStrategy()); assetStore.PushScope(); var dataContext = new IniDataContext(); void LoadIniFile(FileSystemEntry entry) { var parser = new IniParser( entry, assetStore, gameDefinition.Game, dataContext, LocaleSpecificEncoding); parser.ParseFile(); } switch (gameDefinition.Game) { case SageGame.Bfme: case SageGame.Bfme2: case SageGame.Bfme2Rotwk: LoadIniFile(fileSystem.GetFile(@"Data\INI\GameData.ini")); break; } foreach (var file in fileSystem.GetFilesInDirectory("", $"*.ini", SearchOption.AllDirectories)) { var filename = Path.GetFileName(file.FilePath).ToLowerInvariant(); switch (filename) { case "webpages.ini": // Don't care about this case "buttonsets.ini": // Doesn't seem to be used? case "scripts.ini": // Only needed by World Builder? case "commandmapdebug.ini": // Only applies to DEBUG and INTERNAL builds case "fxparticlesystemcustom.ini": // Don't know if this is used, it uses Emitter property not used elsewhere case "lightpoints.ini": // Don't know if this is used. //added in BFME and subsequent games case "optionregistry.ini": // Don't know if this is used case "localization.ini": // Don't know if we need this continue; case "credits.ini": if (gameDefinition.Game == SageGame.Bfme2Rotwk) //corrupted in rotwk (start of the block is commented out) { continue; } break; //mods specific //edain mod case "einstellungen.ini": case "einstellungendeakt.ini": case "einstellungenedain.ini": case "news.ini": continue; //unofficial patch 2.02 case "desktop.ini": //got into a big file somehow case "2.01.ini": case "disable timer.ini": case "enable timer.ini": case "old music.ini": continue; default: if (filename.StartsWith("2.02")) { continue; } break; } _output.WriteLine($"Reading file {file.FilePath}."); LoadIniFile(file); } } } }