Renderer.hx 4.4 KB

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