├── LICENSE ├── bin ├── generate │ └── grid.cpp ├── light │ ├── directional.cpp │ ├── environment.cpp │ └── point.cpp ├── render │ └── render.cpp └── transform │ ├── average.cpp │ ├── erode.cpp │ ├── noise.cpp │ ├── transform.cpp │ └── transform_data.cpp ├── demo_scene.nk ├── nodes.nk ├── plugin ├── gizmos │ ├── V_Average.gizmo │ ├── V_DirLight.gizmo │ ├── V_EnvLight.gizmo │ ├── V_Erode.gizmo │ ├── V_Grid.gizmo │ ├── V_Noise.gizmo │ ├── V_Preview.gizmo │ ├── V_PtLight.gizmo │ ├── V_Render.gizmo │ ├── V_Shape.gizmo │ └── V_Transform.gizmo ├── icons │ ├── MatteHue.png │ ├── V_Average.png │ ├── V_DirLight.png │ ├── V_EnvLight.png │ ├── V_Erode.png │ ├── V_Grid.png │ ├── V_Noise.png │ ├── V_Preview.png │ ├── V_PtLight.png │ ├── V_Render.png │ ├── V_Shape.png │ └── V_Transform.png ├── init.py └── menu.py └── readme.md /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 MattRickS 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /bin/generate/grid.cpp: -------------------------------------------------------------------------------- 1 | kernel VGrid : ImageComputationKernel 2 | { 3 | Image format; 4 | Image dst; 5 | 6 | param: 7 | float3 bbox_min; // from origin 8 | float3 bbox_max; // from origin 9 | int3 resolution; 10 | int total; 11 | 12 | local: 13 | float3 scale; 14 | 15 | void init() 16 | { 17 | for (int c = 0; c < 3; c++) 18 | scale[c] = (bbox_max[c] - bbox_min[c]) / resolution[c]; 19 | } 20 | 21 | void process(int2 pos) 22 | { 23 | int id = pos.y * dst.bounds.width() + pos.x; 24 | if (id >= total) 25 | { 26 | dst() = 0; 27 | return; 28 | } 29 | int xy = id / resolution.z; 30 | dst(0) = ((xy % resolution.x) + 0.5f) * scale.x + bbox_min.x; 31 | dst(1) = ((xy / resolution.x) + 0.5f) * scale.y + bbox_min.y; 32 | dst(2) = ((id % resolution.z) + 0.5f) * scale.z + bbox_min.z; 33 | dst(3) = 1; 34 | } 35 | }; -------------------------------------------------------------------------------- /bin/light/directional.cpp: -------------------------------------------------------------------------------- 1 | kernel VDirLight : ImageComputationKernel 2 | { 3 | Image voxels; 4 | Image dst; 5 | 6 | param: 7 | float3 bbox_min; 8 | float3 bbox_max; 9 | int3 resolution; 10 | float3 dir; 11 | float intensity; 12 | float absorption; 13 | int samples; 14 | float4x4 transform_M; 15 | 16 | local: 17 | float3 aabb[2]; 18 | float3 VoxelSizeInv; 19 | float3 _dir; 20 | float3 dir_inv; 21 | int grid_width; 22 | int _samples; 23 | 24 | void define() 25 | { 26 | defineParam(intensity, "intensity", 1.0f); 27 | defineParam(absorption, "absorption", 0.5f); 28 | defineParam(samples, "samples", 50); 29 | } 30 | 31 | void init() 32 | { 33 | aabb[0] = bbox_min; 34 | aabb[1] = bbox_max; 35 | 36 | for (int c = 0; c < 3; c++) 37 | VoxelSizeInv[c] = resolution[c] / (bbox_max[c] - bbox_min[c]); 38 | 39 | _dir = multVectMatrix(dir, transform_M.invert()); 40 | dir_inv = 1.0f / _dir; 41 | 42 | grid_width = voxels.bounds.width(); 43 | _samples = max(1, samples); 44 | } 45 | 46 | float3 multVectMatrix(float3 vec, float4x4 M) 47 | { 48 | // Rotation only 49 | float3 out = float3( 50 | vec.x * M[0][0] + vec.y * M[0][1] + vec.z * M[0][2], // + M[0][3], 51 | vec.x * M[1][0] + vec.y * M[1][1] + vec.z * M[1][2], // + M[1][3], 52 | vec.x * M[2][0] + vec.y * M[2][1] + vec.z * M[2][2] // + M[2][3] 53 | ); 54 | 55 | return out; 56 | } 57 | 58 | // Axis aligned bounding box intersection for GPU : Shortened for exit only 59 | float intersection_exit_AABB(float3 origin, float3 inv_dir) 60 | { 61 | //bool sign[3] {inv_dir.x < 0, inv_dir.y < 0, inv_dir.z < 0}; 62 | float tmin, tmax, tymin, tymax, tzmin, tzmax; 63 | bool sign = inv_dir.x < 0 ? 0 : 1; 64 | tmax = (aabb[sign].x - origin.x) * inv_dir.x; 65 | sign = inv_dir.y < 0 ? 0 : 1; 66 | tymax = (aabb[sign].y - origin.y) * inv_dir.y; 67 | sign = inv_dir.z < 0 ? 0 : 1; 68 | tzmax = (aabb[sign].z - origin.z) * inv_dir.z; 69 | tmax = min(min(tmax, tymax), tzmax); 70 | return tmax; 71 | } 72 | 73 | float voxelValue(int3 voxel) 74 | { 75 | // Return Empty for values outside of grid 76 | if (voxel.x < 0 || resolution.x <= voxel.x || 77 | voxel.y < 0 || resolution.y <= voxel.y || 78 | voxel.z < 0 || resolution.z <= voxel.z ) 79 | return 0; 80 | 81 | int id = (voxel.y * resolution.x + voxel.x) * resolution.z + voxel.z; 82 | int x = id % grid_width; 83 | int y = id / grid_width; 84 | return voxels(x, y)[3]; // Just alpha (density) 85 | } 86 | 87 | float Blend(float3 curpos) 88 | { 89 | float3 weight, voxel_space; 90 | int3 base_voxel, offset; 91 | // Lower Bound of 8 adjacent voxels 92 | for (int c = 0; c < 3; c++) 93 | { 94 | voxel_space[c] = curpos[c] * VoxelSizeInv[c]; 95 | base_voxel[c] = int(floor(voxel_space[c] - 0.5f)); 96 | } 97 | 98 | float result = 0; 99 | for (int i = 0; i < 8; i++) 100 | { 101 | // Weighted distance on each axis for each adjacent voxel 102 | offset = int3(i / 4, (i / 2) % 2, i % 2); 103 | weight.x = 1 - fabs(offset.x - (voxel_space.x - (base_voxel.x + 0.5f))); 104 | weight.y = 1 - fabs(offset.y - (voxel_space.y - (base_voxel.y + 0.5f))); 105 | weight.z = 1 - fabs(offset.z - (voxel_space.z - (base_voxel.z + 0.5f))); 106 | 107 | result += voxelValue(base_voxel + offset) * weight.x * weight.y * weight.z; 108 | } 109 | 110 | return result; 111 | } 112 | 113 | void process(int2 pos) 114 | { 115 | // Skip empty voxels 116 | float4 v = voxels(pos.x, pos.y); 117 | if (v.w <= 0) 118 | return; 119 | 120 | // Starting values 121 | float3 voxel = float3(v.x, v.y, v.z); // Center of voxel 122 | 123 | // Fire ray towards light, get closest distance 124 | float max_dist = intersection_exit_AABB(voxel, dir_inv); 125 | 126 | // ========== Ray Marching ========== 127 | 128 | // Maximum of 1000 samples per voxel 129 | float deltaT, result = intensity, step = max(max_dist / _samples, 0.001f); 130 | float3 curpos; 131 | 132 | for (float dist = 0; dist <= max_dist; dist += step) 133 | { 134 | curpos = voxel - dir * dist; 135 | deltaT = exp(-absorption * Blend(curpos - bbox_min) * step); 136 | result *= deltaT; 137 | 138 | // End loop if Transmittance is near 0 139 | if (result < 1e-6) 140 | break; 141 | } 142 | 143 | dst() = result; 144 | 145 | } 146 | 147 | }; -------------------------------------------------------------------------------- /bin/light/environment.cpp: -------------------------------------------------------------------------------- 1 | kernel VEnvLight : ImageComputationKernel 2 | { 3 | Image voxels; 4 | Image environment; 5 | Image dst; 6 | 7 | param: 8 | float3 bbox_min; 9 | float3 bbox_max; 10 | int3 resolution; 11 | bool luminance_on; 12 | float rotate; 13 | float intensity; 14 | float absorption; 15 | int samples; 16 | float4x4 transform_M; 17 | 18 | local: 19 | float3 aabb[2]; 20 | float3 VoxelSizeInv; 21 | float _absorption; 22 | int grid_width; 23 | float rad2deg; 24 | int _samples; 25 | 26 | void define() 27 | { 28 | defineParam(intensity, "intensity", 1.0f); 29 | defineParam(absorption, "absorption", 0.5f); // Absorption? Rate of Decay 30 | defineParam(samples, "samples", 50); 31 | } 32 | 33 | void init() 34 | { 35 | aabb[0] = bbox_min; 36 | aabb[1] = bbox_max; 37 | grid_width = voxels.bounds.width(); 38 | 39 | for (int c = 0; c < 3; c++) 40 | VoxelSizeInv[c] = resolution[c] / (bbox_max[c] - bbox_min[c]); 41 | 42 | _absorption = 1 / (1 - absorption); 43 | rad2deg = 180.0f / PI; 44 | _samples = max(1, samples); 45 | } 46 | 47 | float3 multVectMatrix(float3 vec, float4x4 M) 48 | { 49 | float3 out = float3( 50 | vec.x * M[0][0] + vec.y * M[0][1] + vec.z * M[0][2] + M[0][3], 51 | vec.x * M[1][0] + vec.y * M[1][1] + vec.z * M[1][2] + M[1][3], 52 | vec.x * M[2][0] + vec.y * M[2][1] + vec.z * M[2][2] + M[2][3] 53 | ); 54 | 55 | return out; 56 | } 57 | 58 | // Axis aligned bounding box intersection for GPU : Shortened for exit only 59 | float intersection_exit_AABB(float3 origin, float3 inv_dir, float3 bbox[2]) 60 | { 61 | //bool sign[3] {inv_dir.x < 0, inv_dir.y < 0, inv_dir.z < 0}; 62 | float tmin, tmax, tymin, tymax, tzmin, tzmax; 63 | bool sign = inv_dir.x < 0 ? 0 : 1; 64 | tmax = (aabb[sign].x - origin.x) * inv_dir.x; 65 | sign = inv_dir.y < 0 ? 0 : 1; 66 | tymax = (aabb[sign].y - origin.y) * inv_dir.y; 67 | sign = inv_dir.z < 0 ? 0 : 1; 68 | tzmax = (aabb[sign].z - origin.z) * inv_dir.z; 69 | tmax = min(min(tmax, tymax), tzmax); 70 | return tmax; 71 | } 72 | 73 | float voxelValue(int3 voxel) 74 | { 75 | // Return Empty for values outside of grid 76 | if (voxel.x < 0 || resolution.x <= voxel.x || 77 | voxel.y < 0 || resolution.y <= voxel.y || 78 | voxel.z < 0 || resolution.z <= voxel.z ) 79 | return 0; 80 | 81 | int id = (voxel.y * resolution.x + voxel.x) * resolution.z + voxel.z; 82 | int x = id % grid_width; 83 | int y = id / grid_width; 84 | return voxels(x, y)[3]; // Just alpha (density) 85 | } 86 | 87 | float Blend(float3 curpos) 88 | { 89 | float3 weight, voxel_space; 90 | int3 base_voxel, offset; 91 | // Lower Bound of 8 adjacent voxels 92 | for (int c = 0; c < 3; c++) 93 | { 94 | voxel_space[c] = curpos[c] * VoxelSizeInv[c]; 95 | base_voxel[c] = int(floor(voxel_space[c] - 0.5f)); 96 | } 97 | 98 | float result = 0; 99 | for (int i = 0; i < 8; i++) 100 | { 101 | // Weighted distance on each axis for each adjacent voxel 102 | offset = int3(i / 4, (i / 2) % 2, i % 2); 103 | weight.x = 1 - fabs(offset.x - (voxel_space.x - (base_voxel.x + 0.5f))); 104 | weight.y = 1 - fabs(offset.y - (voxel_space.y - (base_voxel.y + 0.5f))); 105 | weight.z = 1 - fabs(offset.z - (voxel_space.z - (base_voxel.z + 0.5f))); 106 | 107 | result += voxelValue(base_voxel + offset) * weight.x * weight.y * weight.z; 108 | } 109 | 110 | return result; 111 | } 112 | 113 | void process(int2 pos) 114 | { 115 | // Skip empty voxels 116 | float4 v = voxels(pos.x, pos.y); 117 | if (v.w <= 0) 118 | return; 119 | 120 | 121 | // ========== AMBIENT LIGHT ========== 122 | 123 | // Fire a ray from outer sphere to voxel, accumulate fog 124 | 125 | // Starting values 126 | float3 voxel = float3(v.x, v.y, v.z); // Center of voxel 127 | 128 | int3 voxel_i; 129 | for (int c = 0; c < 3; c++) 130 | voxel_i[c] = (voxel[c] - bbox_min[c]) * VoxelSizeInv[c]; 131 | 132 | float3 normal = float3( 133 | voxelValue(voxel_i - int3(1,0,0)) - voxelValue(voxel_i + int3(1,0,0)), 134 | voxelValue(voxel_i - int3(0,1,0)) - voxelValue(voxel_i + int3(0,1,0)), 135 | voxelValue(voxel_i - int3(0,0,1)) - voxelValue(voxel_i + int3(0,0,1)) 136 | ); 137 | 138 | float3 dir = -normalize(normal); 139 | // Skip directionless voxels 140 | if (dir.x == 0 && dir.y == 0 && dir.z == 0) return; 141 | 142 | float3 dir_inv = 1.0f / dir; 143 | 144 | // Convert direction to latlong coordinates 145 | float3 env_dir = normalize(multVectMatrix(dir, transform_M)); 146 | float x = (fmod((rad2deg * atan2(env_dir.z, env_dir.x) + rotate), 360.0f) / 360.0f + 0.5f) * environment.bounds.width(); 147 | float y = ((rad2deg * acos(env_dir.y)) / 180.0f) * environment.bounds.height(); 148 | 149 | float4 colour = environment(x, y); 150 | float luminance = (colour.x * 0.3f + colour.y * 0.59f + colour.z * 0.11f) * intensity; 151 | 152 | // Move starting point to whatever's closest: intersection / light 153 | float max_dist = intersection_exit_AABB(voxel, -dir_inv, aabb); 154 | 155 | // ========== Ray Marching ========== 156 | 157 | // Maximum of 1000 samples per voxel 158 | float result = luminance * luminance_on + intensity * (1 - luminance_on); 159 | float deltaT = 1, step = max(max_dist / _samples, 0.001f); 160 | float3 curpos; 161 | 162 | for (float dist = 0; dist <= max_dist; dist += step) 163 | { 164 | curpos = voxel - dir * dist; 165 | deltaT = exp(-absorption * Blend(curpos - bbox_min) * step); 166 | result *= deltaT; 167 | 168 | // End loop if Transmittance is near 0 169 | if (result < 1e-6) 170 | break; 171 | //dist += (result < 1e-6) * max_dist; 172 | } 173 | 174 | dst() = result * environment(x, y); 175 | dst(3) = v.w; 176 | 177 | } 178 | 179 | }; -------------------------------------------------------------------------------- /bin/light/point.cpp: -------------------------------------------------------------------------------- 1 | kernel VPtLight : ImageComputationKernel 2 | { 3 | Image voxels; 4 | Image dst; 5 | 6 | param: 7 | float3 bbox_min; 8 | float3 bbox_max; 9 | int3 resolution; 10 | float3 light; 11 | float intensity; 12 | float absorption; 13 | int samples; 14 | float4x4 transform_M; 15 | 16 | local: 17 | float3 aabb[2]; 18 | float3 VoxelSizeInv; 19 | float3 _light; 20 | int grid_width; 21 | int _samples; 22 | 23 | void define() 24 | { 25 | defineParam(intensity, "intensity", 1.0f); 26 | defineParam(absorption, "absorption", 0.5f); 27 | defineParam(samples, "samples", 50); 28 | } 29 | 30 | void init() 31 | { 32 | aabb[0] = bbox_min; 33 | aabb[1] = bbox_max; 34 | 35 | for (int c = 0; c < 3; c++) 36 | VoxelSizeInv[c] = resolution[c] / (bbox_max[c] - bbox_min[c]); 37 | 38 | _light = multVectMatrix(light, transform_M.invert()); 39 | 40 | grid_width = voxels.bounds.width(); 41 | _samples = max(1, samples); 42 | } 43 | 44 | float3 multVectMatrix(float3 vec, float4x4 M) 45 | { 46 | float3 out = float3( 47 | vec.x * M[0][0] + vec.y * M[0][1] + vec.z * M[0][2] + M[0][3], 48 | vec.x * M[1][0] + vec.y * M[1][1] + vec.z * M[1][2] + M[1][3], 49 | vec.x * M[2][0] + vec.y * M[2][1] + vec.z * M[2][2] + M[2][3] 50 | ); 51 | 52 | return out; 53 | } 54 | 55 | // Axis aligned bounding box intersection for GPU : Shortened for exit only 56 | float intersection_exit_AABB(float3 origin, float3 inv_dir) 57 | { 58 | //bool sign[3] {inv_dir.x < 0, inv_dir.y < 0, inv_dir.z < 0}; 59 | float tmin, tmax, tymin, tymax, tzmin, tzmax; 60 | bool sign = inv_dir.x < 0 ? 0 : 1; 61 | tmax = (aabb[sign].x - origin.x) * inv_dir.x; 62 | sign = inv_dir.y < 0 ? 0 : 1; 63 | tymax = (aabb[sign].y - origin.y) * inv_dir.y; 64 | sign = inv_dir.z < 0 ? 0 : 1; 65 | tzmax = (aabb[sign].z - origin.z) * inv_dir.z; 66 | tmax = min(min(tmax, tymax), tzmax); 67 | return tmax; 68 | } 69 | 70 | float voxelValue(int3 voxel) 71 | { 72 | // Return Empty for values outside of grid 73 | if (voxel.x < 0 || resolution.x <= voxel.x || 74 | voxel.y < 0 || resolution.y <= voxel.y || 75 | voxel.z < 0 || resolution.z <= voxel.z ) 76 | return 0; 77 | 78 | int id = (voxel.y * resolution.x + voxel.x) * resolution.z + voxel.z; 79 | int x = id % grid_width; 80 | int y = id / grid_width; 81 | return voxels(x, y)[3]; // Just alpha (density) 82 | } 83 | 84 | float Blend(float3 curpos) 85 | { 86 | float3 weight, voxel_space; 87 | int3 base_voxel, offset; 88 | // Lower Bound of 8 adjacent voxels 89 | for (int c = 0; c < 3; c++) 90 | { 91 | voxel_space[c] = curpos[c] * VoxelSizeInv[c]; 92 | base_voxel[c] = int(floor(voxel_space[c] - 0.5f)); 93 | } 94 | 95 | float result = 0; 96 | for (int i = 0; i < 8; i++) 97 | { 98 | // Weighted distance on each axis for each adjacent voxel 99 | offset = int3(i / 4, (i / 2) % 2, i % 2); 100 | weight.x = 1 - fabs(offset.x - (voxel_space.x - (base_voxel.x + 0.5f))); 101 | weight.y = 1 - fabs(offset.y - (voxel_space.y - (base_voxel.y + 0.5f))); 102 | weight.z = 1 - fabs(offset.z - (voxel_space.z - (base_voxel.z + 0.5f))); 103 | 104 | result += voxelValue(base_voxel + offset) * weight.x * weight.y * weight.z; 105 | } 106 | 107 | return result; 108 | } 109 | 110 | void process(int2 pos) 111 | { 112 | // Skip empty voxels 113 | float4 v = voxels(pos.x, pos.y); 114 | if (v.w <= 0) 115 | return; 116 | 117 | // Starting values 118 | float3 voxel = float3(v.x, v.y, v.z); // Center of voxel 119 | float3 dir = voxel - _light; // from light to voxel 120 | float dist_to_light = length(dir); 121 | dir /= dist_to_light; 122 | 123 | // Fire ray towards light, get closest distance 124 | float max_dist = min(dist_to_light, intersection_exit_AABB(voxel, -1.0f / dir)); 125 | 126 | // ========== Ray Marching ========== 127 | 128 | // Maximum of 1000 samples per voxel 129 | float deltaT, result = intensity, step = max(max_dist / _samples, 0.001f); 130 | float3 curpos; 131 | 132 | for (float dist = 0; dist <= max_dist; dist += step) 133 | { 134 | curpos = voxel - dir * dist; 135 | deltaT = exp(-absorption * Blend(curpos - bbox_min) * step); 136 | result *= deltaT; 137 | 138 | // End loop if Transmittance is near 0 139 | if (result < 1e-6) 140 | break; 141 | //dist += (result < 1e-6) * max_dist; 142 | } 143 | 144 | dst() = result; 145 | 146 | } 147 | 148 | }; -------------------------------------------------------------------------------- /bin/render/render.cpp: -------------------------------------------------------------------------------- 1 | kernel VRender : ImageComputationKernel 2 | { 3 | Image voxels; 4 | Image dst; 5 | 6 | param: 7 | int3 resolution; 8 | float3 bbox_min; 9 | float3 bbox_max; 10 | float density; 11 | int samples; 12 | // Camera Parameters 13 | float width; 14 | float height; 15 | float focal; 16 | float haperture; 17 | float4x4 cam_M; 18 | float4x4 transform_M; 19 | 20 | local: 21 | float3 aabb[2]; 22 | float3 voxelHalfSize; 23 | float3 VoxelSizeInv; 24 | int grid_width; 25 | int _samples; 26 | // Camera Parameters 27 | float ratio; 28 | float3 camera; 29 | float3 up; 30 | float3 right; 31 | float3 forward; 32 | 33 | void define() 34 | { 35 | defineParam(resolution, "Resolution", int3(10,10,10)); 36 | defineParam(density, "density", 1.0f); 37 | defineParam(samples, "samples", 50); 38 | // Camera Parameters 39 | defineParam(width, "Width", 1440.0f); 40 | defineParam(height, "Height", 810.0f); 41 | defineParam(focal, "Focal", 30.0f); 42 | defineParam(haperture, "Haperture", 24.576f); 43 | } 44 | 45 | void init() 46 | { 47 | aabb[0] = bbox_min; 48 | aabb[1] = bbox_max; 49 | for (int c = 0; c < 3; c++) 50 | VoxelSizeInv[c] = resolution[c] / (bbox_max[c] - bbox_min[c]); 51 | voxelHalfSize = 0.5f / VoxelSizeInv; 52 | grid_width = voxels.bounds.width(); 53 | _samples = max(1, samples); 54 | 55 | float4x4 camM = transform_M.invert() * cam_M; 56 | 57 | // Camera Parameters 58 | ratio = focal / haperture; 59 | camera = float3(camM[0][3], camM[1][3], camM[2][3]); 60 | up = normalize(multVectMatrix(float3(0.0f, 1.0f, 0.0f), camM) - camera) * (height / width); 61 | right = normalize(multVectMatrix(float3(1.0f, 0.0f, 0.0f), camM) - camera); 62 | forward = normalize(multVectMatrix(float3(0.0f, 0.0f, -1.0f), camM) - camera); 63 | } 64 | 65 | float3 multVectMatrix(float3 vec, float4x4 M) 66 | { 67 | float3 out = float3( 68 | vec.x * M[0][0] + vec.y * M[0][1] + vec.z * M[0][2] + M[0][3], 69 | vec.x * M[1][0] + vec.y * M[1][1] + vec.z * M[1][2] + M[1][3], 70 | vec.x * M[2][0] + vec.y * M[2][1] + vec.z * M[2][2] + M[2][3] 71 | ); 72 | 73 | return out; 74 | } 75 | 76 | float4 voxelValue(int3 voxel) 77 | { 78 | // Return Empty for values outside of grid 79 | if (voxel.x < 0 || resolution.x <= voxel.x || 80 | voxel.y < 0 || resolution.y <= voxel.y || 81 | voxel.z < 0 || resolution.z <= voxel.z ) 82 | return 0; 83 | 84 | int id = (voxel.y * resolution.x + voxel.x) * resolution.z + voxel.z; 85 | int x = id % grid_width; 86 | int y = id / grid_width; 87 | 88 | return voxels(x, y); 89 | } 90 | 91 | 92 | float4 Blend(float3 curpos) 93 | { 94 | float3 weight, voxel_space; 95 | int3 base_voxel, offset; 96 | // Lower Bound of 8 adjacent voxels 97 | for (int c = 0; c < 3; c++) 98 | { 99 | voxel_space[c] = curpos[c] * VoxelSizeInv[c]; 100 | base_voxel[c] = int(floor(voxel_space[c] - 0.5f)); 101 | } 102 | 103 | float4 result = 0; 104 | for (int i = 0; i < 8; i++) 105 | { 106 | // Weighted distance on each axis for each adjacent voxel 107 | offset = int3(i / 4, (i / 2) % 2, i % 2); 108 | weight.x = 1 - fabs(offset.x - (voxel_space.x - (base_voxel.x + 0.5f))); 109 | weight.y = 1 - fabs(offset.y - (voxel_space.y - (base_voxel.y + 0.5f))); 110 | weight.z = 1 - fabs(offset.z - (voxel_space.z - (base_voxel.z + 0.5f))); 111 | 112 | result += voxelValue(base_voxel + offset) * weight.x * weight.y * weight.z; 113 | } 114 | 115 | return result; 116 | } 117 | 118 | 119 | float2 intersection_AABB(float3 origin, float3 inv_dir) 120 | { 121 | // Axis aligned bounding box intersection for GPU 122 | // aabb = min_corner, max_corner (eg, (0,0,0), (1,1,1)) 123 | // ray = origin, direction, inv_dir (1/dir), sign (x < 0 ? 1 : 0) 124 | float tmin, tmax, tymin, tymax, tzmin, tzmax; 125 | bool sign = inv_dir.x < 0 ? 0 : 1; 126 | tmin = (aabb[1 - sign].x - origin.x) * inv_dir.x; 127 | tmax = (aabb[sign].x - origin.x) * inv_dir.x; 128 | sign = inv_dir.y < 0 ? 0 : 1; 129 | tymin = (aabb[1 - sign].y - origin.y) * inv_dir.y; 130 | tymax = (aabb[sign].y - origin.y) * inv_dir.y; 131 | sign = inv_dir.z < 0 ? 0 : 1; 132 | tzmin = (aabb[1 - sign].z - origin.z) * inv_dir.z; 133 | tzmax = (aabb[sign].z - origin.z) * inv_dir.z; 134 | tmin = max(max(tmin, tymin), tzmin); 135 | tmax = min(min(tmax, tymax), tzmax); 136 | return float2(max(tmin, 0.0f), tmax); 137 | } 138 | 139 | 140 | void process(int2 pos) 141 | { 142 | // Calculating the eye vector 143 | float u = pos.x / width - 0.5f; 144 | float v = pos.y / height - 0.5f; 145 | 146 | // Ray direction 147 | float3 dir = normalize(forward * ratio + right * u + up * v); 148 | 149 | // ========== Box Intersection (Entry and Exit) ========== 150 | 151 | float2 tMinMax = intersection_AABB(camera, 1.0f / dir); 152 | 153 | bool hit = (tMinMax.x < tMinMax.y);// && (tMinMax.x >= near_clip_plane) && (tMinMax.y <= far_clip_plane) 154 | if (!hit) 155 | { 156 | dst() = 0; 157 | return; 158 | } 159 | 160 | // Maximum of 1000 samples per voxel 161 | float max_dist = tMinMax.y - tMinMax.x; 162 | float deltaT, T = 1, step = max(max_dist / _samples, 0.001f); 163 | float3 curpos; 164 | float4 result = 0, colour; 165 | 166 | for (float dist = tMinMax.x; dist <= tMinMax.y; dist += step) 167 | { 168 | curpos = camera + dir * dist; 169 | colour = Blend(curpos - bbox_min); 170 | deltaT = exp(-density * colour.w * step); 171 | T *= deltaT; 172 | result += (1 - deltaT) * colour * T; 173 | 174 | // End loop if Transmittance is near 0 175 | if (T < 1e-6) 176 | break; 177 | } 178 | 179 | dst() = result; 180 | dst(3) = 1 - T; 181 | } 182 | }; -------------------------------------------------------------------------------- /bin/transform/average.cpp: -------------------------------------------------------------------------------- 1 | kernel VAverage : ImageComputationKernel 2 | { 3 | Image colour; 4 | Image voxels; 5 | Image dst; 6 | 7 | param: 8 | float4 weight; 9 | float3 bbox_min; 10 | float3 bbox_max; 11 | int3 resolution; 12 | int range; 13 | 14 | local: 15 | float4 _weight; 16 | float3 VoxelSizeInv; 17 | int grid_width; 18 | float max_length; 19 | 20 | void init() 21 | { 22 | for (int c = 0; c < 3; c++) 23 | { 24 | VoxelSizeInv[c] = resolution[c] / (bbox_max[c] - bbox_min[c]); 25 | _weight[c] = clamp(weight[c], 0.0f, 1.0f); 26 | } 27 | _weight.w = clamp(weight.w, 0.0f, 1.0f); 28 | grid_width = voxels.bounds.width(); 29 | max_length = range * range; 30 | } 31 | 32 | float4 voxelValue(int3 voxel) 33 | { 34 | int id = (voxel.y * resolution.x + voxel.x) * resolution.z + voxel.z; 35 | int x = id % grid_width; 36 | int y = id / grid_width; 37 | return colour(x, y); 38 | } 39 | 40 | void process(int2 pos) 41 | { 42 | float4 current = voxels(pos.x, pos.y); 43 | 44 | int3 voxel; 45 | for (int c = 0; c < 3; c++) 46 | voxel[c] = int((current[c] - bbox_min[c]) * VoxelSizeInv[c]); 47 | 48 | float4 value, result = 0; 49 | int total = 0; 50 | float length; 51 | 52 | // Maximum value within specified range 53 | for (int i = max(voxel.x - range, 0); i <= min(voxel.x + range, resolution.x - 1); i++) 54 | for (int j = max(voxel.y - range, 0); j <= min(voxel.y + range, resolution.y - 1); j++) 55 | for (int k = max(voxel.z - range, 0); k <= min(voxel.z + range, resolution.z - 1); k++) 56 | { 57 | length = pow(i - voxel.x, 2) + pow(j - voxel.y, 2) + pow(k - voxel.z, 2); 58 | value = voxelValue(int3(i, j, k)) * (length <= max_length); 59 | total += (value.w > 0); 60 | result += value * (value.w > 0); 61 | } 62 | 63 | current = voxelValue(voxel); 64 | if (total < 1) 65 | dst() = current; 66 | else 67 | for (int c = 0; c < 4; c++) 68 | dst(c) = (result[c] / total - current[c]) * _weight[c] + current[c]; 69 | } 70 | }; -------------------------------------------------------------------------------- /bin/transform/erode.cpp: -------------------------------------------------------------------------------- 1 | kernel VErode : ImageComputationKernel 2 | { 3 | Image voxels; 4 | Image dst; 5 | 6 | param: 7 | float3 bbox_min; 8 | float3 bbox_max; 9 | int3 resolution; 10 | float size; 11 | 12 | local: 13 | float3 VoxelSizeInv; 14 | bool negative; 15 | int grid_width; 16 | int range; 17 | float max_length; 18 | 19 | void init() 20 | { 21 | for (int c = 0; c < 3; c++) 22 | VoxelSizeInv[c] = resolution[c] / (bbox_max[c] - bbox_min[c]); 23 | negative = size < 0; 24 | grid_width = voxels.bounds.width(); 25 | range = negative ? floor(size) : ceil(size); 26 | max_length = size * size; 27 | } 28 | 29 | float voxelValue(int3 voxel) 30 | { 31 | int id = (voxel.y * resolution.x + voxel.x) * resolution.z + voxel.z; 32 | int x = id % grid_width; 33 | int y = id / grid_width; 34 | return voxels(x, y)[3]; // Just alpha (density) 35 | } 36 | 37 | void process(int2 pos) 38 | { 39 | float4 current = voxels(pos.x, pos.y); 40 | int3 voxel; 41 | for (int c = 0; c < 3; c++) 42 | voxel[c] = int((current[c] - bbox_min[c]) * VoxelSizeInv[c]); 43 | 44 | float length, new_val = voxelValue(voxel); 45 | if (negative) 46 | { 47 | // Minimum value within specified range 48 | for (int i = max(voxel.x + range, 0); i <= min(voxel.x - range, resolution.x - 1); i++) 49 | for (int j = max(voxel.y + range, 0); j <= min(voxel.y - range, resolution.y - 1); j++) 50 | for (int k = max(voxel.z + range, 0); k <= min(voxel.z - range, resolution.z - 1); k++) 51 | { 52 | length = pow(i - voxel.x, 2) + pow(j - voxel.y, 2) + pow(k - voxel.z, 2); 53 | new_val = min(new_val, voxelValue(int3(i, j, k)) + 10000.0f * (length > max_length)); 54 | } 55 | } 56 | else 57 | { 58 | // Maximum value within specified range 59 | for (int i = max(voxel.x - range, 0); i <= min(voxel.x + range, resolution.x - 1); i++) 60 | for (int j = max(voxel.y - range, 0); j <= min(voxel.y + range, resolution.y - 1); j++) 61 | for (int k = max(voxel.z - range, 0); k <= min(voxel.z + range, resolution.z - 1); k++) 62 | { 63 | length = pow(i - voxel.x, 2) + pow(j - voxel.y, 2) + pow(k - voxel.z, 2); 64 | new_val = max(new_val, voxelValue(int3(i, j, k)) - 10000.0f * (length > max_length)); 65 | } 66 | } 67 | 68 | dst() = current; 69 | dst(3) = new_val; 70 | } 71 | }; -------------------------------------------------------------------------------- /bin/transform/noise.cpp: -------------------------------------------------------------------------------- 1 | // C++11 2 | const uint rand_multiplier = 48271; 3 | const uint rand_increment = 0; 4 | const uint rand_modulus = 2147483647; 5 | 6 | static int lcgRandom( int seed ) 7 | { 8 | return abs( ( seed * rand_multiplier + rand_increment ) % rand_modulus ); 9 | } 10 | 11 | // ===== Interpolation Functions ===== 12 | 13 | static float Smooth (const float &t) 14 | { 15 | // Fifth degree polynomial 16 | return t * t * t * (t * (t * 6.0f - 15.0f) + 10.0f); 17 | } 18 | 19 | static float Lerp (const float &a, const float &b, const float &t) 20 | { 21 | return (b - a) * clamp(t, 0.0f, 1.0f) + a; 22 | } 23 | 24 | 25 | // ===== Noise Function ===== 26 | 27 | static float Perlin3D(float3 point, float frequency) 28 | { 29 | const int hash[512] = { 30 | 151,160,137, 91, 90, 15,131, 13,201, 95, 96, 53,194,233, 7,225, 31 | 140, 36,103, 30, 69,142, 8, 99, 37,240, 21, 10, 23,190, 6,148, 32 | 247,120,234, 75, 0, 26,197, 62, 94,252,219,203,117, 35, 11, 32, 33 | 57,177, 33, 88,237,149, 56, 87,174, 20,125,136,171,168, 68,175, 34 | 74,165, 71,134,139, 48, 27,166, 77,146,158,231, 83,111,229,122, 35 | 60,211,133,230,220,105, 92, 41, 55, 46,245, 40,244,102,143, 54, 36 | 65, 25, 63,161, 1,216, 80, 73,209, 76,132,187,208, 89, 18,169, 37 | 200,196,135,130,116,188,159, 86,164,100,109,198,173,186, 3, 64, 38 | 52,217,226,250,124,123, 5,202, 38,147,118,126,255, 82, 85,212, 39 | 207,206, 59,227, 47, 16, 58, 17,182,189, 28, 42,223,183,170,213, 40 | 119,248,152, 2, 44,154,163, 70,221,153,101,155,167, 43,172, 9, 41 | 129, 22, 39,253, 19, 98,108,110, 79,113,224,232,178,185,112,104, 42 | 218,246, 97,228,251, 34,242,193,238,210,144, 12,191,179,162,241, 43 | 81, 51,145,235,249, 14,239,107, 49,192,214, 31,181,199,106,157, 44 | 184, 84,204,176,115,121, 50, 45,127, 4,150,254,138,236,205, 93, 45 | 222,114, 67, 29, 24, 72,243,141,128,195, 78, 66,215, 61,156,180, 46 | 47 | 48 | 151,160,137, 91, 90, 15,131, 13,201, 95, 96, 53,194,233, 7,225, 49 | 140, 36,103, 30, 69,142, 8, 99, 37,240, 21, 10, 23,190, 6,148, 50 | 247,120,234, 75, 0, 26,197, 62, 94,252,219,203,117, 35, 11, 32, 51 | 57,177, 33, 88,237,149, 56, 87,174, 20,125,136,171,168, 68,175, 52 | 74,165, 71,134,139, 48, 27,166, 77,146,158,231, 83,111,229,122, 53 | 60,211,133,230,220,105, 92, 41, 55, 46,245, 40,244,102,143, 54, 54 | 65, 25, 63,161, 1,216, 80, 73,209, 76,132,187,208, 89, 18,169, 55 | 200,196,135,130,116,188,159, 86,164,100,109,198,173,186, 3, 64, 56 | 52,217,226,250,124,123, 5,202, 38,147,118,126,255, 82, 85,212, 57 | 207,206, 59,227, 47, 16, 58, 17,182,189, 28, 42,223,183,170,213, 58 | 119,248,152, 2, 44,154,163, 70,221,153,101,155,167, 43,172, 9, 59 | 129, 22, 39,253, 19, 98,108,110, 79,113,224,232,178,185,112,104, 60 | 218,246, 97,228,251, 34,242,193,238,210,144, 12,191,179,162,241, 61 | 81, 51,145,235,249, 14,239,107, 49,192,214, 31,181,199,106,157, 62 | 184, 84,204,176,115,121, 50, 45,127, 4,150,254,138,236,205, 93, 63 | 222,114, 67, 29, 24, 72,243,141,128,195, 78, 66,215, 61,156,180 64 | }; 65 | 66 | const float4 gradients3D[16] = { 67 | float4( 1.0f, 1.0f, 0.0f, 0.0f), 68 | float4(-1.0f, 1.0f, 0.0f, 0.0f), 69 | float4( 1.0f, -1.0f, 0.0f, 0.0f), 70 | float4(-1.0f, -1.0f, 0.0f, 0.0f), 71 | float4( 1.0f, 0.0f, 1.0f, 0.0f), 72 | float4(-1.0f, 0.0f, 1.0f, 0.0f), 73 | float4( 1.0f, 0.0f, -1.0f, 0.0f), 74 | float4(-1.0f, 0.0f, -1.0f, 0.0f), 75 | float4( 0.0f, 1.0f, 1.0f, 0.0f), 76 | float4( 0.0f, -1.0f, 1.0f, 0.0f), 77 | float4( 0.0f, 1.0f, -1.0f, 0.0f), 78 | float4( 0.0f, -1.0f, -1.0f, 0.0f), 79 | float4( 1.0f, 1.0f, 0.0f, 0.0f), 80 | float4(-1.0f, 1.0f, 0.0f, 0.0f), 81 | float4( 0.0f, -1.0f, 1.0f, 0.0f), 82 | float4( 0.0f, -1.0f, -1.0f, 0.0f) 83 | }; 84 | 85 | const int hashMask = 255; 86 | const int gradientsMask3D = 15; 87 | 88 | point *= frequency; 89 | int ix0 = floor(point.x); 90 | int iy0 = floor(point.y); 91 | int iz0 = floor(point.z); 92 | float tx0 = point.x - ix0; 93 | float ty0 = point.y - iy0; 94 | float tz0 = point.z - iz0; 95 | float tx1 = tx0 - 1.0f; 96 | float ty1 = ty0 - 1.0f; 97 | float tz1 = tz0 - 1.0f; 98 | ix0 &= hashMask; 99 | iy0 &= hashMask; 100 | iz0 &= hashMask; 101 | int ix1 = ix0 + 1; 102 | int iy1 = iy0 + 1; 103 | int iz1 = iz0 + 1; 104 | 105 | int h0 = hash[ ix0 ]; 106 | int h1 = hash[ ix1 ]; 107 | int h00 = hash[ h0 + iy0 ]; 108 | int h10 = hash[ h1 + iy0 ]; 109 | int h01 = hash[ h0 + iy1 ]; 110 | int h11 = hash[ h1 + iy1 ]; 111 | 112 | // float3 fails for some unknown reason. Add an empty fourth 113 | float4 g000 = gradients3D[ hash[ h00 + iz0 ] & gradientsMask3D ]; 114 | float4 g100 = gradients3D[ hash[ h10 + iz0 ] & gradientsMask3D ]; 115 | float4 g010 = gradients3D[ hash[ h01 + iz0 ] & gradientsMask3D ]; 116 | float4 g110 = gradients3D[ hash[ h11 + iz0 ] & gradientsMask3D ]; 117 | float4 g001 = gradients3D[ hash[ h00 + iz1 ] & gradientsMask3D ]; 118 | float4 g101 = gradients3D[ hash[ h10 + iz1 ] & gradientsMask3D ]; 119 | float4 g011 = gradients3D[ hash[ h01 + iz1 ] & gradientsMask3D ]; 120 | float4 g111 = gradients3D[ hash[ h11 + iz1 ] & gradientsMask3D ]; 121 | 122 | float v000 = dot(g000, float4(tx0, ty0, tz0, 0.0f)); 123 | float v100 = dot(g100, float4(tx1, ty0, tz0, 0.0f)); 124 | float v010 = dot(g010, float4(tx0, ty1, tz0, 0.0f)); 125 | float v110 = dot(g110, float4(tx1, ty1, tz0, 0.0f)); 126 | float v001 = dot(g001, float4(tx0, ty0, tz1, 0.0f)); 127 | float v101 = dot(g101, float4(tx1, ty0, tz1, 0.0f)); 128 | float v011 = dot(g011, float4(tx0, ty1, tz1, 0.0f)); 129 | float v111 = dot(g111, float4(tx1, ty1, tz1, 0.0f)); 130 | 131 | float tx = Smooth(tx0); 132 | float ty = Smooth(ty0); 133 | float tz = Smooth(tz0); 134 | return Lerp( 135 | Lerp(Lerp(v000, v100, tx), Lerp(v010, v110, tx), ty), 136 | Lerp(Lerp(v001, v101, tx), Lerp(v011, v111, tx), ty), 137 | tz);// * 0.5f + 0.5f; 138 | } 139 | 140 | 141 | static float Fractal(float3 point, float frequency, int octaves, float lacunarity, float persistence) 142 | { 143 | 144 | float sum = 0; 145 | sum = Perlin3D(point, frequency); 146 | float amplitude = 1.0f; 147 | float range = 1.0f; 148 | for (int o = 1; o < octaves; o++) { 149 | frequency *= lacunarity; 150 | amplitude *= persistence; 151 | range += amplitude; 152 | sum += Perlin3D(point, frequency) * amplitude; 153 | } 154 | return sum / range; 155 | } 156 | 157 | 158 | kernel VFNoise : ImageComputationKernel 159 | { 160 | Image voxels; 161 | Image dst; 162 | 163 | param: 164 | int seed; 165 | float size; 166 | int octaves; 167 | float lacunarity; 168 | float persistence; 169 | float4x4 M; 170 | 171 | local: 172 | float3 seed_offset; 173 | float frequency; 174 | float4x4 M_inv; 175 | 176 | void define() 177 | { 178 | defineParam(size, "Size", 30.0f); 179 | defineParam(octaves, "Octaves", 4); 180 | defineParam(lacunarity, "Lacunarity", 2.0f); 181 | defineParam(persistence, "Persistence", 0.5f); 182 | } 183 | 184 | void init() 185 | { 186 | int random = seed; 187 | for (int c = 0; c < 3; c++) 188 | { 189 | random = lcgRandom(random); 190 | seed_offset[c] = (random / float(rand_modulus)) * 10000; 191 | } 192 | frequency = 1.0f / size; 193 | M_inv = M.invert(); 194 | } 195 | 196 | 197 | float3 multVectMatrix(float4 vec, float4x4 M) 198 | { 199 | float3 out = float3( 200 | vec.x * M[0][0] + vec.y * M[0][1] + vec.z * M[0][2] + M[0][3], 201 | vec.x * M[1][0] + vec.y * M[1][1] + vec.z * M[1][2] + M[1][3], 202 | vec.x * M[2][0] + vec.y * M[2][1] + vec.z * M[2][2] + M[2][3] 203 | ); 204 | 205 | return out; 206 | } 207 | 208 | 209 | void process() 210 | { 211 | float4 voxel = voxels(); 212 | float3 point = multVectMatrix(voxel, M_inv); 213 | voxel.w = Fractal(point + seed_offset, frequency, octaves, lacunarity, persistence); 214 | dst() = voxel; 215 | } 216 | 217 | }; -------------------------------------------------------------------------------- /bin/transform/transform.cpp: -------------------------------------------------------------------------------- 1 | kernel VTransform : ImageComputationKernel 2 | { 3 | Image voxels; 4 | Image dst; 5 | 6 | param: 7 | float4x4 M; 8 | 9 | float4 multVectMatrix(float4 vec, float4x4 M) 10 | { 11 | float4 out = float4( 12 | vec.x * M[0][0] + vec.y * M[0][1] + vec.z * M[0][2] + M[0][3], 13 | vec.x * M[1][0] + vec.y * M[1][1] + vec.z * M[1][2] + M[1][3], 14 | vec.x * M[2][0] + vec.y * M[2][1] + vec.z * M[2][2] + M[2][3], 15 | vec.w 16 | ); 17 | 18 | return out; 19 | } 20 | 21 | void process() 22 | { 23 | float4 position = voxels(); 24 | dst() = multVectMatrix(position, M); 25 | } 26 | }; -------------------------------------------------------------------------------- /bin/transform/transform_data.cpp: -------------------------------------------------------------------------------- 1 | kernel VTransformData : ImageComputationKernel 2 | { 3 | Image positions; 4 | Image voxels; 5 | Image dst; 6 | 7 | param: 8 | float3 bbox_min; 9 | float3 bbox_max; 10 | int3 resolution; 11 | float4x4 transform_M; 12 | 13 | local: 14 | float3 VoxelSizeInv; 15 | int grid_width; 16 | float4x4 transform_M_Inv; 17 | 18 | void init() 19 | { 20 | for (int c = 0; c < 3; c++) 21 | VoxelSizeInv[c] = resolution[c] / (bbox_max[c] - bbox_min[c]); 22 | grid_width = voxels.bounds.width(); 23 | transform_M_Inv = transform_M.invert(); 24 | // To transform in world space, invert the world_matrix, and multiply ... after? 25 | // transform_M_Inv * world_M_Inv; 26 | } 27 | 28 | float3 multVectMatrix(float4 vec, float4x4 M) 29 | { 30 | float3 out = float3( 31 | vec.x * M[0][0] + vec.y * M[0][1] + vec.z * M[0][2] + M[0][3], 32 | vec.x * M[1][0] + vec.y * M[1][1] + vec.z * M[1][2] + M[1][3], 33 | vec.x * M[2][0] + vec.y * M[2][1] + vec.z * M[2][2] + M[2][3] 34 | ); 35 | 36 | return out; 37 | } 38 | 39 | float4 voxelValue(int3 voxel) 40 | { 41 | // Return Empty for values outside of grid 42 | if (voxel.x < 0 || resolution.x <= voxel.x || 43 | voxel.y < 0 || resolution.y <= voxel.y || 44 | voxel.z < 0 || resolution.z <= voxel.z ) 45 | return 0; 46 | 47 | int id = (voxel.y * resolution.x + voxel.x) * resolution.z + voxel.z; 48 | int x = id % grid_width; 49 | int y = id / grid_width; 50 | return voxels(x, y); 51 | } 52 | 53 | float4 Blend(float3 curpos) 54 | { 55 | float3 weight, voxel_space; 56 | int3 base_voxel, offset; 57 | // Lower Bound of 8 adjacent voxels 58 | for (int c = 0; c < 3; c++) 59 | { 60 | voxel_space[c] = curpos[c] * VoxelSizeInv[c]; 61 | base_voxel[c] = int(floor(voxel_space[c] - 0.5f)); 62 | } 63 | 64 | float4 result = 0; 65 | for (int i = 0; i < 8; i++) 66 | { 67 | // Weighted distance on each axis for each adjacent voxel 68 | offset = int3(i / 4, (i / 2) % 2, i % 2); 69 | weight.x = 1 - fabs(offset.x - (voxel_space.x - (base_voxel.x + 0.5f))); 70 | weight.y = 1 - fabs(offset.y - (voxel_space.y - (base_voxel.y + 0.5f))); 71 | weight.z = 1 - fabs(offset.z - (voxel_space.z - (base_voxel.z + 0.5f))); 72 | 73 | result += voxelValue(base_voxel + offset) * weight.x * weight.y * weight.z; 74 | } 75 | 76 | return result; 77 | } 78 | 79 | void process() 80 | { 81 | float4 position = positions(); 82 | float3 target = multVectMatrix(position, transform_M_Inv); 83 | dst() = Blend(target - bbox_min); 84 | } 85 | }; -------------------------------------------------------------------------------- /plugin/gizmos/V_Average.gizmo: -------------------------------------------------------------------------------- 1 | #! C:/Program Files/Nuke9.0v1/nuke-9.0.1.dll -nx 2 | version 9.0 v1 3 | Gizmo { 4 | knobChanged "\nif nuke.thisKnob().name() == \"weight_channels\":\n knob = nuke.thisNode().knob(\"weight\")\n value = nuke.thisKnob().getValue()\n if value < 3:\n knob.setFlag(0x00040000)\n else:\n knob.clearFlag(0x00040000)\n" 5 | tile_color 0xc17939ff 6 | addUserKnob {20 VAverage} 7 | addUserKnob {3 range l Range t "The radius of the area to blend.\nWill only average voxels with positive density."} 8 | addUserKnob {4 weight_channels l " Channels" t "Channels to be blended together. Custom can be used to set individual weights per channel" M {rgb rgba alpha Custom ""}} 9 | addUserKnob {19 weight l Weight +HIDDEN} 10 | weight {0.5 0.5 0.5 0.5} 11 | addUserKnob {6 weight_panelDropped l "panel dropped state" -STARTLINE +HIDDEN} 12 | addUserKnob {20 graphics l GPU} 13 | addUserKnob {41 "Local GPU: " T BlinkScript1.gpuName} 14 | addUserKnob {41 "Use GPU if Available" T BlinkScript1.useGPUIfAvailable} 15 | addUserKnob {41 maxGPUMemory l "Percentage of GPU memory to use" T BlinkScript1.maxGPUMemory} 16 | addUserKnob {41 maxTileLines l "Percentage of image height per tile" T BlinkScript1.maxTileLines} 17 | } 18 | Input { 19 | inputs 0 20 | name Input 21 | xpos 255 22 | ypos 53 23 | } 24 | Dot { 25 | name Dot13 26 | note_font_size 20 27 | xpos 289 28 | ypos 122 29 | } 30 | set N3898800 [stack 0] 31 | add_layer {voxels voxels.x voxels.y voxels.z voxels.density} 32 | Shuffle { 33 | in voxels 34 | in2 rgba 35 | alpha alpha2 36 | name Shuffle2 37 | label " \[value in]" 38 | xpos 426 39 | ypos 82 40 | postage_stamp true 41 | } 42 | Dot { 43 | name Dot14 44 | note_font_size 20 45 | xpos 460 46 | ypos 243 47 | } 48 | push $N3898800 49 | BlinkScript { 50 | inputs 2 51 | ProgramGroup 1 52 | KernelDescription "1 \"VAverage\" iterate pixelWise 2d8525d7ab50d97e24399e054560862c62cacd8c388d3e33f622e673acd378f6 3 \"colour\" Read Random \"voxels\" Read Random \"dst\" Write Point 5 \"weight\" Float 4 AAAAAAAAAAAAAAAAAAAAAA== \"bbox_min\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"bbox_max\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"resolution\" Int 3 AAAAAAAAAAAAAAAAAAAAAA== \"range\" Int 1 AAAAAA==" 53 | EncodedSource "1 1898 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" 54 | rebuild "" 55 | VAverage_weight {{"weight_channels < 2 ? 1 : (weight_channels == 2 ? 0 : weight)"} {"weight_channels < 2 ? 1 : (weight_channels == 2 ? 0 : weight)"} {"weight_channels < 2 ? 1 : (weight_channels == 2 ? 0 : weight)"} {"weight_channels == 0 ? 0 : (weight_channels == 1 || weight_channels == 2 ? 1 : weight)"}} 56 | VAverage_bbox_min {{"\[lindex \[metadata bbox] 0]"} {"\[lindex \[metadata bbox] 1]"} {"\[lindex \[metadata bbox] 2]"}} 57 | VAverage_bbox_max {{"\[lindex \[metadata bbox] 3]"} {"\[lindex \[metadata bbox] 4]"} {"\[lindex \[metadata bbox] 5]"}} 58 | VAverage_resolution {{"\[lindex \[metadata resolution] 0]"} {"\[lindex \[metadata resolution] 1]"} {"\[lindex \[metadata resolution] 2]"}} 59 | VAverage_range {{parent.range}} 60 | protectKernelWhenPublishing true 61 | name BlinkScript1 62 | selected true 63 | xpos 255 64 | ypos 233 65 | } 66 | Output { 67 | name Output 68 | xpos 255 69 | ypos 333 70 | } 71 | end_group 72 | -------------------------------------------------------------------------------- /plugin/gizmos/V_DirLight.gizmo: -------------------------------------------------------------------------------- 1 | #! C:/Program Files/Nuke9.0v1/nuke-9.0.1.dll -nx 2 | version 9.0 v1 3 | Gizmo { 4 | inputs 2 5 | tile_color 0xc19139ff 6 | addUserKnob {20 VDirLight} 7 | addUserKnob {41 value l "Light Colour" T LIGHT_COL.value} 8 | addUserKnob {41 value_1 l "Scatter Colour" T SCATTER_COL.value} 9 | addUserKnob {7 intensity l Intensity} 10 | intensity 1 11 | addUserKnob {7 absorption l Absorption t "Amount of light absorbed by each voxel."} 12 | absorption 0.5 13 | addUserKnob {3 samples l Samples t "How many samples to take per pixel. higher values will give more accurate results at the cost of speed."} 14 | samples 64 15 | addUserKnob {26 "" +STARTLINE} 16 | addUserKnob {41 operation T Merge.operation} 17 | addUserKnob {41 mix T Merge.mix} 18 | addUserKnob {20 graphics l GPU} 19 | addUserKnob {41 "Local GPU: " T BlinkScript1.gpuName} 20 | addUserKnob {41 "Use GPU if Available" T BlinkScript1.useGPUIfAvailable} 21 | addUserKnob {41 maxGPUMemory l "Percentage of GPU memory to use" T BlinkScript1.maxGPUMemory} 22 | addUserKnob {41 maxTileLines l "Percentage of image height per tile" T BlinkScript1.maxTileLines} 23 | } 24 | Input { 25 | inputs 0 26 | name Inputlight 27 | label 1 28 | xpos 570 29 | ypos 176 30 | number 1 31 | } 32 | Input { 33 | inputs 0 34 | name Inputvoxels 35 | label 0 36 | xpos 448 37 | ypos 176 38 | } 39 | Dot { 40 | name Dot1 41 | note_font_size 20 42 | xpos 482 43 | ypos 254 44 | } 45 | set N41001c00 [stack 0] 46 | Clamp { 47 | channels alpha 48 | maximum 1.#INF 49 | name Clamp 50 | xpos 448 51 | ypos 282 52 | } 53 | add_layer {voxels voxels.x voxels.y voxels.z voxels.density} 54 | Shuffle { 55 | in2 voxels 56 | red red2 57 | green green2 58 | blue blue2 59 | name Shuffle1 60 | label " \[value in]" 61 | xpos 448 62 | ypos 324 63 | postage_stamp true 64 | } 65 | BlinkScript { 66 | ProgramGroup 1 67 | KernelDescription "1 \"VDirLight\" iterate pixelWise d75d006f4732af7c2f465d8d0e9ee7125e9b1fc7451f4e2291592dbfcbbb3229 2 \"voxels\" Read Random \"dst\" Write Point 8 \"bbox_min\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"bbox_max\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"resolution\" Int 3 AAAAAAAAAAAAAAAAAAAAAA== \"dir\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"intensity\" Float 1 AACAPw== \"absorption\" Float 1 AAAAPw== \"samples\" Int 1 MgAAAA== \"transform_M\" Float 16 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" 68 | EncodedSource "1 3901 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" 69 | rebuild "" 70 | VDirLight_bbox_min {{"\[lindex \[metadata bbox] 0]"} {"\[lindex \[metadata bbox] 1]"} {"\[lindex \[metadata bbox] 2]"}} 71 | VDirLight_bbox_max {{"\[lindex \[metadata bbox] 3]"} {"\[lindex \[metadata bbox] 4]"} {"\[lindex \[metadata bbox] 5]"}} 72 | VDirLight_resolution {{"\[lindex \[metadata resolution] 0]"} {"\[lindex \[metadata resolution] 1]"} {"\[lindex \[metadata resolution] 2]"}} 73 | VDirLight_dir {{-input1.world_matrix.2} {-input1.world_matrix.6} {-input1.world_matrix.10}} 74 | VDirLight_intensity {{parent.intensity}} 75 | VDirLight_absorption {{parent.absorption}} 76 | VDirLight_samples {{parent.samples}} 77 | VDirLight_transform_M { 78 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 3]"}} 79 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 3]"}} 80 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 3]"}} 81 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 3]"}} 82 | } 83 | protectKernelWhenPublishing true 84 | name BlinkScript1 85 | selected true 86 | xpos 448 87 | ypos 422 88 | } 89 | Dot { 90 | name Dot11 91 | xpos 482 92 | ypos 468 93 | } 94 | set N41000c00 [stack 0] 95 | Dot { 96 | name Dot9 97 | note_font_size 20 98 | xpos 372 99 | ypos 468 100 | } 101 | Multiply { 102 | value {{1/intensity}} 103 | name Multiply2 104 | xpos 338 105 | ypos 510 106 | } 107 | Dot { 108 | name Dot7 109 | note_font_size 20 110 | xpos 372 111 | ypos 586 112 | } 113 | set N41000000 [stack 0] 114 | push $N41001c00 115 | Dot { 116 | name Dot3 117 | note_font_size 20 118 | xpos 152 119 | ypos 254 120 | } 121 | Multiply { 122 | channels rgb 123 | value 0 124 | name Multiply1 125 | xpos 118 126 | ypos 410 127 | } 128 | Dot { 129 | name Dot5 130 | note_font_size 20 131 | xpos 152 132 | ypos 468 133 | } 134 | set N41031400 [stack 0] 135 | Add { 136 | value {1 0.915 0.775 1} 137 | value_panelDropped true 138 | name LIGHT_COL 139 | xpos 118 140 | ypos 511 141 | } 142 | Copy { 143 | inputs 2 144 | from0 rgba.alpha 145 | to0 rgba.alpha 146 | name Copy2 147 | xpos 118 148 | ypos 576 149 | } 150 | Dot { 151 | name Dot8 152 | note_font_size 20 153 | xpos 152 154 | ypos 717 155 | } 156 | push $N41000000 157 | Invert { 158 | channels alpha 159 | name Invert1 160 | xpos 338 161 | ypos 638 162 | } 163 | push $N41031400 164 | Dot { 165 | name Dot6 166 | note_font_size 20 167 | xpos 262 168 | ypos 468 169 | } 170 | Add { 171 | value {0.165 0.32 0.535 0} 172 | value_panelDropped true 173 | name SCATTER_COL 174 | xpos 228 175 | ypos 511 176 | } 177 | Copy { 178 | inputs 2 179 | from0 rgba.alpha 180 | to0 rgba.alpha 181 | name Copy1 182 | xpos 228 183 | ypos 638 184 | } 185 | Merge2 { 186 | inputs 2 187 | operation xor 188 | name Merge1 189 | xpos 228 190 | ypos 713 191 | } 192 | Dot { 193 | name Dot10 194 | note_font_size 20 195 | xpos 262 196 | ypos 781 197 | } 198 | push $N41000c00 199 | Merge2 { 200 | inputs 2 201 | operation multiply 202 | name Merge2 203 | xpos 448 204 | ypos 777 205 | } 206 | Dot { 207 | name Dot2 208 | note_font_size 20 209 | xpos 482 210 | ypos 918 211 | } 212 | push $N41001c00 213 | Dot { 214 | name Dot4 215 | note_font_size 20 216 | xpos 604 217 | ypos 254 218 | } 219 | Merge2 { 220 | inputs 2 221 | operation plus 222 | Achannels {rgba.red rgba.green rgba.blue -rgba.alpha} 223 | name Merge 224 | xpos 570 225 | ypos 914 226 | } 227 | Output { 228 | name Output 229 | xpos 570 230 | ypos 973 231 | } 232 | end_group 233 | -------------------------------------------------------------------------------- /plugin/gizmos/V_EnvLight.gizmo: -------------------------------------------------------------------------------- 1 | #! C:/Program Files/Nuke9.0v1/nuke-9.0.1.dll -nx 2 | version 9.0 v1 3 | Gizmo { 4 | inputs 2 5 | tile_color 0xc19139ff 6 | addUserKnob {20 VEnvLight} 7 | addUserKnob {6 luminance l "Luminance Based" t "Uses the luminance of the HDRI to light the image." +STARTLINE} 8 | addUserKnob {7 rotate l Rotate t "Rotates the spherical mapping" R 0 360} 9 | addUserKnob {7 intensity l Intensity} 10 | intensity 1 11 | addUserKnob {7 absorption l Absorption t "Amount of light absorbed by each voxel."} 12 | absorption 0.7 13 | addUserKnob {3 range l Range t "Radius of area to blend"} 14 | range 2 15 | addUserKnob {3 samples l Samples t "How many samples to take per voxel. Higher values will give more accurate results at the cost of speed."} 16 | samples 64 17 | addUserKnob {26 "" +STARTLINE} 18 | addUserKnob {41 operation T Merge.operation} 19 | addUserKnob {41 mix T Merge.mix} 20 | addUserKnob {20 graphics l GPU} 21 | addUserKnob {41 "Local GPU: " T BlinkScript1.gpuName} 22 | addUserKnob {41 "Use GPU if Available" T BlinkScript1.useGPUIfAvailable} 23 | addUserKnob {41 maxGPUMemory l "Percentage of GPU memory to use" T BlinkScript1.maxGPUMemory} 24 | addUserKnob {41 maxTileLines l "Percentage of image height per tile" T BlinkScript1.maxTileLines} 25 | } 26 | Input { 27 | inputs 0 28 | name Inputenv 29 | label 0 30 | xpos 1007 31 | ypos -84 32 | number 1 33 | } 34 | Input { 35 | inputs 0 36 | name Inputvoxels 37 | label 0 38 | xpos 1204 39 | ypos -348 40 | } 41 | Dot { 42 | name Dot1 43 | note_font_size 20 44 | xpos 1238 45 | ypos -288 46 | } 47 | set N4d643000 [stack 0] 48 | Clamp { 49 | channels alpha 50 | maximum 1.#INF 51 | name Clamp 52 | xpos 1204 53 | ypos -244 54 | } 55 | add_layer {voxels voxels.x voxels.y voxels.z voxels.density} 56 | Shuffle { 57 | in2 voxels 58 | red red2 59 | green green2 60 | blue blue2 61 | name Shuffle1 62 | label " \[value in]" 63 | xpos 1204 64 | ypos -198 65 | postage_stamp true 66 | } 67 | BlinkScript { 68 | inputs 2 69 | ProgramGroup 1 70 | KernelDescription "1 \"VEnvLight\" iterate pixelWise c11143e3588aa0102d052d41d74a7f94f65593a51b5fcc80a5769d05a7c6ae54 3 \"voxels\" Read Random \"environment\" Read Random \"dst\" Write Point 9 \"bbox_min\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"bbox_max\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"resolution\" Int 3 AAAAAAAAAAAAAAAAAAAAAA== \"luminance_on\" Bool 1 AA== \"rotate\" Float 1 AAAAAA== \"intensity\" Float 1 AACAPw== \"absorption\" Float 1 AAAAPw== \"samples\" Int 1 MgAAAA== \"transform_M\" Float 16 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" 71 | EncodedSource "1 5270 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" 72 | rebuild "" 73 | VEnvLight_bbox_min {{"\[lindex \[metadata bbox] 0]"} {"\[lindex \[metadata bbox] 1]"} {"\[lindex \[metadata bbox] 2]"}} 74 | VEnvLight_bbox_max {{"\[lindex \[metadata bbox] 3]"} {"\[lindex \[metadata bbox] 4]"} {"\[lindex \[metadata bbox] 5]"}} 75 | VEnvLight_resolution {{"\[lindex \[metadata resolution] 0]"} {"\[lindex \[metadata resolution] 1]"} {"\[lindex \[metadata resolution] 2]"}} 76 | VEnvLight_luminance_on {{parent.luminance}} 77 | VEnvLight_rotate {{parent.rotate}} 78 | VEnvLight_intensity {{intensity}} 79 | VEnvLight_absorption {{absorption}} 80 | VEnvLight_samples {{samples}} 81 | VEnvLight_transform_M { 82 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 3]"}} 83 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 3]"}} 84 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 3]"}} 85 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 3]"}} 86 | } 87 | protectKernelWhenPublishing true 88 | name BlinkScript1 89 | selected true 90 | xpos 1204 91 | ypos -84 92 | } 93 | Crop { 94 | box {0 0 {width} {height}} 95 | reformat true 96 | crop false 97 | name Crop 98 | xpos 1204 99 | ypos -46 100 | } 101 | Group { 102 | name V_Average1 103 | knobChanged "\nif nuke.thisKnob().name() == \"weight_channels\":\n knob = nuke.thisNode().knob(\"weight\")\n value = nuke.thisKnob().getValue()\n if value < 3:\n knob.setFlag(0x00040000)\n else:\n knob.clearFlag(0x00040000)\n" 104 | tile_color 0xc17a39ff 105 | xpos 1204 106 | ypos -20 107 | addUserKnob {20 vaverage l "Voxel Average"} 108 | addUserKnob {3 range l Range t "The radius of the area to blend.\nWill only average voxels with positive density."} 109 | range {{parent.range}} 110 | addUserKnob {4 weight_channels l " Channels" t "Channels to be blended together. Custom can be used to set individual weights per channel" M {rgb rgba alpha custom "" "" "" ""}} 111 | addUserKnob {19 weight l Weight t "Individual weights (0 to 1) to blend per channel" +HIDDEN} 112 | weight {0.5 0.5 0.5 0} 113 | addUserKnob {6 weight_panelDropped l "panel dropped state" -STARTLINE +HIDDEN} 114 | } 115 | Input { 116 | inputs 0 117 | name Input 118 | xpos 362 119 | ypos -626 120 | } 121 | Dot { 122 | name Dot13 123 | note_font_size 20 124 | xpos 396 125 | ypos -557 126 | } 127 | set N4d412400 [stack 0] 128 | Shuffle { 129 | in voxels 130 | in2 rgba 131 | alpha alpha2 132 | name Shuffle2 133 | label " \[value in]" 134 | xpos 533 135 | ypos -597 136 | postage_stamp true 137 | } 138 | Dot { 139 | name Dot14 140 | note_font_size 20 141 | xpos 567 142 | ypos -436 143 | } 144 | push $N4d412400 145 | BlinkScript { 146 | inputs 2 147 | kernelSourceFile C:/Users/mshaw/Documents/Tests/Blink/Cloud_Gen_03/Scripts/WORKING/VoxelAverage_transform_002.cpp 148 | ProgramGroup 1 149 | KernelDescription "1 \"VoxelAverage\" iterate pixelWise 6c113d5dedc64ba6e56941b86052ff305117ae1399471bb6912c3cbe74066441 3 \"colour\" Read Random \"voxels\" Read Random \"dst\" Write Point 5 \"weight\" Float 4 AAAAAAAAAAAAAAAAAAAAAA== \"bbox_min\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"bbox_max\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"resolution\" Int 3 AAAAAAAAAAAAAAAAAAAAAA== \"range\" Int 1 AAAAAA==" 150 | kernelSource "kernel VoxelAverage : ImageComputationKernel\n\{\n Image colour;\n Image voxels;\n Image dst;\n\n param:\n float4 weight;\n float3 bbox_min;\n float3 bbox_max;\n int3 resolution;\n int range;\n\n local:\n float4 _weight;\n float3 VoxelSizeInv;\n int grid_width;\n float max_length;\n\n void init()\n \{\n for (int c = 0; c < 3; c++)\n \{\n VoxelSizeInv\[c] = resolution\[c] / (bbox_max\[c] - bbox_min\[c]);\n _weight\[c] = clamp(weight\[c], 0.0f, 1.0f);\n \}\n _weight.w = clamp(weight.w, 0.0f, 1.0f);\n grid_width = voxels.bounds.width();\n \}\n\n float4 voxelValue(int3 voxel)\n \{\n int id = (voxel.y * resolution.x + voxel.x) * resolution.z + voxel.z;\n int x = id % grid_width;\n int y = id / grid_width;\n return colour(x, y);\n \}\n\n void process(int2 pos)\n \{\n float4 current = voxels(pos.x, pos.y);\n\n int3 voxel;\n for (int c = 0; c < 3; c++)\n voxel\[c] = int((current\[c] - bbox_min\[c]) * VoxelSizeInv\[c]);\n\n float4 value, result = 0;\n int total = 0;\n\n // Maximum value within specified range\n for (int i = max(voxel.x - range, 0); i <= min(voxel.x + range, resolution.x - 1); i++)\n for (int j = max(voxel.y - range, 0); j <= min(voxel.y + range, resolution.y - 1); j++)\n for (int k = max(voxel.z - range, 0); k <= min(voxel.z + range, resolution.z - 1); k++)\n \{\n value = voxelValue(int3(i, j, k));\n total += (value.w > 0);\n result += value * (value.w > 0);\n \}\n \n current = voxelValue(voxel);\n if (total < 1)\n dst() = current;\n else\n for (int c = 0; c < 4; c++)\n dst(c) = (result\[c] / total - current\[c]) * _weight\[c] + current\[c];\n \}\n\};" 151 | rebuild "" 152 | VoxelAverage_weight {{"weight_channels < 2 ? 1 : (weight_channels == 2 ? 0 : weight)"} {"weight_channels < 2 ? 1 : (weight_channels == 2 ? 0 : weight)"} {"weight_channels < 2 ? 1 : (weight_channels == 2 ? 0 : weight)"} {"weight_channels == 0 ? 0 : (weight_channels == 1 || weight_channels == 2 ? 1 : weight)"}} 153 | VoxelAverage_bbox_min {{"\[lindex \[metadata bbox] 0]"} {"\[lindex \[metadata bbox] 1]"} {"\[lindex \[metadata bbox] 2]"}} 154 | VoxelAverage_bbox_max {{"\[lindex \[metadata bbox] 3]"} {"\[lindex \[metadata bbox] 4]"} {"\[lindex \[metadata bbox] 5]"}} 155 | VoxelAverage_resolution {{"\[lindex \[metadata resolution] 0]"} {"\[lindex \[metadata resolution] 1]"} {"\[lindex \[metadata resolution] 2]"}} 156 | VoxelAverage_range {{parent.range}} 157 | name BlinkScript3 158 | selected true 159 | xpos 362 160 | ypos -446 161 | } 162 | Output { 163 | name Output1 164 | xpos 362 165 | ypos -346 166 | } 167 | end_group 168 | Dot { 169 | name Dot3 170 | note_font_size 20 171 | xpos 1238 172 | ypos 51 173 | } 174 | push $N4d643000 175 | Dot { 176 | name Dot2 177 | note_font_size 20 178 | xpos 1354 179 | ypos -288 180 | } 181 | Merge2 { 182 | inputs 2 183 | operation plus 184 | Achannels {rgba.red rgba.green rgba.blue -rgba.alpha} 185 | name Merge 186 | xpos 1320 187 | ypos 47 188 | } 189 | Output { 190 | name Output 191 | xpos 1320 192 | ypos 108 193 | } 194 | end_group 195 | -------------------------------------------------------------------------------- /plugin/gizmos/V_Erode.gizmo: -------------------------------------------------------------------------------- 1 | #! C:/Program Files/Nuke9.0v1/nuke-9.0.1.dll -nx 2 | version 9.0 v1 3 | Gizmo { 4 | tile_color 0xc17939ff 5 | addUserKnob {20 VoxelErode} 6 | addUserKnob {7 size l Size R -5 5} 7 | addUserKnob {41 mix T Copy1.mix} 8 | addUserKnob {20 graphics l GPU} 9 | addUserKnob {41 "Local GPU: " T BlinkScript1.gpuName} 10 | addUserKnob {41 "Use GPU if Available" T BlinkScript1.useGPUIfAvailable} 11 | addUserKnob {41 maxGPUMemory l "Percentage of GPU memory to use" T BlinkScript1.maxGPUMemory} 12 | addUserKnob {41 maxTileLines l "Percentage of image height per tile" T BlinkScript1.maxTileLines} 13 | } 14 | Input { 15 | inputs 0 16 | name Input 17 | xpos 77 18 | ypos -218 19 | } 20 | Dot { 21 | name Dot1 22 | note_font_size 20 23 | xpos 111 24 | ypos -183 25 | } 26 | set N322ba800 [stack 0] 27 | add_layer {voxels voxels.x voxels.y voxels.z voxels.density} 28 | Shuffle { 29 | in2 voxels 30 | red red2 31 | green green2 32 | blue blue2 33 | name Shuffle1 34 | label " \[value in]" 35 | xpos 77 36 | ypos -146 37 | postage_stamp true 38 | } 39 | BlinkScript { 40 | ProgramGroup 1 41 | KernelDescription "1 \"VoxelErode\" iterate pixelWise 5878457dc41f59c360d549253627353cc2ddb7d25a5fa537658af703d79196b4 2 \"voxels\" Read Random \"dst\" Write Point 4 \"bbox_min\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"bbox_max\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"resolution\" Int 3 AAAAAAAAAAAAAAAAAAAAAA== \"size\" Float 1 AAAAAA==" 42 | EncodedSource "1 2230 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" 43 | rebuild "" 44 | VoxelErode_bbox_min {{"\[lindex \[metadata bbox] 0]"} {"\[lindex \[metadata bbox] 1]"} {"\[lindex \[metadata bbox] 2]"}} 45 | VoxelErode_bbox_max {{"\[lindex \[metadata bbox] 3]"} {"\[lindex \[metadata bbox] 4]"} {"\[lindex \[metadata bbox] 5]"}} 46 | VoxelErode_resolution {{"\[lindex \[metadata resolution] 0]"} {"\[lindex \[metadata resolution] 1]"} {"\[lindex \[metadata resolution] 2]"}} 47 | VoxelErode_size {{parent.size}} 48 | protectKernelWhenPublishing true 49 | name BlinkScript1 50 | selected true 51 | xpos 77 52 | ypos -35 53 | } 54 | Dot { 55 | name Dot2 56 | note_font_size 20 57 | xpos 111 58 | ypos 28 59 | } 60 | push $N322ba800 61 | Dot { 62 | name Dot3 63 | note_font_size 20 64 | xpos 213 65 | ypos -183 66 | } 67 | Copy { 68 | inputs 2 69 | from0 rgba.alpha 70 | to0 rgba.alpha 71 | name Copy1 72 | xpos 179 73 | ypos 18 74 | } 75 | Output { 76 | name Output 77 | xpos 179 78 | ypos 87 79 | } 80 | end_group 81 | -------------------------------------------------------------------------------- /plugin/gizmos/V_Grid.gizmo: -------------------------------------------------------------------------------- 1 | #! C:/Program Files/Nuke9.0v1/nuke-9.0.1.dll -nx 2 | version 9.0 v1 3 | Gizmo { 4 | inputs 0 5 | tile_color 0xc44b11ff 6 | addUserKnob {20 VGrid} 7 | addUserKnob {31 voxel_bbox l "Bounding Box"} 8 | voxel_bbox {-0.5 -0.5 -0.5 0.5 0.5 0.5} 9 | addUserKnob {18 gridres l Resolution R 1 256} 10 | gridres 64 11 | addUserKnob {6 gridres_panelDropped l "panel dropped state" -STARTLINE +HIDDEN} 12 | addUserKnob {6 uniform -STARTLINE} 13 | uniform true 14 | addUserKnob {41 color l Color T Constant1.color} 15 | addUserKnob {20 graphics l GPU} 16 | addUserKnob {41 "Local GPU: " T BlinkScript1.gpuName} 17 | addUserKnob {41 "Use GPU if Available" T BlinkScript1.useGPUIfAvailable} 18 | addUserKnob {41 maxGPUMemory l "Percentage of GPU memory to use" T BlinkScript1.maxGPUMemory} 19 | addUserKnob {41 maxTileLines l "Percentage of image height per tile" T BlinkScript1.maxTileLines} 20 | } 21 | Axis2 { 22 | inputs 0 23 | display off 24 | selectable false 25 | name vTransformMatrix 26 | xpos -22 27 | ypos 124 28 | addUserKnob {20 "Ppos Locator"} 29 | addUserKnob {18 pointPosition l "Point Position"} 30 | pointPosition {0 0 0} 31 | addUserKnob {6 pointPosition_panelDropped l "panel dropped state" -STARTLINE +HIDDEN} 32 | } 33 | Constant { 34 | inputs 0 35 | name Constant1 36 | xpos 159 37 | ypos -138 38 | } 39 | Reformat { 40 | type "to box" 41 | box_width {{ceil(sqrt(CONTROL.total))}} 42 | box_height {{ceil(sqrt(CONTROL.total))}} 43 | box_fixed true 44 | resize fill 45 | center false 46 | name Reformat1 47 | xpos 159 48 | ypos -29 49 | } 50 | set N32396400 [stack 0] 51 | Dot { 52 | name Dot2 53 | note_font_size 20 54 | xpos 85 55 | ypos -25 56 | } 57 | BlinkScript { 58 | ProgramGroup 1 59 | KernelDescription "1 \"VGrid\" iterate pixelWise 3b140e8cbfda428ac95853bd9e9761e44d4c51aad2633cdb8042495cb9b9755b 2 \"format\" Read Point \"dst\" Write Point 4 \"bbox_min\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"bbox_max\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"resolution\" Int 3 AAAAAAAAAAAAAAAAAAAAAA== \"total\" Int 1 AAAAAA==" 60 | EncodedSource "1 754 LuM0b1tYHKw4u2GX42C1A37F0jmNLoqwBwUnaVvdBuW1oD0JBBYUZKCFZ0r+fLFTuzEYGraNh1znI82yA8BP74tQLs97hhwZHy2FsGqNiLZj2dgQnOBniPMQ7z2pYIvY7EMjbzB2D9C747vRpM9DTfdQPyoLZFPF6fXfzS28ino4eOTVeYkVlEkQfkZtjbpPw6vMH6DFskW0VbwBpFjuXmM0LZQy+WU4YnyjbWLVG6TQN0oQnGX9PQRnX0Ekb2qLLhlrvZSYTjxZivrycjdvG8qHyfbyNEG+yI26hSTiA+O1PixzmgGQS/zm0JHZ4ShSD4NPvG2kNaFdzkau8zNZi+vlk7H5EOALQ6Y9VDmXZMDKVGFO6k/wbzFnCqzFpIL/DsCPADYfuLFOW4FuDK85bOYqkZxR6+XFBEThFSHy3Pcq+087PFvzleSoAWjvJPqbnMfOPvVwcS3mTDXVG414by0VjENTAMGWBI+N6gs2ycixOcm5VErRv1cKUGkQSi8VCc7DShyJdlXtkjuaMm+Iyr3JBfkhpupVAEnK5wgZv+kZoCuyJdX5sy+pdZe8C2U8iGtGxZRdo1RzmX3mD7Kjcyy8xqEXkbvGFecXFowMNhA2APHOyR95pLRwBXir/j+SKoQWOe9ui7uJ6vWMnQoGzidtaBH6wOYyjrmhzboFHtH48zJLZlmyaMclpn99vwLlvyidM7I/SVJC8Gh41Mm4JivvrVGXn8bZdO6VryxV9tZutU80szMbe+jvVbrcxYHIWjJLcBiOcUJQb3qU9Sv/w6panR/jzMv0i+/nN0YK9MDPjf3s3f59gT21a+SiJjm93upzrtulbTMNRkZwdTMEmTm10dyIdyld0BoLyUdfEgaK9TBj1QaP36pdmVNsUinXHLV/CGsSKzegCTcO5aCEeI+sHw7fAs5F0YIs1Z8MQ58twQiOHlgWENStY3w+2jVO2LUYF6LKuJt/l/tLzVdhsLoFAgYzK5rWudb7cb6xxks17N8QEZP3PoMvNecqjRr2" 61 | rebuild "" 62 | VGrid_bbox_min {{parent.voxel_bbox.x} {parent.voxel_bbox.y} {parent.voxel_bbox.n}} 63 | VGrid_bbox_max {{parent.voxel_bbox.r} {parent.voxel_bbox.t} {parent.voxel_bbox.f}} 64 | VGrid_resolution {{CONTROL.resolution.x} {CONTROL.resolution.y} {CONTROL.resolution.z}} 65 | VGrid_total {{CONTROL.total}} 66 | protectKernelWhenPublishing true 67 | name BlinkScript1 68 | xpos 51 69 | ypos 31 70 | } 71 | Dot { 72 | name Dot1 73 | note_font_size 20 74 | xpos 85 75 | ypos 103 76 | } 77 | push $N32396400 78 | add_layer {voxels voxels.x voxels.y voxels.z voxels.density} 79 | ShuffleCopy { 80 | inputs 2 81 | alpha alpha2 82 | black red 83 | white green 84 | red2 blue 85 | green2 alpha 86 | out2 voxels 87 | name ShuffleCopy1 88 | xpos 159 89 | ypos 99 90 | } 91 | ModifyMetaData { 92 | metadata { 93 | {set bbox "\[value voxel_bbox]"} 94 | {set resolution "\[value CONTROL.resolution]"} 95 | {set vTransformMatrix "\[value vTransformMatrix.world_matrix]"} 96 | } 97 | name ModifyMetaData1 98 | xpos 159 99 | ypos 143 100 | } 101 | Output { 102 | name Output 103 | xpos 159 104 | ypos 195 105 | } 106 | NoOp { 107 | inputs 0 108 | name CONTROL 109 | selected true 110 | xpos 284 111 | ypos 39 112 | addUserKnob {20 User} 113 | addUserKnob {3 total} 114 | total {{"resolution.x * resolution.y * resolution.z"}} 115 | addUserKnob {7 res_scale} 116 | res_scale {{"gridres.r / (voxel_bbox.r - voxel_bbox.x)"}} 117 | addUserKnob {13 resolution} 118 | resolution {{"uniform ? rint(res_scale * (voxel_bbox.r - voxel_bbox.x)) : gridres"} {"uniform ? rint(res_scale * (voxel_bbox.t - voxel_bbox.y)) : gridres"} {"uniform ? rint(res_scale * (voxel_bbox.f - voxel_bbox.n)) : gridres"}} 119 | } 120 | end_group 121 | -------------------------------------------------------------------------------- /plugin/gizmos/V_Noise.gizmo: -------------------------------------------------------------------------------- 1 | #! C:/Program Files/Nuke9.0v1/nuke-9.0.1.dll -nx 2 | version 9.0 v1 3 | Gizmo { 4 | tile_color 0xc17939ff 5 | addUserKnob {20 VFNoise} 6 | addUserKnob {7 offset l Offset t "Expands or shrinks the noise" R -1 1} 7 | addUserKnob {7 density l Density R 0 100} 8 | density 1 9 | addUserKnob {26 ""} 10 | addUserKnob {3 seed l Seed} 11 | seed 123 12 | addUserKnob {7 size l Size R 0 100} 13 | size 0.5 14 | addUserKnob {3 octaves l Octaves} 15 | octaves 5 16 | addUserKnob {7 lacunarity l Lacunarity R 0 2} 17 | lacunarity 1.95 18 | addUserKnob {7 persistence l Persistence} 19 | persistence 0.43 20 | addUserKnob {26 ""} 21 | addUserKnob {41 operation T ChannelMerge1.operation} 22 | addUserKnob {41 mix T ChannelMerge1.mix} 23 | addUserKnob {20 transform l Transform} 24 | addUserKnob {41 translate T NOISE_TRANSFORM.translate} 25 | addUserKnob {41 rotate T NOISE_TRANSFORM.rotate} 26 | addUserKnob {41 scaling l scale T NOISE_TRANSFORM.scaling} 27 | addUserKnob {41 uniform_scale l "uniform scale" T NOISE_TRANSFORM.uniform_scale} 28 | addUserKnob {41 skew T NOISE_TRANSFORM.skew} 29 | addUserKnob {41 pivot T NOISE_TRANSFORM.pivot} 30 | addUserKnob {20 graphics l GPU} 31 | addUserKnob {41 "Local GPU: " T BlinkScript1.gpuName} 32 | addUserKnob {41 "Use GPU if Available" T BlinkScript1.useGPUIfAvailable} 33 | addUserKnob {41 maxGPUMemory l "Percentage of GPU memory to use" T BlinkScript1.maxGPUMemory} 34 | addUserKnob {41 maxTileLines l "Percentage of image height per tile" T BlinkScript1.maxTileLines} 35 | } 36 | Axis2 { 37 | inputs 0 38 | name NOISE_TRANSFORM 39 | xpos 397 40 | ypos -93 41 | addUserKnob {20 "Ppos Locator"} 42 | addUserKnob {18 pointPosition l "Point Position"} 43 | pointPosition {0 0 0} 44 | addUserKnob {6 pointPosition_panelDropped l "panel dropped state" -STARTLINE +HIDDEN} 45 | } 46 | Input { 47 | inputs 0 48 | name Input 49 | xpos 519 50 | ypos -287 51 | } 52 | Dot { 53 | name Dot1 54 | note_font_size 20 55 | xpos 553 56 | ypos -231 57 | } 58 | set N38d6c00 [stack 0] 59 | add_layer {voxels voxels.x voxels.y voxels.z voxels.density} 60 | Shuffle { 61 | in2 voxels 62 | red red2 63 | green green2 64 | blue blue2 65 | name Shuffle1 66 | label " \[value in]" 67 | xpos 519 68 | ypos -191 69 | postage_stamp true 70 | } 71 | BlinkScript { 72 | ProgramGroup 1 73 | KernelDescription "1 \"VFNoise\" iterate pixelWise 1ef06e2feb9fa1e26cd67a5927f5113b61bc4529be4a0184eeac0df1f6aa3c87 2 \"voxels\" Read Point \"dst\" Write Point 6 \"seed\" Int 1 AAAAAA== \"Size\" Float 1 AADwQQ== \"Octaves\" Int 1 BAAAAA== \"Lacunarity\" Float 1 AAAAQA== \"Persistence\" Float 1 AAAAPw== \"M\" Float 16 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" 74 | EncodedSource "1 7101 swCyXHEWvTt3/L7rx19b9jDhRW+ahcYqmmHVDI5X81uILbyOtrcdJMeWilnLy7uuilP5SyUatGionFuRCr6txlETr3xTGCCHEWss7b6ea4XLEbPvKozwfhKBR18CNqrOouJDlXFnXeXqbFAQXjMdj1MRYDnxWY1NpUDm58r8oaix2aoVSW6zPXsOddePum7WixO9TB5LSrbd8fGsp6pQf68Shto0Um1gIFUmTuPIeF9kHZvOIoPwbG1L8kP22YlmOoWGmRDTYb3pEkUh6188avrLHjgEYHrG992nGekop2pcCmsgsDr0vPGgRbNr03Kw1O9qSmXh29MRQ3l78P+ul6Svei/3t/K70N6/DvjpXsB+Ctffe2GxDKq8wjXPlsODKErRd+qLBrBSe70ftHIkxVj4Du7jrpBjgZiDyqB0uvC1aixM5H9uT3hqn7d30IGpqLcEVTziclaIUtaIOLvN6coR9tIsY43qBCfmLDTfdwYvB/cgKq5rnwE97sEf5KMTiDBG/p8n/5GgB4Pr0YLjXCmZiBUmfs0OowIn5OoWnqWtV9E9nI5Ot41p3TSIDkizD8F6PUyqCXtte6uoDLPuRmR0IgFZdW9Y3Yexpq8o+cstZfx8KVnlb+JLVW1/sGCkSj7wTePSr/gI/a0QL+Ay+7MTRG30IQPwR7ip1H2W5z8xuIOxdJur3pAhfaoDU+C0qHP4ZhpWUzUjXaF9/X6Trqr/PQWnbVhVuOKEybQIkvfSQF2m4xYTZiOwjyARQxiwMQWTADWCT+NQJKZ+JSOMj2BqVFszxsq6KSSgMhnb1KbD5uwVvMA1IsP70NxptB1d7AooyNOGXKxxFjP3KkV2Qq/Q4YTao3TTN8BT/cgyNH2c0JK9PBs2RO0BxyMCK380ja+MnoXPHMdbPKww6trQUVL0PrwhfLN5Th1c2Hasa3La++GkdvDjU0oyztM9srn8jQs5BeZEz+yr1skZUCL+j24lEW423PwD1nLK6fFObRCkNUYOtM7cuC0xPy0hcRvjmh6z+4JUnHBCEFcA+55n242NbeK2A7vFUhbRGLeJz3IRMolGlSxhrI+VGlWpd5xovN6RJQ7j1A+IOhFQRKaAZCcNPOjK6zk9SKIKxDoN8a7WmW1D4WuqCNeVUNwf88fGvr8MGRliHoekOrgYuRCYxdBbzg83hgNhfL+NZJNDOf/Ikhy8LZTXfH4O2+kBFsK1ZRrZMw6uvZzJkmDHDxP9hyQbYYO6Vz6Bf/drQT1GUK8fBB5A+lHaY3csK97fGSBk1oNAKij5PUjYDQZJovC9C6jEjBFiAj+Oed+ng9j08BMKj8i+x4YvrS6FqVQmscG8pe3ZhKBhkegArO5FD5HXIgga8B2UF62K2URNvYLrPTkvUWskggOPLBrcno4eyITw1KuffbS4WNzO6igXoUTuWQTBsxi06RnMXFmgAPOCmR9wW3C4bmks7SiBSuYGiy7atMGEPqZKzyru1FMJ3i19f+AvW7oqoFKsqlKLyJgDPH8CnSMlA2AhVS8SZfbemYgKiyvqB4TppVujOKF4412yFaKZK32yi7zfgPdIuJMVPyDvi3x3Bz7OK3N9mcRU5OUZOH2Mdd7XI2Ek7DsIjjcP7wN7rdEoOzTbRe721vc0d49OU944WGcYCtUPcXBynQojKg35P1C4Cu5VzZO40qdg4lW+rwSHDEiGPDxR1I9ch2B8GMPrTDe3xtmVdhrAkI+ZaFaUA6AAAMJxFOo7WWP2luMduZ3ALql9daQRaBA+SGhLB314/uVPWKTIodeGwwoxCoWLScQunuyisvjefUuSfZ4yBkuo/0o9MBnv1Ltz+va5Ip7aAC87oM0ULtKgz/LhxOHZ3i5sR1d4Y5Qz+qaSC/66oq+v6Lv/XuGDcY55cKhJFKPVCEQekU0crrOVgg++gaxsCalpB6VzASKNqCoyRl1JanNTtHBEL4iq9BuVDzezK55spUm4fmjGRcvSsbtVdO21DxHAEEFnZIo8k8H5OgMMNcwGVpRE4KIvKEDlJDPGHbKzXUhVE5LQb4WE1Ycib3yk4jhCI7SLoyFpBeFdq7nz+qESHMIAU0CUrH49Z2QAZbC64YdvtCX3YhFrndemz3sI4FJpFuwV8l46DMIb2zXagU37Zua373dREtBeC+LTD25D5IaRyqeDEOtmfUQWK5OLImm+e9F1ImN0jkp+Dj4Ner+q7c8GLpEX6Vk1rIlQA2V58i+3Lqrhmi4usFEkbB1r+4gbZRNZEt6ios5o3w2/F1dP6y0iChctpU53RsIZm5qz+zebWVC3jV/eMvjDSpNj7g3cwagDQdB/7e9xxas09ES6G7SXXZ3xsfB4Pep2OtyQ01h//69f/dai4btEFJsfqrII4G1GT3u1eGN7skNltVC+a/AyMMzP0DwRubD8t8Q/2XYJvz51FDBT63N3/h33i3ISpxWSplE74hPj+HXzNlHvdvKnM/nkzTIbGhbV3cU/LRn49Bv7CsbYJ8ltv/wNYrqZ+yqdklZ4aaoErkPD7/78fn2LrZS+SUM+u2SZmF1EDx002XsKH3g01/5AjGREwFTjEURyXaxYxxfiU/SNh3u9b/eQrqLYnilW26CGFrfz+pbAtgmj6cfBtEHDBGC0hkzbXsyybUPfi2VXozH3XsZALks4ZJO0WS6jHpFzmxUtR9CGKojTqXe7EHw4cvx1PusWj/CAWoxgaW73SwgwonPT6WlSI0QEwqWmUYAlek3qXLneeNe0ie5MydGf7Uz//dAsjnhztApTJe4DxQV13ZagKc2wsr5QHl8C0jnubvKtWM47OnO1vr86skEBOoFO/+ioqo7Lw/fGnAjjWm6v6Px2P1VQNGWMRjR6/jE7awW/0ksp9VHD+1mKJhjL/sr975cqfVf1YLWYHB6QJIG+wcanJrI5TQdt0Kpl3OnMguft3oh6T7JPdFMwamrBpFr8g6VvPdgQnteX+lhQZtRMOoQ/oSNC7xFpSW+JGSRUv0E0RhH7kCiNcyZbWlgA5TsHYIy25AbJNnfFbjvf7raTv/9e2LcTITMFrry25VcSoZkh567/2ZkFCTnCmN+soaua3CWqFeEPX0LVa0F6n3WYAM6p/TxBiBeTURVphTLmZWb5d/ARzFEwZct1C/d3u7w/UPqktx8XF0aJs5GO7d2191pxl4D4u5Q/MVoKMdV/BjPoOG81i1ji6OyvLvXaIYdkRARXzGenOf9XQET70pvwJWzpyDHMhkiKtqy/49hi90ZXczEor6YzHGk3gG7D+H50yKIT2LH4y4ZPgS1zjONnj4N93TWPJW9wkaNDXRPSidHc6lHtv8yiFzfqGAD9RuYOfqAoF3zepiKFiqTHLWe896k2UuyJAkr9GT8aPGukKS4WquYpnZYzISNlptgT3Jnn2HT7LV7jjP92dCAIIZhdTAEmseKRMlG6I0Aq9O33b+ud2Dk3l11+jSkd6b/tX755aq+wrpEpKlcCOAzZRgPr2PVHST++4BZH4OdewgAPadWpf4maXDlBO4KByOsZw6y2RjAItmaDXPX0WQr0ulCxjdvLUd63QMqgIonW9Ir6LaIXp18grwzRKAVtfTGLE6eFB99v+/ekK7GAs0QbMeMLU3TiblLEwCsm5Q6JTM3eW00U8sCEdYSsPiu1at6o8AzEo3cinwhse/p5HeHjaylfu2uQIOpIvXXIRe27c9tJQQhK0fExil6auKzv64uwtw+qcfh5P2BHTPC39ihvXJOWbcgQAdBnk3S+wvMQvVNfGT7HsZ6yVpNJE45EzBGNfAZKUVQ603WDP38asvZhnqb8Cx2mQQ3A5/k8GQMeWRwqC79FgGwCkfAkZmVQLYRmnNgvhwozIXLJNqxTdnT476VDn58Ysd0cKJVRFaCT7ad8o8VBKcmtKGB8iMNohyGS/06V/3EYNeqIs7omLxNHGHtHfEseURAjW8TtnQXMh3ZQ8Uv6QuL89NyJMVK4Gqce02ck1vmmQbAV7GNIYciDiapxBCumJwbiNZiQtPTWy+t2dKrXK3oT1GGT7XQpqZw7bDO34tgMTAK1xXG6EZnyWbN4dQGEamM3Imc05ec3kjyjqZYm4KqJJ/D+jgMxi7blsEuYDzY9fnIR9zlsC0Of4M9eHLT2r+vcax2CBT9rlwHqmwRRNyRAVSWbUFXTLsDdzS4zdEHGVA1K1EdJgjheeK4RLKgOLd9RGjL/RsB1T70R5mXIfDdjwq7sqQ4Hkep09OwPRJw+HJ3M9J4QIFwn3q85z+YmJ2a+6t0KTv2g1hrEQqIXau+ULCAxphBpTcWd5s0G4R2F3qIigUrI0Xpn7Gp/lVY4V3Jt0u/ew9YJq5UDXka59iX+8j1V/wC1QIHnrEhFgadaA+t7i0xZVqiTkrFZI8uNg8K9En81+v9MjuGPjBDKtf2zeTC0P7JPNn+xuK93VHQlbIRo8jb5B4jOkUJDZx251SkCwAAsMa1RRB4i/4EXe0YBEkZ6DOhZtItMzZ/8iS9T/4+p8Y8pV1AWtH6+6pOiz/fZpWNn+EBfhpU85iHFxtLiDmjEH8Ze1hDxgW68wWuQStc4fFlz0RZy4rR4wJPKwLMNMJPw1++K5skZQ9I7iL1EM2AwC5bs5QBej1KZjMbS9YVFkz/NcHg33gdEdBkedoQL9SfXCb2dJxmSY4nwVPCbNa+VaIXeDVKaJ64/XhRHH9tvyzYkdkmCK54Rm3sG0vbJbUySPB60MZ132QCxCT/EtqxZk5MKRYy+f6VO/YqMPeWbJVuFsxeLzTrvBgXXk4t9DwKzTYIfIlTabY0H7x6MMMborzaFjHFqp13zMSQ2qAsL80dhUtLTwbHMctfPYwDxuQtC1B70nkD9uWlrOnloHQwL8cXvYXkOIJcmLndOtJw79cZ1n/qlcbhuvlUDJPIOrMTPJP1Woi5BV0Q3IwNUXV0wmYK+Qg05ZzvcNm7051S/AWoChLo9WBJHuCpp7Pd/ltcBqO7XjOzBcA3GVX6kOB295S97NZp6ayT+EGsmNngE1NgYqTOzypuLxjnqidAo80Yd0YaGQ+J4ZE1yHuNsnHT71qP21bt723aN5LunxEkU6ZO9KJPnopU3br1pGLcjot4Cgw/ekSm5bCKIv7JRBkPBRzrEbQlhNeL86/E2sIUyRkxhZmPKM/wer/KTSC/y7uHgS5qIJL8syKpnVA+4iFmDzzkIe5zcG3eTW3CpfF78l4R6c+p1D3MygCgXpY/1Q2IBsu118qJgAPxjoM259dcbEtyjQoj9LkX+5BQ8ykq8Q0dZ44eixlteg5xWFX7Kp/I/pVJ87vqlc2wUNOQlGmUywtAvlfomFCwPOBueNWDfuSBPFoZnKXDeqycGmZxVWisGL8wM/QQgEMC6aFwPI8YMy3MTOMe21G6uPuQtAg9XPpTtoGjnNSDJygb7b7fwAVguGiZ5bV3KFvB/lvkoqpk3h7FlXi4kY7ZtogbX2m/e7wD8JAXByUg8bdqDYbEytevlHJvclbohKw/gq3AAeTnn0SRIbUaXqyxKn9DWBXlof5gXLFJbpMeBvPgvE3E2EEGWT+mCfbNQaafvgprGM7JiqP3hRdRFWaH9gm2k552EIc8bFcQCSnTj/mSVXD3TlUw6DZDTj5U4Q5Vlg4mmhmXJ6Pkw8hjAZCxUOpce1joY/9eJuxXJ7JKWEDYjIazFx0hIMwjyGoVo+Y7C1P+KdGYU0eeJjffuWDN1xmUX9KtWEpHafIqcQpMCbLN1iejIyp1cbqNn7Gye7T786DOiPCj8r77y0Xnde5EOM74p4AXOAzOdA9uZ67KEaA8KSUwc0Cuipegnd/l/+UiE887p7xGCKVRv7AHwY1Uyrp4/+BE5f0l8fLHUKo6l5GQGnvxDJmBOI9roJCA5lVDlispoUJPkjRElm2w8NLG3+/CJpPmxVkAhzuicmapB4nXFX15VVj8Jcy+U8m64qy0wKKD8dr6jHj2k88wmnclBQt9cUrPy2KAveMdSOe0w3WtxGZ9gXJ9TFZ4kH8nLURipg9jUavNtIUg2hCGK5UGrgKZpQFTGy1Z/bug5q0swbzS/k44HRErhuGP0wYQ3kxnYxays7LZ164uj96lZxWaEm7wqCm0oT8wbGpcm9Bb641NMswikFB0QSQstrxry4sbpDy4Ry+F83W2q7SJG9MXHjrDW2E7yoZcW6zmEvwnnRMPddDJpvN2cXhIVCy5OCC0o+Wr3PUwGmp2STUix29A2WdcVTDZ+vE3FhPbwp8qEUMQ7Q2OcBCR/PrEOkDawHGX4SNOkv50Lt8I2BgUpHq/QPNGuyqgQ3++wR5ENlcU1e8twkzybXNLCwdpBnOi6xIky2QO6MU1peT6MArK3FoXM1ulLfTAD55y18+fcA9lUJxBG+0Sp1tJzg7LGuT+YBYNyhAqGBq/ltHnLG1p8TEE728I/oDCefe1cXPCMs66DN3SslQ1jjZYQu4eL/Gqw+Muc4+/FB9UvNyO3NDAMb+8Itn9Bum1dee1swdFkii6hT0VFMc8lMPHKg7jZkRIIXSjqkKzGQQjTUV4abf9mFkAnLj32iPJxp6gcUgNcmigTP9XDjK8t+MA20nrGK7248FMurSekBRnMf1fdBKkHC1M9BuoVQMIQBcXdnte971JUIEJxVQaIFwcpHgE7FnRxPVhn9knWRsTDfzqxGJqRtKHzEIgBwitc25PBClWrkhYQTLKtkFmvhGmffhpFRVzrf+mHL6kuOKS0EpUPRR3Q7g/uPD7aFhy8ykVYefeCM3Lj+OLyC0pCdXTKnMz9Aiu86Y4rU8Xq2ibNnF6ZnMHRg4Epz8ucPwd7qi1C4CUDgrtpsm8qiNSKVN7iENYc0xMuiCemYtei6mc0CmzRxdl2fFNKq4ISn1o4IkFKoMKLFxPt0dlm7jiqh5muSTDHmyeQGUShSXpZLMURUZHzCRp3F99zV67KLWvekrKprAkB+wnY9XRThpjiuZz33o3wqp64gq+hIoFDAWoVSfby1rbtVQ5U78BSTfPbfneqTg1TMk++BaWbn2KQIPppNBrqAD0M0ivRYeCWjtxX7d1gIOY4VH3REzQJHqL3TuzLzZtqVacOLMoZeki8cCDF/4KJV+8hrJF0lFTub10yLYnYlIRA274XB67vvCJem4auixM55PiJ+KzJmUMg91QMwLhrOWjkPuTJsqrQD7Rh6H+FcHzW47p7+otRFEnBbb7wI0BxkQARs8r9J/YMgzzPcBYOvcXNi2YGMefgbjtpycZ4WVr4StP/Kw3LWncrxsBOQJTrharr90HJTyHDZKWwJ0LzNdBP+QKrU/zhxhbN/JkxSh/Ic/4riJJBkmGgMJaKTOrCJn4mqLnALVew+7QBonMqmB0IMIGU+NP8WA5osOhQ+okxV+3kA+DnmpD441bwA1hnM5oPrm2On16Dj3WAF1q1rCmCl24vGdWFdutPToqqehf6TO6VYnkewROg8jigLb6xknOHjuT6mj7ddcSz5csnV1dK/x9xDVLdLOGniAfZkbKcTxw4o1aPhbGOjdxwPbblCQa3Qwx63zEdoBJUS6vUb3evczncDsWxdEYn92j+DO0UQoOmHvPUEARGkDO1QHNGaLrtkSASNQGiqJHoWRHkRjMlS6MUcWnFWIO8dKqHOeGskL6yotadIdTDESneA196LqQ22Es6Fo+2AsLCaqBFzJLk/Vv9WiQxkk3G0zF6L3+iOEFaLBCDMxWAwt34234klpafmdLECSoZYLbmjlEwXPb/WO4U6hBlh2tMvNofGJU92pt/tbsxqjyNSZ9LzNsQjatRrdSQuuwtS7xoQynGELVge0HuEsCPv79KIN1QtBcBxazdwdKjfxaQk4fsZsXvpSbJVZ52GaIY/Y2/xU8xXbkPbR9bFKW7PgDgwvf5Og6jZaatGbbvlbUGE3s2EsxBoDI1Ma+viozFbqI/2FIumGKRG1Zb+ieQ92UdQcMfKWWMc+NqiFxDRxirgO8TBpUMLRtmYDfC2iEMrCrVfmz9/BkOwCnFdnxhHkW9wDzlHBrReNa3gWEWIpBZFD6+mdfGlrCaHrQXvn5YC2Dr0MN5pRcsO1ZKM82OSRQk4/eftDusHPYLaERHiaDJZbXj3DRRmo9c+lh2nXXbldMgsS/F2iaDIETIJ/yjeIVOtKr7MI1BOTOpBtQWKL4/LtImwpmdPY1dO8vNqNjWgWPE085uEV58KIXcGyyH/uhtWyiP75tbr7QZGA+tgJ9juJj9eRR/hP6G8iyrBI3Ldh+g0TJ7nVfWON3JRst3xhnnCee9XpaLmT8E60d5uUSk8/qKrybKcONRWrqsW6bWEmxhFxkJk7zIXr2Ha5tD2j471ufdgtNRZIKfs6HRDyLTvBGnwgkOWeMJ36MAfbXLujvwHqgA8QDrSPU7cvb0FNS3e3ykpFkpTK6LSU1/2XsM+VgCDaLHVZSYCSpD/Pyvyozuo3lWjtYT3XRtRoRywtnKHlZq4uoYmru3lyOqPTgtzPm8Myr0f5uaXIjYO3RH/ykE0+4HGSRc5z1xJJTn6+WDz29zO1MzESw8Moe+9p/vIfCv8aavRNhzLVs8/0jWtPmR7RQ6I3i0dGFg9bjvaK2ze/ZXFc/tsyic663FrlUT/voVWSSD9A/yscBGhEPG7+jwtzDmeWceubhDQPxmFF38ED4/2/hYy+COgKbISghfKE6xIf23aEcIdBIrV/OqPGivUmObLB+xfkrlNxyJyhL4DXpAQZkhC2+jxF4CAgvI4zih/hOpUGq8kULjZlZzy3E0cOxbAYJgsnA0uisWK6w4wn2jnb045xP8Dmng6PYJLfD24WSjWnl8/LiN12LhHLUiwPQ77kEYNkOiuaCZvbtIp+RFmcVqznCf10uPgLqVJHgVjKY8uBWHWDTe+TjvB8WLAqLSv4NNCFZY3JomZRjpzqEKv/OOJofUjBH6ooRe2oF4q9OMa8rMHV1r3oCFQqjalPv4GMGS0TsuW3lcE05zV6JviBu+CQCXry7cgOblqrYhgnwVnSnNrQ57dMGM7Fn/b2Ke7X5UpG+M27vHfEz/o6tFzN7ycNb9rJlGZHOq7I6kCDfiwhoG/udW5y9F7AHZRHFvfy61bZrJCIQ+geXP4df9laFXlMv8hJHeoHeCK9Zl7jFhhFbQzDthSELhLExuXKCVphKzh/hp6j+BFzaciKD6yXh28D3wjSf7YlF/DLrlZIoju1UxZFO1g69fo1njzuqEn8AH+4IoqNNbwVRYNXsv0kk+ETLGamj7MZAcCv7UwKv3Yx3DjbF7zGR9RjeR7PbDTuQG6pb13Vicbkoozz03e7cJSrIizk87/p9aiguIVOaZzVuYfB4txlnewSh/9Ums2k0na0bKMZDzaK+IdrmmYkfdueGjAfENmbwWM1Lu5MC76nQvufqI5BZLp0yC2v2LZ3KxBXtOiWrQ6b0LppvNq5vBHtMHnpK9XS9RYV17UWJln75PzsXcZnK3lfvEUpPAm5jnuXVgenX0RGFPDUpQe8U6" 75 | rebuild "" 76 | VFNoise_seed {{parent.seed}} 77 | VFNoise_Size {{parent.size}} 78 | VFNoise_Octaves {{parent.octaves}} 79 | VFNoise_Lacunarity {{parent.lacunarity}} 80 | VFNoise_Persistence {{parent.persistence}} 81 | group_VFNoise_M 1 82 | VFNoise_M { 83 | {{parent.NOISE_TRANSFORM.world_matrix} {parent.NOISE_TRANSFORM.world_matrix} {parent.NOISE_TRANSFORM.world_matrix} {parent.NOISE_TRANSFORM.world_matrix}} 84 | {{parent.NOISE_TRANSFORM.world_matrix} {parent.NOISE_TRANSFORM.world_matrix} {parent.NOISE_TRANSFORM.world_matrix} {parent.NOISE_TRANSFORM.world_matrix}} 85 | {{parent.NOISE_TRANSFORM.world_matrix} {parent.NOISE_TRANSFORM.world_matrix} {parent.NOISE_TRANSFORM.world_matrix} {parent.NOISE_TRANSFORM.world_matrix}} 86 | {{parent.NOISE_TRANSFORM.world_matrix} {parent.NOISE_TRANSFORM.world_matrix} {parent.NOISE_TRANSFORM.world_matrix} {parent.NOISE_TRANSFORM.world_matrix}} 87 | } 88 | protectKernelWhenPublishing true 89 | name BlinkScript1 90 | selected true 91 | xpos 519 92 | ypos -78 93 | } 94 | Add { 95 | channels alpha 96 | value {{parent.offset}} 97 | name OFFSET 98 | xpos 519 99 | ypos -22 100 | } 101 | Multiply { 102 | channels alpha 103 | value {{parent.density}} 104 | name DENSITY 105 | xpos 519 106 | ypos 16 107 | } 108 | Dot { 109 | name Dot3 110 | note_font_size 20 111 | xpos 553 112 | ypos 82 113 | } 114 | push $N38d6c00 115 | Dot { 116 | name Dot2 117 | note_font_size 20 118 | xpos 680 119 | ypos -231 120 | } 121 | ChannelMerge { 122 | inputs 2 123 | operation plus 124 | name ChannelMerge1 125 | xpos 646 126 | ypos 65 127 | } 128 | Output { 129 | name Output 130 | xpos 646 131 | ypos 145 132 | } 133 | end_group 134 | -------------------------------------------------------------------------------- /plugin/gizmos/V_Preview.gizmo: -------------------------------------------------------------------------------- 1 | #! C:/Program Files/Nuke9.0v1/nuke-9.0.1.dll -nx 2 | version 9.0 v1 3 | Gizmo { 4 | tile_color 0xbeb139ff 5 | addUserKnob {20 vpreview l "Voxel Preview"} 6 | addUserKnob {4 view_colour l View M {Density Colour Position}} 7 | addUserKnob {41 value l grade T Multiply1.value} 8 | addUserKnob {41 detail l "point detail" T PositionToPoints1.detail} 9 | addUserKnob {41 pointSize l "point size" T PositionToPoints1.pointSize} 10 | addUserKnob {20 graphics l GPU} 11 | addUserKnob {41 "Local GPU: " T BlinkScript2.gpuName} 12 | addUserKnob {41 "Use GPU if Available" T BlinkScript2.useGPUIfAvailable} 13 | addUserKnob {41 maxGPUMemory l "Percentage of GPU memory to use" T BlinkScript2.maxGPUMemory} 14 | addUserKnob {41 maxTileLines l "Percentage of image height per tile" T BlinkScript2.maxTileLines} 15 | } 16 | Input { 17 | inputs 0 18 | name Input 19 | xpos 246 20 | ypos -283 21 | } 22 | Dot { 23 | name Dot1 24 | note_font_size 20 25 | xpos 280 26 | ypos -250 27 | } 28 | set N322f4800 [stack 0] 29 | Dot { 30 | name Dot3 31 | note_font_size 20 32 | xpos 400 33 | ypos -250 34 | } 35 | add_layer {voxels voxels.x voxels.y voxels.z voxels.density} 36 | Shuffle { 37 | in voxels 38 | name Shuffle2 39 | label " \[value in]" 40 | xpos 366 41 | ypos -206 42 | postage_stamp true 43 | } 44 | Dot { 45 | name Dot5 46 | note_font_size 20 47 | xpos 400 48 | ypos -71 49 | } 50 | set N3231bc00 [stack 0] 51 | BlinkScript { 52 | KernelDescription "1 \"VoxelTransform\" iterate pixelWise 354232abd4b87787704b45ded14d128e6ab984911e1d96996bcb02f1716fd247 2 \"voxels\" Read Point \"dst\" Write Point 1 \"M\" Float 16 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" 53 | EncodedSource "1 560 v7d+FffYZuYXrpANrf8U9gMUq0czvpPNBwqEzbF+EQ4nfF0MmAhi1FxmM35Q3zcaRlWrKTokEw310zbW4DugWYz4y3w8FJe/IzcFOWvZAYPoWa6xpXoOCvMAKVHs5fR7LqluJLeZ3tg3qYxMb+Fj03UPfaYFf5N/PSMIGkIF0CED4ipLmd1ELd+KbKKsJwagwcoiEHXEbOV+tiBIvi834XbRc1cbZB5OUyz1iTLdG4U3fofpM2mY0np9MNUdcVPQW/u0tENG8rSwOKbac9yRQKF48ule3kTNRg0mRkn3pOS8eXZSlKBWltmM6ANt01FxcuPiuwkkfmEqNOte4SGNvm6+LOx+KUqtXUq33THnOKDvjgOJFerj5Cc8JIVxG2Z7La83qvhK51HIolN9KiiXuRAVWDKTMk8+WbamS7Wfwm9h9OIM+TfybJWMN1Fv/vDW9jbN9E3cg9VZQgX/pz55zPWjXEFoki7oiPHHUGU2BAWffJiOzBjaVAF8Yds5Ombn5vH/wQuYtdgT97ivHL+mJpKZ+nXqxZHexXcCZQoaWuZz17o/zCuZaRDLnQPnGyhz49yByP15/xSFwIDzD4/giRa5P0XSnR8uzDtJmcFR0qtuQ9UZidfvmSCifVZyC/u2rNprrfINMbmenQK8CFeO/XXNAGfPMvSymS5lVUfO7rCJo4mnBrk2V+zsTvdxYS+B8sM6K7fj8mUXVUmjP4Y4eCfyyxZNc9aDUWz2fggvrNJKi6/bmqY8u13rshy4Y6Ym" 54 | rebuild "" 55 | group_VoxelTransform_M 1 56 | VoxelTransform_M { 57 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 3]"}} 58 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 3]"}} 59 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 3]"}} 60 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 3]"}} 61 | } 62 | protectKernelWhenPublishing true 63 | name BlinkScript2 64 | xpos 366 65 | ypos -17 66 | } 67 | Dot { 68 | name Dot6 69 | note_font_size 20 70 | xpos 400 71 | ypos 64 72 | } 73 | push $N3231bc00 74 | push $N322f4800 75 | push $N322f4800 76 | Dot { 77 | name Dot2 78 | note_font_size 20 79 | xpos 162 80 | ypos -250 81 | } 82 | Shuffle { 83 | in alpha 84 | name Shuffle1 85 | label " \[value in]" 86 | xpos 128 87 | ypos -206 88 | postage_stamp true 89 | } 90 | Dot { 91 | name Dot4 92 | note_font_size 20 93 | xpos 162 94 | ypos -71 95 | } 96 | Switch { 97 | inputs 3 98 | which {{view_colour}} 99 | name Switch1 100 | xpos 246 101 | ypos -75 102 | } 103 | Multiply { 104 | channels rgb 105 | name Multiply1 106 | xpos 246 107 | ypos -13 108 | } 109 | ShuffleCopy { 110 | inputs 2 111 | alpha alpha2 112 | black red 113 | white green 114 | red2 blue 115 | green2 alpha 116 | out2 voxels 117 | name ShuffleCopy1 118 | xpos 246 119 | ypos 60 120 | } 121 | PositionToPoints2 { 122 | display textured 123 | selectable false 124 | render_mode textured 125 | P_channel voxels 126 | detail 1 127 | name PositionToPoints1 128 | xpos 246 129 | ypos 116 130 | } 131 | Output { 132 | name Output 133 | selected true 134 | xpos 246 135 | ypos 216 136 | } 137 | end_group 138 | -------------------------------------------------------------------------------- /plugin/gizmos/V_PtLight.gizmo: -------------------------------------------------------------------------------- 1 | #! C:/Program Files/Nuke9.0v1/nuke-9.0.1.dll -nx 2 | version 9.0 v1 3 | Gizmo { 4 | inputs 2 5 | tile_color 0xc19139ff 6 | addUserKnob {20 VPtLight} 7 | addUserKnob {41 value l "Light Colour" T LIGHT_COL.value} 8 | addUserKnob {41 value_1 l "Scatter Colour" T SCATTER_COL.value} 9 | addUserKnob {7 intensity l Intensity} 10 | intensity 1 11 | addUserKnob {7 absorption l Absorption t "Amount of light absorbed by each voxel."} 12 | absorption 0.5 13 | addUserKnob {3 samples l Samples t "How many samples to take per pixel. higher values will give more accurate results at the cost of speed."} 14 | samples 64 15 | addUserKnob {26 "" +STARTLINE} 16 | addUserKnob {41 operation T Merge.operation} 17 | addUserKnob {41 mix T Merge.mix} 18 | addUserKnob {20 graphics l GPU} 19 | addUserKnob {41 "Local GPU: " T BlinkScript1.gpuName} 20 | addUserKnob {41 "Use GPU if Available" T BlinkScript1.useGPUIfAvailable} 21 | addUserKnob {41 maxGPUMemory l "Percentage of GPU memory to use" T BlinkScript1.maxGPUMemory} 22 | addUserKnob {41 maxTileLines l "Percentage of image height per tile" T BlinkScript1.maxTileLines} 23 | } 24 | Input { 25 | inputs 0 26 | name Inputlight 27 | label 1 28 | xpos 725 29 | ypos -4 30 | number 1 31 | } 32 | Input { 33 | inputs 0 34 | name Inputvoxels 35 | label 0 36 | xpos 603 37 | ypos -4 38 | } 39 | Dot { 40 | name Dot1 41 | note_font_size 20 42 | xpos 637 43 | ypos 74 44 | } 45 | set N4d325000 [stack 0] 46 | Clamp { 47 | channels alpha 48 | maximum 1.#INF 49 | name Clamp 50 | xpos 603 51 | ypos 116 52 | } 53 | add_layer {voxels voxels.x voxels.y voxels.z voxels.density} 54 | Shuffle { 55 | in2 voxels 56 | red red2 57 | green green2 58 | blue blue2 59 | name Shuffle1 60 | label " \[value in]" 61 | xpos 603 62 | ypos 158 63 | postage_stamp true 64 | } 65 | BlinkScript { 66 | ProgramGroup 1 67 | KernelDescription "1 \"VPtLight\" iterate pixelWise ba9be73e015472e04940da642fd6d4b614fba9085b168cbbff6669efdee47694 2 \"voxels\" Read Random \"dst\" Write Point 8 \"bbox_min\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"bbox_max\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"resolution\" Int 3 AAAAAAAAAAAAAAAAAAAAAA== \"light\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"intensity\" Float 1 AACAPw== \"absorption\" Float 1 AAAAPw== \"samples\" Int 1 MgAAAA== \"transform_M\" Float 16 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" 68 | EncodedSource "1 4018 qYsGd1DMKT4KlZOYNkDHHm3c0HnAg3oeu+UJo0HFvE5tmvAmh6FFF5uR9NUGAyP+WJAembksWZXnpMy0YsQzy9uAtAduHN3wlDG24HgO27wNcCLT25PAglD9JkYuCz9q3nGOHdYpUp2hhyD1taXJveXUBKn3BZWfSBUij8hfIWERCOVObnZltqPKhU2Xue8S1aT7KndRPBioxDVa+TnOqtuUjhQhd/kKtnuLwK5PK/6u72OhlIWrLvBwS/NWjxVdqD8hWfNHLDVb7fToRG8u1WI0N3lf4PLY/tGI5ebTVoC4m5ENnMJ5qT9sYBumJAYyQm8NByL6zIogAXIA0eZvYabo0eHc14kMHtOiEECCNqfZTp9vY1SP6U3zT6DwBmuFNvFy8zXcwq9jgJowQc2gKPxcg9oKHpHuH3L8RLGBIsHnINRTWBDstIxHtLGbqpCAjpvsgC6SDxSlLUzhzm2aIttBCwQB3aDbVFvxTKPOdyHuMKkX4YDDKs9b2a2DHl26yJg8+qZXr6kf+HPu71RZpkIyCnwUnapHI9YWwNz3gtDLWnzf9FDYvY/PosCq8mWj1qJZUxzYhd7g23gOz3iGuej11GyBF2SbVB4cAerPW8JP9zJVYe/7V7LW7rZRmrftECJLVk1mEuM74AopUu+e99b8RFllOjjL9gXuel8YqakWHE5hyy6e0t/m1VJ7Nw0bbzT9B6BgM449pJu2RkYJWkJ5UIF9+nkdX1wJraKpyvYeDvwAZk5cVawd2TtdwiDzoQQ1Rs8BDUtFFHpro+zJa79h63wqDtQmTpzBCGmB60lWb23tVkIPmEclyQElSdIj7o6P4ooc4+zW4ERrKjJgG9Q9NfIG5pNe1ur/sU6+ArkAkVcrUQU8vrH0Of7KfMlLoorssoTYvp8+gMZ91Y3y1sZQ/niLR5bs2EPr6nH4VEZiQ+sQpNKzmcDilWbfmDZ02EKl4fLkYuqW0rYfIhjRbz4Umwpzf0fxPbmZqhopBHB3SlYhVLnSqh9FX+rvdtIuGy1H7KJqMKzXEIVqA3CFFYva/tn5dYfFbcLTRog3l5sWeKd/BzzjRvDQdYMmuHp+86ZvrmLMuI5MLjRmgzHT6XfP2sUqa0oHtnqXW20x0oAePSgaJhHFZKxp+sLHIW/eAz/3us+pbs5um1UlLxINn48E4HYXdKn/aiPwVTDeXNTcA+fRcsDsLmF7Ryeq27HvnE1d701HkOMt++cM29t1+pZa/DxUoPEyhgxHxuCBxA5BAi0MXLjrJBkhoFL4L26MUfCjvmFhSjQPMlg3rrLF+sxJyH33zEthH5bhyrdudqmOJXBB8gHYuEn8BV5fPxQq9psZD/G6ZcVFI9Mihbj4+aeKOMUztaixQ1EaAt+NoGkFOZc+H+lPrCyaby3IOYSDKnuPTYm+RPK58oaiIfC9PH5s8qXzWOgq5ueErGm7i+aKogmmOgnOb2Wp0YVRE5EftA8PtWAHJ2hB9OlZCcMStJx2/dZpSW2abSJzhcIG0uXdrx1+55AM27O2GzgQ7V6lsq0nQfUEXPziJiM82E/jddDjhwMmtNBFoXVwB3DY81eWhOBMOh/LL3RBBi/Lg95ZOw4eqQ6qEXg40/21oYTfie59jlWzqYQ6t3OH1txystmNKSVUjUh0qHwomeBNUAldDPXpVtkT5MkevQSBVPXAliWeI5bxXb4LM68ifmEKwuBFXV3AsivnMIxYBRroo0FojN/Dy2XCesl8LYs5ydb4j9ANGZAyusNpEG74wnerQ4B0ebrd0umRt407H/vJSnl+4UPMgqLyjIz+/aUJkdOjxImt/rTHk45HIa44vjvhkpVJ1QrkDpIn9vlCE9aXddXm9Ezdkbrv8rOSTkbIxwTOdI8sCkvBcd7GO8BkJ5ozZcIUUTAKpoPszcby8cGzpgQ0Z25Cbyxwa/Bd4pg3BBZ3fJsfHS8Um9DmAfTD4YyHnzD9B6cPM0doXCO6gSz3SbpA5VTeigk0o6NG+OeX7qjvzQJofMKMb7gGoVqyaUzay88vQEej1yliCNM0wzaiLTenofix56tryaflKSRsIPZDD06M8Mw56/HCKJaPj/PgaULfWOThJI7la+5h5lSO+F5TiYtDDORQEhkde3FA34UYNWRXLA6S9l1ys46d5C8lcbedSjOq19dOsmj8L9fyVRhdXpG2z1gfgko2GbIanBfLMuPyICoyxmB0HpamzVQ5O2CwQdfdtLEqlP9kFWt2JFRtx7FWZv2KDT10KrI3HbdOeZO/U/7LNkDaqBH/YV7rEu5VX6Hd60NXdcRqso2FtyCzJqBWO+n2CQkcL7ywnm8fRStWbJMJ6N5mCLr29HoM4fH4h2IaANsYGjHX/w4Mvcz//JRzw+90Hz58hPdCl4laosYPj40T0WYFL538e224hjaZ0cxeiAgTtR//szn9ZOA38yeKsE6jtFdC7H+AhU72StxBTsNCXECAmBmfS++1M4KRQFIh/uOs5SYQSwxgmjmkL/RlvakqPMFhWYf4okMOEkk53Wzkapzu6P3BGog4NPfIT9ZIyvkLr71xeMmblwpO8ZNn0nUoj6351tYm85YQtMSBxmLWLR1ou0qCdbCiNWcRlDutc5bs23iIOQELsnAot12oDHISAU73XtlIRaHM0nca7nQNHuBEKwP/E4Qh44pUQGnq2gPw2VZ73Ykh2NSE/ugzl/lYr5Q8hg2yKR/exu5d7XQz2PtF/MZzOTt6qyZKZM7mJsvemRhafvyo64uVLmL3XDI5n9HgU4ztOc16ZFbD2cMnjtJtcZ6M8PDD4FRN70BaZZn7IUUdTDMCUsUIWO9qi1C9oRuXUqXhvs4W+Os4S0yUM/CTwZwlqnm6j6JoEerFVGFtq6LbOicqb9xi97tOwj07Eb48YkUOo2MPqKrD3+gspjv1MufjNxXXege63uAVuY0jaFykKoU4g0qZ3QZgSEm3kijCUzFFP2nuTAl6yoPYWICOxet4/2em7DWnwY6/n4hRLq8o8+Xc3e3zB56lNeYv/+NukLd+hpc3kFl25NRgEFstk0/hW6MS2ZkF9rWEpbfecV0wg083IMkAcJmI/nXNQ06o8Hb6tlCJe+7hgN+VNG994eiiZigKvPgBJOkkd0HpD6gpL8L1wzPXRMCafwSNver+oeatve3YUjCxW2Z7VGqulAmNF00UGRP/Vx/6/Gdhw8GTIWrKFV6RXcPx5wO2Fo4QrlgrzrEYTqsKiHhfhIj3e4J8Cn8j5et8sgWAflBtAX0VSSdSyOHyhq4n1gKhmJsnIq5suzVY40tphYhcp7CuP2t3jwda7WLyXXWZdIc+nHQnhO646KFjBbu+QwTF0CrXO/iL9VdbLUGsI/dVNry4UfiOEFJICYwRhOR9ldYRfZm++i1ioo27TMIkkc+VYIF+vZ9Mrl9OH66baqiHkosOKX2CNCv3MEf4ue7Q3uXdywqO7FQ6gXWPNzGiR3rXf9FtxJl58EH6HFzaDbE7RlJQUrU282b6l5zQw91awdOZ65nNeC1uw9QioeRZvr48HvS1D3d7m9JwBhVNK9ncooAe1r31MzIvYRcZ5sr3xhWmux9YIq4rMZZIBozyHSMHewn4bth/CUScJICvMgx7oO7S+Ou6EaClNg+A0P47R0iKtXbAxrK+HenlbdTpH8nRcrRmtyTyTjQQkrryRmc3FojNvYfAa/nTDOiKCeUSj92Fynj81yznbcyjgCAiYBg90PBaoUkNEYfPD7eTSJnz3AmC379N8l/EthJCZPuDYsDPlmDcmHN5RJkrwt6yUCrcz2pix1TbD6AR8gzpGaIuPDSCGBVOaeqQI5mpBbbemIyFL84JQLNmMS36Pw95Sb/yvcPz2kqz9lqAks962LjUlu09e/16mFr/ukz7Ep+ErVxpgP3JN22/TvCW8wudcb+ySB5kvAJjEQRxztKIEE9aSoVc2A6N0qTNcikzws1F6ljZHWzDEYZ9RFqa5i04FVTbtFwTgCfhryrHSJJGZH6opS4cDnEkhG8gwCiZgoYUxl3P12F35WgUHTM/H+rWTJJIIQzpEC8yJeTO5juDZFEWKK8J4JmcYZTNL4UwYS8aT1ng3l9CcQbs4/E9OR9Jwia4Q48G7yR5GG6zIjzrXOQOU3byWpqE3N++0JuU9hgTQQqyYgZk1Gh2P1gsi8DLcTK/neR17FGS1YEF8O2xpajbfVjYvVm2LV20d2zOmNoTUzeFBDgOm20NTh3p3ccTeAHtTUiYxggiIVQ+40LTaKfAUDSMaDPnVXc2L0zOKPGYe/Yb7AWq32B3WjL9kpUF0EJU4v2qdyZZD3n/cC3cCEBWSzOVwdC+yAxd2oBCNvLdZUb1Dykz0tO1vMZCzpaIwxIMB4W2YFWEo0tnbxxC54SKwKS8XUqUnmLTW/VEwEHzdtRMr+VBtJxlvQv6MPHSHxNKjt8j6YnGj6oLL1i3kAO/VlB7e2ERmvj6QDL9irQB2q5e3mbayBJHO36wl79mRR7L/AfFMXEPCUVg4uQM4dw8rfG/b/tcl0gFT0/d5Qz1cz8Pe+WQHV39q34fNidypJp0ytVhqS+z/KDQW/3oNxS7YLwkF7jiME5OvnXglzoLM37xbFIVucmqrgOsmF6eAfR4Ju1xUbu7k57Azvdzoy8chraXKRtSw7Sr5pDdgw+Ud9H28NNjzZrEhUY2PrIy7YF3Z121/UjfrQquW94VfH5pGAfrJFNfmD6dFW+YH3AxWQUdwDZ9PhsZk2RrH+hsdMpKUcn3hppAO0oY9FFHAblK9xNc0E+eXLOaO0B87al+wrbOFfdGVrrNiA9rBsQZzqsbl/wBAO2UmIYrs+YcNxcxxwdGqQcrnTVjWCpAk+cCi6f5d1BW72UOO41UiOmUPqIExCTFbaQp+YC9xLK/pQOqe6Q05aBhIXdoRknKPY5ZE+gq1gQrEDeZz5Mklp2ywHLV4e7p9YMXXfhgEtcoAWKNmyI/gylkMYe4/EuDh26/Ua8fkxhhi+Pp7vtFPB1q/zmnU6fFkB0lhQxC2ZzI+yZWN8NlYPhIpv6ZJFWms5cXoaOj9SlbVVEX5MlHvABl5Zz9dWum9HokYde+OOpSoEguNNyhBCgChKd3vJj7diqLCqOmg3YCZHS38Gt5ioAIY9T45g1yodwkek+2DH6n03OwhnnutreJ5ab4fe1fT8qsz9Yl4KIGq86BdZqGNwjjhShB6YhFHdRDGmVWK9FHKF2vPE5IaHA+CG/TjHdddI4C2nzdnzkr3RpKyUmjEVau3r6jkheYxu+POZOviQl037/tsxRJPGX5vJVJ1xlRQUHuu7fh/DffQ+G7FMdNOLEmw5er6wkjq/SopDMrklEpgq8md+OmdeEYwrNIvvLGBsGxxJ8/3cO0YqFgWpir" 69 | rebuild "" 70 | VPtLight_bbox_min {{"\[lindex \[metadata bbox] 0]"} {"\[lindex \[metadata bbox] 1]"} {"\[lindex \[metadata bbox] 2]"}} 71 | VPtLight_bbox_max {{"\[lindex \[metadata bbox] 3]"} {"\[lindex \[metadata bbox] 4]"} {"\[lindex \[metadata bbox] 5]"}} 72 | VPtLight_resolution {{"\[lindex \[metadata resolution] 0]"} {"\[lindex \[metadata resolution] 1]"} {"\[lindex \[metadata resolution] 2]"}} 73 | VPtLight_light {{input1.world_matrix.3} {input1.world_matrix.7} {input1.world_matrix.11}} 74 | VPtLight_intensity {{parent.intensity}} 75 | VPtLight_absorption {{parent.absorption}} 76 | VPtLight_samples {{parent.samples}} 77 | VPtLight_transform_M { 78 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 3]"}} 79 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 3]"}} 80 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 3]"}} 81 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 3]"}} 82 | } 83 | protectKernelWhenPublishing true 84 | name BlinkScript1 85 | selected true 86 | xpos 603 87 | ypos 278 88 | } 89 | set N410b2400 [stack 0] 90 | Dot { 91 | name Dot9 92 | note_font_size 20 93 | xpos 527 94 | ypos 288 95 | } 96 | Multiply { 97 | value {{1/intensity}} 98 | name Multiply2 99 | xpos 493 100 | ypos 330 101 | } 102 | Dot { 103 | name Dot7 104 | note_font_size 20 105 | xpos 527 106 | ypos 406 107 | } 108 | set N4d355800 [stack 0] 109 | push $N4d325000 110 | Dot { 111 | name Dot3 112 | note_font_size 20 113 | xpos 307 114 | ypos 74 115 | } 116 | Multiply { 117 | channels rgb 118 | value 0 119 | name Multiply1 120 | xpos 273 121 | ypos 230 122 | } 123 | Dot { 124 | name Dot5 125 | note_font_size 20 126 | xpos 307 127 | ypos 288 128 | } 129 | set N4d354c00 [stack 0] 130 | Add { 131 | value {1 0.915 0.775 1} 132 | value_panelDropped true 133 | name LIGHT_COL 134 | xpos 273 135 | ypos 331 136 | } 137 | Copy { 138 | inputs 2 139 | from0 rgba.alpha 140 | to0 rgba.alpha 141 | name Copy2 142 | xpos 273 143 | ypos 396 144 | } 145 | Dot { 146 | name Dot8 147 | note_font_size 20 148 | xpos 307 149 | ypos 537 150 | } 151 | push $N4d355800 152 | Invert { 153 | channels alpha 154 | name Invert1 155 | xpos 493 156 | ypos 458 157 | } 158 | push $N4d354c00 159 | Dot { 160 | name Dot6 161 | note_font_size 20 162 | xpos 417 163 | ypos 288 164 | } 165 | Add { 166 | value {0.165 0.32 0.535 0} 167 | value_panelDropped true 168 | name SCATTER_COL 169 | xpos 383 170 | ypos 331 171 | } 172 | Copy { 173 | inputs 2 174 | from0 rgba.alpha 175 | to0 rgba.alpha 176 | name Copy1 177 | xpos 383 178 | ypos 458 179 | } 180 | Merge2 { 181 | inputs 2 182 | operation xor 183 | name Merge1 184 | xpos 383 185 | ypos 533 186 | } 187 | Dot { 188 | name Dot10 189 | note_font_size 20 190 | xpos 417 191 | ypos 601 192 | } 193 | push $N410b2400 194 | Merge2 { 195 | inputs 2 196 | operation multiply 197 | name Merge2 198 | xpos 603 199 | ypos 597 200 | } 201 | Dot { 202 | name Dot2 203 | note_font_size 20 204 | xpos 637 205 | ypos 738 206 | } 207 | push $N4d325000 208 | Dot { 209 | name Dot4 210 | note_font_size 20 211 | xpos 759 212 | ypos 74 213 | } 214 | Merge2 { 215 | inputs 2 216 | operation plus 217 | Achannels {rgba.red rgba.green rgba.blue -rgba.alpha} 218 | name Merge 219 | xpos 725 220 | ypos 734 221 | } 222 | Output { 223 | name Output 224 | xpos 725 225 | ypos 793 226 | } 227 | end_group 228 | -------------------------------------------------------------------------------- /plugin/gizmos/V_Render.gizmo: -------------------------------------------------------------------------------- 1 | #! C:/Program Files/Nuke9.0v1/nuke-9.0.1.dll -nx 2 | version 9.0 v1 3 | Gizmo { 4 | inputs 2 5 | tile_color 0xbdb039ff 6 | addUserKnob {20 VRender} 7 | addUserKnob {41 format l Format T FORMAT.format} 8 | addUserKnob {7 density l Density t "The amount of light absorbed by each voxel. Lower to get a thinner result."} 9 | density 1 10 | addUserKnob {3 samples l Samples t "Number of samples per pixel. Higher values will increase accuracy at the cost of speed."} 11 | samples 128 12 | addUserKnob {20 graphics l GPU} 13 | addUserKnob {41 "Local GPU: " T BlinkScript1.gpuName} 14 | addUserKnob {41 "Use GPU if Available" T BlinkScript1.useGPUIfAvailable} 15 | addUserKnob {41 maxGPUMemory l "Percentage of GPU memory to use" T BlinkScript1.maxGPUMemory} 16 | addUserKnob {41 maxTileLines l "Percentage of image height per tile" T BlinkScript1.maxTileLines} 17 | } 18 | Input { 19 | inputs 0 20 | name Inputcam 21 | label 1 22 | xpos 655 23 | ypos -128 24 | number 1 25 | } 26 | Input { 27 | inputs 0 28 | name Input 29 | label 0 30 | xpos 535 31 | ypos -127 32 | } 33 | Clamp { 34 | maximum 1.#INF 35 | name Clamp1 36 | xpos 535 37 | ypos -33 38 | } 39 | BlinkScript { 40 | ProgramGroup 1 41 | KernelDescription "1 \"VRender\" iterate pixelWise a604b5c97cabd396fed0640f0dca39e8f373a0616f5fa0bd8c103d2f33ab5115 2 \"voxels\" Read Random \"dst\" Write Point 11 \"Resolution\" Int 3 CgAAAAoAAAAKAAAAAAAAAA== \"bbox_min\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"bbox_max\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"density\" Float 1 AACAPw== \"samples\" Int 1 MgAAAA== \"Width\" Float 1 AAC0RA== \"Height\" Float 1 AIBKRA== \"Focal\" Float 1 AADwQQ== \"Haperture\" Float 1 ppvEQQ== \"cam_M\" Float 16 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== \"transform_M\" Float 16 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" 42 | EncodedSource "1 5194 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" 43 | rebuild "" 44 | VRender_Resolution {{"\[lindex \[metadata resolution] 0]"} {"\[lindex \[metadata resolution] 1]"} {"\[lindex \[metadata resolution] 2]"}} 45 | VRender_bbox_min {{"\[lindex \[metadata bbox] 0]"} {"\[lindex \[metadata bbox] 1]"} {"\[lindex \[metadata bbox] 2]"}} 46 | VRender_bbox_max {{"\[lindex \[metadata bbox] 3]"} {"\[lindex \[metadata bbox] 4]"} {"\[lindex \[metadata bbox] 5]"}} 47 | VRender_density {{parent.density}} 48 | VRender_samples {{parent.samples}} 49 | VRender_Width {{FORMAT.width}} 50 | VRender_Height {{FORMAT.height}} 51 | VRender_Focal {{group.input1.focal}} 52 | VRender_Haperture {{group.input1.haperture}} 53 | VRender_cam_M { 54 | {{group.input1.world_matrix} {group.input1.world_matrix} {group.input1.world_matrix} {group.input1.world_matrix}} 55 | {{group.input1.world_matrix} {group.input1.world_matrix} {group.input1.world_matrix} {group.input1.world_matrix}} 56 | {{group.input1.world_matrix} {group.input1.world_matrix} {group.input1.world_matrix} {group.input1.world_matrix}} 57 | {{group.input1.world_matrix} {group.input1.world_matrix} {group.input1.world_matrix} {group.input1.world_matrix}} 58 | } 59 | VRender_transform_M { 60 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 3]"}} 61 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 3]"}} 62 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 3]"}} 63 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 3]"}} 64 | } 65 | protectKernelWhenPublishing true 66 | format {{{parent.Reformat1.format}}} 67 | specifiedFormat true 68 | name BlinkScript1 69 | xpos 535 70 | ypos 86 71 | } 72 | Output { 73 | name Output 74 | xpos 535 75 | ypos 222 76 | } 77 | Reformat { 78 | inputs 0 79 | name FORMAT 80 | xpos 384 81 | ypos 90 82 | } 83 | end_group 84 | -------------------------------------------------------------------------------- /plugin/gizmos/V_Shape.gizmo: -------------------------------------------------------------------------------- 1 | #! C:/Program Files/Nuke9.0v1/nuke-9.0.1.dll -nx 2 | version 9.0 v1 3 | Gizmo { 4 | knobChanged "\nif nuke.thisKnob().name() == \"shape\":\n if nuke.thisKnob().getValue() < 3:\n for knob in (\"xplane\", \"yplane\", \"zplane\"):\n nuke.thisNode().knob(knob).setFlag(0x00040000)\n else:\n for knob in (\"xplane\", \"yplane\", \"zplane\"):\n nuke.thisNode().knob(knob).clearFlag(0x00040000)\n" 5 | tile_color 0xc17939ff 6 | addUserKnob {20 VoxelTransform} 7 | addUserKnob {4 shape l Shape M {Sphere Cube Diamond Plane}} 8 | addUserKnob {6 xplane l x -STARTLINE +HIDDEN} 9 | addUserKnob {6 yplane l y -STARTLINE +HIDDEN} 10 | addUserKnob {6 zplane l z -STARTLINE +HIDDEN} 11 | addUserKnob {13 center l Center} 12 | addUserKnob {6 world_space l "World Space" -STARTLINE} 13 | addUserKnob {7 shapesize l Size R 0 10} 14 | shapesize 0.5 15 | addUserKnob {18 scale l Scale} 16 | scale {1 1 1} 17 | addUserKnob {6 scale_panelDropped l "panel dropped state" -STARTLINE +HIDDEN} 18 | addUserKnob {7 pdensity l "Positive Density" t "Multiplier for the positive density values" R 0 100} 19 | pdensity 1 20 | addUserKnob {7 ndensity l "Negative Density" t "Multiplier for the negative density values" R 0 100} 21 | ndensity 1 22 | addUserKnob {7 padd l "Positive Add" t "Increase the positive value" R 0 100} 23 | addUserKnob {7 nadd l "Negative Add" t "Increase the negative value" R 0 100} 24 | addUserKnob {26 ""} 25 | addUserKnob {41 operation T ChannelMerge1.operation} 26 | addUserKnob {41 mix T ChannelMerge1.mix} 27 | addUserKnob {20 graphics l GPU} 28 | addUserKnob {41 "Local GPU: " T BlinkScript2.gpuName} 29 | addUserKnob {41 "Use GPU if Available" T BlinkScript2.useGPUIfAvailable} 30 | } 31 | Input { 32 | inputs 0 33 | name Input 34 | xpos 562 35 | ypos -108 36 | } 37 | Dot { 38 | name Dot9 39 | note_font_size 20 40 | xpos 596 41 | ypos -53 42 | } 43 | set N35489c00 [stack 0] 44 | add_layer {voxels voxels.x voxels.y voxels.z voxels.density} 45 | Shuffle { 46 | in2 voxels 47 | red red2 48 | green green2 49 | blue blue2 50 | name Shuffle1 51 | label " \[value in]" 52 | xpos 562 53 | ypos -6 54 | postage_stamp true 55 | } 56 | set N35489800 [stack 0] 57 | Dot { 58 | name Dot11 59 | note_font_size 20 60 | xpos 706 61 | ypos 34 62 | } 63 | BlinkScript { 64 | KernelDescription "1 \"VoxelTransform\" iterate pixelWise 354232abd4b87787704b45ded14d128e6ab984911e1d96996bcb02f1716fd247 2 \"voxels\" Read Point \"dst\" Write Point 1 \"M\" Float 16 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" 65 | EncodedSource "1 560 v7d+FffYZuYXrpANrf8U9gMUq0czvpPNBwqEzbF+EQ4nfF0MmAhi1FxmM35Q3zcaRlWrKTokEw310zbW4DugWYz4y3w8FJe/IzcFOWvZAYPoWa6xpXoOCvMAKVHs5fR7LqluJLeZ3tg3qYxMb+Fj03UPfaYFf5N/PSMIGkIF0CED4ipLmd1ELd+KbKKsJwagwcoiEHXEbOV+tiBIvi834XbRc1cbZB5OUyz1iTLdG4U3fofpM2mY0np9MNUdcVPQW/u0tENG8rSwOKbac9yRQKF48ule3kTNRg0mRkn3pOS8eXZSlKBWltmM6ANt01FxcuPiuwkkfmEqNOte4SGNvm6+LOx+KUqtXUq33THnOKDvjgOJFerj5Cc8JIVxG2Z7La83qvhK51HIolN9KiiXuRAVWDKTMk8+WbamS7Wfwm9h9OIM+TfybJWMN1Fv/vDW9jbN9E3cg9VZQgX/pz55zPWjXEFoki7oiPHHUGU2BAWffJiOzBjaVAF8Yds5Ombn5vH/wQuYtdgT97ivHL+mJpKZ+nXqxZHexXcCZQoaWuZz17o/zCuZaRDLnQPnGyhz49yByP15/xSFwIDzD4/giRa5P0XSnR8uzDtJmcFR0qtuQ9UZidfvmSCifVZyC/u2rNprrfINMbmenQK8CFeO/XXNAGfPMvSymS5lVUfO7rCJo4mnBrk2V+zsTvdxYS+B8sM6K7fj8mUXVUmjP4Y4eCfyyxZNc9aDUWz2fggvrNJKi6/bmqY8u13rshy4Y6Ym" 66 | rebuild "" 67 | group_VoxelTransform_M 1 68 | VoxelTransform_M { 69 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 0] 3]"}} 70 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 1] 3]"}} 71 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 2] 3]"}} 72 | {{"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 0]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 1]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 2]"} {"\[lindex \[lindex \[metadata vTransformMatrix frame] 3] 3]"}} 73 | } 74 | protectKernelWhenPublishing true 75 | name BlinkScript2 76 | xpos 672 77 | ypos 81 78 | } 79 | Dot { 80 | name Dot12 81 | note_font_size 20 82 | xpos 706 83 | ypos 149 84 | } 85 | push $N35489800 86 | Switch { 87 | inputs 2 88 | which {{parent.world_space}} 89 | name Switch2 90 | xpos 562 91 | ypos 145 92 | } 93 | Dot { 94 | name Dot1 95 | note_font_size 20 96 | xpos 596 97 | ypos 246 98 | } 99 | set N35488400 [stack 0] 100 | Dot { 101 | name Dot4 102 | note_font_size 20 103 | xpos 701 104 | ypos 246 105 | } 106 | set N35488000 [stack 0] 107 | Dot { 108 | name Dot6 109 | note_font_size 20 110 | xpos 811 111 | ypos 246 112 | } 113 | Expression { 114 | temp_name0 r_dist 115 | temp_expr0 "(r - center.x) * scale.r" 116 | temp_name1 g_dist 117 | temp_expr1 "(g - center.y) * scale.g" 118 | temp_name2 b_dist 119 | temp_expr2 "(b - center.z) * scale.b" 120 | temp_name3 dist 121 | temp_expr3 "r_dist * xplane + g_dist * yplane + b_dist * zplane" 122 | channel0 alpha 123 | expr0 "dist > 0 ? dist * pdensity + padd : dist * ndensity - nadd" 124 | channel1 none 125 | channel2 none 126 | name PLANE 127 | selected true 128 | xpos 777 129 | ypos 306 130 | } 131 | Dot { 132 | name Dot7 133 | note_font_size 20 134 | xpos 811 135 | ypos 441 136 | } 137 | push $N35488000 138 | Expression { 139 | temp_name0 r_dist 140 | temp_expr0 "((shapesize*scale.r) / 3 - abs(r - center.x))/(shapesize*scale.r)" 141 | temp_name1 g_dist 142 | temp_expr1 "((shapesize*scale.g) / 3 - abs(g - center.y))/(shapesize*scale.g)" 143 | temp_name2 b_dist 144 | temp_expr2 "((shapesize*scale.b) / 3 - abs(b - center.z))/(shapesize*scale.b)" 145 | temp_name3 dist 146 | temp_expr3 "r_dist + g_dist + b_dist" 147 | channel0 alpha 148 | expr0 "dist > 0 ? dist * pdensity + padd : dist * ndensity - nadd" 149 | channel1 none 150 | channel2 none 151 | name DIAMOND 152 | xpos 667 153 | ypos 306 154 | } 155 | Dot { 156 | name Dot5 157 | note_font_size 20 158 | xpos 701 159 | ypos 377 160 | } 161 | push $N35488400 162 | Expression { 163 | temp_name0 dx 164 | temp_expr0 "shapesize * scale.r - abs(r - center.x)" 165 | temp_name1 dy 166 | temp_expr1 "shapesize * scale.g - abs(g - center.y)" 167 | temp_name2 dz 168 | temp_expr2 "shapesize * scale.b - abs(b - center.z)" 169 | temp_name3 dist 170 | temp_expr3 "(min(min(dx, dy), dz))" 171 | channel0 alpha 172 | expr0 "dist > 0 ? dist * pdensity + padd : dist * ndensity - nadd" 173 | channel1 none 174 | channel2 none 175 | channel3 none 176 | name CUBE 177 | xpos 562 178 | ypos 306 179 | } 180 | push $N35488400 181 | Dot { 182 | name Dot2 183 | note_font_size 20 184 | xpos 489 185 | ypos 246 186 | } 187 | Expression { 188 | temp_name0 dist 189 | temp_expr0 "(shapesize - sqrt(((r - center.x)**2)/scale.r + ((g - center.y)**2)/scale.g + ((b - center.z)**2)/scale.b))" 190 | channel0 alpha 191 | expr0 "dist > 0 ? dist * pdensity + padd : dist * ndensity - nadd" 192 | channel1 none 193 | channel2 none 194 | channel3 none 195 | name SPHERE 196 | xpos 455 197 | ypos 306 198 | } 199 | Dot { 200 | name Dot3 201 | note_font_size 20 202 | xpos 489 203 | ypos 377 204 | } 205 | Switch { 206 | inputs 4 207 | which {{shape}} 208 | name Switch1 209 | xpos 562 210 | ypos 437 211 | } 212 | push $N35489c00 213 | Dot { 214 | name Dot8 215 | note_font_size 20 216 | xpos 379 217 | ypos -53 218 | } 219 | Dot { 220 | name Dot10 221 | note_font_size 20 222 | xpos 379 223 | ypos 524 224 | } 225 | ChannelMerge { 226 | inputs 2 227 | operation plus 228 | name ChannelMerge1 229 | xpos 562 230 | ypos 507 231 | } 232 | Output { 233 | name Output 234 | xpos 562 235 | ypos 596 236 | } 237 | end_group 238 | -------------------------------------------------------------------------------- /plugin/gizmos/V_Transform.gizmo: -------------------------------------------------------------------------------- 1 | #! C:/Program Files/Nuke9.0v1/nuke-9.0.1.dll -nx 2 | version 9.0 v1 3 | Gizmo { 4 | tile_color 0xc17939ff 5 | addUserKnob {20 VoxelTransform} 6 | addUserKnob {4 transform_type l Transform t "Apply the transformation to the data within the grid, or to move the grid itself." M {Grid Data ""}} 7 | addUserKnob {41 translate T LOCAL_TRANSFORM.translate} 8 | addUserKnob {41 rotate T LOCAL_TRANSFORM.rotate} 9 | addUserKnob {41 scaling l scale T LOCAL_TRANSFORM.scaling} 10 | addUserKnob {41 uniform_scale l "uniform scale" T LOCAL_TRANSFORM.uniform_scale} 11 | addUserKnob {41 skew T LOCAL_TRANSFORM.skew} 12 | addUserKnob {41 pivot T LOCAL_TRANSFORM.pivot} 13 | addUserKnob {20 graphics l GPU} 14 | addUserKnob {41 "Local GPU: " T BlinkScript2.gpuName} 15 | addUserKnob {41 "Use GPU if Available" T BlinkScript2.useGPUIfAvailable} 16 | addUserKnob {41 maxGPUMemory l "Percentage of GPU memory to use" T BlinkScript2.maxGPUMemory} 17 | addUserKnob {41 maxTileLines l "Percentage of image height per tile" T BlinkScript2.maxTileLines} 18 | } 19 | Input { 20 | inputs 0 21 | name Input 22 | xpos 440 23 | ypos -61 24 | } 25 | Dot { 26 | name Dot1 27 | note_font_size 20 28 | xpos 474 29 | ypos 5 30 | } 31 | set N32344c00 [stack 0] 32 | Dot { 33 | name Dot3 34 | note_font_size 20 35 | xpos 287 36 | ypos 5 37 | } 38 | set N32344800 [stack 0] 39 | Dot { 40 | name Dot4 41 | note_font_size 20 42 | xpos 287 43 | ypos 230 44 | } 45 | push $N32344800 46 | Dot { 47 | name Dot2 48 | note_font_size 20 49 | xpos 158 50 | ypos 5 51 | } 52 | add_layer {voxels voxels.x voxels.y voxels.z voxels.density} 53 | Shuffle { 54 | in voxels 55 | name Shuffle1 56 | label " \[value in]" 57 | xpos 124 58 | ypos 65 59 | postage_stamp true 60 | } 61 | BlinkScript { 62 | inputs 2 63 | KernelDescription "1 \"VoxelTransform\" iterate pixelWise 73755eb8ce3fd6809859f1a8ac29e3b2d93956899b8484b9465a984b991c7f1b 3 \"positions\" Read Point \"voxels\" Read Random \"dst\" Write Point 4 \"bbox_min\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"bbox_max\" Float 3 AAAAAAAAAAAAAAAAAAAAAA== \"resolution\" Int 3 AAAAAAAAAAAAAAAAAAAAAA== \"transform_M\" Float 16 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" 64 | EncodedSource "1 2364 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" 65 | rebuild "" 66 | VoxelTransform_bbox_min {{"\[lindex \[metadata bbox] 0]"} {"\[lindex \[metadata bbox] 1]"} {"\[lindex \[metadata bbox] 2]"}} 67 | VoxelTransform_bbox_max {{"\[lindex \[metadata bbox] 3]"} {"\[lindex \[metadata bbox] 4]"} {"\[lindex \[metadata bbox] 5]"}} 68 | VoxelTransform_resolution {{"\[lindex \[metadata resolution] 0]"} {"\[lindex \[metadata resolution] 1]"} {"\[lindex \[metadata resolution] 2]"}} 69 | VoxelTransform_transform_M { 70 | {{LOCAL_TRANSFORM.matrix} {LOCAL_TRANSFORM.matrix} {LOCAL_TRANSFORM.matrix} {LOCAL_TRANSFORM.matrix}} 71 | {{LOCAL_TRANSFORM.matrix} {LOCAL_TRANSFORM.matrix} {LOCAL_TRANSFORM.matrix} {LOCAL_TRANSFORM.matrix}} 72 | {{LOCAL_TRANSFORM.matrix} {LOCAL_TRANSFORM.matrix} {LOCAL_TRANSFORM.matrix} {LOCAL_TRANSFORM.matrix}} 73 | {{LOCAL_TRANSFORM.matrix} {LOCAL_TRANSFORM.matrix} {LOCAL_TRANSFORM.matrix} {LOCAL_TRANSFORM.matrix}} 74 | } 75 | protectKernelWhenPublishing true 76 | name BlinkScript2 77 | xpos 124 78 | ypos 220 79 | } 80 | Dot { 81 | name Dot5 82 | note_font_size 20 83 | xpos 158 84 | ypos 315 85 | } 86 | push $N32344c00 87 | NoOp { 88 | name METADATA_READ 89 | xpos 440 90 | ypos 82 91 | addUserKnob {20 User} 92 | addUserKnob {1 matrix} 93 | matrix "\[metadata vTransformMatrix frame]" 94 | } 95 | ModifyMetaData { 96 | metadata { 97 | {set vTransformMatrix "\[value LOCAL_TRANSFORM.world_matrix]"} 98 | } 99 | name ModifyMetaData2 100 | xpos 440 101 | ypos 226 102 | } 103 | Switch { 104 | inputs 2 105 | which {{transform_type}} 106 | name Switch1 107 | xpos 440 108 | ypos 311 109 | } 110 | Output { 111 | name Output2 112 | xpos 440 113 | ypos 393 114 | } 115 | Axis2 { 116 | inputs 0 117 | display off 118 | selectable false 119 | useMatrix true 120 | matrix { 121 | {{"\[lindex \[lindex \[python \{nuke.toNode('METADATA_READ')\['matrix'].value()\}] 0] 0]"} {"\[lindex \[lindex \[python \{nuke.toNode('METADATA_READ')\['matrix'].value()\}] 0] 1]"} {"\[lindex \[lindex \[python \{nuke.toNode('METADATA_READ')\['matrix'].value()\}] 0] 2]"} {"\[lindex \[lindex \[python \{nuke.toNode('METADATA_READ')\['matrix'].value()\}] 0] 3]"}} 122 | {{"\[lindex \[lindex \[python \{nuke.toNode('METADATA_READ')\['matrix'].value()\}] 1] 0]"} {"\[lindex \[lindex \[python \{nuke.toNode('METADATA_READ')\['matrix'].value()\}] 1] 1]"} {"\[lindex \[lindex \[python \{nuke.toNode('METADATA_READ')\['matrix'].value()\}] 1] 2]"} {"\[lindex \[lindex \[python \{nuke.toNode('METADATA_READ')\['matrix'].value()\}] 1] 3]"}} 123 | {{"\[lindex \[lindex \[python \{nuke.toNode('METADATA_READ')\['matrix'].value()\}] 2] 0]"} {"\[lindex \[lindex \[python \{nuke.toNode('METADATA_READ')\['matrix'].value()\}] 2] 1]"} {"\[lindex \[lindex \[python \{nuke.toNode('METADATA_READ')\['matrix'].value()\}] 2] 2]"} {"\[lindex \[lindex \[python \{nuke.toNode('METADATA_READ')\['matrix'].value()\}] 2] 3]"}} 124 | {{"\[lindex \[lindex \[python \{nuke.toNode('METADATA_READ')\['matrix'].value()\}] 3] 0]"} {"\[lindex \[lindex \[python \{nuke.toNode('METADATA_READ')\['matrix'].value()\}] 3] 1]"} {"\[lindex \[lindex \[python \{nuke.toNode('METADATA_READ')\['matrix'].value()\}] 3] 2]"} {"\[lindex \[lindex \[python \{nuke.toNode('METADATA_READ')\['matrix'].value()\}] 3] 3]"}} 125 | } 126 | name WORLD_TRANSFORM 127 | xpos 591 128 | ypos 63 129 | addUserKnob {20 "Ppos Locator"} 130 | addUserKnob {18 pointPosition l "Point Position"} 131 | pointPosition {0 0 0} 132 | addUserKnob {6 pointPosition_panelDropped l "panel dropped state" -STARTLINE +HIDDEN} 133 | } 134 | Axis2 { 135 | name LOCAL_TRANSFORM 136 | selected true 137 | xpos 591 138 | ypos 205 139 | addUserKnob {20 "Ppos Locator"} 140 | addUserKnob {18 pointPosition l "Point Position"} 141 | pointPosition {0 0 0} 142 | addUserKnob {6 pointPosition_panelDropped l "panel dropped state" -STARTLINE +HIDDEN} 143 | } 144 | end_group 145 | -------------------------------------------------------------------------------- /plugin/icons/MatteHue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MattRickS/VoxelRenderer/f3e1abf37091b9f5eeecce1500c155008adb5328/plugin/icons/MatteHue.png -------------------------------------------------------------------------------- /plugin/icons/V_Average.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MattRickS/VoxelRenderer/f3e1abf37091b9f5eeecce1500c155008adb5328/plugin/icons/V_Average.png -------------------------------------------------------------------------------- /plugin/icons/V_DirLight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MattRickS/VoxelRenderer/f3e1abf37091b9f5eeecce1500c155008adb5328/plugin/icons/V_DirLight.png -------------------------------------------------------------------------------- /plugin/icons/V_EnvLight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MattRickS/VoxelRenderer/f3e1abf37091b9f5eeecce1500c155008adb5328/plugin/icons/V_EnvLight.png -------------------------------------------------------------------------------- /plugin/icons/V_Erode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MattRickS/VoxelRenderer/f3e1abf37091b9f5eeecce1500c155008adb5328/plugin/icons/V_Erode.png -------------------------------------------------------------------------------- /plugin/icons/V_Grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MattRickS/VoxelRenderer/f3e1abf37091b9f5eeecce1500c155008adb5328/plugin/icons/V_Grid.png -------------------------------------------------------------------------------- /plugin/icons/V_Noise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MattRickS/VoxelRenderer/f3e1abf37091b9f5eeecce1500c155008adb5328/plugin/icons/V_Noise.png -------------------------------------------------------------------------------- /plugin/icons/V_Preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MattRickS/VoxelRenderer/f3e1abf37091b9f5eeecce1500c155008adb5328/plugin/icons/V_Preview.png -------------------------------------------------------------------------------- /plugin/icons/V_PtLight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MattRickS/VoxelRenderer/f3e1abf37091b9f5eeecce1500c155008adb5328/plugin/icons/V_PtLight.png -------------------------------------------------------------------------------- /plugin/icons/V_Render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MattRickS/VoxelRenderer/f3e1abf37091b9f5eeecce1500c155008adb5328/plugin/icons/V_Render.png -------------------------------------------------------------------------------- /plugin/icons/V_Shape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MattRickS/VoxelRenderer/f3e1abf37091b9f5eeecce1500c155008adb5328/plugin/icons/V_Shape.png -------------------------------------------------------------------------------- /plugin/icons/V_Transform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MattRickS/VoxelRenderer/f3e1abf37091b9f5eeecce1500c155008adb5328/plugin/icons/V_Transform.png -------------------------------------------------------------------------------- /plugin/init.py: -------------------------------------------------------------------------------- 1 | nuke.pluginAddPath("./gizmos") 2 | nuke.pluginAddPath("./icons") -------------------------------------------------------------------------------- /plugin/menu.py: -------------------------------------------------------------------------------- 1 | toolbar = nuke.toolbar("Nodes") 2 | m = toolbar.addMenu("MatteHue", icon="MatteHue.png") 3 | m.addCommand("Voxel/V_Average", "nuke.createNode('V_Average.gizmo')", icon="V_Average.png") 4 | m.addCommand("Voxel/V_Erode", "nuke.createNode('V_Erode.gizmo')", icon="V_Erode.png") 5 | m.addCommand("Voxel/V_Grid", "nuke.createNode('V_Grid.gizmo')", icon="V_Grid.png") 6 | m.addCommand("Voxel/V_Light Directional", "nuke.createNode('V_DirLight.gizmo')", icon="V_DirLight.png") 7 | m.addCommand("Voxel/V_Light Environment", "nuke.createNode('V_EnvLight.gizmo')", icon="V_EnvLight.png") 8 | m.addCommand("Voxel/V_Light Point", "nuke.createNode('V_PtLight.gizmo')", icon="V_PtLight.png") 9 | m.addCommand("Voxel/V_Noise", "nuke.createNode('V_Noise.gizmo')", icon="V_Noise.png") 10 | m.addCommand("Voxel/V_Preview", "nuke.createNode('V_Preview.gizmo')", icon="V_Preview.png") 11 | m.addCommand("Voxel/V_Render", "nuke.createNode('V_Render.gizmo')", icon="V_Render.png") 12 | m.addCommand("Voxel/V_Shape", "nuke.createNode('V_Shape.gizmo')", icon="V_Shape.png") 13 | m.addCommand("Voxel/V_Transform", "nuke.createNode('V_Transform.gizmo')", icon="V_Transform.png") -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | Code dump for the VoxelRenderer blink script used in Nuke. Code is rough and with little commenting, but will hopefully be cleaned up and properly documented over time. 2 | 3 | [Tool documentation](https://gizmosandgames.com/documentation/) 4 | [Nukepedia page](http://www.nukepedia.com/blink/3d/voxel-system) 5 | 6 | 7 | To add the nodes to nuke, add the "./plugin" directory to the nuke plugin path. This can be done by modifying NUKE_PATH or using `nuke.pluginAddPath()`. 8 | 9 | Check "./demo_scene.nk" for an example of the nodes in use. 10 | --------------------------------------------------------------------------------