Renderer.hx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package hide;
  2. import h3d.pass.ScreenFx;
  3. // ----- Default Rendering --------------------------------
  4. class DefaultForwardComposite extends h3d.shader.ScreenShader {
  5. static var SRC = {
  6. @param var texture : Sampler2D;
  7. @param var outline : Sampler2D;
  8. function fragment() {
  9. pixelColor = texture.get(calculatedUV);
  10. var outval = outline.get(calculatedUV).rgb;
  11. if(outval.r > 0.1 && outval.r < 0.5)
  12. pixelColor.rgb += outval.rgb * 3.0 + 0.1;
  13. }
  14. }
  15. }
  16. class MaterialSetup extends h3d.mat.MaterialSetup {
  17. override public function createRenderer() {
  18. return new Renderer();
  19. }
  20. override function getDefaults( ?type : String ) : Any {
  21. if(type == "ui") return {
  22. kind : "Alpha",
  23. shadows : false,
  24. culled : false,
  25. lighted : false
  26. };
  27. return super.getDefaults(type);
  28. }
  29. }
  30. class Renderer extends h3d.scene.fwd.Renderer {
  31. var composite: h3d.pass.ScreenFx<DefaultForwardComposite>;
  32. var outline = new ScreenOutline();
  33. var outlineBlur = new h3d.pass.Blur(4);
  34. public function new() {
  35. super();
  36. composite = new h3d.pass.ScreenFx(new DefaultForwardComposite());
  37. }
  38. override function render() {
  39. var output = allocTarget("output");
  40. setTarget(output);
  41. clear(h3d.Engine.getCurrent().backgroundColor, 1, 0);
  42. if( has("shadow") )
  43. renderPass(shadow,get("shadow"));
  44. if( has("depth") )
  45. renderPass(depth,get("depth"));
  46. if( has("normal") )
  47. renderPass(normal,get("normal"));
  48. renderPass(defaultPass, get("default"), frontToBack);
  49. renderPass(defaultPass, get("alpha"), backToFront);
  50. renderPass(defaultPass, get("additive") );
  51. renderPass(defaultPass, get("debuggeom"), backToFront);
  52. renderPass(defaultPass, get("debuggeom_alpha"), backToFront);
  53. renderPass(defaultPass, get("overlay"), backToFront );
  54. renderPass(defaultPass, get("ui"), backToFront);
  55. var outlineTex = allocTarget("outlineBlur", false);
  56. {
  57. var outlineSrcTex = allocTarget("outline", true);
  58. setTarget(outlineSrcTex);
  59. clear(0);
  60. draw("highlightBack");
  61. draw("highlight");
  62. resetTarget();
  63. outlineBlur.apply(ctx, outlineSrcTex, outlineTex);
  64. }
  65. resetTarget();
  66. composite.shader.texture = output;
  67. composite.shader.outline = outlineTex;
  68. composite.render();
  69. }
  70. }
  71. // ----- PBR Rendering --------------------------------
  72. class PbrSetup extends h3d.mat.PbrMaterialSetup {
  73. function getEnvMap() {
  74. var ide = hide.Ide.inst;
  75. var scene = hide.comp.Scene.getCurrent();
  76. var path = ide.getPath(scene.config.get("scene.environment"));
  77. var data = sys.io.File.getBytes(path);
  78. var pix = hxd.res.Any.fromBytes(path, data).toImage().getPixels();
  79. var t = h3d.mat.Texture.fromPixels(pix, h3d.mat.Texture.nativeFormat); // sync
  80. t.setName(ide.makeRelative(path));
  81. return t;
  82. }
  83. override function createRenderer() {
  84. var env = new h3d.scene.pbr.Environment(getEnvMap());
  85. env.compute();
  86. return new PbrRenderer(env);
  87. }
  88. override function getDefaults( ?type : String ) : Any {
  89. if(type == "ui") return {
  90. mode : "Overlay",
  91. blend : "Alpha",
  92. shadows : false,
  93. culled : false,
  94. lighted : false
  95. };
  96. return super.getDefaults(type);
  97. }
  98. }
  99. class ScreenOutline extends h3d.shader.ScreenShader {
  100. static var SRC = {
  101. @param var texture: Sampler2D;
  102. function fragment() {
  103. var outval = texture.get(calculatedUV).rgb;
  104. pixelColor.a = outval.r > 0.1 && outval.r < 0.5 ? 1.0 : 0.0;
  105. pixelColor.rgb = (outval.r > outval.g ? 0.5 : 1.0).xxx;
  106. }
  107. };
  108. }
  109. class PbrRenderer extends h3d.scene.pbr.Renderer {
  110. var outline = new h3d.pass.ScreenFx(new ScreenOutline());
  111. var outlineBlur = new h3d.pass.Blur(4);
  112. public function new(env) {
  113. super(env);
  114. outline.pass.setBlendMode(Alpha);
  115. }
  116. override function getPassByName(name:String):h3d.pass.Base {
  117. switch( name ) {
  118. case "highlight", "highlightBack":
  119. return defaultPass;
  120. }
  121. return super.getPassByName(name);
  122. }
  123. override function getDefaultProps( ?kind : String ) : Any {
  124. var props : h3d.scene.pbr.Renderer.RenderProps = super.getDefaultProps(kind);
  125. props.sky = Background;
  126. return props;
  127. }
  128. override function end() {
  129. switch( currentStep ) {
  130. case MainDraw:
  131. case BeforeTonemapping:
  132. var outlineTex = allocTarget("outline", true);
  133. ctx.engine.pushTarget(outlineTex);
  134. clear(0);
  135. draw("highlightBack");
  136. draw("highlight");
  137. ctx.engine.popTarget();
  138. var outlineBlurTex = allocTarget("outlineBlur", false);
  139. outlineBlur.apply(ctx, outlineTex, outlineBlurTex);
  140. outline.shader.texture = outlineBlurTex;
  141. case AfterTonemapping:
  142. outline.render();
  143. renderPass(defaultPass, get("debuggeom"), backToFront);
  144. renderPass(defaultPass, get("debuggeom_alpha"), backToFront);
  145. case Overlay:
  146. renderPass(defaultPass, get("ui"), backToFront);
  147. default:
  148. }
  149. super.end();
  150. }
  151. }