From 00de597d19285b24f44e34c9dc1aa6cbc348ce99 Mon Sep 17 00:00:00 2001 From: Lubos Lenco Date: Wed, 22 Nov 2017 21:17:36 +0100 Subject: [PATCH] New render path system --- .../histogram_pass/histogram_pass.frag.glsl | 20 - Shaders/histogram_pass/histogram_pass.json | 15 - .../ssao_reproject_pass.frag.glsl | 130 -- .../ssao_reproject_pass.json | 47 - .../water_initial_spectrum.frag.glsl | 80 -- Shaders/water_pass/water_normals.frag.glsl | 31 - Shaders/water_pass/water_phase.frag.glsl | 36 - Shaders/water_pass/water_spectrum.frag.glsl | 60 - .../water_pass/water_subtransform.frag.glsl | 49 - .../renderpath/DynamicResolutionScale.hx | 2 +- Sources/armory/renderpath/HosekWilkie.hx | 1 - .../armory/renderpath/RenderPathCreator.hx | 1107 +++++++++++++++++ Sources/armory/trait/internal/DebugConsole.hx | 20 +- Sources/armory/trait/internal/DebugDraw.hx | 2 +- Sources/armory/trait/internal/SpaceArmory.hx | 16 +- blender/arm/exporter.py | 12 +- blender/arm/handlers.py | 24 +- blender/arm/make.py | 10 +- blender/arm/make_logic.py | 2 +- blender/arm/make_renderer.py | 622 --------- blender/arm/make_renderpath.py | 1080 +++------------- blender/arm/make_world.py | 4 +- blender/arm/material/mat_utils.py | 5 +- blender/arm/nodes_renderpath.py | 1052 ---------------- blender/arm/props.py | 9 +- blender/arm/props_renderpath.py | 273 +++- blender/arm/props_ui.py | 22 +- blender/arm/utils.py | 6 + blender/arm/write_data.py | 20 +- blender/data/arm_data.blend | Bin 190292 -> 96980 bytes blender/start.py | 6 - 31 files changed, 1603 insertions(+), 3160 deletions(-) delete mode 100644 Shaders/histogram_pass/histogram_pass.frag.glsl delete mode 100644 Shaders/histogram_pass/histogram_pass.json delete mode 100644 Shaders/ssao_reproject_pass/ssao_reproject_pass.frag.glsl delete mode 100755 Shaders/ssao_reproject_pass/ssao_reproject_pass.json delete mode 100755 Shaders/water_pass/water_initial_spectrum.frag.glsl delete mode 100644 Shaders/water_pass/water_normals.frag.glsl delete mode 100755 Shaders/water_pass/water_phase.frag.glsl delete mode 100755 Shaders/water_pass/water_spectrum.frag.glsl delete mode 100755 Shaders/water_pass/water_subtransform.frag.glsl create mode 100644 Sources/armory/renderpath/RenderPathCreator.hx delete mode 100644 blender/arm/make_renderer.py delete mode 100755 blender/arm/nodes_renderpath.py diff --git a/Shaders/histogram_pass/histogram_pass.frag.glsl b/Shaders/histogram_pass/histogram_pass.frag.glsl deleted file mode 100644 index 4fcaf5bc..00000000 --- a/Shaders/histogram_pass/histogram_pass.frag.glsl +++ /dev/null @@ -1,20 +0,0 @@ -#version 450 - -#ifdef GL_ES -precision mediump float; -#endif - -uniform sampler2D tex; - -in vec2 texCoord; - -out vec4 fragColor; - -void main() { - vec3 color = texture(tex, texCoord).rgb; - // const vec3 W = vec3(0.2125, 0.7154, 0.0721); - float luminance = dot(color, vec3(0.30, 0.59, 0.11)); - fragColor.r = luminance; - // Gen mipmaps - // To 64x1 1D histogram -} diff --git a/Shaders/histogram_pass/histogram_pass.json b/Shaders/histogram_pass/histogram_pass.json deleted file mode 100644 index 5277dcec..00000000 --- a/Shaders/histogram_pass/histogram_pass.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "contexts": [ - { - "name": "histogram_pass", - "depth_write": false, - "compare_mode": "always", - "cull_mode": "none", - "links": [], - "texture_params": [], - "vertex_shader": "histogram_pass.vert.glsl", - "vertex_shader_path": "../include/pass.vert.glsl", - "fragment_shader": "histogram_pass.frag.glsl" - } - ] -} diff --git a/Shaders/ssao_reproject_pass/ssao_reproject_pass.frag.glsl b/Shaders/ssao_reproject_pass/ssao_reproject_pass.frag.glsl deleted file mode 100644 index ec21e2dc..00000000 --- a/Shaders/ssao_reproject_pass/ssao_reproject_pass.frag.glsl +++ /dev/null @@ -1,130 +0,0 @@ -#version 450 - -#ifdef GL_ES -precision mediump float; -#endif - -#include "../compiled.glsl" -#include "../std/gbuffer.glsl" - -uniform sampler2D gbufferD; -uniform sampler2D gbuffer0; -uniform sampler2D sveloc; -uniform sampler2D slast; -uniform sampler2D snoise; - -uniform mat4 invVP; -uniform vec3 eye; -uniform vec3 eyeLook; -uniform vec2 screenSize; -uniform vec2 aspectRatio; -uniform vec2 cameraProj; - -in vec2 texCoord; -in vec3 viewRay; -out vec4 fragColor; - -float doAO(vec2 kernelVec, vec2 randomVec, mat2 rotMat, vec3 currentPos, vec3 n, float currentDistance) { - kernelVec.xy *= aspectRatio; - float radius = ssaoSize * randomVec.y; - kernelVec.xy = ((rotMat * kernelVec.xy) / currentDistance) * radius; - vec2 coord = texCoord + kernelVec.xy; - float depth = texture(gbufferD, coord).r * 2.0 - 1.0; - vec3 pos = getPosNoEye(eyeLook, viewRay, depth, cameraProj) - currentPos; - - float angle = dot(pos, n); - // angle *= step(0.3, angle / length(pos)); // Fix intersect - angle *= step(0.1, angle / length(pos)); - angle -= currentDistance * 0.001; - angle = max(0.0, angle); - // angle /= dot(pos, pos) / min(currentDistance * 0.25, 1.0) + 0.00001; // Fix darkening - angle /= dot(pos, pos) / min(currentDistance * 0.25, 1.0) + 0.001; - return angle; -} - -void main() { - float depth = texture(gbufferD, texCoord).r * 2.0 - 1.0; - if (depth == 1.0) { - fragColor.r = 1.0; - return; - } - - const int kernelSize = 12; - const vec2 kernel0 = vec2(1.0, 0.0); - const vec2 kernel1 = vec2(0.8660254, 0.4999999); - const vec2 kernel2 = vec2(0.5, 0.8660254); - const vec2 kernel3 = vec2(0.0, 1.0); - const vec2 kernel4 = vec2(-0.4999999, 0.8660254); - const vec2 kernel5 = vec2(-0.8660254, 0.5); - const vec2 kernel6 = vec2(-1.0, 0.0); - const vec2 kernel7 = vec2(-0.8660254, -0.4999999); - const vec2 kernel8 = vec2(-0.5, -0.8660254); - const vec2 kernel9 = vec2(0.0, -1.0); - const vec2 kernel10 = vec2(0.4999999, -0.8660254); - const vec2 kernel11 = vec2(0.8660254, -0.5); - // const vec2 kernel0 = vec2(1.0,0.0); - // const vec2 kernel1 = vec2(0.9510565,0.3090169); - // const vec2 kernel2 = vec2(0.8090169,0.5877852); - // const vec2 kernel3 = vec2(0.5877852,0.8090169); - // const vec2 kernel4 = vec2(0.3090169,0.9510565); - // const vec2 kernel5 = vec2(0.0,1.0); - // const vec2 kernel6 = vec2(-0.3090169,0.9510565); - // const vec2 kernel7 = vec2(-0.5877852,0.8090169); - // const vec2 kernel8 = vec2(-0.8090169,0.5877852); - // const vec2 kernel9 = vec2(-0.9510565,0.3090169); - // const vec2 kernel10 = vec2(-1,0); - // const vec2 kernel11 = vec2(-0.9510565,-0.3090169); - // const vec2 kernel12 = vec2(-0.8090169,-0.5877852); - // const vec2 kernel13 = vec2(-0.5877852,-0.8090169); - // const vec2 kernel14 = vec2(-0.3090169,-0.9510565); - // const vec2 kernel15 = vec2(0.0,-1.0); - // const vec2 kernel16 = vec2(0.3090169,-0.9510565); - // const vec2 kernel17 = vec2(0.5877852,-0.8090169); - // const vec2 kernel18 = vec2(0.8090169,-0.5877852); - // const vec2 kernel19 = vec2(0.9510565,-0.3090169); - - vec2 enc = texture(gbuffer0, texCoord).rg; - vec3 n; - n.z = 1.0 - abs(enc.x) - abs(enc.y); - n.xy = n.z >= 0.0 ? enc.xy : octahedronWrap(enc.xy); - n = normalize(n); - - vec3 currentPos = getPosNoEye(eyeLook, viewRay, depth, cameraProj); - float currentDistance = length(currentPos); - - vec2 randomVec = texture(snoise, (texCoord * screenSize) / 8.0).xy; - randomVec = randomVec * 2.0 - 1.0; - mat2 rotMat = mat2(vec2(cos(randomVec.x * PI), -sin(randomVec.x * PI)), - vec2(sin(randomVec.x * PI), cos(randomVec.x * PI))); - - // for (int i = 0; i < kernelSize; i++) { - fragColor.r = doAO(kernel0, randomVec, rotMat, currentPos, n, currentDistance); - fragColor.r += doAO(kernel1, randomVec, rotMat, currentPos, n, currentDistance); - fragColor.r += doAO(kernel2, randomVec, rotMat, currentPos, n, currentDistance); - fragColor.r += doAO(kernel3, randomVec, rotMat, currentPos, n, currentDistance); - fragColor.r += doAO(kernel4, randomVec, rotMat, currentPos, n, currentDistance); - fragColor.r += doAO(kernel5, randomVec, rotMat, currentPos, n, currentDistance); - fragColor.r += doAO(kernel6, randomVec, rotMat, currentPos, n, currentDistance); - fragColor.r += doAO(kernel7, randomVec, rotMat, currentPos, n, currentDistance); - fragColor.r += doAO(kernel8, randomVec, rotMat, currentPos, n, currentDistance); - fragColor.r += doAO(kernel9, randomVec, rotMat, currentPos, n, currentDistance); - fragColor.r += doAO(kernel10, randomVec, rotMat, currentPos, n, currentDistance); - fragColor.r += doAO(kernel11, randomVec, rotMat, currentPos, n, currentDistance); - // fragColor.r += doAO(kernel12, randomVec, rotMat, currentPos, n, currentDistance); - // fragColor.r += doAO(kernel13, randomVec, rotMat, currentPos, n, currentDistance); - // fragColor.r += doAO(kernel14, randomVec, rotMat, currentPos, n, currentDistance); - // fragColor.r += doAO(kernel15, randomVec, rotMat, currentPos, n, currentDistance); - // fragColor.r += doAO(kernel16, randomVec, rotMat, currentPos, n, currentDistance); - // fragColor.r += doAO(kernel17, randomVec, rotMat, currentPos, n, currentDistance); - // fragColor.r += doAO(kernel18, randomVec, rotMat, currentPos, n, currentDistance); - // fragColor.r += doAO(kernel19, randomVec, rotMat, currentPos, n, currentDistance); - // } - - fragColor.r *= ssaoStrength / kernelSize; - fragColor.r = max(0.0, 1.0 - fragColor.r); - - // Velocity is assumed to be calculated for motion blur, so we need to inverse it for reprojection - vec2 velocity = -textureLod(sveloc, texCoord, 0.0).rg; - float last = texture(slast, texCoord + velocity).r; - fragColor.r = (fragColor.r + last) * 0.5; -} diff --git a/Shaders/ssao_reproject_pass/ssao_reproject_pass.json b/Shaders/ssao_reproject_pass/ssao_reproject_pass.json deleted file mode 100755 index 6892e93e..00000000 --- a/Shaders/ssao_reproject_pass/ssao_reproject_pass.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "contexts": [ - { - "name": "ssao_reproject_pass", - "color_write_alpha": false, - "color_write_green": false, - "color_write_blue": false, - "depth_write": false, - "compare_mode": "always", - "cull_mode": "none", - "links": [ - { - "name": "snoise", - "link": "_noise8" - }, - { - "name": "invVP", - "link": "_inverseViewProjectionMatrix" - }, - { - "name": "eye", - "link": "_cameraPosition" - }, - { - "name": "eyeLook", - "link": "_cameraLook" - }, - { - "name": "screenSize", - "link": "_screenSize" - }, - { - "name": "aspectRatio", - "link": "_aspectRatio" - }, - { - "name": "cameraProj", - "link": "_cameraPlaneProj" - } - ], - "texture_params": [], - "vertex_shader": "ssao_reproject_pass.vert.glsl", - "vertex_shader_path": "../include/pass_viewray.vert.glsl", - "fragment_shader": "ssao_reproject_pass.frag.glsl" - } - ] -} diff --git a/Shaders/water_pass/water_initial_spectrum.frag.glsl b/Shaders/water_pass/water_initial_spectrum.frag.glsl deleted file mode 100755 index 4f84633a..00000000 --- a/Shaders/water_pass/water_initial_spectrum.frag.glsl +++ /dev/null @@ -1,80 +0,0 @@ -// Based on work by David Li(http://david.li/waves) -#version 450 - -#ifdef GL_ES -precision mediump float; -#endif - -in vec2 texCoord; -out vec4 fragColor; - -const float PI = 3.14159265359; -const float G = 9.81; -const float KM = 370.0; -const float CM = 0.23; - -const vec2 wind = vec2(10.0, 10.0); -const float resolution = 512.0; -const float size = 250.0; - -float square(float x) { - return x * x; -} - -float omega(float k) { - return sqrt(G * k * (1.0 + square(k / KM))); -} - -float tanh(float x) { - return (1.0 - exp(-2.0 * x)) / (1.0 + exp(-2.0 * x)); -} - -void main() { - vec2 coordinates = texCoord.xy * resolution;//gl_FragCoord.xy - 0.5; - - float n = (coordinates.x < resolution * 0.5) ? coordinates.x : coordinates.x - resolution; - float m = (coordinates.y < resolution * 0.5) ? coordinates.y : coordinates.y - resolution; - - vec2 K = (2.0 * PI * vec2(n, m)) / size; - float k = length(K); - - float l_wind = length(wind); - - float Omega = 0.84; - float kp = G * square(Omega / l_wind); - - float c = omega(k) / k; - float cp = omega(kp) / kp; - - float Lpm = exp(-1.25 * square(kp / k)); - float gamma = 1.7; - float sigma = 0.08 * (1.0 + 4.0 * pow(Omega, -3.0)); - float Gamma = exp(-square(sqrt(k / kp) - 1.0) / 2.0 * square(sigma)); - float Jp = pow(gamma, Gamma); - float Fp = Lpm * Jp * exp(-Omega / sqrt(10.0) * (sqrt(k / kp) - 1.0)); - float alphap = 0.006 * sqrt(Omega); - float Bl = 0.5 * alphap * cp / c * Fp; - - float z0 = 0.000037 * square(l_wind) / G * pow(l_wind / cp, 0.9); - float uStar = 0.41 * l_wind / log(10.0 / z0); - float alpham = 0.01 * ((uStar < CM) ? (1.0 + log(uStar / CM)) : (1.0 + 3.0 * log(uStar / CM))); - float Fm = exp(-0.25 * square(k / KM - 1.0)); - float Bh = 0.5 * alpham * CM / c * Fm * Lpm; - - float a0 = log(2.0) / 4.0; - float am = 0.13 * uStar / CM; - float Delta = tanh(a0 + 4.0 * pow(c / cp, 2.5) + am * pow(CM / c, 2.5)); - - float cosPhi = dot(normalize(wind), normalize(K)); - - float S = (1.0 / (2.0 * PI)) * pow(k, -4.0) * (Bl + Bh) * (1.0 + Delta * (2.0 * cosPhi * cosPhi - 1.0)); - - float dk = 2.0 * PI / size; - float h = sqrt(S / 2.0) * dk; - - if (K.x == 0.0 && K.y == 0.0) { - h = 0.0; //no DC term - } - fragColor = vec4(h, 0.0, 0.0, 0.0); -} - \ No newline at end of file diff --git a/Shaders/water_pass/water_normals.frag.glsl b/Shaders/water_pass/water_normals.frag.glsl deleted file mode 100644 index d53a92c8..00000000 --- a/Shaders/water_pass/water_normals.frag.glsl +++ /dev/null @@ -1,31 +0,0 @@ -// Based on work by David Li(http://david.li/waves) -#version 450 - -#ifdef GL_ES -precision mediump float; -#endif - -in vec2 texCoord; -out vec4 fragColor; - -uniform sampler2D texDisplacement; -const float resolution = 512.0; -const float size = 250.0; - -void main() { - float texel = 1.0 / resolution; - float texelSize = size / resolution; - - vec3 center = texture(texDisplacement, texCoord).rgb; - vec3 right = vec3(texelSize, 0.0, 0.0) + texture(texDisplacement, texCoord + vec2(texel, 0.0)).rgb - center; - vec3 left = vec3(-texelSize, 0.0, 0.0) + texture(texDisplacement, texCoord + vec2(-texel, 0.0)).rgb - center; - vec3 top = vec3(0.0, 0.0, -texelSize) + texture(texDisplacement, texCoord + vec2(0.0, -texel)).rgb - center; - vec3 bottom = vec3(0.0, 0.0, texelSize) + texture(texDisplacement, texCoord + vec2(0.0, texel)).rgb - center; - - vec3 topRight = cross(right, top); - vec3 topLeft = cross(top, left); - vec3 bottomLeft = cross(left, bottom); - vec3 bottomRight = cross(bottom, right); - - fragColor = vec4(normalize(topRight + topLeft + bottomLeft + bottomRight), 1.0); -} diff --git a/Shaders/water_pass/water_phase.frag.glsl b/Shaders/water_pass/water_phase.frag.glsl deleted file mode 100755 index 40c0294d..00000000 --- a/Shaders/water_pass/water_phase.frag.glsl +++ /dev/null @@ -1,36 +0,0 @@ -// Based on work by David Li(http://david.li/waves) -#version 450 - -#ifdef GL_ES -precision mediump float; -#endif - -const float PI = 3.14159265359; -const float G = 9.81; -const float KM = 370.0; - -in vec2 texCoord; -out vec4 fragColor; - -uniform sampler2D u_phases; -uniform float u_deltaTime; - -const float resolution = 512.0; -const float size = 250.0; - -float omega(float k) { - return sqrt(G * k * (1.0 + k * k / KM * KM)); -} - -void main() { - vec2 coordinates = texCoord * resolution;// gl_FragCoord.xy - 0.5; - float n = (coordinates.x < resolution * 0.5) ? coordinates.x : coordinates.x - resolution; - float m = (coordinates.y < resolution * 0.5) ? coordinates.y : coordinates.y - resolution; - vec2 waveVector = (2.0 * PI * vec2(n, m)) / size; - - float phase = texture(u_phases, texCoord).r; - float deltaPhase = omega(length(waveVector)) * u_deltaTime; - phase = mod(phase + deltaPhase, 2.0 * PI); - - fragColor = vec4(phase, 0.0, 0.0, 0.0); -} diff --git a/Shaders/water_pass/water_spectrum.frag.glsl b/Shaders/water_pass/water_spectrum.frag.glsl deleted file mode 100755 index 89b91d8b..00000000 --- a/Shaders/water_pass/water_spectrum.frag.glsl +++ /dev/null @@ -1,60 +0,0 @@ -// Based on work by David Li(http://david.li/waves) -#version 450 - -#ifdef GL_ES -precision mediump float; -#endif - -const float PI = 3.14159265359; -const float G = 9.81; -const float KM = 370.0; - -const float size = 250.0; -const float resolution = 512.0; -const float choppiness = 1.5; - -uniform sampler2D texPhases; -uniform sampler2D texInitialSpectrum; - -in vec2 texCoord; -out vec4 fragColor; - -vec2 multiplyComplex(vec2 a, vec2 b) { - return vec2(a[0] * b[0] - a[1] * b[1], a[1] * b[0] + a[0] * b[1]); -} - -vec2 multiplyByI(vec2 z) { - return vec2(-z[1], z[0]); -} - -float omega(float k) { - return sqrt(G * k * (1.0 + k * k / KM * KM)); -} - -void main() { - vec2 coordinates = texCoord * resolution;// gl_FragCoord.xy - 0.5; - float n = (coordinates.x < resolution * 0.5) ? coordinates.x : coordinates.x - resolution; - float m = (coordinates.y < resolution * 0.5) ? coordinates.y : coordinates.y - resolution; - vec2 waveVector = (2.0 * PI * vec2(n, m)) / size; - - float phase = texture2D(texPhases, texCoord).r; - vec2 phaseVector = vec2(cos(phase), sin(phase)); - - vec2 h0 = texture2D(texInitialSpectrum, texCoord).rg; - vec2 h0Star = texture2D(texInitialSpectrum, vec2(1.0 - texCoord + 1.0 / resolution)).rg; - h0Star.y *= -1.0; - - vec2 h = multiplyComplex(h0, phaseVector) + multiplyComplex(h0Star, vec2(phaseVector.x, -phaseVector.y)); - - vec2 hX = -multiplyByI(h * (waveVector.x / length(waveVector))) * choppiness; - vec2 hZ = -multiplyByI(h * (waveVector.y / length(waveVector))) * choppiness; - - // No DC term - if (waveVector.x == 0.0 && waveVector.y == 0.0) { - h = vec2(0.0); - hX = vec2(0.0); - hZ = vec2(0.0); - } - - fragColor = vec4(hX + multiplyByI(h), hZ); -} diff --git a/Shaders/water_pass/water_subtransform.frag.glsl b/Shaders/water_pass/water_subtransform.frag.glsl deleted file mode 100755 index 1373c715..00000000 --- a/Shaders/water_pass/water_subtransform.frag.glsl +++ /dev/null @@ -1,49 +0,0 @@ -// Based on work by David Li(http://david.li/waves) -// GPU FFT using a Stockham formulation -#version 450 - -#ifdef GL_ES -precision mediump float; -#endif - -uniform sampler2D texInput; - -in vec2 texCoord; -out vec4 fragColor; - -const float PI = 3.14159265359; -const float transformSize = 512.0; -const float texSize = 512.0; -const float subtransformSize = 250.0; - -vec2 multiplyComplex(vec2 a, vec2 b) { - return vec2(a[0] * b[0] - a[1] * b[1], a[1] * b[0] + a[0] * b[1]); -} - -void main() { - // #ifdef HORIZONTAL - // float index = texCoord.x * transformSize - 0.5; - // #else - float index = texCoord.y * transformSize - 0.5; - // #endif - - float evenIndex = floor(index / subtransformSize) * (subtransformSize * 0.5) + mod(index, subtransformSize * 0.5); - - //transform two complex sequences simultaneously - // #ifdef HORIZONTAL - // vec4 even = texture(texInput, vec2(evenIndex + 0.5, texCoord.y * texSize) / transformSize); - // vec4 odd = texture(texInput, vec2(evenIndex + transformSize * 0.5 + 0.5, texCoord.y * texSize) / transformSize); - // #else - // gl_FragCoord.x / texCoord.x * texSize - vec4 even = texture(texInput, vec2(texCoord.x * texSize, evenIndex + 0.5) / transformSize); - vec4 odd = texture(texInput, vec2(texCoord.x * texSize, evenIndex + transformSize * 0.5 + 0.5) / transformSize); - // #endif - - float twiddleArgument = -2.0 * PI * (index / subtransformSize); - vec2 twiddle = vec2(cos(twiddleArgument), sin(twiddleArgument)); - - vec2 outputA = even.xy + multiplyComplex(twiddle, odd.xy); - vec2 outputB = even.zw + multiplyComplex(twiddle, odd.zw); - - fragColor = vec4(outputA, outputB); -} diff --git a/Sources/armory/renderpath/DynamicResolutionScale.hx b/Sources/armory/renderpath/DynamicResolutionScale.hx index f4e5a8d5..d0dc5dd7 100644 --- a/Sources/armory/renderpath/DynamicResolutionScale.hx +++ b/Sources/armory/renderpath/DynamicResolutionScale.hx @@ -1,6 +1,6 @@ package armory.renderpath; -import iron.data.RenderPath; +import iron.RenderPath; class DynamicResolutionScale { diff --git a/Sources/armory/renderpath/HosekWilkie.hx b/Sources/armory/renderpath/HosekWilkie.hx index b6aa9759..581b8597 100644 --- a/Sources/armory/renderpath/HosekWilkie.hx +++ b/Sources/armory/renderpath/HosekWilkie.hx @@ -4,7 +4,6 @@ package armory.renderpath; import kha.math.FastVector3; -import iron.data.RenderPath; import iron.data.WorldData; class HosekWilkieRadianceData { diff --git a/Sources/armory/renderpath/RenderPathCreator.hx b/Sources/armory/renderpath/RenderPathCreator.hx new file mode 100644 index 00000000..80391ba5 --- /dev/null +++ b/Sources/armory/renderpath/RenderPathCreator.hx @@ -0,0 +1,1107 @@ +package armory.renderpath; + +import iron.RenderPath; + +class RenderPathCreator { + + static var path:RenderPath; + + public static function get():RenderPath { + path = new RenderPath(); + init(); + path.commands = commands; + return path; + } + + #if (rp_renderer == "Forward") + static function init() { + // #if rp_shadowmap // Auto-created + // { + // var size = getShadowmapSize(); + // var t = new RenderTargetRaw(); + // t.name = "shadowMap"; + // t.width = size; + // t.height = size; + // t.format = "DEPTH16"; + // path.createRenderTarget(t); + // } + // #end + + #if (rp_background == "World") + { + path.loadMaterial("_worldMaterial"); + } + #end + + #if rp_render_to_texture + { + path.createDepthBuffer("main", "DEPTH24"); + + var t = new RenderTargetRaw(); + t.name = "lbuf"; + t.width = 0; + t.height = 0; + t.format = getHdrFormat(); + t.displayp = getDisplayp(); + var ss = getSuperSampling(); + if (ss != 1) t.scale = ss; + t.depth_buffer = "main"; + path.createRenderTarget(t); + + #if rp_compositornodes + { + path.loadShader("compositor_pass/compositor_pass/compositor_pass"); + } + #else + { + path.loadShader("copy_pass/copy_pass/copy_pass"); + } + #end + } + #end + + #if (rp_translucency) + { + initTranslucency(); + } + #end + + #if (rp_gi != "Off") + { + initGI(); + } + #end + } + + static function commands() { + + #if rp_shadowmap + { + var faces = path.getLamp(path.currentLampIndex).data.raw.shadowmap_cube ? 6 : 1; + for (i in 0...faces) { + path.setTarget("shadowMap"); + path.clearTarget(null, 1.0); + path.drawMeshes("shadowmap"); + } + } + #end + + #if (rp_gi != "Off") + { + if (path.voxelize()) { + path.clearImage("voxels", 0x00000000); + path.setTarget(""); + var res = getVoxelRes(); + path.setViewport(res, res); + path.bindTarget("voxels", "voxels"); + #if rp_shadowmap + { + path.bindTarget("shadowMap", "shadowMap"); + } + #end + path.drawMeshes("voxel"); + path.generateMipmaps(["voxels"]); + } + } + #end + + #if rp_render_to_texture + { + path.setTarget("lbuf"); + } + #else + { + path.setTarget(""); + } + #end + + #if (rp_background == "Clear") + { + path.clearTarget(-1, 1.0); + } + #else + { + path.clearTarget(null, 1.0); + } + #end + + #if rp_depthprepass + { + path.drawMeshes("depth"); + } + #end + + #if rp_shadowmap + { + path.bindTarget("shadowMap", "shadowMap"); + } + #end + + #if (rp_gi != "Off") + { + path.bindTarget("voxels", "voxels"); + } + #end + + function drawMeshes() { + path.drawMeshes("mesh"); + #if (rp_background == "World") + { + path.drawSkydome("_worldMaterial"); + } + #end + + #if rp_translucency + { + drawTranslucency("lbuf"); + } + #end + } + + #if rp_stereo + { + path.drawStereo(drawMeshes); + } + #else + { + drawMeshes(); + } + #end + + #if rp_render_to_texture + { + path.setTarget(""); + path.bindTarget("lbuf", "tex"); + + #if rp_compositornodes + { + path.drawShader("compositor_pass/compositor_pass/compositor_pass"); + } + #else + { + path.drawShader("copy_pass/copy_pass/copy_pass"); + } + #end + } + #end + + #if rp_overlays + { + path.clearTarget(null, 1.0); + path.drawMeshes("overlay"); + } + #end + } + #end + + + + + + #if (rp_renderer == "Deferred") + static function init() { + #if (rp_background == "World") + { + path.loadMaterial("_worldMaterial"); + } + #end + + #if (rp_translucency) + { + initTranslucency(); + } + #end + + #if (rp_gi != "Off") + { + initGI(); + } + #end + + { + path.createDepthBuffer("main", "DEPTH24"); + + var t = new RenderTargetRaw(); + t.name = "tex"; + t.width = 0; + t.height = 0; + t.displayp = getDisplayp(); + t.format = getHdrFormat(); + var ss = getSuperSampling(); + if (ss != 1) t.scale = ss; + t.depth_buffer = "main"; + #if rp_autoexposure + t.mipmaps = true; + #end + path.createRenderTarget(t); + } + + { + var t = new RenderTargetRaw(); + t.name = "buf"; + t.width = 0; + t.height = 0; + t.displayp = getDisplayp(); + t.format = getHdrFormat(); + var ss = getSuperSampling(); + if (ss != 1) t.scale = ss; + path.createRenderTarget(t); + } + + { + path.createDepthBuffer("main", "DEPTH24"); + + var t = new RenderTargetRaw(); + t.name = "gbuffer0"; + t.width = 0; + t.height = 0; + t.displayp = getDisplayp(); + t.format = "RGBA64"; + var ss = getSuperSampling(); + if (ss != 1) t.scale = ss; + t.depth_buffer = "main"; + path.createRenderTarget(t); + } + + { + var t = new RenderTargetRaw(); + t.name = "gbuffer1"; + t.width = 0; + t.height = 0; + t.displayp = getDisplayp(); + t.format = "RGBA64"; + var ss = getSuperSampling(); + if (ss != 1) t.scale = ss; + path.createRenderTarget(t); + } + + #if arm_veloc + { + var t = new RenderTargetRaw(); + t.name = "gbuffer2"; + t.width = 0; + t.height = 0; + t.displayp = getDisplayp(); + t.format = "RGBA64"; + var ss = getSuperSampling(); + if (ss != 1) t.scale = ss; + path.createRenderTarget(t); + } + + { + var t = new RenderTargetRaw(); + t.name = "taa"; + t.width = 0; + t.height = 0; + t.displayp = getDisplayp(); + t.format = "RGBA32"; + var ss = getSuperSampling(); + if (ss != 1) t.scale = ss; + path.createRenderTarget(t); + } + #end + + path.loadShader("deferred_indirect/deferred_indirect/deferred_indirect"); + path.loadShader("deferred_light/deferred_light/deferred_light"); + path.loadShader("deferred_light_quad/deferred_light_quad/deferred_light_quad"); + + #if ((rp_ssgi == "RTGI") || (rp_ssgi == "RTAO")) + { + path.loadShader("ssgi_pass/ssgi_pass/ssgi_pass"); + path.loadShader("ssgi_blur_pass/ssgi_blur_pass/ssgi_blur_pass_x"); + path.loadShader("ssgi_blur_pass/ssgi_blur_pass/ssgi_blur_pass_y"); + } + #elseif (rp_ssgi == "SSAO") + { + path.loadShader("ssao_pass/ssao_pass/ssao_pass"); + path.loadShader("blur_edge_pass/blur_edge_pass/blur_edge_pass_x"); + path.loadShader("blur_edge_pass/blur_edge_pass/blur_edge_pass_y"); + } + #end + + #if ((rp_ssgi != "Off") || (rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA")) + { + var t = new RenderTargetRaw(); + t.name = "bufa"; + t.width = 0; + t.height = 0; + t.displayp = getDisplayp(); + t.format = "RGBA32"; + var ss = getSuperSampling(); + if (ss != 1) t.scale = ss; + path.createRenderTarget(t); + } + { + var t = new RenderTargetRaw(); + t.name = "bufb"; + t.width = 0; + t.height = 0; + t.displayp = getDisplayp(); + t.format = "RGBA32"; + var ss = getSuperSampling(); + if (ss != 1) t.scale = ss; + path.createRenderTarget(t); + } + #end + + #if rp_rendercapture + { + var t = new RenderTargetRaw(); + t.name = "capture"; + t.width = 0; + t.height = 0; + t.format = getRenderCaptureFormat(); + path.createRenderTarget(t); + } + #end + + #if rp_compositornodes + { + path.loadShader("compositor_pass/compositor_pass/compositor_pass"); + } + #end + + #if ((!rp_compositornodes) || (rp_antialiasing == "TAA") || (rp_rendercapture) || (rp_motionblur == 'Camera') || (rp_motionblur == 'Object')) + { + path.loadShader("copy_pass/copy_pass/copy_pass"); + } + #end + + #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA")) + { + path.loadShader("smaa_edge_detect/smaa_edge_detect/smaa_edge_detect"); + path.loadShader("smaa_blend_weight/smaa_blend_weight/smaa_blend_weight"); + path.loadShader("smaa_neighborhood_blend/smaa_neighborhood_blend/smaa_neighborhood_blend"); + + #if (rp_antialiasing == "TAA") + { + path.loadShader("taa_pass/taa_pass/taa_pass"); + } + #end + } + #end + + #if (rp_supersampling == 4) + { + path.loadShader("supersample_resolve/supersample_resolve/supersample_resolve"); + } + #end + + #if rp_volumetriclight + { + path.loadShader("volumetric_light_quad/volumetric_light_quad/volumetric_light_quad"); + path.loadShader("volumetric_light/volumetric_light/volumetric_light"); + path.loadShader("blur_edge_pass/blur_edge_pass/blur_edge_pass_x"); + path.loadShader("blur_edge_pass/blur_edge_pass/blur_edge_pass_y_blend_add"); + } + #end + + #if rp_ocean + { + path.loadShader("water_pass/water_pass/water_pass"); + } + #end + + #if rp_bloom + { + var t = new RenderTargetRaw(); + t.name = "bloomtex"; + t.width = 0; + t.height = 0; + t.scale = 0.25; + t.format = getHdrFormat(); + path.createRenderTarget(t); + } + + { + var t = new RenderTargetRaw(); + t.name = "bloomtex2"; + t.width = 0; + t.height = 0; + t.scale = 0.25; + t.format = getHdrFormat(); + path.createRenderTarget(t); + } + + { + path.loadShader("bloom_pass/bloom_pass/bloom_pass"); + path.loadShader("blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_x"); + path.loadShader("blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_y"); + path.loadShader("blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_y_blend"); + } + #end + + #if rp_sss + { + path.loadShader("sss_pass/sss_pass/sss_pass_x"); + path.loadShader("sss_pass/sss_pass/sss_pass_y"); + } + #end + + #if rp_ssr + { + path.loadShader("ssr_pass/ssr_pass/ssr_pass"); + path.loadShader("blur_adaptive_pass/blur_adaptive_pass/blur_adaptive_pass_x"); + path.loadShader("blur_adaptive_pass/blur_adaptive_pass/blur_adaptive_pass_y3_blend"); + + #if rp_ssr_half + { + var t = new RenderTargetRaw(); + t.name = "ssra"; + t.width = 0; + t.height = 0; + t.scale = 0.5; + t.format = getHdrFormat(); + path.createRenderTarget(t); + } + { + var t = new RenderTargetRaw(); + t.name = "ssrb"; + t.width = 0; + t.height = 0; + t.scale = 0.5; + t.format = getHdrFormat(); + path.createRenderTarget(t); + } + #end + } + #end + + #if ((rp_motionblur == "Camera") || (rp_motionblur == "Object")) + { + #if (rp_motionblur == "Camera") + { + path.loadShader("motion_blur_pass/motion_blur_pass/motion_blur_pass"); + } + #else + { + path.loadShader("motion_blur_veloc_pass/motion_blur_veloc_pass/motion_blur_veloc_pass"); + } + #end + } + #end + } + + static function commands() { + + #if rp_dynres + { + DynamicResolutionScale.run(path); + } + #end + + #if (rp_gi != "Off") + { + if (path.voxelize()) { + #if ((rp_shadowmap) && (rp_gi == "Voxel GI")) + { + if (path.lampCastShadow() && iron.Scene.active.lamps.length > 0) { + var l = iron.Scene.active.lamps[0]; + var faces = l.data.raw.shadowmap_cube ? 6 : 1; + for (i in 0...faces) { + path.setTarget("shadowMap"); + path.clearTarget(null, 1.0); + path.drawMeshes("shadowmap"); + } + } + } + #end + path.clearImage("voxels", 0x00000000); + path.setTarget(""); + var res = getVoxelRes(); + path.setViewport(res, res); + path.bindTarget("voxels", "voxels"); + #if ((rp_shadowmap) && (rp_gi == "Voxel GI")) + { + path.bindTarget("shadowMap", "shadowMap"); + } + #end + path.drawMeshes("voxel"); + path.generateMipmaps(["voxels"]); + } + } + #end + + #if arm_veloc + { + path.setTarget("gbuffer2"); + path.clearTarget(0xff000000); + path.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]); + } + #else + { + path.setTarget("gbuffer0", ["gbuffer1"]); + } + #end + + #if (rp_background == "Clear") + { + path.clearTarget(-1, 1.0); + } + #else + { + path.clearTarget(null, 1.0); + } + #end + + path.drawMeshes("mesh"); + + #if rp_decals + { + // path.setTarget("gbuffer0", ["gbuffer1"]); + path.bindTarget("_main", "gbufferD"); + path.drawDecals(["decal"]); + } + #end + + #if ((rp_ssgi == "RTGI") || (rp_ssgi == "RTAO")) + { + path.setTarget("bufa"); + path.bindTarget("_main", "gbufferD"); + path.bindTarget("gbuffer0", "gbuffer0"); + #if ((rp_ssgi == "RTGI")) + path.bindTarget("gbuffer1", "gbuffer1"); + #end + path.drawShader('ssgi_pass/ssgi_pass/ssgi_pass'); + + path.setTarget("bufb"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.bindTarget("bufa", "tex"); + path.drawShader('ssgi_blur_pass/ssgi_blur_pass/ssgi_blur_pass_x'); + + path.setTarget("bufa"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.bindTarget("bufb", "tex"); + path.drawShader('ssgi_blur_pass/ssgi_blur_pass/ssgi_blur_pass_y'); + } + #elseif (rp_ssgi == "SSAO") + { + path.setTarget("bufa"); + path.bindTarget("_main", "gbufferD"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.drawShader('ssao_pass/ssao_pass/ssao_pass'); + + path.setTarget("bufb"); + path.bindTarget("bufa", "tex"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.drawShader('blur_edge_pass/blur_edge_pass/blur_edge_pass_x'); + + path.setTarget("bufa"); + path.bindTarget("bufb", "tex"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.drawShader('blur_edge_pass/blur_edge_pass/blur_edge_pass_y'); + } + #end + + // Indirect + path.setTarget("tex"); + path.bindTarget("_main", "gbufferD"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.bindTarget("gbuffer1", "gbuffer1"); + #if (rp_ssgi != "Off") + { + path.bindTarget("bufa", "ssaotex"); + } + #end + #if (rp_gi != "Off") + { + path.bindTarget("voxels", "voxels"); + } + #end + path.drawShader('deferred_indirect/deferred_indirect/deferred_indirect'); + + // Direct + var lamps = iron.Scene.active.lamps; + for (i in 0...lamps.length) { + var l = lamps[i]; + if (!l.visible) continue; + path.currentLampIndex = i; + + #if ((rp_shadowmap) && (rp_gi != "Voxel GI")) + { + if (path.lampCastShadow()) { + var faces = l.data.raw.shadowmap_cube ? 6 : 1; + for (i in 0...faces) { + path.setTarget("shadowMap"); + path.clearTarget(null, 1.0); + path.drawMeshes("shadowmap"); + } + } + } + #end + + path.setTarget("tex"); + path.bindTarget("_main", "gbufferD"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.bindTarget("gbuffer1", "gbuffer1"); + + #if rp_shadowmap + { + if (path.lampCastShadow()) { + path.bindTarget("shadowMap", "shadowMap"); + } + } + #end + + #if ((rp_voxelgi_shadows) || (rp_voxelgi_refraction)) + { + path.bindTarget("voxels", "voxels"); + } + #end + + if (path.lampIsSun()) { + path.drawShader('deferred_light_quad/deferred_light_quad/deferred_light_quad'); + } + else { + path.drawLampVolume('deferred_light/deferred_light/deferred_light'); + } + + #if rp_volumetriclight + { + path.setTarget("buf"); + path.bindTarget("_main", "gbufferD"); + path.bindTarget("shadowMap", "shadowMap"); + if (path.lampIsSun()) { + path.drawShader('volumetric_light_quad/volumetric_light_quad/volumetric_light_quad'); + } + else { + path.drawLampVolume('volumetric_light/volumetric_light/volumetric_light'); + } + path.setTarget("gbuffer1"); + path.bindTarget("buf", "tex"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.drawShader('blur_edge_pass/blur_edge_pass/blur_edge_pass_x'); + + path.setTarget("tex"); + path.bindTarget("gbuffer1", "tex"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.drawShader('blur_edge_pass/blur_edge_pass/blur_edge_pass_y_blend_add'); + } + #end + } + path.currentLampIndex = 0; + + #if (rp_background == "World") + { + path.drawSkydome("_worldMaterial"); + } + #end + + #if rp_ocean + { + path.setTarget("tex"); + path.bindTarget("_main", "gbufferD"); + path.drawShader("water_pass/water_pass/water_pass"); + } + #end + + #if rp_blending + { + path.drawMeshes("blend"); + } + #end + + #if rp_translucency + { + drawTranslucency("tex"); + } + #end + + #if rp_bloom + { + path.setTarget("bloomtex"); + path.bindTarget("tex", "tex"); + path.drawShader("bloom_pass/bloom_pass/bloom_pass"); + + path.setTarget("bloomtex2"); + path.bindTarget("bloomtex", "tex"); + path.drawShader("blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_x"); + + path.setTarget("bloomtex"); + path.bindTarget("bloomtex2", "tex"); + path.drawShader("blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_y"); + + path.setTarget("bloomtex2"); + path.bindTarget("bloomtex", "tex"); + path.drawShader("blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_x"); + + path.setTarget("bloomtex"); + path.bindTarget("bloomtex2", "tex"); + path.drawShader("blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_y"); + + path.setTarget("bloomtex2"); + path.bindTarget("bloomtex", "tex"); + path.drawShader("blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_x"); + + path.setTarget("bloomtex"); + path.bindTarget("bloomtex2", "tex"); + path.drawShader("blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_y"); + + path.setTarget("bloomtex2"); + path.bindTarget("bloomtex", "tex"); + path.drawShader("blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_x"); + + path.setTarget("tex"); + path.bindTarget("bloomtex2", "tex"); + path.drawShader("blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_y_blend"); + } + #end + + #if rp_sss + { + path.setTarget("buf"); + path.bindTarget("tex", "tex"); + path.bindTarget("_main", "gbufferD"); + path.bindTarget("gbuffer1", "gbuffer1"); + path.drawShader("sss_pass/sss_pass/sss_pass_x"); + + path.setTarget("tex"); + // TODO: can not bind tex + path.bindTarget("tex", "tex"); + path.bindTarget("_main", "gbufferD"); + path.bindTarget("gbuffer1", "gbuffer1"); + path.drawShader("sss_pass/sss_pass/sss_pass_y"); + } + #end + + #if rp_ssr + { + #if rp_ssr_half + var targeta = "ssra"; + var targetb = "ssrb"; + #else + var targeta = "buf"; + var targetb = "gbuffer1"; + #end + path.setTarget(targeta); + path.bindTarget("tex", "tex"); + path.bindTarget("_main", "gbufferD"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.drawShader("ssr_pass/ssr_pass/ssr_pass"); + + path.setTarget(targetb); + path.bindTarget(targeta, "tex"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.drawShader("blur_adaptive_pass/blur_adaptive_pass/blur_adaptive_pass_x"); + + path.setTarget("tex"); + path.bindTarget(targetb, "tex"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.drawShader("blur_adaptive_pass/blur_adaptive_pass/blur_adaptive_pass_y3_blend"); + } + #end + + #if ((rp_motionblur == "Camera") || (rp_motionblur == "Object")) + { + path.setTarget("buf"); + path.bindTarget("tex", "tex"); + path.bindTarget("gbuffer0", "gbuffer0"); + #if (rp_motionblur == "Camera") + { + path.bindTarget("_main", "gbufferD"); + path.drawShader("motion_blur_pass/motion_blur_pass/motion_blur_pass"); + } + #else + { + path.bindTarget("gbuffer2", "sveloc"); + path.drawShader("motion_blur_veloc_pass/motion_blur_veloc_pass/motion_blur_veloc_pass"); + } + #end + path.setTarget("tex"); + path.bindTarget("buf", "tex"); + path.drawShader("copy_pass/copy_pass/copy_pass"); + } + #end + + #if rp_autoexposure + { + path.generateMipmaps(["tex"]); + } + #end + + #if ((rp_supersampling == 4) || (rp_rendercapture)) + var framebuffer = "buf"; + #else + var framebuffer = ""; + #end + + #if ((rp_antialiasing == "Off") || (rp_antialiasing == "FXAA")) + { + path.setTarget(framebuffer); + } + #else + { + path.setTarget("buf"); + } + #end + path.bindTarget("tex", "tex"); + + #if rp_compositornodes + { + path.drawShader("compositor_pass/compositor_pass/compositor_pass"); + } + #else + { + path.drawShader("copy_pass/copy_pass/copy_pass"); + } + #end + + #if rp_overlays + { + path.clearTarget(null, 1.0); + path.drawMeshes("overlay"); + } + #end + + #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA")) + { + path.setTarget("bufa"); + path.clearTarget(0x00000000); + path.bindTarget("buf", "colorTex"); + path.drawShader("smaa_edge_detect/smaa_edge_detect/smaa_edge_detect"); + + path.setTarget("bufb"); + path.clearTarget(0x00000000); + path.bindTarget("bufa", "edgesTex"); + path.drawShader("smaa_blend_weight/smaa_blend_weight/smaa_blend_weight"); + + #if (rp_antialiasing == "TAA") + path.setTarget("bufa"); + #else + path.setTarget(framebuffer); + #end + path.bindTarget("buf", "colorTex"); + path.bindTarget("bufb", "blendTex"); + path.drawShader("smaa_neighborhood_blend/smaa_neighborhood_blend/smaa_neighborhood_blend"); + + #if (rp_antialiasing == "TAA") + { + path.setTarget(framebuffer); + path.bindTarget("bufa", "tex"); + path.bindTarget("taa", "tex2"); + path.bindTarget("gbuffer2", "sveloc"); + path.drawShader("taa_pass/taa_pass/taa_pass"); + + path.setTarget("taa"); + path.bindTarget("bufa", "tex"); + path.drawShader("copy_pass/copy_pass/copy_pass"); + } + #end + } + #end + + #if (rp_supersampling == 4) + { + #if rp_rendercapture + // TODO: ss4 + capture broken + var final = "capture"; + #else + var final = ""; + #end + path.setTarget(final); + path.bindTarget(framebuffer, "tex"); + path.drawShader("supersample_resolve/supersample_resolve/supersample_resolve"); + } + #elseif (rp_rendercapture) + { + path.setTarget("capture"); + path.bindTarget(framebuffer, "tex"); + path.drawShader("copy_pass/copy_pass/copy_pass"); + } + #end + } + #end + + + + + + // #if (rp_renderer == "Deferred Plus") + // static function init() { + + // } + + // static function commands() { + + // } + // #end + + + + + + #if (rp_translucency) + static function initTranslucency() { + path.createDepthBuffer("main", "DEPTH24"); + + var t = new RenderTargetRaw(); + t.name = "accum"; + t.width = 0; + t.height = 0; + t.displayp = getDisplayp(); + t.format = "RGBA64"; + var ss = getSuperSampling(); + if (ss != 1) t.scale = ss; + t.depth_buffer = "main"; + path.createRenderTarget(t); + + var t = new RenderTargetRaw(); + t.name = "revealage"; + t.width = 0; + t.height = 0; + t.displayp = getDisplayp(); + t.format = "RGBA64"; + var ss = getSuperSampling(); + if (ss != 1) t.scale = ss; + t.depth_buffer = "main"; + path.createRenderTarget(t); + + path.loadShader("translucent_resolve/translucent_resolve/translucent_resolve"); + } + + static function drawTranslucency(target:String) { + path.setTarget("accum"); + path.clearTarget(0xff000000); + path.setTarget("revealage"); + path.clearTarget(0xffffffff); + path.setTarget("accum", ["revealage"]); + #if rp_shadowmap + { + path.bindTarget("shadowMap", "shadowMap"); + } + #end + path.drawMeshes("translucent"); + #if rp_render_to_texture + { + path.setTarget(target); + } + #else + { + path.setTarget(""); + } + #end + path.bindTarget("accum", "gbuffer0"); + path.bindTarget("revealage", "gbuffer1"); + path.drawShader("translucent_resolve/translucent_resolve/translucent_resolve"); + } + #end + + #if (rp_gi != "Off") + static function initGI() { + var t = new RenderTargetRaw(); + t.name = "voxels"; + #if (rp_gi != "Voxel AO") + { + t.format = "R8"; + } + #elseif (rp_voxelgi_hdr) + { + t.format = "RGBA64"; + } + #else + { + t.format = "RGBA32"; + } + #end + var res = getVoxelRes(); + var resZ = getVoxelResZ(); + t.width = res; + t.height = res; + t.depth = Std.int(res * resZ); + t.is_image = true; + path.createRenderTarget(t); + } + #end + + static inline function getShadowmapSize():Int { + #if (rp_shadowmap_size == 512) + return 512; + #elseif (rp_shadowmap_size == 1024) + return 1024; + #elseif (rp_shadowmap_size == 2048) + return 2048; + #elseif (rp_shadowmap_size == 4096) + return 4096; + #elseif (rp_shadowmap_size == 8192) + return 8192; + #elseif (rp_shadowmap_size == 16384) + return 16384; + #else + return 0; + #end + } + + static inline function getVoxelRes():Int { + #if (rp_voxelgi_resolution == 512) + return 512; + #elseif (rp_voxelgi_resolution == 256) + return 256; + #elseif (rp_voxelgi_resolution == 128) + return 128; + #elseif (rp_voxelgi_resolution == 64) + return 64; + #elseif (rp_voxelgi_resolution == 32) + return 32; + #else + return 0; + #end + } + + static inline function getVoxelResZ():Float { + #if (rp_voxelgi_resolution_z == 1.0) + return 1.0; + #elseif (rp_voxelgi_resolution == 0.5) + return 0.5; + #elseif (rp_voxelgi_resolution == 0.25) + return 0.25; + #else + return 0.0; + #end + } + + static inline function getSuperSampling():Int { + #if (rp_supersampling == 2) + return 2; + #elseif (rp_supersampling == 4) + return 4; + #else + return 1; + #end + } + + static inline function getHdrFormat():String { + #if rp_hdr + return "RGBA64"; + #else + return "RGBA32"; + #end + } + + static inline function getDisplayp():Null { + #if (rp_resolution == 480) + return 480; + #elseif (rp_resolution == 720) + return 720; + #elseif (rp_resolution == 1080) + return 1080; + #elseif (rp_resolution == 1440) + return 1440; + #elseif (rp_resolution == 2160) + return 2160; + #else + return null; + #end + } + + static inline function getRenderCaptureFormat():String { + #if (rp_rendercapture_format == "8bit") + return "RGBA32"; + #elseif (rp_rendercapture_format == "16bit") + return "RGBA64"; + #elseif (rp_rendercapture_format == "32bit") + return "RGBA128"; + #else + return "RGBA32"; + #end + } +} diff --git a/Sources/armory/trait/internal/DebugConsole.hx b/Sources/armory/trait/internal/DebugConsole.hx index 15449ddb..bc1734bb 100755 --- a/Sources/armory/trait/internal/DebugConsole.hx +++ b/Sources/armory/trait/internal/DebugConsole.hx @@ -3,7 +3,6 @@ package armory.trait.internal; import iron.Trait; #if arm_debug import kha.Scheduler; -import iron.data.RenderPath; import iron.object.CameraObject; import iron.object.MeshObject; import zui.Zui; @@ -116,21 +115,22 @@ class DebugConsole extends Trait { // ui.text('mem: ' + Std.int(getMem() / 1024 / 1024)); ui.unindent(); - ui.text('draw calls: ' + RenderPath.drawCalls); - ui.text('tris mesh: ' + RenderPath.numTrisMesh); - ui.text('tris shadow: ' + RenderPath.numTrisShadow); + ui.text('draw calls: ' + iron.RenderPath.drawCalls); + ui.text('tris mesh: ' + iron.RenderPath.numTrisMesh); + ui.text('tris shadow: ' + iron.RenderPath.numTrisShadow); #if arm_batch - ui.text('batch calls: ' + RenderPath.batchCalls); - ui.text('batch buckets: ' + RenderPath.batchBuckets); + ui.text('batch calls: ' + iron.RenderPath.batchCalls); + ui.text('batch buckets: ' + iron.RenderPath.batchBuckets); #end - ui.text('culled: ' + RenderPath.culled + ' / ' + numObjects * 2); // Assumes shadow context for all meshes + ui.text('culled: ' + iron.RenderPath.culled + ' / ' + numObjects * 2); // Assumes shadow context for all meshes #if arm_stream var total = iron.Scene.active.sceneStream.sceneTotal(); ui.text('streamed: $numObjects / $total'); #end - var path = iron.Scene.active.camera.renderPath; - var rts = path.data.pathdata.raw.render_targets; - ui.text('render targets: ' + (rts != null ? rts.length : 0)); + ui.text('render targets: '); + for (rt in iron.RenderPath.active.renderTargets) { + ui.text(rt.raw.name); + } } ui.separator(); } diff --git a/Sources/armory/trait/internal/DebugDraw.hx b/Sources/armory/trait/internal/DebugDraw.hx index 0360b9b8..e4998950 100644 --- a/Sources/armory/trait/internal/DebugDraw.hx +++ b/Sources/armory/trait/internal/DebugDraw.hx @@ -65,7 +65,7 @@ class DebugDraw { public static function notifyOnRender(f:DebugDraw->Void) { if (inst == null) inst = new DebugDraw(); - iron.data.RenderPath.notifyOnContext("mesh", function(g4:kha.graphics4.Graphics, i:Int, len:Int) { + iron.RenderPath.notifyOnContext("mesh", function(g4:kha.graphics4.Graphics, i:Int, len:Int) { g = g4; if (i == 0) inst.begin(); f(inst); diff --git a/Sources/armory/trait/internal/SpaceArmory.hx b/Sources/armory/trait/internal/SpaceArmory.hx index 1b404d3f..96f7632a 100755 --- a/Sources/armory/trait/internal/SpaceArmory.hx +++ b/Sources/armory/trait/internal/SpaceArmory.hx @@ -141,20 +141,20 @@ class SpaceArmory extends Trait { @:access(kha.Scheduler) function renderCapture() { - App.pauseUpdates = true; - App.notifyOnRender(function(g:kha.graphics4.Graphics) { + iron.App.pauseUpdates = true; + iron.App.notifyOnRender(function(g:kha.graphics4.Graphics) { if (captured) return; kha.Scheduler.current = current; frame++; if (frame >= 2) { // Init TAA - App.pauseUpdates = false; + iron.App.pauseUpdates = false; if (frame % 2 == 0) { // Alternate TAA current += iron.system.Time.delta; return; } var info = iron.Scene.active.raw.capture_info; - var pd = iron.Scene.active.cameras[0].data.pathdata; - var tex = pd.renderTargets.get("capture").image; + var path = iron.RenderPath.active; + var tex = path.renderTargets.get("capture").image; if (tex != null) { var pixels = tex.getPixels(); @@ -187,12 +187,12 @@ class SpaceArmory extends Trait { #else function renderCapture() { - App.notifyOnRender(function(g:kha.graphics4.Graphics) { + iron.App.notifyOnRender(function(g:kha.graphics4.Graphics) { if (captured) return; frame++; if (frame >= 3) { - var pd = iron.Scene.active.cameras[0].data.pathdata; - var tex = pd.renderTargets.get("capture").image; + var path = iron.RenderPath.active; + var tex = path.renderTargets.get("capture").image; if (tex != null) { var pixels = tex.getPixels(); Krom.fileSaveBytes("render.bin", pixels.getData()); diff --git a/blender/arm/exporter.py b/blender/arm/exporter.py index dc186ae0..7298fd5b 100755 --- a/blender/arm/exporter.py +++ b/blender/arm/exporter.py @@ -23,7 +23,6 @@ import arm.assets as assets import arm.log as log import arm.material.make as make_material import arm.material.mat_batch as mat_batch -import arm.make_renderer as make_renderer import arm.make_renderpath as make_renderpath NodeTypeNode = 0 @@ -1513,7 +1512,7 @@ class ArmoryExporter: o['fov'] = objref.arm_fov o['shadows_bias'] = objref.arm_shadows_bias * 0.0001 rpdat = arm.utils.get_rp() - if rpdat.rp_shadowmap == 'None': + if rpdat.rp_shadowmap == 'Off': o['shadowmap_size'] = 0 else: o['shadowmap_size'] = int(rpdat.rp_shadowmap) @@ -1788,14 +1787,7 @@ class ArmoryExporter: # rpdat.rp_sss = sss_used # rebuild_rp = True if rebuild_rp: - self.rebuild_render_path(rpdat) - - def rebuild_render_path(self, rpdat): - # No shader invalidate required? - make_renderer.make_renderer(rpdat) - # Rebuild modified path - assets_path = arm.utils.get_sdk_path() + 'armory/Assets/' - make_renderpath.build_node_trees(assets_path) + make_renderpath.build() def export_particle_systems(self): if len(self.particleSystemArray) > 0: diff --git a/blender/arm/handlers.py b/blender/arm/handlers.py index 3971e609..43cf27d2 100644 --- a/blender/arm/handlers.py +++ b/blender/arm/handlers.py @@ -10,7 +10,6 @@ import arm.props as props import arm.make as make import arm.make_state as state import arm.space_armory as space_armory -import arm.make_renderer as make_renderer import arm.assets as assets try: import barmory @@ -236,7 +235,7 @@ def on_load_post(context): first_update = True props.init_properties_on_load() - make_renderer.reload_blend_data() + reload_blend_data() bpy.ops.arm.sync_proxy() @@ -258,6 +257,26 @@ def on_load_post(context): def on_save_pre(context): props.init_properties_on_save() +def reload_blend_data(): + armory_pbr = bpy.data.node_groups.get('Armory PBR') + if armory_pbr == None: + load_library('Armory PBR') + +def load_library(asset_name): + if bpy.data.filepath.endswith('arm_data.blend'): # Prevent load in library itself + return + sdk_path = arm.utils.get_sdk_path() + data_path = sdk_path + '/armory/blender/data/arm_data.blend' + data_names = [asset_name] + + # Import + data_refs = data_names.copy() + with bpy.data.libraries.load(data_path, link=False) as (data_from, data_to): + data_to.node_groups = data_refs + + for ref in data_refs: + ref.use_fake_user = True + def register(): if hasattr(bpy.app.handlers, 'scene_update_post'): bpy.app.handlers.scene_update_post.append(on_scene_update_post) @@ -266,6 +285,7 @@ def register(): # On windows, on_load_post is not called when opening .blend file from explorer if arm.utils.get_os() == 'win' and arm.utils.get_fp() != '': on_load_post(None) + reload_blend_data() def unregister(): if hasattr(bpy.app.handlers, 'scene_update_post'): diff --git a/blender/arm/make.py b/blender/arm/make.py index 5245ee8f..dc132f64 100755 --- a/blender/arm/make.py +++ b/blender/arm/make.py @@ -96,13 +96,13 @@ def export_data(fp, sdk_path, is_play=False, is_publish=False, in_viewport=False # Build node trees ArmoryExporter.import_traits = [] - make_logic.build_node_trees() + make_logic.build() active_worlds = set() for scene in bpy.data.scenes: if scene.arm_export and scene.world != None: active_worlds.add(scene.world) - world_outputs = make_world.build_node_trees(active_worlds) - make_renderpath.build_node_trees(assets_path) + world_outputs = make_world.build(active_worlds) + make_renderpath.build() for wout in world_outputs: make_world.write_output(wout) @@ -161,8 +161,8 @@ def export_data(fp, sdk_path, is_play=False, is_publish=False, in_viewport=False if shader_name.startswith('compositor_pass'): cdefs = arm.utils.def_strings_to_array(wrd.compo_defs) compile_shader_pass(raw_shaders_path, shader_name, defs + cdefs) - elif shader_name.startswith('grease_pencil'): - compile_shader_pass(raw_shaders_path, shader_name, []) + # elif shader_name.startswith('grease_pencil'): + # compile_shader_pass(raw_shaders_path, shader_name, []) else: compile_shader_pass(raw_shaders_path, shader_name, defs) state.last_world_defs = wrd.world_defs diff --git a/blender/arm/make_logic.py b/blender/arm/make_logic.py index 1795d692..82b89be8 100755 --- a/blender/arm/make_logic.py +++ b/blender/arm/make_logic.py @@ -8,7 +8,7 @@ parsed_nodes = [] parsed_labels = dict() # Generating node sources -def build_node_trees(): +def build(): os.chdir(arm.utils.get_fp()) # Make sure package dir exists diff --git a/blender/arm/make_renderer.py b/blender/arm/make_renderer.py deleted file mode 100644 index 80784d40..00000000 --- a/blender/arm/make_renderer.py +++ /dev/null @@ -1,622 +0,0 @@ -import bpy -import arm.nodes_renderpath as nodes_renderpath -import arm.utils -import arm.assets as assets - -group = None -nodes = None -links = None - -updating_preset = False -first_build = True - -def check_default(): - global first_build - wrd = bpy.data.worlds['Arm'] - if len(wrd.arm_rplist) == 0: - wrd.arm_rplist.add() - wrd.arm_rplist_index = 0 - first_build = True - if first_build == True: - make_renderer(arm.utils.get_rp()) - first_build = False - -def set_preset(self, context, preset): - global updating_preset - rpdat = arm.utils.get_rp() - updating_preset = True - - if preset == 'Low': - rpdat.rp_renderer = 'Forward' - rpdat.rp_depthprepass = False - rpdat.arm_material_model = 'Full' - rpdat.rp_shadowmap = '1024' - rpdat.rp_shadowmap_cascades = '1' - rpdat.rp_translucency_state = 'Off' - rpdat.rp_overlays_state = 'Off' - rpdat.rp_decals_state = 'Off' - rpdat.rp_sss_state = 'Off' - rpdat.rp_blending_state = 'Off' - rpdat.rp_hdr = False - rpdat.rp_background = 'World' - rpdat.rp_stereo = False - rpdat.rp_greasepencil = False - rpdat.rp_gi = 'Off' - rpdat.rp_render_to_texture = False - rpdat.rp_supersampling = '1' - rpdat.rp_antialiasing = 'None' - rpdat.rp_compositornodes = False - rpdat.rp_volumetriclight = False - rpdat.rp_ssgi = 'Off' - rpdat.rp_ssr = False - rpdat.rp_dfrs = False - rpdat.rp_dfao = False - rpdat.rp_dfgi = False - rpdat.rp_bloom = False - rpdat.rp_eyeadapt = False - rpdat.rp_rendercapture = False - rpdat.rp_motionblur = 'None' - rpdat.arm_rp_resolution = 'Display' - rpdat.arm_texture_filter = 'Anisotropic' - rpdat.arm_diffuse_model = 'Lambert' - elif preset == 'Forward': - rpdat.rp_renderer = 'Forward' - rpdat.rp_depthprepass = True - rpdat.arm_material_model = 'Full' - rpdat.rp_shadowmap = '1024' - rpdat.rp_shadowmap_cascades = '4' - rpdat.rp_translucency_state = 'Auto' - rpdat.rp_overlays_state = 'Auto' - rpdat.rp_decals_state = 'Auto' - rpdat.rp_sss_state = 'Auto' - rpdat.rp_blending_state = 'Off' - rpdat.rp_hdr = True - rpdat.rp_background = 'World' - rpdat.rp_stereo = False - rpdat.rp_greasepencil = False - rpdat.rp_gi = 'Off' - rpdat.rp_render_to_texture = True - rpdat.rp_supersampling = '1' - rpdat.rp_antialiasing = 'SMAA' - rpdat.rp_compositornodes = True - rpdat.rp_volumetriclight = False - rpdat.rp_ssgi = 'SSAO' - rpdat.rp_ssr = True - rpdat.rp_dfrs = False - rpdat.rp_dfao = False - rpdat.rp_dfgi = False - rpdat.rp_bloom = False - rpdat.rp_eyeadapt = False - rpdat.rp_rendercapture = False - rpdat.rp_motionblur = 'None' - rpdat.arm_rp_resolution = 'Display' - rpdat.arm_texture_filter = 'Anisotropic' - rpdat.arm_diffuse_model = 'Lambert' - elif preset == 'Deferred': - rpdat.rp_renderer = 'Deferred' - rpdat.arm_material_model = 'Full' - rpdat.rp_shadowmap = '1024' - rpdat.rp_shadowmap_cascades = '4' - rpdat.rp_translucency_state = 'Auto' - rpdat.rp_overlays_state = 'Auto' - rpdat.rp_decals_state = 'Auto' - rpdat.rp_sss_state = 'Auto' - rpdat.rp_blending_state = 'Off' - rpdat.rp_hdr = True - rpdat.rp_background = 'World' - rpdat.rp_stereo = False - rpdat.rp_greasepencil = False - rpdat.rp_gi = 'Off' - rpdat.rp_render_to_texture = True - rpdat.rp_supersampling = '1' - rpdat.rp_antialiasing = 'FXAA' - rpdat.rp_compositornodes = True - rpdat.rp_volumetriclight = False - rpdat.rp_ssgi = 'SSAO' - rpdat.rp_ssr = False - rpdat.rp_dfrs = False - rpdat.rp_dfao = False - rpdat.rp_dfgi = False - rpdat.rp_bloom = False - rpdat.rp_eyeadapt = False - rpdat.rp_rendercapture = False - rpdat.rp_motionblur = 'None' - rpdat.arm_rp_resolution = 'Display' - rpdat.arm_texture_filter = 'Anisotropic' - rpdat.arm_diffuse_model = 'Lambert' - elif preset == 'Max (Render)': - rpdat.rp_renderer = 'Deferred' - rpdat.rp_shadowmap = '4096' - rpdat.rp_shadowmap_cascades = '4' - rpdat.rp_translucency_state = 'Auto' - rpdat.rp_overlays_state = 'Auto' - rpdat.rp_decals_state = 'Auto' - rpdat.rp_sss_state = 'Auto' - rpdat.rp_blending_state = 'Off' - rpdat.rp_hdr = True - rpdat.rp_background = 'World' - rpdat.rp_stereo = False - rpdat.rp_greasepencil = False - rpdat.rp_gi = 'Voxel GI' - rpdat.rp_voxelgi_resolution = '256' - rpdat.rp_voxelgi_emission = True - rpdat.rp_render_to_texture = True - rpdat.rp_supersampling = '2' - rpdat.rp_antialiasing = 'TAA' - rpdat.rp_compositornodes = True - rpdat.rp_volumetriclight = False - rpdat.rp_ssgi = 'RTGI' - rpdat.rp_ssr = True - rpdat.rp_dfrs = False - rpdat.rp_dfao = False - rpdat.rp_dfgi = False - rpdat.rp_bloom = False - rpdat.rp_eyeadapt = False - rpdat.rp_rendercapture = True - rpdat.rp_motionblur = 'None' - rpdat.arm_rp_resolution = 'Display' - rpdat.arm_material_model = 'Full' - rpdat.arm_texture_filter = 'Anisotropic' - rpdat.arm_diffuse_model = 'OrenNayar' - elif preset == 'VR': - rpdat.rp_renderer = 'Forward' - rpdat.rp_depthprepass = False - rpdat.arm_material_model = 'Mobile' - rpdat.rp_shadowmap = '1024' - rpdat.rp_shadowmap_cascades = '1' - rpdat.rp_translucency_state = 'Off' - rpdat.rp_overlays_state = 'Off' - rpdat.rp_decals_state = 'Off' - rpdat.rp_sss_state = 'Off' - rpdat.rp_blending_state = 'Off' - rpdat.rp_hdr = False - rpdat.rp_background = 'World' - rpdat.rp_stereo = True - rpdat.rp_greasepencil = False - rpdat.rp_gi = 'Off' - rpdat.rp_render_to_texture = False - rpdat.rp_supersampling = '1' - rpdat.rp_antialiasing = 'None' - rpdat.rp_compositornodes = False - rpdat.rp_volumetriclight = False - rpdat.rp_ssgi = 'Off' - rpdat.rp_ssr = False - rpdat.rp_dfrs = False - rpdat.rp_dfao = False - rpdat.rp_dfgi = False - rpdat.rp_bloom = False - rpdat.rp_eyeadapt = False - rpdat.rp_rendercapture = False - rpdat.rp_motionblur = 'None' - rpdat.arm_rp_resolution = 'Display' - rpdat.arm_texture_filter = 'Point' - rpdat.arm_diffuse_model = 'Lambert' - elif preset == 'Mobile': - rpdat.rp_renderer = 'Forward' - rpdat.rp_depthprepass = False - rpdat.arm_material_model = 'Mobile' - rpdat.rp_shadowmap = '1024' - rpdat.rp_shadowmap_cascades = '1' - rpdat.rp_translucency_state = 'Off' - rpdat.rp_overlays_state = 'Off' - rpdat.rp_decals_state = 'Off' - rpdat.rp_sss_state = 'Off' - rpdat.rp_blending_state = 'Off' - rpdat.rp_hdr = False - rpdat.rp_background = 'Clear' - rpdat.rp_stereo = False - rpdat.rp_greasepencil = False - rpdat.rp_gi = 'Off' - rpdat.rp_render_to_texture = False - rpdat.rp_supersampling = '1' - rpdat.rp_antialiasing = 'None' - rpdat.rp_compositornodes = False - rpdat.rp_volumetriclight = False - rpdat.rp_ssgi = 'Off' - rpdat.rp_ssr = False - rpdat.rp_dfrs = False - rpdat.rp_dfao = False - rpdat.rp_dfgi = False - rpdat.rp_bloom = False - rpdat.rp_eyeadapt = False - rpdat.rp_rendercapture = False - rpdat.rp_motionblur = 'None' - rpdat.arm_rp_resolution = 'Display' - rpdat.arm_texture_filter = 'Point' - rpdat.arm_diffuse_model = 'Lambert' - elif preset == 'Max (Game)': - rpdat.rp_renderer = 'Deferred' - rpdat.rp_shadowmap = '4096' - rpdat.rp_shadowmap_cascades = '4' - rpdat.rp_translucency_state = 'Auto' - rpdat.rp_overlays_state = 'Auto' - rpdat.rp_decals_state = 'Auto' - rpdat.rp_sss_state = 'Auto' - rpdat.rp_blending_state = 'Off' - rpdat.rp_hdr = True - rpdat.rp_background = 'World' - rpdat.rp_stereo = False - rpdat.rp_greasepencil = False - rpdat.rp_gi = 'Voxel GI' - rpdat.rp_voxelgi_resolution = '128' - rpdat.arm_voxelgi_revoxelize = False - rpdat.arm_voxelgi_camera = False - rpdat.rp_voxelgi_emission = False - rpdat.rp_render_to_texture = True - rpdat.rp_supersampling = '1' - rpdat.rp_antialiasing = 'TAA' - rpdat.rp_compositornodes = True - rpdat.rp_volumetriclight = False - rpdat.rp_ssgi = 'RTGI' - rpdat.arm_ssrs = False - rpdat.rp_ssr = True - rpdat.rp_dfrs = False - rpdat.rp_dfao = False - rpdat.rp_dfgi = False - rpdat.rp_bloom = False - rpdat.rp_eyeadapt = False - rpdat.rp_rendercapture = False - rpdat.rp_motionblur = 'None' - rpdat.arm_rp_resolution = 'Display' - rpdat.arm_material_model = 'Full' - rpdat.arm_texture_filter = 'Anisotropic' - rpdat.arm_diffuse_model = 'Lambert' - - updating_preset = False - set_renderpath(self, context) - -def set_renderpath(self, context): - global updating_preset - if updating_preset == True: - return - # assets.invalidate_compiled_data(self, context) - assets.invalidate_shader_cache(self, context) - make_renderer(arm.utils.get_rp()) - -def make_renderer(rpdat): - global group - global nodes - global links - - if bpy.data.filepath.endswith('arm_data.blend'): # Prevent load in library itself - return - - if rpdat.rp_renderer == 'Forward': - load_library('forward_path', 'armory_default') - group = bpy.data.node_groups['armory_default'] - nodes = group.nodes - links = group.links - make_forward(rpdat) - elif rpdat.rp_renderer == 'Deferred': - load_library('deferred_path', 'armory_default') - group = bpy.data.node_groups['armory_default'] - nodes = group.nodes - links = group.links - make_deferred(rpdat) - elif rpdat.rp_renderer == 'Deferred Plus': - load_library('deferred_plus_path', 'armory_default') - group = bpy.data.node_groups['armory_default'] - nodes = group.nodes - links = group.links - make_deferred_plus(rpdat) - -def relink(start_node, next_node): - if len(nodes[start_node].inputs[0].links) > 0: - n = nodes[start_node].inputs[0].links[0].from_node - l = n.outputs[0].links[0] - links.remove(l) - links.new(n.outputs[0], nodes[next_node].inputs[0]) - -def make_forward(rpdat): - - nodes['Begin'].inputs[1].default_value = rpdat.rp_hdr - nodes['Screen'].inputs[0].default_value = int(rpdat.rp_supersampling) - - if rpdat.rp_gi == 'Voxel GI' or rpdat.rp_gi == 'Voxel AO': - n = nodes['Image 3D Voxels'] - if rpdat.rp_gi == 'Voxel AO': - n.inputs[4].default_value = 'R8' - elif rpdat.rp_voxelgi_hdr: - n.inputs[4].default_value = 'RGBA64' - # One lamp only for now - draw shadow map in advance - links.new(nodes['Draw Meshes SM'].outputs[0], nodes['Branch Function Voxelize'].inputs[0]) - links.new(nodes['Merge Stages Voxelize'].outputs[0], nodes['Set Target Mesh'].inputs[0]) - res = int(rpdat.rp_voxelgi_resolution) - n.inputs[1].default_value = res - n.inputs[2].default_value = res - n.inputs[3].default_value = int(res * float(rpdat.rp_voxelgi_resolution_z)) - n = nodes['Set Viewport Voxels'] - n.inputs[1].default_value = res - n.inputs[2].default_value = res - else: - relink('Bind Target Mesh Voxels', 'Draw Meshes Mesh') - - if not rpdat.rp_hdr: - nodes['lbuf'].inputs[4].default_value = 'RGBA32' - - if not rpdat.rp_depthprepass: - relink('Draw Meshes Depth', 'Bind Target Mesh SM') - - if rpdat.rp_shadowmap != 'None': - n = nodes['Shadow Map'] - n.inputs[1].default_value = n.inputs[2].default_value = int(rpdat.rp_shadowmap) - else: - l = nodes['Begin'].outputs[0].links[0] - links.remove(l) - links.new(nodes['Begin'].outputs[0], nodes['Set Target Mesh'].inputs[0]) - relink('Bind Target Mesh SM', 'Draw Meshes Mesh') # No shadowmap bind - relink('Bind Target Transluc SM', 'Draw Meshes Transluc') - - if rpdat.rp_stereo: - if rpdat.rp_shadowmap != 'None': - links.new(nodes['Bind Target Mesh SM'].outputs[0], nodes['Draw Stereo'].inputs[0]) - else: - links.new(nodes['Clear Target Mesh'].outputs[0], nodes['Draw Stereo'].inputs[0]) - links.new(nodes['Draw Stereo'].outputs[1], nodes['Draw Meshes Mesh'].inputs[0]) - - if rpdat.rp_greasepencil: - if rpdat.rp_shadowmap != 'None': - links.new(nodes['Bind Target Mesh SM'].outputs[0], nodes['Draw Grease Pencil'].inputs[0]) - else: - links.new(nodes['Clear Target Mesh'].outputs[0], nodes['Draw Grease Pencil'].inputs[0]) - links.new(nodes['Draw Grease Pencil'].outputs[0], nodes['Draw Meshes Mesh'].inputs[0]) - - if rpdat.rp_background != 'World': - relink('Draw World', 'Set Target Accum') - if rpdat.rp_background == 'Clear': - nodes['Clear Target Mesh'].inputs[1].default_value = True - - if not rpdat.rp_render_to_texture: - links.new(nodes['Framebuffer'].outputs[0], nodes['Set Target Mesh'].inputs[1]) - if rpdat.rp_background == 'World': - l = nodes['Draw World'].outputs[0].links[0] - elif rpdat.rp_greasepencil: - l = nodes['Draw Grease Pencil'].outputs[0].links[0] - else: - l = nodes['Draw Meshes Mesh'].outputs[0].links[0] - links.remove(l) - - if not rpdat.rp_translucency: - relink('Set Target Accum', 'Draw Compositor + FXAA') - - last_node = 'Draw Compositor + FXAA' - if rpdat.rp_antialiasing == 'SMAA': - pass - elif rpdat.rp_antialiasing == 'TAA': - pass - elif rpdat.rp_antialiasing == 'FXAA': - pass - elif rpdat.rp_antialiasing == 'None': - last_node = 'Draw Compositor' - relink('Draw Compositor + FXAA', 'Draw Compositor') - - if rpdat.rp_overlays: - links.new(last_node.outputs[0], nodes['Clear Target Overlay'].inputs[0]) - - if not rpdat.rp_compositornodes: - relink(last_node, 'Copy') - -def make_deferred(rpdat): - - nodes['Begin'].inputs[1].default_value = rpdat.rp_hdr - nodes['Screen'].inputs[0].default_value = int(rpdat.rp_supersampling) - - if rpdat.rp_gi == 'Voxel GI': - n = nodes['Image 3D Voxels'] - if rpdat.rp_voxelgi_hdr: - n.inputs[4].default_value = 'RGBA64' - - # One lamp only for now - draw shadow map in advance - links.new(nodes['Begin'].outputs[0], nodes['Set Target SM'].inputs[0]) - links.new(nodes['Draw Meshes SM'].outputs[0], nodes['Branch Function Voxelize'].inputs[0]) - l = nodes['Loop Lamps'].outputs[1].links[0] - links.remove(l) - links.new(nodes['Loop Lamps'].outputs[1], nodes['Deferred Light'].inputs[0]) - links.new(nodes['Merge Stages Voxelize'].outputs[0], nodes['Set Target Mesh'].inputs[0]) - res = int(rpdat.rp_voxelgi_resolution) - n.inputs[1].default_value = res - n.inputs[2].default_value = res - n.inputs[3].default_value = int(res * float(rpdat.rp_voxelgi_resolution_z)) - n = nodes['Set Viewport Voxels'] - n.inputs[1].default_value = res - n.inputs[2].default_value = res - links.new(nodes['Image 3D Voxels'].outputs[0], nodes['Deferred Indirect'].inputs[4]) - if rpdat.arm_voxelgi_shadows or rpdat.arm_voxelgi_refraction: - links.new(nodes['Image 3D Voxels'].outputs[0], nodes['Deferred Light'].inputs[4]) - links.new(nodes['Image 3D Voxels'].outputs[0], nodes['Deferred Light.001'].inputs[4]) - elif rpdat.rp_gi == 'Voxel AO': - n = nodes['Image 3D Voxels'] - n.inputs[4].default_value = 'R8' - links.new(nodes['Begin'].outputs[0], nodes['Branch Function Voxelize'].inputs[0]) - links.new(nodes['Merge Stages Voxelize'].outputs[0], nodes['Set Target Mesh'].inputs[0]) - res = int(rpdat.rp_voxelgi_resolution) - n.inputs[1].default_value = res - n.inputs[2].default_value = res - n.inputs[3].default_value = int(res * float(rpdat.rp_voxelgi_resolution_z)) - n = nodes['Set Viewport Voxels'] - n.inputs[1].default_value = res - n.inputs[2].default_value = res - links.new(nodes['Image 3D Voxels'].outputs[0], nodes['Deferred Indirect'].inputs[4]) - - if rpdat.rp_shadowmap != 'None': - n = nodes['Shadow Map'] - n.inputs[1].default_value = n.inputs[2].default_value = int(rpdat.rp_shadowmap) - else: - l = nodes['Loop Lamps'].outputs[1].links[0] - links.remove(l) - links.new(nodes['Loop Lamps'].outputs[1], nodes['Deferred Light'].inputs[0]) - l = nodes['Deferred Light'].inputs[3].links[0] # No shadowmap bind - links.remove(l) - l = nodes['Volumetric Light'].inputs[6].links[0] - links.remove(l) - relink('Bind Target Transluc SM', 'Draw Meshes Transluc') - - if rpdat.rp_volumetriclight: - links.new(nodes['Deferred Light'].outputs[0], nodes['Volumetric Light'].inputs[0]) - - if not rpdat.rp_decals: - relink('Set Target Decal', 'SSAO') - - if rpdat.rp_ssgi == 'RTAO' or rpdat.rp_ssgi == 'RTGI': - l = nodes['SSAO'].inputs[0].links[0] - last_node = l.from_node - links.remove(l) - links.new(last_node.outputs[0], nodes['SSGI'].inputs[0]) - links.new(nodes['SSGI'].outputs[0], nodes['Deferred Indirect'].inputs[0]) - elif rpdat.rp_ssgi != 'SSAO': - relink('SSAO', 'Deferred Indirect') - l = nodes['Deferred Indirect'].inputs[3].links[0] - links.remove(l) - - if rpdat.rp_background != 'World': - relink('Draw World', 'Water') - if rpdat.rp_background == 'Clear': - nodes['Clear Target Mesh'].inputs[1].default_value = True - - if not rpdat.rp_ocean: - relink('Water', 'Draw Meshes Blend') - - if rpdat.rp_blending_state == 'Off': - relink('Draw Meshes Blend', 'Set Target Accum') - - if not rpdat.rp_translucency: - relink('Set Target Accum', 'Bloom') - - if not rpdat.rp_bloom: - relink('Bloom', 'SSS') - - if not rpdat.rp_sss: - relink('SSS', 'SSR') - - if not rpdat.rp_ssr: - relink('SSR', 'Draw Compositor') - - if rpdat.rp_motionblur != 'None': - last_node = nodes['Draw Compositor'].inputs[0].links[0].from_node - if rpdat.rp_motionblur == 'Camera': - links.new(last_node.outputs[0], nodes['Motion Blur'].inputs[0]) - links.new(nodes['Copy MB'].outputs[0], nodes['Draw Compositor'].inputs[0]) - else: # Object - links.new(last_node.outputs[0], nodes['Motion Blur Velocity'].inputs[0]) - links.new(nodes['Copy MBV'].outputs[0], nodes['Draw Compositor'].inputs[0]) - # Velocity - links.new(nodes['gbuffer2'].outputs[0], nodes['GBuffer'].inputs[2]) - # Clear velocity - relink('Set Target Mesh', 'Set Target Veloc') - links.new(nodes['Clear Target Veloc'].outputs[0], nodes['Set Target Mesh'].inputs[0]) - - if rpdat.arm_ssr_half_res: - links.new(nodes['ssra'].outputs[0], nodes['SSR'].inputs[2]) - links.new(nodes['ssrb'].outputs[0], nodes['SSR'].inputs[3]) - - last_node = 'Draw Compositor' - if not rpdat.rp_compositornodes: - pass - - if rpdat.rp_compositornodes and rpdat.rp_autoexposure: - links.new(nodes[last_node].inputs[0].links[0].from_node.outputs[0], nodes['Generate Mipmaps Luminance'].inputs[0]) - links.new(nodes['Generate Mipmaps Luminance'].outputs[0], nodes[last_node].inputs[0]) - nodes['color'].inputs[6].default_value = True # Mipmaps - - if rpdat.rp_overlays: - links.new(nodes[last_node].outputs[0], nodes['Clear Target Overlay'].inputs[0]) - last_node = 'Draw Meshes Overlay' - links.new(nodes[last_node].outputs[0], nodes['SMAA'].inputs[0]) - - if rpdat.rp_antialiasing == 'SMAA': - last_node = 'SMAA' - elif rpdat.rp_antialiasing == 'TAA': - last_node = 'Copy' - links.new(nodes['SMAA'].outputs[0], nodes['TAA'].inputs[0]) - links.new(nodes['Reroute.019'].outputs[0], nodes['SMAA'].inputs[5]) - links.new(nodes['gbuffer2'].outputs[0], nodes['GBuffer'].inputs[2]) - links.new(nodes['Reroute.014'].outputs[0], nodes['SMAA'].inputs[1]) - # Clear velocity - if rpdat.rp_motionblur != 'Object': - relink('Set Target Mesh', 'Set Target Veloc') - links.new(nodes['Clear Target Veloc'].outputs[0], nodes['Set Target Mesh'].inputs[0]) - elif rpdat.rp_antialiasing == 'FXAA': - last_node = 'FXAA' - relink('SMAA', 'FXAA') - elif rpdat.rp_antialiasing == 'None': - last_node = 'Draw Compositor' - l = nodes['Draw Compositor'].outputs[0].links[0] - links.remove(l) - links.new(nodes['Framebuffer'].outputs[0], nodes['Draw Compositor'].inputs[1]) - - if rpdat.rp_supersampling == '4': - links.new(nodes[last_node].outputs[0], nodes['SS Resolve'].inputs[0]) - last_node = 'SS Resolve' - if rpdat.rp_antialiasing == 'SMAA': - links.new(nodes['Reroute.014'].outputs[0], nodes['SMAA'].inputs[1]) - links.new(nodes['Reroute.014'].outputs[0], nodes['SS Resolve'].inputs[2]) - elif rpdat.rp_antialiasing == 'TAA': - links.new(nodes['Reroute.008'].outputs[0], nodes['TAA'].inputs[1]) - links.new(nodes['Reroute.008'].outputs[0], nodes['SS Resolve'].inputs[2]) - elif rpdat.rp_antialiasing == 'FXAA': - links.new(nodes['Reroute.008'].outputs[0], nodes['FXAA'].inputs[1]) - links.new(nodes['Reroute.008'].outputs[0], nodes['SS Resolve'].inputs[2]) - elif rpdat.rp_antialiasing == 'None': - links.new(nodes['Reroute.008'].outputs[0], nodes['Draw Compositor'].inputs[1]) - links.new(nodes['Reroute.008'].outputs[0], nodes['SS Resolve'].inputs[2]) - - if rpdat.rp_eyeadapt: - links.new(nodes[last_node].outputs[0], nodes['Histogram'].inputs[0]) - links.new(nodes['histogram'].outputs[0], nodes['Draw Compositor'].inputs[5]) - - - if rpdat.rp_rendercapture: - # links.new(nodes[last_node].outputs[0], nodes['CopyCapture'].inputs[0]) - fb = nodes['Framebuffer'] - cc = nodes['CopyCapture'] - cn = nodes['Capture'] - for l in fb.outputs[0].links: - if l.to_node != cc: - links.new(cn.outputs[0], l.to_socket) - wrd = bpy.data.worlds['Arm'] - if wrd.rp_rendercapture_format == '8bit': - cn.inputs[4].default_value = 'RGBA32' - elif wrd.rp_rendercapture_format == '16bit': - cn.inputs[4].default_value = 'RGBA64' - elif wrd.rp_rendercapture_format == '32bit': - cn.inputs[4].default_value = 'RGBA128' - -def make_deferred_plus(rpdat): - pass - -def reload_blend_data(): - global first_build - first_build = True - armory_pbr = bpy.data.node_groups.get('Armory PBR') - if armory_pbr != None and len(armory_pbr.inputs) == 14: - armory_pbr.name = 'Armory PBR Old' - armory_pbr = None - if armory_pbr == None: - load_library('Armory PBR') - -def load_library(asset_name, rename=None): - if bpy.data.filepath.endswith('arm_data.blend'): # Prevent load in library itself - return - sdk_path = arm.utils.get_sdk_path() - data_path = sdk_path + '/armory/blender/data/arm_data.blend' - data_names = [asset_name] - - # Remove old - if rename != None and rename in bpy.data.node_groups and asset_name != 'Armory PBR': - bpy.data.node_groups.remove(bpy.data.node_groups[rename], do_unlink=True) - - # Import - data_refs = data_names.copy() - with bpy.data.libraries.load(data_path, link=False) as (data_from, data_to): - data_to.node_groups = data_refs - - for ref in data_refs: - ref.use_fake_user = True - if rename != None: - ref.name = rename - -def register(): - reload_blend_data() - -def unregister(): - pass diff --git a/blender/arm/make_renderpath.py b/blender/arm/make_renderpath.py index 7d8c85fa..ce9be9d6 100755 --- a/blender/arm/make_renderpath.py +++ b/blender/arm/make_renderpath.py @@ -1,967 +1,191 @@ import bpy -from bpy.types import NodeTree, Node, NodeSocket -from bpy.props import * -import os -import sys -import json -import platform -import subprocess import arm.assets as assets import arm.utils -import arm.node_utils as node_utils - -def build_node_trees(assets_path): - fp = arm.utils.get_fp() +def build(): + assets_path = arm.utils.get_sdk_path() + 'armory/Assets/' + wrd = bpy.data.worlds['Arm'] rpdat = arm.utils.get_rp() - # Make sure Assets dir exists - if not os.path.exists(arm.utils.build_dir() + '/compiled/Assets/renderpaths'): - os.makedirs(arm.utils.build_dir() + '/compiled/Assets/renderpaths') - - build_node_trees.assets_path = assets_path mobile_mat = rpdat.arm_material_model == 'Mobile' or rpdat.arm_material_model == 'Solid' if not mobile_mat: # Always include assets.add(assets_path + 'brdf.png') assets.add_embedded_data('brdf.png') - - node_group = bpy.data.node_groups['armory_default'] - build_node_tree(rpdat, node_group) -def build_node_tree(rpdat, node_group): - build_node_tree.rpdat = rpdat - output = {} - dat = {} - output['renderpath_datas'] = [dat] - - path = arm.utils.build_dir() + '/compiled/Assets/renderpaths/' - node_group_name = node_group.name.replace('.', '_') - - rn = get_root_node(node_group) - if rn == None: - return + if rpdat.rp_hdr: + assets.add_khafile_def('rp_hdr') - dat['name'] = node_group_name + assets.add_khafile_def('rp_renderer={0}'.format(rpdat.rp_renderer)) + if rpdat.rp_depthprepass: + assets.add_khafile_def('rp_depthprepass') - # Store main context names - dat['mesh_context'] = 'mesh' - dat['shadows_context'] = 'shadowmap' - - dat['render_targets'], dat['depth_buffers'] = preprocess_renderpath(rn, node_group) - dat['stages'] = [] - - buildNode(dat['stages'], rn, node_group) + if rpdat.rp_shadowmap != 'Off': + assets.add_khafile_def('rp_shadowmap') + assets.add_khafile_def('rp_shadowmap_size={0}'.format(rpdat.rp_shadowmap)) - asset_path = path + node_group_name + '.arm' - arm.utils.write_arm(asset_path, output) - assets.add(asset_path) + assets.add_khafile_def('rp_background={0}'.format(rpdat.rp_background)) + if rpdat.rp_background == 'World': + if '_EnvClouds' in wrd.world_defs: + assets.add(assets_path + 'noise256.png') + assets.add_embedded_data('noise256.png') -def make_set_target(stage, node_group, node, currentNode=None, target_index=1, viewport_scale=1.0): - if currentNode == None: - currentNode = node - - stage['command'] = 'set_target' + if rpdat.rp_render_to_texture: + assets.add_khafile_def('rp_render_to_texture') - # First param is viewport scale - if len(stage['params']) == 0: - stage['params'].append(str(viewport_scale)) - - currentNode = node_utils.find_node_by_link(node_group, currentNode, currentNode.inputs[target_index]) - - if currentNode.bl_idname == 'TargetNodeType' or currentNode.bl_idname == 'ShadowMapNodeType': - targetId = currentNode.inputs[0].default_value - stage['params'].append(targetId) - # Store current target size - buildNode.last_set_target_w = currentNode.inputs[1].default_value - buildNode.last_set_target_h = currentNode.inputs[2].default_value - - elif currentNode.bl_idname == 'GBufferNodeType': - # Set all linked targets - for i in range(0, 5): - if currentNode.inputs[i].is_linked: - make_set_target(stage, node_group, node, currentNode, target_index=i) - - elif currentNode.bl_idname == 'NodeReroute': - make_set_target(stage, node_group, node, currentNode, target_index=0) - - else: # Framebuffer - targetId = '' - stage['params'].append(targetId) - -def make_set_viewport(stage, node_group, node): - stage['command'] = 'set_viewport' - stage['params'].append(node.inputs[1].default_value) # W - stage['params'].append(node.inputs[2].default_value) # H - -def make_clear_target(stage, color_val=None, depth_val=None, stencil_val=None): - stage['command'] = 'clear_target' - if color_val != None: - stage['params'].append('color') - if color_val == -1: # Clear to world background color - stage['params'].append('-1') + if rpdat.rp_compositornodes: + assets.add_khafile_def('rp_compositornodes') + compo_depth = False + if wrd.arm_tonemap != 'Off': + wrd.compo_defs = '_CTone' + wrd.arm_tonemap + if rpdat.rp_antialiasing != 'Off': + wrd.compo_defs += '_CFXAA' + if wrd.arm_letterbox: + wrd.compo_defs += '_CLetterbox' + if wrd.arm_grain: + wrd.compo_defs += '_CGrain' + if bpy.data.scenes[0].cycles.film_exposure != 1.0: + wrd.compo_defs += '_CExposure' + if wrd.arm_fog: + wrd.compo_defs += '_CFog' + compo_depth = True + if len(bpy.data.cameras) > 0 and bpy.data.cameras[0].dof_distance > 0.0: + wrd.compo_defs += '_CDOF' + compo_depth = True + if compo_depth: + wrd.compo_defs += '_CDepth' + if wrd.arm_lens_texture != '': + wrd.compo_defs += '_CLensTex' + assets.add_embedded_data('lenstexture.jpg') + if wrd.arm_fisheye: + wrd.compo_defs += '_CFishEye' + if wrd.arm_vignette: + wrd.compo_defs += '_CVignette' + if wrd.arm_lensflare: + wrd.compo_defs += '_CGlare' + assets.add_shader2('compositor_pass', 'compositor_pass') else: - stage['params'].append(str(arm.utils.to_hex(color_val))) - if depth_val != None: - stage['params'].append('depth') - stage['params'].append(str(depth_val)) - if stencil_val != None: - stage['params'].append('stencil') - stage['params'].append(str(stencil_val)) + assets.add_shader2('copy_pass', 'copy_pass') -def make_clear_image(stage, image_name, color_val): - stage['command'] = 'clear_image' - stage['params'].append(image_name) - stage['params'].append(str(arm.utils.to_hex(color_val))) + assets.add_khafile_def('rp_antialiasing={0}'.format(rpdat.rp_antialiasing)) -def make_generate_mipmaps(stage, node_group, node): - stage['command'] = 'generate_mipmaps' - link = node_utils.find_link(node_group, node, node.inputs[1]) - target_node = link.from_node - while target_node.bl_idname == 'NodeReroute': # Step through reroutes - target_node = node_utils.find_node_by_link(node_group, target_node, target_node.inputs[0]) - stage['params'].append(target_node.inputs[0].default_value) + if rpdat.rp_antialiasing == 'SMAA' or rpdat.rp_antialiasing == 'TAA': + assets.add_shader2('smaa_edge_detect', 'smaa_edge_detect') + assets.add_shader2('smaa_blend_weight', 'smaa_blend_weight') + assets.add_shader2('smaa_neighborhood_blend', 'smaa_neighborhood_blend') + assets.add(assets_path + 'smaa_area.png') + assets.add(assets_path + 'smaa_search.png') + assets.add_embedded_data('smaa_area.png') + assets.add_embedded_data('smaa_search.png') + wrd.world_defs += '_SMAA' + if rpdat.rp_antialiasing == 'TAA': + assets.add_shader2('taa_pass', 'taa_pass') + assets.add_shader2('copy_pass', 'copy_pass') -def make_draw_meshes(stage, node_group, node): - stage['command'] = 'draw_meshes' - # Context - context = node.inputs[1].default_value - # Store shadowmap size - if context == 'shadowmap': - bpy.data.worlds['Arm'].arm_shadowmap_size_cache = buildNode.last_set_target_w - stage['params'].append(context) - # Order - order = node.inputs[2].default_value - stage['params'].append(order) - -def make_draw_rects(stage, node_group, node): - stage['command'] = 'draw_rects' - context = node.inputs[1].default_value - stage['params'].append(context) - -def make_draw_decals(stage, node_group, node): - stage['command'] = 'draw_decals' - context = node.inputs[1].default_value - stage['params'].append(context) - -def make_bind_target(stage, node_group, node, constant_name, currentNode=None, target_index=1): - if currentNode == None: - currentNode = node - - stage['command'] = 'bind_target' - - link = node_utils.find_link(node_group, currentNode, currentNode.inputs[target_index]) - currentNode = link.from_node - - if currentNode.bl_idname == 'NodeReroute': - make_bind_target(stage, node_group, node, constant_name, currentNode=currentNode, target_index=0) - - elif currentNode.bl_idname == 'GBufferNodeType': - for i in range(0, 5): - if currentNode.inputs[i].is_linked: - targetNode = node_utils.find_node_by_link(node_group, currentNode, currentNode.inputs[i]) - targetId = targetNode.inputs[0].default_value - # if i == 0 and targetNode.inputs[3].default_value == True: # Depth - if targetNode.inputs[3].is_linked: # Depth - db_node = node_utils.find_node_by_link(node_group, targetNode, targetNode.inputs[3]) - db_id = db_node.inputs[0].default_value - stage['params'].append('_' + db_id) - stage['params'].append(constant_name + 'D') - stage['params'].append(targetId) # Color buffer - stage['params'].append(constant_name + str(i)) - - elif currentNode.bl_idname == 'TargetNodeType' or currentNode.bl_idname == 'ImageNodeType' or currentNode.bl_idname == 'Image3DNodeType': - targetId = currentNode.inputs[0].default_value - stage['params'].append(targetId) - stage['params'].append(constant_name) - - elif currentNode.bl_idname == 'ShadowMapNodeType': - targetId = currentNode.inputs[0].default_value - stage['params'].append(targetId) - stage['params'].append(constant_name) - - elif currentNode.bl_idname == 'DepthBufferNodeType': - targetId = '_' + currentNode.inputs[0].default_value - stage['params'].append(targetId) - stage['params'].append(constant_name) - -def make_draw_material_quad(stage, node_group, node, context_index=1): - stage['command'] = 'draw_material_quad' - material_context = node.inputs[context_index].default_value - stage['params'].append(material_context) - # Include data and shaders - shader_context = node.inputs[context_index].default_value - scon = shader_context.split('/') - dir_name = scon[2] - # No world defs for material passes - data_name = scon[2] - assets.add_shader2(dir_name, data_name) - -def make_draw_quad(stage, node_group, node, context_index=1, shader_context=None): - stage['command'] = 'draw_shader_quad' - if shader_context == None: - shader_context = node.inputs[context_index].default_value - scon = shader_context.split('/') - stage['params'].append(scon[0] + '/' + scon[1] + '/' + scon[2]) - # Include data and shaders - dir_name = scon[0] - # Append world defs - data_name = scon[1] - assets.add_shader2(dir_name, data_name) - -def make_draw_world(stage, node_group, node, dome=True): - if dome: - stage['command'] = 'draw_skydome' - else: - stage['command'] = 'draw_material_quad' - # stage['params'].append(wname + '_material/' + wname + '_material/world') - stage['params'].append('_worldMaterial') # Link to active world - # Link assets - if '_EnvClouds' in bpy.data.worlds['Arm'].world_defs: - assets.add(build_node_trees.assets_path + 'noise256.png') - assets.add_embedded_data('noise256.png') - -def make_draw_compositor(stage, node_group, node, with_fxaa=False): - scon = 'compositor_pass' - wrd = bpy.data.worlds['Arm'] - world_defs = wrd.world_defs - compositor_defs = '' - compositor_defs += '_CTone' + wrd.arm_tonemap - # Additional compositor flags - compo_depth = False # Read depth - # compo_pos = False # Construct position from depth - if with_fxaa: # FXAA directly in compositor, useful for forward path - compositor_defs += '_CFXAA' - if wrd.arm_letterbox: - compositor_defs += '_CLetterbox' - if wrd.arm_grain: - compositor_defs += '_CGrain' - if bpy.data.scenes[0].cycles.film_exposure != 1.0: - compositor_defs += '_CExposure' - if wrd.arm_fog: - compositor_defs += '_CFog' - compo_depth = True - # compo_pos = True - if len(bpy.data.cameras) > 0 and bpy.data.cameras[0].dof_distance > 0.0: - compositor_defs += '_CDOF' - compo_depth = True - # if compo_pos: - # compositor_defs += '_CPos' - # compo_depth = True - if compo_depth: - compositor_defs += '_CDepth' - - if wrd.arm_lens_texture != '': - compositor_defs += '_CLensTex' - assets.add_embedded_data('lenstexture.jpg') - - if wrd.arm_fisheye: - compositor_defs += '_CFishEye' - - if wrd.arm_vignette: - compositor_defs += '_CVignette' - - if wrd.arm_lensflare: - compositor_defs += '_CGlare' - - wrd.compo_defs = compositor_defs - - defs = world_defs + compositor_defs - data_name = scon - - stage['command'] = 'draw_shader_quad' - stage['params'].append(data_name + '/' + data_name + '/' + scon) - # Include data and shaders - assets.add_shader2(scon, data_name) - -def make_draw_grease_pencil(stage, node_group, node): - stage['command'] = 'draw_grease_pencil' - context = node.inputs[1].default_value - stage['params'].append(context) - -def make_call_function(stage, node_group, node): - stage['command'] = 'call_function' - fstr = node.inputs[1].default_value - stage['params'].append(fstr) - -def make_branch_function(stage, node_group, node): - make_call_function(stage, node_group, node) - -def process_call_function(stage, stages, node, node_group): - # Step till merge node - stage['returns_true'] = [] - if node.outputs[0].is_linked: - stageNode = node_utils.find_node_by_link_from(node_group, node, node.outputs[0]) - buildNode(stage['returns_true'], stageNode, node_group) - - stage['returns_false'] = [] - margeNode = None - if node.outputs[1].is_linked: - stageNode = node_utils.find_node_by_link_from(node_group, node, node.outputs[1]) - margeNode = buildNode(stage['returns_false'], stageNode, node_group) - - # Continue using top level stages after merge node - if margeNode != None: - afterMergeNode = node_utils.find_node_by_link_from(node_group, margeNode, margeNode.outputs[0]) - buildNode(stages, afterMergeNode, node_group) - -def make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[3, 5, 7], bind_target_constants=None, shader_context=None, viewport_scale=1.0, with_clear=False, with_draw_quad=True): - # Set target - if target_index != None and node.inputs[target_index].is_linked: - stage = {} - stage['params'] = [] - make_set_target(stage, node_group, node, target_index=target_index, viewport_scale=viewport_scale) - stages.append(stage) - # Optinal clear - if with_clear: - stage = {} - stage['params'] = [] - make_clear_target(stage, color_val=[0.0, 0.0, 0.0, 1.0]) - stages.append(stage) - # Bind targets - stage = {} - stage['params'] = [] - buildNode.last_bind_target = stage - bind_target_used = False - for i in range(0, len(bind_target_indices)): - index = bind_target_indices[i] - if len(node.inputs) > index and node.inputs[index].is_linked: - bind_target_used = True - if bind_target_constants == None: - constant_name = node.inputs[index + 1].default_value - else: - constant_name = bind_target_constants[i] - make_bind_target(stage, node_group, node, constant_name, target_index=index) - if bind_target_used: - stages.append(stage) - stage = {} - stage['params'] = [] - # Draw quad - if with_draw_quad: - make_draw_quad(stage, node_group, node, context_index=2, shader_context=shader_context) - stages.append(stage) - -def make_ssao_pass(stages, node_group, node): - rpdat = build_node_tree.rpdat - sc = 0.5 if rpdat.arm_ssao_half_res else 1.0 - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[3, 4], bind_target_constants=['gbufferD', 'gbuffer0'], shader_context='ssao_pass/ssao_pass/ssao_pass', viewport_scale=sc) - make_quad_pass(stages, node_group, node, target_index=2, bind_target_indices=[1, 4], bind_target_constants=['tex', 'gbuffer0'], shader_context='blur_edge_pass/blur_edge_pass/blur_edge_pass_x', viewport_scale=sc) - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2, 4], bind_target_constants=['tex', 'gbuffer0'], shader_context='blur_edge_pass/blur_edge_pass/blur_edge_pass_y') - assets.add(build_node_trees.assets_path + 'noise8.png') - assets.add_embedded_data('noise8.png') - -def make_ssao_reproject_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[3, 4, 2, 5], bind_target_constants=['gbufferD', 'gbuffer0', 'slast', 'sveloc'], shader_context='ssao_reproject_pass/ssao_reproject_pass/ssao_reproject_pass') - make_quad_pass(stages, node_group, node, target_index=2, bind_target_indices=[1, 4], bind_target_constants=['tex', 'gbuffer0'], shader_context='blur_edge_pass/blur_edge_pass/blur_edge_pass_x') - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2, 4], bind_target_constants=['tex', 'gbuffer0'], shader_context='blur_edge_pass/blur_edge_pass/blur_edge_pass_y') - assets.add(build_node_trees.assets_path + 'noise8.png') - assets.add_embedded_data('noise8.png') - -def make_apply_ssao_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=2, bind_target_indices=[4, 5], bind_target_constants=['gbufferD', 'gbuffer0'], shader_context='ssao_pass/ssao_pass/ssao_pass') - make_quad_pass(stages, node_group, node, target_index=3, bind_target_indices=[2, 5], bind_target_constants=['tex', 'gbuffer0'], shader_context='blur_edge_pass/blur_edge_pass/blur_edge_pass_x') - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[3, 5], bind_target_constants=['tex', 'gbuffer0'], shader_context='blur_edge_pass/blur_edge_pass/blur_edge_pass_y_blend') - assets.add(build_node_trees.assets_path + 'noise8.png') - assets.add_embedded_data('noise8.png') - -def make_ssr_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=2, bind_target_indices=[4, 5, 6], bind_target_constants=['tex', 'gbufferD', 'gbuffer0'], shader_context='ssr_pass/ssr_pass/ssr_pass') - make_quad_pass(stages, node_group, node, target_index=3, bind_target_indices=[2, 6], bind_target_constants=['tex', 'gbuffer0'], shader_context='blur_adaptive_pass/blur_adaptive_pass/blur_adaptive_pass_x') - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[3, 6], bind_target_constants=['tex', 'gbuffer0'], shader_context='blur_adaptive_pass/blur_adaptive_pass/blur_adaptive_pass_y3_blend') - -def make_ssgi_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[3, 4, 5], bind_target_constants=['gbufferD', 'gbuffer0', 'gbuffer1'], shader_context='ssgi_pass/ssgi_pass/ssgi_pass') - make_quad_pass(stages, node_group, node, target_index=2, bind_target_indices=[1, 4], bind_target_constants=['tex', 'gbuffer0'], shader_context='ssgi_blur_pass/ssgi_blur_pass/ssgi_blur_pass_x') - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2, 4], bind_target_constants=['tex', 'gbuffer0'], shader_context='ssgi_blur_pass/ssgi_blur_pass/ssgi_blur_pass_y') - -def make_bloom_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=2, bind_target_indices=[4], bind_target_constants=['tex'], shader_context='bloom_pass/bloom_pass/bloom_pass') - make_quad_pass(stages, node_group, node, target_index=3, bind_target_indices=[2], bind_target_constants=['tex'], shader_context='blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_x') - make_quad_pass(stages, node_group, node, target_index=2, bind_target_indices=[3], bind_target_constants=['tex'], shader_context='blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_y') - make_quad_pass(stages, node_group, node, target_index=3, bind_target_indices=[2], bind_target_constants=['tex'], shader_context='blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_x') - make_quad_pass(stages, node_group, node, target_index=2, bind_target_indices=[3], bind_target_constants=['tex'], shader_context='blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_y') - make_quad_pass(stages, node_group, node, target_index=3, bind_target_indices=[2], bind_target_constants=['tex'], shader_context='blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_x') - make_quad_pass(stages, node_group, node, target_index=2, bind_target_indices=[3], bind_target_constants=['tex'], shader_context='blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_y') - make_quad_pass(stages, node_group, node, target_index=3, bind_target_indices=[2], bind_target_constants=['tex'], shader_context='blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_x') - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[3], bind_target_constants=['tex'], shader_context='blur_gaus_pass/blur_gaus_pass/blur_gaus_pass_y_blend') - -def make_motion_blur_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2, 3, 4], bind_target_constants=['tex', 'gbufferD', 'gbuffer0'], shader_context='motion_blur_pass/motion_blur_pass/motion_blur_pass') - -def make_motion_blur_velocity_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2, 3, 4], bind_target_constants=['tex', 'gbuffer0', 'sveloc'], shader_context='motion_blur_veloc_pass/motion_blur_veloc_pass/motion_blur_veloc_pass') - -def make_copy_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2], bind_target_constants=['tex'], shader_context='copy_pass/copy_pass/copy_pass') - -def make_materialid_to_depth(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2], bind_target_constants=['tex'], shader_context='matid_to_depth/matid_to_depth/matid_to_depth') - -def make_blend_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2], bind_target_constants=['tex'], shader_context='blend_pass/blend_pass/blend_pass') - -def make_combine_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2, 3], bind_target_constants=['tex', 'tex2'], shader_context='combine_pass/combine_pass/combine_pass') - -def make_histogram_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2], bind_target_constants=['tex'], shader_context='histogram_pass/histogram_pass/histogram_pass') - -def make_blur_basic_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=2, bind_target_indices=[1], bind_target_constants=['tex'], shader_context='blur_pass/blur_pass/blur_pass_x') - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2], bind_target_constants=['tex'], shader_context='blur_pass/blur_pass/blur_pass_y') - -def make_debug_normals_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2], bind_target_constants=['tex'], shader_context='debug_normals_pass/debug_normals_pass/debug_normals_pass') - -def make_fxaa_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2], bind_target_constants=['tex'], shader_context='fxaa_pass/fxaa_pass/fxaa_pass') - -def make_ss_resolve(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2], bind_target_constants=['tex'], shader_context='supersample_resolve/supersample_resolve/supersample_resolve') - -def make_smaa_pass(stages, node_group, node): - stage = {} - stage['params'] = [] - make_set_target(stage, node_group, node, target_index=2) - stages.append(stage) - - stage = {} - stage['params'] = [] - make_clear_target(stage, color_val=[0.0, 0.0, 0.0, 0.0]) - stages.append(stage) - - make_quad_pass(stages, node_group, node, target_index=None, bind_target_indices=[4], bind_target_constants=['colorTex'], shader_context='smaa_edge_detect/smaa_edge_detect/smaa_edge_detect') - - stage = {} - stage['params'] = [] - make_set_target(stage, node_group, node, target_index=3) - stages.append(stage) - - stage = {} - stage['params'] = [] - make_clear_target(stage, color_val=[0.0, 0.0, 0.0, 0.0]) - stages.append(stage) - - make_quad_pass(stages, node_group, node, target_index=None, bind_target_indices=[2], bind_target_constants=['edgesTex'], shader_context='smaa_blend_weight/smaa_blend_weight/smaa_blend_weight') - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[4, 3, 5], bind_target_constants=['colorTex', 'blendTex', 'sveloc'], shader_context='smaa_neighborhood_blend/smaa_neighborhood_blend/smaa_neighborhood_blend') - assets.add(build_node_trees.assets_path + 'smaa_area.png') - assets.add(build_node_trees.assets_path + 'smaa_search.png') - assets.add_embedded_data('smaa_area.png') - assets.add_embedded_data('smaa_search.png') - -def make_taa_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2, 3, 4], bind_target_constants=['tex', 'tex2', 'sveloc'], shader_context='taa_pass/taa_pass/taa_pass') - -def make_sss_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[3, 4, 5], bind_target_constants=['tex', 'gbufferD', 'gbuffer1'], shader_context='sss_pass/sss_pass/sss_pass_x') - make_quad_pass(stages, node_group, node, target_index=2, bind_target_indices=[3, 4, 5], bind_target_constants=['tex', 'gbufferD', 'gbuffer1'], shader_context='sss_pass/sss_pass/sss_pass_y') - -def make_water_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2, 3], bind_target_constants=['gbufferD', 'shadowMap'], shader_context='water_pass/water_pass/water_pass') - -def make_deferred_light_pass(stages, node_group, node): - rpdat = build_node_tree.rpdat - if rpdat.arm_voxelgi_shadows or rpdat.arm_voxelgi_refraction: - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2, 3, 4], bind_target_constants=['gbuffer', 'shadowMap', 'voxels'], shader_context='', with_draw_quad=False) - else: - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2, 3], bind_target_constants=['gbuffer', 'shadowMap'], shader_context='', with_draw_quad=False) - stage = {} - stage['command'] = 'call_function' - stage['params'] = ['iron.data.RenderPath.lampIsSun'] - # Draw fs quad - stage_true = {} - stage_true['params'] = [] - make_draw_quad(stage_true, node_group, node, context_index=2, shader_context='deferred_light_quad/deferred_light_quad/deferred_light_quad') - # Draw lamp volume - stage_false = {} - stage_false['params'] = [] - make_draw_quad(stage_false, node_group, node, context_index=2, shader_context='deferred_light/deferred_light/deferred_light') - stage_false['command'] = 'draw_lamp_volume' - stage['returns_true'] = [stage_true] - stage['returns_false'] = [stage_false] - stages.append(stage) - -def make_volumetric_light_pass(stages, node_group, node): - # make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[5, 6], bind_target_constants=['gbufferD', 'shadowMap'], shader_context='volumetric_light/volumetric_light/volumetric_light_blend') - make_quad_pass(stages, node_group, node, target_index=2, bind_target_indices=[5, 6], bind_target_constants=['gbufferD', 'shadowMap'], shader_context='', with_draw_quad=False) - stage = {} - stage['command'] = 'call_function' - stage['params'] = ['iron.data.RenderPath.lampIsSun'] - # Draw fs quad - stage_true = {} - stage_true['params'] = [] - make_draw_quad(stage_true, node_group, node, context_index=2, shader_context='volumetric_light_quad/volumetric_light_quad/volumetric_light_quad') - # Draw lamp volume - stage_false = {} - stage_false['params'] = [] - make_draw_quad(stage_false, node_group, node, context_index=2, shader_context='volumetric_light/volumetric_light/volumetric_light') - stage_false['command'] = 'draw_lamp_volume' - stage['returns_true'] = [stage_true] - stage['returns_false'] = [stage_false] - stages.append(stage) - # Blur - make_quad_pass(stages, node_group, node, target_index=3, bind_target_indices=[2, 4], bind_target_constants=['tex', 'gbuffer0'], shader_context='blur_edge_pass/blur_edge_pass/blur_edge_pass_x') - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[3, 4], bind_target_constants=['tex', 'gbuffer0'], shader_context='blur_edge_pass/blur_edge_pass/blur_edge_pass_y_blend_add') - -def make_deferred_indirect_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2, 3, 4], bind_target_constants=['gbuffer', 'ssaotex', 'voxels'], shader_context='deferred_indirect/deferred_indirect/deferred_indirect') - -def make_translucent_resolve_pass(stages, node_group, node): - make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2], bind_target_constants=['gbuffer'], shader_context='translucent_resolve/translucent_resolve/translucent_resolve') - -# Returns merge node -def buildNode(stages, node, node_group): - stage = {} - stage['params'] = [] - - append_stage = True - - if node.bl_idname == 'MergeStagesNodeType': - return node - - elif node.bl_idname == 'SetTargetNodeType': - buildNode.last_bind_target = None - make_set_target(stage, node_group, node) - - elif node.bl_idname == 'SetViewportNodeType': - make_set_viewport(stage, node_group, node) - - elif node.bl_idname == 'ClearTargetNodeType': - color_val = None - depth_val = None - stencil_val = None - if node.inputs[1].default_value == True: - if node.inputs[2].is_linked: # Assume background color node is linked - color_val = -1 # Clear to world.background_color - else: - color_val = node.inputs[2].default_value - if node.inputs[3].default_value == True: - depth_val = node.inputs[4].default_value - if node.inputs[5].default_value == True: - stencil_val = node.inputs[6].default_value - make_clear_target(stage, color_val=color_val, depth_val=depth_val, stencil_val=stencil_val) - - elif node.bl_idname == 'ClearImageNodeType': - image_node = node.inputs[1].links[0].from_node - image_name = image_node.inputs[0].default_value - color_val = node.inputs[2].default_value - make_clear_image(stage, image_name, color_val) - - elif node.bl_idname == 'GenerateMipmapsNodeType': - make_generate_mipmaps(stage, node_group, node) - - elif node.bl_idname == 'DrawMeshesNodeType': - make_draw_meshes(stage, node_group, node) - - elif node.bl_idname == 'DrawRectsNodeType': - make_draw_rects(stage, node_group, node) - - elif node.bl_idname == 'DrawDecalsNodeType': - make_draw_decals(stage, node_group, node) - - elif node.bl_idname == 'BindTargetNodeType': - if buildNode.last_bind_target is not None: - stage = buildNode.last_bind_target - append_stage = False - buildNode.last_bind_target = stage - constant_name = node.inputs[2].default_value - make_bind_target(stage, node_group, node, constant_name) - - elif node.bl_idname == 'DrawMaterialQuadNodeType': - make_draw_material_quad(stage, node_group, node) - - elif node.bl_idname == 'DrawQuadNodeType': - make_draw_quad(stage, node_group, node) - - elif node.bl_idname == 'DrawWorldNodeType': - # Bind depth for quad - # if node.inputs[1].is_linked: - # stage = {} - # stage['params'] = [] - # buildNode.last_bind_target = stage - # if node.inputs[1].is_linked: - # make_bind_target(stage, node_group, node, target_index=1, constant_name='gbufferD') - # stages.append(stage) - stage = {} - stage['params'] = [] - # Draw quad - # make_draw_world(stage, node_group, node, dome=False) - # Draw dome - make_draw_world(stage, node_group, node, dome=True) - - elif node.bl_idname == 'DrawCompositorNodeType' or node.bl_idname == 'DrawCompositorWithFXAANodeType': - # Set target - if node.inputs[1].is_linked: - make_set_target(stage, node_group, node) - stages.append(stage) - # Bind targets - if node.inputs[2].is_linked or node.inputs[3].is_linked or node.inputs[4].is_linked or (len(node.inputs) > 5 and node.inputs[5].is_linked): - stage = {} - stage['params'] = [] - buildNode.last_bind_target = stage - if node.inputs[2].is_linked: - make_bind_target(stage, node_group, node, target_index=2, constant_name='tex') - if node.inputs[3].is_linked: - make_bind_target(stage, node_group, node, target_index=3, constant_name='gbufferD') - if node.inputs[4].is_linked: - make_bind_target(stage, node_group, node, target_index=4, constant_name='gbuffer0') - if (len(node.inputs) > 5 and node.inputs[5].is_linked): - make_bind_target(stage, node_group, node, target_index=5, constant_name='histogram') - stages.append(stage) - # Draw quad - stage = {} - stage['params'] = [] - with_fxaa = node.bl_idname == 'DrawCompositorWithFXAANodeType' - make_draw_compositor(stage, node_group, node, with_fxaa=with_fxaa) - - elif node.bl_idname == 'DrawGreasePencilNodeType': - stage = {} - stage['params'] = [] - make_draw_grease_pencil(stage, node_group, node) - - elif node.bl_idname == 'BranchFunctionNodeType': - make_branch_function(stage, node_group, node) - stages.append(stage) - process_call_function(stage, stages, node, node_group) - return - - elif node.bl_idname == 'LoopStagesNodeType': - # Just repeats the commands - append_stage = False - if node.outputs[1].is_linked: - count = node.inputs[2].default_value - for i in range(0, count): - loopNode = node_utils.find_node_by_link_from(node_group, node, node.outputs[1]) - buildNode(stages, loopNode, node_group) - - elif node.bl_idname == 'LoopLampsNodeType': - append_stage = False - stage['command'] = 'loop_lamps' - stages.append(stage) - stage['returns_true'] = [] - if node.outputs[1].is_linked: - loopNode = node_utils.find_node_by_link_from(node_group, node, node.outputs[1]) - buildNode(stage['returns_true'], loopNode, node_group) - - elif node.bl_idname == 'DrawStereoNodeType': - append_stage = False - stage['command'] = 'draw_stereo' - stages.append(stage) - stage['returns_true'] = [] - if node.outputs[1].is_linked: - loopNode = node_utils.find_node_by_link_from(node_group, node, node.outputs[1]) - buildNode(stage['returns_true'], loopNode, node_group) - - elif node.bl_idname == 'CallFunctionNodeType': - make_call_function(stage, node_group, node) - - elif node.bl_idname == 'QuadPassNodeType': - make_quad_pass(stages, node_group, node) - append_stage = False - - elif node.bl_idname == 'SSAOPassNodeType': - make_ssao_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'SSAOReprojectPassNodeType': - make_ssao_reproject_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'ApplySSAOPassNodeType': - make_apply_ssao_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'SSRPassNodeType': - make_ssr_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'SSGIPassNodeType': - make_ssgi_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'BloomPassNodeType': - make_bloom_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'MotionBlurPassNodeType': - make_motion_blur_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'MotionBlurVelocityPassNodeType': - make_motion_blur_velocity_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'CopyPassNodeType': - make_copy_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'MatIDToDepthNodeType': - make_materialid_to_depth(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'BlendPassNodeType': - make_blend_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'CombinePassNodeType': - make_combine_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'HistogramPassNodeType': - make_histogram_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'BlurBasicPassNodeType': - make_blur_basic_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'DebugNormalsPassNodeType': - make_debug_normals_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'FXAAPassNodeType': - make_fxaa_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'SSResolveNodeType': - make_ss_resolve(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'SMAAPassNodeType': - make_smaa_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'TAAPassNodeType': - make_taa_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'SSSPassNodeType': - make_sss_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'WaterPassNodeType': - make_water_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'DeferredLightPassNodeType': - make_deferred_light_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'DeferredIndirectPassNodeType': - make_deferred_indirect_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'VolumetricLightPassNodeType': - make_volumetric_light_pass(stages, node_group, node) - append_stage = False - elif node.bl_idname == 'TranslucentResolvePassNodeType': - make_translucent_resolve_pass(stages, node_group, node) - append_stage = False - - if append_stage: - stages.append(stage) - - # Build next stage - if node.outputs[0].is_linked: - stageNode = node_utils.find_node_by_link_from(node_group, node, node.outputs[0]) - buildNode(stages, stageNode, node_group) - - return None - -# Used to merge bind target nodes into one stage -buildNode.last_bind_target = None -# Used to determine shadowmap size -buildNode.last_set_target_w = 0 -buildNode.last_set_target_h = 0 - -def get_root_node(node_group): - # Find first node linked to begin node - rn = None - for n in node_group.nodes: - if n.bl_idname == 'BeginNodeType': - rn = node_utils.find_node_by_link_from(node_group, n, n.outputs[0]) - break - return rn - -dynRes_added = False -def preprocess_renderpath(root_node, node_group): - global dynRes_added - dynRes_added = False - render_targets = [] - render_targets3D = [] - depth_buffers = [] - preprocess_renderpath.velocity_def_added = False - traverse_renderpath(root_node, node_group, render_targets, depth_buffers) - return render_targets, depth_buffers - -def traverse_renderpath(node, node_group, render_targets, depth_buffers): - # Gather defs from linked nodes - wrd = bpy.data.worlds['Arm'] - if node.bl_idname == 'TAAPassNodeType' or node.bl_idname == 'MotionBlurVelocityPassNodeType' or node.bl_idname == 'SSAOReprojectPassNodeType': - if preprocess_renderpath.velocity_def_added == False: + if rpdat.rp_antialiasing == 'TAA' or rpdat.rp_motionblur == 'Object': assets.add_khafile_def('arm_veloc') wrd.world_defs += '_Veloc' - preprocess_renderpath.velocity_def_added = True - if node.bl_idname == 'TAAPassNodeType': - assets.add_khafile_def('arm_taa') - # wrd.world_defs += '_TAA' - elif node.bl_idname == 'SMAAPassNodeType': - wrd.world_defs += '_SMAA' + if rpdat.rp_antialiasing == 'TAA': + assets.add_khafile_def('arm_taa') - elif node.bl_idname == 'SSSPassNodeType': - wrd.world_defs += '_SSS' + assets.add_khafile_def('rp_supersampling={0}'.format(rpdat.rp_supersampling)) + if rpdat.rp_supersampling == '4': + assets.add_shader2('supersample_resolve', 'supersample_resolve') - elif node.bl_idname == 'HistogramPassNodeType': - wrd.world_defs += '_Hist' + if rpdat.rp_overlays: + assets.add_khafile_def('rp_overlays') - elif node.bl_idname == 'SSAOPassNodeType' or node.bl_idname == 'ApplySSAOPassNodeType' or node.bl_idname == 'SSAOReprojectPassNodeType' or \ - node.bl_idname == 'SSGIPassNodeType': - wrd.world_defs += '_SSAO' + if rpdat.rp_translucency: + assets.add_khafile_def('rp_translucency') + assets.add_shader2('translucent_resolve', 'translucent_resolve') - elif node.bl_idname == 'DrawStereoNodeType': + if rpdat.rp_stereo: + assets.add_khafile_def('rp_stereo') assets.add_khafile_def('arm_vr') wrd.world_defs += '_VR' - assets.add(build_node_trees.assets_path + 'vr.png') + assets.add(assets_path + 'vr.png') assets.add_embedded_data('vr.png') - elif node.bl_idname == 'CallFunctionNodeType': - global dynRes_added - fstr = node.inputs[1].default_value - if not dynRes_added and fstr.startswith('armory.renderpath.DynamicResolutionScale'): - wrd.world_defs += '_DynRes' - dynRes_added = True + assets.add_khafile_def('rp_gi={0}'.format(rpdat.rp_gi)) + if rpdat.rp_gi != 'Off': + assets.add_khafile_def('rp_gi={0}'.format(rpdat.rp_gi)) + assets.add_khafile_def('rp_voxelgi_resolution={0}'.format(rpdat.rp_voxelgi_resolution)) + assets.add_khafile_def('rp_voxelgi_resolution_z={0}'.format(rpdat.rp_voxelgi_resolution_z)) + if rpdat.rp_voxelgi_hdr: + assets.add_khafile_def('rp_voxelgi_hdr') + if rpdat.arm_voxelgi_shadows: + assets.add_khafile_def('rp_voxelgi_shadows') + if rpdat.arm_voxelgi_refraction: + assets.add_khafile_def('rp_voxelgi_refraction') - # Collect render targets - if node.bl_idname == 'SetTargetNodeType' or node.bl_idname == 'BindTargetNodeType' or node.bl_idname == 'QuadPassNodeType' or node.bl_idname == 'DrawCompositorNodeType' or node.bl_idname == 'DrawCompositorWithFXAANodeType': - if node.inputs[1].is_linked: - tnode = node_utils.find_node_by_link(node_group, node, node.inputs[1]) - parse_render_target(tnode, node_group, render_targets, depth_buffers) + if rpdat.arm_rp_resolution != 'Display': + assets.add_khafile_def('rp_resolution={0}'.format(rpdat.arm_rp_resolution)) - # Traverse loops - elif node.bl_idname == 'LoopStagesNodeType' or node.bl_idname == 'LoopLampsNodeType' or node.bl_idname == 'DrawStereoNodeType': - if node.outputs[1].is_linked: - loop_node = node_utils.find_node_by_link_from(node_group, node, node.outputs[1]) - traverse_renderpath(loop_node, node_group, render_targets, depth_buffers) - - # Prebuilt - elif node.bl_idname == 'MotionBlurPassNodeType' or node.bl_idname == 'MotionBlurVelocityPassNodeType' or node.bl_idname == 'CopyPassNodeType' or node.bl_idname == 'MatIDToDepthNodeType' or node.bl_idname == 'BlendPassNodeType' or node.bl_idname == 'CombinePassNodeType' or node.bl_idname == 'HistogramPassNodeType' or node.bl_idname == 'DebugNormalsPassNodeType' or node.bl_idname == 'FXAAPassNodeType' or node.bl_idname == 'SSResolveNodeType' or node.bl_idname == 'TAAPassNodeType' or node.bl_idname == 'WaterPassNodeType' or node.bl_idname == 'DeferredLightPassNodeType' or node.bl_idname == 'DeferredIndirectPassNodeType' or node.bl_idname == 'VolumetricLightPassNodeType' or node.bl_idname == 'TranslucentResolvePassNodeType': - if node.inputs[1].is_linked: - tnode = node_utils.find_node_by_link(node_group, node, node.inputs[1]) - parse_render_target(tnode, node_group, render_targets, depth_buffers) - elif node.bl_idname == 'SSRPassNodeType' or node.bl_idname == 'SSGIPassNodeType' or node.bl_idname == 'ApplySSAOPassNodeType' or node.bl_idname == 'BloomPassNodeType' or node.bl_idname == 'SMAAPassNodeType': - for i in range(1, 4): - if node.inputs[i].is_linked: - tnode = node_utils.find_node_by_link(node_group, node, node.inputs[i]) - parse_render_target(tnode, node_group, render_targets, depth_buffers) - elif node.bl_idname == 'SSAOPassNodeType' or node.bl_idname == 'SSAOReprojectPassNodeType' or node.bl_idname == 'SSSPassNodeType' or node.bl_idname == 'BlurBasicPassNodeType': - for i in range(1, 3): - if node.inputs[i].is_linked: - tnode = node_utils.find_node_by_link(node_group, node, node.inputs[i]) - parse_render_target(tnode, node_group, render_targets, depth_buffers) - - # Next stage - if node.outputs[0].is_linked: - stagenode = node_utils.find_node_by_link_from(node_group, node, node.outputs[0]) - traverse_renderpath(stagenode, node_group, render_targets, depth_buffers) - -def parse_render_target(node, node_group, render_targets, depth_buffers): - if node.bl_idname == 'NodeReroute': - tnode = node_utils.find_node_by_link(node_group, node, node.inputs[0]) - parse_render_target(tnode, node_group, render_targets, depth_buffers) - - elif node.bl_idname == 'TargetNodeType': # or node.bl_idname == 'ShadowMapNodeType': # Create SM dynamically instead - # Target already exists - id = node.inputs[0].default_value - for t in render_targets: - if t['name'] == id: - return - - depth_buffer_id = None - if node.bl_idname == 'TargetNodeType' and node.inputs[3].is_linked: - # Find depth buffer - depth_node = node_utils.find_node_by_link(node_group, node, node.inputs[3]) - depth_buffer_id = depth_node.inputs[0].default_value - # Append depth buffer - found = False - for db in depth_buffers: - if db['name'] == depth_buffer_id: - found = True - break - if found == False: - db = {} - db['name'] = depth_buffer_id - if depth_node.inputs[1] != '': - db['format'] = depth_node.inputs[1].default_value - depth_buffers.append(db) - # Get scale - scale = 1.0 - if node.inputs[1].is_linked: # Assume Screen node - size_node = node_utils.find_node_by_link(node_group, node, node.inputs[1]) - while size_node.bl_idname == 'NodeReroute': # Step through reroutes - size_node = node_utils.find_node_by_link(node_group, size_node, size_node.inputs[0]) - scale = size_node.inputs[0].default_value - - # Append target - if node.bl_idname == 'TargetNodeType': - target = make_render_target(node, scale, depth_buffer_id=depth_buffer_id) - render_targets.append(target) - else: # ShadowMapNodeType - target = make_shadowmap_target(node, scale) - render_targets.append(target) - - elif node.bl_idname == 'ImageNodeType' or node.bl_idname == 'Image3DNodeType': - # Target already exists - id = node.inputs[0].default_value - for t in render_targets: - if t['name'] == id: - return - - # Get scale - scale = 1.0 - if node.inputs[1].is_linked: # Assume Screen node - size_node = node_utils.find_node_by_link(node_group, node, node.inputs[1]) - while size_node.bl_idname == 'NodeReroute': # Step through reroutes - size_node = node_utils.find_node_by_link(node_group, size_node, size_node.inputs[0]) - scale = size_node.inputs[0].default_value - - if node.bl_idname == 'ImageNodeType': - target = make_image_target(node, scale) + assets.add_khafile_def('rp_ssgi={0}'.format(rpdat.rp_ssgi)) + if rpdat.rp_ssgi != 'Off': + wrd.world_defs += '_SSAO' + if rpdat.rp_ssgi == 'SSAO': + assets.add_shader2('ssao_pass', 'ssao_pass') + assets.add_shader2('blur_edge_pass', 'blur_edge_pass') + assets.add(assets_path + 'noise8.png') + assets.add_embedded_data('noise8.png') else: - target = make_image3d_target(node, scale) - render_targets.append(target) + assets.add_shader2('ssgi_pass', 'ssgi_pass') + assets.add_shader2('ssgi_blur_pass', 'ssgi_blur_pass') - elif node.bl_idname == 'GBufferNodeType': - for i in range(0, 5): - if node.inputs[i].is_linked: - n = node_utils.find_node_by_link(node_group, node, node.inputs[i]) - parse_render_target(n, node_group, render_targets, depth_buffers) + if rpdat.rp_renderer == 'Deferred': + assets.add_shader2('deferred_indirect', 'deferred_indirect') + assets.add_shader2('deferred_light', 'deferred_light') + assets.add_shader2('deferred_light_quad', 'deferred_light_quad') -def make_render_target(n, scale, depth_buffer_id=None): - target = {} - target['name'] = n.inputs[0].default_value - target['width'] = n.inputs[1].default_value - target['height'] = n.inputs[2].default_value - target['format'] = n.inputs[4].default_value - if n.inputs[5].default_value: - target['ping_pong'] = True - if len(n.inputs) > 6 and n.inputs[6].default_value == True: - target['mipmaps'] = True - if scale != 1.0: - target['scale'] = scale - if depth_buffer_id != None: - target['depth_buffer'] = depth_buffer_id - # Manual resolution - rpdat = build_node_tree.rpdat - if target['width'] == 0 and rpdat.arm_rp_resolution != 'Display': - target['displayp'] = int(rpdat.arm_rp_resolution) - return target + if rpdat.rp_rendercapture: + assets.add_khafile_def('rp_rendercapture') + assets.add_khafile_def('rp_rendercapture_format={0}'.format(wrd.rp_rendercapture_format)) + assets.add_shader2('copy_pass', 'copy_pass') + + if rpdat.rp_volumetriclight: + assets.add_khafile_def('rp_volumetriclight') + assets.add_shader2('volumetric_light_quad', 'volumetric_light_quad') + assets.add_shader2('volumetric_light', 'volumetric_light') + assets.add_shader2('blur_edge_pass', 'blur_edge_pass') -def make_shadowmap_target(n, scale, postfix=''): - target = {} - target['name'] = n.inputs[0].default_value + postfix - target['width'] = n.inputs[1].default_value - target['height'] = n.inputs[2].default_value - target['format'] = n.inputs[3].default_value - if scale != 1.0: - target['scale'] = scale - return target + if rpdat.rp_decals: + assets.add_khafile_def('rp_decals') -def make_image_target(n, scale): - target = {} - target['is_image'] = True - target['name'] = n.inputs[0].default_value - target['width'] = n.inputs[1].default_value - target['height'] = n.inputs[2].default_value - target['format'] = n.inputs[3].default_value - if scale != 1.0: - target['scale'] = scale - return target + if rpdat.rp_ocean: + assets.add_khafile_def('rp_ocean') + assets.add_shader2('water_pass', 'water_pass') -def make_image3d_target(n, scale): - target = {} - target['is_image'] = True - target['name'] = n.inputs[0].default_value - target['width'] = n.inputs[1].default_value - target['height'] = n.inputs[2].default_value - target['depth'] = n.inputs[3].default_value - target['format'] = n.inputs[4].default_value - if scale != 1.0: - target['scale'] = scale - return target + if rpdat.rp_blending_state != 'Off': + assets.add_khafile_def('rp_blending') + + if rpdat.rp_bloom: + assets.add_khafile_def('rp_bloom') + assets.add_shader2('bloom_pass', 'bloom_pass') + assets.add_shader2('blur_gaus_pass', 'blur_gaus_pass') + + if rpdat.rp_sss: + assets.add_khafile_def('rp_sss') + wrd.world_defs += '_SSS' + assets.add_shader2('sss_pass', 'sss_pass') + + if rpdat.rp_ssr: + assets.add_khafile_def('rp_ssr') + assets.add_shader2('ssr_pass', 'ssr_pass') + assets.add_shader2('blur_adaptive_pass', 'blur_adaptive_pass') + if rpdat.arm_ssr_half_res: + assets.add_khafile_def('rp_ssr_half') + + if rpdat.rp_motionblur != 'Off': + assets.add_khafile_def('rp_motionblur={0}'.format(rpdat.rp_motionblur)) + assets.add_shader2('copy_pass', 'copy_pass') + if rpdat.rp_motionblur == 'Camera': + assets.add_shader2('motion_blur_pass', 'motion_blur_pass') + else: + assets.add_shader2('motion_blur_veloc_pass', 'motion_blur_veloc_pass') + + if rpdat.rp_compositornodes and rpdat.rp_autoexposure: + assets.add_khafile_def('rp_autoexposure') + + if rpdat.rp_dynres: + assets.add_khafile_def('rp_dynres') diff --git a/blender/arm/make_world.py b/blender/arm/make_world.py index 7f9b2477..f6daa7c4 100755 --- a/blender/arm/make_world.py +++ b/blender/arm/make_world.py @@ -9,7 +9,7 @@ import arm.utils import arm.node_utils as node_utils import arm.log as log -def build_node_trees(active_worlds): +def build(active_worlds): fp = arm.utils.get_fp() # Make sure Assets dir exists @@ -114,7 +114,7 @@ def build_node_tree(world): if rpdat.rp_shadowmap_cascades != '1' and rpdat.rp_gi == 'Off': wrd.world_defs += '_CSM' assets.add_khafile_def('arm_csm') - if rpdat.rp_shadowmap == 'None': + if rpdat.rp_shadowmap == 'Off': wrd.world_defs += '_NoShadows' assets.add_khafile_def('arm_no_shadows') # GI diff --git a/blender/arm/material/mat_utils.py b/blender/arm/material/mat_utils.py index ca8f7a50..fd5f103c 100644 --- a/blender/arm/material/mat_utils.py +++ b/blender/arm/material/mat_utils.py @@ -44,7 +44,7 @@ def get_rpasses(material): ar.append('depth') shadows_enabled = False - if rpdat.rp_shadowmap != 'None': + if rpdat.rp_shadowmap != 'Off': shadows_enabled = True if material.arm_cast_shadow and shadows_enabled and ('mesh' in ar or 'translucent' in ar): @@ -76,7 +76,6 @@ def is_transluc_type(node): if node.type == 'BSDF_GLASS' or \ node.type == 'BSDF_TRANSPARENT' or \ node.type == 'BSDF_TRANSLUCENT' or \ - (node.type == 'GROUP' and node.node_tree.name.startswith('Armory PBR') and len(node.inputs) == 14 and (node.inputs[12].is_linked or node.inputs[12].default_value != 1.0)) or \ - (node.type == 'GROUP' and node.node_tree.name.startswith('Armory PBR') and len(node.inputs) != 14 and (node.inputs[1].is_linked or node.inputs[1].default_value != 1.0)): + (node.type == 'GROUP' and node.node_tree.name.startswith('Armory PBR') and (node.inputs[1].is_linked or node.inputs[1].default_value != 1.0)): return True return False diff --git a/blender/arm/nodes_renderpath.py b/blender/arm/nodes_renderpath.py deleted file mode 100755 index d44fa692..00000000 --- a/blender/arm/nodes_renderpath.py +++ /dev/null @@ -1,1052 +0,0 @@ -import bpy -from bpy.types import NodeTree, Node, NodeSocket -from bpy.props import * - -class CGPipelineTree(NodeTree): - '''Render path nodes''' - bl_idname = 'CGPipelineTreeType' - bl_label = 'Render Path Node Tree' - bl_icon = 'SCENE' - -class CGPipelineTreeNode: - @classmethod - def poll(cls, ntree): - return ntree.bl_idname == 'CGPipelineTreeType' - -# Prebuilt -class QuadPassNode(Node, CGPipelineTreeNode): - '''Full-screen quad pass node''' - bl_idname = 'QuadPassNodeType' - bl_label = 'Quad Pass' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketString', "Shader Context") - self.inputs.new('NodeSocketShader', "Bind 1") - self.inputs.new('NodeSocketString', "Constant") - self.inputs.new('NodeSocketShader', "Bind 2") - self.inputs.new('NodeSocketString', "Constant") - self.inputs.new('NodeSocketShader', "Bind 3") - self.inputs.new('NodeSocketString', "Constant") - - self.outputs.new('NodeSocketShader', "Stage") - -class SSAOPassNode(Node, CGPipelineTreeNode): - '''Screen-space ambient occlusion node''' - bl_idname = 'SSAOPassNodeType' - bl_label = 'SSAO' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "A") - self.inputs.new('NodeSocketShader', "GBufferD") - self.inputs.new('NodeSocketShader', "GBuffer0") - - self.outputs.new('NodeSocketShader', "Stage") - -class SSAOReprojectPassNode(Node, CGPipelineTreeNode): - '''Screen-space ambient occlusion reprojection node''' - bl_idname = 'SSAOReprojectPassNodeType' - bl_label = 'SSAO Reproject' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "Last") - self.inputs.new('NodeSocketShader', "Depth") - self.inputs.new('NodeSocketShader', "Normals") - self.inputs.new('NodeSocketShader', "Velocity") - - self.outputs.new('NodeSocketShader', "Stage") - -class ApplySSAOPassNode(Node, CGPipelineTreeNode): - '''Apply screen-space ambient occlusion node''' - bl_idname = 'ApplySSAOPassNodeType' - bl_label = 'Apply SSAO' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "A") - self.inputs.new('NodeSocketShader', "B") - self.inputs.new('NodeSocketShader', "GBufferD") - self.inputs.new('NodeSocketShader', "GBuffer0") - - self.outputs.new('NodeSocketShader', "Stage") - -class SSRPassNode(Node, CGPipelineTreeNode): - '''Screen-space reflections node''' - bl_idname = 'SSRPassNodeType' - bl_label = 'SSR' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "A") - self.inputs.new('NodeSocketShader', "B") - self.inputs.new('NodeSocketShader', "Color") - self.inputs.new('NodeSocketShader', "GBufferD") - self.inputs.new('NodeSocketShader', "GBuffer0") - - self.outputs.new('NodeSocketShader', "Stage") - -class SSGIPassNode(Node, CGPipelineTreeNode): - '''Screen-space global illumination node''' - bl_idname = 'SSGIPassNodeType' - bl_label = 'SSGI' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "A") - self.inputs.new('NodeSocketShader', "GBufferD") - self.inputs.new('NodeSocketShader', "GBuffer0") - self.inputs.new('NodeSocketShader', "GBuffer1") - - self.outputs.new('NodeSocketShader', "Stage") - -class BloomPassNode(Node, CGPipelineTreeNode): - '''Bloom node''' - bl_idname = 'BloomPassNodeType' - bl_label = 'Bloom' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "A") - self.inputs.new('NodeSocketShader', "B") - self.inputs.new('NodeSocketShader', "Color") - - self.outputs.new('NodeSocketShader', "Stage") - -class MotionBlurPassNode(Node, CGPipelineTreeNode): - '''Motion blur node''' - bl_idname = 'MotionBlurPassNodeType' - bl_label = 'Motion Blur' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "Color") - self.inputs.new('NodeSocketShader', "GBufferD") - self.inputs.new('NodeSocketShader', "GBuffer0") - - self.outputs.new('NodeSocketShader', "Stage") - -class MotionBlurVelocityPassNode(Node, CGPipelineTreeNode): - '''Motion blur using velocity node''' - bl_idname = 'MotionBlurVelocityPassNodeType' - bl_label = 'Motion Blur Velocity' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "Color") - self.inputs.new('NodeSocketShader', "GBuffer0") - self.inputs.new('NodeSocketShader', "Velocity") - - self.outputs.new('NodeSocketShader', "Stage") - -class CopyPassNode(Node, CGPipelineTreeNode): - '''Copy to render target node''' - bl_idname = 'CopyPassNodeType' - bl_label = 'Copy' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "Color") - - self.outputs.new('NodeSocketShader', "Stage") - -class MatIDToDepthNode(Node, CGPipelineTreeNode): - '''Copy material IDs to depth''' - bl_idname = 'MatIDToDepthNodeType' - bl_label = 'MatID to Depth' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "Material ID") - - self.outputs.new('NodeSocketShader', "Stage") - -class BlendPassNode(Node, CGPipelineTreeNode): - '''Blend to target node''' - bl_idname = 'BlendPassNodeType' - bl_label = 'Blend' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "Color") - - self.outputs.new('NodeSocketShader', "Stage") - -class CombinePassNode(Node, CGPipelineTreeNode): - '''Add two render targets node''' - bl_idname = 'CombinePassNodeType' - bl_label = 'Combine' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "A") - self.inputs.new('NodeSocketShader', "B") - - self.outputs.new('NodeSocketShader', "Stage") - -class HistogramPassNode(Node, CGPipelineTreeNode): - '''Render histogram node''' - bl_idname = 'HistogramPassNodeType' - bl_label = 'Histogram' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "Color") - - self.outputs.new('NodeSocketShader', "Stage") - -class BlurBasicPassNode(Node, CGPipelineTreeNode): - '''Blur node''' - bl_idname = 'BlurBasicPassNodeType' - bl_label = 'Blur Basic' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "In/Out") - self.inputs.new('NodeSocketShader', "Temp") - - self.outputs.new('NodeSocketShader', "Stage") - -class DebugNormalsPassNode(Node, CGPipelineTreeNode): - '''View normals node''' - bl_idname = 'DebugNormalsPassNodeType' - bl_label = 'Debug Normals' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "Color") - - self.outputs.new('NodeSocketShader', "Stage") - -class FXAAPassNode(Node, CGPipelineTreeNode): - '''FXAA anti-aliasing node''' - bl_idname = 'FXAAPassNodeType' - bl_label = 'FXAA' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "Color") - - self.outputs.new('NodeSocketShader', "Stage") - -class SSResolveNode(Node, CGPipelineTreeNode): - '''Super Sampling resolve node''' - bl_idname = 'SSResolveNodeType' - bl_label = 'SS Resolve' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "Color") - - self.outputs.new('NodeSocketShader', "Stage") - -class SMAAPassNode(Node, CGPipelineTreeNode): - '''Subpixel morphological anti-aliasing node''' - bl_idname = 'SMAAPassNodeType' - bl_label = 'SMAA' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "Edges Target") - self.inputs.new('NodeSocketShader', "Blend Target") - self.inputs.new('NodeSocketShader', "Color") - self.inputs.new('NodeSocketShader', "Velocity") - - self.outputs.new('NodeSocketShader', "Stage") - -class TAAPassNode(Node, CGPipelineTreeNode): - '''Temporal anti-aliasing node''' - bl_idname = 'TAAPassNodeType' - bl_label = 'TAA' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "Color") - self.inputs.new('NodeSocketShader', "Last Color") - self.inputs.new('NodeSocketShader', "Velocity") - - self.outputs.new('NodeSocketShader', "Stage") - -class SSSPassNode(Node, CGPipelineTreeNode): - '''Subsurface scattering node''' - bl_idname = 'SSSPassNodeType' - bl_label = 'SSS' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target In") - self.inputs.new('NodeSocketShader', "Target Out") - self.inputs.new('NodeSocketShader', "Color") - self.inputs.new('NodeSocketShader', "GBufferD") - self.inputs.new('NodeSocketShader', "GBuffer1") - - self.outputs.new('NodeSocketShader', "Stage") - -class WaterPassNode(Node, CGPipelineTreeNode): - '''Ocean node''' - bl_idname = 'WaterPassNodeType' - bl_label = 'Water' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "GBufferD") - self.inputs.new('NodeSocketShader', "Shadow Map") - - self.outputs.new('NodeSocketShader', "Stage") - -class DeferredLightPassNode(Node, CGPipelineTreeNode): - '''Deferred light node''' - bl_idname = 'DeferredLightPassNodeType' - bl_label = 'Deferred Light' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "GBuffer") - self.inputs.new('NodeSocketShader', "Shadow Map") - self.inputs.new('NodeSocketShader', "Voxels") - - self.outputs.new('NodeSocketShader', "Stage") - -class DeferredIndirectPassNode(Node, CGPipelineTreeNode): - '''Deferred indirect lighting node''' - bl_idname = 'DeferredIndirectPassNodeType' - bl_label = 'Deferred Indirect' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "GBuffer") - self.inputs.new('NodeSocketShader', "SSAO") - self.inputs.new('NodeSocketShader', "Voxels") - - self.outputs.new('NodeSocketShader', "Stage") - -class VolumetricLightPassNode(Node, CGPipelineTreeNode): - '''Volumetric light node''' - bl_idname = 'VolumetricLightPassNodeType' - bl_label = 'Volumetric Light' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "A") - self.inputs.new('NodeSocketShader', "B") - self.inputs.new('NodeSocketShader', "Normals") - self.inputs.new('NodeSocketShader', "Depth") - self.inputs.new('NodeSocketShader', "Shadow Map") - - self.outputs.new('NodeSocketShader', "Stage") - -class TranslucentResolvePassNode(Node, CGPipelineTreeNode): - '''Translucent resolve node''' - bl_idname = 'TranslucentResolvePassNodeType' - bl_label = 'Translucent Resolve' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "Translucent GBuffer") - - self.outputs.new('NodeSocketShader', "Stage") - -# Render path -class DrawMeshesNode(Node, CGPipelineTreeNode): - '''Draw meshes of specified context node''' - bl_idname = 'DrawMeshesNodeType' - bl_label = 'Draw Meshes' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketString', "Context") - self.inputs.new('NodeSocketString', "Order") - self.inputs[2].default_value = 'front_to_back' - - self.outputs.new('NodeSocketShader', "Stage") - -class DrawRectsNode(Node, CGPipelineTreeNode): - '''Draw rects of specified context node''' - bl_idname = 'DrawRectsNodeType' - bl_label = 'Draw Rects' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketString', "Context") - - self.outputs.new('NodeSocketShader', "Stage") - -class DrawDecalsNode(Node, CGPipelineTreeNode): - '''Draw decals node''' - bl_idname = 'DrawDecalsNodeType' - bl_label = 'Draw Decals' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketString', "Context") - - self.outputs.new('NodeSocketShader', "Stage") - -class ClearTargetNode(Node, CGPipelineTreeNode): - '''Clear current target node''' - bl_idname = 'ClearTargetNodeType' - bl_label = 'Clear Target' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketBool', "Color") - self.inputs.new('NodeSocketColor', "Value") - self.inputs.new('NodeSocketBool', "Depth") - self.inputs.new('NodeSocketFloat', "Value") - self.inputs[4].default_value = 1.0 - self.inputs.new('NodeSocketBool', "Stencil") - self.inputs.new('NodeSocketInt', "Value") - - self.outputs.new('NodeSocketShader', "Stage") - -class ClearImageNode(Node, CGPipelineTreeNode): - '''Clear target image node''' - bl_idname = 'ClearImageNodeType' - bl_label = 'Clear Image' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Image") - self.inputs.new('NodeSocketColor', "Color") - - self.outputs.new('NodeSocketShader', "Stage") - -class GenerateMipmapsNode(Node, CGPipelineTreeNode): - '''Generate mipmaps node''' - bl_idname = 'GenerateMipmapsNodeType' - bl_label = 'Generate Mipmaps' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - - self.outputs.new('NodeSocketShader', "Stage") - -class BeginNode(Node, CGPipelineTreeNode): - '''Start render path node''' - bl_idname = 'BeginNodeType' - bl_label = 'Begin' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketString', "ID") - self.inputs.new('NodeSocketBool', "HDR Space") - self.inputs[1].default_value = True - self.outputs.new('NodeSocketShader', "Stage") - -class SetTargetNode(Node, CGPipelineTreeNode): - '''Set render target node''' - bl_idname = 'SetTargetNodeType' - bl_label = 'Set Target' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - - self.outputs.new('NodeSocketShader', "Stage") - -class SetViewportNode(Node, CGPipelineTreeNode): - '''Set viewport size node''' - bl_idname = 'SetViewportNodeType' - bl_label = 'Set Viewport' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketInt', "Width") - self.inputs.new('NodeSocketInt', "Height") - - self.outputs.new('NodeSocketShader', "Stage") - -class TargetNode(Node, CGPipelineTreeNode): - '''Create new render target node''' - bl_idname = 'TargetNodeType' - bl_label = 'Target' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketString', "ID") - self.inputs.new('NodeSocketInt', "Width") - self.inputs.new('NodeSocketInt', "Height") - self.inputs.new('NodeSocketShader', "Depth Buffer") - self.inputs.new('NodeSocketString', "Format") - self.inputs.new('NodeSocketBool', "Ping Pong") - self.inputs.new('NodeSocketBool', "Mipmaps") - - self.outputs.new('NodeSocketShader', "Target") - -class ShadowMapNode(Node, CGPipelineTreeNode): - '''Create new shadow map target node''' - bl_idname = 'ShadowMapNodeType' - bl_label = 'Shadow Map' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketString', "ID") - self.inputs.new('NodeSocketInt', "Width") - self.inputs.new('NodeSocketInt', "Height") - self.inputs.new('NodeSocketString', "Format") - - self.outputs.new('NodeSocketShader', "Target") - -class ImageNode(Node, CGPipelineTreeNode): - '''Create new image node''' - bl_idname = 'ImageNodeType' - bl_label = 'Image' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketString', "ID") - self.inputs.new('NodeSocketInt', "Width") - self.inputs.new('NodeSocketInt', "Height") - self.inputs.new('NodeSocketString', "Format") - - self.outputs.new('NodeSocketShader', "Target") - -class Image3DNode(Node, CGPipelineTreeNode): - '''Create new 3D image node''' - bl_idname = 'Image3DNodeType' - bl_label = 'Image 3D' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketString', "ID") - self.inputs.new('NodeSocketInt', "Width") - self.inputs.new('NodeSocketInt', "Height") - self.inputs.new('NodeSocketInt', "Depth") - self.inputs.new('NodeSocketString', "Format") - - self.outputs.new('NodeSocketShader', "Target") - -class TargetArrayNode(Node, CGPipelineTreeNode): - '''Create target array node''' - bl_idname = 'TargetArrayNodeType' - bl_label = 'Target Array' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketInt', "Instances") - - self.outputs.new('NodeSocketShader', "Targets") - -class DepthBufferNode(Node, CGPipelineTreeNode): - '''Create depth buffer node''' - bl_idname = 'DepthBufferNodeType' - bl_label = 'Depth Buffer' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketString', "ID") - self.inputs.new('NodeSocketString', "Format") - - self.outputs.new('NodeSocketShader', "Target") - -class GBufferNode(Node, CGPipelineTreeNode): - '''Create gbuffer node''' - bl_idname = 'GBufferNodeType' - bl_label = 'GBuffer' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Target 0") - self.inputs.new('NodeSocketShader', "Target 1") - self.inputs.new('NodeSocketShader', "Target 2") - self.inputs.new('NodeSocketShader', "Target 3") - self.inputs.new('NodeSocketShader', "Target 4") - - self.outputs.new('NodeSocketShader', "Targets") - -class FramebufferNode(Node, CGPipelineTreeNode): - '''Reference framebuffer node''' - bl_idname = 'FramebufferNodeType' - bl_label = 'Framebuffer' - bl_icon = 'SOUND' - - def init(self, context): - self.outputs.new('NodeSocketShader', "Target") - -class BindTargetNode(Node, CGPipelineTreeNode): - '''Bind render target node''' - bl_idname = 'BindTargetNodeType' - bl_label = 'Bind Target' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketString', "Constant") - - self.outputs.new('NodeSocketShader', "Stage") - -class DrawMaterialQuadNode(Node, CGPipelineTreeNode): - '''Draw full-screen quad using material node''' - bl_idname = 'DrawMaterialQuadNodeType' - bl_label = 'Draw Material Quad' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketString', "Material Context") - - self.outputs.new('NodeSocketShader', "Stage") - -class DrawQuadNode(Node, CGPipelineTreeNode): - '''Draw full-screen quad using shader node''' - bl_idname = 'DrawQuadNodeType' - bl_label = 'Draw Quad' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketString', "Shader Context") - - self.outputs.new('NodeSocketShader', "Stage") - -class CallFunctionNode(Node, CGPipelineTreeNode): - '''Call Haxe function node''' - bl_idname = 'CallFunctionNodeType' - bl_label = 'Call Function' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketString', "Function") - - self.outputs.new('NodeSocketShader', "Stage") - -class BranchFunctionNode(Node, CGPipelineTreeNode): - '''Branch on Haxe function result node''' - bl_idname = 'BranchFunctionNodeType' - bl_label = 'Branch Function' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketString', "Function") - - self.outputs.new('NodeSocketShader', "True") - self.outputs.new('NodeSocketShader', "False") - -class MergeStagesNode(Node, CGPipelineTreeNode): - '''Join stages node''' - bl_idname = 'MergeStagesNodeType' - bl_label = 'Merge Stages' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Stage") - - self.outputs.new('NodeSocketShader', "Stage") - -class LoopStagesNode(Node, CGPipelineTreeNode): - '''Loop nested stages node''' - bl_idname = 'LoopStagesNodeType' - bl_label = 'Loop Stages' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketInt', "From") - self.inputs.new('NodeSocketInt', "To") - - self.outputs.new('NodeSocketShader', "Complete") - self.outputs.new('NodeSocketShader', "Loop") - -class LoopLampsNode(Node, CGPipelineTreeNode): - '''Loop nested stages node''' - bl_idname = 'LoopLampsNodeType' - bl_label = 'Loop Lamps' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - - self.outputs.new('NodeSocketShader', "Complete") - self.outputs.new('NodeSocketShader', "Loop") - -class DrawStereoNode(Node, CGPipelineTreeNode): - '''Draw nested stages twice node''' - bl_idname = 'DrawStereoNodeType' - bl_label = 'Draw Stereo' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - - self.outputs.new('NodeSocketShader', "Complete") - self.outputs.new('NodeSocketShader', "Per Eye") - -class DrawWorldNode(Node, CGPipelineTreeNode): - '''Draw world skydome node''' - bl_idname = 'DrawWorldNodeType' - bl_label = 'Draw World' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - # self.inputs.new('NodeSocketShader', "Depth") - - self.outputs.new('NodeSocketShader', "Stage") - -class DrawCompositorNode(Node, CGPipelineTreeNode): - '''Draw compositor node''' - bl_idname = 'DrawCompositorNodeType' - bl_label = 'Draw Compositor' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "Color") - self.inputs.new('NodeSocketShader', "Depth") - self.inputs.new('NodeSocketShader', "Normals") - self.inputs.new('NodeSocketShader', "Histogram") - - self.outputs.new('NodeSocketShader', "Stage") - -class DrawCompositorWithFXAANode(Node, CGPipelineTreeNode): - '''Draw compositor with FXAA included node''' - bl_idname = 'DrawCompositorWithFXAANodeType' - bl_label = 'Draw Compositor + FXAA' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketShader', "Target") - self.inputs.new('NodeSocketShader', "Color") - self.inputs.new('NodeSocketShader', "Depth") - self.inputs.new('NodeSocketShader', "Normals") - self.inputs.new('NodeSocketShader', "Histogram") - - self.outputs.new('NodeSocketShader', "Stage") - -class DrawGreasePencilNode(Node, CGPipelineTreeNode): - '''Draw grease pencil node''' - bl_idname = 'DrawGreasePencilNodeType' - bl_label = 'Draw Grease Pencil' - bl_icon = 'SOUND' - - def init(self, context): - self.inputs.new('NodeSocketShader', "Stage") - self.inputs.new('NodeSocketString', "Context") - - self.outputs.new('NodeSocketShader', "Stage") - -# Constant nodes -class ScreenNode(Node, CGPipelineTreeNode): - '''Reference screen dimensions node''' - bl_idname = 'ScreenNodeType' - bl_label = 'Screen' - bl_icon = 'SOUND' - - def init(self, context): - self.outputs.new('NodeSocketInt', "Width") - self.outputs.new('NodeSocketInt', "Height") - self.inputs.new('NodeSocketFloat', "Scale") - self.inputs[0].default_value = 1.0 - -class BackgroundColorNode(Node, CGPipelineTreeNode): - '''Reference world background color node''' - bl_idname = 'BackgroundColorNodeType' - bl_label = 'Background Color' - bl_icon = 'SOUND' - - def init(self, context): - self.outputs.new('NodeSocketInt', "Color") - -class LampCountNode(Node, CGPipelineTreeNode): - '''Reference number of visible lamps in scene node''' - bl_idname = 'LampCountNodeType' - bl_label = 'Lamp Count' - bl_icon = 'SOUND' - - def init(self, context): - self.outputs.new('NodeSocketInt', "Count") - -### Node Categories ### -import nodeitems_utils -from nodeitems_utils import NodeCategory, NodeItem - -class MyCommandNodeCategory(NodeCategory): - @classmethod - def poll(cls, context): - return context.space_data.tree_type == 'CGPipelineTreeType' - -class MyTargetNodeCategory(NodeCategory): - @classmethod - def poll(cls, context): - return context.space_data.tree_type == 'CGPipelineTreeType' - -class MyPassNodeCategory(NodeCategory): - @classmethod - def poll(cls, context): - return context.space_data.tree_type == 'CGPipelineTreeType' - -class MyConstantNodeCategory(NodeCategory): - @classmethod - def poll(cls, context): - return context.space_data.tree_type == 'CGPipelineTreeType' - -class MyLogicNodeCategory(NodeCategory): - @classmethod - def poll(cls, context): - return context.space_data.tree_type == 'CGPipelineTreeType' - -node_categories = [ - MyCommandNodeCategory("COMMANDNODES", "Command", items=[ - NodeItem("BeginNodeType"), - NodeItem("DrawMeshesNodeType"), - NodeItem("DrawRectsNodeType"), - NodeItem("DrawDecalsNodeType"), - NodeItem("ClearTargetNodeType"), - NodeItem("ClearImageNodeType"), - NodeItem("GenerateMipmapsNodeType"), - NodeItem("SetTargetNodeType"), - NodeItem("SetViewportNodeType"), - NodeItem("BindTargetNodeType"), - NodeItem("DrawMaterialQuadNodeType"), - NodeItem("DrawQuadNodeType"), - NodeItem("DrawWorldNodeType"), - NodeItem("DrawCompositorNodeType"), - NodeItem("DrawCompositorWithFXAANodeType"), - NodeItem("DrawGreasePencilNodeType"), - ]), - MyTargetNodeCategory("TARGETNODES", "Target", items=[ - NodeItem("TargetNodeType"), - NodeItem("ShadowMapNodeType"), - NodeItem("ImageNodeType"), - NodeItem("Image3DNodeType"), - NodeItem("TargetArrayNodeType"), - NodeItem("DepthBufferNodeType"), - NodeItem("GBufferNodeType"), - NodeItem("FramebufferNodeType"), - ]), - MyPassNodeCategory("PREBUILTNODES", "Prebuilt", items=[ - NodeItem("QuadPassNodeType"), - NodeItem("SSAOPassNodeType"), - NodeItem("SSAOReprojectPassNodeType"), - NodeItem("ApplySSAOPassNodeType"), - NodeItem("SSRPassNodeType"), - NodeItem("SSGIPassNodeType"), - NodeItem("BloomPassNodeType"), - NodeItem("MotionBlurPassNodeType"), - NodeItem("MotionBlurVelocityPassNodeType"), - NodeItem("CopyPassNodeType"), - NodeItem("MatIDToDepthNodeType"), - NodeItem("BlendPassNodeType"), - NodeItem("CombinePassNodeType"), - NodeItem("HistogramPassNodeType"), - NodeItem("BlurBasicPassNodeType"), - NodeItem("DebugNormalsPassNodeType"), - NodeItem("FXAAPassNodeType"), - NodeItem("SSResolveNodeType"), - NodeItem("SMAAPassNodeType"), - NodeItem("TAAPassNodeType"), - NodeItem("SSSPassNodeType"), - NodeItem("WaterPassNodeType"), - NodeItem("DeferredLightPassNodeType"), - NodeItem("DeferredIndirectPassNodeType"), - NodeItem("VolumetricLightPassNodeType"), - NodeItem("TranslucentResolvePassNodeType"), - ]), - MyConstantNodeCategory("CONSTANTNODES", "Constant", items=[ - NodeItem("ScreenNodeType"), - NodeItem("BackgroundColorNodeType"), - NodeItem("LampCountNodeType"), - ]), - MyLogicNodeCategory("LOGICNODES", "Logic", items=[ - NodeItem("CallFunctionNodeType"), - NodeItem("BranchFunctionNodeType"), - NodeItem("MergeStagesNodeType"), - NodeItem("LoopStagesNodeType"), - NodeItem("LoopLampsNodeType"), - NodeItem("DrawStereoNodeType"), - ]), -] - -def register(): - bpy.utils.register_class(CGPipelineTree) - bpy.utils.register_class(BeginNode) - bpy.utils.register_class(DrawMeshesNode) - bpy.utils.register_class(DrawRectsNode) - bpy.utils.register_class(DrawDecalsNode) - bpy.utils.register_class(ClearTargetNode) - bpy.utils.register_class(ClearImageNode) - bpy.utils.register_class(GenerateMipmapsNode) - bpy.utils.register_class(SetTargetNode) - bpy.utils.register_class(SetViewportNode) - bpy.utils.register_class(BindTargetNode) - bpy.utils.register_class(DrawMaterialQuadNode) - bpy.utils.register_class(DrawQuadNode) - bpy.utils.register_class(DrawWorldNode) - bpy.utils.register_class(DrawCompositorNode) - bpy.utils.register_class(DrawCompositorWithFXAANode) - bpy.utils.register_class(DrawGreasePencilNode) - bpy.utils.register_class(TargetNode) - bpy.utils.register_class(ShadowMapNode) - bpy.utils.register_class(ImageNode) - bpy.utils.register_class(Image3DNode) - bpy.utils.register_class(TargetArrayNode) - bpy.utils.register_class(DepthBufferNode) - bpy.utils.register_class(GBufferNode) - bpy.utils.register_class(FramebufferNode) - bpy.utils.register_class(QuadPassNode) - bpy.utils.register_class(SSAOPassNode) - bpy.utils.register_class(SSAOReprojectPassNode) - bpy.utils.register_class(ApplySSAOPassNode) - bpy.utils.register_class(SSRPassNode) - bpy.utils.register_class(SSGIPassNode) - bpy.utils.register_class(BloomPassNode) - bpy.utils.register_class(MotionBlurPassNode) - bpy.utils.register_class(MotionBlurVelocityPassNode) - bpy.utils.register_class(CopyPassNode) - bpy.utils.register_class(MatIDToDepthNode) - bpy.utils.register_class(BlendPassNode) - bpy.utils.register_class(CombinePassNode) - bpy.utils.register_class(HistogramPassNode) - bpy.utils.register_class(BlurBasicPassNode) - bpy.utils.register_class(DebugNormalsPassNode) - bpy.utils.register_class(FXAAPassNode) - bpy.utils.register_class(SSResolveNode) - bpy.utils.register_class(SMAAPassNode) - bpy.utils.register_class(TAAPassNode) - bpy.utils.register_class(SSSPassNode) - bpy.utils.register_class(WaterPassNode) - bpy.utils.register_class(DeferredLightPassNode) - bpy.utils.register_class(DeferredIndirectPassNode) - bpy.utils.register_class(VolumetricLightPassNode) - bpy.utils.register_class(TranslucentResolvePassNode) - bpy.utils.register_class(ScreenNode) - bpy.utils.register_class(BackgroundColorNode) - bpy.utils.register_class(LampCountNode) - bpy.utils.register_class(CallFunctionNode) - bpy.utils.register_class(BranchFunctionNode) - bpy.utils.register_class(MergeStagesNode) - bpy.utils.register_class(LoopStagesNode) - bpy.utils.register_class(LoopLampsNode) - bpy.utils.register_class(DrawStereoNode) - - nodeitems_utils.register_node_categories("CG_PIPELINE_NODES", node_categories) - -def unregister(): - nodeitems_utils.unregister_node_categories("CG_PIPELINE_NODES") - - bpy.utils.unregister_class(CGPipelineTree) - bpy.utils.unregister_class(BeginNode) - bpy.utils.unregister_class(DrawMeshesNode) - bpy.utils.unregister_class(DrawRectsNode) - bpy.utils.unregister_class(DrawDecalsNode) - bpy.utils.unregister_class(ClearTargetNode) - bpy.utils.unregister_class(ClearImageNode) - bpy.utils.unregister_class(GenerateMipmapsNode) - bpy.utils.unregister_class(SetTargetNode) - bpy.utils.unregister_class(SetViewportNode) - bpy.utils.unregister_class(BindTargetNode) - bpy.utils.unregister_class(DrawMaterialQuadNode) - bpy.utils.unregister_class(DrawQuadNode) - bpy.utils.unregister_class(DrawWorldNode) - bpy.utils.unregister_class(DrawCompositorNode) - bpy.utils.unregister_class(DrawCompositorWithFXAANode) - bpy.utils.unregister_class(DrawGreasePencilNode) - bpy.utils.unregister_class(TargetNode) - bpy.utils.unregister_class(ShadowMapNode) - bpy.utils.unregister_class(ImageNode) - bpy.utils.unregister_class(Image3DNode) - bpy.utils.unregister_class(TargetArrayNode) - bpy.utils.unregister_class(DepthBufferNode) - bpy.utils.unregister_class(GBufferNode) - bpy.utils.unregister_class(FramebufferNode) - bpy.utils.unregister_class(QuadPassNode) - bpy.utils.unregister_class(SSAOPassNode) - bpy.utils.unregister_class(SSAOReprojectPassNode) - bpy.utils.unregister_class(ApplySSAOPassNode) - bpy.utils.unregister_class(SSRPassNode) - bpy.utils.unregister_class(SSGIPassNode) - bpy.utils.unregister_class(BloomPassNode) - bpy.utils.unregister_class(MotionBlurPassNode) - bpy.utils.unregister_class(MotionBlurVelocityPassNode) - bpy.utils.unregister_class(CopyPassNode) - bpy.utils.unregister_class(MatIDToDepthNode) - bpy.utils.unregister_class(BlendPassNode) - bpy.utils.unregister_class(CombinePassNode) - bpy.utils.unregister_class(HistogramPassNode) - bpy.utils.unregister_class(BlurBasicPassNode) - bpy.utils.unregister_class(DebugNormalsPassNode) - bpy.utils.unregister_class(FXAAPassNode) - bpy.utils.unregister_class(SMAAPassNode) - bpy.utils.unregister_class(TAAPassNode) - bpy.utils.unregister_class(SSSPassNode) - bpy.utils.unregister_class(WaterPassNode) - bpy.utils.unregister_class(DeferredLightPassNode) - bpy.utils.unregister_class(DeferredIndirectPassNode) - bpy.utils.unregister_class(VolumetricLightPassNode) - bpy.utils.unregister_class(TranslucentResolvePassNode) - bpy.utils.unregister_class(ScreenNode) - bpy.utils.unregister_class(BackgroundColorNode) - bpy.utils.unregister_class(LampCountNode) - bpy.utils.unregister_class(CallFunctionNode) - bpy.utils.unregister_class(BranchFunctionNode) - bpy.utils.unregister_class(MergeStagesNode) - bpy.utils.unregister_class(LoopStagesNode) - bpy.utils.unregister_class(LoopLampsNode) - bpy.utils.unregister_class(DrawStereoNode) diff --git a/blender/arm/props.py b/blender/arm/props.py index e0982cf0..00d86ed5 100755 --- a/blender/arm/props.py +++ b/blender/arm/props.py @@ -7,7 +7,6 @@ import arm.assets as assets import arm.log as log import arm.utils import arm.make -import arm.make_renderer as make_renderer import arm.props_renderpath as props_renderpath import arm.proxy try: @@ -18,9 +17,6 @@ except ImportError: # Armory version arm_version = '0.1.0' -def update_preset(self, context): - make_renderer.set_preset(self, context, self.rp_preset) - def invalidate_mesh_cache(self, context): if context.object == None or context.object.data == None: return @@ -221,7 +217,7 @@ def init_properties(): ('Max (Game)', 'Max (Game)', 'Max (Game)'), ('Max (Render)', 'Max (Render)', 'Max (Render)'), ], - name="Preset", description="Render path preset", default='Deferred', update=update_preset) + name="Preset", description="Render path preset", default='Deferred', update=props_renderpath.update_preset) bpy.types.World.arm_voxelgi_diff = bpy.props.FloatProperty(name="Diffuse", description="", default=3.0, update=assets.invalidate_shader_cache) bpy.types.World.arm_voxelgi_diff_cones = EnumProperty( items=[('9', '9', '9'), @@ -315,7 +311,7 @@ def init_properties(): bpy.types.World.arm_fog_amounta = bpy.props.FloatProperty(name="Amount A", default=0.25, update=assets.invalidate_shader_cache) bpy.types.World.arm_fog_amountb = bpy.props.FloatProperty(name="Amount B", default=0.5, update=assets.invalidate_shader_cache) bpy.types.World.arm_tonemap = EnumProperty( - items=[('None', 'None', 'None'), + items=[('Off', 'Off', 'Off'), ('Filmic', 'Filmic', 'Filmic'), ('Filmic2', 'Filmic2', 'Filmic2'), ('Reinhard', 'Reinhard', 'Reinhard'), @@ -385,7 +381,6 @@ def init_properties(): bpy.types.Lamp.arm_omni_shadows = bpy.props.BoolProperty(name="Omni-Shadows", description="Draw shadows to all faces of the cube map", default=True) bpy.types.World.arm_pcfsize = bpy.props.FloatProperty(name="PCF Size", description="Filter size", default=0.001) - bpy.types.World.arm_shadowmap_size_cache = bpy.props.IntProperty(name="Shadowmap Size", default=0, update=assets.invalidate_shader_cache) bpy.types.World.arm_rpcache_list = bpy.props.CollectionProperty(type=bpy.types.PropertyGroup) bpy.types.World.arm_scripts_list = bpy.props.CollectionProperty(type=bpy.types.PropertyGroup) bpy.types.World.arm_bundled_scripts_list = bpy.props.CollectionProperty(type=bpy.types.PropertyGroup) diff --git a/blender/arm/props_renderpath.py b/blender/arm/props_renderpath.py index 640c6830..db0ec0ab 100644 --- a/blender/arm/props_renderpath.py +++ b/blender/arm/props_renderpath.py @@ -2,15 +2,254 @@ import os import shutil import arm.assets as assets import arm.utils -import arm.make_renderer as make_renderer import bpy from bpy.types import Menu, Panel, UIList from bpy.props import * +def update_preset(self, context): + rpdat = arm.utils.get_rp() + if self.rp_preset == 'Low': + rpdat.rp_renderer = 'Forward' + rpdat.rp_depthprepass = False + rpdat.arm_material_model = 'Full' + rpdat.rp_shadowmap = '1024' + rpdat.rp_shadowmap_cascades = '1' + rpdat.rp_translucency_state = 'Off' + rpdat.rp_overlays_state = 'Off' + rpdat.rp_decals_state = 'Off' + rpdat.rp_sss_state = 'Off' + rpdat.rp_blending_state = 'Off' + rpdat.rp_hdr = False + rpdat.rp_background = 'World' + rpdat.rp_stereo = False + # rpdat.rp_greasepencil = False + rpdat.rp_gi = 'Off' + rpdat.rp_render_to_texture = False + rpdat.rp_supersampling = '1' + rpdat.rp_antialiasing = 'Off' + rpdat.rp_compositornodes = False + rpdat.rp_volumetriclight = False + rpdat.rp_ssgi = 'Off' + rpdat.rp_ssr = False + rpdat.rp_dfrs = False + rpdat.rp_dfao = False + rpdat.rp_dfgi = False + rpdat.rp_bloom = False + rpdat.rp_eyeadapt = False + rpdat.rp_rendercapture = False + rpdat.rp_motionblur = 'Off' + rpdat.arm_rp_resolution = 'Display' + rpdat.arm_texture_filter = 'Anisotropic' + rpdat.arm_diffuse_model = 'Lambert' + elif self.rp_preset == 'Forward': + rpdat.rp_renderer = 'Forward' + rpdat.rp_depthprepass = True + rpdat.arm_material_model = 'Full' + rpdat.rp_shadowmap = '1024' + rpdat.rp_shadowmap_cascades = '4' + rpdat.rp_translucency_state = 'Auto' + rpdat.rp_overlays_state = 'Auto' + rpdat.rp_decals_state = 'Auto' + rpdat.rp_sss_state = 'Auto' + rpdat.rp_blending_state = 'Off' + rpdat.rp_hdr = True + rpdat.rp_background = 'World' + rpdat.rp_stereo = False + # rpdat.rp_greasepencil = False + rpdat.rp_gi = 'Off' + rpdat.rp_render_to_texture = True + rpdat.rp_supersampling = '1' + rpdat.rp_antialiasing = 'SMAA' + rpdat.rp_compositornodes = True + rpdat.rp_volumetriclight = False + rpdat.rp_ssgi = 'SSAO' + rpdat.rp_ssr = True + rpdat.rp_dfrs = False + rpdat.rp_dfao = False + rpdat.rp_dfgi = False + rpdat.rp_bloom = False + rpdat.rp_eyeadapt = False + rpdat.rp_rendercapture = False + rpdat.rp_motionblur = 'Off' + rpdat.arm_rp_resolution = 'Display' + rpdat.arm_texture_filter = 'Anisotropic' + rpdat.arm_diffuse_model = 'Lambert' + elif self.rp_preset == 'Deferred': + rpdat.rp_renderer = 'Deferred' + rpdat.arm_material_model = 'Full' + rpdat.rp_shadowmap = '1024' + rpdat.rp_shadowmap_cascades = '4' + rpdat.rp_translucency_state = 'Auto' + rpdat.rp_overlays_state = 'Auto' + rpdat.rp_decals_state = 'Auto' + rpdat.rp_sss_state = 'Auto' + rpdat.rp_blending_state = 'Off' + rpdat.rp_hdr = True + rpdat.rp_background = 'World' + rpdat.rp_stereo = False + # rpdat.rp_greasepencil = False + rpdat.rp_gi = 'Off' + rpdat.rp_render_to_texture = True + rpdat.rp_supersampling = '1' + rpdat.rp_antialiasing = 'FXAA' + rpdat.rp_compositornodes = True + rpdat.rp_volumetriclight = False + rpdat.rp_ssgi = 'SSAO' + rpdat.rp_ssr = False + rpdat.rp_dfrs = False + rpdat.rp_dfao = False + rpdat.rp_dfgi = False + rpdat.rp_bloom = False + rpdat.rp_eyeadapt = False + rpdat.rp_rendercapture = False + rpdat.rp_motionblur = 'Off' + rpdat.arm_rp_resolution = 'Display' + rpdat.arm_texture_filter = 'Anisotropic' + rpdat.arm_diffuse_model = 'Lambert' + elif self.rp_preset == 'Max (Render)': + rpdat.rp_renderer = 'Deferred' + rpdat.rp_shadowmap = '4096' + rpdat.rp_shadowmap_cascades = '4' + rpdat.rp_translucency_state = 'Auto' + rpdat.rp_overlays_state = 'Auto' + rpdat.rp_decals_state = 'Auto' + rpdat.rp_sss_state = 'Auto' + rpdat.rp_blending_state = 'Off' + rpdat.rp_hdr = True + rpdat.rp_background = 'World' + rpdat.rp_stereo = False + # rpdat.rp_greasepencil = False + rpdat.rp_gi = 'Voxel GI' + rpdat.rp_voxelgi_resolution = '256' + rpdat.rp_voxelgi_emission = True + rpdat.rp_render_to_texture = True + rpdat.rp_supersampling = '2' + rpdat.rp_antialiasing = 'TAA' + rpdat.rp_compositornodes = True + rpdat.rp_volumetriclight = False + rpdat.rp_ssgi = 'RTGI' + rpdat.rp_ssr = True + rpdat.rp_dfrs = False + rpdat.rp_dfao = False + rpdat.rp_dfgi = False + rpdat.rp_bloom = False + rpdat.rp_eyeadapt = False + rpdat.rp_rendercapture = True + rpdat.rp_motionblur = 'Off' + rpdat.arm_rp_resolution = 'Display' + rpdat.arm_material_model = 'Full' + rpdat.arm_texture_filter = 'Anisotropic' + rpdat.arm_diffuse_model = 'OrenNayar' + elif self.rp_preset == 'VR': + rpdat.rp_renderer = 'Forward' + rpdat.rp_depthprepass = False + rpdat.arm_material_model = 'Mobile' + rpdat.rp_shadowmap = '1024' + rpdat.rp_shadowmap_cascades = '1' + rpdat.rp_translucency_state = 'Off' + rpdat.rp_overlays_state = 'Off' + rpdat.rp_decals_state = 'Off' + rpdat.rp_sss_state = 'Off' + rpdat.rp_blending_state = 'Off' + rpdat.rp_hdr = False + rpdat.rp_background = 'World' + rpdat.rp_stereo = True + # rpdat.rp_greasepencil = False + rpdat.rp_gi = 'Off' + rpdat.rp_render_to_texture = False + rpdat.rp_supersampling = '1' + rpdat.rp_antialiasing = 'Off' + rpdat.rp_compositornodes = False + rpdat.rp_volumetriclight = False + rpdat.rp_ssgi = 'Off' + rpdat.rp_ssr = False + rpdat.rp_dfrs = False + rpdat.rp_dfao = False + rpdat.rp_dfgi = False + rpdat.rp_bloom = False + rpdat.rp_eyeadapt = False + rpdat.rp_rendercapture = False + rpdat.rp_motionblur = 'Off' + rpdat.arm_rp_resolution = 'Display' + rpdat.arm_texture_filter = 'Point' + rpdat.arm_diffuse_model = 'Lambert' + elif self.rp_preset == 'Mobile': + rpdat.rp_renderer = 'Forward' + rpdat.rp_depthprepass = False + rpdat.arm_material_model = 'Mobile' + rpdat.rp_shadowmap = '1024' + rpdat.rp_shadowmap_cascades = '1' + rpdat.rp_translucency_state = 'Off' + rpdat.rp_overlays_state = 'Off' + rpdat.rp_decals_state = 'Off' + rpdat.rp_sss_state = 'Off' + rpdat.rp_blending_state = 'Off' + rpdat.rp_hdr = False + rpdat.rp_background = 'Clear' + rpdat.rp_stereo = False + # rpdat.rp_greasepencil = False + rpdat.rp_gi = 'Off' + rpdat.rp_render_to_texture = False + rpdat.rp_supersampling = '1' + rpdat.rp_antialiasing = 'Off' + rpdat.rp_compositornodes = False + rpdat.rp_volumetriclight = False + rpdat.rp_ssgi = 'Off' + rpdat.rp_ssr = False + rpdat.rp_dfrs = False + rpdat.rp_dfao = False + rpdat.rp_dfgi = False + rpdat.rp_bloom = False + rpdat.rp_eyeadapt = False + rpdat.rp_rendercapture = False + rpdat.rp_motionblur = 'Off' + rpdat.arm_rp_resolution = 'Display' + rpdat.arm_texture_filter = 'Point' + rpdat.arm_diffuse_model = 'Lambert' + elif self.rp_preset == 'Max (Game)': + rpdat.rp_renderer = 'Deferred' + rpdat.rp_shadowmap = '4096' + rpdat.rp_shadowmap_cascades = '4' + rpdat.rp_translucency_state = 'Auto' + rpdat.rp_overlays_state = 'Auto' + rpdat.rp_decals_state = 'Auto' + rpdat.rp_sss_state = 'Auto' + rpdat.rp_blending_state = 'Off' + rpdat.rp_hdr = True + rpdat.rp_background = 'World' + rpdat.rp_stereo = False + # rpdat.rp_greasepencil = False + rpdat.rp_gi = 'Voxel GI' + rpdat.rp_voxelgi_resolution = '128' + rpdat.arm_voxelgi_revoxelize = False + rpdat.arm_voxelgi_camera = False + rpdat.rp_voxelgi_emission = False + rpdat.rp_render_to_texture = True + rpdat.rp_supersampling = '1' + rpdat.rp_antialiasing = 'TAA' + rpdat.rp_compositornodes = True + rpdat.rp_volumetriclight = False + rpdat.rp_ssgi = 'RTGI' + rpdat.arm_ssrs = False + rpdat.rp_ssr = True + rpdat.rp_dfrs = False + rpdat.rp_dfao = False + rpdat.rp_dfgi = False + rpdat.rp_bloom = False + rpdat.rp_eyeadapt = False + rpdat.rp_rendercapture = False + rpdat.rp_motionblur = 'Off' + rpdat.arm_rp_resolution = 'Display' + rpdat.arm_material_model = 'Full' + rpdat.arm_texture_filter = 'Anisotropic' + rpdat.arm_diffuse_model = 'Lambert' + update_renderpath(self, context) + def update_renderpath(self, context): if assets.invalidate_enabled == False: return - make_renderer.set_renderpath(self, context) + assets.invalidate_shader_cache(self, context) + bpy.data.worlds['Arm'].arm_recompile = True def udpate_shadowmap_cascades(self, context): bpy.data.worlds['Arm'].arm_recompile = True @@ -65,7 +304,7 @@ class ArmRPListItem(bpy.types.PropertyGroup): rp_renderer = EnumProperty( items=[('Forward', 'Forward', 'Forward'), ('Deferred', 'Deferred', 'Deferred'), - ('Deferred Plus', 'Deferred Plus', 'Deferred Plus'), + # ('Deferred Plus', 'Deferred Plus', 'Deferred Plus'), ], name="Renderer", description="Renderer type", default='Deferred', update=update_renderpath) rp_depthprepass = bpy.props.BoolProperty(name="Depth Prepass", description="Depth Prepass for mesh context", default=True, update=update_renderpath) @@ -74,13 +313,13 @@ class ArmRPListItem(bpy.types.PropertyGroup): rp_background = EnumProperty( items=[('World', 'World', 'World'), ('Clear', 'Clear', 'Clear'), - ('None', 'None', 'None'), + ('Off', 'Off', 'Off'), ], name="Background", description="Background type", default='World', update=update_renderpath) rp_autoexposure = bpy.props.BoolProperty(name="Auto Exposure", description="Adjust exposure based on luminance", default=False, update=update_renderpath) rp_compositornodes = bpy.props.BoolProperty(name="Compositor", description="Draw compositor nodes", default=True, update=update_renderpath) rp_shadowmap = EnumProperty( - items=[('None', 'None', 'None'), + items=[('Off', 'Off', 'Off'), ('512', '512', '512'), ('1024', '1024', '1024'), ('2048', '2048', '2048'), @@ -95,12 +334,12 @@ class ArmRPListItem(bpy.types.PropertyGroup): ('4', '4', '4')], name="Cascades", description="Shadow map cascades", default='4', update=udpate_shadowmap_cascades) rp_supersampling = EnumProperty( - items=[('1', '1X', '1X'), - ('2', '2X', '2X'), - ('4', '4X', '4X')], + items=[('1', '1', '1'), + ('2', '2', '2'), + ('4', '4', '4')], name="Super Sampling", description="Screen resolution multiplier", default='1', update=update_renderpath) rp_antialiasing = EnumProperty( - items=[('None', 'None', 'None'), + items=[('Off', 'Off', 'Off'), ('FXAA', 'FXAA', 'FXAA'), ('SMAA', 'SMAA', 'SMAA'), ('TAA', 'TAA', 'TAA')], @@ -121,10 +360,10 @@ class ArmRPListItem(bpy.types.PropertyGroup): rp_eyeadapt = bpy.props.BoolProperty(name="Eye Adaptation", description="Auto-exposure based on histogram", default=False, update=update_renderpath) rp_rendercapture = bpy.props.BoolProperty(name="Render Capture", description="Save output as render result", default=False, update=update_renderpath) rp_motionblur = EnumProperty( - items=[('None', 'None', 'None'), + items=[('Off', 'Off', 'Off'), ('Camera', 'Camera', 'Camera'), ('Object', 'Object', 'Object')], - name="Motion Blur", description="Velocity buffer is used for object based motion blur", default='None', update=update_renderpath) + name="Motion Blur", description="Velocity buffer is used for object based motion blur", default='Off', update=update_renderpath) rp_translucency = bpy.props.BoolProperty(name="Translucency", description="Current render-path state", default=False) rp_translucency_state = bpy.props.EnumProperty( items=[('On', 'On', 'On'), @@ -208,8 +447,8 @@ class ArmRPListItem(bpy.types.PropertyGroup): ('1440', '1440p', '1440p'), ('2160', '2160p', '2160p')], name="Resolution", description="Render at specific resolution, regardless of display resolution", default='Display', update=update_renderpath) + rp_dynres = bpy.props.BoolProperty(name="Dynamic Resolution", description="Dynamic resolution scaling for performance", default=False, update=update_renderpath) arm_ssr_half_res = bpy.props.BoolProperty(name="Half Res", description="Trace in half resolution", default=True, update=update_renderpath) - rp_voxelgi_hdr = bpy.props.BoolProperty(name="HDR Voxels", description="Store voxels in RGBA64 instead of RGBA32", default=False, update=update_renderpath) arm_voxelgi_dimensions = bpy.props.FloatProperty(name="Dimensions", description="Voxelization bounds",default=16, update=assets.invalidate_shader_cache) arm_voxelgi_revoxelize = bpy.props.BoolProperty(name="Revoxelize", description="Revoxelize scene each frame", default=False, update=assets.invalidate_shader_cache) @@ -220,11 +459,11 @@ class ArmRPListItem(bpy.types.PropertyGroup): arm_voxelgi_refraction = bpy.props.BoolProperty(name="Trace Refraction", description="Use voxels to render refraction", default=False, update=update_renderpath) arm_voxelgi_emission = bpy.props.BoolProperty(name="Emission Voxels", description="Encode emission into voxelized data", default=False, update=update_renderpath) arm_samples_per_pixel = EnumProperty( - items=[('1', '1X', '1X'), - ('2', '2X', '2X'), - ('4', '4X', '4X'), - ('8', '8X', '8X'), - ('16', '16X', '16X')], + items=[('1', '1', '1'), + ('2', '2', '2'), + ('4', '4', '4'), + ('8', '8', '8'), + ('16', '16', '16')], name="MSAA", description="Samples per pixel usable for render paths drawing directly to framebuffer", default='1') arm_ssao_half_res = bpy.props.BoolProperty(name="Half Res", description="Trace in half resolution", default=False, update=assets.invalidate_shader_cache) diff --git a/blender/arm/props_ui.py b/blender/arm/props_ui.py index d2cb1e9d..280ff47c 100644 --- a/blender/arm/props_ui.py +++ b/blender/arm/props_ui.py @@ -3,7 +3,6 @@ import webbrowser from bpy.types import Menu, Panel, UIList from bpy.props import * import arm.utils -import arm.make_renderer as make_renderer import arm.make as make import arm.make_state as state import arm.assets as assets @@ -542,7 +541,7 @@ class ArmoryPlayButton(bpy.types.Operator): if not arm.utils.check_engine(self): return {"CANCELLED"} - make_renderer.check_default() + arm.utils.check_default_rp() rpdat = arm.utils.get_rp() if rpdat.rp_rendercapture == True: @@ -575,7 +574,7 @@ class ArmoryPlayInViewportButton(bpy.types.Operator): if context.area == None: return {"CANCELLED"} - make_renderer.check_default() + arm.utils.check_default_rp() rpdat = arm.utils.get_rp() if rpdat.rp_rendercapture == True: @@ -622,7 +621,7 @@ class ArmoryBuildButton(bpy.types.Operator): if not arm.utils.check_engine(self): return {"CANCELLED"} - make_renderer.check_default() + arm.utils.check_default_rp() state.target = make.runtime_to_target(in_viewport=False) state.is_export = False @@ -649,7 +648,7 @@ class ArmoryBuildProjectButton(bpy.types.Operator): arm.utils.check_projectpath(self) - make_renderer.check_default() + arm.utils.check_default_rp() wrd = bpy.data.worlds['Arm'] item = wrd.arm_exporterlist[wrd.arm_exporterlist_index] @@ -693,7 +692,7 @@ class ArmoryPatchProjectButton(bpy.types.Operator): arm.utils.check_projectpath(self) - make_renderer.check_default() + arm.utils.check_default_rp() wrd = bpy.data.worlds['Arm'] item = wrd.arm_exporterlist[wrd.arm_exporterlist_index] @@ -736,7 +735,7 @@ class ArmoryPublishProjectButton(bpy.types.Operator): arm.utils.check_projectpath(self) - make_renderer.check_default() + arm.utils.check_default_rp() wrd = bpy.data.worlds['Arm'] item = wrd.arm_exporterlist[wrd.arm_exporterlist_index] @@ -854,7 +853,7 @@ class ArmoryRenderButton(bpy.types.Operator): if not arm.utils.check_engine(self): return {"CANCELLED"} - make_renderer.check_default() + arm.utils.check_default_rp() if state.playproc != None: make.stop_project() @@ -885,7 +884,7 @@ class ArmoryRenderAnimButton(bpy.types.Operator): if not arm.utils.check_engine(self): return {"CANCELLED"} - make_renderer.check_default() + arm.utils.check_default_rp() if state.playproc != None: make.stop_project() @@ -952,7 +951,7 @@ class ArmRenderPathPanel(bpy.types.Panel): layout.prop(rpdat, 'rp_depthprepass') layout.prop(rpdat, "arm_material_model") layout.prop(rpdat, "rp_shadowmap") - if rpdat.rp_shadowmap != 'None': + if rpdat.rp_shadowmap != 'Off': layout.prop(rpdat, "rp_shadowmap_cascades") layout.prop(rpdat, "rp_translucency_state") layout.prop(rpdat, "rp_overlays_state") @@ -979,7 +978,7 @@ class ArmRenderPathPanel(bpy.types.Panel): layout.prop(rpdat, "rp_hdr") layout.prop(rpdat, "rp_stereo") - layout.prop(rpdat, "rp_greasepencil") + # layout.prop(rpdat, "rp_greasepencil") layout.separator() layout.prop(rpdat, "rp_render_to_texture") @@ -1002,6 +1001,7 @@ class ArmRenderPathPanel(bpy.types.Panel): # layout.prop(rpdat, "rp_eyeadapt") layout.prop(rpdat, "rp_motionblur") layout.prop(rpdat, 'arm_rp_resolution') + layout.prop(rpdat, 'rp_dynres') layout.separator() layout.prop(rpdat, 'arm_soft_shadows') diff --git a/blender/arm/utils.py b/blender/arm/utils.py index 32aaae34..caba2a25 100755 --- a/blender/arm/utils.py +++ b/blender/arm/utils.py @@ -469,6 +469,12 @@ def target_to_gapi(arm_project_target): else: return 'arm_gapi_' + arm_project_target +def check_default_rp(): + wrd = bpy.data.worlds['Arm'] + if len(wrd.arm_rplist) == 0: + wrd.arm_rplist.add() + wrd.arm_rplist_index = 0 + def register(): global krom_found global glslver diff --git a/blender/arm/write_data.py b/blender/arm/write_data.py index 6b78d59f..1f7cca7f 100755 --- a/blender/arm/write_data.py +++ b/blender/arm/write_data.py @@ -294,14 +294,22 @@ class Main { iron.App.init(function() { """) if is_publish and wrd.arm_loadbar: - f.write("""iron.App.notifyOnRender2D(armory.trait.internal.LoadBar.render);""") + f.write("""iron.App.notifyOnRender2D(armory.trait.internal.LoadBar.render); +""") f.write(""" - iron.Scene.setActive(projectScene, function(object:iron.object.Object) {""") + iron.Scene.setActive(projectScene, function(object:iron.object.Object) { +""") # if arm.utils.with_krom() and in_viewport and is_play: if is_play or (state.target == 'html5' and not is_publish): f.write(""" - object.addTrait(new armory.trait.internal.SpaceArmory());""") + object.addTrait(new armory.trait.internal.SpaceArmory()); +""") + + f.write(""" + iron.RenderPath.setActive(armory.renderpath.RenderPathCreator.get()); +""") + f.write(""" }); }); @@ -351,8 +359,10 @@ def write_indexhtml(w, h): def write_compiledglsl(): wrd = bpy.data.worlds['Arm'] - shadowmap_size = wrd.arm_shadowmap_size_cache rpdat = arm.utils.get_rp() + shadowmap_size = 0 + if rpdat.rp_shadowmap != 'Off': + shadowmap_size = int(rpdat.rp_shadowmap) with open(arm.utils.build_dir() + '/compiled/Shaders/compiled.glsl', 'w') as f: f.write( """#ifndef _COMPILED_GLSL_ @@ -406,7 +416,7 @@ const float ssgiStrength = """ + str(round(wrd.arm_ssgi_strength * 100) / 100) + const float bloomStrength = """ + str(round(wrd.arm_bloom_strength * 100) / 100) + """; const float bloomRadius = """ + str(round(wrd.arm_bloom_radius * 100) / 100) + """; """) - if rpdat.rp_motionblur != 'None': + if rpdat.rp_motionblur != 'Off': f.write( """const float motionBlurIntensity = """ + str(round(wrd.arm_motion_blur_intensity * 100) / 100) + """; """) diff --git a/blender/data/arm_data.blend b/blender/data/arm_data.blend index a36af7f4988adabc80772d293a6ed90c3edad774..70634fe10793ecd8a5fcddcb976b2b4eba93be12 100644 GIT binary patch literal 96980 zcmeFY2UOEp)Gs>fD5I#1g`$*BNSp zl+XhN5&%iteR6zCIviL&C)$jqdIJZQuH(f%VT4VO2La|Mj8@w)>BqFPknn z<%Ev-{Z_C8NG&b8{X_7?rP+kvcl`C+Xqs_N!FZ_mjz_2NSFm3d;e3ExpUVadeF6!? zmSh^?GIL09=*Ah!p4u#NjuoRTOK!!0&h$uUA6QlPgyx%Z^4xTgeYlyrLZkD$OX8

g))kcl|kK5x2vH+^W{Zo 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 j0Q=BE#%)&_ugbcazui-&Xkh~V67gLPov= literal 190292 zcmc$_XIN8P6E-X=aufj-5u`;x#YzNJI#H1>pmb@WO7FcT0s=~v4$?$Gq)YDvM0y7y z^iZS*2rYz!ly8UUocH_r{(Q~lb#2z3J!{siduGi&I{}6NbBg-!Ec2%Sd1EeF5~ca3 zJ*aBJ#rnq`rq}F@`d0J|3a&LOSxHh>&u%Ej>FnK9c@Y)cGu+9u66*5tJq<1I4LKUw zAM7k62dDU4Kv$kulAFE-UZuVGwV!gFo-#N++r8b}jEjA&=sDHDxe0@y@B^z7!V(e^ z4W-82fflm#+AyD`P4B#-oLSShM^gh5^N~`i)}b$+*<&;s3wRBfSArBn#^|++8Dl%< z1EQgaVY2Y}gI&3-K9nCLQG6argJ3*zZz(+ksh<>6hUJ8YbgoZou+slmeiCd#IONFzDstE z3ivH}qn8lgCI0f&R1`UG)%gK0F8>f>))6ri&E;V}r|b6T(UgH)eOcu6A;NC5yuSto zJI?q*kNAUdQSmB-GQEss$8BX!`)O#5YVY|&95>;1`{nf6fx-UAYS&pn)3r7ftNop( zZ8(DaqZsTcW6AmQ!Ba>w1-EPa;<^~ubh0Bw)qXCVGR(SZW)|e^N{U9VFz+I&xFf;` zoOWJ(-Ex(@J&my0H}$i`R*gy%(NDNn&3+5clAEf%ZKZZLJPjQ;YH`_3K4E*N@RJi1)pcgp4}@wKW|QY(0k%O#HVst9kQ(?C$V!O~|<)tC?pEuItSo!=Kq- z*I0t1C})TwSLuch#SW(tooI^aI)!wI8AcJL=0$fQIMB>?8GZ|8=Fi4Y25D@etY0N{ z3Brl;5B-hrWXqiB`;AmBZ>G?R!ZWQY_V%~~ln=T|W{()%d3q^_vU(w)dT_Vama>UE zJPbX?ASkP4Td6g01Z8ARWoZ$qkD{!ImFflx$LT4hrk@70S^OK>#c4=ZY zVArXsMnf!Q3gJ-uiV12cy5Bd_+nGQ3e3{Lj@(3DjVW`{i6mNUh1Pto5H{_2P1)||k z6lHSg<%{>fb~^`q_SIQy;g(_@H)A_RKXX}bp(gnp+ykZw(rd2iIYQ#^?Pn_CO`jEd z>z!USV?0~Cq=(51z7P-duMttE9Jno1On^V`D~gOWL}mZAs0`|Nq!?SEK9UX*jz?lf zcYD`v0bvmpX7p&ad7f4g;$?-Ve^-!nInh?}NN9HL(9Lgkcx0?~JejY~qDcnI+@_e4lc3zz*&!5M>myUa$Rrzq`=#a%%N6DU!9+ zFL;2?@vYzWPV3Q#${#T%elpUi)3hfU@qc60_0scEd5}-FT0adu=06#J+GZdgEOJ($VTi zf{LhcVR>U&T6DtRz^g2#x5s6J?+06q-WhMHZ%pL#bvI&YhaDS>2??!zdJS&& zIq$5!`;A?82cWY2bxai@iO0EI4$k#gN(khNUvouWuDsP7^Q5_inESO9^wBs>$C>k+ znYB&!o%Nx;K8d9A<~d7?2)AmbB`?f)Qf}HczNK%(F+9&b$sT+ZJw_yrK%YfN65nB9 z!7ex{ZN_~+&y*)fp)m{G9XvR1%0$46hOQ{r%aVnj?0|{G63Z7`MHW{w73MC})!dh^ zH=k+j=dMBA8*SI{;oR@Ncjp=*rRGLTzyXsLsJh&}@It;c$kd3E@n@hSLPJ-pmU{R- zW$zti;#iK!NzUzc?MsZJGnbMxYUTKg6+MoHPH)&k+n9N0eIg%#Mp~qf$SX5l1qhFl zQnA~touaTsXgIji&T+VTA_rn3-_kXcKe@}7vTX#teI&V(mcQ@qyV1>WtuF*0ND~v| zM0udIc%^SVG*6RC(2oLz1O*7F>$xE|Q*+2a`Ugo@A617ZL5Sq$+nS2jbLNqk>g@>( zd|#^XJAJvVex=Cro8WY9;^Nv(b~W`}#u0?1(te^f=QH@=H7v2B68C25pW)JxlFQ4G zo4#KJ-);_HPDs)(`hBNoI~IGT%o=RA+)=$Q&d)a5mH0jY_T#YSzFOpy7qJ;*wOI~{ zEqJ)!Ilpsc>Wsy`cC_Usas) zrtqnABVIN}bHh7Q8J88>9$vf|8@7M7z^tJ$vtY^uK}izZD45+I{8qPDe<}AZ3*+z% z+%l~)p{8bRe0O`@l>2!G3Q75bRGz8WKh9E>K;h&!U~R#%i*?jrkK^C5@XiC#z_K$9$Iz8M)+lAg^C0 z6SNY>I=w-$;E7(3v9VAQxnHaajG_Jx9<7WM33wT6)=d@<*)MHlxoEzz$OS^yAwRn2 z+z$1jhI0Btp%OuLE`j3WJUWs#Lt6z?gE8G^4@_Z?*0+wNEk96d6K@ppCk;BKs|9lS zQBa&XIw@nvePW3|U`a~p-kwRm-nW;JXC3H&(tEU&Tp25EF?xg0YyvSJ&rs#)NnD#2 zkdi`&0eybyjF=OzCJ zATuq6v<>3&dAGhOs(s=vU*chE?D|N423~4sxU#e1T`-@ZdUnjUANrZIx7wqNoP)Kz z2YcD!rW9-?0J*;?SnzB}=H~9^$ANQqIF%|oBt4}5TzUfWeA=$y8u7UEstZqEeCM}G zQ}BkD(N5Mt=c%C0vrsXaB6OgxZ(fsu+x_dyd;2TbMj}`?FADpLJP%!pv)YtuUBhHP zl$$Cm}hXW04+gOC$XLE8&q*)4DFsm^^EG$kxHNqx|(Zl~VYL+s&)p%On}@dV|egzxDSr zqQeUlPTUthzWAnjcpQaEfX8jIh(P@yogR-IFHX+w4*5wRZv26cREtJWTU_UomzYsH ze!wa@WCRa_s1%X86~q^5he5C9hK?U^xi&ZQBp=^Fwdjts;=H4ctD4{+w*7^lPDfTT zysa}vn2*rx9NrW&F`f?Q)?*GJWD^{bgnd_E()xB3io(!0YLnY1qEte5s zbJutK*yaKZX%@%y2eh-2Oa61YQOghq%Jp}^wMuM~)K;<&38T=r-P^3?oM;}UgbA25 z7@Ab}eHg@(xlo`c^>*;PD8jPJrwD__{$pKX@I!6BU)g^#EMRxs3122Mh+%yNZgupr zQ)-Ex?+*tx{1fH=j%lb_Ljro&$WK?j`O|IL5L3Mz1l*=?joiOsblc;17lT6uPDa$C z$*5bfz=SA;=JS5LfoC)w9=!CA&%v?s+S0Ld*~plB%h2Mt*M|P~hPBOtv1<&Lh2`@O@Ss7aE5@(6&#@>J^~vz`lQ(%9UN=*+{hu-~yY=#+>z@#n(oI%5 z?qZ@;I8ADPd@drTi&pY`v>q+hKoY}?msm%j#cHBZ@a9xwj>Fx@5e`$|oeWwWwY{F_ z^0rAbX&J+lVqWZwyf`j`pp$m-ZyN)k2MW?TVe$jka+fDL9{GS`w$kB}zACaJVKL-(%q_;fr#$hG z7(M#3$M?S|B#S(&O?18}_Pa@~8zym-(M0Ju-u&zuErVZL@Hxjl#I2lBwx5**8AHD* zI9kEw`ujD%H+XL6G^(ZA%OMf(SDYPQ8gcHw>dq7L1Tw z$joZauxR?^{;ADZN_fAFU^$PyNPZ75&rBi*pxh`qK2rBCAfITjD={lr!rmWBNs`wm zs;pjiaJ-Y=C7pq{K(@eLdu@*5?!7i>k$4@nd{drAyUtz8*$C5NSRiD)GstpeG3GDb z<`#&HOpeS%q~LW)+51*e^b4#H>nb7kf&?Np2BsU-C_@mSPEr=Zk*_8}V0rcOVW<$1ucGSik zbKvt-*M#w+ks?oSLgM1@HTx%%Mu{^!(4+|nb+OF*bWdy@CZ$RhC@qfl@E@6lRs{lT zKD?2;au<%8O%ByO;)o6r!nWcZpYjCNOjefCn5USC0f!ny{dLfhN{z9Wmbb;0Ea44i zU30gc5_ia;Lm5{W5+bFhsQFP^04q9e%ZWRw1Ab%|l7cB9RNS_iIY-YL-Q^$ipU5~S z7cexPl(2vu%P-PXV?jyuk=Mnn%~!hn{T7eufUVQ>R0IrUBaZLkf!74K3BT`WVR7X zCqBMr_c7;hrsnQ!52VeVqM?B8%NCp2P6#w9c+|Tq2TwFXMMZ>lGpZpEV24|_oHL}{k52NRNue* zR^XuwELwo9SnV52USKQ{s-xFEesr9NogS4lhyCf}Z-$$azpnH>tY3Xd-J5nuw};~h zWTy2No~_C;nG{#IQ+N3~5MR`JsjzdT!VWjMLD>5e!VnV@qF}Eg)RflZN=dxgENbsn z3fam8rR)a$2d&QO5y+0d0p;d!?|F(7rGu<^8YSLGK7TEu58FwdeV*xvA8iOIeOLmI zU0ePDuZ5dYZU$hu-cig~qaxt{EkuvP2LJ)U)>vgpRzA$%TUIn>E^-bi`|9G9iHcAU z!p@=NEa-X)mhQhK;uU=g7QU2u(}%wh{*pgw=T3tK5PYuWF3C*ce|HYRj!4esR4gQA zu6qNt{r3tqb6U8MY#r@C=;?(~>-U=>X}ru?l8SOH*nM&wFlTKjU)svwWDt)$SLVz&jy&kKXCSsa7t zR=|V%@@pNg0;vu@9*Iit9VD~MHac80&9O2f8Q`^g@5jk@?;ZLg(e>Upr>-OOgTizLKMbv>W5u%h~E$A#po%P(o7{sfgs{0$5khPC+iE*Xo1;H#S>zDq`)+$Kub-&*)W-2W%v~)J34@s{ z=`h2DF^OrG4T)Gdcu-3I0J0W+!bL`EmRgOBlc_^GI(~D^X1Yk^SO{q){T8E*U}8HEe)r-*B(KN--G<`!$G+|; z*$h?bN@d2xjS02GwxDirDU5lsj-8N;-|WXLmq_m#F%Gx0Q4DdpUNRTO;z1q@ev%Dx z1mCar<`0Nul_}Pzp2Gw0-}^kB|FC+7_)v#zSlJCm`G2wed?g2V`ji3uKd_ev#LgXWqRv?QZXu!Z#^xo1 z4?BqmJvvWE4e+qNI{sBg`ZQ%@sW6{>9NeMP-LCO*X2nL;HhT4|e9|ZWq>m2{_}*>K zb+je^H4TpzKAi}aYjKWp_WzC&zKqcNg|yt3H`f~!`GR)x-%cXje$Berky6rW%TCZt zqw6j9DvZD$?O^ECx-KJ9nH%*w+-Ak5zTDSGo0n<5yMuG)dWpD>5f_ceALhgAmt_vg z?8vJVv|N&RcCQ3Wfek+EAbp}5gPxRhfl*MyQ3bd!bsl- zWJ(?S{QW8JMB%#~wrEy6spVs3@#q<8!!?p7rE;dGS?i0d+Sc`ZAX{(UBtsBdVKccl zIz#1#v!e>GuL3XqWh1Y)=Gw+@Pzn=Q=JRQT*pya$+RH;ql$~_grg>Sk`r8SzNcTHc zN)Q0gI-N-YRPleX%~|_BJW~IJNd^yV%{MXjj+|wFSKoFb%{t9!T>w1`8`4l3R60CTuH&b8}?5 z-}dioz10$WKcJ03dv^257JHqoC&%>wf~fX3Ugu#p^x@5hR7la()SJ*u|I7Ec@D8Y{NsEggqg9dDO)S)$ae4pB^G7Y-$@2IdYGPQq!-cO*dm)0+p-zh;>o2a#FxGMh2T3O`|MZUKq7$1B z4C7ymyVKDvHE~{SzD4+e#*z(`=iB+LPqmANPHauaXa6R1k}TZkvC(_zENq^K$uIMl40y*!?0u-@&f5a=bMU5T8z68cIMgU!LVt-CFT?Fs zd1g(vZg%H09e1M)c+=xoP0XXI>6?{w#k1?g=S-U~V4T?k+#NXjfFD2Zx>>$JoU&DN zhZ|Ij{MMrDar1pg^!SINPe0y{R^Z3xwnP^VO3U!3^WaLjXytT9hgbCF41QMsl*&Z^W&v?#>^^An?{t1()f+*DS~-n{NDNZ(J|J0zmUgi849R zd9aDoLDmaCy{gg2(qBT|&T&b;Og~EWY4J-}+Q%%qw76QPCCQt?y$v!&Qa+qMK)KBANh5Dg zM>Uf5AZRD)kz8fc@q?{f;K8m2qntV=P|<_AoDH<$y~xAZ@98>HUW;KX-#8 z+@@|Ua=U^;V10E>P7>W;;pI(so;pwN4YYuF&Ja&8&4Y8~T{#EAe(u#%0;41H<4eB2 z5a0UEyb16_&B++pmy2=ZuwZoQ!?fnF@Rl<4ZMhoubB;oOYxrB~jXDP_u41mRBTdUr zu1uEXU{+a|Qi#9Fz?)8rW*Wj4`!;&U_oXOq0uR5kFLS|xbJuU{=}1zqSBIp6i=TtQ zdVSPR#KM7^A{Z^My5Oo5zPI`qGBmccsq7sAUps`X_7NvWiX%~^P3>|M+tJBXS5L}8 zS(=0@;qLV3{jrA}+;{|-co&zj2yu^P_;q{S_qYET-dqN@yj?8zB+}MpA6EZ)4_cRN zGF(0|h#(vhg<*Kh@*0Z)Gk29~kWV!~WlZ9>9R*G2>Cxoj;@{dy*&nIaFj5AKKF*G` z+i9~ho-asLn0oz9l`rHQ$6?hWlT3^yLdavJoqbt3PtKA~^n_2~0a zU{sR$oBa4$_AlcVl^jncn*EMJeTF4^+3o8p*}muM_g`eq(1vcl`qC3on>IM;=S^%0 zAR*-hR}7sXU8|z=(wA{@wP241gvCWDT>81r^^D2n$9I)*a^-TmXuYy8p)b-{VoCm; zmxbO*?Vc_{wk-H;eH?7i!M~Vg3iA~kk8*2F>vN8(IeyM(R^Do{(y#w>FPAUpT19~u zvcQ%-NpSbq;C97%c_w1>n{#k;+)W~6W6;bw*Wd+=AH~bJe1t>UEmRD z&pET-SLSV@-s7XpTh7(FlDVGzq)0CX$~^gcP9Zb?QLF*p-az&OR;UuDzA`N()8T(_ zfL!@XCtp3X@dJg*gh9e+|)9G!d`Z98F zY&C_4&fpU;yw}!rb`KbTc!AEpWqrR7$c-{UZWKjJx_)GQ!B}eqq{aCQV@s!~nNTP? zvGG~vC*jp9F-RAUPLb1)<>C>mNIxFdMS}$XqMKP!^x*va-d0C+?aaWVW?qjs(!iZ; z;Eut6Ir?vE{uJv54fQF*g)9-}$@Uy~&T zgAT|{do4?n2j{fv3ORdFa=+N3&E~R}U#`Q~o|9`C>kS8W=X^k0Pcfg15BLVs@(I0f z5B*{g+^!9gBMP*lGpK5b1$nnQlQ0P8*-3UjVj^F$?(_~V_iOvn>-oiV-i&j{z}~H2 zqU-Hl>xH%B-mP2FeJ^}D3cTsYr{#QxpHH4(_wT=f&TXA1h;fb6$Mlt%v_^ z+V0hi77|jWKiKI%MT>5<=vGvREN)H;%}Vi?k|zc6`bm$AqA@Zn%Ri4^e| zb?FH}I8Cg%=uMwMI&`a|f(g;1r$^gYz7I<>HjCe7T2W>y`ebS8qy!YN!*Oy5Mj*0( zUIHR}t^c=0t7;nkYjI;Dj4m%a`*h~_3#1=m(OQB8rW|K(AI-kOmwP2&*I(|}5v>CT zTAVAbV;L2Xg4M*+lStjz_drs>V&i%$v2jZ|(WGp-Q8zJdgZ3To;n z=*r!L&^5{s=p9_{P}?0XQwqnc#19#w^&9^3m$f&u6pg+?pD8Ms(Tt#@QsZAb%ehBZUR7z97zg zuWhOQ+hH2DT=D0%^exexHw^>-#HwvrOpQXv2c`e|6ww*RWsEQ5Jid_1!y}&gE{!=D z5!&*7r+04dql$V$$qc0Hgqjt<$-%FvHc>SMroEQw-Ml!SgBNq)<`b0()B8GS(#YDE zK)8%6AXj?BOi3J0R`LT!HChd=uIri|zBO?I+?f1{GPtr|qbIL(yWhG=Q4|iS8EBUS z5$1$zi+fvJqLyr%NynZ}KDWm}u=6p;rB}u-L5fWe9N9ukwK`R#8u>FdP;$6rNyfY< zH?K2WpM85}zF%NHzI=R%`JZAs!|?wtVH$top2*a6xcO%~c2nCnTs0|wCG-03c9Q_wMNxx*_2k744Vc!tAUDi-d2UN10p z#0G9f#p=xumAYRQpU-BU>Kq(a^3~JbCa)G2AY%6EBbL#TVO*smBHz_Syf`Fv@%6~( z1~!77qjQzwci6LJcIb(x5LdyUVF8F7F%A02#$XAR(eKv|9TV5l>&6`ReobPkyKt^8 z*A{HZ==lC(4qmn2p#x>>0Ub; zP7I+|c)6BY2lT{STN&C`Y-*13*U9yBuk=YSF;|@S=?7$@!`u-=qF?*1o|cG=+XkvC z9xY3_?J*xZXndqohV2$C#&aa>k2=nt%-*7!W54PH0p;S)mTP+>#Jkdg6 zV!!J8E>vP0#UmAP^kuc}wRcGlOBa~7f{*>?Ccpz*!RZ#w{6VkeZ7(8Pn0DwlgAt#( ziv>%-4zM~w|Lpz-AD_zjLdP;{jYrJ5IHDF8P|m@2l+h=aq|4OC!_Jr-(ibxHO;nMIKeGsPgElHDb;Hpnv$@Tjx;0I29H}CBy zg0W>vHj<#p~S&- zLrPaZ_^2-p2& zqt-Fb%oNYw!xz-VA9M_vVe%+SAc41;Q^$O`ijrFES!ek5>`BkRG=dsqH)Qpuf~+ZT zq^hy7N9b4X@UM$T?v%-TJ?@$f*Qrh{yQo2FDg^xj@v4C$VWcdvY|Op1=X41dWY~E* zahvY4#2k}!^3&P*e*IHWRa}sIxHn|Yu&|~vRPVwG=a|2@&U&Q0;(M(oX6rjcnzScf zUW4^9gS{k-^w6FY#*;m9bj|ViQloe=uNcLv|7IU#&yyKu)_D7ALymqJc3(6MUB;~& zH&mqBRVnbqXXJm-X=;ULcbZx%*B0-rtgwn9pB`>YP*X{6DB_~o)YG=wz$tlsR(tO~ zBI}+0P8odKiuaXD)+l)K#=|IA_ElS^#y!os-}_xG!QpI!JiL75)YkjPwTZsxXSA2_ zvdEmgroV!*LNi7athK65FH`P|FMWBg<@zeb&b4fG)co~`X#M6!Hd0&1+i$2OF zNqS4k7-;d1rmTub0(^K`nqW3Rw0%6_(z5EG(ZR{NLv%ZcgeI3txUGI}H*-I!QXgi< z0m1!2BEtI*MXwXw9#5W7^>&y?L4U|353W4MbtZ{>u)7eiqnWitTXu;+O90XuC6wqeb$@UZQVKTwj)rZjyWDnJtt1_8~^*>MX_y--F44yl< zfuZ;2rY&wkZ$^|@oBt0@H$0E%*N55lNs9+*pKYt2tXZS$n(9y*Jk!j_!I|asJ^pa@O?yD@B8L@`!`pU|C^x4~h-{2o7ukEK594zjv|VxhOUl^U zU-QHs)f`MjRpp@74mf-#6H)&(2E!bgyvUI)rK67A0xSq`w*GWd?^c}!y?%8wi5yXU zAmOjyuN7!T1w9$D;CdEd3`cy{kMHrj+xeSPtPew)|(u^p%Q5=1BRiFVqJFpaF z>G>Vx4jQu;6KNM8rT7;dO4@kBo*78>b1qj!V*LAB(B8VZpax7Ye)hbS7#L>pZL9I_ zU4;IKs-a{_`0>>Ko$nfcHT{n=<-5yvC%m|WF#-z`%6@e#_dO0p%qbkl+;L;;l?WRP zldX{YsSpJ|%B3B=qQB4jz1DO?=k8UD=Gif!Z4GC~^jDTfca|1Y&F$nR`a{KDeP6$! zwC{fVrQlvCPG2ux%B@H66hJh@0S5BwCrN??5Fi~Y0U|Xhe?B9yf4ZCQAVsu}P6FUd zWdL7tB6ubN)TQG8zigmhy7G^Q8B!^d50%MGOLj*Aoa(t2{3}y!9rG57HIUP3lFG1# zFQ&2${Q|m3I=NK3H1o-WN|&?%y5yi#e?oXz06WrVg3|vbI|gG0Y(S^!I3AV}yBug~ z|FcHok4DoR&3|lXP?H?Y)dKL3YgA@Xh~%eIl+gb}QK)>OlA{U61MfPM`8Inhe`K_% zXDbAt5A7G2nttk+=5_tc7`_otSV{@NQcgHRvpm3u4jU4H+jO?K;J|25LB z;1|EP?N|ZcQL65>Cfj`SU;&lhBq#&4s#%{(z3LbKM|2!N)z4Md{{`%=_~Xvz6M*(; z1+1ku!74!~9OVt5g5*l&Q;fjiPKe7IbrRe?Dv7Bf@-Rsr$bgTS#CMPYC&3uQ?l*ML zQNEG0LGEZKF(?i*l`KNr6bbMFhbMFQtbeZd64FlNB;M4&J{9VHRlbp8$iaUhbeZjc z%>5!z-_LSf8zMnj2l6rNE<%F@Lk_`9-+~-aRjv4B?lQj2iu~j66F9d~h48oZTmR(6 zBQfjZCi0_#08PLCflAXQ_TSZf!3-_Y0<`7y8h8kPR;1e_0!B-^MtEZoIt=EEj{8Ft z&9k*i6~{(AEB^V|*jE)5%a7&T)*@-`%YMRwTCy_4m%!D7(emv?(YK+ihjzujqK20r zq9n{73`Q4v%@alakt-Jo>+!3g}->~si!3gw-a^nv5r;1B|9c<=c7f$tj9r_!75!1d7?Y#>s1 z*EKF8LijY3Xrs=w>!&}_wKCYec2@pz1Wl;N-w0&$bb>nNkZTN)@AZ)&LU{YQ6E{4B z$P$Q3ATt2=zJ|<$Q&wz0;Acz7{V0K%iYgcW%-*ciV4dI&-+s#xNwdcrhdG7e8^c4^3$RioweZ=%F)buzhkbH>* zBD6(;dtv8EH@97#QD_fJJ!Gs(?D5Ld&Y4BXrR3+rG3C7aNSU*xZwOj5u#{IgqXb>} zKb%vB9)D;`;g(-*ontD8roAv$W3azo(Pffz8UURV4Qdu_nVxU$NgDN11Bz$gxk|%#}YSn%|?PHtH>!VD{M25344!Y+|xgL5z!+_b`XUp%mP+ngsgShsne6VSn81@2z; zWeOklgMZlHc+4vZ`w34n3wM^CcgP;dBA@w?{9lQi5YdD!rz+d~1yzV1Po7qmMD!^j z+E)yvr1W~m{HiwdjtIZd^`ATHOI+LF3j|wwVN_{f1=rW#R)$FT&EFC(Iz=QKJ3}Nr z&W|4#(1$id*T1uC-j4}8$Srd>ybkuaLvP;SjxI)v9}IDcF*W1dR1Y#GtPORLZB;nZ z+Hgv#)MJR(%lL73m6ZL{#pwC~;Od*Z;WVJXP#&cDb3cG=kNWCv$aI9RKd>oBj_8nx z-)XQDXu&*p!*R^TM%Up)jV)SRR|8}&yzrUFrBB7^Uq>*gK2p|@c@{p3agN%>T%0E} z;evEUf{$NHdj58O*%!CaJft^xMA(-pcqs{aYCkpeX^i+fE)Wa*Ns^=1rv;^5ZYw$# zc4MoR(Z`JQPEFel<20F_m>Q?oIQVeqmbLc?7Mv6sR13Xt_F$HY*P{`Xri^j|`hKUN zY7-@WSMFCOMs#H^I9NUY#)-gxA0kEmBK&e@t z=6Zo4+lj7c1_cRirt{iSRYj?Apgf(9ihM2||9sW4E%CX-+nqh8t#SF9nFYJ!CFkgD z=D$bd{a|%^lxNqxN}(^T&HvmMEf6!G!9 zuKjsdIs4lr2bhVE5us0?8M86{q{M2KA^=x$ zs7mA*aHPt)B97IE}fd}(BIzqmZgEU>f-gX7)SK=)5Oy0e8U zxK|^rC_u4RGqd;}qm*|zNV7i?tf!aZejL8{(fO4Qjfpj9(1bImaPUf{_x?3I!jq4G zOry*iZO5)gzP@roA^Nnb@tDl)|FI+q5oQQxSc=dk=-hmdxiPz`o}c;J!bJ>Rk`$LO z@MRDWvz@te#9|*5*DAeW-`GFe3edwT4&sw3(&@o=T<-)2^cOJFa~|I97C%Kt7gaiA z^YV;$h_f<(asEh&$P25M%)6SIVqWir$ht( z?SYgV$KL3R(LGLvqDsyusOgm;!kVS0G^lB7T;E!Ctb@Ebf~sXSCT#9pBo8z1%#;e_1Hh zz7~v3644T|>10+klKqvI^u!#lQKAEGmg(rfH$Y4jFIk*_V4ca*dra`TtFrlepq_b;Mh#Ny zA%CC(x~;m+1N4rQ+#CL~P+Pvtx1I3RzVt0>b%e!Ob^;2nQG3okze6Es%7{R%6-sRr zFA-k>l@c1Ll!TpeqXl-%fNmkJCP0vYGfV5H|NCC1DOh@bP3MQb=>Oi)5dwfdF+xB3 z@I6ML=Dq|^v`;qj%po7}ZC$_U@qzb9(gmP^VVb*(W;)R!B8KIr5FGmRi%)0L9g&qw`$|(3#Z$YL}DOchZF_RnS~I4>b1LGEiLI z0*b3HBm+?N=mRZj6L{%K+m~9F9i6-bq?Tn9CuLY|$usZ<6Y&QU+I1#+e~6x}f6{$z z-yj6zNaEa|$wAzI!#ySnHe3_GM=u|*3q4IOx$S3>{J1+=Qpcby@L)FZaW*LfZqS1f zc?Z+q7}Ule!{{0@mP4N5b$zC0zrVKjAWxZ${Kka*HX@`O!^406HR`tXM8k9h zOFz=BDegQQXY6+EHWNC$5K3+L(0UyyfA?fg;+)EbdXR!fM229#&+i&~qW{R(KyC(~ zBT9j{z4I^`NR=<9@gplzMLJkr`7X@0oj2>($NQG9d>D6BM%-wsF{2h*0UkKXt%@cq zcqN+cYJ1e`(G8+u?vyZb*0WSb!lA(k&w-gGYbZCo<5Qh)z%4dS&xUGn7^xfI@URPY zkNd9iu)Ky1C#g%h#?ByhOYWtISbqCKy=Sq96kkH%NpC9Gka{p5{$XK%gO`$2#aRAf zQGLuf)qRY}vlqd<7Udg1-~E`}obO>Uu;1`;3g_<0p*-Rh6mlepF8$U+_!$JvxduaM zgv|a5+Qn}5SDZ8(%wcL&txsd25gH!Jhb}(h3P8iFxoSx;nBk~>xiK4BaJqpOdF@F_ z!|s9dL*__6mZ=79`8gLg;PYdKu114egaz)_`GhZ1z90B`Ooh3Z%8Qc?|qu3 z8NrHT&F*<@c79{Fd_5)*4{ihsGh@il3pR?ww7GK zp<=BMd&PL0LPgKhGA!K@ch(7!q=(Em2&AoG>J3z97%sX@qf05`D<4>$M?f%l-??u&OCi zTxc(v_oMoowM^~zvV}AvfuRbUI$(WK4UcS&p#JD+&Eiz#)q# z9gBo)z~6dB>|s0Csh^L%rx*elSD*7S1>a!HO@AMw676_ePHt%4{K1ZHex!Qxbi08g zG|}(fCo$tb7PRYl@|n7=r8EVfuDIXpOpO?zQlcYZGt|CcWt`I?d140 zc*O^!kb3_qYj9%QJeqeg3_o(lR*4^B!r5eSyxcI?a4YknW4vLjndR^LjF+Qt;qj6+ zxLYDfdg`l45IJ_eEj*$+8`M@;70?zAtJ#`KPiy`lijdiDezW__J?_kQzrgrFZ$%lx zMIgvQpwF>kHpb%(;a25vMK|&qee+Q@2M#27bE^gHcM-2YSn>U0Z@_XuW}EDyRc}oW zGz=8yx^v4i?^E4TBB+NjOFqB)gl0Ch(8IGbLRd?}TH6`tI|54ay@I2sgfQ=|-tInE z12K1WZ1B_4$WlYHKbd-`psZC`8! z@$a0@@TvJhC?322<5BP1>shHw)GtDw8Swt3(aw4+p>Vc5lcckk1Lt$hGJKWO!t6z( z)(TS2Xvt)J()(7G`P}kY%wC8>KfXTR7x;p*^fFaSr7$&GF<&D9}>f6WN1Gv3n;rL zEPm4HV=lS>4t{I-2<&wlJfB}Hvv-#K>cfn1@8oMOqmaaiR15+U#BlU!-FejPQhMEOOEb+Ehvft`#a-9~|FRDbuov1#{{CD+}Lkfn$FrOi} zf}`Ap4wno;?#J1pr;(S{Bw;U}HRuPPNo11@VBPsc`uO)e@$C&$f8e1omrWPHG1>yoE1JsVc$yC*KfWXJOF23XtHc8RtXXoXeiZ@k zq!kS#R9>WeAV~Gc-C8Zc9}g~-*(SP5`GXKy&KmBf=DA_eWU6>hKH;}~@lxQjhhWTU zDl9DA6{#*UG;$&Y{u)c1ZWx(z&t%f^a)9SAy8Ff|B8N#_(ZbkW_39v@6H9iVb~7K1 zX1x>RK=<0RdzpU?|E&V}FCFk-oc0KbYySXzY_fFqVZY*u_?XAP;`iIeBA0VNl_%V5 z{^-h(+c7>I#vji>8qF6q{?tmv&qIm-g95XQ3ED_)gL&*bQ7ylStfAPmE>%g3B#Ibr zDYGp6)76uG_s;_yxc<5#4ZE=6(%iP+^Z8HwJ(z`h-ITK6+uh1h*o3Hxvg?)qIXn4Z z*;OR+>DVo~D|Z2K-J!a=RyMK|3-fFK55-N<|DpK0^^ZaUH8)y?f}?La!2GU{NDVx&EP~(5Roo-EL_d6_{fE>7*scFbTFPq3m~EZQc&nHrqQ(Nf@`Yj( z@qyXtP0<|(oF}c|c~`m2xg|S3ofvL|F1+u47w1;s<=H->`v z_PQ&s0>R^#VsGVbIyn`wULGM_Y`-O%8vp7&)roX;qh@i&5@Y2M7JCS8mH+E*hRMgV)dSG3&|Cv+b_!a5b%0Uz`wc5$jGTI;A zT0PjtrL78wbAC7pwI-<(*Xytd=vKeKuP!57d%H|t{e@P~(ckha7Bkk!PJHt+Z2C>x z(TBv9n@&8V{sUyWQG#Rugp2+D zD(!;GpP|~;Tjm}GN5U_wXST2OjB7{0hehMOrvNlGT3f3IQa3dWexC~A$Jzs7QyWtR zb-i&77%Z7?x&Es%aDMPua_D`rs(xzAts}W`qr_8w{{5|U)a<3zM9tBFry>(78uNwJ z3p2SS)9*<`09=O5uKXH}d3rbH6jiW_sQND`-L+ELd0Ecukb&Lb=moxg%IxoB0&X7; z%QF?XYjPCp`R}keM4e;;K(n+9ET`Pf(0=**$jk4#z~S=OPKGw#-pamQ;{nq!DScFO zmLK~|o&6-Rnw0;YNHMBYqn)YUi)ho%+!I1x*Z42dHNigv-l2cF+2g!;kGuWj8_f@i zD7kT8N4oq)om*eBj7}+K$}BmTsQH2H>^)T-Z~YJUKzR}Xk>Yqekg!;M>iN}Djl-wd zo0_>{tmtpdU1~L%qlnuXY2#caPM1zxV?k1+8uG(vAhK%gU<76zq*Jfno_TkVKKG^0 z^+;jihi0!T8?<~(?lMrL_8z%{y1}oT(oFAZG-hsYjU?SO>N5#Z_wlnd0HCIg4zBuN zLWcqXRtwz#;M?3{SMzBx)U??+H<%wy9A$6%d5x;e248rhD?JYzv+?2DAL`*_467%l z!9K3g*TP3IJOgf*XpZjJ;=A6I~ZJDj*`F zAfh571VN<;L`0+$5fG`d&|5@Anv~FM0-_?)M4I#t(z|p*?;Vj&=p6zigc1_Ygy(tQ z@4L=*ew<%~$=Z8n_MW}gz4qMqit@b|iNHN{x|3mr zp=0tw<~Ptc!p!D3?!wU9b?de_Kn?$nj^!BHRcu0>v!N=QY*$8VKWUA(AB9T+Bd}+n zwl83i*zF`;EaUa3k-_2KNs-V?S2rJ2tnt4u1FT_k9B!*3uopH?Q9;tw=pw2c#< zW+NYJcy*Tk7ikGF@-6LR8(e?5G}7yevEOWe{nphDwDD^k+rV%?;mnh2$*cdukF0%Q zOMZJ~f8~u-htt9}cF?_x3%o)#29PZgQ57G7>In;j8I8oaI{(wjy->#mT)w8E@6N*E z%fdoO4yga^s!w=1P2Y7R+?4)Rs95k3PUu!)^Xc&9x&XsN#)&yrRynM%Zahi<7A56( zJ;L_+oN*~%_W-7I=e1fc@&|Y4f2&dB7<39h9Mdgl6goQWBlwJV?x^-#W8*Ri*Ace! zE;nc9^IN3nm)@<#pJSJJk^Z`+`j^_u0~Ag3Jlw|R?-LZuBaTzI^X<}M?UU_Hs+a0VD;4E5 z&M_Y~c2s_Jk61n{iqSqS*yGrgBwoLK3K94?fVqs}d&!{SrCi7^%iyY9%1#OU`L3?s z!9Z~{cs;C6#^Iah^MA4ny}>^&JeswG$$0z7&e+kj8L-!_3=JNCj-`c`R-N+f2v+|_ zhVh|)2jK$`3?wK}z~JE}t&k;s6b?P!b~DkeV`mt;6se9#-0&8!s>wJhBL;FWmtbxUX%jhKQPh#IDw z?uK`4fS~iTBEN`Fqgtl)!4>rdFa4aCY?fXP#*rfTJrOa$U7VtXt8sV8ZA-t_xkYw* z%4WOn9Sf!(e#GP~#~pc6)FD3z2%nDoeICF}>msIYJm@CG`n;&d>cgEuz!$9I-FvN% z(=@@!^yJ{7QIkk^oNlRcBF9SYYt4QyvgV@hMi-Rb>dW2z;J{W$8?$17pEsLB_pyhcW;8P7t9^X= z?u%Z)g?+YjuxJErDqTZnw2Ouhnt2$#obQ$_ZJez#lkUdvo}LBIOFm1>woIoIEH95P zYEVUx_HnJo4sL3^%I@p5z0w1im3T(w_M-;AH2mobnIfD7$7 z7L@klUN8G2+)bXGnp0<HN}LT%ixm2^7o#T4?2@KQ;ogRXJsTPvJKj%y(D)Bt0$;3{^g377NLUSD;b zm&&L%_&XH8?oD%wGT2UMStBychV_6eS4oPQ{iYQ1gg3OHeq054G>`pGAA=jzIDH#Jy#LTv1M;+^6@vJ|I_hIskZ>txIH`_YG` zD3wiI2BASXes8mBmM_7Kx7aGz>IGZ)V!*>Y2TvubUhOV$7aKX49luV%6t~3{tKVf45xUF zZ~BF*Po~C>T*HuZ407%$tq;=EPiHlI3ZPd{?}_=dl~(?9<6;5LnmMJ%o;!$Wo7tJw z)Zx9YTaU!3#rr9~9g#Eoowid)B&dT*ICu7vl0yXFbZ^*T2CMkUIXbd2Ky>H9N&Vnocwy^YrG(AiX4AcAUwtx`!kDA4? z(frw%iG}4$dAG;5_*33$lM>p09G9#pQjYMygk0enwY0mrwZ2VZ(Q73})#n>-w#%-DD{q7(TSvlgGvRwaPpRZPDS2~%A ztmqtpx0a+N`klOB4+p!3^Mg7so#g3u4;RPO8MTLPba*OVi0MYNFWJW^`Z+T!%DKI$ zW7m`kXRQ=8EX@9?Qt?v8LMgjPmbvrujW)lB&kliZ3W#BYNFLE$`NQtzI~~k$u`X(l zmoniri&mu5{@ub0EauO-cfY6#y|=}xY)Z+QU=q$yWcG&gBM+$4clTNjdQYJ;d9cVc zCH(s~d#b_LTCQ4^6i*(8PMS+RqJt`ZbAQY46zA8~Aee{;s%dcAeUY4;M#l#Y;4*r% z$~WMs5Oj4L1`JK3k0pFKrWam_;am&y8(fe9m#OeRMf8Upe`nZufNeT|>&o<;p>iO0 z{;-sNuX+&N4+oFj31q8XeC(cfufM<(i`A;roPoV=(@PEJMtJa|nfHd;VkY>P-X~fb zDIU7QA~&KAMBAe?XZWMHT%Y7aw<-)<1^9Yj!3(}6-$dOfdFiP>2)n2ZMR9HJdiR@e z4;QA1E55-MYXr)XP_Nw-A0)EFj(=?pjyBib*sj zJi8~jv$;mH3KoNe$lRZZx4rQ-wem{?t3#qXDq7~Q$wOi>!2r+zmEJlB1HEW5sl(OB z+&drADcnVcFTbH5dp9u}0|B=xe07rc&nO|>?W=tj@(W_LbGp%eh5^}uBQ%>5>Enb) z!2=!&M`w38mB)iq!rESU8-Lzy3Vmo%4_5i(=A@%A2reHG5GJ&6pj7W9@?YA1ALXdr z05%9gyR2N*32<_Ea+@)VjY$Xqwi+1_vIo>fYCQh(4qtGJw(fHXUD?HF9v-2)_$R)y zEugUEeN?eDhoHFr-u+9n{n_6#)+D?_b-ty4(B&lZ=S!y19kR*Y5$>y5iYb3+O4B86 zrDPU*`LAgvBd2TETvr8pNnB{FFLbF=-sv>KYo_5Yzx!DQpt?Ed?^G+PN$}0qK+!!tnYkUr_Bck&U>$`<3$(u(xELCz2W8~ z%&l>m*FV}J#jW*L({!c8gg>U_YfbS@7~1;aT>5k$ZoL>O`Qf>|u44D`1JsM}8RXop zqoO$`wrw}t@dEB@k}fRybcE{>+RXy9z7G>OV z^y*E+{f$7Dw$)-ug`@X_J52eHuf`p@$RJ)HV?BHNsz0v1@xGB}cH7bGP-(_DFxJAv z@wi`I4BusN#i44eB!i>p-P7Tm)^xkj7n7;SgU5RE0JV4DA*FV|J5s7NVeSQ#b_|{^ zHNDHSjBV)X1cQ_(!EbBwcH3$!(YHKgbcZv?>ikMRxP=}VNO?{36bl*Xz1C+DlundE z=z+4nLX#w7A0|A+g}=O&T(bHlXnlzJ?L)-?X-%)Uif)Pqpp~<(6wqjHrG&Sn9F{ol zqKdwZDd|~YXT-HAsn4)BQ@Fgp%48`kBJEI`)pNN;tEdGYcDjiLjRYL=%x7P$MpS)B zt@uv(`GiE#yTm5@?2YJB^>8;m7OrQ(kK$Y30tH^Er6Rh+0P`OK@oo}{u=op6e?MFC zak4{(@8+I`cFZyRd&=FHuS>prtdlN#4eg)-T|esI%H5;&%Ftvy4UppcK#ZsY@6|JT zG5?OKLtVl5d*5NiHtbtc1)=gyK*GgChI43s7%E``cA4de$7 z`qRIUmO}dTX&%pgvLDKeTD8$@>)o?Z&YcqP+Ie}};_^&E`L<#aTr4ql*;~c3FGPbs zbzS{OALHwmA+xiqibWk?F0+Q(Sw9TaUU9pRz53MH;)7I;}k8H?Fi^Y5;{ZEXp1x-CTS&Uh7$= z7UX~R`&IkHifsFfL^(ExL)V(19YCy`x0U*Up84?E#D$<0MoE*$b`p2mCW=hp&bvGy zdM|ah3gh;j$C@GzHSr)5j$TX|DdyKc8SFgTl|@2CG;229m)^gN zoA-Fpa%vjGlzAY$Gsh+AKaJ?G{BNYj(?@MFR&zYAgocO)#9R_Pq2 zO%ibXBXQ;?2?s7TFOb5|+m!@0PvA11(oa142`bwmt^?nwyDl(;XZ@@`;$Ou*=X?h7 z7o)xA`?SLIB_};rbp=cz578^MgHsS+J!6!XY$qISgj^ND?3ZlrA8$q}*b?uWEQ@Z{ z6s}m_jN7@@@bYZ)aWnI<_vZ8Tz@a5KakSdt|3%YCIBxw`;gDoh?A1uaq77Zy8HFMI zaMgQJxgAHO?f?t?q5qGGcgQjOh`2;^>u{{%%9kbubv+>Y_Um_{oM8FdKoMBgF$RxG3J zNz6jE+xDGo$eFM_i+#vR-L!opW(1!^{bqKPQJw zN;u5hycE`s)T13p0(5L^Dq|vlg2km`!6_>Y8y4_>VqZ(PVF0Ega_YH`d)-&p`eQHz zR`aeAP@S%qCKRofCnS0OZNA$i5Ta`JG?j-IAQP{^gagt6(W!;KHpM_W(-LMCtyO4- zy%|ap6BmwRQ#KBY(P?nHf==XNGV8(e`L`QO>Dk0Z_p-{L3pr8XoVc|>)mpM}#X-tF z6Mom=QN>^_2L;gWwhG}bnG_Q9yVmE++Rz5XL!WVp7x1nA&XZZxd=*w zD!Kj|nLEnvJE(DbiPC;}Y3i;tJW{Q3bCcR4PCJv47NvR*^mE@y&mS)Spaq0howyb3%l#{3?123AozNhZ zY3GAA@+7K~WI20C(Uu>3V@lb?ef-@)KUPJ;4YN)|Z6A<$f{ceDKGfAq)tppT+LCr+ z;#dHlaWAt`#at-LMp|+|$JTVzaeB}B9qVdWZS*$ej;i+5H$@$o;HtatHuB!ZOq9Gk zM7GKslClJl@oI^#Bf=*HZT9&bNG)<}$s*H6!1Fx`kf5#;LSR1$cq?SLZq=UX2f5yS z20r%6nMOZ{uA_&)e+2&|S|#WuLLV=Hgm(7gK7%Bs%Qs`i!%u4U6MCyNO59t7#1F0R zy&yICq0ujkiL->GU5wXa>O|tvOmDt4xPZ3;TY~vO=pFLAipwmgWgVse9nn-4s#aNv zsU@vA&lX&xvEj3E)R4RIG+$gHfsVmOO zFgKHH@`uMuQ`zNeKY@)qZ1I`eC(fkF6X`J4qsjS@AHj-{9sh5=76c+@07|kQ(i$w< zdrhOdu~uic`FDPOWFa(Is`D-AQU-%6Wete12-|h&6IfaG%v>(+g-Y#AsOPixJ1m9N zx$xl`1JaStUu?*{X6c!la@FkJg0h7ZI*l>kB#eDpoGZP4zxHkRnhERk3m0r)vQ;goG8pwZ`nasa*uP&6J8{&=%^C9&Gqy0i^mf)|RkYG3Y-IRGm_?nh zDAZ@KI&UIek3T$szz?{EGpIYphpU%U?PF46F@ z4voMw0I^WIvK-=Yj(%usDm=kzC(NzYBE)TeJ5ac95d3=?Tus@Rv2zdZOAN|{Sqfot zoLMzHV;V}g;;{fI^~S$4;3QHamDUF}P{W2Zalx=JO%_|ha?~edY#fFmuOS(4+YtO$ za~}b6C_DW{#Kt;H@1_FKPj-fBH@m^AQTVAYo%&t_jC0CKFi#ZqcTlDsIY!OvdFBkW%(vsbE4dvp z36bzGZCd6EL6cB|+^br}qK0SR?ZTV7^@g6@k9)64W=;Im)X5*)vA$HqR<|hyET#t z$cjHM`wK|}g&G9cZ|MpGr zzNRSur-Fk!nRg}}=pnD^4N&O?u?CASpJ@cGQpgJ0qVPJEjyW>Uww_;J+#0mkzD@4>wkQ(5@k(-hP$_-Gz~!B*sYHOM7fli zBTzDHKcG?0Hqw$II-9gY)*zGF@C)l?s(vldIxjm>P8_DhXCW#y-C_fO;=XOzQ6fh+P|lQ>_?bE+;rqt!m8G_(z682@9;8uS{S%Yl@Spy9L>$04;6r=el9Ig!{~c z@-;wwU;cb5ma$w%cVttvG9~ zhDCx@Z<5KL%nS5Lf85q3+%d=aXNT5&(QsH`jozG8w(Ih`IE_pzg;kAZDR!5iq>S2@ zcl55Sd@3aUI!IlaOTb@M-OQ}r{bJtNp3E$Nb1L@*GUv=RfK2Z99dZ53^UY8}$Cfo- z0qH~HB2bP64-~x1MrfnxXRE$k3{IZlC@rt8pDgtg zEd5;Iz4cy(=Ey^P3mk}Ci-K+j92z{WU~qk-x$9Sey`BUIXHk^!wS)_ zK(3oFFOH4E{LD_Qs7B6SAG{t0pYnm}oH^A0toypAbZ^pp)C{#PD$+k~#F6@e+D_<4 zRi6;s0YOn+_T&rOyM9p0i5zlNpPO(O7gmv2UvZVld8D*5@A@U?<{aLuoR7}j&a$8Lycj(Z1+H*;B&{!V^Gx}wZK^*U65G1{t1 zSUV69LVZ~ENLeXB9{O!}N$F|4P@V9(bAB3{@rdSN@nS^eG92(yd3S_%RkXL>t#P?p zuRPk>%)HB#PrH5ZPcyN}>ElE|EX+~BT_S(C*6s)KmFi&%=vZ>oBk6YQ-jgtbwcHyV zW~FZcwJ*|zxI#pfJcfNdWau{GNNicqXU8C71Em55BMF$uGmQuHY0uIE2aMFz@0>w;? zd*wm&#x>qMRDWsT7$oJ$(5Tjp5(oT?{%w?GZ?(xo4lPf%5cYNyy4=9S}4{i&XR5kpg(>Ra? zbQ%o*>NHNDlR+=4P( z#^Cs*_O+UAMmbAcCd^h<`-s1o%6SZ2)00{k-`3!M{suC+WJ&Zq4x1`)I*KYCrsPDR z)Z=ClYr=H!!(*q~=-)@wpyoy~_5FWU&R^k%CGgrJBPK`XMz9p3UaWfi=MZ6F<)4%VKK{`1~=l8JNoQe zhVY%qv2bC9X&yat)Bgd;KqgzAZrH}!c8$)Y3Z5oCbQk{-I+sVeB9yucL&o=T=Dgb2 z#p1-bfJ-?49jIlK#(6XPMBJ!`)wXQkpU&o%T`s;Jmv}##r^T}AR-^<|z(EE3WN;nEuANG#kTDIEFkfMs;2%mIrts9_I7loEEA z!V>(4eH3W=M#kk><5SfquE-pCFPYdcExtebpuNnBs>%{3?xAvwdDmOsQz~A=r3)JIRx2HwVkGG$nJefsYcAk}C?4vEBr(3VEOFZuu z9ME1_0aAs+F56XsK2$!#W4`9p-5K%{c=-E&lH~XuTV`c89Y{mprnswzQTyU7#|YFj zpwJO=L$fG7=;wOD_5N{Mz+r7KIzo8<-+B*O8GuHMerixx%eH*c2+A0N?Q;0)u=E+T z{{T!2dE*)IsJ9LGm2J#r42iXrodK4}#t$3bznI5$!(}TLqVXQPj zGI}`KyRBcI^l8`Z-R}r*?c~C$_C2|@;Bqm30SnTa5Ck?YH&aZW1G|=8?Qck}!{ibJ z>DzU^4SM72wnn@yoDa24I#P`W8*U%<@Yg7Q-p}}XYbg_Bx|%pj(A4s^Kn{1Nmj#86 z$6O{Rn72^lM9ep9q82poG`s1_{Z);&?YabPMZ$-BI@zz$z`k4DkKCVS#)<*&(Jqgk z-2Nd)az&@fkIiRLl3`d1xw^|HMh*Z*^kiU!+y4c?t|g~$qCG~r@t*)xm9GPUr^6i& zjT#2Bict$tF$SYki{}8dQ&A){pD3B@Ppm@o$cPU2N!f9#9k49p`#)grR78-YT28hCYS{oqV+eqSX%_yxS3OIsZ>e&F zC+1&x_#gi3X8=y4z_f|*zGe5_S0*jsUJP)hMk}!G1o?turd@MC^GvZ`#5+I((081j zYYT`MGqO<oBItnbUH+#qAgc$c>xS==rI~vo9gu&4 z7Z?ykQX{7X$@q>e>fBx?V?Z{tTyuh~DDVLKdWk$T*Z_`3i)H~eVBX!2BUg+eU--up z{yf-If{)a8570n1;-6A7z!(3Pk~!_0>d1H)`IP-2=_dNWqGaUiHKXXcM$m#!n;4V( z%hSR$iYI4*bJ7CEVDdVRy0MOve1KLWi8v!M=PdokjeY%+XP@Bn^>aO}8+_>?_>RCs zR6@Z7R)OT+y(g&b>pb%yapvnjx@2gT_4mJ(lgRZ|1ds1M=!u12#*A%tro#Ap0Sl(U zi(?=>9ivrJtu&NyBwg_O{cnXJM!z+PEF&qt}5sx!Lf7ia2`p z_?zjHY!+EgQ*cZa@Mc7_yu%SK`Y!-$RfotwCPRLQDBytA-mHCB3w&@(?VHYV;)@>hQ? ziA>=2!9PQ7heA(^M&$1sr5%^0c&?!P6O)mwb^iOpEBiCBH3a*ypk~my$89)WXJaY{ zKm0@i++JARn*SG3|G+E`GPefWbv%L6t)rj#IY08OWg;fZS2uVR8t0*ehaHG=i^=r_ z&<4a?r|y0$dqFiz&_=Ad#4cUo2s2x;gW#^T4#|M+XHe7KZ0JHcCC$trjw_gMdoEi; z$iQftbNKD*LZTm!7q#TMl~12d8}sTCxbvJspF>tAU+5y+@R!ZJ!VQ*1-biUY^LrD{ z#YqAe`mPnRi!tjlcQknmwcUSZ^Rj4IBmCC0H^36^fgm5!mYpyo##7r=CP!dHcnV zo804`ZJVly&jth9R-+dCZl5ya_kJ(Ow`=4J#%|wyb7Ag~uFu4aS7vKQJP%f5d*iy$ zG`d;grfHy%4=zq7u?6P^)g6<)2K{<7NhTy{vf+?xizp7ww3!z=sBBq@lJ&!bs#<)E zfS;=x`y3PpUP_!y+g_(Bwtq2$&SDhs%Dguh=;V)^+LGO16_K!~88+%-tDiGi!0I3j z9J&NF>B(cIa*}t8c}A1(5V3RDV8xtqPiI;G{bY~erYAa!0+<#ObsM$o>f+?UAfMo; zAV3tU)@P#5<(J?wH)IaJPOoY`cnc^u8{?{0V)evJhHY!}vvL`hs3mCk#KY&BH}jyR zW#CTBr6^y%U!X8qXqP0D$MwT&n9N_b{VtZz=Osm&bfRXvAd%C0IaboPl^qVV^ zBFo+qTN-_LsmuCgTbU5Vrj5vZPv2|x@`PYrES2xUvrn`H4V_7Old9vd3~v)xIifz{ zF|@qstSpDKy}K>8ixLOIy@$21p1t^+2`Af9Vl@%_C|C8|>wR82ZJ(B(N^xi3931ss zZXn{V;ummIH`EWPv6{!NvSQ0V@n~4j6fNvvM7V*!=Ubp{XPj;5j7>dopi#TJG&EtM%FRJb zUcoFx5n!I9v!g41Vbo}u6SUxPx0Cm0n4<{675#O0KX+qI+ddop!WfWO%V4!Xu-xwm zCf@on>}NM?aV;v=^xOoC9lR3rwM*b)l>P^UV(#Mkr%YCo%!2h46`!^iE6#vzF8NbI zwS^2CFQ_}m8iIeUdAxRqxI{_EK8Hh8-5_RLSO-y$YT=ci5G-ehLz8KJ+{jz5D31A6 zRd&hFYd902qk7vjM(1jyR1$^{u(5(y=INkRQLqTsXEAKqQ^=0NtKM|!!-OTZ9Yip} zHS{Q~JK)*j^ap=^>Uncy)skpDiM}x4lRv9q98>HY#@oo=q#NiPNaM5 zLRMq9-@3JJe)v+~kp+9@Wm{B`Q4}kbdVC#gH~;g*=`hlKd9|&3-=PtW@V_Pk>WN1? zs4WmGH{7xN4vSw(rVr=!*Wy;prWRgE-h3mvbNqQ($dfy0`B83IvjfX?*Q_LS1f*wZ zx^=u;>YgWx_~UgQ*wXt5AxPo@ja=TJZX4oa!0Ie6I|kz!BuY>E3#q(Xu{yjXzF0I3 zAI>GV-3WD!7^pWL?<6f|cSex7?_l7~3{J&iO^=EM9P^K&;D{j()JMuzm4m2?K8zmH zYE*ZVdLvY6O0hTyF8D5}izf$$&D(td*gdIC@PDF93tkQZYmgpl~&`kYTK8K;?rx-(3D2CW5fjO zyBbYt48a|HUBgD^GaYRzROS8w10jGDp+r%*!Y`E+M5Vz$C6w23zTMU5nUP3`CrX10 zB{%F~;0`{ZY>KvSz9-d=%X*s_ck*Quog2%Zz|Tj4>?r8#sjql5L%DTP3O;k&@9_~P zdB&c|-=R`5ts8O4kyS3&<67a%%SGcI*5}x!eMwSF4B8m?N;rqXirYm5zLy|%PXME# zMUv9OC%CaUVVM)!Uc8seoRt*WVDMfp{Qld>p5E&IpFYn>p(M-=KE7bE!x6%IfmbH~ zwz_ohP$;+C#X}pRamY$PDSj1mZ4-npFf@Z!(=v{PFv(pzL2U9pQ$eS4wR*fe4i=OS zVe7-&rE$4<*VeUtSj0`yEOV~E{lEMz-2w$T;T~%zy5W&EUtOE{$FXBqW0xq5^~G_n zkdIwnM7O}6`yklk%;WRUT!U&qP@BGQ3@iT&kX;a{UO_fCa8hi=Q z(p>j(A>)XHyqn( zs=g*sLHb415zbeJsma!RfOVK-4ZRQj;S*6Fpm)b^(Z@OLE8iI$xjxb#KN%4dSJLH| z4rOq>{Swx|;D`yISiB8d$);vI@X3eUr}qf9(@2yuZBtE+^F}-d$V0$M5YJJs1$XF5 z0?d)4iWWL6{>R2q?uyQL-4|$xKa*%+{i#MD!7HI4+^m^fEfws~e&Era1un=+>{;o9 zr}?bXyS{bMeqZnkpMuxGo+6?@6F82iC9Li-Edu|ATyWo3IQj7ss&EK&5rMqAskJS8 zI7RM{QI?^Or`!mg3<0{(2D<3nd=_$?1iFfwp{rFi*dTvq1U^^V;My6E`V%XN^~^_p zrOrOPz}a)Cr4Jerr{7cn7x@Qe$$SV{A%H%AAx{q*10VY*g4hpbA@^1qnD@Y2DZq(j z_*;?NpNW&?3sC#W?&(uaz5{l|`2+kncR%;=0n%rw{&|^$6k-bdtjusCMWi>%cll2! zvnx?fW)z&e*Yu0IT~SCnlN1_sp>${`oVSD5j25HfWjo4!z!ePXTMQzG80L3sOLNy+ zq*1XY_}yAXQxW>3)z1o_L5BR&d)p>KL-y-WRAx*w65C`PSKSjxid=mzvb9wVh5{(_ zevu203RIHi(yV&INq&8x{-!(neM0^%A4nYH>A~=9Cz3%u*Nm`Jw{dE)23riz)D(%wBf=a4`LZbNYsgv|IIWVk!A_lbzUwe?Yas6J+mOA))rN( zukIJowkMz0rhe=s=sq5?b9O4pSsiO&ZrdOgg_UAHlEWca7zjqo#4ATiQ=m`CEP{)M zi}^`PfzZT>PZ_4T*e$G=lRJcZIPs>N+BP#B19Ouo%PS;Zb~JZMK5~;fwRHE1o3G86bO5xQmvQ_$87FgXnC)TTgU=9O~OxmkN_^vS>Rs!>Y zJBcU5Z_nSs?`Vk9u*T29USqOAiD=VSVs5zPtPCxXI9x%HW45dKB4+=UyW){FY-X40 zJ<;MKtMo=LYT0VGzO#kIxDgpMFUM0=0RMdoaPUZewfTu~=j+b-P3lEzqvx1k zLaofA21{z$CCNFNF5&hHMzh4LLEt4BT27*52FEaerq`9$d{6JSQUQLxROu@VGPEaL zcqQ{m{K|%IxwIp6%`Z{JVku!l%b`Wd!3=uRY`A~f7X&6ww(j}0S_X^lC`?RKL8YhN z!1LO|egjNBU>%uGpf0wPcq;czWpvBIm4XnuBi1O9zfSp;rr6O`=-(?uZ~*~X0y_SS zQ$yZ7*tnO`lre0UpBL@6?o{Fu4`*I|KjMn|1VLNMri-9bu$sOP(pMEbp2 zVcV`W69)6+Sr!<`ePv+p5*jHw%I))^lIs&M1IQp}JrpC7t$1X+^J?l0st;1Ryd$Ql zimCmRbhNVOG-v3vWA@(GD%NO-1o3!RdVe7uFW&Cjh(i9H>X+xp5y+70CEQsdJk%Io zCEV$EU95ppnlnzwAH{G0pjCUoE%8(N%}MGlZ(v@QAyN!lbxj1A6!%+%QQ~r2O|%}s zbm7T0Js0!%lI^$6K3^|eH~>@8mv>uTyTvO`S{!Ir9vCr54#Kz!>m?pA5PpKW^zc$& zf0i*>-cRF2bNei{T|l?RtsF`SON1F`PPG{T!1M(t;2qRh2glw9_Z1U{}`FG zJq(X3e)|YSJaa30^S(d>)JvM9fhk?C$X>v^V;9}v2m7#$)lg%4Tr0p##2QOEbY}8Qe zAQuB)QbQBl+bra>G>d$*SNpi3`)q<1v)qZ7lN-62$5JpM- z4sMAPrCFI>8~heONHy&<)4&hOmx$U?dF`cKe2yN-MIW6plFB=IFFA%Yk#l6gJoyE> zu@HT!2HTJJnW<~P$2r|Lfh-{&6ekK9Al~<_{G=2txp7b3;f4gW^k%ywCHRUUE_T!0 z7W%+&ch!$Ad*N(kit7Mlkyg1Y{Z@E3TSu=)N$&T|llKJ9WST{fghe@t?w{>NYNTfb zk4@2utVyce$s4c-(}gPU>%~5q(dJGyjHfbMUt(pf?U7KdF&TFnap{bo7TSZ(S|u}v zd@CDB?&!5jt9-l*UR5K;D75v`?oVH!IU0XBn==>xDkw72Grsqi)K%3)B=*Czu2$CO z;Q1cOMVgzA3(Rl8nJ%hv0iJE)kdfnegm^jtTnCEQUvrJNw+Ja1uN`_tZN~V016_B^C>9sH&|LnsIXnZccuZG)z$e*j(xyG? z^Jp>E@iHZy9i6JvqqB7_jpf=J9lyrq8$ECRt{WKq6~!;JiOUwxvtDY`0jPXo%te9j z*ET2OyV#;T=lj{E*r&qUB0P4)JUK#~bd69gA3Z%weq1?PvHzZdhqYV*V9`ri8bo^m zGT^gkQqI-IbCCX3^jiStZ~_qM4jaTb0WdKFOp=5H88rKE&;qz>Dv6Aw^5WlSk}=nL z0CP=og^?i^@Es%##K@qL#@$nyT=!;JtCGa^Sg;do6KqX(u!AExY8JRI#@4Nk|S@C>#mMx}G7KNt= zJZZ(c+%_tBeC1IuXs2)m7K<h;pVm>MGj`wV@{p>6LdJ{703*CGHieV!}+=+pACYpo7^Yfn^@@Z{FJf2 z=Hb_W$Q=*G6Qr2n7l8$n=|TiUX($} zP{$p+`zU>w$Rl_Sk1~4K>~jA3eBFXcLiGC7Ci?cp8&PU0a$T$6?-*3+5Q&egmvL;A z%TL#*+-~sLJMEA9RTy5D{598gx6zbw{;c?hiSdN8`FY*(v9akOc}Agan(2BZ?y`~k zAG+S7{&P*gitFSK@ezKHD~KH6r9IBN1Y7;? z;}HGf*1fI8wqc(EF+)nSZ%sl`8yT>T>k~ao*f?vwn4su-!8f*hS-D;>4unD;;H79lcf}x7^V-wL z2KbnFC-e$X4A0^PwPoVf*{2>kTx7)O_R5ROiER zckQF*1_^sC!z@t-}G#M)>$k*6aF<0w&B;VCb-Nh2`$W zU+_^61A&`y+A#U#74XYJGv{j=Dzw)AhRXHC>AyGEaitLh3W1q?0rK)Ptps952(|*+ zoW&v~%{NDKlgi67b)9NEzgvVw1V>r1QKQV|FPMlBWK~s_7Z;NNMrm@q;bYxC1>nH zghSjpy?+(oq@0HSQgoRyk z=Y*^U88NiW$djYX@HoqgT%*kl9gu^2Epod8X?J^`b21Pk6#q}sP0pBC<^*?vh~f(* zvRo;|z3P4-Gd?vrF=i&WT?tE>x*+pia_K41Z2>uGRTXN1y+Qv*HuvfQpaFrLN^ku_ zyAx#*{S0(Kz7AP9O~jc1dqO4Ir0J~`1#E^v+L8Eg+MGjeQ<$nwj*9;nje&r;2xs(^ zdn&W$BS`*-Fhh5!j-%qo{_1DO4khd2;Wu^%LMrxX?nEWLcGxV5kWj{fIk!%(Lj6KY zPXpMR*AH=)q$Y=2F0aDA$S_(J`%9-AjK=i=nJ}A$orb;l-TPzN!hzXUZxRJ`x)Xoe zWtryoZyisY(GjVSLPAa4B%h%^lC&{xd!(PrDny#kC1XV+MoLS(JDIe5(T`uX9&)Ms zllbgajfpfXFQ9CzVcP!g-}ZHXl|PSNt0Kv|9T2!vOflsbfr|NJoRO$m`Rdh0RBA#z z%J5RJLLIs@F((!T9a41fj{M@*+tfj_>KkuokKK5!f6QyP^@Ym*g-wM1E_=B-kf> zw}1NCsJLy!n8?I^!X_JjOYfx&-~Jg%MdTM!Uhx<5i?jZM2GmDXIw42nO*V6mjw-9n zm!}=PkR(5a>wier2lBljI6Bj<>gZGBk!XK1nwN5*Z79u2G+L7}{NCnY6#TflQ& zWN!mr8r6i07LhhGZtK4N9rDJ$BwA~q@ebrCCH|89$(Ki4ScAW?zi5^+X4MpDsn18U zc#kW6#c1*5rp|eH`}uc9A*fz^F>8a)%3p-@OHIR?1|7C zx4hQL%?!{GaXU8fWfQd}hCo>ZzAV87yW15$vEE=Yp8G_HM0QCe)wp9gKM_YU=e9^UHZEA3mTFER;wuy%;?yf{)GeRT=6#4ssV z`CU)#cxpVLR|%?8B-zR``>Jc>>(1)Fsz78n%TsZOjZu~t&+1Byf2ht_d7~&!C`sq0 z1L_%k5`EmFjfEg-ec(`g6&(=j{yKwsyr$dXpb}x=4kKMQiZQ0E4b^oAs;EIq?Q^8gPb$_I;b}wi3sIUm+F<%w(Kq+CwR_i-#H7!jb?>{_FOeHx4{0SU9VNbz5ko*<&`s5(v z7Y=2-e09dQUzmb=a+&vdvBIG93wz^dLsL>KCaAn~?M<+cRf4y8v7n0h96TL3dJ%4;rZcp^$eAnXP?`xJhV|D}Ls}}9( zmv1e>pQu|ixuf6mM+=`1TkbATHT~tNOCwvGdHYyP)2tZETz#f$v0LmNP)dP`FJj+; zjcU-uyXZ5D@`U=w%t$@d2mMOmn7KQa<%0XVt8?S9;GRNZG!DY;wz+qh9) zbrMZQ*A1f3O8=JPl4QTFOzTzwfAwfW|lN5%>_^BT%j(?o9`5TPy&HgkwX8zQ)7F#qCK3&|VzGCt zi;jNvM%C!!y?65IAXzj8O&TF+tNA-XYjfNBfZF9Zt~K3u2ND6O>HbRVJ3YazvpsZ! z8<#hqm1!)Aj|cP=I3|LP^Va9D*+vY6cBr5};^)55EjM~I-G=11OOu4g$rsXp)^*1b zfxXKuEcqkR9<_ve5tBdUHH&>03l@6XYTE_vpkkVfyl;p4VSm{CAnHlTK5dj<245@p zZr|>}aqUCcQ}nZ<!1G-=ECiF}w0Z_UJ~dpk8a5PJ!Su z^w$T(d^)Xw?3J%}f0NbC47w3NOet(|geGTYbMR>BtqE^$ng^EYGgnB)CuzjiU9F^q$hJDtLv)ByKn@6bZ{TabgiaTKbvX zGe1r9Ff5w7gOwc-LVpKK9#ru?(*_74iq|sAV-j&TL3nv3zKu)L$u94B%SAio+|s92 z^xm?y@UoA4*l2mY_DZF~YhlBtzhA6P=EmjQEV<__>ef}ImP!8|pPc$(zP`3iF5VOa2@`dOvbkZ!L9mGZOg~Ui-&Aq}O$~@dHV0bNva;s&qt)C1SApHoKa< zzWZC+`3#2orEOZ}JdYZ@e{L0~50~nT%YIiBljxW@5xKIZ+niu7A$e0m()~*O=4S3K zDddlqZ2@J&-~l3+?t1W6YR+NSExHr|e{}`hgFESeJzgAesFs?Hh8d>&Za`%!W6*!9 z0amCgf6yL2SG|Ae(i($j%&T?u9nTy0#)ZCnN<0T=6Mzds8sp-sB8r09Q*+H8I{HC0 zET`lePu^IHoilV1LG{<(9&od{&nV||@GAYUG%0;!&k%Ee`1t8Qb1d$-Wy(dxkwwcks7@RU50-d}wpZ(iN{!HW`DgJy2INWEc*d_S^9BH&T%Q zigFizn@S~*ko5l$_TEuVHD4R3%8OA!qF6vFQBeU=5D@8!C`CY;h@dn9=}mf1s3IK& z1*C*3z4sb=@4ffl0wk1F?g8K5@B6-W?^^dSm*Jcm|3G@oN^`mxKx$~|JQr9jLh(Zrsj%QcK5K zylpi{STB+Ki1r;M{@D%~YaJ@#8D}xDR`Q*djre#h!)ebF!jCvC}1XSQ|{Ds1ihl1{JDHp17ovb(bLZ!kZ< z%Xs794qRT$GV{b^oa9>sWxKToTxAw?GqYc+u1<5=N=1Fk5oR{u5^+!|$}F$k61n}1 zNUbYJqn60|0u01}xw?0ROsT8mL0FlK)$v^1cdNU1k35aA z7@r{}KG>MSav+Og=d<9VFJI$&h3`#!C5Yr1-W%>O&&bRc9i9v`QZMg!rRg+@6tSd5 z@YTlkQaI0%7_nWwvikE4<E>D!$`gQ{{Ocd8dkVwHm{J>fWOh-v6oGq_|tylGO zek0qzZ;)t+V{app6pnI*XkKrai*+e1eQ`!nXqN#aK{Z2Hv7SE-PRGfen1r{NP;)G4>_biik|a9GQRWD zds=6eu{p=RcO8NNKK(7z^3I-mgjeAwld!^_stE4cPZ3a$QVZmFn=MDK53y=j`BY7> ztG>_0hPGEBzB)$rIe;zEgZ&YUj3j~ zN?42C$_yaM`#ZX%_`<^i$1fHOW7(cb9)BfMlNgTTXJlgyO9`)2r%^*v>fKsVtDk3- zJ)R@W1Rk|HX&dZQbuQYske|SF=zX1?CLQ8Lf5q&HCRs{2kjas`_79lp7f)G3=AOqP?$X62}Pqt4c<1wgRUqWd$cgY7cvel?$IQWakUkw5Fd@sgV*5N{*+rwx5|vBu3pok)=UkH+ zRel_uC+)=HYFpN&yb~AsVt}8q$EJ$^Q1Sv| zsS+jLPRw+f}M|MWaw0c$7mqM6-N_V3^0^5nD=l^lO3&Gw7asUc$FCA=E=+w>V zQl`$nZw`Po)bgsI!sScB_}syc2Hl~@{zkIUY&`HNI<*(t>8iX>B;^__#wc#zv}7ra zi2R4`?7>SnPc1pRFGMBuw`85Tl_z3>-_yrtLi#P#Y(urM+poJ6G73e-jQUbFA|7MC zr<3jl?Ol;;5Xpbg+Ha(*Z|1rV!Mbaa=&W7pbKX2jSKU?rNnh>BwQF+;KMANSGZuWo zPwa=s>*s8Jw&w!Mw%M+=<(pM}6D^Tcy~#KAvD)&WB9AKU6=>ZP&=CATpMTbL2f+LR zR?^ALZZ5E7c)r^0;pAOg;~?e(Z{}VOYwl83Z1LI+Kiss`!@0*7V-x6r=2>2Ht;&u) ziD?3zrD^JRV#glhKFnMl7?l8h0fd{m_v(G@2}Qs!ma?`tY<*CTP|m-{dj-Mwf@}3` zb+fltZ^XufX~s-y8C#kYwpk|#mC|9CoSztN7^yEEmx8m*EDk)GdrcRub0RWwM~YWI zkM}ljZuAVN-yJoG;hX zDK}ibdqNcG%D{+|e{(fh*HM2(--&EHgewmsP8cL_)dA3L+`;jPmxv%&lg$?VgjgRW z-F3*u%`Nmd68|`#T;hQ%@?(>Ig}_>-45Os6h5%}p*W^e7yub3X!yjHSxOBk}ED(3bLjRAUiBH}XfTPBb_Ww=_J zLD+U`zXX8%sV&n-`bfY0^g+CDBYpBlP?3cTa4ov%D|q2Ux*cGFrZzqpo5Br^sBJnEcbr|B9=|HdS!EMr3$A-TLu1@poqK zO_x75&Zl9V)=PzdYY|;N>LA!;2Jb(7r(xi9ZCx}J&z*g*VM^Y<^8>ghtl8y# zsa=1%4P02$*ySr^BbiHACQT&aT2snL)+zEH>GEM*vFgIAN);20R>ML&WK6HWPL97~ zg>Q53Y%XKW+C_zrtU-G^On2KaW=v}d#|gI!tvMU)n{6cfqPXxqnNEQKCn;cs)<_JO z7ciSg9O|iZE6xJnG=&@HgnFbLx%3i3m??jR?A=NU@W&S>>K5&s0ga zPW$(5e;1yixA%?Jap6ugka58Z>UMKZ!;xx*y(Bz4 zoC3i%kejj#ay$c}KT~!Y(FCxEUANX+0#av?CnTwJ$1)cCVk+xH4JD8@xiILP+V*ng84walDZng^I{(oq)MB`!sul%>G&hdn4x=%5Gj&EHz7(*P~r9(b>nw~wjwZ@<(8t+c++EW+s}pzv9#pTiuB-eu$!dM<-n#7P&3b)6*-NG_=r ziCR?4APHp4xVMQ^Wzc8lj9z?o{UfJP;gf>gVIifA2#ig$(~~4NR+@fP)^oXl_zU)J zceD)>J~;^emD66d4PM81xouD&dM%{f7(JgjaUOZ)MMuLT4~g+R$Bz*^mi3V9@WjC& z+H;0EpB}yoB zF;Ws3LXV%p?(HL~csvGy_@-lc?^xuh+ zJMyYmc&9%gcnHcIwVo)+u}Dgj@TTkn9|Yi)WDt^ENfv}pq)&f*zC3W$rk4H3>Tmh+ z)7fa)w}AJXLy#B)D;^C}oreuwzbMBiQal~v%0hk^OrY(DIGoz2Qw<3joT2lzyhIeU z5FYJmV+|L43cFD0bO7=>HpF?MFCi3<{ND1wSP*%IEX(?yd3O*`IoAPHs&ic~{ZW6V zsylO^(NXDqOs1*l65l@DY9-WTR1UlkjezwXPz{4=ABvsSMQ2GmXYoR%WoT)GuHX8Y zg_unhgY8iLX{&wEnC1+Mwa#&K5iBD*WaamFD$oHfaONW~d*Qv^iEXY{#vPCjKR@Cr z`mm|~xR6-a+qN=*9{TEyWP5<&T?RkY?X%#b(Geqm+V84@hxa4?sQ zyz<1aoXp1+wKF#rmqDx@P4Kd4H~1CQmhWU#{+jt-2PMHvYZ=7Nyg|OxmEQVR<~Ssi zZ2)jpUE2mxDa}z8OlPJk|CarV9fPmsMWUErNf_4!^*xQhMujfj?4ifH?b;rqrM*wa zY``0sJMnY|Sf=(Qy&SNLcxu3$In&Os849DX;M)PEAY>j&y1me>Z##YVfjAe}C7#UsQom}A}!$Op-0w_w-_c_ZGFf)1$Og0YR< zUZu?{TI&h^hF5CG)y=x)>tj3>JaKiNayPG>G`W&2kU3!HhdeMor5aS~|toVQM z7~I$dJ4ZnpPiCr}n+YmwkOi24uRAjLfUzmD5(JreK>xN+aG{+${y?6U@;Mm^_9!4^ z;wFZtbF`nZY4#FlI5=VAJdiV*kDJCTPdmbMthztEzT4oeBWC5-bzULk>td;#D<1YaLs=tMOPO8WTjW(hfUex63r8r3PuG}WCSG9o=bH?2X z0J=`1if!grgJD}>EK$r3w%&`NB;Ro_Cfv=?X0xe8bf?1lcnT=S*S zeICqg(Y5p;su0EXypj0(r|80G|0U2rhkwZN-oxgBKLr0*|34+2`osfF zA-)Mi+h;|ru4or_0)SL3gW>w18cgaoj;$-??YKe>>(d+8gS! z6hyxy{IAx9-{;+`r+3jeYo=5H-#j2RB_;li-3yRQHL7_tZ~ot)rVr1nKgNmq=y{Mo zJ?RMXIw;N$t~w!@ls%9OnuaJgc&8GQi1+^MiG_bL)QlEr{94Lq_#oU28J{+-a@53=3t9$A8Jf5Wq?x?8-DwFgv_r7eJA0KMd z(`|xfW?n8uBmYBLM#SXMTN^WBs|4`->1#(`llFPY^?+H8Wp@C(%W+;#=zqIT_usBN ziWL#eNG4)yp2WI`O0b9HkVenTH7!3r_NWAY(aM;~q(Bt#cgN0m5>kq^pTg7>NnoB+ z7Kb`U*AM?rf$b#V^SR&79ImuIO%=o%%x+7mWH-8v0JMv&2)M8GWaoh?|} zHa~9#`wpml>l3VWH+IGI|Jo%Y^}mK_|F#v$`tFHcI|f=XnYEtJk8*Xdbb<}WrL-GM*U6)E4nAg$;JrnU%0B;?H$!wF|()LiJ+r}@A1 z{gj<3HpeQ{MhwJxWlp$^SB#IWI_$~QErNsn@K=w#-qEq8<->!Y?J50+q!b}tIiH<) zzx|FIcNXobx~tNDtXKt$93kkE6a51P{}W|yuK@H@ztF5G`s;s(*=)+GS_tp#S*PRD zn5y7;ZZQ)^{V!#+xUwB-)g3lP-K_ul34Z0*h55hzt39_|B-M71G|i-Y=@2Bk#qV_@ zP@c(}txJ%p{!%p}H^&m#1yJ9Zg^`GZ(C5>^{ny=(UY#PU%(CHrKt$2~M9qAKC;k#W+nmizkIjzj z%F-YySVJt&IQNC&|F0xA&X>*e3Yv1ZrMBX?C6(S@Hw@USoZlpvCMe= zUx$_?&#oWj#5Id!HAq@<#)S!yh=Oa1qWl@?l@stxhbo@*(ReZG8BE3)^$Fhl&%>i@ zr`xm6>Ui|yy=0IZ>tLFgO2xoi8V_JKT+OGnCMX;DD#|M7u&Duc8R)F{;!%*5M)2`p zV*M9Rh$;WWsv0)}f@k1^2_P9X_>sBnb=9W3k&wX+_un+jAQjVpR{lcu9jZ+^L?d2I zs2J1(oRu?T);Kr>`Fv?bp`k)m8h=xa4{kPm&1>yPr?W-iDXnKyx0N^?c)%i!Ax;kf z$??BpC=KHk^*muKd95@^HA_ti)9VF}V{>~p5K+*zq5qblpW*Q+Bul@_DlG2r~*GnWtC9^SU zvxto<_HzF)F82+uGU(Cnv}+ZABQj`{yl>j}+ph%4?Q1HOf8f={yQSCCyapYC9Wngf z$~SqFZJ(gK!Cs|^2whSoh=t!r{RN&o0#@YkddK^EZg9n!5FxDEEO>nDLe`+#e4LKSFW`wdyr1|)6dzl4LIzirPQlK^qSP(#`2VfoJ!sKV=D~@7vH*?zms6cYc0fvA z$ul{47F$kWT{YVEuS>crox5tLdVN#AopwNL&T?)E^Ae2-3B1o#Wtin zXtT#*YA~ayrn&n&Af`ZCjY}um+|Afo*bXWkpW4J`^)GjYJC5%o{9J$J@d52d1&um1kG=eOTQtEH};dl$?;l}mD+%o zk2?6S3e4d6y?^!8nNoMb&Y@ns7&&;*A_90>ro%XzqCj~sT#(SJz|Q3srVE#KWs{x# zlqx?%=koDi>a!79tW<0b+&^r>qrlMUrb7Md~<{R6$ z09zldOU;4}N}jm53~XHL7vW4H?L}!{9tI~;Ql2iE&~8+(5urc%k^(xn!HKyJrTuYx z!)16c`ViSAup}IEfZ%EijfZ1 zcAXzmMX|?eQ!h+ZYQDAEgu0z6+bm)|5f1%|Bl~ zdKoCeIx8nFvoa?6sl@v6os=B=hPFhT%X=aCm&ZzXK})*H8D#Tp+k|h5ZnKtLt_In{ zcdHc>fg+X~kP*#YeG|hVSM+iJERYJEhFMo8i3B#P-Pj1`FSWJDHaZ7rZADiYktxTp zf82Oi-KT*JV6^QgCEA0NyfKkAhrhjH@AlNLk?BhLRNOo8#hS(*c16O;)5~uH3CJ!x zwHsSJ@0qBl5;$xjS9ug4N*d&)3^7e@Wvc5kiAroB+Y^M>WI?v7n6Pbs8iTm|mFG1R zT!?}e4&i?K+(JEm55|*B{fDC+y$?kMP2Ku7%7Jt^osgRID}_}}cD!`B@8@xR#P)V# zMJ=}ucz)$NmMqa_naR~v)tuD*LVGm?&b)MQTwIlx>!po?Aur$XkY8jNO_K%-*~I;% z(0Lbpk~No|wQrkOUZ+m_QQkXr+_159_05l*%CH^fb$P#>b?XY{QNC6aXOE6jCDpqr z1jDjmfe)DG19Q7Y1r3}1v%1W`w)OFcq~nl|gw(IMKo3o6(j22cxbF=O7g#Edkza`n zZbSVh5@HN&Uw80$9kA9jOT-RviqKTp1gr_&Gar;e(2lU>=vq50-jS91C`qp0`sz$w zg>??3#ckyV`QxwB9*NP+y*_(V;ONH?wsQAtTDLqSO<5+cVC&sheO$k_jb~Qsb!A3I z3=R)5n_8$34MnZ`*%vkbuKXYiR8G|Vs^E>iR0nyW4Vsq>qEm_mL}oH?w3y)yo4ENlM;p6M>l2|E0{Rg38J7BL+~-UB zXX(+PI7Ht8kJaoJchg?{Oj%59;jv&teTr-(-EG--Pd3eh_V4S~TyA}7z5h!UB?IS+ zc=_@d{?UD`>NMmTDYm8IxTqyr5^CRSoMzSi;wa>_PIy5?NuJ*hPln@j-f0=5l~oUI zv$xp?UE+x*nC<|(l%N^BgW1r#OOL8FFpRbIMy-YDs>Fz3N`l5DZb*varc{4G5rp>kJpepT|!Ws3E?CO1%=x~iBt6^Z{uKwwNmX$5BeP2>*qu<9$@@c zCJ4WI)qxF=prs2^o;ZAj%(J@WeEoLVROYR#&E=LAM9LWa{PY zL@_RGEW#RcRtEOyI*rw;s~jB~9zFl;qqVf~-L7FNng25)H`IAReni+np)xO@Q%Y+E zw_v#_#lOcDWl4~~k{172Pv{`Y`)0E^ZYWXlCSNs6Y?uWbxcZu7uJ5gtG_>jjpM?WO<%)Yw1!aM9gGqKH}&bCL4s>@75(vq z`vHBhb&OBAujdS=hLi{kW+O4R)s0&M?%vBm{JjZD7!j{Z^#y8Q53rs!pLNJJ0^_tH zHweF?WmXyQdlI3WC)K@8DmT9B-(wu@%rI8?zR=$)V0wIRj%t>jz7m?LPBmocx%lC0 zu6`9Jw6t$;<)lIa!RlADBaymN`cRf>mMfHa_938$Yau&Lnf@P~&CTvJiLC#R` zPgqZB4tK%g!-~YkB-6(;$dv$B1Lk(Aa&f3eW`d~<6eFbc2=@kV8?;wvL4T-ID*dM8 z?fE0s`^V~UuJp6!*?j8RjkcI?-H)~tGiYp>!*L7Uz=R)}$#CD>D;&fBN#JC1qkkC;UjOg7k@8{@0ryQ|sKoz8gu zwRQn*lYno~s?d?1YO3{{;x4*=B}SDCTUA^? zvbdfm`A!#vG&H(b8yap<<8%aS9PU9RF28PYNN|x30|~c%r+YTGFclXkuX%>*u0d+j zYbnvy47HPhHp?#J)zS1SwuZ(w3-oWj?D4qk^ zEF`8wr70ZV!dzIPlXLMyzHW7`|7xhz%GG2FsyBg@Mpe>0eXAjM$G1P~P`?~Eo#etF ze;eNJ?K$P{^wO=ZaO@ri_vG;ri=<#5-7Bt1U#(W($UWr1SdFua@vpTPfj3@pje?x( zYVugthMIrv{aQ}%f7>GDaY{rK*c4lbiT2>MmZo1U5a9`KK&dMz%>-Uy@rD#4 zyT+WYR2Mm0BKe?*oJBE```{ikQ7!4EP?WQKI&FkWQ2QXRkRbxTW^o*qjV;&646hVPBC8%xm zHjOoq*p#E3ZutJ#KRq0C`=^%I!qBs}JrzaodkcPANd<@`9oIOf5Ptgeu^V%D?6;_W zH$)(F)q!)DD`%%>jH0HXUfM1lUrR^$9%`*A$sCWQge3qXNsgA@WTFh=Bo~OaCu0Y28Eq#n9vfGrE&m+ z3SYR-ZVc~uy#Q`z2!w^YTN!UIpA|9vUHUs`qy_2Z*FB_pr$d-CSf&6894)%CJgUx; zZ=cy&i+}C!%Zh>X6>x<}9b8)@ZIQOp=A~Y5clO}pV5k7qd%aTUU*X7erBB zPu$JPMctfeTel+N_e{<=_Wde}<2wkDNI4Q%QbkA~b^hMReAQ8c zSJOpv*#=^9ULoO0GKuBfmuMltz7l7Ll|2vj)%+22xVI5Zfzc=0Nh1`^^nFB-L20voIc5?SimoK>5>_aP7SAX)9te(}%`p?~9 zwbH}GF7iU5ZWHculCloM<@oD6BG2TC;|)9=DLR~G_bO&5FvSd3OL2rnw=GeWPWK$Q zE?e##*qHTg8H#1Gj!#byzcni7!9<)xHeIexB=(zV@SNYvw;T5JKwEs zrSBV+F_Rf~&OjZ>XDk{zVs>y??w3=ZNw2fa^{diY^)=tI@06E7AIG6=Gw1k+K)F~D zgk35^d?}oCa#!BDFPU1~-@s3HIUnU|zui1Iii!%|fI&wzs!iQwMCdl&3#+`&CI`cg zUJF*-r@g;hXCt)ZXVkOd^~B!wXw$)_Z>yyTrvyU<#T$}Db927LLQ?o%UH^*OU_$D5 z-tq>@$KA0wG_bj`nQ;qlmd}DhU~Gxe*HLl8ZQF$g)#IVG7^t)P4Y0T5{$bTb?DASN zV`cKz#7MzVujxpC*~^)nPtf+Qi5r~@cbhS6UsCMMuGfMwYqP06{GQdWCB{$VS92sMK*%d#Mtn6RA5({1wCCu|mm za8)RN;J278tGj-W9NJkr19u@rTh^4jnVFdpP~`pGty~ltf51QO*zo3qh%=UnYZ9cJ7PnQz@1 zTf9H8c6;r`(!&YiwHNr%CutUgLs4=QL)VdHY^oudghn7nrGqEIXpxAN#_r~*Dz3xOX%#tHAWvhbSCrfl~5wM+SCP^>R>aG|PVyVGlO zv{7W|q4N-2t5k-XI{O8O)^`g)Lk_}B?;sZ}i)4Su+Q&z(uVQ*&$CELFHYN$LY-}+1 znp^T?Gl>{csmgz7^3JZk*gHlalPxC%S7Lx%Na?h*>2OJ0uErt@&Inv_IgOe2Je|fD zG1@(T^Kn~IBa*)gL+G1Pcin;xE(EUQGCfOVa9sY#zNDzQXzx<$z?xj>@e1tNDNG(M zb(=){GvacD0h73}H<1KPIT}S=;(G91f&PwSHOp8nve`Hsx!=VQ+S5aC{@qMrKU7yJ zjXdSF5^Df^y>NLWBKJ_4(@_aGRO8+*Zy#?;r|p`ra?DkY?dR-0y7dbBGh*>2v`t{E zXy9f7Nr~xGL|oDa{CokdnBs?mUFg&JgPo&=5LgyLg5kN@PBHkU;3wb@1?;YX6QR!O zOS#rxWbOQ18ka->ZaVujdhyzJ2o%5C;LGf6bYn4NcR&HQ74k4rNZ!$$B@; zJ$i4iO?deTM(K~hM9-M@Td8&^th7K7RcHZ4T$DKkx*Vy;L!{A!ri2J@mqm42eD*c} zv&T%%gIZ2#I!qPMttN$Z%Ra~66*il$!Z~vZ&l%Rj$&=X@brcANPv-N|LWdz>2W%b!NY&kUc{(cIrTEbKu) z*7#_+eN(GA4W6GrDz`8>GPQh1rZ~qLzR|T70L9N?XFaN1S%4!Uihs4}t!&v}T~>b0 zZyMUJd7T$D-0^9e9uuau(qZifAuQV4Oi^}WdMloXgEz)s4s1C}&L7}92YK-oC6wmX z0W0}@FMTK_Rp>o_MIW5gY|Ht1t9v7ZK(o9=FXG)Y8uL7mKRDHLg2@V)K`R5tyLh;bSrT>=Q_v9x!PzGkEK50<_ZQ0G7A`k{}<_)@My zv08(u1I!oau?4P4VYX&&wQTpqrJpypq}r{1iQ`sDjLpg<5}kJ)L@dyrQiB^x3)|D4 z&8|^0wz2&iTs2g zZ%{J>C;4KmgP44F+u<-(le*fVwWD?6(#Jun28Y_~bgF(+6QBEM4dc<9 zg+ouF_1Gh9Xb##_f1q?21`V2WpfQ@sqZoHUOKly{lYcN-)^HZA>VN-=*w`bP&wTEf z2qCO1hN-~qo>`aZaI5y!q%cm`ObstlfM>5=vT=1+w<~3VHgSeL&EuTG6bSbn9yenIbJ0k@JuM(QSENMZ^UNC*-c*-?*^ap{?FyLT*ExH1 zrZivcRM5C;M4(ZKo!&vzWgiJ#Y}T^wo+l>-guUg*XHntIjrTyd;1=$B3#hEA$EGoL zm8KhIhf6VnP58b|B>oz@Q~=-ZJk1a2kfn1vK!DZo`@qFPu45M==#4#5i|iiiIT)0K zbLHCI~4(i?`NuF;Q4#QU?>?#|`auEV! zOb%2bq@qgX%!1MkeE0@0ro?6L!OHb_Gi$&pLVTr%(mPaFl9d^g`re@W~qL6~A4UIDvx$ z?6nrHw#Au7>{0OB8As{3vV{`tHHXhyQi9p!x1*F>HxI;W>MTch5AZc3z=rTWf*W*f zz!82YmUf>d0;QFmh47NcHGX#Z2xeLOB5i>V102*N@LO&69*;0o%TT(y{}rqujgKUP znr6KUExbLP%903tv|MUkY4jH0((j~oYhL4mYRY=0T0n0J!(+So%L}0iwWA!OjW`m6 z+aR6WE(E5CPuPSr1AFWrx~@9WEzmZnJHElL=n`)e{!DF?v`3H*8F2AoxE%_C$6bJe@&)kY4pjNe{nl5aSBPeygOl$v$f{l4@IXWL!9TS2b# z7(r<5lYMi3*NmG|>J#tjDrjWpl^I1Jzk5jh*2{DYQ;>fyLL~aJ9DpzM{@?ai>Onw0 zPZ_1s_U&YMzeZ^ruKiG`q%(bc3cL4+%zWT`tz0y~_{^qjz-EUh(18j={UwRdok7s1ep%C_kRE^8_5rs< zVoLML#Vr1;q<^Tu%kO^}ejt4SMwFp?9N0R#59Bl-K*@)e9Lw9^bFQD5cKlT{8+|uL zzPzUwp3KMqy|o2$j3-fZEd%}e0~y^--!R(P-juerzfoSCt?F#-@o|PwdLxWuz$=kh zzVqGry8U@zMaTg4j5=M1K6|nR+&E{dxtsoRa_ricG4Kkd_$x|e;%Z73?X1m=&YFo5 z`RxMB(&v_wrDxxO0JJt6?`!Y+t5GlC^UU}2d_7hDvi1*ZSAHn`@s+^I28H~Klg>RS zpkBAZw6puPEc(bXo{Jr7lQ|&wpDu@SlYv$IH9R9QwkqV-V1-vMkAEAj1>UUO&r`+! znCC6OD>~lTp>1+%Zla?#5ul*d<2N}-pNSC79i1d8Zj|DuIpzCq(!1rBVil_4s6l|* zXptNxL|G!a;O|m-1#mR;&GW)gjKY4N@de%-Rc9s$YI>y)v*s`RyZ`Rr&b^i%(Qu1c zo#{4hB+>w@*7V~=!1g1B&7;S1;=&cG#dguK>U%*y4^JjNZ5VOvY$02r9j^URP6oR` z4NybFgYqu)Nq3A-=HdJP_R;kLiS(oEuei*w@7{pyTn^ZaxD8=v6@~)v8u)ktxTrOr z2|})9W|N!CS9N~Mgu}(@G%W_(%7nw{pzPoc<~32T@P&u$ZTAHeX6xV{q%cM-imHt>{FJ~eAEA}2O#L*X8;GU~NvBvM1RL=dhuCU5Olof_H zIl0Uld?TIxTrpb6v+Gu<4TtPYaKr_rNQuLYKV+*>YOX#;)c**RqeZeNqJ?@bE8!y^ z`#JX{3Fm6o9hiawAuJZ3>2gWabtSR8b^|iC_p_J(c3_upYJ}F#B@E?e!U3do zQn=(0Hymk(>Oe5~;T=aQ-CAF#PC7o^H(t4TrAES3g@C zzXmSGz6lZKX-3+OQ~@vPx0MC&B|yA2d%N$ge5t&n{W*!rGS`L9F~wI4jxc=ze1?b% z?32A`hz2P$Be|0qr@{U*9McJH4lzJ{#*@#L4(4thIg)-&aER{gPQdN}>kd3q3e>PA zbvy}iMz~>{jc(_HrF8+p#S%?1u)T2}P&2twl}XyeTQr12OZx)h?VHSm4>LfX)E$4| zMk~AbSM5Bb>E-1C)Q;ijBg${t_IH|<_HT_5|GYa9Jn@j#SL&Mr2XHB*>>o>+F8*fC zK5??8&UODp=%cC9jLx!fc8yTuTA@+@q=RRFqS7oq?+k#B8K{2!0>evH75octHnTYA-DGxn*KQBT3acydG_t z4KRGZ9oyq|9}+w0ZFS3M2Tb%^S(^LlGY#x;@79&C3Ip!}@iXJ+l;Z0{gr`c{RqyJR zvhRyjLe7d_3hK+9=a1{n4bCnmjEpMNphxo#xoX4|5lIs<9l(jIzAIL(eYg)UL;jY> zw(ximN^92@ELsQdL5woc_RI;vdcCw|cDxvOUODAQ+^vZn!g(+goBu&+UG;*%lg_%R zFO;gB+y`?VxGX3H+vE$G3GO|)#<_`qK9r(bQHyx+PtDT%7P)%hoU{m9;vEoP2Yh!k z#lO1Omh=J)*YniQ{q_XTy5sD(r>k&17P49gb_o=tIS}!Lj}B0{l&mcQ=g{o?7Ym0{ zRC+*$&woNc(EN{8nN_+_CKt*D&FF40c9#Dka2>GIQ_b1m;hh>GDFSHGcjbDk2Ye?i zF9I5Oc-r6&>MjVy2ZHY?&!X1wfTeHik-m(xXW*lROFgm`r+t~A6rA-UQ<7oJI(8>U z9^JfY-K(JPsL{N^hgUwaF&7nwP^S_ULgm}V0PixK4oe>E*+qBAd>w}%jQAdTV$lf4 zfq*;Xj+oOfgZrw2-O2cd&jMd{Gu&67xpE-v-EuO%Gm*0+nOjX~;78dnv8gA&Kn}io zGOqeMtKpvH(BWaHV}kyAw`HCc4_oymE3AN=cVzvX?zH9~`H@r5);SP7-N{9kZ+13@ zmLq!Q@43Z5@D!)_;a|`k%?gb(z zm5vU=aiR=L$;zzPkz2a>MLNf&>6>eri(g!c&LNbAsp2?0 z*JT#37J7i#Gwx^2eecl(;RAQ%4fB!vzpa?d_L2)zcC0K=eUNt%|H z+?iJIxt5$+a+F1}bn7hld0;vDpv@}i-bvbg`i#Y{FVil2g;(LhAhv3>v>Q7^JOJYx zF~9WrJX-EDTb&g=eR{a^wvxeIosinP-Y)U{q$IOdy`j`mP|Wy`S!Ep4%7G0J_2%iL zuR#kC6wF4jE8xj{A%gRT6hujROdmwVv!+5Qa^WWxtFG$z({n ze;gE3VJ~R-W9LJ&T0?i9@C6U4BWVED&up-kPm!2a z&!f%veZTY2CSxAkt@UF3^u3sf;I>rQtya$U6Pxja71ipW% zP+99EtFFhP>nEO7T+T6mjep*pW8pj#&UY_BO{){K_Ic=VM!(%MvNSE5V|aS_s`~G5 zO}}#1{MQ7jWREw0ZIn#AOu^S`GM&obhQ!&P{b{p#2y7Q3Ex7Vl$5Ix&O0VaHuw6E+ zj~!NycU4okdhEf}(o2*W3Cg!-c{asL_*w3^nxWfe)?e@-s>RdF!wOg0PQC83=zOUm zQe;b*HK#&n+7H-4ai`j8aS>X8y?#xhG!QYig$^hbK zTTZF;rS(T{h>xq5E}{y=Q|w_1rNrW07OvcAJ$hdnCOcv*CG6ML=^KHf?M^?9P(==0 z>*w;MG%slPY@AzvJ#aboxGdbxV_NyzqIs$RNMApqn>>P z@^nSpvPR&Uz&`(F(QIt&>oWLE6ZlU^B)mdhGwtJTxvW4O_Is-Z3Xx{j@U>l#m5C(t z3d4>u7{F+$;RL9N1SbJCj^Z(VW|@I zQG5g!{z@%p(vwcI=Ke?xCaT%yPcC5DMi3;%rai!NDzkrZD4qSd8#avTkE!Ex>E`

7{!EOGYR~L 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 diff --git a/blender/start.py b/blender/start.py index 8771842e..ff38dc16 100755 --- a/blender/start.py +++ b/blender/start.py @@ -1,6 +1,4 @@ import arm.nodes_logic -import arm.nodes_renderpath -import arm.make_renderer import arm.props_traits_params import arm.props_traits_props import arm.props_traits @@ -31,8 +29,6 @@ def register(): arm.props.register() arm.props_ui.register() arm.nodes_logic.register() - arm.nodes_renderpath.register() - arm.make_renderer.register() arm.space_armory.register() arm.keymap.register() arm.handlers.register() @@ -43,8 +39,6 @@ def unregister(): arm.keymap.unregister() arm.utils.unregister() arm.nodes_logic.unregister() - arm.make_renderer.unregister() - arm.nodes_renderpath.unregister() arm.handlers.unregister() arm.props_ui.unregister() arm.props.unregister()