fix(ui): clamp symmetry steps to generation steps

Also renamed the variables to `horizontalSymmetrySteps` as `TimePercentage` is not accurate.
This commit is contained in:
psychedelicious 2023-02-25 11:56:09 +11:00
parent f9a1afd09c
commit 3858bef185
5 changed files with 56 additions and 36 deletions

View File

@ -144,8 +144,8 @@ export const frontendToBackendParameters = (
variationAmount, variationAmount,
width, width,
shouldUseSymmetry, shouldUseSymmetry,
horizontalSymmetryTimePercentage, horizontalSymmetrySteps,
verticalSymmetryTimePercentage, verticalSymmetrySteps,
} = generationState; } = generationState;
const { const {
@ -185,17 +185,17 @@ export const frontendToBackendParameters = (
// Symmetry Settings // Symmetry Settings
if (shouldUseSymmetry) { if (shouldUseSymmetry) {
if (horizontalSymmetryTimePercentage > 0) { if (horizontalSymmetrySteps > 0) {
generationParameters.h_symmetry_time_pct = Math.max( generationParameters.h_symmetry_time_pct = Math.max(
0, 0,
Math.min(1, horizontalSymmetryTimePercentage / steps) Math.min(1, horizontalSymmetrySteps / steps)
); );
} }
if (verticalSymmetryTimePercentage > 0) { if (verticalSymmetrySteps > 0) {
generationParameters.v_symmetry_time_pct = Math.max( generationParameters.v_symmetry_time_pct = Math.max(
0, 0,
Math.min(1, verticalSymmetryTimePercentage / steps) Math.min(1, verticalSymmetrySteps / steps)
); );
} }
} }

View File

@ -2,18 +2,18 @@ import { RootState } from 'app/store';
import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/storeHooks';
import IAISlider from 'common/components/IAISlider'; import IAISlider from 'common/components/IAISlider';
import { import {
setHorizontalSymmetryTimePercentage, setHorizontalSymmetrySteps,
setVerticalSymmetryTimePercentage, setVerticalSymmetrySteps,
} from 'features/parameters/store/generationSlice'; } from 'features/parameters/store/generationSlice';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
export default function SymmetrySettings() { export default function SymmetrySettings() {
const horizontalSymmetryTimePercentage = useAppSelector( const horizontalSymmetrySteps = useAppSelector(
(state: RootState) => state.generation.horizontalSymmetryTimePercentage (state: RootState) => state.generation.horizontalSymmetrySteps
); );
const verticalSymmetryTimePercentage = useAppSelector( const verticalSymmetrySteps = useAppSelector(
(state: RootState) => state.generation.verticalSymmetryTimePercentage (state: RootState) => state.generation.verticalSymmetrySteps
); );
const steps = useAppSelector((state: RootState) => state.generation.steps); const steps = useAppSelector((state: RootState) => state.generation.steps);
@ -26,28 +26,28 @@ export default function SymmetrySettings() {
<> <>
<IAISlider <IAISlider
label={t('parameters.hSymmetryStep')} label={t('parameters.hSymmetryStep')}
value={horizontalSymmetryTimePercentage} value={horizontalSymmetrySteps}
onChange={(v) => dispatch(setHorizontalSymmetryTimePercentage(v))} onChange={(v) => dispatch(setHorizontalSymmetrySteps(v))}
min={0} min={0}
max={steps} max={steps}
step={1} step={1}
withInput withInput
withSliderMarks withSliderMarks
withReset withReset
handleReset={() => dispatch(setHorizontalSymmetryTimePercentage(0))} handleReset={() => dispatch(setHorizontalSymmetrySteps(0))}
sliderMarkRightOffset={-6} sliderMarkRightOffset={-6}
></IAISlider> ></IAISlider>
<IAISlider <IAISlider
label={t('parameters.vSymmetryStep')} label={t('parameters.vSymmetryStep')}
value={verticalSymmetryTimePercentage} value={verticalSymmetrySteps}
onChange={(v) => dispatch(setVerticalSymmetryTimePercentage(v))} onChange={(v) => dispatch(setVerticalSymmetrySteps(v))}
min={0} min={0}
max={steps} max={steps}
step={1} step={1}
withInput withInput
withSliderMarks withSliderMarks
withReset withReset
handleReset={() => dispatch(setVerticalSymmetryTimePercentage(0))} handleReset={() => dispatch(setVerticalSymmetrySteps(0))}
sliderMarkRightOffset={-6} sliderMarkRightOffset={-6}
></IAISlider> ></IAISlider>
</> </>

View File

@ -3,7 +3,10 @@ import { useAppDispatch, useAppSelector } from 'app/storeHooks';
import IAINumberInput from 'common/components/IAINumberInput'; import IAINumberInput from 'common/components/IAINumberInput';
import IAISlider from 'common/components/IAISlider'; import IAISlider from 'common/components/IAISlider';
import { setSteps } from 'features/parameters/store/generationSlice'; import {
clampSymmetrySteps,
setSteps,
} from 'features/parameters/store/generationSlice';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
export default function MainSteps() { export default function MainSteps() {
@ -14,7 +17,13 @@ export default function MainSteps() {
); );
const { t } = useTranslation(); const { t } = useTranslation();
const handleChangeSteps = (v: number) => dispatch(setSteps(v)); const handleChangeSteps = (v: number) => {
dispatch(setSteps(v));
};
const handleBlur = () => {
dispatch(clampSymmetrySteps());
};
return shouldUseSliders ? ( return shouldUseSliders ? (
<IAISlider <IAISlider
@ -41,6 +50,7 @@ export default function MainSteps() {
width="auto" width="auto"
styleClass="main-settings-block" styleClass="main-settings-block"
textAlign="center" textAlign="center"
onBlur={handleBlur}
/> />
); );
} }

View File

@ -5,6 +5,7 @@ import IAIButton, { IAIButtonProps } from 'common/components/IAIButton';
import IAIIconButton, { import IAIIconButton, {
IAIIconButtonProps, IAIIconButtonProps,
} from 'common/components/IAIIconButton'; } from 'common/components/IAIIconButton';
import { clampSymmetrySteps } from 'features/parameters/store/generationSlice';
import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; import { activeTabNameSelector } from 'features/ui/store/uiSelectors';
import { useHotkeys } from 'react-hotkeys-hook'; import { useHotkeys } from 'react-hotkeys-hook';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@ -30,6 +31,7 @@ export default function InvokeButton(props: InvokeButton) {
useHotkeys( useHotkeys(
['ctrl+enter', 'meta+enter'], ['ctrl+enter', 'meta+enter'],
() => { () => {
dispatch(clampSymmetrySteps());
dispatch(generateImage(activeTabName)); dispatch(generateImage(activeTabName));
}, },
{ {

View File

@ -4,6 +4,7 @@ import * as InvokeAI from 'app/invokeai';
import { getPromptAndNegative } from 'common/util/getPromptAndNegative'; import { getPromptAndNegative } from 'common/util/getPromptAndNegative';
import promptToString from 'common/util/promptToString'; import promptToString from 'common/util/promptToString';
import { seedWeightsToString } from 'common/util/seedWeightPairs'; import { seedWeightsToString } from 'common/util/seedWeightPairs';
import { clamp } from 'lodash';
export interface GenerationState { export interface GenerationState {
cfgScale: number; cfgScale: number;
@ -33,8 +34,8 @@ export interface GenerationState {
variationAmount: number; variationAmount: number;
width: number; width: number;
shouldUseSymmetry: boolean; shouldUseSymmetry: boolean;
horizontalSymmetryTimePercentage: number; horizontalSymmetrySteps: number;
verticalSymmetryTimePercentage: number; verticalSymmetrySteps: number;
} }
const initialGenerationState: GenerationState = { const initialGenerationState: GenerationState = {
@ -64,8 +65,8 @@ const initialGenerationState: GenerationState = {
variationAmount: 0.1, variationAmount: 0.1,
width: 512, width: 512,
shouldUseSymmetry: false, shouldUseSymmetry: false,
horizontalSymmetryTimePercentage: 0, horizontalSymmetrySteps: 0,
verticalSymmetryTimePercentage: 0, verticalSymmetrySteps: 0,
}; };
const initialState: GenerationState = initialGenerationState; const initialState: GenerationState = initialGenerationState;
@ -99,6 +100,18 @@ export const generationSlice = createSlice({
setSteps: (state, action: PayloadAction<number>) => { setSteps: (state, action: PayloadAction<number>) => {
state.steps = action.payload; state.steps = action.payload;
}, },
clampSymmetrySteps: (state) => {
state.horizontalSymmetrySteps = clamp(
state.horizontalSymmetrySteps,
0,
state.steps
);
state.verticalSymmetrySteps = clamp(
state.verticalSymmetrySteps,
0,
state.steps
);
},
setCfgScale: (state, action: PayloadAction<number>) => { setCfgScale: (state, action: PayloadAction<number>) => {
state.cfgScale = action.payload; state.cfgScale = action.payload;
}, },
@ -334,22 +347,17 @@ export const generationSlice = createSlice({
setShouldUseSymmetry: (state, action: PayloadAction<boolean>) => { setShouldUseSymmetry: (state, action: PayloadAction<boolean>) => {
state.shouldUseSymmetry = action.payload; state.shouldUseSymmetry = action.payload;
}, },
setHorizontalSymmetryTimePercentage: ( setHorizontalSymmetrySteps: (state, action: PayloadAction<number>) => {
state, state.horizontalSymmetrySteps = action.payload;
action: PayloadAction<number>
) => {
state.horizontalSymmetryTimePercentage = action.payload;
}, },
setVerticalSymmetryTimePercentage: ( setVerticalSymmetrySteps: (state, action: PayloadAction<number>) => {
state, state.verticalSymmetrySteps = action.payload;
action: PayloadAction<number>
) => {
state.verticalSymmetryTimePercentage = action.payload;
}, },
}, },
}); });
export const { export const {
clampSymmetrySteps,
clearInitialImage, clearInitialImage,
resetParametersState, resetParametersState,
resetSeed, resetSeed,
@ -384,8 +392,8 @@ export const {
setVariationAmount, setVariationAmount,
setWidth, setWidth,
setShouldUseSymmetry, setShouldUseSymmetry,
setHorizontalSymmetryTimePercentage, setHorizontalSymmetrySteps,
setVerticalSymmetryTimePercentage, setVerticalSymmetrySteps,
} = generationSlice.actions; } = generationSlice.actions;
export default generationSlice.reducer; export default generationSlice.reducer;