mirror of
https://github.com/overte-org/overte.git
synced 2025-08-10 01:00:44 +02:00
Reuse procedural on skybox
This commit is contained in:
parent
4022474b48
commit
74e1d32221
5 changed files with 19 additions and 27 deletions
|
@ -341,12 +341,7 @@ void EntityTreeRenderer::applyZonePropertiesToScene(std::shared_ptr<ZoneEntityIt
|
||||||
static QString userData;
|
static QString userData;
|
||||||
if (userData != zone->getUserData()) {
|
if (userData != zone->getUserData()) {
|
||||||
userData = zone->getUserData();
|
userData = zone->getUserData();
|
||||||
auto procedural = std::make_shared<Procedural>(userData);
|
skybox->setProcedural(userData);
|
||||||
if (procedural->_enabled) {
|
|
||||||
skybox->setProcedural(procedural);
|
|
||||||
} else {
|
|
||||||
skybox->setProcedural(ProceduralPointer());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (zone->getSkyboxProperties().getURL().isEmpty()) {
|
if (zone->getSkyboxProperties().getURL().isEmpty()) {
|
||||||
skybox->setCubemap(gpu::TexturePointer());
|
skybox->setCubemap(gpu::TexturePointer());
|
||||||
|
|
|
@ -62,6 +62,9 @@ QJsonValue Procedural::getProceduralData(const QString& proceduralJson) {
|
||||||
return doc.object()[PROCEDURAL_USER_DATA_KEY];
|
return doc.object()[PROCEDURAL_USER_DATA_KEY];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Procedural::Procedural() {
|
||||||
|
_state = std::make_shared<gpu::State>();
|
||||||
|
}
|
||||||
|
|
||||||
Procedural::Procedural(const QString& userDataJson) {
|
Procedural::Procedural(const QString& userDataJson) {
|
||||||
parse(userDataJson);
|
parse(userDataJson);
|
||||||
|
|
|
@ -31,6 +31,7 @@ struct Procedural {
|
||||||
public:
|
public:
|
||||||
static QJsonValue getProceduralData(const QString& proceduralJson);
|
static QJsonValue getProceduralData(const QString& proceduralJson);
|
||||||
|
|
||||||
|
Procedural();
|
||||||
Procedural(const QString& userDataJson);
|
Procedural(const QString& userDataJson);
|
||||||
void parse(const QString& userDataJson);
|
void parse(const QString& userDataJson);
|
||||||
|
|
||||||
|
@ -39,7 +40,6 @@ public:
|
||||||
|
|
||||||
glm::vec4 getColor(const glm::vec4& entityColor);
|
glm::vec4 getColor(const glm::vec4& entityColor);
|
||||||
|
|
||||||
bool _enabled { false };
|
|
||||||
uint8_t _version { 1 };
|
uint8_t _version { 1 };
|
||||||
|
|
||||||
std::string _vertexSource;
|
std::string _vertexSource;
|
||||||
|
@ -59,8 +59,9 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Procedural metadata
|
// Procedural metadata
|
||||||
uint64_t _start{ 0 };
|
bool _enabled { false };
|
||||||
int32_t _frameCount{ 0 };
|
uint64_t _start { 0 };
|
||||||
|
int32_t _frameCount { 0 };
|
||||||
|
|
||||||
// Rendering object descriptions, from userData
|
// Rendering object descriptions, from userData
|
||||||
QJsonObject _proceduralData;
|
QJsonObject _proceduralData;
|
||||||
|
|
|
@ -19,6 +19,10 @@
|
||||||
#include "ProceduralSkybox_frag.h"
|
#include "ProceduralSkybox_frag.h"
|
||||||
|
|
||||||
ProceduralSkybox::ProceduralSkybox() : model::Skybox() {
|
ProceduralSkybox::ProceduralSkybox() : model::Skybox() {
|
||||||
|
_procedural._vertexSource = ProceduralSkybox_vert;
|
||||||
|
_procedural._fragmentSource = ProceduralSkybox_frag;
|
||||||
|
// Adjust the pipeline state for background using the stencil test
|
||||||
|
_procedural._state->setStencilTest(true, 0xFF, gpu::State::StencilTest(0, 0xFF, gpu::EQUAL, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP));
|
||||||
}
|
}
|
||||||
|
|
||||||
ProceduralSkybox::ProceduralSkybox(const ProceduralSkybox& skybox) :
|
ProceduralSkybox::ProceduralSkybox(const ProceduralSkybox& skybox) :
|
||||||
|
@ -27,14 +31,8 @@ ProceduralSkybox::ProceduralSkybox(const ProceduralSkybox& skybox) :
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProceduralSkybox::setProcedural(const ProceduralPointer& procedural) {
|
void ProceduralSkybox::setProcedural(const QString& userData) {
|
||||||
_procedural = procedural;
|
_procedural.parse(userData);
|
||||||
if (_procedural) {
|
|
||||||
_procedural->_vertexSource = ProceduralSkybox_vert;
|
|
||||||
_procedural->_fragmentSource = ProceduralSkybox_frag;
|
|
||||||
// Adjust the pipeline state for background using the stencil test
|
|
||||||
_procedural->_state->setStencilTest(true, 0xFF, gpu::State::StencilTest(0, 0xFF, gpu::EQUAL, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProceduralSkybox::render(gpu::Batch& batch, const ViewFrustum& frustum) const {
|
void ProceduralSkybox::render(gpu::Batch& batch, const ViewFrustum& frustum) const {
|
||||||
|
@ -42,12 +40,10 @@ void ProceduralSkybox::render(gpu::Batch& batch, const ViewFrustum& frustum) con
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProceduralSkybox::render(gpu::Batch& batch, const ViewFrustum& viewFrustum, const ProceduralSkybox& skybox) {
|
void ProceduralSkybox::render(gpu::Batch& batch, const ViewFrustum& viewFrustum, const ProceduralSkybox& skybox) {
|
||||||
if (!(skybox._procedural)) {
|
if (!(skybox._procedural.ready())) {
|
||||||
skybox.updateDataBuffer();
|
skybox.updateDataBuffer();
|
||||||
Skybox::render(batch, viewFrustum, skybox);
|
Skybox::render(batch, viewFrustum, skybox);
|
||||||
}
|
} else {
|
||||||
|
|
||||||
if (skybox._procedural && skybox._procedural->_enabled && skybox._procedural->ready()) {
|
|
||||||
gpu::TexturePointer skymap = skybox.getCubemap();
|
gpu::TexturePointer skymap = skybox.getCubemap();
|
||||||
// FIXME: skymap->isDefined may not be threadsafe
|
// FIXME: skymap->isDefined may not be threadsafe
|
||||||
assert(skymap && skymap->isDefined());
|
assert(skymap && skymap->isDefined());
|
||||||
|
@ -62,8 +58,7 @@ void ProceduralSkybox::render(gpu::Batch& batch, const ViewFrustum& viewFrustum,
|
||||||
batch.setModelTransform(Transform()); // only for Mac
|
batch.setModelTransform(Transform()); // only for Mac
|
||||||
batch.setResourceTexture(0, skybox.getCubemap());
|
batch.setResourceTexture(0, skybox.getCubemap());
|
||||||
|
|
||||||
skybox._procedural->prepare(batch, glm::vec3(0), glm::vec3(1));
|
skybox._procedural.prepare(batch, glm::vec3(0), glm::vec3(1));
|
||||||
batch.draw(gpu::TRIANGLE_STRIP, 4);
|
batch.draw(gpu::TRIANGLE_STRIP, 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,8 +17,6 @@
|
||||||
|
|
||||||
#include "Procedural.h"
|
#include "Procedural.h"
|
||||||
|
|
||||||
typedef std::shared_ptr<Procedural> ProceduralPointer;
|
|
||||||
|
|
||||||
class ProceduralSkybox: public model::Skybox {
|
class ProceduralSkybox: public model::Skybox {
|
||||||
public:
|
public:
|
||||||
ProceduralSkybox();
|
ProceduralSkybox();
|
||||||
|
@ -26,13 +24,13 @@ public:
|
||||||
ProceduralSkybox& operator= (const ProceduralSkybox& skybox);
|
ProceduralSkybox& operator= (const ProceduralSkybox& skybox);
|
||||||
virtual ~ProceduralSkybox() {};
|
virtual ~ProceduralSkybox() {};
|
||||||
|
|
||||||
void setProcedural(const ProceduralPointer& procedural);
|
void setProcedural(const QString& userData);
|
||||||
|
|
||||||
virtual void render(gpu::Batch& batch, const ViewFrustum& frustum) const;
|
virtual void render(gpu::Batch& batch, const ViewFrustum& frustum) const;
|
||||||
static void render(gpu::Batch& batch, const ViewFrustum& frustum, const ProceduralSkybox& skybox);
|
static void render(gpu::Batch& batch, const ViewFrustum& frustum, const ProceduralSkybox& skybox);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
ProceduralPointer _procedural;
|
mutable Procedural _procedural;
|
||||||
};
|
};
|
||||||
typedef std::shared_ptr< ProceduralSkybox > ProceduralSkyboxPointer;
|
typedef std::shared_ptr< ProceduralSkybox > ProceduralSkyboxPointer;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue