mirror of
https://thingvellir.net/git/overte
synced 2025-03-27 23:52:03 +01:00
Oh boy
This commit is contained in:
parent
051776ab1d
commit
221b513b19
4 changed files with 75 additions and 36 deletions
|
@ -593,7 +593,8 @@ void Avatar::addToScene(AvatarSharedPointer self, const render::ScenePointer& sc
|
||||||
processMaterials();
|
processMaterials();
|
||||||
for (auto& attachmentModel : _attachmentModels) {
|
for (auto& attachmentModel : _attachmentModels) {
|
||||||
attachmentModel->addToScene(scene, transaction);
|
attachmentModel->addToScene(scene, transaction);
|
||||||
attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true);
|
attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, false);
|
||||||
|
attachmentModel->setCanCastShadow(true, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
_mustFadeIn = true;
|
_mustFadeIn = true;
|
||||||
|
@ -806,6 +807,7 @@ void Avatar::fixupModelsInScene(const render::ScenePointer& scene) {
|
||||||
_skeletonModel->removeFromScene(scene, transaction);
|
_skeletonModel->removeFromScene(scene, transaction);
|
||||||
_skeletonModel->addToScene(scene, transaction);
|
_skeletonModel->addToScene(scene, transaction);
|
||||||
_skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true);
|
_skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true);
|
||||||
|
_skeletonModel->setCanCastShadow(true, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true);
|
||||||
processMaterials();
|
processMaterials();
|
||||||
canTryFade = true;
|
canTryFade = true;
|
||||||
_isAnimatingScale = true;
|
_isAnimatingScale = true;
|
||||||
|
@ -814,12 +816,18 @@ void Avatar::fixupModelsInScene(const render::ScenePointer& scene) {
|
||||||
if (attachmentModel->isRenderable() && attachmentModel->needsFixupInScene()) {
|
if (attachmentModel->isRenderable() && attachmentModel->needsFixupInScene()) {
|
||||||
attachmentModel->removeFromScene(scene, transaction);
|
attachmentModel->removeFromScene(scene, transaction);
|
||||||
attachmentModel->addToScene(scene, transaction);
|
attachmentModel->addToScene(scene, transaction);
|
||||||
attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true);
|
attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, false);
|
||||||
|
attachmentModel->setCanCastShadow(true, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_needMeshVisibleSwitch) {
|
if (_needMeshVisibleSwitch) {
|
||||||
_skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true);
|
_skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true);
|
||||||
|
for (auto attachmentModel : _attachmentModels) {
|
||||||
|
if (attachmentModel->isRenderable()) {
|
||||||
|
attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
updateRenderItem(transaction);
|
updateRenderItem(transaction);
|
||||||
_needMeshVisibleSwitch = false;
|
_needMeshVisibleSwitch = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ public:
|
||||||
typedef Payload::DataPointer Pointer;
|
typedef Payload::DataPointer Pointer;
|
||||||
|
|
||||||
virtual void updateKey(bool isVisible, bool isLayered, bool canCastShadow, uint8_t tagBits, bool isGroupCulled = false);
|
virtual void updateKey(bool isVisible, bool isLayered, bool canCastShadow, uint8_t tagBits, bool isGroupCulled = false);
|
||||||
|
virtual void updateKey(const render::ItemKey& key);
|
||||||
|
|
||||||
virtual void updateMeshPart(const std::shared_ptr<const graphics::Mesh>& drawMesh, int partIndex);
|
virtual void updateMeshPart(const std::shared_ptr<const graphics::Mesh>& drawMesh, int partIndex);
|
||||||
|
|
||||||
|
@ -96,6 +97,7 @@ public:
|
||||||
void notifyLocationChanged() override;
|
void notifyLocationChanged() override;
|
||||||
|
|
||||||
void updateKey(bool isVisible, bool isLayered, bool canCastShadow, uint8_t tagBits, bool isGroupCulled = false) override;
|
void updateKey(bool isVisible, bool isLayered, bool canCastShadow, uint8_t tagBits, bool isGroupCulled = false) override;
|
||||||
|
void updateKey(const render::ItemKey& key) override;
|
||||||
|
|
||||||
// matrix palette skinning
|
// matrix palette skinning
|
||||||
void updateClusterBuffer(const std::vector<glm::mat4>& clusterMatrices);
|
void updateClusterBuffer(const std::vector<glm::mat4>& clusterMatrices);
|
||||||
|
|
|
@ -103,11 +103,12 @@ Model::Model(QObject* parent, SpatiallyNestable* spatiallyNestableOverride) :
|
||||||
_snapModelToRegistrationPoint(false),
|
_snapModelToRegistrationPoint(false),
|
||||||
_snappedToRegistrationPoint(false),
|
_snappedToRegistrationPoint(false),
|
||||||
_url(HTTP_INVALID_COM),
|
_url(HTTP_INVALID_COM),
|
||||||
_isVisible(true),
|
// _isVisible(true),
|
||||||
_canCastShadow(false),
|
// _canCastShadow(false),
|
||||||
_blendNumber(0),
|
_blendNumber(0),
|
||||||
_appliedBlendNumber(0),
|
_appliedBlendNumber(0),
|
||||||
_isWireframe(false)
|
_isWireframe(false),
|
||||||
|
_renderItemsKey(render::ItemKey::Builder().withVisible().withTagBits(AllViews).build())
|
||||||
{
|
{
|
||||||
// we may have been created in the network thread, but we live in the main thread
|
// we may have been created in the network thread, but we live in the main thread
|
||||||
if (_viewState) {
|
if (_viewState) {
|
||||||
|
@ -270,7 +271,7 @@ void Model::updateRenderItems() {
|
||||||
bool isWireframe = self->isWireframe();
|
bool isWireframe = self->isWireframe();
|
||||||
bool isVisible = self->isVisible();
|
bool isVisible = self->isVisible();
|
||||||
bool canCastShadow = self->canCastShadow();
|
bool canCastShadow = self->canCastShadow();
|
||||||
uint8_t viewTagBits = self->getViewTagBits();
|
uint8_t viewTagBits = self->getViewVisibilityMask();
|
||||||
bool isLayeredInFront = self->isLayeredInFront();
|
bool isLayeredInFront = self->isLayeredInFront();
|
||||||
bool isLayeredInHUD = self->isLayeredInHUD();
|
bool isLayeredInHUD = self->isLayeredInHUD();
|
||||||
bool isGroupCulled = self->isGroupCulled();
|
bool isGroupCulled = self->isGroupCulled();
|
||||||
|
@ -772,7 +773,7 @@ void Model::calculateTriangleSets(const FBXGeometry& geometry) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene, uint8_t viewTagBits, bool isGroupCulled) {
|
void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene, uint8_t viewTagBits, bool isGroupCulled) {
|
||||||
if (_isVisible != isVisible || _viewTagBits != viewTagBits || _isGroupCulled != isGroupCulled) {
|
if (_isVisible != isVisible || _viewTagBits != viewTagBits || _isGroupCulled != isGroupCulled) {
|
||||||
_isVisible = isVisible;
|
_isVisible = isVisible;
|
||||||
|
@ -798,24 +799,41 @@ void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene,
|
||||||
scene->enqueueTransaction(transaction);
|
scene->enqueueTransaction(transaction);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
void Model::setCanCastShadow(bool canCastShadow, const render::ScenePointer& scene, uint8_t viewTagBits, bool isGroupCulled) {
|
void Model::updateRenderItemsKey(const render::ScenePointer& scene) {
|
||||||
if (_canCastShadow != canCastShadow) {
|
auto renderItemsKey = _renderItemsKey;
|
||||||
_canCastShadow = canCastShadow;
|
|
||||||
|
|
||||||
bool isVisible = _isVisible;
|
|
||||||
bool isLayeredInFront = _isLayeredInFront;
|
|
||||||
bool isLayeredInHUD = _isLayeredInHUD;
|
|
||||||
|
|
||||||
render::Transaction transaction;
|
render::Transaction transaction;
|
||||||
foreach (auto item, _modelMeshRenderItemsMap.keys()) {
|
foreach(auto item, _modelMeshRenderItemsMap.keys()) {
|
||||||
transaction.updateItem<ModelMeshPartPayload>(item,
|
transaction.updateItem<ModelMeshPartPayload>(item, [renderItemsKey](ModelMeshPartPayload& data) {
|
||||||
[isVisible, viewTagBits, canCastShadow, isLayeredInFront, isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) {
|
data.updateKey(renderItemsKey);
|
||||||
data.updateKey(isVisible, viewTagBits, canCastShadow, isLayeredInFront || isLayeredInHUD, isGroupCulled);
|
});
|
||||||
|
}
|
||||||
|
foreach(auto item, _collisionRenderItemsMap.keys()) {
|
||||||
|
transaction.updateItem<ModelMeshPartPayload>(item, [renderItemsKey](ModelMeshPartPayload& data) {
|
||||||
|
data.updateKey(renderItemsKey);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
scene->enqueueTransaction(transaction);
|
scene->enqueueTransaction(transaction);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Model::setVisibleInScene(bool pisVisible, const render::ScenePointer& scene) {
|
||||||
|
if (isVisible() != pisVisible) {
|
||||||
|
auto keyBuilder = render::ItemKey::Builder(_renderItemsKey);
|
||||||
|
_renderItemsKey = (pisVisible ? keyBuilder.withVisible() : keyBuilder.withInvisible());
|
||||||
|
updateRenderItemsKey(scene);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Model::isVisible() const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Model::setCanCastShadow(bool pcanCastShadow, const render::ScenePointer& scene) {
|
||||||
|
if (canCastShadow() != pcanCastShadow) {
|
||||||
|
auto keyBuilder = render::ItemKey::Builder(_renderItemsKey);
|
||||||
|
_renderItemsKey = (pcanCastShadow ? keyBuilder.withShadowCaster() : keyBuilder.withoutShadowCaster());
|
||||||
|
updateRenderItemsKey(scene);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -87,13 +87,29 @@ public:
|
||||||
const QUrl& getURL() const { return _url; }
|
const QUrl& getURL() const { return _url; }
|
||||||
|
|
||||||
// new Scene/Engine rendering support
|
// new Scene/Engine rendering support
|
||||||
void setVisibleInScene(bool isVisible, const render::ScenePointer& scene, uint8_t viewTagBits, bool isGroupCulled);
|
void setVisibleInScene(bool isVisible, const render::ScenePointer& scene);
|
||||||
|
bool isVisible() const;
|
||||||
|
|
||||||
bool canCastShadow() const { return _canCastShadow; }
|
enum ViewVisibilityMask : uint8_t {
|
||||||
void setCanCastShadow(bool canCastShadow, const render::ScenePointer& scene, uint8_t viewTagBits, bool isGroupCulled);
|
MainView = 0x01, //render::ItemKey::TAG_BITS_0,
|
||||||
|
SecondaryView = 0x02, //render::ItemKey::TAG_BITS_1,
|
||||||
|
AllViews = 0xFF, //render::ItemKey::TAG_BITS_ALL,
|
||||||
|
};
|
||||||
|
ViewVisibilityMask getViewVisibilityMask() const;
|
||||||
|
void setViewVisibilityMask(uint8_t mask, const render::ScenePointer& scene);
|
||||||
|
|
||||||
|
bool isGroupCulled() const;
|
||||||
|
void setGroupCulled(bool isGroupCulled);
|
||||||
|
|
||||||
|
bool canCastShadow() const;
|
||||||
|
void setCanCastShadow(bool canCastShadow, const render::ScenePointer& scene);
|
||||||
|
|
||||||
void setLayeredInFront(bool isLayeredInFront, const render::ScenePointer& scene);
|
void setLayeredInFront(bool isLayeredInFront, const render::ScenePointer& scene);
|
||||||
void setLayeredInHUD(bool isLayeredInHUD, const render::ScenePointer& scene);
|
void setLayeredInHUD(bool isLayeredInHUD, const render::ScenePointer& scene);
|
||||||
|
|
||||||
|
bool isLayeredInFront() const;
|
||||||
|
bool isLayeredInHUD() const;
|
||||||
|
|
||||||
bool needsFixupInScene() const;
|
bool needsFixupInScene() const;
|
||||||
|
|
||||||
bool needsReload() const { return _needsReload; }
|
bool needsReload() const { return _needsReload; }
|
||||||
|
@ -108,13 +124,7 @@ public:
|
||||||
void removeFromScene(const render::ScenePointer& scene, render::Transaction& transaction);
|
void removeFromScene(const render::ScenePointer& scene, render::Transaction& transaction);
|
||||||
bool isRenderable() const;
|
bool isRenderable() const;
|
||||||
|
|
||||||
bool isVisible() const { return _isVisible; }
|
void updateRenderItemsKey(const render::ScenePointer& scene);
|
||||||
uint8_t getViewTagBits() const { return _viewTagBits; }
|
|
||||||
|
|
||||||
bool isLayeredInFront() const { return _isLayeredInFront; }
|
|
||||||
bool isLayeredInHUD() const { return _isLayeredInHUD; }
|
|
||||||
|
|
||||||
bool isGroupCulled() const { return _isGroupCulled; }
|
|
||||||
|
|
||||||
virtual void updateRenderItems();
|
virtual void updateRenderItems();
|
||||||
void setRenderItemsNeedUpdate();
|
void setRenderItemsNeedUpdate();
|
||||||
|
@ -404,10 +414,10 @@ protected:
|
||||||
QVector<float> _blendshapeCoefficients;
|
QVector<float> _blendshapeCoefficients;
|
||||||
|
|
||||||
QUrl _url;
|
QUrl _url;
|
||||||
bool _isVisible;
|
// bool _isVisible;
|
||||||
uint8_t _viewTagBits{ render::ItemKey::TAG_BITS_ALL };
|
// uint8_t _viewTagBits{ render::ItemKey::TAG_BITS_ALL };
|
||||||
|
|
||||||
bool _canCastShadow;
|
// bool _canCastShadow;
|
||||||
|
|
||||||
gpu::Buffers _blendedVertexBuffers;
|
gpu::Buffers _blendedVertexBuffers;
|
||||||
|
|
||||||
|
@ -471,11 +481,12 @@ protected:
|
||||||
int _renderInfoDrawCalls { 0 };
|
int _renderInfoDrawCalls { 0 };
|
||||||
int _renderInfoHasTransparent { false };
|
int _renderInfoHasTransparent { false };
|
||||||
|
|
||||||
bool _isLayeredInFront { false };
|
render::ItemKey _renderItemsKey;
|
||||||
|
/* bool _isLayeredInFront { false };
|
||||||
bool _isLayeredInHUD { false };
|
bool _isLayeredInHUD { false };
|
||||||
|
|
||||||
bool _isGroupCulled{ false };
|
bool _isGroupCulled{ false };
|
||||||
|
*/
|
||||||
bool shouldInvalidatePayloadShapeKey(int meshIndex);
|
bool shouldInvalidatePayloadShapeKey(int meshIndex);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Reference in a new issue