Re-add fullUpdate hint to Model::simulate()

This commit is contained in:
Andrew Meadows 2014-04-02 16:34:33 -07:00
parent 97ba5250a5
commit 933cade6b0
7 changed files with 42 additions and 39 deletions

View file

@ -118,26 +118,21 @@ void Avatar::simulate(float deltaTime) {
_skeletonModel.setLODDistance(getLODDistance());
if (!_shouldRenderBillboard && inViewFrustum) {
glm::vec3 headPosition = _position;
_skeletonModel.updateGeometry();
if (_skeletonModel.isActive()) {
// copy joint data to skeleton
if (_hasNewJointRotations) {
for (int i = 0; i < _jointData.size(); i++) {
const JointData& data = _jointData.at(i);
_skeletonModel.setJointState(i, data.valid, data.rotation);
}
_skeletonModel.simulate(deltaTime);
_hasNewJointRotations = false;
if (_hasNewJointRotations) {
for (int i = 0; i < _jointData.size(); i++) {
const JointData& data = _jointData.at(i);
_skeletonModel.setJointState(i, data.valid, data.rotation);
}
_skeletonModel.getHeadPosition(headPosition);
_skeletonModel.simulate(deltaTime);
}
_skeletonModel.simulate(deltaTime, _hasNewJointRotations);
_hasNewJointRotations = false;
glm::vec3 headPosition = _position;
_skeletonModel.getHeadPosition(headPosition);
Head* head = getHead();
head->setPosition(headPosition);
head->setScale(_scale);
head->getFaceModel().updateGeometry();
head->simulate(deltaTime, false, _shouldRenderBillboard);
}

View file

@ -19,9 +19,7 @@ FaceModel::FaceModel(Head* owningHead) :
}
void FaceModel::simulate(float deltaTime) {
if (!isActive()) {
return;
}
updateGeometry();
Avatar* owningAvatar = static_cast<Avatar*>(_owningHead->_owningAvatar);
glm::vec3 neckPosition;
if (!owningAvatar->getSkeletonModel().getNeckPosition(neckPosition)) {
@ -36,12 +34,14 @@ void FaceModel::simulate(float deltaTime) {
const float MODEL_SCALE = 0.0006f;
setScale(glm::vec3(1.0f, 1.0f, 1.0f) * _owningHead->getScale() * MODEL_SCALE);
setOffset(-_geometry->getFBXGeometry().neckPivot);
if (isActive()) {
setOffset(-_geometry->getFBXGeometry().neckPivot);
}
setPupilDilation(_owningHead->getPupilDilation());
setBlendshapeCoefficients(_owningHead->getBlendshapeCoefficients());
Model::simulate(deltaTime);
Model::simulateInternal(deltaTime);
}
void FaceModel::maybeUpdateNeckRotation(const JointState& parentState, const FBXJoint& joint, JointState& state) {

View file

@ -289,7 +289,6 @@ void MyAvatar::simulate(float deltaTime) {
getHand()->collideAgainstOurself();
getHand()->simulate(deltaTime, true);
_skeletonModel.updateGeometry();
_skeletonModel.simulate(deltaTime);
// copy out the skeleton joints from the model
@ -306,7 +305,6 @@ void MyAvatar::simulate(float deltaTime) {
}
head->setPosition(headPosition);
head->setScale(_scale);
head->getFaceModel().updateGeometry();
head->simulate(deltaTime, true);
// Zero thrust out now that we've added it to velocity in this frame

View file

@ -18,16 +18,13 @@ SkeletonModel::SkeletonModel(Avatar* owningAvatar) :
_owningAvatar(owningAvatar) {
}
void SkeletonModel::simulate(float deltaTime) {
if (!isActive()) {
return;
}
void SkeletonModel::simulate(float deltaTime, bool fullUpdate) {
setTranslation(_owningAvatar->getPosition());
setRotation(_owningAvatar->getOrientation() * glm::angleAxis(PI, glm::vec3(0.0f, 1.0f, 0.0f)));
const float MODEL_SCALE = 0.0006f;
setScale(glm::vec3(1.0f, 1.0f, 1.0f) * _owningAvatar->getScale() * MODEL_SCALE);
Model::simulate(deltaTime);
Model::simulate(deltaTime, fullUpdate);
if (!(isActive() && _owningAvatar->isMyAvatar())) {
return; // only simulate for own avatar

View file

@ -21,7 +21,7 @@ public:
SkeletonModel(Avatar* owningAvatar);
void simulate(float deltaTime);
void simulate(float deltaTime, bool fullUpdate = true);
/// \param jointIndex index of hand joint
/// \param shapes[out] list in which is stored pointers to hand shapes

View file

@ -190,11 +190,14 @@ void Model::reset() {
}
}
void Model::updateGeometry() {
bool Model::updateGeometry() {
// NOTE: this is a recursive call that walks all attachments, and their attachments
bool needFullUpdate = false;
for (int i = 0; i < _attachments.size(); i++) {
Model* model = _attachments.at(i);
model->updateGeometry();
if (model->updateGeometry()) {
needFullUpdate = true;
}
}
bool needToRebuild = false;
@ -209,7 +212,7 @@ void Model::updateGeometry() {
}
if (!_geometry) {
// geometry is not ready
return;
return false;
}
QSharedPointer<NetworkGeometry> geometry = _geometry->getLODOrFallback(_lodDistance, _lodHysteresis);
@ -273,8 +276,9 @@ void Model::updateGeometry() {
_attachments.append(model);
}
rebuildShapes();
needFullUpdate = true;
}
return;
return needFullUpdate;
}
bool Model::render(float alpha, bool forShadowMap) {
@ -682,11 +686,15 @@ void Blender::run() {
Q_ARG(const QVector<glm::vec3>&, vertices), Q_ARG(const QVector<glm::vec3>&, normals));
}
void Model::simulate(float deltaTime) {
// NOTE: this is a recursive call that walks all attachments, and their attachments
if (!isActive()) {
return;
void Model::simulate(float deltaTime, bool fullUpdate) {
fullUpdate = updateGeometry() || fullUpdate;
if (isActive() && fullUpdate) {
simulateInternal(deltaTime);
}
}
void Model::simulateInternal(float deltaTime) {
// NOTE: this is a recursive call that walks all attachments, and their attachments
// update the world space transforms for all joints
for (int i = 0; i < _jointStates.size(); i++) {
updateJointState(i);
@ -709,7 +717,9 @@ void Model::simulate(float deltaTime) {
model->setRotation(jointRotation * attachment.rotation);
model->setScale(_scale * attachment.scale);
model->simulate(deltaTime);
if (model->isActive()) {
model->simulateInternal(deltaTime);
}
}
for (int i = 0; i < _meshStates.size(); i++) {

View file

@ -56,7 +56,7 @@ public:
void init();
void reset();
virtual void simulate(float deltaTime);
virtual void simulate(float deltaTime, bool fullUpdate = true);
bool render(float alpha = 1.0f, bool forShadowMap = false);
/// Sets the URL of the model to render.
@ -185,8 +185,6 @@ public:
/// Sets blended vertices computed in a separate thread.
void setBlendedVertices(const QVector<glm::vec3>& vertices, const QVector<glm::vec3>& normals);
void updateGeometry();
protected:
QSharedPointer<NetworkGeometry> _geometry;
@ -219,6 +217,11 @@ protected:
QVector<MeshState> _meshStates;
// returns 'true' if needs fullUpdate after geometry change
bool updateGeometry();
void simulateInternal(float deltaTime);
/// Updates the state of the joint at the specified index.
virtual void updateJointState(int index);