13 u.camera = glm::vec4(
inputs.camera,
s.anisotropyRotation);
15 u.ambient = glm::vec4(glm::vec3(
inputs.ambient),
s.anisotropyStrength);
17 std::clamp(
inputs.alphaCutoff +
s.vegetationColor.globalAlphaThresholdOffset, 0.f, 1.f)};
18 u.emissive = {
s.emissive[0],
s.emissive[1],
s.emissive[2],
s.emissiveStrength};
19 u.specular = {
s.specularColor[0],
s.specularColor[1],
s.specularColor[2],
s.specularFactor};
20 u.coat = {
s.clearcoatFactor,
s.clearcoatRoughness,
s.clearcoatNormalScale,
s.ior};
21 u.colorMaskSecondary = {
s.colorMaskSecondary[0],
s.colorMaskSecondary[1],
s.colorMaskSecondary[2],
23 u.colorMaskParams = {
s.colorMaskEnabled ? 1.f : 0.f,
s.colorMaskMin,
s.colorMaskMax,
24 s.albedoTextureStrength};
25 const auto& trans =
s.translucency;
26 u.translucencyColor = {trans.color[0], trans.color[1], trans.color[2], trans.intensity};
27 u.translucencyParams = {trans.strength, trans.normalDistortion, trans.scattering, trans.direct};
28 u.translucencyLighting = {trans.ambient, trans.shadow, trans.maskAmount,
29 trans.globalIntensity * trans.overlay};
30 u.translucencyMask = {trans.maskMinimum, trans.maskMaximum, 0.f, 0.f};
31 u.motionHighlightColor = {
s.motionHighlightColor[0],
s.motionHighlightColor[1],
s.motionHighlightColor[2],
32 s.vegetationColor.overlaySubsurface};
33 const auto&
color =
s.vegetationColor;
34 u.vegetationOverlay = {
color.overlayColor[0],
color.overlayColor[1],
color.overlayColor[2],
color.overlay};
35 u.vegetationWetness = {
color.wetness,
color.overlayNormalScale,
color.wetnessNormalScale,
36 color.overlaySmoothness};
37 u.vegetationStageParams = {
color.overlayVariation,
color.overlayProjection,
color.vertexOcclusionAlpha,
38 color.wetnessContrast};
39 u.vegetationFieldColor = {
color.fieldColor[0],
color.fieldColor[1],
color.fieldColor[2],
color.fieldColor[3]};
40 u.vegetationColorParams = {
color.colorsCoverage,
color.colorsIntensity,
color.colorsMask,
color.colorsVariation};
41 u.vegetationOcclusionParams = {
color.vertexOcclusionMinimum,
color.vertexOcclusionMaximum, 0.f, 0.f};
42 u.vegetationOcclusionColor = {
color.vertexOcclusionColor[0],
color.vertexOcclusionColor[1],
43 color.vertexOcclusionColor[2], float(
color.backfaceNormalMode)};
44 u.vegetationGlobalMasks = {
color.globalColorMaskMinimum,
color.globalColorMaskMaximum,
45 color.globalOverlayMaskMinimum,
color.globalOverlayMaskMaximum};
46 u.vegetationInfo.z =
color.invertVertexOcclusion ? 1u : 0
u;
47 u.vegetationInfo.w =
color.invertVertexOcclusionColors ? 1u : 0
u;
49 const auto&
d =
s.vegetationDetail;
50 u.detailUv = {
d.uvScale[0],
d.uvScale[1],
d.uvOffset[0],
d.uvOffset[1]};
51 u.detailColor = {
d.color[0],
d.color[1],
d.color[2],
d.normalBlendValue};
52 u.detailColorTwo = {
d.colorTwo[0],
d.colorTwo[1],
d.colorTwo[2],
d.colorTwo[3]};
53 u.detailValues = {
d.value,
d.normalValue,
d.albedoValue,
d.metallicValue};
54 u.detailMaterial = {
d.occlusionValue,
d.smoothnessValue,
d.blendMinimum,
d.blendMaximum};
55 u.detailMasks = {
d.maskMinimum,
d.maskMaximum,
d.meshMinimum,
d.meshMaximum};
56 u.detailInfo = {
d.uvMode,
d.colorMode,
d.blendMode,
d.alphaMode};
57 std::uint32_t detailPresent = 0;
59 if (
d.textures[
index].texture) detailPresent |= 1u <<
index;
60 u.detailInfo2 = {
d.maskMode,
d.meshMode,
d.inverseUvScale ? 1u : 0
u, detailPresent};
62 const auto fillField = [](
const auto& field, glm::vec4& coords,
63 glm::vec4& fallback, glm::vec4& usage0, glm::vec4& usage1,
65 coords = {field.coords[0], field.coords[1], field.coords[2], field.coords[3]};
66 fallback = {field.fallback[0], field.fallback[1], field.fallback[2], field.fallback[3]};
67 usage0 = {field.usage[0], field.usage[1], field.usage[2], field.usage[3]};
68 usage1 = {field.usage[4], field.usage[5], field.usage[6], field.usage[7]};
69 usage2 = {field.usage[8], 0.f, 0.f, 0.f};
71 const auto& extras =
s.vegetationExtras;
72 fillField(extras,
u.extrasCoords,
u.extrasFallback,
u.extrasUsage0,
u.extrasUsage1,
u.extrasUsage2);
73 u.extrasInfo = {extras.layer, extras.usePivotPosition ? 1u : 0
u, extras.texture ? 1u : 0
u,
74 s.vegetationAlpha.enabled ? 1u : 0
u};
75 u.extrasUsage2.y =
s.vegetationAlpha.global;
76 u.extrasUsage2.z =
s.vegetationAlpha.variation;
77 u.extrasUsage2.w =
s.vegetationAlpha.detailFade ? 1.f : 0.f;
78 u.vegetationAlphaFade = {
s.vegetationAlpha.glancing,
s.vegetationAlpha.camera,
79 s.vegetationAlpha.constant,
s.vegetationAlpha.noiseTiling};
80 u.vegetationAlphaCamera = {
s.vegetationAlpha.cameraFadeMin,
s.vegetationAlpha.cameraFadeMax, 0.f, 0.f};
81 u.vegetationEmission = {
s.vegetationEmission.minimum,
s.vegetationEmission.maximum,
82 s.vegetationEmission.phase,
83 s.vegetationEmission.enabled ?
s.vegetationEmission.global : -1.f};
84 u.vegetationGradientOne = {
s.vegetationGradient.colorOne[0],
s.vegetationGradient.colorOne[1],
85 s.vegetationGradient.colorOne[2],
86 s.vegetationGradient.enabled ?
s.vegetationGradient.minimum : -1.f};
87 u.vegetationGradientTwo = {
s.vegetationGradient.colorTwo[0],
s.vegetationGradient.colorTwo[1],
88 s.vegetationGradient.colorTwo[2],
s.vegetationGradient.maximum};
90 const auto&
colors =
s.vegetationColors;
91 fillField(
colors,
u.colorsCoords,
u.colorsFallback,
u.colorsUsage0,
u.colorsUsage1,
u.colorsUsage2);
93 const auto& vertex =
s.vegetationVertex;
94 fillField(vertex,
u.vertexCoords,
u.vertexFallback,
u.vertexUsage0,
u.vertexUsage1,
u.vertexUsage2);
95 u.vertexSize = {vertex.globalSize, vertex.sizeFadeStart, vertex.sizeFadeEnd, vertex.distanceFadeBias};
96 u.vertexInfo = {vertex.layer, std::uint32_t(vertex.source), 0
u, 0
u};
97 const auto& motion =
s.vegetationMotion;
98 fillField(motion,
u.motionCoords,
u.motionFallback,
u.motionUsage0,
u.motionUsage1,
u.motionUsage2);
99 u.motionGlobal0 = {motion.globalDirection[0], motion.globalDirection[1], motion.worldOrigin[0],
100 motion.worldOrigin[1]};
101 u.motionGlobal1 = {motion.worldOrigin[2], motion.dynamicMode, motion.rigidity, motion.facing};
102 u.motionTime = {float(motion.time), 0.f, 0.f, 0.f};
103 u.motionBending = {motion.bending, motion.bendingSpeed, motion.bendingScale, motion.bendingVariation};
104 u.motionBranch = {motion.branch, motion.rolling, motion.branchSpeed, motion.branchScale};
105 u.motionBranch2 = {motion.branchVariation, motion.globalBending, motion.globalBranch, motion.globalFlutter};
106 u.motionFlutter = {motion.flutter, motion.flutterSpeed, motion.flutterScale, motion.flutterVariation};
107 u.motionControl = {motion.noiseTiling, motion.interaction, motion.interactionMask, motion.fadeDistance};
108 u.motionPerspective = {motion.perspectivePush, motion.perspectiveNoise, motion.perspectiveAngle, 0.f};
109 u.motionInfo = {motion.layer, std::uint32_t(motion.mode), 0
u, 0
u};
111 u.misc = {
s.normalScale,
s.occlusionStrength,
s.unlit ? 1.f : 0.f, float(
inputs.skinCount)};
114 u.lights[0].color.w =
inputs.environmentIntensity;
119 binding.srgbDecode ? 1.f : 0.f};