Files
armorpaint/Sources/arm/node/MaterialBuilder.hx
T

111 lines
4.1 KiB
Haxe
Raw Normal View History

2019-11-13 15:17:10 +01:00
package arm.node;
2019-06-19 22:42:17 +02:00
import iron.data.SceneFormat;
2020-03-18 20:26:28 +01:00
import arm.ui.UISidebar;
2019-11-13 15:17:10 +01:00
import arm.node.MaterialShader;
2020-03-18 20:26:28 +01:00
import arm.Enums;
2019-06-19 22:42:17 +02:00
class MaterialBuilder {
public static var heightUsed = false;
public static var emisUsed = false;
public static var subsUsed = false;
2019-12-09 00:28:10 +01:00
public static inline function make_paint(data: MaterialShaderData, matcon: TMaterialContext): MaterialShaderContext {
2019-12-05 23:17:00 +01:00
return MakePaint.run(data, matcon);
}
2019-06-19 22:42:17 +02:00
2019-12-09 00:28:10 +01:00
public static inline function make_mesh(data: MaterialShaderData): MaterialShaderContext {
2019-12-05 23:17:00 +01:00
return MakeMesh.run(data);
}
2019-06-19 22:42:17 +02:00
2019-12-09 00:28:10 +01:00
public static inline function make_mesh_preview(data: MaterialShaderData, matcon: TMaterialContext): MaterialShaderContext {
2019-12-05 23:17:00 +01:00
return MakeMeshPreview.run(data, matcon);
}
2019-06-19 22:42:17 +02:00
2019-12-09 00:28:10 +01:00
public static inline function make_voxel(data: iron.data.ShaderData.ShaderContext) {
#if rp_voxelao
2019-12-05 23:17:00 +01:00
MakeVoxel.run(data);
2019-12-09 00:28:10 +01:00
#end
2019-12-05 23:17:00 +01:00
}
2019-06-19 22:42:17 +02:00
2019-12-09 00:28:10 +01:00
public static inline function make_particle(data: MaterialShaderData): MaterialShaderContext {
2019-12-05 23:17:00 +01:00
return MakeParticle.run(data);
2019-06-19 22:42:17 +02:00
}
2019-12-09 00:28:10 +01:00
public static function blendMode(frag: MaterialShader, blending: Int, cola: String, colb: String, opac: String): String {
2019-12-08 16:59:08 +01:00
if (blending == BlendMix) {
2019-09-19 00:04:05 +02:00
return 'mix($cola, $colb, $opac)';
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else if (blending == BlendDarken) {
2019-09-19 00:04:05 +02:00
return 'mix($cola, min($cola, $colb), $opac)';
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else if (blending == BlendMultiply) {
2019-09-19 00:04:05 +02:00
return 'mix($cola, $cola * $colb, $opac)';
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else if (blending == BlendBurn) {
2019-09-19 00:04:05 +02:00
return 'mix($cola, vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - $cola) / $colb, $opac)';
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else if (blending == BlendLighten) {
2019-09-19 00:04:05 +02:00
return 'max($cola, $colb * $opac)';
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else if (blending == BlendScreen) {
2019-09-19 00:04:05 +02:00
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))';
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else if (blending == BlendDodge) {
2019-09-19 00:04:05 +02:00
return 'mix($cola, $cola / (vec3(1.0, 1.0, 1.0) - $colb), $opac)';
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else if (blending == BlendAdd) {
2019-09-19 00:04:05 +02:00
return 'mix($cola, $cola + $colb, $opac)';
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else if (blending == BlendOverlay) {
2020-05-12 15:12:46 +02:00
#if (kha_direct3d11 || kha_direct3d12 || kha_metal)
2019-09-19 00:04:05 +02:00
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)';
2019-09-19 20:18:57 +02:00
#else
return 'mix($cola, $colb, $opac)'; // TODO
#end
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else if (blending == BlendSoftLight) {
2019-09-19 00:04:05 +02:00
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))))';
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else if (blending == BlendLinearLight) {
2019-09-19 00:04:05 +02:00
return '($cola + $opac * (vec3(2.0, 2.0, 2.0) * ($colb - vec3(0.5, 0.5, 0.5))))';
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else if (blending == BlendDifference) {
2019-09-19 00:04:05 +02:00
return 'mix($cola, abs($cola - $colb), $opac)';
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else if (blending == BlendSubtract) {
2019-09-19 00:04:05 +02:00
return 'mix($cola, $cola - $colb, $opac)';
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else if (blending == BlendDivide) {
2019-09-19 00:04:05 +02:00
return 'vec3(1.0 - $opac, 1.0 - $opac, 1.0 - $opac) * $cola + vec3($opac, $opac, $opac) * $cola / $colb';
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else if (blending == BlendHue) {
2019-10-18 16:31:30 +02:00
frag.add_function(MaterialFunctions.str_hue_sat);
2019-09-19 00:04:05 +02:00
return 'mix($cola, hsv_to_rgb(vec3(rgb_to_hsv($colb).r, rgb_to_hsv($cola).g, rgb_to_hsv($cola).b)), $opac)';
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else if (blending == BlendSaturation) {
2019-10-18 16:31:30 +02:00
frag.add_function(MaterialFunctions.str_hue_sat);
2019-09-19 00:04:05 +02:00
return 'mix($cola, hsv_to_rgb(vec3(rgb_to_hsv($cola).r, rgb_to_hsv($colb).g, rgb_to_hsv($cola).b)), $opac)';
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else if (blending == BlendColor) {
2019-10-18 16:31:30 +02:00
frag.add_function(MaterialFunctions.str_hue_sat);
2019-09-19 00:04:05 +02:00
return 'mix($cola, hsv_to_rgb(vec3(rgb_to_hsv($colb).r, rgb_to_hsv($colb).g, rgb_to_hsv($cola).b)), $opac)';
2019-09-18 20:29:55 +02:00
}
2019-12-08 16:59:08 +01:00
else { // BlendValue
2019-10-18 16:31:30 +02:00
frag.add_function(MaterialFunctions.str_hue_sat);
2019-09-19 00:04:05 +02:00
return 'mix($cola, hsv_to_rgb(vec3(rgb_to_hsv($cola).r, rgb_to_hsv($cola).g, rgb_to_hsv($colb).b)), $opac)';
2019-09-18 20:29:55 +02:00
}
}
2019-12-05 23:17:00 +01:00
public static inline function getDisplaceStrength():Float {
2019-10-27 10:29:38 +01:00
var sc = Context.mainObject().transform.scale.x;
2020-06-01 22:13:18 +02:00
return Config.raw.displace_strength * 0.02 * sc;
2019-10-27 10:29:38 +01:00
}
2019-12-05 23:17:00 +01:00
public static inline function voxelgiHalfExtents():String {
2020-03-26 15:22:22 +01:00
var ext = Context.vxaoExt;
2019-08-25 21:21:56 +02:00
return 'const vec3 voxelgiHalfExtents = vec3($ext, $ext, $ext);';
}
2019-06-19 22:42:17 +02:00
}