Changed updates locations

This commit is contained in:
Atlante45 2014-08-05 18:41:48 -07:00
parent 293c2e94ad
commit 110b034bcb
4 changed files with 59 additions and 51 deletions

View file

@ -103,6 +103,31 @@ float Avatar::getLODDistance() const {
void Avatar::simulate(float deltaTime) { void Avatar::simulate(float deltaTime) {
PerformanceTimer perfTimer("simulate"); PerformanceTimer perfTimer("simulate");
// update the avatar's position according to its referential
if (_referential) {
if (_referential->hasExtraData()) {
ModelTree* tree = Application::getInstance()->getModels()->getTree();
switch (_referential->type()) {
case Referential::MODEL:
_referential = new ModelReferential(_referential,
tree,
this);
break;
case Referential::JOINT:
_referential = new JointReferential(_referential,
tree,
this);
break;
default:
qDebug() << "[WARNING] Avatar::simulate(): Unknown referential type.";
break;
}
}
_referential->update();
}
if (_scale != _targetScale) { if (_scale != _targetScale) {
setScale(_targetScale); setScale(_targetScale);
} }
@ -180,28 +205,6 @@ void Avatar::simulate(float deltaTime) {
} }
_displayNameAlpha = abs(_displayNameAlpha - _displayNameTargetAlpha) < 0.01f ? _displayNameTargetAlpha : _displayNameAlpha; _displayNameAlpha = abs(_displayNameAlpha - _displayNameTargetAlpha) < 0.01f ? _displayNameTargetAlpha : _displayNameAlpha;
} }
if (_referential) {
if (_referential->hasExtraData()) {
ModelTree* tree = Application::getInstance()->getModels()->getTree();
switch (_referential->type()) {
case Referential::MODEL:
_referential = new ModelReferential(_referential,
tree,
this);
break;
case Referential::JOINT:
_referential = new JointReferential(_referential,
tree,
this);
break;
default:
qDebug() << "[WARNING] Avatar::simulate(): Unknown referential type.";
break;
}
}
_referential->update();
}
} }
void Avatar::updateAcceleration(float deltaTime) { void Avatar::updateAcceleration(float deltaTime) {
@ -241,18 +244,9 @@ static TextRenderer* textRenderer(TextRendererType type) {
} }
void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode) { void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode) {
// make sure we have the right position if (_referential) {
_skeletonModel.setTranslation(getPosition()); _referential->update();
static const glm::quat refOrientation = glm::angleAxis(PI, glm::vec3(0.0f, 1.0f, 0.0f)); }
_skeletonModel.setRotation(getOrientation() * refOrientation);
const float MODEL_SCALE = 0.0006f;
_skeletonModel.setScale(glm::vec3(1.0f, 1.0f, 1.0f) * getScale() * MODEL_SCALE);
glm::vec3 headPosition = _position;
_skeletonModel.getHeadPosition(headPosition);
Head* head = getHead();
head->setPosition(headPosition);
head->setScale(_scale);
if (glm::distance(Application::getInstance()->getAvatar()->getPosition(), if (glm::distance(Application::getInstance()->getAvatar()->getPosition(),
_position) < 10.0f) { _position) < 10.0f) {
@ -303,7 +297,7 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode) {
float boundingRadius = getBillboardSize(); float boundingRadius = getBillboardSize();
ViewFrustum* frustum = (renderMode == Avatar::SHADOW_RENDER_MODE) ? ViewFrustum* frustum = (renderMode == Avatar::SHADOW_RENDER_MODE) ?
Application::getInstance()->getShadowViewFrustum() : Application::getInstance()->getViewFrustum(); Application::getInstance()->getShadowViewFrustum() : Application::getInstance()->getViewFrustum();
if (frustum->sphereInFrustum(_position, boundingRadius) == ViewFrustum::OUTSIDE) { if (frustum->sphereInFrustum(getPosition(), boundingRadius) == ViewFrustum::OUTSIDE) {
return; return;
} }

View file

@ -70,7 +70,7 @@ void ModelReferential::update() {
bool somethingChanged = false; bool somethingChanged = false;
if (item->getRadius() != _refScale) { if (item->getRadius() != _refScale) {
_refScale = item->getRadius(); _refScale = item->getRadius();
_avatar->setTargetScale(_refScale * _scale); _avatar->setTargetScale(_refScale * _scale, true);
somethingChanged = true; somethingChanged = true;
} }
if (item->getModelRotation() != _refRotation) { if (item->getModelRotation() != _refRotation) {
@ -147,17 +147,17 @@ void JointReferential::update() {
bool somethingChanged = false; bool somethingChanged = false;
if (item->getRadius() != _refScale) { if (item->getRadius() != _refScale) {
_refScale = item->getRadius(); _refScale = item->getRadius();
_avatar->setTargetScale(_refScale * _scale); _avatar->setTargetScale(_refScale * _scale, true);
somethingChanged = true; somethingChanged = true;
} }
if (item->getModelRotation() != _refRotation) { if (item->getModelRotation() != _refRotation) {
model->getJointRotationInWorldFrame(_jointIndex, _refRotation); model->getJointRotationInWorldFrame(_jointIndex, _refRotation);
_avatar->setOrientation(_refRotation * _rotation); _avatar->setOrientation(_refRotation * _rotation, true);
somethingChanged = true; somethingChanged = true;
} }
if (item->getPosition() != _refPosition || somethingChanged) { if (item->getPosition() != _refPosition || somethingChanged) {
model->getJointPositionInWorldFrame(_jointIndex, _refPosition); model->getJointPositionInWorldFrame(_jointIndex, _refPosition);
_avatar->setPosition(_refPosition + _refRotation * (_translation * _refScale)); _avatar->setPosition(_refPosition + _refRotation * (_translation * _refScale), true);
somethingChanged = true; somethingChanged = true;
} }
} }

View file

@ -94,7 +94,29 @@ void AvatarData::setOrientation(const glm::quat& orientation, bool overideRefere
_bodyYaw = eulerAngles.y; _bodyYaw = eulerAngles.y;
_bodyRoll = eulerAngles.z; _bodyRoll = eulerAngles.z;
} }
} }
float AvatarData::getTargetScale() const {
if (_referential) {
_referential->update();
}
return _targetScale;
}
void AvatarData::setTargetScale(float targetScale, bool overideReferential) {
if (!_referential || overideReferential) {
_targetScale = targetScale;
}
}
void AvatarData::setClampedTargetScale(float targetScale, bool overideReferential) {
targetScale = glm::clamp(targetScale, MIN_AVATAR_SCALE, MAX_AVATAR_SCALE);
setTargetScale(targetScale, overideReferential);
qDebug() << "Changed scale to " << _targetScale;
}
glm::vec3 AvatarData::getHandPosition() const { glm::vec3 AvatarData::getHandPosition() const {
return getOrientation() * _handPosition + _position; return getOrientation() * _handPosition + _position;
@ -868,14 +890,6 @@ void AvatarData::setJointMappingsFromNetworkReply() {
networkReply->deleteLater(); networkReply->deleteLater();
} }
void AvatarData::setClampedTargetScale(float targetScale) {
targetScale = glm::clamp(targetScale, MIN_AVATAR_SCALE, MAX_AVATAR_SCALE);
_targetScale = targetScale;
qDebug() << "Changed scale to " << _targetScale;
}
void AvatarData::sendIdentityPacket() { void AvatarData::sendIdentityPacket() {
QByteArray identityPacket = byteArrayWithPopulatedHeader(PacketTypeAvatarIdentity); QByteArray identityPacket = byteArrayWithPopulatedHeader(PacketTypeAvatarIdentity);
identityPacket.append(identityByteArray()); identityPacket.append(identityByteArray());

View file

@ -190,9 +190,9 @@ public:
void setAudioAverageLoudness(float value) { _headData->setAudioAverageLoudness(value); } void setAudioAverageLoudness(float value) { _headData->setAudioAverageLoudness(value); }
// Scale // Scale
float getTargetScale() const { return _targetScale; } float getTargetScale() const;
void setTargetScale(float targetScale) { _targetScale = targetScale; } void setTargetScale(float targetScale, bool overideReferential = false);
void setClampedTargetScale(float targetScale); void setClampedTargetScale(float targetScale, bool overideReferential = false);
// Hand State // Hand State
Q_INVOKABLE void setHandState(char s) { _handState = s; } Q_INVOKABLE void setHandState(char s) { _handState = s; }