Beispiel #1
0
        public GraphicsSystem(OpenTKWindow window, float renderQuality = 1f, GraphicsBackEndPreference backEndPreference = GraphicsBackEndPreference.None)
        {
            if (window == null)
            {
                throw new ArgumentNullException(nameof(window));
            }

            bool preferOpenGL = backEndPreference == GraphicsBackEndPreference.OpenGL || !RuntimeInformation.IsOSPlatform(OSPlatform.Windows);

            _window = window;
            Context = CreatePlatformDefaultContext(window, preferOpenGL);
            Context.ResourceFactory.AddShaderLoader(new EmbeddedResourceShaderLoader(typeof(GraphicsSystem).GetTypeInfo().Assembly));
            MaterialCache = new MaterialCache(this);
            BufferCache   = new BufferCache(this);

            ShadowMapStage            = new ShadowMapStage(Context);
            _upscaleStage             = new UpscaleStage(Context, "Upscale", null, null);
            _standardStage            = new StandardPipelineStage(Context, "Standard");
            _alphaBlendStage          = new StandardPipelineStage(Context, "AlphaBlend");
            _alphaBlendStage.Comparer = new FarToNearIndexComparer();
            _overlayStage             = new StandardPipelineStage(Context, "Overlay");
            _pipelineStages           = new PipelineStage[]
            {
                ShadowMapStage,
                _standardStage,
                _alphaBlendStage,
                _upscaleStage,
                _overlayStage,
            };
            _renderer = new Renderer(Context, _pipelineStages);
            SetPreupscaleQuality(renderQuality);

            // Placeholder providers so that materials can bind to them.
            Context.RegisterGlobalDataProvider("ViewMatrix", s_identityProvider);
            Context.RegisterGlobalDataProvider("ProjectionMatrix", s_identityProvider);
            Context.RegisterGlobalDataProvider("CameraInfo", s_noCameraProvider);
            Context.RegisterGlobalDataProvider("LightBuffer", s_noLightProvider);
            Context.RegisterGlobalDataProvider("PointLights", _pointLightsProvider);

            window.Resized += OnWindowResized;

            _freeShapeRenderer          = new ManualWireframeRenderer(Context, RgbaFloat.Pink);
            _freeShapeRenderer.Topology = PrimitiveTopology.LineList;
            AddFreeRenderItem(_freeShapeRenderer);

            _mainThreadID      = Environment.CurrentManagedThreadId;
            _taskScheduler     = new GraphicsSystemTaskScheduler(_mainThreadID);
            _rayCastFilterFunc = RayCastFilter;
        }
            public PreviewScene(RenderContext rc, ConstructedMeshInfo previewItem)
            {
                _rc = rc;
                ResourceFactory factory = rc.ResourceFactory;

                _fb = factory.CreateFramebuffer(Width, Height);

                _projection = factory.CreateConstantBuffer(ShaderConstantType.Matrix4x4);
                UpdateProjectionData();
                _view = factory.CreateConstantBuffer(ShaderConstantType.Matrix4x4);
                _view.SetData(Matrix4x4.CreateLookAt(Vector3.UnitZ * 7f + Vector3.UnitY * 1.5f, Vector3.Zero, Vector3.UnitY));

                _lightProjection = factory.CreateConstantBuffer(ShaderConstantType.Matrix4x4);
                _lightProjection.SetData(Matrix4x4.CreateOrthographicOffCenter(-18, 18, -18, 18, -10, 60f));

                _lightView = factory.CreateConstantBuffer(ShaderConstantType.Matrix4x4);
                _lightView.SetData(Matrix4x4.CreateLookAt(-_lightDirection * 20f, Vector3.Zero, Vector3.UnitY));

                _lightInfo = factory.CreateConstantBuffer(ShaderConstantType.Float4);
                _lightInfo.SetData(new Vector4(_lightDirection, 1));

                _standardPipelineStage = new StandardPipelineStage(rc, "Standard", _fb);
                _shadowMapStage        = new ShadowMapStage(rc, "ShadowMap_Preview");
                _stages = new PipelineStage[]
                {
                    _shadowMapStage,
                    _standardPipelineStage,
                };

                SceneBuffers.Add("ProjectionMatrix", _projection);
                SceneBuffers.Add("ViewMatrix", _view);
                SceneBuffers.Add("LightProjMatrix", _lightProjection);
                SceneBuffers.Add("LightViewMatrix", _lightView);
                SceneBuffers.Add("LightInfo", _lightInfo);

                _floor = CreatePreviewModel(PlaneModel.Vertices, PlaneModel.Indices);
                _floor.WorldMatrix.Data = Matrix4x4.CreateScale(10f, 1f, 10f);

                _previewItem = CreatePreviewModel(previewItem.Vertices, previewItem.Indices);
                _previewItem.WorldMatrix.Data = Matrix4x4.CreateTranslation(0, 1.5f, 0);

                _visiblityManager = new FlatListVisibilityManager();
                _visiblityManager.AddRenderItem(_floor);
                _visiblityManager.AddRenderItem(_previewItem);
            }