| 256 | |
| 257 | template<typename T> |
| 258 | void ShaderGraphUtilities::SampleCurve(TextWriterUnicode& writer, const BezierCurve<T>& curve, const String& time, const String& value) |
| 259 | { |
| 260 | const auto& keyframes = curve.GetKeyframes(); |
| 261 | |
| 262 | if (keyframes.Count() == 0) |
| 263 | { |
| 264 | writer.Write( |
| 265 | TEXT( |
| 266 | " {{\n" |
| 267 | " // Curve ({1})\n" |
| 268 | " {0} = 0;\n" |
| 269 | " }}\n" |
| 270 | ), |
| 271 | value, // {0} |
| 272 | GetTypename<T>() // {1} |
| 273 | ); |
| 274 | } |
| 275 | else if (keyframes.Count() == 1) |
| 276 | { |
| 277 | writer.Write( |
| 278 | TEXT( |
| 279 | " {{\n" |
| 280 | " // Curve ({1})\n" |
| 281 | " {0} = {2};\n" |
| 282 | " }}\n" |
| 283 | ), |
| 284 | value, // {0} |
| 285 | GetTypename<T>(), // {1} |
| 286 | ShaderGraphValue(keyframes[0].Value).Value // {2} |
| 287 | ); |
| 288 | } |
| 289 | else if (keyframes.Count() == 2) |
| 290 | { |
| 291 | writer.Write( |
| 292 | TEXT( |
| 293 | " {{\n" |
| 294 | " // Curve ({4})\n" |
| 295 | " const float leftTime = {3};\n" |
| 296 | " const float rightTime = {5};\n" |
| 297 | " const float lengthTime = rightTime - leftTime;\n" |
| 298 | " float time = clamp({0}, leftTime, rightTime);\n" |
| 299 | " float alpha = lengthTime < 0.0000001 ? 0.0f : (time - leftTime) / lengthTime;\n" |
| 300 | |
| 301 | " const {4} leftValue = {6};\n" |
| 302 | " const {4} rightValue = {7};\n" |
| 303 | " const float oneThird = 1.0f / 3.0f;\n" |
| 304 | " {4} leftTangent = leftValue + {8} * (lengthTime * oneThird);\n" |
| 305 | " {4} rightTangent = rightValue + {1} * (lengthTime * oneThird);\n" |
| 306 | |
| 307 | " {4} p01 = lerp(leftValue, leftTangent, alpha);\n" |
| 308 | " {4} p12 = lerp(leftTangent, rightTangent, alpha);\n" |
| 309 | " {4} p23 = lerp(rightTangent, rightValue, alpha);\n" |
| 310 | " {4} p012 = lerp(p01, p12, alpha);\n" |
| 311 | " {4} p123 = lerp(p12, p23, alpha);\n" |
| 312 | " {2} = lerp(p012, p123, alpha);\n" |
| 313 | " }}\n" |
| 314 | ), |
| 315 | time, // {0} |
nothing calls this directly
no test coverage detected