History

start on spring action

Seth Alves committed 11 years ago

Commit 1e858d81 parent 7c0e70b5 files · +208 −6Browse files

Showing the changes to libraries/physics/src/ObjectActionSpring.cpp (1 of 5 files). Show all

Unified · Split

libraries/physics/src/ObjectActionSpring.cpp+107−0
@@ -0,0 +1,107 @@
1+//
2+// ObjectActionSpring.cpp
3+// libraries/physics/src
4+//
5+// Created by Seth Alves 2015-6-5
6+// Copyright 2015 High Fidelity, Inc.
7+//
8+// Distributed under the Apache License, Version 2.0.
9+// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10+//
11+
12+#include "ObjectMotionState.h"
13+#include "BulletUtil.h"
14+
15+#include "ObjectActionSpring.h"
16+
17+ObjectActionSpring::ObjectActionSpring(QUuid id, EntityItemPointer ownerEntity) :
18+ ObjectAction(id, ownerEntity) {
19+ #if WANT_DEBUG
20+ qDebug() << "ObjectActionSpring::ObjectActionSpring";
21+ #endif
22+}
23+
24+ObjectActionSpring::~ObjectActionSpring() {
25+ #if WANT_DEBUG
26+ qDebug() << "ObjectActionSpring::~ObjectActionSpring";
27+ #endif
28+}
29+
30+void ObjectActionSpring::updateAction(btCollisionWorld* collisionWorld, btScalar deltaTimeStep) {
31+ if (!tryLockForRead()) {
32+ // don't risk hanging the thread running the physics simulation
33+ return;
34+ }
35+ void* physicsInfo = _ownerEntity->getPhysicsInfo();
36+
37+ if (_active && physicsInfo) {
38+ ObjectMotionState* motionState = static_cast<ObjectMotionState*>(physicsInfo);
39+ btRigidBody* rigidBody = motionState->getRigidBody();
40+ if (rigidBody) {
41+ glm::vec3 offset = _positionalTarget - bulletToGLM(rigidBody->getCenterOfMassPosition());
42+
43+
44+ // btQuaternion getOrientation() const;
45+ // const btTransform& getCenterOfMassTransform() const;
46+
47+ float offsetLength = glm::length(offset);
48+ float speed = offsetLength; // XXX use _positionalSpringConstant
49+
50+ float interpolation_value = 0.5; // XXX
51+ const glm::quat slerped_quat = glm::slerp(bulletToGLM(rigidBody->getOrientation()),
52+ _rotationalTarget,
53+ interpolation_value);
54+
55+ if (offsetLength > IGNORE_POSITION_DELTA) {
56+ glm::vec3 newVelocity = glm::normalize(offset) * speed;
57+ rigidBody->setLinearVelocity(glmToBullet(newVelocity));
58+ // void setAngularVelocity (const btVector3 &ang_vel);
59+ rigidBody->activate();
60+ } else {
61+ rigidBody->setLinearVelocity(glmToBullet(glm::vec3()));
62+ }
63+ }
64+ }
65+ unlock();
66+}
67+
68+
69+bool ObjectActionSpring::updateArguments(QVariantMap arguments) {
70+ // targets are required, spring-constants are optional
71+ bool ok = true;
72+ glm::vec3 positionalTarget =
73+ EntityActionInterface::extractVec3Argument("spring action", arguments, "positionalTarget", ok);
74+ bool pscOK = true;
75+ float positionalSpringConstant =
76+ EntityActionInterface::extractFloatArgument("spring action", arguments, "positionalSpringConstant", pscOK);
77+
78+ glm::quat rotationalTarget =
79+ EntityActionInterface::extractQuatArgument("spring action", arguments, "rotationalTarget", ok);
80+ bool rscOK = true;
81+ float rotationalSpringConstant =
82+ EntityActionInterface::extractFloatArgument("spring action", arguments, "rotationalSpringConstant", rscOK);
83+
84+ if (!ok) {
85+ return false;
86+ }
87+
88+ lockForWrite();
89+
90+ _positionalTarget = positionalTarget;
91+ if (pscOK) {
92+ _positionalSpringConstant = positionalSpringConstant;
93+ } else {
94+ _positionalSpringConstant = 0.5; // XXX pick a good default;
95+ }
96+
97+ _rotationalTarget = rotationalTarget;
98+ if (rscOK) {
99+ _rotationalSpringConstant = rotationalSpringConstant;
100+ } else {
101+ _rotationalSpringConstant = 0.5; // XXX pick a good default;
102+ }
103+
104+ _active = true;
105+ unlock();
106+ return true;
107+}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t