| 663 | } |
| 664 | |
| 665 | void SDFEditor::handleActions() |
| 666 | { |
| 667 | if (!mpScene) |
| 668 | return; |
| 669 | |
| 670 | const AnimationController* pAnimationController = mpScene->getAnimationController(); |
| 671 | const GeometryInstanceData& instance = mpScene->getGeometryInstance(mCurrentEdit.instanceID); |
| 672 | const float4x4& instanceTransform = pAnimationController->getGlobalMatrices()[instance.globalMatrixID]; |
| 673 | Ray ray = mpScene->getCamera()->computeRayPinhole(uint2(mUI2D.currentMousePosition), mFrameDim, false); |
| 674 | |
| 675 | // Rescale grid instance if the grid resolution has changed. |
| 676 | float resolutionScalingFactor = mCurrentEdit.pSDFGrid->getResolutionScalingFactor(); |
| 677 | if (std::fabs(resolutionScalingFactor - 1.0f) > FLT_EPSILON) |
| 678 | { |
| 679 | float3 scale; |
| 680 | quatf rotation; |
| 681 | float3 translation; |
| 682 | float3 skew; |
| 683 | float4 perspective; |
| 684 | math::decompose(instanceTransform, scale, rotation, translation, skew, perspective); |
| 685 | |
| 686 | Transform finalTranform; |
| 687 | finalTranform.setTranslation(translation); |
| 688 | finalTranform.setRotation(rotation); |
| 689 | finalTranform.setScaling(scale * resolutionScalingFactor); |
| 690 | |
| 691 | mpScene->updateNodeTransform(instance.globalMatrixID, finalTranform.getMatrix()); |
| 692 | mCurrentEdit.pSDFGrid->resetResolutionScalingFactor(); |
| 693 | } |
| 694 | |
| 695 | // Handle transformation of the SDF grid instance. |
| 696 | if (mInstanceTransformationEdit.state != TransformationState::None) |
| 697 | { |
| 698 | // Initiating starting transformation. |
| 699 | if (mInstanceTransformationEdit.prevState == TransformationState::None) |
| 700 | { |
| 701 | mInstanceTransformationEdit.scrollTotal = 0.0f; |
| 702 | |
| 703 | float3 scale; |
| 704 | quatf rotation; |
| 705 | float3 translation; |
| 706 | float3 skew; |
| 707 | float4 perspective; |
| 708 | math::decompose(instanceTransform, scale, rotation, translation, skew, perspective); |
| 709 | |
| 710 | mInstanceTransformationEdit.startTransform.setTranslation(translation); |
| 711 | mInstanceTransformationEdit.startTransform.setRotation(rotation); |
| 712 | mInstanceTransformationEdit.startTransform.setScaling(scale); |
| 713 | |
| 714 | float3 deltaCenter = translation - ray.origin; |
| 715 | float3 planeNormal = -normalize(mpScene->getCamera()->getTarget() - mpScene->getCamera()->getPosition()); |
| 716 | |
| 717 | float startT = dot(deltaCenter, planeNormal) / dot(ray.dir, planeNormal); |
| 718 | mInstanceTransformationEdit.startPlanePos = ray.origin + ray.dir * startT; |
| 719 | mInstanceTransformationEdit.startMousePos = mUI2D.currentMousePosition; |
| 720 | |
| 721 | float3 arbitraryVectorNotOrthToPlane = |
| 722 | std::abs(planeNormal.z) < FLT_EPSILON ? float3(0.0f, 0.0f, 1.0f) : float3(1.0f, 0.0f, 0.0f); |
nothing calls this directly
no test coverage detected