Renderer.hx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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. if(showEditorGuides) {
  52. renderPass(defaultPass, get("debuggeom"), backToFront);
  53. renderPass(defaultPass, get("debuggeom_alpha"), backToFront);
  54. }
  55. renderPass(defaultPass, get("overlay"), backToFront );
  56. renderPass(defaultPass, get("ui"), backToFront);
  57. if (showEditorOutlines) {
  58. {
  59. var outlineTex = allocTarget("outlineBlur", false);
  60. var outlineSrcTex = allocTarget("outline", true);
  61. setTarget(outlineSrcTex);
  62. clear(0);
  63. draw("highlightBack");
  64. draw("highlight");
  65. resetTarget();
  66. outlineBlur.apply(ctx, outlineSrcTex, outlineTex);
  67. composite.shader.outline = outlineTex;
  68. }
  69. }
  70. resetTarget();
  71. composite.shader.texture = output;
  72. composite.render();
  73. }
  74. }
  75. // ----- PBR Rendering --------------------------------
  76. class PbrSetup extends h3d.mat.PbrMaterialSetup {
  77. function getEnvMap() {
  78. var ide = hide.Ide.inst;
  79. var scene = hide.comp.Scene.getCurrent();
  80. var path : String = "";
  81. if (scene != null) {
  82. path = ide.getPath(scene.config.get("scene.environment"));
  83. }
  84. else {
  85. var scene2 = hide.comp.Scene.getCurrent();
  86. path = ide.getPath(scene2.config.get("scene.environment"));
  87. }
  88. var data = sys.io.File.getBytes(path);
  89. var pix = hxd.res.Any.fromBytes(path, data).toImage().getPixels();
  90. var t = h3d.mat.Texture.fromPixels(pix, h3d.mat.Texture.nativeFormat); // sync
  91. t.setName(ide.makeRelative(path));
  92. return t;
  93. }
  94. override function createRenderer() {
  95. var env = new h3d.scene.pbr.Environment(getEnvMap());
  96. env.compute();
  97. return new PbrRenderer(env);
  98. }
  99. override function getDefaults( ?type : String ) : Any {
  100. if(type == "ui") return {
  101. mode : "Overlay",
  102. blend : "Alpha",
  103. shadows : false,
  104. culled : false,
  105. lighted : false
  106. };
  107. return super.getDefaults(type);
  108. }
  109. }
  110. class ScreenOutline extends h3d.shader.ScreenShader {
  111. static var SRC = {
  112. @param var texture: Sampler2D;
  113. function fragment() {
  114. var outval = texture.get(calculatedUV).rgb;
  115. pixelColor.a = outval.r > 0.1 && outval.r < 0.5 ? 1.0 : 0.0;
  116. pixelColor.rgb = (outval.r > outval.g ? 0.5 : 1.0).xxx;
  117. }
  118. };
  119. }
  120. class PbrRenderer extends h3d.scene.pbr.Renderer {
  121. public function new(env) {
  122. super(env);
  123. outline.pass.setBlendMode(Alpha);
  124. }
  125. override function getPassByName(name:String):h3d.pass.Output {
  126. switch( name ) {
  127. case "highlight", "highlightBack":
  128. return defaultPass;
  129. }
  130. return super.getPassByName(name);
  131. }
  132. override function getDefaultProps( ?kind : String ) : Any {
  133. var props : h3d.scene.pbr.Renderer.RenderProps = super.getDefaultProps(kind);
  134. props.sky = Background;
  135. return props;
  136. }
  137. override function end() {
  138. switch( currentStep ) {
  139. case Overlay:
  140. renderPass(defaultPass, get("ui"), backToFront);
  141. default:
  142. }
  143. super.end();
  144. }
  145. }