mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-04 12:27:08 +02:00
more hacking on models
This commit is contained in:
parent
78c701a89d
commit
dc62052a3c
4 changed files with 118 additions and 72 deletions
|
@ -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) {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>)
|
||||
|
|
Loading…
Reference in a new issue