mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
fix(ui): clamp symmetry steps to generation steps
Also renamed the variables to `horizontalSymmetrySteps` as `TimePercentage` is not accurate.
This commit is contained in:
parent
f9a1afd09c
commit
3858bef185
@ -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)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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>
|
||||||
</>
|
</>
|
||||||
|
@ -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}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user