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));
        }
Example #2
0
        /// <inheritdoc />
        protected override async Task LoadContent()
        {
            await base.LoadContent();

            // create the default fonts
            var fontItem = OfflineRasterizedSpriteFontFactory.Create();

            fontItem.FontType.Size = 22;
            DefaultFont            = OfflineRasterizedFontCompiler.Compile(Font, fontItem, GraphicsDevice.ColorSpace == ColorSpace.Linear);

            previewScene = new Scene();

            // create and set the main scene instance
            SceneSystem.SceneInstance = new SceneInstance(Services, previewScene, ExecutionMode.Preview);

            // add thumbnail builder and preview script to scheduler
            Script.AddTask(ProcessPreviewRequestsTask);
        }
Example #3
0
        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);
        }
Example #4
0
        public ThumbnailGenerator(EffectCompilerBase effectCompiler)
        {
            // create base services
            Services = new ServiceRegistry();
            Services.AddService(MicrothreadLocalDatabases.ProviderService);
            ContentManager = new ContentManager(Services);
            Services.AddService <IContentManager>(ContentManager);
            Services.AddService(ContentManager);

            GraphicsDevice      = GraphicsDevice.New();
            GraphicsContext     = new GraphicsContext(GraphicsDevice);
            GraphicsCommandList = GraphicsContext.CommandList;
            Services.AddService(GraphicsContext);
            sceneSystem = new SceneSystem(Services);
            Services.AddService(sceneSystem);
            fontSystem = new GameFontSystem(Services);
            Services.AddService(fontSystem.FontSystem);
            Services.AddService <IFontFactory>(fontSystem.FontSystem);

            GraphicsDeviceService = new GraphicsDeviceServiceLocal(Services, GraphicsDevice);
            Services.AddService(GraphicsDeviceService);

            var uiSystem = new UISystem(Services);

            Services.AddService(uiSystem);

            var physicsSystem = new Bullet2PhysicsSystem(Services);

            Services.AddService <IPhysicsSystem>(physicsSystem);

            gameSystems = new GameSystemCollection(Services)
            {
                fontSystem, uiSystem, physicsSystem
            };
            Services.AddService <IGameSystemCollection>(gameSystems);
            Simulation.DisableSimulation = true; //make sure we do not simulate physics within the editor

            // initialize base services
            gameSystems.Initialize();

            // create remaining services
            EffectSystem = new EffectSystem(Services);
            Services.AddService(EffectSystem);

            gameSystems.Add(EffectSystem);
            gameSystems.Add(sceneSystem);
            EffectSystem.Initialize();

            // Mount the same database for the cache
            EffectSystem.Compiler = EffectCompilerFactory.CreateEffectCompiler(effectCompiler.FileProvider, EffectSystem);

            // Deactivate the asynchronous effect compilation
            ((EffectCompilerCache)EffectSystem.Compiler).CompileEffectAsynchronously = false;

            // load game system content
            gameSystems.LoadContent();

            // create the default fonts
            var fontItem = OfflineRasterizedSpriteFontFactory.Create();

            fontItem.FontType.Size = 22;
            DefaultFont            = OfflineRasterizedFontCompiler.Compile(fontSystem.FontSystem, fontItem, true);

            // create utility members
            nullGameTime = new GameTime();
            SpriteBatch  = new SpriteBatch(GraphicsDevice);
            UIBatch      = new UIBatch(GraphicsDevice);

            // create the pipeline
            SetUpPipeline();
        }
Example #5
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);
        }