mirror of
https://github.com/JulianGro/overte.git
synced 2025-05-05 16:48:02 +02:00
fix laser ghosting
This commit is contained in:
parent
840f3a3a2e
commit
7a5bbb8f6f
2 changed files with 56 additions and 36 deletions
|
@ -95,19 +95,18 @@ bool PolyLineEntityRenderer::needsRenderUpdate() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PolyLineEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const {
|
bool PolyLineEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const {
|
||||||
return (
|
if (entity->pointsChanged() || entity->widthsChanged() || entity->normalsChanged() || entity->texturesChanged() || entity->colorsChanged()) {
|
||||||
entity->pointsChanged() ||
|
return true;
|
||||||
entity->widthsChanged() ||
|
|
||||||
entity->normalsChanged() ||
|
|
||||||
entity->texturesChanged() ||
|
|
||||||
entity->colorsChanged() ||
|
|
||||||
_isUVModeStretch != entity->getIsUVModeStretch() ||
|
|
||||||
_glow != entity->getGlow() ||
|
|
||||||
_faceCamera != entity->getFaceCamera()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolyLineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) {
|
if (_isUVModeStretch != entity->getIsUVModeStretch() || _glow != entity->getGlow() || _faceCamera != entity->getFaceCamera()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Parent::needsRenderUpdateFromTypedEntity(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PolyLineEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) {
|
||||||
auto pointsChanged = entity->pointsChanged();
|
auto pointsChanged = entity->pointsChanged();
|
||||||
auto widthsChanged = entity->widthsChanged();
|
auto widthsChanged = entity->widthsChanged();
|
||||||
auto normalsChanged = entity->normalsChanged();
|
auto normalsChanged = entity->normalsChanged();
|
||||||
|
@ -119,10 +118,6 @@ void PolyLineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo
|
||||||
|
|
||||||
entity->resetPolyLineChanged();
|
entity->resetPolyLineChanged();
|
||||||
|
|
||||||
// Transform
|
|
||||||
updateModelTransformAndBound();
|
|
||||||
_renderTransform = getModelTransform();
|
|
||||||
|
|
||||||
// Textures
|
// Textures
|
||||||
if (entity->texturesChanged()) {
|
if (entity->texturesChanged()) {
|
||||||
entity->resetTexturesChanged();
|
entity->resetTexturesChanged();
|
||||||
|
@ -131,7 +126,9 @@ void PolyLineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo
|
||||||
if (!textures.isEmpty()) {
|
if (!textures.isEmpty()) {
|
||||||
entityTextures = QUrl(textures);
|
entityTextures = QUrl(textures);
|
||||||
}
|
}
|
||||||
|
withWriteLock([&] {
|
||||||
_texture = DependencyManager::get<TextureCache>()->getTexture(entityTextures);
|
_texture = DependencyManager::get<TextureCache>()->getTexture(entityTextures);
|
||||||
|
});
|
||||||
_textureAspectRatio = 1.0f;
|
_textureAspectRatio = 1.0f;
|
||||||
_textureLoaded = false;
|
_textureLoaded = false;
|
||||||
}
|
}
|
||||||
|
@ -145,11 +142,13 @@ void PolyLineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo
|
||||||
|
|
||||||
// Data
|
// Data
|
||||||
bool faceCameraChanged = faceCamera != _faceCamera;
|
bool faceCameraChanged = faceCamera != _faceCamera;
|
||||||
|
withWriteLock([&] {
|
||||||
if (faceCameraChanged || glow != _glow) {
|
if (faceCameraChanged || glow != _glow) {
|
||||||
_faceCamera = faceCamera;
|
_faceCamera = faceCamera;
|
||||||
_glow = glow;
|
_glow = glow;
|
||||||
updateData();
|
updateData();
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Geometry
|
// Geometry
|
||||||
if (pointsChanged) {
|
if (pointsChanged) {
|
||||||
|
@ -165,10 +164,21 @@ void PolyLineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo
|
||||||
_colors = entity->getStrokeColors();
|
_colors = entity->getStrokeColors();
|
||||||
_color = toGlm(entity->getColor());
|
_color = toGlm(entity->getColor());
|
||||||
}
|
}
|
||||||
if (_isUVModeStretch != isUVModeStretch || pointsChanged || widthsChanged || normalsChanged || colorsChanged || textureChanged || faceCameraChanged) {
|
|
||||||
|
bool uvModeStretchChanged = _isUVModeStretch != isUVModeStretch;
|
||||||
_isUVModeStretch = isUVModeStretch;
|
_isUVModeStretch = isUVModeStretch;
|
||||||
|
|
||||||
|
void* key = (void*)this;
|
||||||
|
AbstractViewStateInterface::instance()->pushPostUpdateLambda(key, [=]() {
|
||||||
|
withWriteLock([&] {
|
||||||
|
updateModelTransformAndBound();
|
||||||
|
_renderTransform = getModelTransform();
|
||||||
|
|
||||||
|
if (uvModeStretchChanged || pointsChanged || widthsChanged || normalsChanged || colorsChanged || textureChanged || faceCameraChanged) {
|
||||||
updateGeometry();
|
updateGeometry();
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolyLineEntityRenderer::updateGeometry() {
|
void PolyLineEntityRenderer::updateGeometry() {
|
||||||
|
@ -267,22 +277,32 @@ void PolyLineEntityRenderer::updateData() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolyLineEntityRenderer::doRender(RenderArgs* args) {
|
void PolyLineEntityRenderer::doRender(RenderArgs* args) {
|
||||||
if (_numVertices < 2) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
PerformanceTimer perfTimer("RenderablePolyLineEntityItem::render");
|
PerformanceTimer perfTimer("RenderablePolyLineEntityItem::render");
|
||||||
Q_ASSERT(args->_batch);
|
Q_ASSERT(args->_batch);
|
||||||
gpu::Batch& batch = *args->_batch;
|
gpu::Batch& batch = *args->_batch;
|
||||||
|
|
||||||
if (!_pipeline || !_glowPipeline) {
|
size_t numVertices;
|
||||||
|
Transform transform;
|
||||||
|
gpu::TexturePointer texture;
|
||||||
|
withReadLock([&] {
|
||||||
|
numVertices = _numVertices;
|
||||||
|
transform = _renderTransform;
|
||||||
|
texture = _textureLoaded ? _texture->getGPUTexture() : DependencyManager::get<TextureCache>()->getWhiteTexture();
|
||||||
|
|
||||||
|
batch.setResourceBuffer(0, _polylineGeometryBuffer);
|
||||||
|
batch.setUniformBuffer(0, _polylineDataBuffer);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (numVertices < 2) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_pipeline) {
|
||||||
buildPipeline();
|
buildPipeline();
|
||||||
}
|
}
|
||||||
|
|
||||||
batch.setPipeline(_glow ? _glowPipeline : _pipeline);
|
batch.setPipeline(_glow ? _glowPipeline : _pipeline);
|
||||||
batch.setModelTransform(_renderTransform);
|
batch.setModelTransform(transform);
|
||||||
batch.setResourceTexture(0, _textureLoaded ? _texture->getGPUTexture() : DependencyManager::get<TextureCache>()->getWhiteTexture());
|
batch.setResourceTexture(0, texture);
|
||||||
batch.setResourceBuffer(0, _polylineGeometryBuffer);
|
batch.draw(gpu::TRIANGLE_STRIP, (gpu::uint32)(2 * numVertices), 0);
|
||||||
batch.setUniformBuffer(0, _polylineDataBuffer);
|
|
||||||
batch.draw(gpu::TRIANGLE_STRIP, (gpu::uint32)(2 * _numVertices), 0);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ public:
|
||||||
protected:
|
protected:
|
||||||
virtual bool needsRenderUpdate() const override;
|
virtual bool needsRenderUpdate() const override;
|
||||||
virtual bool needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const override;
|
virtual bool needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const override;
|
||||||
virtual void doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) override;
|
virtual void doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) override;
|
||||||
|
|
||||||
virtual ItemKey getKey() override;
|
virtual ItemKey getKey() override;
|
||||||
virtual ShapeKey getShapeKey() override;
|
virtual ShapeKey getShapeKey() override;
|
||||||
|
|
Loading…
Reference in a new issue