[update] Updated PostEffect that can be shared with else scenes of PlayScene.
This commit is contained in:
		| @@ -28,10 +28,9 @@ import sjplayer.Actor, | ||||
| class Context { | ||||
|  public: | ||||
|   /// | ||||
|   this(ParametersBlock[] params, vec2i window_size, ProgramSet programs) { | ||||
|   this(ParametersBlock[] params, PostEffect posteffect, ProgramSet programs) { | ||||
|     actor_      = new Actor(programs.Get!ActorProgram); | ||||
|     background_ = new Background(programs.Get!BackgroundProgram); | ||||
|     posteffect_ = new PostEffect(programs.Get!PostEffectProgram, window_size); | ||||
|  | ||||
|     auto builder  = new Builder; | ||||
|     auto varstore = new VarStore(actor_); | ||||
| @@ -47,7 +46,7 @@ class Context { | ||||
|         ), | ||||
|         tuple( | ||||
|           "posteffect", | ||||
|           PostEffectControllerFactory(varstore, posteffect_), | ||||
|           PostEffectControllerFactory(varstore, posteffect), | ||||
|         ), | ||||
|  | ||||
|         tuple( | ||||
| @@ -94,7 +93,6 @@ class Context { | ||||
|     drawers_.each!destroy; | ||||
|     elements_.each!destroy; | ||||
|  | ||||
|     posteffect_.destroy(); | ||||
|     background_.destroy(); | ||||
|     actor_.destroy(); | ||||
|   } | ||||
| @@ -116,10 +114,6 @@ class Context { | ||||
|     controllers_.each!(x => x.Operate(time)); | ||||
|   } | ||||
|  | ||||
|   /// | ||||
|   void StartDrawing() { | ||||
|     posteffect_.BindFramebuffer(); | ||||
|   } | ||||
|   /// | ||||
|   void DrawBackground() { | ||||
|     background_.Draw(); | ||||
| @@ -132,11 +126,6 @@ class Context { | ||||
|   void DrawActor() { | ||||
|     actor_.Draw(); | ||||
|   } | ||||
|   /// | ||||
|   void EndDrawing() { | ||||
|     posteffect_.UnbindFramebuffer(); | ||||
|     posteffect_.DrawFramebuffer(); | ||||
|   } | ||||
|  | ||||
|   /// | ||||
|   @property inout(ActorControllerInterface) actor() inout { | ||||
| @@ -170,7 +159,6 @@ class Context { | ||||
|  | ||||
|   Actor      actor_; | ||||
|   Background background_; | ||||
|   PostEffect posteffect_; | ||||
|  | ||||
|   ElementInterface[]             elements_; | ||||
|   ElementDrawerInterface[]       drawers_; | ||||
|   | ||||
| @@ -28,6 +28,7 @@ class PostEffect { | ||||
|     program_ = program; | ||||
|     fb_      = Framebuffer.Create(); | ||||
|     tex_     = TextureRect.Create(); | ||||
|     depth_   = Renderbuffer.Create(); | ||||
|     sampler_ = Sampler.Create(); | ||||
|  | ||||
|     with (TextureRectAllocator()) { | ||||
| @@ -38,7 +39,11 @@ class PostEffect { | ||||
|       data           = null; | ||||
|       Allocate(tex_); | ||||
|     } | ||||
|  | ||||
|     with (RenderbufferAllocator()) { | ||||
|       format = GL_DEPTH_COMPONENT; | ||||
|       size   = sz; | ||||
|       Allocate(depth_); | ||||
|     } | ||||
|     with (SamplerConfigurer()) { | ||||
|       filterMin = GL_NEAREST; | ||||
|       filterMag = GL_NEAREST; | ||||
| @@ -48,6 +53,9 @@ class PostEffect { | ||||
|     fb_.Bind(); | ||||
|     fb_.attachment!(GL_COLOR_ATTACHMENT0, 0, GL_TEXTURE_RECTANGLE) = tex_; | ||||
|     fb_.attachmentOrder = [GL_COLOR_ATTACHMENT0]; | ||||
|  | ||||
|     fb_.attachment!GL_DEPTH_ATTACHMENT = depth_; | ||||
|  | ||||
|     fb_.Validate(); | ||||
|     fb_.Unbind(); | ||||
|   } | ||||
| @@ -78,6 +86,8 @@ class PostEffect { | ||||
|  | ||||
|   TextureRectRef tex_; | ||||
|  | ||||
|   RenderbufferRef depth_; | ||||
|  | ||||
|   SamplerRef sampler_; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -9,16 +9,17 @@ public { | ||||
|   import sjscript : ScriptException; | ||||
|  | ||||
|   import sjplayer.Context, | ||||
|          sjplayer.PostEffect, | ||||
|          sjplayer.ProgramSet, | ||||
|          sjplayer.ScriptRuntimeException; | ||||
| } | ||||
|  | ||||
| /// | ||||
| Context CreateContextFromText(string src, vec2i window_size, ProgramSet programs) { | ||||
|   return src.CreateScriptAst().CreateContextFromScriptAst(window_size, programs); | ||||
| Context CreateContextFromText(string src, PostEffect posteffect, ProgramSet programs) { | ||||
|   return src.CreateScriptAst().CreateContextFromScriptAst(posteffect, programs); | ||||
| } | ||||
| /// | ||||
| Context CreateContextFromScriptAst( | ||||
|     ParametersBlock[] params, vec2i window_size, ProgramSet programs) { | ||||
|   return new Context(params, window_size, programs); | ||||
|     ParametersBlock[] params, PostEffect posteffect, ProgramSet programs) { | ||||
|   return new Context(params, posteffect, programs); | ||||
| } | ||||
|   | ||||
| @@ -94,8 +94,6 @@ private auto CreateWindow(ref in Args args) { | ||||
|   sfWindow_setActive(win, true).enforce; | ||||
|  | ||||
|   gl.ApplyContext(); | ||||
|   gl.Enable(GL_BLEND); | ||||
|   gl.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||
|  | ||||
|   static struct Window { | ||||
|    public: | ||||
|   | ||||
| @@ -21,7 +21,6 @@ class AbstractGame { | ||||
|   } | ||||
|   /// | ||||
|   void Draw() { | ||||
|     gl.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | ||||
|     scene_.Draw(); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -7,6 +7,10 @@ import std.algorithm, | ||||
|        std.json, | ||||
|        std.path; | ||||
|  | ||||
| import gl4d; | ||||
|  | ||||
| static import sjplayer; | ||||
|  | ||||
| import sj.AbstractGame, | ||||
|        sj.Args, | ||||
|        sj.FontSet, | ||||
| @@ -35,11 +39,15 @@ class Game : AbstractGame { | ||||
|     fonts_    = new FontSet; | ||||
|     programs_ = new ProgramSet; | ||||
|  | ||||
|     posteffect_ = new sjplayer.PostEffect( | ||||
|         programs_.Get!(sjplayer.PostEffectProgram), | ||||
|         vec2i(args.window_size, args.window_size)); | ||||
|  | ||||
|     lobby_ = new LobbyWorld(programs_); | ||||
|  | ||||
|     title_  = new TitleScene(lobby_, programs_); | ||||
|     select_ = new SelectScene(lobby_, programs_, fonts_, music_list_); | ||||
|     load_   = new LoadingScene(args, lobby_, programs_, fonts_); | ||||
|     load_   = new LoadingScene(lobby_, posteffect_, programs_, fonts_); | ||||
|     play_   = new PlayScene; | ||||
|     result_ = new ResultScene(lobby_, programs_, fonts_); | ||||
|  | ||||
| @@ -59,6 +67,11 @@ class Game : AbstractGame { | ||||
|       title_.Initialize(); | ||||
|       super(title_); | ||||
|     } | ||||
|  | ||||
|     // setup OpenGL | ||||
|     gl.Enable(GL_BLEND); | ||||
|     gl.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||
|     gl.Disable(GL_DEPTH_TEST); | ||||
|   } | ||||
|  | ||||
|   ~this() { | ||||
| @@ -69,6 +82,7 @@ class Game : AbstractGame { | ||||
|     result_.destroy(); | ||||
|  | ||||
|     lobby_.destroy(); | ||||
|     posteffect_.destroy(); | ||||
|  | ||||
|     fonts_.destroy(); | ||||
|     programs_.destroy(); | ||||
| @@ -76,12 +90,25 @@ class Game : AbstractGame { | ||||
|     music_list_.each!destroy(); | ||||
|   } | ||||
|  | ||||
|   override void Draw() { | ||||
|     gl.Clear(GL_COLOR_BUFFER_BIT); | ||||
|  | ||||
|     posteffect_.BindFramebuffer(); | ||||
|     gl.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | ||||
|  | ||||
|     super.Draw(); | ||||
|     posteffect_.UnbindFramebuffer(); | ||||
|  | ||||
|     posteffect_.DrawFramebuffer(); | ||||
|   } | ||||
|  | ||||
|  private: | ||||
|   Music[] music_list_; | ||||
|  | ||||
|   FontSet    fonts_; | ||||
|   ProgramSet programs_; | ||||
|  | ||||
|   sjplayer.PostEffect posteffect_; | ||||
|   LobbyWorld          lobby_; | ||||
|  | ||||
|   TitleScene   title_; | ||||
|   | ||||
| @@ -3,8 +3,9 @@ module sj.LoadingScene; | ||||
|  | ||||
| import gl4d; | ||||
|  | ||||
| import sj.Args, | ||||
|        sj.FontSet, | ||||
| static import sjplayer; | ||||
|  | ||||
| import sj.FontSet, | ||||
|        sj.KeyInput, | ||||
|        sj.LobbyWorld, | ||||
|        sj.Music, | ||||
| @@ -17,12 +18,12 @@ class LoadingScene : SceneInterface { | ||||
|  public: | ||||
|   /// | ||||
|   this( | ||||
|       in ref Args args, | ||||
|       LobbyWorld          lobby, | ||||
|       sjplayer.PostEffect posteffect, | ||||
|       ProgramSet          programs, | ||||
|       FontSet             fonts) { | ||||
|     args_     = args; | ||||
|     lobby_      = lobby; | ||||
|     posteffect_ = posteffect; | ||||
|     programs_   = programs; | ||||
|     fonts_      = fonts; | ||||
|   } | ||||
| @@ -44,8 +45,7 @@ class LoadingScene : SceneInterface { | ||||
|   override SceneInterface Update(KeyInput input) { | ||||
|     if (first_drawn_) { | ||||
|       // TODO: parallelize context creation | ||||
|       auto context = music_.CreatePlayerContext( | ||||
|           vec2i(args_.window_size, args_.window_size), programs_.player); | ||||
|       auto context = music_.CreatePlayerContext(posteffect_, programs_.player); | ||||
|       play_scene_.Initialize(music_, context, offset_beat_); | ||||
|       return play_scene_; | ||||
|     } | ||||
| @@ -57,9 +57,7 @@ class LoadingScene : SceneInterface { | ||||
|   } | ||||
|  | ||||
|  private: | ||||
|   const Args args_; | ||||
|  | ||||
|   PlayScene play_scene_; | ||||
|   sjplayer.PostEffect posteffect_; | ||||
|  | ||||
|   ProgramSet programs_; | ||||
|  | ||||
| @@ -67,6 +65,8 @@ class LoadingScene : SceneInterface { | ||||
|  | ||||
|   LobbyWorld lobby_; | ||||
|  | ||||
|   PlayScene play_scene_; | ||||
|  | ||||
|   Music music_; | ||||
|   float offset_beat_; | ||||
|  | ||||
|   | ||||
| @@ -37,15 +37,13 @@ class LobbyWorld { | ||||
|  | ||||
|   /// | ||||
|   void Draw() { | ||||
|     gl.Disable(GL_DEPTH_TEST); | ||||
|     gl.DepthMask(false); | ||||
|     background_.Draw(); | ||||
|  | ||||
|     gl.Enable(GL_DEPTH_TEST); | ||||
|     gl.DepthMask(true); | ||||
|     cube_program_.Draw( | ||||
|         CreateCubes(cube_matrix.Create(), cube_interval)[], | ||||
|         Projection, view.Create(), light_pos, cube_material); | ||||
|     gl.Disable(GL_DEPTH_TEST); | ||||
|   } | ||||
|  | ||||
|   /// | ||||
|   | ||||
| @@ -83,9 +83,9 @@ class Music { | ||||
|  | ||||
|   /// | ||||
|   sjplayer.Context CreatePlayerContext( | ||||
|       vec2i winsz, sjplayer.ProgramSet programs) const { | ||||
|       sjplayer.PostEffect posteffect, sjplayer.ProgramSet programs) const { | ||||
|     return sjplayer.CreateContextFromText( | ||||
|         script_path_.readText, winsz, programs); | ||||
|         script_path_.readText, posteffect, programs); | ||||
|   } | ||||
|  | ||||
|   /// | ||||
|   | ||||
| @@ -74,14 +74,10 @@ class PlayScene : SceneInterface { | ||||
|     return this; | ||||
|   } | ||||
|   override void Draw() { | ||||
|     context_.StartDrawing(); | ||||
|  | ||||
|     context_.DrawBackground(); | ||||
|     context_.DrawElements(); | ||||
|     context_.DrawActor(); | ||||
|  | ||||
|     context_.EndDrawing(); | ||||
|  | ||||
|     if (beat_ >= context_.length) { | ||||
|       context_.destroy(); | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user