Skip to content

Commit

Permalink
Fix clamping issues and use correct max values based on movement anch…
Browse files Browse the repository at this point in the history
…or point
  • Loading branch information
MortimerGoro committed Jul 30, 2019
1 parent 001df97 commit 0f8fb84
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 29 deletions.
12 changes: 9 additions & 3 deletions app/src/main/cpp/BrowserWorld.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,8 @@ BrowserWorld::State::UpdateControllers(bool& aRelayoutWidgets) {
vrb::Vector normal;
float distance = 0.0f;
bool isInWidget = false;
if (widget->TestControllerIntersection(start, direction, result, normal, isInWidget, distance)) {
const bool clamp = !widget->IsResizing();
if (widget->TestControllerIntersection(start, direction, result, normal, clamp, isInWidget, distance)) {
if (isInWidget && (distance < hitDistance)) {
hitWidget = widget;
hitDistance = distance;
Expand Down Expand Up @@ -894,7 +895,7 @@ BrowserWorld::UpdateWidget(int32_t aHandle, const WidgetPlacementPtr& aPlacement

float newWorldWidth = aPlacement->worldWidth;
if (newWorldWidth <= 0.0f) {
newWorldWidth = aPlacement->width * WidgetPlacement::WORLD_DPI_RATIO;
newWorldWidth = aPlacement->width * WidgetPlacement::kWorldDPIRatio;
}

if (newWorldWidth != worldWidth || oldWidth != aPlacement->width || oldHeight != aPlacement->height) {
Expand Down Expand Up @@ -949,6 +950,7 @@ BrowserWorld::StartWidgetMove(int32_t aHandle, int32_t aMoveBehavour) {
}

vrb::Vector initialPoint;
vrb::Vector anchorPoint;
int controllerIndex = -1;

for (Controller& controller: m.controllers->GetControllers()) {
Expand All @@ -959,6 +961,10 @@ BrowserWorld::StartWidgetMove(int32_t aHandle, int32_t aMoveBehavour) {
if (controller.pointer && controller.pointer->GetHitWidget() == widget) {
controllerIndex = controller.index;
initialPoint = controller.pointerWorldPoint;
int32_t w, h;
widget->GetSurfaceTextureSize(w, h);
anchorPoint.x() = controller.pointerX / (float)w;
anchorPoint.y() = controller.pointerY / (float)h;
break;
}
}
Expand All @@ -968,7 +974,7 @@ BrowserWorld::StartWidgetMove(int32_t aHandle, int32_t aMoveBehavour) {
}

m.movingWidget = WidgetMover::Create();
m.movingWidget->StartMoving(widget, aMoveBehavour, controllerIndex, initialPoint);
m.movingWidget->StartMoving(widget, aMoveBehavour, controllerIndex, initialPoint, anchorPoint);
}

void
Expand Down
8 changes: 4 additions & 4 deletions app/src/main/cpp/Widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,18 +263,18 @@ Widget::GetWorldSize(float& aWidth, float& aHeight) const {
}

bool
Widget::TestControllerIntersection(const vrb::Vector& aStartPoint, const vrb::Vector& aDirection, vrb::Vector& aResult, vrb::Vector& aNormal, bool& aIsInWidget, float& aDistance) const {
Widget::TestControllerIntersection(const vrb::Vector& aStartPoint, const vrb::Vector& aDirection, vrb::Vector& aResult, vrb::Vector& aNormal,
const bool aClamp, bool& aIsInWidget, float& aDistance) const {
aDistance = -1.0f;
if (!m.root->IsEnabled(*m.transform)) {
return false;
}

bool clamp = !m.resizing;
bool result;
if (m.quad) {
result = m.quad->TestIntersection(aStartPoint, aDirection, aResult, aNormal, clamp, aIsInWidget, aDistance);
result = m.quad->TestIntersection(aStartPoint, aDirection, aResult, aNormal, aClamp, aIsInWidget, aDistance);
} else {
result = m.cylinder->TestIntersection(aStartPoint, aDirection, aResult, aNormal, clamp, aIsInWidget, aDistance);
result = m.cylinder->TestIntersection(aStartPoint, aDirection, aResult, aNormal, aClamp, aIsInWidget, aDistance);
}
if (result && m.resizing && !aIsInWidget) {
// Handle extra intersections while resizing
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/cpp/Widget.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ class Widget {
void GetWidgetMinAndMax(vrb::Vector& aMin, vrb::Vector& aMax) const;
void SetWorldWidth(float aWorldWidth) const;
void GetWorldSize(float& aWidth, float& aHeight) const;
bool TestControllerIntersection(const vrb::Vector& aStartPoint, const vrb::Vector& aDirection, vrb::Vector& aResult, vrb::Vector& aNormal, bool& aIsInWidget, float& aDistance) const;
bool TestControllerIntersection(const vrb::Vector& aStartPoint, const vrb::Vector& aDirection, vrb::Vector& aResult, vrb::Vector& aNormal,
const bool aClamp, bool& aIsInWidget, float& aDistance) const;
void ConvertToWidgetCoordinates(const vrb::Vector& aPoint, float& aX, float& aY) const;
vrb::Vector ConvertToWorldCoordinates(const vrb::Vector& aLocalPoint) const;
vrb::Vector ConvertToWorldCoordinates(const float aWidgetX, const float aWidgetY) const;
Expand Down
45 changes: 25 additions & 20 deletions app/src/main/cpp/WidgetMover.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ struct WidgetMover::State {
WidgetPtr widget;
int attachedController;
vrb::Vector initialPoint;
vrb::Vector anchorPoint;
vrb::Matrix initialTransform;
WidgetPlacementPtr initialPlacement;
WidgetPlacementPtr movePlacement;
Expand All @@ -37,15 +38,13 @@ struct WidgetMover::State {
{}


WidgetPlacementPtr HandleKeyboardMove(const vrb::Vector& aDelta) {
float x = initialPlacement->translation.x() * WidgetPlacement::WORLD_DPI_RATIO;
float y = initialPlacement->translation.y() * WidgetPlacement::WORLD_DPI_RATIO;
const float maxX = 3.0f;
const float minX = -2.0f;
const float maxY = 2.0f;
const float minY = -1.0f;
WidgetPlacementPtr& HandleKeyboardMove(const vrb::Vector& aDelta) {
float x = initialPlacement->translation.x() * WidgetPlacement::kWorldDPIRatio;
float y = initialPlacement->translation.y() * WidgetPlacement::kWorldDPIRatio;
const float maxX = 4.0f; // Relative to 0.5f anchor point.
const float minX = -maxX;
const float maxY = 2.0f; // Relative to 0.0f anchor point.
const float minY = -1.1f; // Relative to 0.0f anchor point.
const float maxAngle = -35.0f * (float)M_PI / 180.0f;
const float angleStartY = 0.8f;
const float minZ = -2.5f;
Expand All @@ -54,13 +53,18 @@ struct WidgetMover::State {
x += aDelta.x();
y += aDelta.y();

x = fmin(x, maxX);
x = fmax(x, minX);
y = fmin(y, maxY);
y = fmax(y, minY);
float w, h;
widget->GetWorldSize(w, h);
const float dx = w * (anchorPoint.x() - 0.5f);
const float dy = h * anchorPoint.y();

movePlacement->translation.x() = x / WidgetPlacement::WORLD_DPI_RATIO;
movePlacement->translation.y() = y / WidgetPlacement::WORLD_DPI_RATIO;
x = fmin(x, maxX + dx);
x = fmax(x, minX - dx);
y = fmin(y, maxY + dy);
y = fmax(y, minY + dy);

movePlacement->translation.x() = x / WidgetPlacement::kWorldDPIRatio;
movePlacement->translation.y() = y / WidgetPlacement::kWorldDPIRatio;

float angle = 0.0f;
if (y < angleStartY) {
Expand All @@ -75,7 +79,7 @@ struct WidgetMover::State {
t = (y - minY) / (1.45f - minY);
}

movePlacement->translation.z() = (minZ + t * (maxZ - minZ)) / WidgetPlacement::WORLD_DPI_RATIO;
movePlacement->translation.z() = (minZ + t * (maxZ - minZ)) / WidgetPlacement::kWorldDPIRatio;
movePlacement->rotation = angle;
endDelta = movePlacement->translation - initialPlacement->translation;
endRotation = angle;
Expand All @@ -100,12 +104,11 @@ WidgetMover::HandleMove(const vrb::Vector& aStart, const vrb::Vector& aDirection
vrb::Vector hitPoint;
vrb::Vector hitNormal;
bool isInWidget = false;
m.widget->TestControllerIntersection(aStart, aDirection, hitPoint, hitNormal, isInWidget, hitDistance);
m.widget->TestControllerIntersection(aStart, aDirection, hitPoint, hitNormal, false, isInWidget, hitDistance);
if (hitDistance < 0) {
return nullptr;
};


const vrb::Vector delta = hitPoint - m.initialPoint;

if (m.moveBehaviour == WidgetMoveBehaviour::KEYBOARD) {
Expand All @@ -114,20 +117,22 @@ WidgetMover::HandleMove(const vrb::Vector& aStart, const vrb::Vector& aDirection
// General case
vrb::Matrix updatedTransform = m.initialTransform.Translate(vrb::Vector(delta.x(), delta.y(), 0.0f));
m.widget->SetTransform(updatedTransform);
m.endDelta.x() = delta.x() / WidgetPlacement::WORLD_DPI_RATIO;
m.endDelta.y() = delta.y() / WidgetPlacement::WORLD_DPI_RATIO;
m.endDelta.x() = delta.x() / WidgetPlacement::kWorldDPIRatio;
m.endDelta.y() = delta.y() / WidgetPlacement::kWorldDPIRatio;
m.endDelta.z() = 0.0f;
m.endRotation = 0.0f;
return nullptr;
}
}

void
WidgetMover::StartMoving(const WidgetPtr& aWidget, const int32_t aMoveBehaviour, const int32_t aControllerIndex, const vrb::Vector& hitPoint) {
WidgetMover::StartMoving(const WidgetPtr& aWidget, const int32_t aMoveBehaviour, const int32_t aControllerIndex,
const vrb::Vector& aHitPoint, const vrb::Vector& aAnchorPoint) {
m.widget = aWidget;
m.attachedController = aControllerIndex;
m.initialTransform = aWidget->GetTransform();
m.initialPoint = hitPoint;
m.initialPoint = aHitPoint;
m.anchorPoint = aAnchorPoint;
m.initialPlacement = aWidget->GetPlacement();
m.movePlacement = WidgetPlacement::Create(*m.initialPlacement);
m.moveBehaviour = (WidgetMoveBehaviour) aMoveBehaviour;
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/cpp/WidgetMover.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ class WidgetMover {
static WidgetMoverPtr Create();
bool IsMoving(const int aControllerIndex) const;
WidgetPlacementPtr HandleMove(const vrb::Vector& aStart, const vrb::Vector& aDirection);
void StartMoving(const WidgetPtr& aWidget, const int32_t aMoveBehavour, const int32_t aControllerIndex, const vrb::Vector& hitPoint);
void StartMoving(const WidgetPtr& aWidget, const int32_t aMoveBehavour, const int32_t aControllerIndex,
const vrb::Vector& aHitPoint, const vrb::Vector& aAnchorPoint);
void EndMoving();
WidgetPtr GetWidget() const;
protected:
Expand Down

0 comments on commit 0f8fb84

Please sign in to comment.