66 lines
2.6 KiB
Python
66 lines
2.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright (C) 2023 Ilia Kurochkin <brothermechanic@gmail.com>
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
'''
|
|
DESCRIPTION.
|
|
Basic mesh processing for asset pipeline.
|
|
'''
|
|
__version__ = '0.1'
|
|
|
|
import logging
|
|
import bpy
|
|
import math
|
|
|
|
from blender.utils.object_relations import parenting
|
|
from blender.utils.collection_tools import remove_collections_with_objects
|
|
from blender.utils.mesh_tools import collect_less_volume_objs
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def hightpoly_collections_to_midpoly(collection_name, part_names, lcs_pipeline, **cg_config):
|
|
''' Convert part's collecttions to single objects. '''
|
|
logger.info('Midpoly objects creation launched...')
|
|
midpoly_obj_names = []
|
|
for part_name in part_names:
|
|
midpoly_name = '_'.join((part_name, cg_config['midpoly']))
|
|
midpoly_mesh = bpy.data.meshes.new(midpoly_name)
|
|
midpoly_obj = bpy.data.objects.new(midpoly_name, midpoly_mesh)
|
|
bpy.context.view_layer.update()
|
|
if lcs_pipeline:
|
|
lcs_inlet = bpy.data.objects[part_name].parent
|
|
midpoly_obj.matrix_world = lcs_inlet.matrix_world.copy()
|
|
parenting(lcs_inlet, midpoly_obj)
|
|
midpoly_parts_col = bpy.data.collections[collection_name]
|
|
midpoly_parts_col.objects.link(midpoly_obj)
|
|
for col in midpoly_parts_col.children:
|
|
# only for current part
|
|
if part_name not in col.name:
|
|
continue
|
|
bpy.ops.object.select_all(action='DESELECT')
|
|
exclude_objs = collect_less_volume_objs(col.objects, min_volume=2.0e-06)
|
|
for obj in col.objects:
|
|
if obj not in exclude_objs:
|
|
obj.select_set(state=True)
|
|
midpoly_obj.select_set(state=True)
|
|
bpy.context.view_layer.objects.active = midpoly_obj
|
|
bpy.ops.object.join()
|
|
bpy.ops.object.shade_smooth(use_auto_smooth=True)
|
|
break
|
|
midpoly_obj_names.append(midpoly_name)
|
|
|
|
midpoly_parts_col.name = cg_config['midpoly_col_name']
|
|
for col in midpoly_parts_col.children:
|
|
remove_collections_with_objects(col)
|
|
|
|
logger.info('Setup of %s midpoly meshes is finished!', len(part_names))
|
|
return midpoly_obj_names
|