本文整理汇总了C#中IServiceRegistry.GetSafeServiceAs方法的典型用法代码示例。如果您正苦于以下问题:C# IServiceRegistry.GetSafeServiceAs方法的具体用法?C# IServiceRegistry.GetSafeServiceAs怎么用?C# IServiceRegistry.GetSafeServiceAs使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IServiceRegistry
的用法示例。
在下文中一共展示了IServiceRegistry.GetSafeServiceAs方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: DynamicEffectCompiler
/// <summary>
/// Initializes a new instance of the <see cref="DynamicEffectCompiler" /> class.
/// </summary>
/// <param name="services">The services.</param>
/// <param name="effectName">Name of the effect.</param>
/// <param name="asyncDynamicEffectCompiler">if set to <c>true</c> it can compile effect asynchronously.</param>
/// <exception cref="System.ArgumentNullException">services
/// or
/// effectName</exception>
public DynamicEffectCompiler(IServiceRegistry services, string effectName, int taskPriority = 0)
{
if (services == null) throw new ArgumentNullException("services");
if (effectName == null) throw new ArgumentNullException("effectName");
Services = services;
this.effectName = effectName;
this.taskPriority = taskPriority;
EffectSystem = Services.GetSafeServiceAs<EffectSystem>();
GraphicsDevice = Services.GetSafeServiceAs<IGraphicsDeviceService>().GraphicsDevice;
parameterCollections = new FastList<ParameterCollection>();
// Default behavior for fallback effect: load effect with same name but empty compiler parameters
ComputeFallbackEffect = (dynamicEffectCompiler, type, name, parameters) =>
{
ParameterCollection usedParameters;
var compilerParameters = new CompilerParameters();
// We want high priority
compilerParameters.TaskPriority = -1;
var effect = dynamicEffectCompiler.EffectSystem.LoadEffect(effectName, compilerParameters, out usedParameters).WaitForResult();
return new ComputeFallbackEffectResult(effect, usedParameters);
};
}
示例2: ElementRenderer
/// <summary>
/// Create an instance of an UI element renderer.
/// </summary>
/// <param name="services">The list of registered services</param>
public ElementRenderer(IServiceRegistry services)
{
Content = services.GetSafeServiceAs<IContentManager>();
GraphicsDeviceService = services.GetSafeServiceAs<IGraphicsDeviceService>();
UI = services.GetServiceAs<UISystem>();
if (UI == null)
{
UI = new UISystem(services);
var gameSystems = services.GetServiceAs<IGameSystemCollection>();
gameSystems?.Add(UI);
}
}
示例3: Initialize
internal void Initialize(IServiceRegistry registry)
{
Services = registry;
graphicsDeviceService = Services.GetSafeServiceAs<IGraphicsDeviceService>();
Game = Services.GetSafeServiceAs<IGame>();
Content = (ContentManager)Services.GetSafeServiceAs<IAssetManager>();
Input = Services.GetSafeServiceAs<InputManager>();
Script = Services.GetSafeServiceAs<ScriptSystem>();
SceneSystem = Services.GetSafeServiceAs<SceneSystem>();
EffectSystem = Services.GetSafeServiceAs<EffectSystem>();
Audio = Services.GetSafeServiceAs<AudioSystem>();
SpriteAnimation = Services.GetSafeServiceAs<SpriteAnimationSystem>();
}
示例4: Generate
public void Generate(IServiceRegistry services, Model model)
{
if (services == null) throw new ArgumentNullException("services");
if (model == null) throw new ArgumentNullException("model");
var graphicsDevice = services.GetSafeServiceAs<IGraphicsDeviceService>().GraphicsDevice;
var data = this.CreatePrimitiveMeshData();
if (data.Vertices.Length == 0)
{
throw new InvalidOperationException("Invalid GeometricPrimitive [{0}]. Expecting non-zero Vertices array");
}
var boundingBox = BoundingBox.Empty;
for (int i = 0; i < data.Vertices.Length; i++)
BoundingBox.Merge(ref boundingBox, ref data.Vertices[i].Position, out boundingBox);
BoundingSphere boundingSphere;
unsafe
{
fixed (void* verticesPtr = data.Vertices)
BoundingSphere.FromPoints((IntPtr)verticesPtr, 0, data.Vertices.Length, VertexPositionNormalTexture.Size, out boundingSphere);
}
var originalLayout = data.Vertices[0].GetLayout();
// Generate Tangent/BiNormal vectors
var resultWithTangentBiNormal = VertexHelper.GenerateTangentBinormal(originalLayout, data.Vertices, data.Indices);
// Generate Multitexcoords
var result = VertexHelper.GenerateMultiTextureCoordinates(resultWithTangentBiNormal);
var meshDraw = new MeshDraw();
var layout = result.Layout;
var vertexBuffer = result.VertexBuffer;
var indices = data.Indices;
if (indices.Length < 0xFFFF)
{
var indicesShort = new ushort[indices.Length];
for (int i = 0; i < indicesShort.Length; i++)
{
indicesShort[i] = (ushort)indices[i];
}
meshDraw.IndexBuffer = new IndexBufferBinding(Buffer.Index.New(graphicsDevice, indicesShort).RecreateWith(indicesShort), false, indices.Length);
}
else
{
if (graphicsDevice.Features.Profile <= GraphicsProfile.Level_9_3)
{
throw new InvalidOperationException("Cannot generate more than 65535 indices on feature level HW <= 9.3");
}
meshDraw.IndexBuffer = new IndexBufferBinding(Buffer.Index.New(graphicsDevice, indices).RecreateWith(indices), true, indices.Length);
}
meshDraw.VertexBuffers = new[] { new VertexBufferBinding(Buffer.New(graphicsDevice, vertexBuffer, BufferFlags.VertexBuffer).RecreateWith(vertexBuffer), layout, data.Vertices.Length) };
meshDraw.DrawCount = indices.Length;
meshDraw.PrimitiveType = PrimitiveType.TriangleList;
var mesh = new Mesh { Draw = meshDraw, BoundingBox = boundingBox, BoundingSphere = boundingSphere };
model.BoundingBox = boundingBox;
model.BoundingSphere = boundingSphere;
model.Add(mesh);
if (MaterialInstance != null && MaterialInstance.Material != null)
{
model.Materials.Add(MaterialInstance);
}
}
示例5: Initialize
public void Initialize(IServiceRegistry services)
{
this.effectSystem = services.GetSafeServiceAs<EffectSystem>();
}
示例6: ElementRenderer
/// <summary>
/// Create an instance of an UI element renderer.
/// </summary>
/// <param name="services">The list of registered services</param>
public ElementRenderer(IServiceRegistry services)
{
Asset = services.GetSafeServiceAs<IAssetManager>();
GraphicsDeviceService = services.GetSafeServiceAs<IGraphicsDeviceService>();
UI = services.GetServiceAs<UISystem>();
}
示例7: Initialize
public void Initialize(IServiceRegistry registry, string effectFilename = null, string[] optionalFeatures = null)
{
// Missing features compared to before: ZInverse support, Picking/Wireframe, Heat Shimmering and light shafts bounding boxes.
// Other stuff to implement: Enable features by RenderPipeline, reloading, access of plugins through a flexible interface, yebis config.
renderSystem = registry.GetSafeServiceAs<IRenderSystem>();
graphicsDeviceService = registry.GetSafeServiceAs<IGraphicsDeviceService>();
this.effectSystemOld = registry.GetSafeServiceAs<IEffectSystemOld>();
entitySystem = registry.GetSafeServiceAs<IEntitySystem>();
var rootRenderPass = renderSystem.RootRenderPass;
var dataContext = RenderConfigContext = renderSystem.ConfigContext;
var graphicsDevice = graphicsDeviceService.GraphicsDevice;
if (effectFilename == null)
effectFilename = Path.Combine("/shaders/effects.xml");
var context = new XenkoXamlSchemaContext(dataContext);
var xamlObjectWriter = new XamlObjectWriter(context);
using (var fileStream = VirtualFileSystem.OpenStream(effectFilename, VirtualFileMode.Open, VirtualFileAccess.Read))
XamlServices.Transform(new XamlXmlReader(fileStream, context), xamlObjectWriter);
var effectConfig = (RenderConfig)xamlObjectWriter.Result;
foreach (var renderPass in effectConfig.Content.OfType<RenderPass>())
{
dataContext.RenderPasses.Add(renderPass.Name, renderPass);
rootRenderPass.AddPass(renderPass);
}
foreach (var item in effectConfig.Content)
{
var plugin = item as RenderPassPlugin;
if (plugin != null)
{
dataContext.RenderPassPlugins.Add(plugin.Name, plugin);
}
var setter = item as Setter;
if (setter != null)
{
PropertyPath.SetNextValue(setter.Target, setter.Property, setter.Value);
}
}
MainPlugin = dataContext.RenderPassPlugins.Select(x => x.Value).OfType<MainPlugin>().First();
MainTargetPlugin = dataContext.RenderPassPlugins.Select(x => x.Value).OfType<RenderTargetsPlugin>().FirstOrDefault(x => x.Name == "MainTargetPlugin");
var mainBackBuffer = graphicsDevice.BackBuffer;
MainPlugin.RenderTarget = graphicsDevice.BackBuffer;
// Depth Stencil target needs to be shader resource only if Yebis or GBuffer is active (need more robust way to decide)
var depthStencilTexture = Texture.New2D(graphicsDevice, mainBackBuffer.Width, mainBackBuffer.Height, PixelFormat.D32_Float,
(RenderConfigContext.RenderPassPlugins.Any(x => x.Value is YebisPlugin || x.Value is GBufferPlugin) ? TextureFlags.ShaderResource : 0) | TextureFlags.DepthStencil);
MainPlugin.DepthStencil = depthStencilTexture.ToDepthStencilBuffer(false);
if (DepthStencilBuffer.IsReadOnlySupported(graphicsDevice))
MainPlugin.DepthStencilReadOnly = depthStencilTexture.ToDepthStencilBuffer(true);
// TODO: Temporary setup (should be done through an Entity and its Manager)
HeatShimmerPlugin heatShimmerPlugin;
if (RenderConfigContext.RenderPassPlugins.TryGetValueCast("HeatShimmerPlugin", out heatShimmerPlugin))
{
throw new NotImplementedException();
//heatShimmerPlugin.BoundingBoxes.Add(new MeshData { MeshData = MeshDataHelper.CreateBox(1, 1, 1, Color.White, true), Parameters = new ParameterCollectionData { { TransformationKeys.World, Matrix.Scaling(8200, 3000, 1500) * Matrix.Translation(2700, 0, 300) } } });
//heatShimmerPlugin.BoundingBoxes.Add(new MeshData { MeshData = MeshDataHelper.CreateBox(1, 1, 1, Color.White, true), Parameters = new ParameterCollectionData { { TransformationKeys.World, Matrix.Scaling(2000, 2000, 3500) * Matrix.RotationZ(0.5f) * Matrix.Translation(-7000, -4000, 1500) } } });
//heatShimmerPlugin.BoundingBoxes.Add(new MeshData { MeshData = MeshDataHelper.CreateBox(1, 1, 1, Color.White, true), Parameters = new ParameterCollectionData { { TransformationKeys.World, Matrix.Scaling(2000, 3000, 3500) * Matrix.Translation(-7800, 900, 1500) } } });
}
// Generates intermediate render targets
var plugins = dataContext.RenderPassPlugins
.OrderBy(x => rootRenderPass.Passes.IndexOf(x.Value.RenderPass)).ToArray();
// Weave render targets from last to first plugin.
// TODO: Instead of guessing through interface and non-null/null values, it would be better if plugin had flags to inform of its intentions.
var currentTarget = mainBackBuffer;
for (int i = plugins.Length - 1; i >= 0; --i)
{
var plugin = plugins[i];
var targetPlugin = plugin.Value as IRenderPassPluginTarget;
if (targetPlugin != null)
{
if (targetPlugin.RenderTarget == null)
targetPlugin.RenderTarget = currentTarget;
currentTarget = targetPlugin.RenderTarget;
}
var sourcePlugin = plugin.Value as IRenderPassPluginSource;
if (sourcePlugin != null)
{
if (sourcePlugin.RenderSource == null)
{
sourcePlugin.RenderSource = Texture.New2D(graphicsDevice, mainBackBuffer.Width, mainBackBuffer.Height, PixelFormat.R16G16B16A16_Float, TextureFlags.ShaderResource | TextureFlags.RenderTarget);
}
currentTarget = sourcePlugin.RenderSource.ToRenderTarget();
}
}
//.........这里部分代码省略.........