this seems to be working now. more cleanups to come

This commit is contained in:
Seth Alves 2016-03-06 12:48:01 -08:00
parent f03ddb856b
commit 5241dc5394
3 changed files with 56 additions and 23 deletions

View file

@ -336,6 +336,37 @@ bool RenderableModelEntityItem::getAnimationFrame() {
return newFrame;
}
void RenderableModelEntityItem::updateModelBounds() {
if (!hasModel() || !_model) {
return;
}
if (_model->getRegistrationPoint() != getRegistrationPoint()) {
qDebug() << "HERE: " << _model->getRegistrationPoint() << getRegistrationPoint();
}
bool movingOrAnimating = isMovingRelativeToParent() || isAnimatingSomething();
if ((movingOrAnimating ||
_needsInitialSimulation ||
_model->getTranslation() != getPosition() ||
_model->getRotation() != getRotation() ||
_model->getRegistrationPoint() != getRegistrationPoint())
&& _model->isActive() && _dimensionsInitialized) {
_model->setScaleToFit(true, getDimensions());
_model->setSnapModelToRegistrationPoint(true, getRegistrationPoint());
_model->setRotation(getRotation());
_model->setTranslation(getPosition());
// make sure to simulate so everything gets set up correctly for rendering
{
PerformanceTimer perfTimer("_model->simulate");
_model->simulate(0.0f);
}
_needsInitialSimulation = false;
}
}
// NOTE: this only renders the "meta" portion of the Model, namely it renders debugging items, and it handles
// the per frame simulation/update that might be required if the models properties changed.
void RenderableModelEntityItem::render(RenderArgs* args) {
@ -414,27 +445,7 @@ void RenderableModelEntityItem::render(RenderArgs* args) {
}
}
});
bool movingOrAnimating = isMovingRelativeToParent() || isAnimatingSomething();
if ((movingOrAnimating ||
_needsInitialSimulation ||
_model->getTranslation() != getPosition() ||
_model->getRotation() != getRotation() ||
_model->getRegistrationPoint() != getRegistrationPoint())
&& _model->isActive() && _dimensionsInitialized) {
_model->setScaleToFit(true, getDimensions());
_model->setSnapModelToRegistrationPoint(true, getRegistrationPoint());
_model->setRotation(getRotation());
_model->setTranslation(getPosition());
// make sure to simulate so everything gets set up correctly for rendering
{
PerformanceTimer perfTimer("_model->simulate");
_model->simulate(0.0f);
}
_needsInitialSimulation = false;
}
updateModelBounds();
}
}
} else {
@ -599,7 +610,9 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& info) {
ModelEntityItem::computeShapeInfo(info);
info.setParams(type, 0.5f * getDimensions());
adjustShapeInfoByRegistration(info);
assert(false); // XXX
} else {
updateModelBounds();
const QSharedPointer<NetworkGeometry> collisionNetworkGeometry = _model->getCollisionGeometry();
// should never fall in here when collision model not fully loaded
@ -693,6 +706,7 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& info) {
for (int j = 0; j < _points[i].size(); j++) {
// compensate for registraion
_points[i][j] += _model->getOffset();
// _points[i][j] += info.getOffset();
// scale so the collision points match the model points
_points[i][j] *= scale;
box += _points[i][j];
@ -704,9 +718,14 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& info) {
QString::number(_registrationPoint.x) + "," +
QString::number(_registrationPoint.y) + "," +
QString::number(_registrationPoint.z);
qDebug() << "NEW SHAPE FOR" << getName() << shapeKey;
qDebug() << " model-offset:" << _model->getOffset();
info.setParams(type, collisionModelDimensions, shapeKey);
info.setConvexHulls(_points);
adjustShapeInfoByRegistration(info);
qDebug() << " info-offset:" << info.getOffset();
}
}

View file

@ -49,6 +49,7 @@ public:
virtual void removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) override;
void updateModelBounds();
virtual void render(RenderArgs* args) override;
virtual bool supportsDetailedRayIntersection() const override { return true; }
virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,

View file

@ -15,7 +15,7 @@
#include "ShapeFactory.h"
#include "BulletUtil.h"
#include "StreamUtils.h"
btConvexHullShape* ShapeFactory::createConvexHull(const QVector<glm::vec3>& points) {
@ -65,6 +65,11 @@ btConvexHullShape* ShapeFactory::createConvexHull(const QVector<glm::vec3>& poin
hull->addPoint(btVector3(correctedPoint[0], correctedPoint[1], correctedPoint[2]), false);
}
hull->recalcLocalAabb();
qDebug() << "------- NEW COMPOUND SHAPE ------";
qDebug() << " low = " << minCorner;
qDebug() << " high = " << maxCorner;
return hull;
}
@ -92,11 +97,13 @@ btCollisionShape* ShapeFactory::createShapeFromInfo(const ShapeInfo& info) {
const QVector<QVector<glm::vec3>>& points = info.getPoints();
uint32_t numSubShapes = info.getNumSubShapes();
if (numSubShapes == 1) {
// XXX offset?
shape = createConvexHull(info.getPoints()[0]);
} else {
auto compound = new btCompoundShape();
btTransform trans;
trans.setIdentity();
// trans.setOrigin(-glmToBullet(info.getOffset()));
foreach (QVector<glm::vec3> hullPoints, points) {
btConvexHullShape* hull = createConvexHull(hullPoints);
compound->addChildShape (trans, hull);
@ -110,7 +117,7 @@ btCollisionShape* ShapeFactory::createShapeFromInfo(const ShapeInfo& info) {
if (glm::length2(info.getOffset()) > MIN_SHAPE_OFFSET * MIN_SHAPE_OFFSET) {
// this shape has an offset, which we support by wrapping the true shape
// in a btCompoundShape with a local transform
auto compound = new btCompoundShape();
auto compound = new btCompoundShape();
btTransform trans;
trans.setIdentity();
trans.setOrigin(glmToBullet(info.getOffset()));
@ -118,5 +125,11 @@ btCollisionShape* ShapeFactory::createShapeFromInfo(const ShapeInfo& info) {
shape = compound;
}
}
if (type == SHAPE_TYPE_COMPOUND) {
qDebug() << " offset = " << info.getOffset();
}
return shape;
}