diff --git a/SMCode/SM.Base/Window/GenericWPFWindow.cs b/SMCode/SM.Base/Window/GenericWPFWindow.cs index 4f18636..f36ff3b 100644 --- a/SMCode/SM.Base/Window/GenericWPFWindow.cs +++ b/SMCode/SM.Base/Window/GenericWPFWindow.cs @@ -11,8 +11,6 @@ namespace SM.Base { public class GenericWPFWindow : OpenTK.Wpf.GLWpfControl, IGenericWindow { - private bool _renderContinuesly; - protected GenericCamera _viewportCamera; public bool Loading => !base.IsInitialized; @@ -24,9 +22,8 @@ namespace SM.Base public Rectangle ClientRectangle => new Rectangle((int)base.RenderTransformOrigin.X, (int)RenderTransformOrigin.Y, Width, Height); public Vector2 WorldScale { get; set; } - public GenericWPFWindow(bool renderContinuesly = false) + public GenericWPFWindow() { - _renderContinuesly = renderContinuesly; Ready += Init; Render += Rendering; @@ -49,13 +46,13 @@ namespace SM.Base GenericWindowCode.Resize(this); } - public void Start() + public void Start(bool renderContinuesly = false) { GLWpfControlSettings settings = new GLWpfControlSettings() { MajorVersion = GLSettings.ForcedVersion.MajorVersion, MinorVersion = GLSettings.ForcedVersion.MinorVersion, - RenderContinuously = _renderContinuesly + RenderContinuously = renderContinuesly }; base.Start(settings); } @@ -74,7 +71,7 @@ namespace SM.Base public TScene CurrentScene => _scene; public RenderPipeline RenderPipeline => _renderPipeline; - public GenericWPFWindow(bool renderContinuesly = false) : base(renderContinuesly) + public GenericWPFWindow() : base() { _viewportCamera = new TCamera(); } @@ -97,7 +94,7 @@ namespace SM.Base { _scene = scene; scene.Activate(); - RenderPipeline.SceneChanged(scene); + RenderPipeline?.SceneChanged(scene); } public void SetRenderPipeline(RenderPipeline renderPipeline) diff --git a/SMCode/SM.Base/Window/GenericWindowCode.cs b/SMCode/SM.Base/Window/GenericWindowCode.cs index 4750d85..115ef15 100644 --- a/SMCode/SM.Base/Window/GenericWindowCode.cs +++ b/SMCode/SM.Base/Window/GenericWindowCode.cs @@ -60,7 +60,7 @@ namespace SM.Base where TCamera : GenericCamera, new() { window.ViewportCamera.RecalculateWorld(window.WorldScale, window.Aspect); - window.RenderPipeline.Resize(); + window.RenderPipeline?.Resize(); PostProcessEffect.Model = Matrix4.CreateScale(window.WorldScale.X, -window.WorldScale.Y, 1); PostProcessEffect.Mvp = PostProcessEffect.Model * diff --git a/SMCode/SM.OGL/GLObject.cs b/SMCode/SM.OGL/GLObject.cs index d7b77ca..64a4903 100644 --- a/SMCode/SM.OGL/GLObject.cs +++ b/SMCode/SM.OGL/GLObject.cs @@ -64,6 +64,7 @@ namespace SM.OGL /// public virtual void Dispose() { + } /// diff --git a/SMCode/SM.OGL/Shaders/GenericShader.cs b/SMCode/SM.OGL/Shaders/GenericShader.cs index cde9326..6fb2ca9 100644 --- a/SMCode/SM.OGL/Shaders/GenericShader.cs +++ b/SMCode/SM.OGL/Shaders/GenericShader.cs @@ -82,6 +82,12 @@ namespace SM.OGL.Shaders /// public override ObjectLabelIdentifier TypeIdentifier { get; } = ObjectLabelIdentifier.Program; + public void Update(ShaderFileCollection newShaderFiles) + { + ShaderFileFiles = newShaderFiles; + Recompile(); + } + /// /// Loads the shader to the GPU. /// @@ -106,6 +112,11 @@ namespace SM.OGL.Shaders Load(); } + public override void Dispose() + { + GL.DeleteShader(this); + } + /// /// Draws the mesh. /// diff --git a/SMCode/SM.OGL/Shaders/ShaderExtensions.cs b/SMCode/SM.OGL/Shaders/ShaderExtensions.cs index b25f285..427da8b 100644 --- a/SMCode/SM.OGL/Shaders/ShaderExtensions.cs +++ b/SMCode/SM.OGL/Shaders/ShaderExtensions.cs @@ -47,6 +47,9 @@ namespace SM.OGL.Shaders { var name = $"{prefix}{Path.GetFileNameWithoutExtension(filePath.Substring(path.Length)).Replace('.', '_')}"; + + if (Extensions.ContainsKey(name)) continue; + Extensions.Add(name, new ShaderFile(reader.ReadToEnd())); } } diff --git a/SMCode/SM.OGL/Shaders/ShaderFile.cs b/SMCode/SM.OGL/Shaders/ShaderFile.cs index 704ad8f..d649094 100644 --- a/SMCode/SM.OGL/Shaders/ShaderFile.cs +++ b/SMCode/SM.OGL/Shaders/ShaderFile.cs @@ -62,7 +62,7 @@ namespace SM.OGL.Shaders foreach (var kvp in StringOverrides) _data = _data.Replace("//!" + kvp.Key, kvp.Value); } - + internal void Compile(GenericShader shader, ShaderType type) { if (_id < 0) diff --git a/SMCode/SM2D/Pipelines/Basic2DPipeline.cs b/SMCode/SM2D/Pipelines/Basic2DPipeline.cs index 408a840..c20fb2d 100644 --- a/SMCode/SM2D/Pipelines/Basic2DPipeline.cs +++ b/SMCode/SM2D/Pipelines/Basic2DPipeline.cs @@ -20,9 +20,7 @@ namespace SM2D.Pipelines protected override void RenderProcess(ref DrawContext context, Scene.Scene scene) { - - Framebuffer.Screen.Activate(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - if (scene != null) scene.Draw(context); + scene?.Draw(context); } } } \ No newline at end of file diff --git a/SMCode/SM2D/Window/GLWPFWindow2D.cs b/SMCode/SM2D/Window/GLWPFWindow2D.cs index 5bc3654..f334bac 100644 --- a/SMCode/SM2D/Window/GLWPFWindow2D.cs +++ b/SMCode/SM2D/Window/GLWPFWindow2D.cs @@ -26,7 +26,7 @@ namespace SM2D SMRenderer.DefaultMaterialShader = Default2DShader.MaterialShader; - SetRenderPipeline(Default2DPipeline.Pipeline); + //SetRenderPipeline(Default2DPipeline.Pipeline); } protected override void Rendering(TimeSpan delta) diff --git a/SM_WPF_TEST/MainWindow.xaml.cs b/SM_WPF_TEST/MainWindow.xaml.cs index 7aae84d..8aa8e58 100644 --- a/SM_WPF_TEST/MainWindow.xaml.cs +++ b/SM_WPF_TEST/MainWindow.xaml.cs @@ -15,6 +15,7 @@ using System.Windows.Shapes; using OpenTK.Graphics; using SM2D; using SM2D.Drawing; +using SM2D.Pipelines; using SM2D.Scene; namespace SM_WPF_TEST @@ -37,10 +38,13 @@ namespace SM_WPF_TEST gl.Start(); gl.SetScene(scene = new Scene()); + gl.SetRenderPipeline(Default2DPipeline.Pipeline); DrawObject2D cube = new DrawObject2D(); cube.Color = Color4.Blue; scene.Objects.Add(cube); + + new Window1().Show(); } } } diff --git a/SM_WPF_TEST/SM_WPF_TEST.csproj b/SM_WPF_TEST/SM_WPF_TEST.csproj index f09db9a..27ab8b3 100644 --- a/SM_WPF_TEST/SM_WPF_TEST.csproj +++ b/SM_WPF_TEST/SM_WPF_TEST.csproj @@ -61,6 +61,9 @@ MSBuild:Compile Designer + + Window1.xaml + MSBuild:Compile Designer @@ -73,6 +76,10 @@ MainWindow.xaml Code + + Designer + MSBuild:Compile + diff --git a/SM_WPF_TEST/Window1.xaml b/SM_WPF_TEST/Window1.xaml new file mode 100644 index 0000000..70408e6 --- /dev/null +++ b/SM_WPF_TEST/Window1.xaml @@ -0,0 +1,12 @@ + + + + + diff --git a/SM_WPF_TEST/Window1.xaml.cs b/SM_WPF_TEST/Window1.xaml.cs new file mode 100644 index 0000000..74f388c --- /dev/null +++ b/SM_WPF_TEST/Window1.xaml.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; +using OpenTK.Graphics; +using SM2D; +using SM2D.Drawing; +using SM2D.Pipelines; +using SM2D.Scene; + +namespace SM_WPF_TEST +{ + /// + /// Interaction logic for Window1.xaml + /// + public partial class Window1 : Window + { + public Window1() + { + InitializeComponent(); + + GLWPFWindow2D gl; + Scene scene; + Content = gl = new GLWPFWindow2D(); + gl.Start(); + + gl.SetScene(scene = new Scene()); + gl.SetRenderPipeline(Basic2DPipeline.Pipeline); + + DrawObject2D obj = new DrawObject2D() + { + Color = Color4.Red + }; + obj.ApplyCircle(); + scene.Objects.Add(obj); + } + } +}