This commit is contained in:
2025-10-13 17:01:37 +02:00
parent 57b55b10a2
commit 09f33e461d
7 changed files with 91 additions and 22 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -688,21 +688,26 @@ def generate_texture_image(props, width, height):
traceback.print_exc()
return None, None
def generate_preview(props, preview_width=512, preview_height=512):
def generate_preview(props, preview_width=None, preview_height=None):
pass
"""
Generate a preview version of the texture at lower resolution.
Args:
props: Text texture properties object
preview_width: Preview image width (default: 512)
preview_height: Preview image height (default: 512)
preview_width: Preview image width. Defaults to the texture width if available.
preview_height: Preview image height. Defaults to the texture height if available.
Returns:
Blender image object or None on error
"""
try:
pass
# Use full texture resolution when not explicitly provided
if not preview_width or preview_width <= 0:
preview_width = getattr(props, 'texture_width', 512) or 512
if not preview_height or preview_height <= 0:
preview_height = getattr(props, 'texture_height', 512) or 512
# Generate at preview resolution
result = generate_texture_image(props, preview_width, preview_height)

View File

@@ -162,37 +162,65 @@ class TEXT_TEXTURE_OT_preview(Operator):
# Get properties and generate preview with correct parameters
props = context.scene.text_texture_props
preview_size = props.preview_size if hasattr(props, 'preview_size') else 512
result = generate_preview(props, preview_size, preview_size)
preview_width = getattr(props, 'texture_width', preview_size) or preview_size
preview_height = getattr(props, 'texture_height', preview_size) or preview_size
result = generate_preview(props, preview_width, preview_height)
if result:
pass
self.report({'INFO'}, f"Preview generated at {preview_size}px")
self.report({'INFO'}, f"Preview generated at {preview_width}x{preview_height}px")
# Open the preview image in the image editor
# Find or create an image editor area
for area in context.screen.areas:
# Always open a dedicated window to show the preview image
try:
pass
if area.type == 'IMAGE_EDITOR':
bpy.ops.wm.window_new()
new_window = context.window_manager.windows[-1]
new_screen = new_window.screen
# Try to reuse an existing image editor in the new window
image_area = None
for area in new_screen.areas:
pass
for space in area.spaces:
if area.type == 'IMAGE_EDITOR':
pass
image_area = area
break
# Otherwise convert the largest area to an image editor
if not image_area and new_screen.areas:
pass
image_area = max(new_screen.areas, key=lambda a: a.width * a.height)
image_area.type = 'IMAGE_EDITOR'
if image_area:
pass
for space in image_area.spaces:
pass
if space.type == 'IMAGE_EDITOR':
pass
space.image = result
area.tag_redraw()
image_area.tag_redraw()
break
break
else:
else:
pass
self.report({'WARNING'}, "Could not find area to display preview in new window")
except Exception as window_err:
pass
# If no image editor found, try to open in UV editor or create viewer
try:
self.report({'WARNING'}, f"Preview window open failed: {window_err}. Showing in current window.")
# Fallback to setting image in any existing image editor
for area in context.screen.areas:
pass
# Try to show in any available viewer
bpy.ops.image.view_all('INVOKE_DEFAULT')
except:
pass
# Fallback message
self.report({'INFO'}, f"Preview '{result.name}' created - open Image Editor to view")
if area.type == 'IMAGE_EDITOR':
pass
for space in area.spaces:
pass
if space.type == 'IMAGE_EDITOR':
pass
space.image = result
area.tag_redraw()
break
break
return {'FINISHED'}
else:

View File

@@ -1028,6 +1028,42 @@ class TestGeneratePreview:
call_args = mock_bpy.data.images.new.call_args[0]
assert "128x128" in call_args[0]
def test_preview_defaults_to_texture_resolution(self):
"""Preview falls back to full texture dimensions when none provided."""
with patch('PIL.Image') as mock_pil_image_module, \
patch('PIL.ImageDraw') as mock_pil_imagedraw_module, \
patch('PIL.ImageFont') as mock_pil_imagefont_module, \
patch('src.core.generation_engine.bpy') as mock_bpy:
mock_pil_image = MagicMock()
mock_pil_image.size = (256, 128)
mock_pil_image.getdata.return_value = [(255, 255, 255, 255)] * (256 * 128)
mock_pil_image.transpose.return_value = mock_pil_image
mock_pil_image_module.new.return_value = mock_pil_image
mock_pil_image_module.FLIP_TOP_BOTTOM = 1
mock_draw = MagicMock()
mock_draw.textbbox.return_value = (0, 0, 50, 25)
mock_pil_imagedraw_module.Draw.return_value = mock_draw
mock_font = MagicMock()
mock_pil_imagefont_module.load_default.return_value = mock_font
mock_blender_image = MagicMock()
mock_blender_image.pixels = [0.0] * (256 * 128 * 4)
mock_bpy.data.images.new.return_value = mock_blender_image
mock_bpy.data.images.__contains__.return_value = False
props = create_mock_props(text="AutoSize")
props.texture_width = 256
props.texture_height = 128
result = generate_preview(props)
assert result is not None
call_args = mock_bpy.data.images.new.call_args[0]
assert "256x128" in call_args[0]
def test_preview_uses_same_props(self):
"""Test that preview uses same properties as main generation."""
with patch('PIL.Image') as mock_pil_image_module, \