mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-29 20:23:04 +02:00
cleaning up the comments from review and trying something to adress the issue that showed up on i5
This commit is contained in:
parent
92d71a2e37
commit
8a44140e6b
10 changed files with 69 additions and 102 deletions
|
@ -89,30 +89,6 @@ void RenderableLightEntityItem::notifyChanged() {
|
||||||
scene->enqueuePendingChanges(pendingChanges);
|
scene->enqueuePendingChanges(pendingChanges);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
void RenderableLightEntityItem::render(RenderArgs* args) {
|
|
||||||
PerformanceTimer perfTimer("RenderableLightEntityItem::render");
|
|
||||||
assert(getType() == EntityTypes::Light);
|
|
||||||
checkFading();
|
|
||||||
|
|
||||||
|
|
||||||
glm::vec3 position = getPosition();
|
|
||||||
glm::vec3 dimensions = getDimensions();
|
|
||||||
glm::quat rotation = getRotation();
|
|
||||||
float largestDiameter = glm::compMax(dimensions);
|
|
||||||
|
|
||||||
|
|
||||||
// DependencyManager::get<DeferredLightingEffect>()->addLight(_light);
|
|
||||||
|
|
||||||
#ifdef WANT_DEBUG
|
|
||||||
Q_ASSERT(args->_batch);
|
|
||||||
gpu::Batch& batch = *args->_batch;
|
|
||||||
batch.setModelTransform(getTransformToCenter());
|
|
||||||
DependencyManager::get<GeometryCache>()->renderWireSphere(batch, 0.5f, 15, 15, glm::vec4(color, 1.0f));
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool RenderableLightEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
|
bool RenderableLightEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
|
||||||
bool& keepSearching, OctreeElementPointer& element, float& distance,
|
bool& keepSearching, OctreeElementPointer& element, float& distance,
|
||||||
BoxFace& face, glm::vec3& surfaceNormal,
|
BoxFace& face, glm::vec3& surfaceNormal,
|
||||||
|
|
|
@ -90,7 +90,7 @@ public:
|
||||||
virtual EntityItemProperties getProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags()) const;
|
virtual EntityItemProperties getProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags()) const;
|
||||||
|
|
||||||
/// returns true if something changed
|
/// returns true if something changed
|
||||||
// THis function calls setSubClass properties and detects if any property changes value.
|
// This function calls setSubClass properties and detects if any property changes value.
|
||||||
// If something changed then the "somethingChangedNotification" calls happens
|
// If something changed then the "somethingChangedNotification" calls happens
|
||||||
virtual bool setProperties(const EntityItemProperties& properties);
|
virtual bool setProperties(const EntityItemProperties& properties);
|
||||||
|
|
||||||
|
|
|
@ -109,7 +109,7 @@ protected:
|
||||||
float _cutoff { DEFAULT_CUTOFF };
|
float _cutoff { DEFAULT_CUTOFF };
|
||||||
|
|
||||||
// Dirty flag turn true when either light properties is changing values.
|
// Dirty flag turn true when either light properties is changing values.
|
||||||
// THis gets back to false in the somethingChangedNotification() call
|
// This gets back to false in the somethingChangedNotification() call
|
||||||
// Which is called after a setProperties() or a readEntitySubClassFromBUfferCall on the entity.
|
// Which is called after a setProperties() or a readEntitySubClassFromBUfferCall on the entity.
|
||||||
bool _lightPropertiesChanged { false };
|
bool _lightPropertiesChanged { false };
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,6 @@ void GLBackend::do_beginQuery(const Batch& batch, size_t paramOffset) {
|
||||||
if (glquery) {
|
if (glquery) {
|
||||||
PROFILE_RANGE_BEGIN(glquery->_profileRangeId, query->getName().c_str(), 0xFFFF7F00);
|
PROFILE_RANGE_BEGIN(glquery->_profileRangeId, query->getName().c_str(), 0xFFFF7F00);
|
||||||
|
|
||||||
//glGetInteger64v(GL_TIMESTAMP, (GLint64*)&glquery->_batchElapsedTime);
|
|
||||||
glquery->_batchElapsedTime = usecTimestampNow() * 1000;
|
glquery->_batchElapsedTime = usecTimestampNow() * 1000;
|
||||||
if (timeElapsed) {
|
if (timeElapsed) {
|
||||||
glBeginQuery(GL_TIME_ELAPSED, glquery->_endqo);
|
glBeginQuery(GL_TIME_ELAPSED, glquery->_endqo);
|
||||||
|
@ -47,10 +46,8 @@ void GLBackend::do_endQuery(const Batch& batch, size_t paramOffset) {
|
||||||
} else {
|
} else {
|
||||||
glQueryCounter(glquery->_endqo, GL_TIMESTAMP);
|
glQueryCounter(glquery->_endqo, GL_TIMESTAMP);
|
||||||
}
|
}
|
||||||
GLint64 now;
|
|
||||||
//glGetInteger64v(GL_TIMESTAMP, &now);
|
|
||||||
now = usecTimestampNow() * 1000;
|
|
||||||
|
|
||||||
|
GLint64 now = usecTimestampNow() * 1000;
|
||||||
glquery->_batchElapsedTime = now - glquery->_batchElapsedTime;
|
glquery->_batchElapsedTime = now - glquery->_batchElapsedTime;
|
||||||
|
|
||||||
PROFILE_RANGE_END(glquery->_profileRangeId);
|
PROFILE_RANGE_END(glquery->_profileRangeId);
|
||||||
|
|
|
@ -44,7 +44,6 @@ void Light::setType(Type type) {
|
||||||
}
|
}
|
||||||
updateLightRadius();
|
updateLightRadius();
|
||||||
}
|
}
|
||||||
updateVolumeGeometry();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -89,7 +88,6 @@ void Light::setMaximumRadius(float radius) {
|
||||||
}
|
}
|
||||||
_lightSchemaBuffer.edit().volume.radius = radius;
|
_lightSchemaBuffer.edit().volume.radius = radius;
|
||||||
updateLightRadius();
|
updateLightRadius();
|
||||||
updateVolumeGeometry();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Light::updateLightRadius() {
|
void Light::updateLightRadius() {
|
||||||
|
@ -125,8 +123,6 @@ void Light::setSpotAngle(float angle) {
|
||||||
if (isSpot()) {
|
if (isSpot()) {
|
||||||
_lightSchemaBuffer.edit().volume.spotCos = _spotCos;
|
_lightSchemaBuffer.edit().volume.spotCos = _spotCos;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateVolumeGeometry();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Light::setSpotExponent(float exponent) {
|
void Light::setSpotExponent(float exponent) {
|
||||||
|
@ -162,14 +158,3 @@ void Light::setAmbientMapNumMips(uint16_t numMips) {
|
||||||
_ambientSchemaBuffer.edit().mapNumMips = (float)numMips;
|
_ambientSchemaBuffer.edit().mapNumMips = (float)numMips;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Light::updateVolumeGeometry() {
|
|
||||||
// enlarge the scales slightly to account for tesselation
|
|
||||||
/* const float SCALE_EXPANSION = 0.05f;
|
|
||||||
glm::vec4 volumeGeometry(0.0f, 0.0f, 0.0f, getMaximumRadius() * (1.0f + SCALE_EXPANSION));
|
|
||||||
|
|
||||||
if (getType() == SPOT) {
|
|
||||||
const float TANGENT_LENGTH_SCALE = 0.666f;
|
|
||||||
volumeGeometry = glm::vec4(getSpotAngleCosSin(), TANGENT_LENGTH_SCALE * tanf(0.5f * getSpotAngle()), volumeGeometry.w);
|
|
||||||
}
|
|
||||||
editSchema()._volumeGeometry = volumeGeometry;*/
|
|
||||||
}
|
|
||||||
|
|
|
@ -149,7 +149,7 @@ public:
|
||||||
void setAmbientMapNumMips(uint16_t numMips);
|
void setAmbientMapNumMips(uint16_t numMips);
|
||||||
uint16_t getAmbientMapNumMips() const { return (uint16_t) _ambientSchemaBuffer->mapNumMips; }
|
uint16_t getAmbientMapNumMips() const { return (uint16_t) _ambientSchemaBuffer->mapNumMips; }
|
||||||
|
|
||||||
// LIght Schema
|
// Light Schema
|
||||||
class LightSchema {
|
class LightSchema {
|
||||||
public:
|
public:
|
||||||
LightVolume volume;
|
LightVolume volume;
|
||||||
|
@ -158,8 +158,8 @@ public:
|
||||||
|
|
||||||
class AmbientSchema {
|
class AmbientSchema {
|
||||||
public:
|
public:
|
||||||
float intensity { 0.f };
|
float intensity { 0.0f };
|
||||||
float mapNumMips { 0.f };
|
float mapNumMips { 0.0f };
|
||||||
float spare1;
|
float spare1;
|
||||||
float spare2;
|
float spare2;
|
||||||
gpu::SphericalHarmonics ambientSphere;
|
gpu::SphericalHarmonics ambientSphere;
|
||||||
|
@ -168,27 +168,6 @@ public:
|
||||||
using LightSchemaBuffer = gpu::StructBuffer<LightSchema>;
|
using LightSchemaBuffer = gpu::StructBuffer<LightSchema>;
|
||||||
using AmbientSchemaBuffer = gpu::StructBuffer<AmbientSchema>;
|
using AmbientSchemaBuffer = gpu::StructBuffer<AmbientSchema>;
|
||||||
|
|
||||||
// Schema to access the attribute values of the light
|
|
||||||
/* class Schema {
|
|
||||||
public:
|
|
||||||
Vec4 _position{0.0f, 0.0f, 0.0f, 1.0f};
|
|
||||||
Vec3 _direction{0.0f, 0.0f, -1.0f};
|
|
||||||
float _ambientIntensity{0.0f};
|
|
||||||
Color _color{1.0f};
|
|
||||||
float _intensity{1.0f};
|
|
||||||
Vec4 _attenuation{0.1f, 1.0f, 0.0f, 0.0f};
|
|
||||||
Vec4 _spot{0.0f, 0.0f, 0.0f, 0.0f};
|
|
||||||
//Vec4 _shadow{0.0f};
|
|
||||||
|
|
||||||
|
|
||||||
float _ambientMapNumMips{ 0.0f };
|
|
||||||
Vec3 _control{ 0.0f, 0.0f, 0.0f };
|
|
||||||
|
|
||||||
Vec4 _volumeGeometry { 1.f };
|
|
||||||
|
|
||||||
gpu::SphericalHarmonics _ambientSphere;
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
const LightSchemaBuffer& getLightSchemaBuffer() const { return _lightSchemaBuffer; }
|
const LightSchemaBuffer& getLightSchemaBuffer() const { return _lightSchemaBuffer; }
|
||||||
const AmbientSchemaBuffer& getAmbientSchemaBuffer() const { return _ambientSchemaBuffer; }
|
const AmbientSchemaBuffer& getAmbientSchemaBuffer() const { return _ambientSchemaBuffer; }
|
||||||
|
|
||||||
|
@ -207,7 +186,6 @@ protected:
|
||||||
float _spotCos { -1.0f }; // stored here to be able to reset the spot angle when turning the type spot on/off
|
float _spotCos { -1.0f }; // stored here to be able to reset the spot angle when turning the type spot on/off
|
||||||
|
|
||||||
void updateLightRadius();
|
void updateLightRadius();
|
||||||
void updateVolumeGeometry();
|
|
||||||
|
|
||||||
};
|
};
|
||||||
typedef std::shared_ptr< Light > LightPointer;
|
typedef std::shared_ptr< Light > LightPointer;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<!
|
<!
|
||||||
// LightCluserGrid.slh
|
// LightClusterGrid.slh
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 9/8/16.
|
// Created by Sam Gateau on 9/8/16.
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2013 High Fidelity, Inc.
|
||||||
|
|
|
@ -84,44 +84,57 @@ LightClusters::LightClusters() :
|
||||||
_lightIndicesBuffer(std::make_shared<gpu::Buffer>()),
|
_lightIndicesBuffer(std::make_shared<gpu::Buffer>()),
|
||||||
_clusterGridBuffer(/*std::make_shared<gpu::Buffer>(), */gpu::Element::INDEX_INT32),
|
_clusterGridBuffer(/*std::make_shared<gpu::Buffer>(), */gpu::Element::INDEX_INT32),
|
||||||
_clusterContentBuffer(/*std::make_shared<gpu::Buffer>(), */gpu::Element::INDEX_INT32) {
|
_clusterContentBuffer(/*std::make_shared<gpu::Buffer>(), */gpu::Element::INDEX_INT32) {
|
||||||
auto dims = _frustumGridBuffer.edit().dims;
|
|
||||||
_frustumGridBuffer.edit().dims = ivec3(0); // make sure we go through the full reset of the dimensionts ion the setDImensions call
|
|
||||||
setDimensions(dims, MAX_GRID_DIMENSIONS.w);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LightClusters::setDimensions(glm::uvec3 gridDims, uint32_t listBudget) {
|
void LightClusters::setDimensions(glm::uvec3 gridDims, uint32_t listBudget) {
|
||||||
ivec3 configDimensions;
|
ivec3 configDimensions;
|
||||||
auto gridBudget = MAX_GRID_DIMENSIONS.w;
|
auto gridBudget = MAX_GRID_DIMENSIONS.w;
|
||||||
configDimensions.x = std::min(MAX_GRID_DIMENSIONS.x, gridDims.x);
|
configDimensions.x = std::max(1, (int) std::min(MAX_GRID_DIMENSIONS.x, gridDims.x));
|
||||||
configDimensions.y = std::min(MAX_GRID_DIMENSIONS.y, gridDims.y);
|
configDimensions.y = std::max(1, (int) std::min(MAX_GRID_DIMENSIONS.y, gridDims.y));
|
||||||
configDimensions.z = std::min(MAX_GRID_DIMENSIONS.z, gridDims.z);
|
configDimensions.z = std::max(1, (int) std::min(MAX_GRID_DIMENSIONS.z, gridDims.z));
|
||||||
|
|
||||||
auto sliceCost = configDimensions.x * configDimensions.y;
|
auto sliceCost = configDimensions.x * configDimensions.y;
|
||||||
auto maxNumSlices = (int)(gridBudget / sliceCost) - 1;
|
auto maxNumSlices = (int)(gridBudget / sliceCost) - 1;
|
||||||
configDimensions.z = std::min(maxNumSlices, configDimensions.z);
|
configDimensions.z = std::min(maxNumSlices, configDimensions.z);
|
||||||
|
|
||||||
|
|
||||||
static int numFrames = 0;
|
// Grab the frustumGridBuffer and force it updated
|
||||||
numFrames++;
|
const auto& constFrustumGrid = _frustumGridBuffer.get();
|
||||||
auto& dims = _frustumGridBuffer->dims;
|
const auto& dims = constFrustumGrid.dims;
|
||||||
if ((numFrames == 10) || (dims.x != configDimensions.x) || (dims.y != configDimensions.y) || (dims.z != configDimensions.z)) {
|
if ((dims.x != configDimensions.x) || (dims.y != configDimensions.y) || (dims.z != configDimensions.z)) {
|
||||||
_frustumGridBuffer.edit().dims = configDimensions;
|
auto& theFrustumGrid = _frustumGridBuffer.edit();
|
||||||
_frustumGridBuffer.edit().generateGridPlanes(_gridPlanes[0], _gridPlanes[1], _gridPlanes[2]);
|
theFrustumGrid.dims = configDimensions;
|
||||||
}
|
theFrustumGrid.generateGridPlanes(_gridPlanes[0], _gridPlanes[1], _gridPlanes[2]);
|
||||||
|
_clusterResourcesInvalid = true;
|
||||||
auto numClusters = _frustumGridBuffer.edit().frustumGrid_numClusters();
|
|
||||||
if (numClusters != _numClusters) {
|
|
||||||
_numClusters = numClusters;
|
|
||||||
_clusterGrid.clear();
|
|
||||||
_clusterGrid.resize(_numClusters, EMPTY_CLUSTER);
|
|
||||||
// _clusterGridBuffer._size = _clusterGridBuffer._buffer->resize(_numClusters * sizeof(uint32_t));
|
|
||||||
_clusterGridBuffer._size = (_numClusters * sizeof(uint32_t));
|
|
||||||
_clusterGridBuffer._buffer = std::make_shared<gpu::Buffer>(_clusterGridBuffer._size, (gpu::Byte*) _clusterGrid.data(), _clusterGridBuffer._size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto configListBudget = std::min(MAX_GRID_DIMENSIONS.w, listBudget);
|
auto configListBudget = std::min(MAX_GRID_DIMENSIONS.w, listBudget);
|
||||||
|
if (_clusterContentBudget != configListBudget) {
|
||||||
|
_clusterContentBudget = configListBudget;
|
||||||
|
_clusterResourcesInvalid = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// SInce LightINdex is 2bytes, we can fit 2 in a uint32
|
uint32_t LightClusters::getNumClusters() const {
|
||||||
|
auto theFrustumGrid = _frustumGridBuffer.get();
|
||||||
|
return theFrustumGrid.frustumGrid_numClusters();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LightClusters::updateClusterResource() {
|
||||||
|
if (!_clusterResourcesInvalid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_clusterResourcesInvalid = false;
|
||||||
|
auto numClusters = getNumClusters();
|
||||||
|
if (numClusters != _clusterGrid.size()) {
|
||||||
|
_clusterGrid.clear();
|
||||||
|
_clusterGrid.resize(numClusters, EMPTY_CLUSTER);
|
||||||
|
_clusterGridBuffer._size = (numClusters * sizeof(uint32_t));
|
||||||
|
_clusterGridBuffer._buffer = std::make_shared<gpu::Buffer>(_clusterGridBuffer._size, (gpu::Byte*) _clusterGrid.data(), _clusterGridBuffer._size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Since LightIndex is 2bytes, we can fit 2 in a uint32
|
||||||
|
auto configListBudget = _clusterContentBudget;
|
||||||
if (sizeof(LightIndex) == 2) {
|
if (sizeof(LightIndex) == 2) {
|
||||||
configListBudget *= 2;
|
configListBudget *= 2;
|
||||||
}
|
}
|
||||||
|
@ -129,9 +142,7 @@ void LightClusters::setDimensions(glm::uvec3 gridDims, uint32_t listBudget) {
|
||||||
if (configListBudget != _clusterContent.size()) {
|
if (configListBudget != _clusterContent.size()) {
|
||||||
_clusterContent.clear();
|
_clusterContent.clear();
|
||||||
_clusterContent.resize(configListBudget, INVALID_LIGHT);
|
_clusterContent.resize(configListBudget, INVALID_LIGHT);
|
||||||
// _clusterContentBuffer._size = _clusterContentBuffer._buffer->resize(configListBudget * sizeof(LightIndex));
|
|
||||||
_clusterContentBuffer._size = (configListBudget * sizeof(LightIndex));
|
_clusterContentBuffer._size = (configListBudget * sizeof(LightIndex));
|
||||||
// _clusterContentBuffer._buffer->setData(_clusterContentBuffer._size, (gpu::Byte*) _clusterContent.data());
|
|
||||||
_clusterContentBuffer._buffer = std::make_shared<gpu::Buffer>(_clusterContentBuffer._size, (gpu::Byte*) _clusterContent.data(), _clusterContentBuffer._size);
|
_clusterContentBuffer._buffer = std::make_shared<gpu::Buffer>(_clusterContentBuffer._size, (gpu::Byte*) _clusterContent.data(), _clusterContentBuffer._size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -310,16 +321,23 @@ uint32_t scanLightVolumeSphere(FrustumGrid& grid, const FrustumGrid::Planes plan
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::ivec3 LightClusters::updateClusters() {
|
glm::ivec3 LightClusters::updateClusters() {
|
||||||
|
// Make sure resource are in good shape
|
||||||
|
updateClusterResource();
|
||||||
|
|
||||||
// Clean up last info
|
// Clean up last info
|
||||||
std::vector< std::vector< LightIndex > > clusterGridPoint(_numClusters);
|
uint32_t numClusters = (uint32_t)_clusterGrid.size();
|
||||||
std::vector< std::vector< LightIndex > > clusterGridSpot(_numClusters);
|
|
||||||
|
std::vector< std::vector< LightIndex > > clusterGridPoint(numClusters);
|
||||||
|
std::vector< std::vector< LightIndex > > clusterGridSpot(numClusters);
|
||||||
|
|
||||||
_clusterGrid.clear();
|
_clusterGrid.clear();
|
||||||
_clusterGrid.resize(_numClusters, EMPTY_CLUSTER);
|
_clusterGrid.resize(numClusters, EMPTY_CLUSTER);
|
||||||
|
|
||||||
uint32_t maxNumIndices = (uint32_t)_clusterContent.size();
|
uint32_t maxNumIndices = (uint32_t)_clusterContent.size();
|
||||||
_clusterContent.clear();
|
_clusterContent.clear();
|
||||||
_clusterContent.resize(maxNumIndices, INVALID_LIGHT);
|
_clusterContent.resize(maxNumIndices, INVALID_LIGHT);
|
||||||
|
|
||||||
|
|
||||||
auto theFrustumGrid(_frustumGridBuffer.get());
|
auto theFrustumGrid(_frustumGridBuffer.get());
|
||||||
|
|
||||||
glm::ivec3 gridPosToOffset(1, theFrustumGrid.dims.x, theFrustumGrid.dims.x * theFrustumGrid.dims.y);
|
glm::ivec3 gridPosToOffset(1, theFrustumGrid.dims.x, theFrustumGrid.dims.x * theFrustumGrid.dims.y);
|
||||||
|
|
|
@ -24,7 +24,7 @@ public:
|
||||||
float rangeFar { 200.0f };
|
float rangeFar { 200.0f };
|
||||||
float frustumFar { 10000.0f };
|
float frustumFar { 10000.0f };
|
||||||
|
|
||||||
glm::ivec3 dims { 16, 16, 16 };
|
glm::ivec3 dims { 1, 1, 1 };
|
||||||
float spare;
|
float spare;
|
||||||
|
|
||||||
glm::mat4 eyeToGridProj;
|
glm::mat4 eyeToGridProj;
|
||||||
|
@ -68,6 +68,8 @@ public:
|
||||||
void setDimensions(glm::uvec3 gridDims, uint32_t listBudget = MAX_GRID_DIMENSIONS.w);
|
void setDimensions(glm::uvec3 gridDims, uint32_t listBudget = MAX_GRID_DIMENSIONS.w);
|
||||||
void setRangeNearFar(float rangeNear, float rangeFar);
|
void setRangeNearFar(float rangeNear, float rangeFar);
|
||||||
|
|
||||||
|
uint32_t getNumClusters() const;
|
||||||
|
|
||||||
void updateFrustum(const ViewFrustum& frustum);
|
void updateFrustum(const ViewFrustum& frustum);
|
||||||
|
|
||||||
void updateLightStage(const LightStagePointer& lightStage);
|
void updateLightStage(const LightStagePointer& lightStage);
|
||||||
|
@ -76,8 +78,10 @@ public:
|
||||||
|
|
||||||
glm::ivec3 updateClusters();
|
glm::ivec3 updateClusters();
|
||||||
|
|
||||||
|
|
||||||
ViewFrustum _frustum;
|
ViewFrustum _frustum;
|
||||||
|
|
||||||
|
|
||||||
LightStagePointer _lightStage;
|
LightStagePointer _lightStage;
|
||||||
|
|
||||||
|
|
||||||
|
@ -89,8 +93,6 @@ public:
|
||||||
LightStage::LightIndices _visibleLightIndices;
|
LightStage::LightIndices _visibleLightIndices;
|
||||||
gpu::BufferView _lightIndicesBuffer;
|
gpu::BufferView _lightIndicesBuffer;
|
||||||
|
|
||||||
int32_t _numClusters { 0 };
|
|
||||||
|
|
||||||
const uint32_t EMPTY_CLUSTER { 0x0000FFFF };
|
const uint32_t EMPTY_CLUSTER { 0x0000FFFF };
|
||||||
const LightID INVALID_LIGHT { LightStage::INVALID_INDEX };
|
const LightID INVALID_LIGHT { LightStage::INVALID_INDEX };
|
||||||
|
|
||||||
|
@ -100,6 +102,10 @@ public:
|
||||||
std::vector<LightIndex> _clusterContent;
|
std::vector<LightIndex> _clusterContent;
|
||||||
gpu::BufferView _clusterGridBuffer;
|
gpu::BufferView _clusterGridBuffer;
|
||||||
gpu::BufferView _clusterContentBuffer;
|
gpu::BufferView _clusterContentBuffer;
|
||||||
|
int32_t _clusterContentBudget { 0 };
|
||||||
|
|
||||||
|
bool _clusterResourcesInvalid { true };
|
||||||
|
void updateClusterResource();
|
||||||
};
|
};
|
||||||
|
|
||||||
using LightClustersPointer = std::shared_ptr<LightClusters>;
|
using LightClustersPointer = std::shared_ptr<LightClusters>;
|
||||||
|
|
|
@ -71,6 +71,13 @@ void LightPayload::render(RenderArgs* args) {
|
||||||
if (isVisible()) {
|
if (isVisible()) {
|
||||||
// FInally, push the light visible in the frame
|
// FInally, push the light visible in the frame
|
||||||
_stage->_currentFrame.pushLight(_index, _light->getType());
|
_stage->_currentFrame.pushLight(_index, _light->getType());
|
||||||
|
|
||||||
|
#ifdef WANT_DEBUG
|
||||||
|
Q_ASSERT(args->_batch);
|
||||||
|
gpu::Batch& batch = *args->_batch;
|
||||||
|
batch.setModelTransform(getTransformToCenter());
|
||||||
|
DependencyManager::get<GeometryCache>()->renderWireSphere(batch, 0.5f, 15, 15, glm::vec4(color, 1.0f));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue