diff --git a/libraries/procedural/src/procedural/Procedural.cpp b/libraries/procedural/src/procedural/Procedural.cpp index ebee8a545f..05cbde374d 100644 --- a/libraries/procedural/src/procedural/Procedural.cpp +++ b/libraries/procedural/src/procedural/Procedural.cpp @@ -75,7 +75,7 @@ void ProceduralData::parse(const QJsonObject& proceduralData) { if (versionJson.isDouble()) { version = (uint8_t)(floor(versionJson.toDouble())); // invalid version - if (!(version == 1 || version == 2 || version == 3)) { + if (!(version == 1 || version == 2 || version == 3 || version == 4)) { return; } } else { diff --git a/libraries/procedural/src/procedural/ProceduralCommon.slh b/libraries/procedural/src/procedural/ProceduralCommon.slh index ab8d74bdfa..bd894a9e92 100644 --- a/libraries/procedural/src/procedural/ProceduralCommon.slh +++ b/libraries/procedural/src/procedural/ProceduralCommon.slh @@ -56,7 +56,20 @@ LAYOUT_STD140(binding=0) uniform standardInputsBuffer { #define iChannelResolution standardInputs.channelResolution #define iWorldOrientation standardInputs.worldOrientation -struct ProceduralFragmentData { +struct ProceduralFragment { + vec3 normal; + vec3 diffuse; + vec3 specular; + vec3 emissive; + float alpha; + float roughness; + float metallic; + float occlusion; + float scattering; +}; + +// Same as ProceduralFragment but with position +struct ProceduralFragmentWithPosition { vec3 position; vec3 normal; vec3 diffuse; diff --git a/libraries/render-utils/src/simple.slf b/libraries/render-utils/src/simple.slf index ce1e9d5176..d1a70007a2 100644 --- a/libraries/render-utils/src/simple.slf +++ b/libraries/render-utils/src/simple.slf @@ -48,7 +48,11 @@ float getProceduralColors(inout vec3 diffuse, inout vec3 specular, inout float s return 1.0; } -float getProceduralFragment(inout ProceduralFragmentData proceduralData) { +float getProceduralFragment(inout ProceduralFragment proceduralData) { + return 1.0; +} + +float getProceduralFragmentWithPosition(inout ProceduralFragmentWithPosition proceduralData) { return 1.0; } @@ -77,11 +81,15 @@ void main(void) { roughness = max(0.0, 1.0 - shininess / 128.0); metallic = length(specular); emissive = vec3(clamp(emissiveAmount, 0.0, 1.0)); -#elif defined(PROCEDURAL_V3) +#elif defined(PROCEDURAL_V3) || defined(PROCEDURAL_V4) +#if defined(PROCEDURAL_V3) + ProceduralFragment proceduralData = { +#else TransformCamera cam = getTransformCamera(); vec4 position = cam._viewInverse * _positionES; - ProceduralFragmentData proceduralData = { + ProceduralFragmentWithPosition proceduralData = { position.xyz, +#endif normal, vec3(0.0), DEFAULT_SPECULAR, @@ -92,7 +100,12 @@ void main(void) { DEFAULT_OCCLUSION, DEFAULT_SCATTERING }; + +#if defined(PROCEDURAL_V3) emissiveAmount = getProceduralFragment(proceduralData); +#else + emissiveAmount = getProceduralFragmentWithPosition(proceduralData); +#endif normal = proceduralData.normal; diffuse = proceduralData.diffuse; roughness = proceduralData.roughness; @@ -101,9 +114,12 @@ void main(void) { occlusion = proceduralData.occlusion; scattering = proceduralData.scattering; +#if defined(PROCEDURAL_V4) position = vec4(proceduralData.position, 1.0); vec4 posClip = cam._projection * (cam._view * position); gl_FragDepth = 0.5 * (posClip.z / posClip.w + 1.0); +#endif + #endif if (emissiveAmount > 0.0) { diff --git a/libraries/render-utils/src/simple_transparent.slf b/libraries/render-utils/src/simple_transparent.slf index c50ff8fcd9..ea444d6113 100644 --- a/libraries/render-utils/src/simple_transparent.slf +++ b/libraries/render-utils/src/simple_transparent.slf @@ -53,7 +53,11 @@ float getProceduralColors(inout vec3 diffuse, inout vec3 specular, inout float s return 1.0; } -float getProceduralFragment(inout ProceduralFragmentData proceduralData) { +float getProceduralFragment(inout ProceduralFragment proceduralData) { + return 1.0; +} + +float getProceduralFragmentWithPosition(inout ProceduralFragmentWithPosition proceduralData) { return 1.0; } @@ -86,10 +90,14 @@ void main(void) { roughness = max(0.0, 1.0 - shininess / 128.0); metallic = length(specular); emissive = vec3(clamp(emissiveAmount, 0.0, 1.0)); -#elif defined(PROCEDURAL_V3) +#elif defined(PROCEDURAL_V3) || defined(PROCEDURAL_V4) +#if defined(PROCEDURAL_V3) + ProceduralFragment proceduralData = { +#else vec4 position = cam._viewInverse * _positionES; - ProceduralFragmentData proceduralData = { + ProceduralFragmentWithPosition proceduralData = { position.xyz, +#endif normal, vec3(0.0), DEFAULT_SPECULAR, @@ -100,21 +108,29 @@ void main(void) { DEFAULT_OCCLUSION, DEFAULT_SCATTERING }; + +#if defined(PROCEDURAL_V3) emissiveAmount = getProceduralFragment(proceduralData); - position = vec4(proceduralData.position, 1.0); - vec4 posEye4 = cam._view * position; - posEye = vec3(posEye4); +#else + emissiveAmount = getProceduralFragmentWithPosition(proceduralData); +#endif occlusion = proceduralData.occlusion; normal = proceduralData.normal; diffuse = proceduralData.diffuse; - alpha = proceduralData.alpha; fresnel = proceduralData.specular; metallic = proceduralData.metallic; emissive = proceduralData.emissive; roughness = proceduralData.roughness; + alpha = proceduralData.alpha; +#if defined(PROCEDURAL_V4) + position = vec4(proceduralData.position, 1.0); + vec4 posEye4 = cam._view * position; + posEye = posEye4.xyz; vec4 posClip = cam._projection * posEye4; gl_FragDepth = 0.5 * (posClip.z / posClip.w + 1.0); +#endif + #endif if (emissiveAmount > 0.0) {