ScreenFx.hx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package h3d.pass;
  2. class ScreenFx<T:h3d.shader.ScreenShader> {
  3. public var shader : T;
  4. public var pass : h3d.mat.Pass;
  5. var manager : ShaderManager;
  6. var plane : h3d.prim.Primitive;
  7. var engine : h3d.Engine;
  8. var shaders : hxsl.ShaderList;
  9. var buffers : h3d.shader.Buffers;
  10. public function new(shader, ?output) {
  11. this.shader = shader;
  12. shaders = new hxsl.ShaderList(shader);
  13. manager = new ShaderManager(output);
  14. pass = new h3d.mat.Pass(Std.string(this), new hxsl.ShaderList(shader));
  15. pass.culling = None;
  16. pass.depth(false, Always);
  17. plane = h3d.prim.Plane2D.get();
  18. engine = h3d.Engine.getCurrent();
  19. }
  20. function copy( src, dst ) {
  21. h3d.pass.Copy.run(src,dst);
  22. }
  23. public function setGlobals( ctx : h3d.scene.RenderContext ) {
  24. for( g in @:privateAccess ctx.sharedGlobals )
  25. manager.globals.fastSet(g.gid, g.value);
  26. }
  27. public function addShader<T:hxsl.Shader>(s:T) {
  28. shaders = hxsl.ShaderList.addSort(s, shaders);
  29. return pass.addShader(s);
  30. }
  31. public function removeShader(s:hxsl.Shader) {
  32. var prev : hxsl.ShaderList = null;
  33. var cur = shaders;
  34. while( cur != null ) {
  35. if( cur.s == s ) {
  36. if( prev == null ) shaders = cur.next else prev.next = cur.next;
  37. return true;
  38. }
  39. prev = cur;
  40. cur = cur.next;
  41. }
  42. return false;
  43. }
  44. public function getShader<T:hxsl.Shader>(cl:Class<T>) : T {
  45. for( s in shaders ) {
  46. var si = Std.instance(s, cl);
  47. if( si != null ) return si;
  48. }
  49. return null;
  50. }
  51. public function render() {
  52. var rts = manager.compileShaders(shaders);
  53. shader.flipY = engine.driver.hasFeature(BottomLeftCoords) && engine.getCurrentTarget() != null ? -1 : 1;
  54. engine.selectMaterial(pass);
  55. engine.selectShader(rts);
  56. if( buffers == null )
  57. buffers = new h3d.shader.Buffers(rts);
  58. else
  59. buffers.grow(rts);
  60. manager.fillGlobals(buffers, rts);
  61. manager.fillParams(buffers, rts, shaders);
  62. engine.uploadShaderBuffers(buffers, Globals);
  63. engine.uploadShaderBuffers(buffers, Params);
  64. engine.uploadShaderBuffers(buffers, Textures);
  65. plane.render(engine);
  66. }
  67. public function dispose() {
  68. }
  69. }