示例#1
0
        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)) }
                };
            }
        }
示例#2
0
 public GraphicsLoadContext(
     GraphicsDevice graphicsDevice,
     StandardGraphicsResources standardGraphicsResources,
     ShaderResourceManager shaderResources)
 {
     GraphicsDevice            = graphicsDevice;
     StandardGraphicsResources = standardGraphicsResources;
     ShaderResources           = shaderResources;
 }
示例#3
0
 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"));
        }
示例#5
0
        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));
        }
示例#6
0
        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);
                    }
                }
            }
        }