1.0.0
This commit is contained in:
BIN
dist/text_texture_generator_v1.0.0.zip
vendored
BIN
dist/text_texture_generator_v1.0.0.zip
vendored
Binary file not shown.
BIN
dist/text_texture_generator_v1.0.0_free.zip
vendored
BIN
dist/text_texture_generator_v1.0.0_free.zip
vendored
Binary file not shown.
Binary file not shown.
@@ -688,21 +688,26 @@ def generate_texture_image(props, width, height):
|
|||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
def generate_preview(props, preview_width=512, preview_height=512):
|
def generate_preview(props, preview_width=None, preview_height=None):
|
||||||
pass
|
pass
|
||||||
"""
|
"""
|
||||||
Generate a preview version of the texture at lower resolution.
|
Generate a preview version of the texture at lower resolution.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
props: Text texture properties object
|
props: Text texture properties object
|
||||||
preview_width: Preview image width (default: 512)
|
preview_width: Preview image width. Defaults to the texture width if available.
|
||||||
preview_height: Preview image height (default: 512)
|
preview_height: Preview image height. Defaults to the texture height if available.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Blender image object or None on error
|
Blender image object or None on error
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
pass
|
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
|
# Generate at preview resolution
|
||||||
result = generate_texture_image(props, preview_width, preview_height)
|
result = generate_texture_image(props, preview_width, preview_height)
|
||||||
|
|||||||
Binary file not shown.
@@ -162,37 +162,65 @@ class TEXT_TEXTURE_OT_preview(Operator):
|
|||||||
# Get properties and generate preview with correct parameters
|
# Get properties and generate preview with correct parameters
|
||||||
props = context.scene.text_texture_props
|
props = context.scene.text_texture_props
|
||||||
preview_size = props.preview_size if hasattr(props, 'preview_size') else 512
|
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:
|
if result:
|
||||||
pass
|
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
|
# Always open a dedicated window to show the preview image
|
||||||
# Find or create an image editor area
|
try:
|
||||||
for area in context.screen.areas:
|
|
||||||
pass
|
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
|
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
|
pass
|
||||||
if space.type == 'IMAGE_EDITOR':
|
if space.type == 'IMAGE_EDITOR':
|
||||||
pass
|
pass
|
||||||
space.image = result
|
space.image = result
|
||||||
area.tag_redraw()
|
image_area.tag_redraw()
|
||||||
break
|
break
|
||||||
break
|
else:
|
||||||
else:
|
pass
|
||||||
|
self.report({'WARNING'}, "Could not find area to display preview in new window")
|
||||||
|
except Exception as window_err:
|
||||||
pass
|
pass
|
||||||
# If no image editor found, try to open in UV editor or create viewer
|
self.report({'WARNING'}, f"Preview window open failed: {window_err}. Showing in current window.")
|
||||||
try:
|
|
||||||
|
# Fallback to setting image in any existing image editor
|
||||||
|
for area in context.screen.areas:
|
||||||
pass
|
pass
|
||||||
# Try to show in any available viewer
|
if area.type == 'IMAGE_EDITOR':
|
||||||
bpy.ops.image.view_all('INVOKE_DEFAULT')
|
pass
|
||||||
except:
|
for space in area.spaces:
|
||||||
pass
|
pass
|
||||||
# Fallback message
|
if space.type == 'IMAGE_EDITOR':
|
||||||
self.report({'INFO'}, f"Preview '{result.name}' created - open Image Editor to view")
|
pass
|
||||||
|
space.image = result
|
||||||
|
area.tag_redraw()
|
||||||
|
break
|
||||||
|
break
|
||||||
|
|
||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
else:
|
else:
|
||||||
@@ -720,4 +748,4 @@ __all__ = [
|
|||||||
'TEXT_TEXTURE_OT_generate',
|
'TEXT_TEXTURE_OT_generate',
|
||||||
'TEXT_TEXTURE_OT_preview',
|
'TEXT_TEXTURE_OT_preview',
|
||||||
'TEXT_TEXTURE_OT_generate_shader',
|
'TEXT_TEXTURE_OT_generate_shader',
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1027,6 +1027,42 @@ class TestGeneratePreview:
|
|||||||
# The image name contains dimensions
|
# The image name contains dimensions
|
||||||
call_args = mock_bpy.data.images.new.call_args[0]
|
call_args = mock_bpy.data.images.new.call_args[0]
|
||||||
assert "128x128" in 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):
|
def test_preview_uses_same_props(self):
|
||||||
"""Test that preview uses same properties as main generation."""
|
"""Test that preview uses same properties as main generation."""
|
||||||
|
|||||||
Reference in New Issue
Block a user