// Layerシェーダ // ver 1.0 2020/09/02 // by yarunashi@dooon // xs_begin // author : 'yarunashi@dooon' // arg : { id = '0' name = 'paint' value = '1' range = '0 1' step = '1' decimal = '0' } // arg : { id = '1' name = 'border' value = '0' range = '0 255' step = '1' decimal = '0' } // xs_end bool paint = (i_args[0]==1.0)?true:false; float border = (i_args[1]==0.0)?floor(i_volume_size.z/2.0):i_args[1]; //既存モデルの厚み float thickness(vec3 v) { float top = -1.0; for(float z = border; z >= 0.0; z--) { if (top < 0.0) { if (voxel(vec3(v.x, v.y, z)) > 0.0) top = z; } else { if (z == floor(v.z)) return top - z + 1; } } return 1.0; } //既存モデルからの高さ float height(vec3 v) { for(float z = border; z >= 0.0; z--) { if (voxel(vec3(v.x, v.y, z)) > 0.0) return v.z - z; } return v.z + 1; } //上からn層目のZ位置? float layer(vec3 v, float n) { for(float z = i_volume_size.z-1; z >= border; z--) { if (voxel(vec3(v.x, v.y, z)) > 0.0) { float zz = z - (n - 1); if (zz >= border) { return zz; } else { break; } } } return -1.0; } //下からn層目のZ位置? float layer_rev(vec3 v, float n) { for(float z = border; z < i_volume_size.z; z++) { if (voxel(vec3(v.x, v.y, z)) > 0.0) { float zz = z + (n - 1); if (zz < i_volume_size.z) { return zz; } else { break; } } } return -1.0; } float map(vec3 v) { float index = voxel(v); float z; if (paint) { if (v.z > border || index == 0.0) return 0.0; float t = thickness(v); z = layer(v, t); } else { // if (index > 0.0) return index; float t = height(v); z = layer_rev(v, t); } if (z >= 0.0) { float i = voxel(vec3(v.x, v.y, z)); if (i > 0.0) { return i; } } if (v.z > border) return 0.0; return index; }