| 303 | } |
| 304 | |
| 305 | void SDFEditor::updateSymmetryPrimitive() |
| 306 | { |
| 307 | const AnimationController* pAnimationController = mpScene->getAnimationController(); |
| 308 | const GeometryInstanceData& instance = mpScene->getGeometryInstance(mCurrentEdit.instanceID); |
| 309 | float4x4 invInstanceTransform = transpose(pAnimationController->getInvTransposeGlobalMatrices()[instance.globalMatrixID]); |
| 310 | |
| 311 | const float3& instanceLocalPrimitivePos = mCurrentEdit.primitive.translation; |
| 312 | float3 instanceLocalPlanePosition = transformPoint(invInstanceTransform, mUI2D.symmetryPlane.position); |
| 313 | float3 instanceLocalPlaneNormal = normalize(transformVector(invInstanceTransform, mUI2D.symmetryPlane.normal)); |
| 314 | float3 projInstanceLocalPrimitivePos = |
| 315 | (instanceLocalPrimitivePos - dot(instanceLocalPrimitivePos, instanceLocalPlaneNormal) * instanceLocalPlaneNormal); |
| 316 | float3 projInstanceLocalPlanePos = dot(instanceLocalPlanePosition, instanceLocalPlaneNormal) * instanceLocalPlaneNormal; |
| 317 | |
| 318 | float3 reflectedInstanceLocalPos; |
| 319 | if (length(projInstanceLocalPrimitivePos) > 0.0f) |
| 320 | { |
| 321 | reflectedInstanceLocalPos = |
| 322 | math::reflect(-(instanceLocalPrimitivePos - projInstanceLocalPlanePos), normalize(projInstanceLocalPrimitivePos)); |
| 323 | } |
| 324 | else |
| 325 | { |
| 326 | reflectedInstanceLocalPos = length(instanceLocalPrimitivePos - projInstanceLocalPlanePos) * -instanceLocalPlaneNormal; |
| 327 | } |
| 328 | |
| 329 | reflectedInstanceLocalPos += projInstanceLocalPlanePos; |
| 330 | |
| 331 | float3x3 symmetricPrimitiveTransform = float3x3(inverse(mCurrentEdit.primitive.invRotationScale)); |
| 332 | symmetricPrimitiveTransform = math::rotate(float4x4(symmetricPrimitiveTransform), float(M_PI), instanceLocalPlaneNormal); |
| 333 | |
| 334 | mCurrentEdit.symmetryPrimitive = mCurrentEdit.primitive; |
| 335 | mCurrentEdit.symmetryPrimitive.translation = reflectedInstanceLocalPos; |
| 336 | mCurrentEdit.symmetryPrimitive.invRotationScale = inverse(float3x3(symmetricPrimitiveTransform)); |
| 337 | } |
| 338 | |
| 339 | void SDFEditor::setupPrimitiveAndOperation( |
| 340 | const float2& center, |
nothing calls this directly
no test coverage detected