MaterialBuilder.hx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package arm.node;
  2. import iron.data.SceneFormat;
  3. import arm.ui.UITrait;
  4. import arm.node.MaterialShader;
  5. import arm.Tool;
  6. class MaterialBuilder {
  7. public static var heightUsed = false;
  8. public static var emisUsed = false;
  9. public static var subsUsed = false;
  10. public static inline function make_paint(data: MaterialShaderData, matcon: TMaterialContext): MaterialShaderContext {
  11. return MakePaint.run(data, matcon);
  12. }
  13. public static inline function make_mesh(data: MaterialShaderData): MaterialShaderContext {
  14. return MakeMesh.run(data);
  15. }
  16. public static inline function make_mesh_preview(data: MaterialShaderData, matcon: TMaterialContext): MaterialShaderContext {
  17. return MakeMeshPreview.run(data, matcon);
  18. }
  19. public static inline function make_voxel(data: iron.data.ShaderData.ShaderContext) {
  20. #if rp_voxelao
  21. MakeVoxel.run(data);
  22. #end
  23. }
  24. public static inline function make_particle(data: MaterialShaderData): MaterialShaderContext {
  25. return MakeParticle.run(data);
  26. }
  27. public static function blendMode(frag: MaterialShader, blending: Int, cola: String, colb: String, opac: String): String {
  28. if (blending == BlendMix) {
  29. return 'mix($cola, $colb, $opac)';
  30. }
  31. else if (blending == BlendDarken) {
  32. return 'mix($cola, min($cola, $colb), $opac)';
  33. }
  34. else if (blending == BlendMultiply) {
  35. return 'mix($cola, $cola * $colb, $opac)';
  36. }
  37. else if (blending == BlendBurn) {
  38. return 'mix($cola, vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - $cola) / $colb, $opac)';
  39. }
  40. else if (blending == BlendLighten) {
  41. return 'max($cola, $colb * $opac)';
  42. }
  43. else if (blending == BlendScreen) {
  44. return '(vec3(1.0, 1.0, 1.0) - (vec3(1.0 - $opac, 1.0 - $opac, 1.0 - $opac) + $opac * (vec3(1.0, 1.0, 1.0) - $colb)) * (vec3(1.0, 1.0, 1.0) - $cola))';
  45. }
  46. else if (blending == BlendDodge) {
  47. return 'mix($cola, $cola / (vec3(1.0, 1.0, 1.0) - $colb), $opac)';
  48. }
  49. else if (blending == BlendAdd) {
  50. return 'mix($cola, $cola + $colb, $opac)';
  51. }
  52. else if (blending == BlendOverlay) {
  53. #if (kha_direct3d11 || kha_direct3d12)
  54. return 'mix($cola, ($cola < vec3(0.5, 0.5, 0.5) ? vec3(2.0, 2.0, 2.0) * $cola * $colb : vec3(1.0, 1.0, 1.0) - vec3(2.0, 2.0, 2.0) * (vec3(1.0, 1.0, 1.0) - $colb) * (vec3(1.0, 1.0, 1.0) - $cola)), $opac)';
  55. #else
  56. return 'mix($cola, $colb, $opac)'; // TODO
  57. #end
  58. }
  59. else if (blending == BlendSoftLight) {
  60. return '((1.0 - $opac) * $cola + $opac * ((vec3(1.0, 1.0, 1.0) - $cola) * $colb * $cola + $cola * (vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - $colb) * (vec3(1.0, 1.0, 1.0) - $cola))))';
  61. }
  62. else if (blending == BlendLinearLight) {
  63. return '($cola + $opac * (vec3(2.0, 2.0, 2.0) * ($colb - vec3(0.5, 0.5, 0.5))))';
  64. }
  65. else if (blending == BlendDifference) {
  66. return 'mix($cola, abs($cola - $colb), $opac)';
  67. }
  68. else if (blending == BlendSubtract) {
  69. return 'mix($cola, $cola - $colb, $opac)';
  70. }
  71. else if (blending == BlendDivide) {
  72. return 'vec3(1.0 - $opac, 1.0 - $opac, 1.0 - $opac) * $cola + vec3($opac, $opac, $opac) * $cola / $colb';
  73. }
  74. else if (blending == BlendHue) {
  75. frag.add_function(MaterialFunctions.str_hue_sat);
  76. return 'mix($cola, hsv_to_rgb(vec3(rgb_to_hsv($colb).r, rgb_to_hsv($cola).g, rgb_to_hsv($cola).b)), $opac)';
  77. }
  78. else if (blending == BlendSaturation) {
  79. frag.add_function(MaterialFunctions.str_hue_sat);
  80. return 'mix($cola, hsv_to_rgb(vec3(rgb_to_hsv($cola).r, rgb_to_hsv($colb).g, rgb_to_hsv($cola).b)), $opac)';
  81. }
  82. else if (blending == BlendColor) {
  83. frag.add_function(MaterialFunctions.str_hue_sat);
  84. return 'mix($cola, hsv_to_rgb(vec3(rgb_to_hsv($colb).r, rgb_to_hsv($colb).g, rgb_to_hsv($cola).b)), $opac)';
  85. }
  86. else { // BlendValue
  87. frag.add_function(MaterialFunctions.str_hue_sat);
  88. return 'mix($cola, hsv_to_rgb(vec3(rgb_to_hsv($cola).r, rgb_to_hsv($cola).g, rgb_to_hsv($colb).b)), $opac)';
  89. }
  90. }
  91. public static inline function getDisplaceStrength():Float {
  92. var sc = Context.mainObject().transform.scale.x;
  93. return UITrait.inst.displaceStrength * 0.02 * sc;
  94. }
  95. public static inline function voxelgiHalfExtents():String {
  96. var ext = UITrait.inst.vxaoExt;
  97. return 'const vec3 voxelgiHalfExtents = vec3($ext, $ext, $ext);';
  98. }
  99. }