// Mappingシェーダ // ver 1.1 2020/12/02 // by yarunashi@dooon // xs_begin // author : 'yarunashi@dooon' // arg : { id = '0' name = 'type' value = '1' range = '1 3' step = '1' decimal = '0' } // arg : { id = '1' name = 'sphere' value = '0' range = '0 128' step = '1' decimal = '0' } // arg : { id = '2' name = 'deletemap' value = '0' range = '0 1' step = '1' decimal = '0' } // xs_end float type = i_args[0] ; float sphere = i_args[1] ; float deletemap = i_args[2] ; float atan2(in float y, in float x){ if (x == 0.0) return sign(y) * 90.0; return degrees(atan(y, x)); } float mapping(vec3 v) { float z = 0.0; if (type == 1.0) { float va = atan2( v.z, length(vec2(v.x, v.y)) ) + 90.0; z = i_volume_size.z * (va / 180.0); } else { z = v.z + i_volume_size.z / 2.0; } float ua = mod(atan2(v.y, v.x) + 270.0, 360.0); float x = i_volume_size.x * (ua / 360.0); return voxel(vec3(x, i_volume_size.y-1.0, z)); } float map(vec3 v) { float MAX_XYR = min(i_volume_size.x, i_volume_size.y) / 2.0; float MAX_R = min(MAX_XYR, i_volume_size.z / 2.0); vec3 pos = v - (i_volume_size / 2.0); float index = voxel(v); if (v.y >= i_volume_size.y-1.0) { if (deletemap == 1.0) { return 0.0; } else { return index; } } if (sphere > 0.0) { if (length(pos) < sphere) { index = i_color_index; } else { index = 0.0; } } if (index == 0.0) return 0.0; float i; if (type == 1.0 || type == 2.0) { //球or円筒 i = mapping(pos); } else { //平面 i = voxel(vec3(v.x, i_volume_size.y-1.0, v.z)); } return (i > 0.0)? i:index; }