more hacking on models

This commit is contained in:
ZappoMan 2015-05-29 11:07:25 -07:00
parent 78c701a89d
commit dc62052a3c
4 changed files with 118 additions and 72 deletions

View file

@ -116,7 +116,22 @@ bool RenderableModelEntityItem::readyToAddToScene(RenderArgs* renderArgs) {
qDebug() << "RenderableModelEntityItem::readyToAddToScene().... renderer:" << renderer;
getModel(renderer);
}
bool ready = (bool)_model;
if (renderArgs && _model && _needsInitialSimulation && _model->isActive()) {
qDebug() << "RenderableModelEntityItem::readyToAddToScene().... doing initial simulation";
_model->renderSetup(renderArgs);
_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;
}
bool ready = !_needsInitialSimulation && _model && _model->readyToAddToScene(renderArgs);
qDebug() << "RenderableModelEntityItem::readyToAddToScene().... id:" << getEntityItemID()
<< "ready:" << ready << "renderArgs:" << renderArgs;
return ready;
@ -125,14 +140,18 @@ bool RenderableModelEntityItem::readyToAddToScene(RenderArgs* renderArgs) {
bool RenderableModelEntityItem::addToScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene,
render::PendingChanges& pendingChanges) {
qDebug() << "RenderableModelEntityItem::addToScene().... id:" << getEntityItemID();
if (_model) {
return _model->addToScene(scene, pendingChanges);
}
return false;
}
void RenderableModelEntityItem::removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene,
render::PendingChanges& pendingChanges) {
qDebug() << "RenderableModelEntityItem::removeFromScene().... id:" << getEntityItemID();
if (_model) {
_model->removeFromScene(scene, pendingChanges);
}
}
void RenderableModelEntityItem::render(RenderArgs* args) {

View file

@ -653,15 +653,15 @@ void EntityItem::adjustEditPacketForClockSkew(unsigned char* editPacketBuffer, s
// lastEdited
quint64 lastEditedInLocalTime;
memcpy(&lastEditedInLocalTime, dataAt, sizeof(lastEditedInLocalTime));
assert(lastEditedInLocalTime > 0);
quint64 lastEditedInServerTime = lastEditedInLocalTime + clockSkew;
memcpy(dataAt, &lastEditedInServerTime, sizeof(lastEditedInServerTime));
#ifdef WANT_DEBUG
#if 1 //def WANT_DEBUG
qCDebug(entities, "EntityItem::adjustEditPacketForClockSkew()...");
qCDebug(entities) << " lastEditedInLocalTime: " << lastEditedInLocalTime;
qCDebug(entities) << " clockSkew: " << clockSkew;
qCDebug(entities) << " lastEditedInServerTime: " << lastEditedInServerTime;
#endif
//assert(lastEditedInLocalTime > (quint64)0);
}
float EntityItem::computeMass() const {

View file

@ -765,6 +765,68 @@ void Model::renderSetup(RenderArgs* args) {
}
}
class TransparentMeshPart {
public:
TransparentMeshPart(Model* model, int meshIndex, int partIndex) : model(model), meshIndex(meshIndex), partIndex(partIndex) { }
typedef render::Payload<TransparentMeshPart> Payload;
typedef Payload::DataPointer Pointer;
Model* model;
int meshIndex;
int partIndex;
};
namespace render {
template <> const ItemKey payloadGetKey(const TransparentMeshPart::Pointer& payload) {
return ItemKey::Builder::transparentShape();
}
template <> const Item::Bound payloadGetBound(const TransparentMeshPart::Pointer& payload) {
if (payload) {
return payload->model->getPartBounds(payload->meshIndex, payload->partIndex);
}
return render::Item::Bound();
}
template <> void payloadRender(const TransparentMeshPart::Pointer& payload, RenderArgs* args) {
if (args) {
args->_elementsTouched++;
return payload->model->renderPart(args, payload->meshIndex, payload->partIndex, true);
}
}
}
class OpaqueMeshPart {
public:
OpaqueMeshPart(Model* model, int meshIndex, int partIndex) : model(model), meshIndex(meshIndex), partIndex(partIndex) { }
typedef render::Payload<OpaqueMeshPart> Payload;
typedef Payload::DataPointer Pointer;
Model* model;
int meshIndex;
int partIndex;
};
namespace render {
template <> const ItemKey payloadGetKey(const OpaqueMeshPart::Pointer& payload) {
return ItemKey::Builder::opaqueShape();
}
template <> const Item::Bound payloadGetBound(const OpaqueMeshPart::Pointer& payload) {
if (payload) {
return payload->model->getPartBounds(payload->meshIndex, payload->partIndex);
}
return render::Item::Bound();
}
template <> void payloadRender(const OpaqueMeshPart::Pointer& payload, RenderArgs* args) {
if (args) {
args->_elementsTouched++;
return payload->model->renderPart(args, payload->meshIndex, payload->partIndex, false);
}
}
}
bool Model::addToScene(std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) {
bool somethingAdded = false;
// allow the attachments to add to scene
@ -773,7 +835,24 @@ bool Model::addToScene(std::shared_ptr<render::Scene> scene, render::PendingChan
somethingAdded = somethingAdded || attachementSomethingAdded;
}
// TODO --- need to do something here
foreach (auto renderItem, _transparentRenderItems) {
auto item = scene->allocateID();
auto renderData = TransparentMeshPart::Pointer(renderItem);
auto renderPayload = render::PayloadPointer(new TransparentMeshPart::Payload(renderData));
pendingChanges.resetItem(item, renderPayload);
_renderItems << item;
qDebug() << "Model::addToScene() added transparent item:" << item;
somethingAdded = true;
}
foreach (auto renderItem, _opaqueRenderItems) {
auto item = scene->allocateID();
auto renderData = OpaqueMeshPart::Pointer(renderItem);
auto renderPayload = render::PayloadPointer(new OpaqueMeshPart::Payload(renderData));
pendingChanges.resetItem(item, renderPayload);
_renderItems << item;
qDebug() << "Model::addToScene() added opaque item:" << item;
somethingAdded = true;
}
return somethingAdded;
}
@ -784,8 +863,10 @@ void Model::removeFromScene(std::shared_ptr<render::Scene> scene, render::Pendin
attachment->removeFromScene(scene, pendingChanges);
}
// TODO --- need to do something here
foreach (auto item, _renderItems) {
pendingChanges.removeItem(item);
}
_renderItems.clear();
}
bool Model::render(RenderArgs* renderArgs, float alpha) {
@ -2091,70 +2172,13 @@ bool Model::renderInScene(float alpha, RenderArgs* args) {
return true;
}
class TransparentMeshPart {
public:
TransparentMeshPart(Model* model, int meshIndex, int partIndex) : model(model), meshIndex(meshIndex), partIndex(partIndex) { }
typedef render::Payload<TransparentMeshPart> Payload;
typedef Payload::DataPointer Pointer;
Model* model;
int meshIndex;
int partIndex;
};
namespace render {
template <> const ItemKey payloadGetKey(const TransparentMeshPart::Pointer& payload) {
return ItemKey::Builder::transparentShape();
}
template <> const Item::Bound payloadGetBound(const TransparentMeshPart::Pointer& payload) {
if (payload) {
return payload->model->getPartBounds(payload->meshIndex, payload->partIndex);
}
return render::Item::Bound();
}
template <> void payloadRender(const TransparentMeshPart::Pointer& payload, RenderArgs* args) {
if (args) {
args->_elementsTouched++;
return payload->model->renderPart(args, payload->meshIndex, payload->partIndex, true);
}
}
}
class OpaqueMeshPart {
public:
OpaqueMeshPart(Model* model, int meshIndex, int partIndex) : model(model), meshIndex(meshIndex), partIndex(partIndex) { }
typedef render::Payload<OpaqueMeshPart> Payload;
typedef Payload::DataPointer Pointer;
Model* model;
int meshIndex;
int partIndex;
};
namespace render {
template <> const ItemKey payloadGetKey(const OpaqueMeshPart::Pointer& payload) {
return ItemKey::Builder::opaqueShape();
}
template <> const Item::Bound payloadGetBound(const OpaqueMeshPart::Pointer& payload) {
if (payload) {
return payload->model->getPartBounds(payload->meshIndex, payload->partIndex);
}
return render::Item::Bound();
}
template <> void payloadRender(const OpaqueMeshPart::Pointer& payload, RenderArgs* args) {
if (args) {
args->_elementsTouched++;
return payload->model->renderPart(args, payload->meshIndex, payload->partIndex, false);
}
}
}
AABox Model::getPartBounds(int meshIndex, int partIndex) {
const FBXGeometry& geometry = _geometry->getFBXGeometry();
const FBXMesh& mesh = geometry.meshes.at(meshIndex);
AABox partBox = mesh._mesh.evalPartBound(partIndex);
// FIX ME!
// TODO: needs to translate to world space, these values are in model space
return partBox;
}
@ -2351,17 +2375,17 @@ void Model::segregateMeshGroups() {
}
// Debug...
//qDebug() << "Mesh parts..." << mesh._mesh.getNumParts();
qDebug() << "Mesh parts... for " << _url << " count:" << mesh._mesh.getNumParts();
int totalParts = mesh._mesh.getNumParts();
for (int partIndex = 0; partIndex < totalParts; partIndex++) {
AABox boxPart = mesh._mesh.evalPartBound(partIndex);
// this is a good place to create our renderPayloads
if (translucentMesh) {
//qDebug() << "Transparent Mesh parts[" << partIndex << "].box=" << boxPart;
qDebug() << "Transparent Mesh parts[" << partIndex << "].box=" << boxPart;
_transparentRenderItems << std::shared_ptr<TransparentMeshPart>(new TransparentMeshPart(this, i, partIndex));
} else {
//qDebug() << "Opaque Mesh parts[" << partIndex << "].box=" << boxPart;
qDebug() << "Opaque Mesh parts[" << partIndex << "].box=" << boxPart;
_opaqueRenderItems << std::shared_ptr<OpaqueMeshPart>(new OpaqueMeshPart(this, i, partIndex));
}
}

View file

@ -48,6 +48,7 @@ class ViewFrustum;
namespace render {
class Scene;
class PendingChanges;
typedef unsigned int ItemID;
}
class OpaqueMeshPart;
class TransparentMeshPart;
@ -114,6 +115,7 @@ public:
virtual void simulate(float deltaTime, bool fullUpdate = true);
bool render(RenderArgs* renderArgs, float alpha = 1.0f);
void renderSetup(RenderArgs* args);
// Scene rendering support
static void startScene(RenderArgs::RenderSide renderSide);
@ -121,6 +123,7 @@ public:
static void endScene(RenderArgs* args);
// new Scene/Engine rendering support
bool readyToAddToScene(RenderArgs* renderArgs = nullptr) { return isRenderable() && isActive() && isLoadedWithTextures(); }
bool addToScene(std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges);
void removeFromScene(std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges);
@ -392,7 +395,6 @@ private:
static void endSceneSplitPass(RenderArgs::RenderMode mode = RenderArgs::DEFAULT_RENDER_MODE, RenderArgs* args = NULL);
// helper functions used by render() or renderInScene()
void renderSetup(RenderArgs* args);
bool renderCore(RenderArgs* args, float alpha);
int renderMeshes(gpu::Batch& batch, RenderArgs::RenderMode mode, bool translucent, float alphaThreshold,
bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, bool isWireframe, RenderArgs* args = NULL,
@ -537,6 +539,7 @@ private:
QSet<std::shared_ptr<TransparentMeshPart>> _transparentRenderItems;
QSet<std::shared_ptr<OpaqueMeshPart>> _opaqueRenderItems;
QSet<render::ItemID> _renderItems;
};
Q_DECLARE_METATYPE(QPointer<Model>)