void ShapeEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) { withWriteLock([&] { auto userData = entity->getUserData(); if (_lastUserData != userData) { _lastUserData = userData; _procedural.setProceduralData(ProceduralData::parse(_lastUserData)); } _shape = entity->getShape(); _pulseProperties = entity->getPulseProperties(); }); void* key = (void*)this; AbstractViewStateInterface::instance()->pushPostUpdateLambda(key, [this] () { withWriteLock([&] { auto entity = getEntity(); _position = entity->getWorldPosition(); _dimensions = entity->getUnscaledDimensions(); // get unscaled to avoid scaling twice _orientation = entity->getWorldOrientation(); updateModelTransformAndBound(); _renderTransform = getModelTransform(); // contains parent scale, if this entity scales with its parent if (_shape == entity::Sphere) { _renderTransform.postScale(SPHERE_ENTITY_SCALE); } _renderTransform.postScale(_dimensions); });; }); }
bool ShapeEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const { if (_lastUserData != entity->getUserData()) { return true; } if (_color != entity->getColor()) { return true; } if (_alpha != entity->getAlpha()) { return true; } if (_shape != entity->getShape()) { return true; } if (_dimensions != entity->getScaledDimensions()) { return true; } if (_pulseProperties != entity->getPulseProperties()) { return true; } return false; }
void ZoneEntityRenderer::updateKeyBackgroundFromEntity(const TypedEntityPointer& entity) { setSkyboxMode((ComponentMode)entity->getSkyboxMode()); editBackground(); setSkyboxColor(toGlm(_skyboxProperties.getColor())); setProceduralUserData(entity->getUserData()); setSkyboxURL(_skyboxProperties.getURL()); }
bool ZoneEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const { if (entity->keyLightPropertiesChanged() || entity->ambientLightPropertiesChanged() || entity->hazePropertiesChanged() || entity->bloomPropertiesChanged() || entity->skyboxPropertiesChanged()) { return true; } if (_skyboxTextureURL != entity->getSkyboxProperties().getURL()) { return true; } if (entity->getWorldPosition() != _lastPosition) { return true; } if (entity->getScaledDimensions() != _lastDimensions) { return true; } if (entity->getWorldOrientation() != _lastRotation) { return true; } if (entity->getUserData() != _proceduralUserData) { return true; } #if 0 if (_typedEntity->getCompoundShapeURL() != _lastShapeURL) { return true; } if (_model) { if (!_model->needsFixupInScene() && (!ZoneEntityItem::getDrawZoneBoundaries() || _entity->getShapeType() != SHAPE_TYPE_COMPOUND)) { return true; } if (_model->needsFixupInScene() && (ZoneEntityItem::getDrawZoneBoundaries() || _entity->getShapeType() == SHAPE_TYPE_COMPOUND)) { return true; } if (_lastModelActive != _model->isActive()) { return true; } } #endif return false; }
void ZoneEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) { DependencyManager::get<EntityTreeRenderer>()->updateZone(entity->getID()); // FIXME one of the bools here could become true between being fetched and being reset, // resulting in a lost update bool keyLightChanged = entity->keyLightPropertiesChanged(); bool ambientLightChanged = entity->ambientLightPropertiesChanged(); bool skyboxChanged = entity->skyboxPropertiesChanged(); bool hazeChanged = entity->hazePropertiesChanged(); bool bloomChanged = entity->bloomPropertiesChanged(); entity->resetRenderingPropertiesChanged(); _lastPosition = entity->getWorldPosition(); _lastRotation = entity->getWorldOrientation(); _lastDimensions = entity->getScaledDimensions(); _keyLightProperties = entity->getKeyLightProperties(); _ambientLightProperties = entity->getAmbientLightProperties(); _skyboxProperties = entity->getSkyboxProperties(); _hazeProperties = entity->getHazeProperties(); _bloomProperties = entity->getBloomProperties(); #if 0 if (_lastShapeURL != _typedEntity->getCompoundShapeURL()) { _lastShapeURL = _typedEntity->getCompoundShapeURL(); _model.reset(); _model = std::make_shared<Model>(); _model->setIsWireframe(true); _model->init(); _model->setURL(_lastShapeURL); } if (_model && _model->isActive()) { _model->setScaleToFit(true, _lastDimensions); _model->setSnapModelToRegistrationPoint(true, _entity->getRegistrationPoint()); _model->setRotation(_lastRotation); _model->setTranslation(_lastPosition); _model->simulate(0.0f); } #endif updateKeyZoneItemFromEntity(entity); if (keyLightChanged) { updateKeySunFromEntity(entity); } if (ambientLightChanged) { updateAmbientLightFromEntity(entity); } if (skyboxChanged || _proceduralUserData != entity->getUserData()) { updateKeyBackgroundFromEntity(entity); } if (hazeChanged) { updateHazeFromEntity(entity); } bool visuallyReady = true; uint32_t skyboxMode = entity->getSkyboxMode(); if (skyboxMode == COMPONENT_MODE_ENABLED && !_skyboxTextureURL.isEmpty()) { bool skyboxLoadedOrFailed = (_skyboxTexture && (_skyboxTexture->isLoaded() || _skyboxTexture->isFailed())); visuallyReady = skyboxLoadedOrFailed; } entity->setVisuallyReady(visuallyReady); if (bloomChanged) { updateBloomFromEntity(entity); } }