diff --git a/UI/window-basic-preview.cpp b/UI/window-basic-preview.cpp index 7a03f6314..64104c729 100644 --- a/UI/window-basic-preview.cpp +++ b/UI/window-basic-preview.cpp @@ -1492,9 +1492,17 @@ void OBSBasicPreview::StretchItem(const vec2 &pos) obs_source_t *source = obs_sceneitem_get_source(stretchItem); + uint32_t source_cx = obs_source_get_width(source); + uint32_t source_cy = obs_source_get_height(source); + + /* if the source's internal size has been set to 0 for whatever reason + * while resizing, do not update transform, otherwise source will be + * stuck invisible until a complete transform reset */ + if (!source_cx || !source_cy) + return; + vec2 baseSize; - vec2_set(&baseSize, float(obs_source_get_width(source)), - float(obs_source_get_height(source))); + vec2_set(&baseSize, float(source_cx), float(source_cy)); vec2 size; vec2_set(&size, br.x - tl.x, br.y - tl.y); diff --git a/UI/window-basic-transform.cpp b/UI/window-basic-transform.cpp index c77b93b73..7449e8475 100644 --- a/UI/window-basic-transform.cpp +++ b/UI/window-basic-transform.cpp @@ -246,8 +246,10 @@ void OBSBasicTransform::RefreshControls() obs_sceneitem_get_crop(item, &crop); obs_source_t *source = obs_sceneitem_get_source(item); - float width = float(obs_source_get_width(source)); - float height = float(obs_source_get_height(source)); + uint32_t source_cx = obs_source_get_width(source); + uint32_t source_cy = obs_source_get_height(source); + float width = float(source_cx); + float height = float(source_cy); int alignIndex = AlignToList(osi.alignment); int boundsAlignIndex = AlignToList(osi.bounds_alignment); @@ -260,6 +262,10 @@ void OBSBasicTransform::RefreshControls() ui->sizeY->setValue(osi.scale.y * height); ui->align->setCurrentIndex(alignIndex); + bool valid_size = source_cx != 0 && source_cy != 0; + ui->sizeX->setEnabled(valid_size); + ui->sizeY->setEnabled(valid_size); + ui->boundsType->setCurrentIndex(int(osi.bounds_type)); ui->boundsAlign->setCurrentIndex(boundsAlignIndex); ui->boundsWidth->setValue(osi.bounds.x); @@ -308,15 +314,23 @@ void OBSBasicTransform::OnControlChanged() return; obs_source_t *source = obs_sceneitem_get_source(item); - double width = double(obs_source_get_width(source)); - double height = double(obs_source_get_height(source)); + uint32_t source_cx = obs_source_get_width(source); + uint32_t source_cy = obs_source_get_height(source); + double width = double(source_cx); + double height = double(source_cy); obs_transform_info oti; + obs_sceneitem_get_info(item, &oti); + + /* do not scale a source if it has 0 width/height */ + if (source_cx != 0 && source_cy != 0) { + oti.scale.x = float(ui->sizeX->value() / width); + oti.scale.y = float(ui->sizeY->value() / height); + } + oti.pos.x = float(ui->positionX->value()); oti.pos.y = float(ui->positionY->value()); oti.rot = float(ui->rotation->value()); - oti.scale.x = float(ui->sizeX->value() / width); - oti.scale.y = float(ui->sizeY->value() / height); oti.alignment = listToAlign[ui->align->currentIndex()]; oti.bounds_type = (obs_bounds_type)ui->boundsType->currentIndex();