protected override Task <ResultStatus> DoCommandOverride(ICommandContext commandContext) { using (var texTool = new TextureTool()) using (var texImage = texTool.Load(Parameters.FontDataFile, Parameters.IsSrgb)) { //make sure we are RGBA and not BGRA texTool.Convert(texImage, Parameters.IsSrgb ? PixelFormat.R8G8B8A8_UNorm_SRgb : PixelFormat.R8G8B8A8_UNorm); var image = texTool.ConvertToStrideImage(texImage); Graphics.SpriteFont staticFont = FontDataFactory.NewStatic( Parameters.Size, Parameters.Glyphs, new[] { image }, Parameters.BaseOffset, Parameters.DefaultLineSpacing, Parameters.Kernings, Parameters.ExtraSpacing, Parameters.ExtraLineSpacing, Parameters.DefaultCharacter); // save the data into the database var assetManager = new ContentManager(MicrothreadLocalDatabases.ProviderService); assetManager.Save(Url, staticFont); image.Dispose(); } return(Task.FromResult(ResultStatus.Successful)); }
protected override Task <ResultStatus> DoCommandOverride(ICommandContext commandContext) { using (var imageStream = File.OpenRead(AssetParameters.FontDataFile)) { Image image; try { image = Image.Load(imageStream); } catch (FontNotFoundException ex) { commandContext.Logger.Error("The file [{0}] is not a proper image file.", ex.FontName); return(Task.FromResult(ResultStatus.Failed)); } Graphics.SpriteFont staticFont = FontDataFactory.NewStatic( FontHelper.PointsToPixels(AssetParameters.Size), AssetParameters.Glyphs, new[] { image }, AssetParameters.BaseOffset, AssetParameters.DefaultLineSpacing, AssetParameters.Kernings, AssetParameters.ExtraSpacing, AssetParameters.ExtraLineSpacing, AssetParameters.DefaultCharacter); // save the data into the database var assetManager = new AssetManager(); assetManager.Save(Url, staticFont); image.Dispose(); } return(Task.FromResult(ResultStatus.Successful)); }
public override Task DisposeAsync() { EnsureNotDestroyed(nameof(EditorGameCameraPreviewService)); // Unregister events var selectionService = Services.Get <IEditorGameEntitySelectionService>(); if (selectionService != null) { selectionService.SelectionUpdated -= UpdateModifiedEntitiesList; } // Remove renderers var gameTopLevel = game.SceneSystem.GraphicsCompositor.Game as EditorTopLevelCompositor; var editorTopLevel = game.EditorSceneSystem.GraphicsCompositor.Game as EditorTopLevelCompositor; if (gameTopLevel != null && editorTopLevel != null) { gameTopLevel.PostGizmoCompositors.Remove(generateIncrustRenderer); editorTopLevel.PostGizmoCompositors.Remove(renderIncrustRenderer); } defaultFont?.Dispose(); defaultFont = null; spriteEffect?.Dispose(); spriteEffect = null; borderPipelineState = null; borderVertexBuffer?.Dispose(); borderVertexBuffer = null; return(base.DisposeAsync()); }
protected override void UnloadContent() { if (spriteFont != null) { UnloadAsset(spriteFont); spriteFont = null; } }
protected override void LoadContent() { // determine the adequate blend state to render the font adequateBlendState = IsFontNotPremultiplied()? BlendStates.NonPremultiplied : BlendStates.AlphaBlend; // load the sprite font spriteFont = LoadAsset <Graphics.SpriteFont>(AssetItem.Location); // Always use LDR for fonts RenderingMode = RenderingMode.LDR; }
protected override Task <bool> Initialize(EditorServiceGame editorGame) { game = (EntityHierarchyEditorGame)editorGame; // create the default font var fontItem = OfflineRasterizedSpriteFontFactory.Create(); fontItem.FontType.Size = 8; defaultFont = OfflineRasterizedFontCompiler.Compile(game.Services.GetService <IFontFactory>(), fontItem, game.GraphicsDevice.ColorSpace == ColorSpace.Linear); incrustBatch = new SpriteBatch(game.GraphicsDevice); // SpriteEffect will be used to draw camera incrust border spriteEffect = new EffectInstance(new Graphics.Effect(game.GraphicsDevice, SpriteEffect.Bytecode)); spriteEffect.Parameters.Set(TexturingKeys.Texture0, game.GraphicsDevice.GetSharedWhiteTexture()); spriteEffect.UpdateEffect(game.GraphicsDevice); borderPipelineState = new MutablePipelineState(game.GraphicsDevice); borderPipelineState.State.RootSignature = spriteEffect.RootSignature; borderPipelineState.State.EffectBytecode = spriteEffect.Effect.Bytecode; borderPipelineState.State.InputElements = VertexPositionTexture.Layout.CreateInputElements(); borderPipelineState.State.PrimitiveType = PrimitiveType.LineStrip; borderPipelineState.State.RasterizerState = RasterizerStates.CullNone; unsafe { var borderVertices = new[] { new VertexPositionTexture(new Vector3(0.0f, 0.0f, 0.0f), Vector2.Zero), new VertexPositionTexture(new Vector3(0.0f, 1.0f, 0.0f), Vector2.Zero), new VertexPositionTexture(new Vector3(1.0f, 1.0f, 0.0f), Vector2.Zero), new VertexPositionTexture(new Vector3(1.0f, 0.0f, 0.0f), Vector2.Zero), new VertexPositionTexture(new Vector3(0.0f, 0.0f, 0.0f), Vector2.Zero), new VertexPositionTexture(new Vector3(0.0f, 1.0f, 0.0f), Vector2.Zero), // extra vertex so that left-top corner is not missing (likely due to rasterization rule) }; fixed(VertexPositionTexture *borderVerticesPtr = borderVertices) borderVertexBuffer = Graphics.Buffer.Vertex.New(game.GraphicsDevice, new DataPointer(borderVerticesPtr, VertexPositionTexture.Size * borderVertices.Length)); } var editorTopLevel = game.EditorSceneSystem.GraphicsCompositor.Game as EditorTopLevelCompositor; if (editorTopLevel != null) { // Display it as incrust editorTopLevel.PostGizmoCompositors.Add(renderIncrustRenderer = new RenderIncrustRenderer(this)); } Services.Get <IEditorGameEntitySelectionService>().SelectionUpdated += UpdateModifiedEntitiesList; return(Task.FromResult(true)); }
protected override Entity Create() { base.Create(); var entity = new Entity("Space Marker"); cameraComponent = new CameraComponent { UseCustomAspectRatio = true, AspectRatio = 1.0f, NearClipPlane = 0.1f, FarClipPlane = 1000.0f, UseCustomViewMatrix = true, VerticalFieldOfView = VerticalFieldOfView }; entity.Add(cameraComponent); // Add a renderer on the left bottom size var cameraOrientationGizmoRenderStage = new RenderStage("CameraOrientationGizmo", "Main"); game.EditorSceneSystem.GraphicsCompositor.RenderStages.Add(cameraOrientationGizmoRenderStage); var meshRenderFeature = game.EditorSceneSystem.GraphicsCompositor.RenderFeatures.OfType <MeshRenderFeature>().First(); meshRenderFeature.RenderStageSelectors.Add(new SimpleGroupToRenderStageSelector { EffectName = EditorGraphicsCompositorHelper.EditorForwardShadingEffect, RenderGroup = SpaceMarkerGroupMask, RenderStage = cameraOrientationGizmoRenderStage }); var editorCompositor = (EditorTopLevelCompositor)game.EditorSceneSystem.GraphicsCompositor.Game; editorCompositor.PostGizmoCompositors.Add(new ClearRenderer { ClearFlags = ClearRendererFlags.DepthOnly }); editorCompositor.PostGizmoCompositors.Add(new GizmoViewportRenderer { Name = "Render Spacemarker", ViewportSize = ViewportSize, ViewportPosition = new Vector2(0.0f, 1.0f), Camera = cameraComponent, Content = new SceneRendererCollection { new SingleStageRenderer { RenderStage = cameraOrientationGizmoRenderStage }, new DelegateSceneRenderer(RenderSpaceMarkerAxisNames), }, }); // create the default fonts var fontItem = OfflineRasterizedSpriteFontFactory.Create(); fontItem.FontType.Size = 8; defaultFont = OfflineRasterizedFontCompiler.Compile(Services.GetService <IFontFactory>(), fontItem, GraphicsDevice.ColorSpace == ColorSpace.Linear); // create the sprite batch use to draw text spriteBatch = new SpriteBatch(GraphicsDevice) { DefaultDepth = 1 }; var rotations = new[] { Vector3.Zero, new Vector3(0, 0, MathUtil.Pi / 2), new Vector3(0, -MathUtil.Pi / 2f, 0) }; var coneMesh = GeometricPrimitive.Cone.New(GraphicsDevice, ConeRadius, ConeHeigth, GizmoTessellation).ToMeshDraw(); var bodyMesh = GeometricPrimitive.Cylinder.New(GraphicsDevice, BodyLength, BodyRadius, GizmoTessellation).ToMeshDraw(); // create the axis arrows for (int axis = 0; axis < 3; ++axis) { var material = GetAxisDefaultMaterial(axis); var coneEntity = new Entity("ArrowCone" + axis) { new ModelComponent { Model = new Model { material, new Mesh { Draw = coneMesh } }, RenderGroup = RenderGroup } }; var bodyEntity = new Entity("ArrowBody" + axis) { new ModelComponent { Model = new Model { material, new Mesh { Draw = bodyMesh } }, RenderGroup = RenderGroup } }; coneEntity.Transform.Position.X = BodyLength + ConeHeigth * 0.5f; bodyEntity.Transform.Position.X = BodyLength / 2; coneEntity.Transform.Rotation = Quaternion.RotationZ(-MathUtil.Pi / 2); bodyEntity.Transform.RotationEulerXYZ = -MathUtil.Pi / 2 * Vector3.UnitZ; // create the arrow entity composed of the cone and bode var arrowEntity = new Entity("ArrowEntity" + axis); arrowEntity.Transform.Children.Add(coneEntity.Transform); arrowEntity.Transform.Children.Add(bodyEntity.Transform); arrowEntity.Transform.RotationEulerXYZ = rotations[axis]; // Add the arrow entity to the gizmo entity entity.AddChild(arrowEntity); } return(entity); }
public MarginAdorner(UIEditorGameAdornerService service, UIElement gameSideElement, MarginEdge marginEdge, Graphics.SpriteFont font) : base(service, gameSideElement) { Visual = new Canvas { CanBeHitByUser = false, Name = $"[Margin] {marginEdge}", }; border = new Border(); textBlock = new TextBlock { BackgroundColor = Color.WhiteSmoke * 0.5f, Font = font, DepthAlignment = DepthAlignment.Center, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center, }; Visual.Children.Add(border); Visual.Children.Add(textBlock); MarginEdge = marginEdge; InitializeAttachedProperties(); }
protected override Entity Create() { base.Create(); DefaultMaterial = CreateUniformColorMaterial(Color.White); ElementSelectedMaterial = CreateUniformColorMaterial(Color.Gold); var entity = new Entity("View Gizmo"); cameraComponent = new CameraComponent { UseCustomAspectRatio = true, AspectRatio = 1.0f, NearClipPlane = 0.1f, FarClipPlane = 1000.0f, UseCustomViewMatrix = true, VerticalFieldOfView = VerticalFieldOfView }; entity.Add(cameraComponent); // create the default fonts var fontItem = OfflineRasterizedSpriteFontFactory.Create(); fontItem.FontType.Size = FontSize; defaultFont = OfflineRasterizedFontCompiler.Compile(Services.GetService <IFontFactory>(), fontItem, GraphicsDevice.ColorSpace == ColorSpace.Linear); // create the sprite batch use to draw text spriteBatch = new SpriteBatch(GraphicsDevice) { DefaultDepth = 1 }; // Add a renderer on the top right size var cameraOrientationGizmoRenderStage = new RenderStage("CameraOrientationGizmo", "Main"); game.EditorSceneSystem.GraphicsCompositor.RenderStages.Add(cameraOrientationGizmoRenderStage); var meshRenderFeature = game.EditorSceneSystem.GraphicsCompositor.RenderFeatures.OfType <MeshRenderFeature>().First(); meshRenderFeature.RenderStageSelectors.Add(new SimpleGroupToRenderStageSelector { EffectName = EditorGraphicsCompositorHelper.EditorForwardShadingEffect, RenderGroup = ViewGizmoGroupMask, RenderStage = cameraOrientationGizmoRenderStage }); var editorCompositor = (EditorTopLevelCompositor)game.EditorSceneSystem.GraphicsCompositor.Game; editorCompositor.PostGizmoCompositors.Add(new ClearRenderer { ClearFlags = ClearRendererFlags.DepthOnly }); editorCompositor.PostGizmoCompositors.Add(gizmoViewportRenderer = new GizmoViewportRenderer { Name = "Render Camera Orientation", ViewportSize = ViewportSize, ViewportPosition = new Vector2(1.0f, 0.0f), Camera = cameraComponent, Content = new SceneRendererCollection { new SingleStageRenderer { RenderStage = cameraOrientationGizmoRenderStage }, new DelegateSceneRenderer(RenderFaceNames), }, }); var cubeMesh = GeometricPrimitive.Cube.New(GraphicsDevice).ToMeshDraw(); int i = 0; for (var z = -1; z <= 1; z++) { for (var y = -1; y <= 1; y++) { for (var x = -1; x <= 1; x++) { if (x == 0 && y == 0 && z == 0) { continue; } var cubeEntity = new Entity("CubeEntity" + i++) { new ModelComponent { Model = new Model { x == 0 ? ElementSelectedMaterial : DefaultMaterial, new Mesh { Draw = cubeMesh } }, RenderGroup = RenderGroup } }; cubeEntity.Transform.Scale = new Vector3(x == 0 ? InnerExtent * 2 : Border, y == 0 ? InnerExtent * 2 : Border, z == 0 ? InnerExtent * 2 : Border); cubeEntity.Transform.Position = new Vector3(x, y, z) * (InnerExtent + Border / 2); entity.AddChild(cubeEntity); entities.Add(cubeEntity); } } } return(entity); }