示例#1
0
        public TerrainMaterial(Effect effect)
            : base(effect)
        {
            SetProperty("Sampler", effect.GraphicsDevice.SamplerAnisotropicWrap);

            PipelineState = new EffectPipelineState(
                RasterizerStateDescription.CullBackSolid,
                DepthStencilStateDescription.Default,
                BlendStateDescription.Opaque);
        }
示例#2
0
        public WaterMaterial(ContentManager contentManager, Effect effect)
            : base(contentManager, effect)
        {
            SetProperty("Sampler", contentManager.GraphicsDevice.Aniso4xSampler);

            PipelineState = new EffectPipelineState(
                RasterizerStateDescriptionUtility.DefaultFrontIsCounterClockwise,
                DepthStencilStateDescription.DepthOnlyLessEqualRead,
                BlendStateDescription.SingleAlphaBlend,
                RenderPipeline.GameOutputDescription);
        }
示例#3
0
        public TerrainMaterial(ContentManager contentManager, Effect effect)
            : base(contentManager, effect)
        {
            SetProperty("Sampler", contentManager.GraphicsDevice.Aniso4xSampler);

            PipelineState = new EffectPipelineState(
                RasterizerStateDescriptionUtility.DefaultFrontIsCounterClockwise,
                DepthStencilStateDescription.DepthOnlyLessEqual,
                BlendStateDescription.SingleDisabled,
                contentManager.GraphicsDevice.SwapchainFramebuffer.OutputDescription);
        }
示例#4
0
        public RoadMaterial(ContentManager contentManager, Effect effect)
            : base(contentManager, effect)
        {
            SetProperty("Sampler", contentManager.GraphicsDevice.Aniso4xSampler);

            PipelineState = new EffectPipelineState(
                RasterizerStateDescriptionUtility.CullNoneSolid, // TODO
                DepthStencilStateDescription.DepthOnlyLessEqualRead,
                BlendStateDescription.SingleAlphaBlend,
                RenderPipeline.GameOutputDescription);
        }
示例#5
0
        // One ModelMeshPart for each unique shader in a W3D_CHUNK_MATERIAL_PASS.
        private static ModelMeshPart CreateModelMeshPart(
            uint startIndex,
            uint indexCount,
            W3dMesh w3dMesh,
            W3dShader w3dShader)
        {
            var rasterizerState = RasterizerStateDescription.CullBackSolid;

            rasterizerState.CullMode = w3dMesh.Header.Attributes.HasFlag(W3dMeshFlags.TwoSided)
                ? CullMode.None
                : CullMode.CullBack;

            var depthState = DepthStencilStateDescription.Default;

            depthState.IsDepthEnabled      = true;
            depthState.IsDepthWriteEnabled = w3dShader.DepthMask == W3dShaderDepthMask.WriteEnable;
            // TODO: DepthCompare

            var blendState = BlendStateDescription.Opaque;

            blendState.Enabled = w3dShader.SrcBlend != W3dShaderSrcBlendFunc.One ||
                                 w3dShader.DestBlend != W3dShaderDestBlendFunc.Zero;
            blendState.SourceBlend      = w3dShader.SrcBlend.ToBlend();
            blendState.DestinationBlend = w3dShader.DestBlend.ToBlend();

            var pipelineStateHandle = new EffectPipelineState(
                rasterizerState,
                depthState,
                blendState)
                                      .GetHandle();

            return(new ModelMeshPart(
                       startIndex,
                       indexCount,
                       w3dShader.AlphaTest == W3dShaderAlphaTest.Enable,
                       w3dShader.Texturing == W3dShaderTexturing.Enable,
                       pipelineStateHandle));
        }
示例#6
0
 internal EffectPipelineStateHandle(EffectPipelineState effectPipelineState)
 {
     EffectPipelineState = effectPipelineState;
 }
示例#7
0
        protected override Scene LoadEntry(FileSystemEntry entry, ContentManager contentManager, ResourceUploadBatch uploadBatch)
        {
            contentManager.IniDataContext.LoadIniFile(@"Data\INI\Terrain.ini");

            var mapFile = MapFile.FromFileSystemEntry(entry);

            var result = new Scene();

            result.Settings.LightingConfigurations = mapFile.GlobalLighting.LightingConfigurations.ToLightSettingsDictionary();
            result.Settings.TimeOfDay = mapFile.GlobalLighting.Time;

            var heightMap = new HeightMap(mapFile.HeightMapData);

            result.HeightMap = heightMap;

            var terrainEntity = new Entity();

            result.Entities.Add(terrainEntity);

            terrainEntity.Components.Add(new TerrainComponent
            {
                HeightMap = heightMap
            });

            var terrainEffect = AddDisposable(new TerrainEffect(
                                                  contentManager.GraphicsDevice,
                                                  mapFile.BlendTileData.Textures.Length));

            var pipelineStateSolid = new EffectPipelineState(
                RasterizerStateDescription.CullBackSolid,
                DepthStencilStateDescription.Default,
                BlendStateDescription.Opaque)
                                     .GetHandle();

            var indexBufferCache = AddDisposable(new TerrainPatchIndexBufferCache(contentManager.GraphicsDevice));

            CreatePatches(
                contentManager.GraphicsDevice,
                uploadBatch,
                terrainEntity,
                heightMap,
                mapFile.BlendTileData,
                terrainEffect,
                pipelineStateSolid,
                indexBufferCache);

            var tileDataTexture = AddDisposable(CreateTileDataTexture(
                                                    contentManager.GraphicsDevice,
                                                    uploadBatch,
                                                    mapFile,
                                                    heightMap));

            var cliffDetailsBuffer = AddDisposable(CreateCliffDetails(
                                                       contentManager.GraphicsDevice,
                                                       uploadBatch,
                                                       mapFile));

            CreateTextures(
                contentManager,
                uploadBatch,
                mapFile.BlendTileData,
                out var textures,
                out var textureDetails);

            var textureDetailsBuffer = AddDisposable(StaticBuffer.Create(
                                                         contentManager.GraphicsDevice,
                                                         uploadBatch,
                                                         textureDetails));

            var textureSet = AddDisposable(new TextureSet(
                                               contentManager.GraphicsDevice,
                                               textures));

            terrainEffect.SetTileData(tileDataTexture);
            terrainEffect.SetCliffDetails(cliffDetailsBuffer);
            terrainEffect.SetTextureDetails(textureDetailsBuffer);
            terrainEffect.SetTextures(textureSet);

            var objectsEntity = new Entity();

            result.Entities.Add(objectsEntity);
            LoadObjects(
                contentManager,
                objectsEntity,
                heightMap,
                mapFile.ObjectsList.Objects,
                result.Settings);

            foreach (var team in mapFile.SidesList.Teams)
            {
                var name        = (string)team.Properties["teamName"].Value;
                var owner       = (string)team.Properties["teamOwner"].Value;
                var isSingleton = (bool)team.Properties["teamIsSingleton"].Value;
            }

            foreach (var waypointPath in mapFile.WaypointsList.WaypointPaths)
            {
                var start = result.Settings.Waypoints[waypointPath.StartWaypointID];
                var end   = result.Settings.Waypoints[waypointPath.EndWaypointID];

                result.Settings.WaypointPaths[start.Name] = new Settings.WaypointPath(
                    start, end);
            }

            var scriptsEntity = new Entity();

            result.Entities.Add(scriptsEntity);

            // TODO: Don't hardcode this.
            // Perhaps add one ScriptComponent for the neutral player,
            // and one for the active player.
            var scriptList = mapFile.SidesList.PlayerScripts.ScriptLists[0];

            AddScripts(scriptsEntity, scriptList, result.Settings);

            return(result);
        }