133 lines
5.0 KiB
Python
133 lines
5.0 KiB
Python
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
## Standalone based on SPA code
|
|
## Code from create_gp_texture_ref.py (Copyright (C) 2023, The SPA Studios. All rights reserved.)
|
|
## adapted to create as a single 'GP as image' and fit in camera with driver
|
|
|
|
import bpy
|
|
from bpy_extras.io_utils import ImportHelper
|
|
from bpy.props import (StringProperty,
|
|
CollectionProperty,
|
|
BoolProperty,
|
|
EnumProperty)
|
|
import json
|
|
import bpy_extras
|
|
from mathutils import Vector
|
|
import os
|
|
from pathlib import Path
|
|
from .. import core
|
|
from .. constants import *
|
|
from .. export_psd_layers import export_psd_bg
|
|
from . core import import_planes, get_json_infos, reload_bg_list
|
|
|
|
|
|
|
|
class BPM_OT_import_bg_images(bpy.types.Operator, ImportHelper):
|
|
bl_idname = "bpm.import_bg_images"
|
|
bl_label = "Import Background images"
|
|
bl_description = "Import either a Json, a PSD, multiple files"
|
|
bl_options = {"REGISTER"} # , "INTERNAL"
|
|
|
|
# filename_ext = '.json'
|
|
|
|
filter_glob: StringProperty(
|
|
default=';'.join([f'*{i}' for i in bpy.path.extensions_image]) + ';*.json',
|
|
options={'HIDDEN'} )
|
|
|
|
## Active selection
|
|
filepath : StringProperty(
|
|
name="File Path",
|
|
description="File path used for import",
|
|
maxlen= 1024) # the active file
|
|
|
|
## Handle multi-selection
|
|
files: CollectionProperty(
|
|
name="File Path",
|
|
type=bpy.types.OperatorFileListElement,
|
|
) # The filelist collection
|
|
|
|
## Choice to place before or after ?
|
|
|
|
import_type : EnumProperty(
|
|
name="Import As", description="Type of import to ", default='GPENCIL', options={'ANIMATABLE'},
|
|
items=(
|
|
('GPENCIL', 'Gpencil Object', 'Import bg planes as gpencil objects', 0),
|
|
('EMPTY', 'Empty Reference', 'Import bg planes as empty objects', 1),
|
|
('MESH', 'Texture Plane', 'Import bg planes as mesh objects', 2),
|
|
))
|
|
|
|
mode : EnumProperty(
|
|
name="Mode", description="", default='REPLACE', options={'ANIMATABLE'},
|
|
items=(
|
|
('REPLACE', 'Replace Existing', 'Replace the image if already exists', 0),
|
|
('SKIP', 'Skip Existing', 'Skip the import if the image alreaady exists in planes', 1),
|
|
# ('PURGE', 'Purge', 'When object exists, fully delete it before linking, even associated collection and holder', 2),
|
|
))
|
|
|
|
# import_psd_as_image : BoolProperty(name='Import PSD as Image (no content extraction)',
|
|
# description='Direct import of the PSD, otherwise extract using psd_tools'
|
|
# default=False)
|
|
|
|
def execute(self, context):
|
|
org_image_size = None
|
|
scn = context.scene
|
|
active_file = Path(self.filepath)
|
|
|
|
if len(self.files) == 1 and active_file.suffix.lower() in ('.json', '.psd'):
|
|
json_path = None
|
|
print('active_file.suffix.lower(): ', active_file.suffix.lower())
|
|
if active_file.suffix.lower() == '.psd':
|
|
print('Is a PSD')
|
|
## Export layers and create json setup file
|
|
# Export passes in a 'render' or 'render_hd' folder aside psd
|
|
json_path = export_psd_bg(str(active_file))
|
|
|
|
elif active_file.suffix.lower() == '.json':
|
|
print('Is a json')
|
|
# Use json data to batch import
|
|
json_path = active_file
|
|
|
|
if not json_path:
|
|
self.report({'ERROR'}, 'No json path to load, you can try loading from psd or selecting image file directly')
|
|
return {'CANCELLED'}
|
|
|
|
file_list, org_image_size = get_json_infos(json_path)
|
|
folder = Path(json_path).parent # render folder
|
|
|
|
else:
|
|
folder = active_file.parent
|
|
# Filter out json (we may want ot import the PSD as imagelisted in bpy.path.extensions_image)
|
|
file_list = [folder / f.name for f in self.files if Path(f.name).suffix in bpy.path.extensions_image]
|
|
|
|
if not file_list:
|
|
self.report({'ERROR'}, 'Image file list is empty')
|
|
return {'CANCELLED'}
|
|
|
|
|
|
## simple_list
|
|
# existing_backgrounds = [o for o in context.scene.objects if o.get('is_background')]
|
|
# existing_holders = [o for o in context.scene.objects if o.name.startswith(PREFIX) and o.type == 'MESH' and o.children]
|
|
|
|
## Has dict
|
|
# existing_backgrounds = {o : img_info for o in context.scene.objects if o.get('is_background') and (img_info := o.get('is_background'))}
|
|
|
|
# FIXME: Use existing background custom prop? : o.get('is_background')
|
|
## list of Tuples : [(plane_object, img_data, transparency_value), ...]
|
|
|
|
import_planes(file_list, import_type=self.import_type, image_size=org_image_size)
|
|
reload_bg_list(scene=scn)
|
|
|
|
return {"FINISHED"}
|
|
|
|
classes = (
|
|
BPM_OT_import_bg_images,
|
|
)
|
|
|
|
def register():
|
|
for cls in classes:
|
|
bpy.utils.register_class(cls)
|
|
|
|
def unregister():
|
|
for cls in reversed(classes):
|
|
bpy.utils.unregister_class(cls)
|