コード例 #1
0
            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));
            }
コード例 #2
0
            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));
            }
コード例 #3
0
        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());
        }
コード例 #4
0
ファイル: FontPreview.cs プロジェクト: Ethereal77/stride
 protected override void UnloadContent()
 {
     if (spriteFont != null)
     {
         UnloadAsset(spriteFont);
         spriteFont = null;
     }
 }
コード例 #5
0
ファイル: FontPreview.cs プロジェクト: Ethereal77/stride
        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;
        }
コード例 #6
0
        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));
        }
コード例 #7
0
ファイル: SpaceMarker.cs プロジェクト: vvvv/stride
        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);
        }
コード例 #8
0
ファイル: MarginAdorner.cs プロジェクト: Ethereal77/stride
        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();
        }
コード例 #9
0
        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);
        }