This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/release/scripts/startup/bl_operators/gpencil_mesh_bake.py
Antonio Vazquez bc7a4b126a GPencil: Convert and Bake mesh animation to grease pencil strokes
This patch adds two options:

- Convert a mesh to grease pencil strokes.
- Bake the mesh animation into grease pencil strokes.

Both are related and must be included in the same patch.

Related to tasks: T77629 and T77630

Notice: The conversion is done for mesh edges and it's not considering any visibility clipping. All edges are exported, no matters if it's visible or not.

Example of Convert a Mesh to Grease Pencil strokes:

{F8606028}

This conversion was inspired by the technique used by @luamono in this tweet: https://twitter.com/luamono/status/1239983662176841730

Example of Bake Animation (the video is a little outdate, but the basic functionality is the same, only small changes in UI):

{F8606032}

Reviewed By: mendio, pepeland

Maniphest Tasks: T77629, T77630

Differential Revision: https://developer.blender.org/D7983
2020-06-16 15:28:46 +02:00

163 lines
4.7 KiB
Python

# ##### BEGIN GPL LICENSE BLOCK #####
#
# 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 2
# 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.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# <pep8-80 compliant>
import bpy
from bpy.types import Operator
from bpy.props import (
IntProperty,
FloatProperty,
BoolProperty,
EnumProperty,
)
gp_object_items = []
def my_objlist_callback(scene, context):
gp_object_items.clear()
gp_object_items.append(('*NEW', "New Object", ""))
for o in context.scene.objects:
if o.type == 'GPENCIL':
gp_object_items.append((o.name, o.name, ""))
return gp_object_items
class GPENCIL_OT_mesh_bake(Operator):
"""Bake all mesh animation into grease pencil strokes"""
bl_idname = "gpencil.mesh_bake"
bl_label = "Bake Mesh to Grease Pencil"
bl_options = {'REGISTER', 'UNDO'}
frame_start: IntProperty(
name="Start Frame",
description="Start frame for baking",
min=0, max=300000,
default=1,
)
frame_end: IntProperty(
name="End Frame",
description="End frame for baking",
min=1, max=300000,
default=250,
)
step: IntProperty(
name="Frame Step",
description="Frame Step",
min=1, max=120,
default=1,
)
thickness: IntProperty(
name="Thickness",
description="Thickness of the stroke lines",
min=1, max=100,
default=1,
)
angle: FloatProperty(
name="Threshold Angle",
description="Threshold to determine ends of the strokes",
min=0,
max=+3.141592,
default=+1.22173, # 70 Degress
subtype='ANGLE',
)
offset: FloatProperty(
name="Stroke Offset",
description="Offset strokes from fill",
soft_min=0.0, soft_max=100.0,
min=0.0, max=100.0,
default=0.001,
precision=3,
step=1,
subtype='DISTANCE',
unit='LENGTH',
)
seams: BoolProperty(
name="Only Seam Edges",
description="Convert only seam edges",
default=False,
)
faces: BoolProperty(
name="Export Faces",
description="Export faces as filled strokes",
default=True,
)
target: EnumProperty(
name="Target Object",
description="Grease Pencil Object",
items=my_objlist_callback
)
frame_target: IntProperty(
name="Target Frame",
description="Destination frame for the baked animation",
min=1, max=300000,
default=1,
)
project_type: EnumProperty(
name="Reproject Type",
description="Type of projection",
items=(
("KEEP", "No Reproject", ""),
("FRONT", "Front", "Reproject the strokes using the X-Z plane"),
("SIDE", "Side", "Reproject the strokes using the Y-Z plane"),
("TOP", "Top", "Reproject the strokes using the X-Y plane"),
("VIEW", "View", "Reproject the strokes to current viewpoint"),
("CURSOR", "Cursor", "Reproject the strokes using the orientation of 3D cursor")
)
)
@classmethod
def poll(self, context):
ob = context.active_object
return ((ob is not None) and
(ob.type in {'EMPTY', 'MESH'}) and
(context.mode == 'OBJECT'))
def execute(self, context):
bpy.ops.gpencil.bake_mesh_animation(
frame_start=self.frame_start,
frame_end=self.frame_end,
step=self.step,
angle=self.angle,
thickness=self.thickness,
seams=self.seams,
faces=self.faces,
offset=self.offset,
target=self.target,
frame_target=self.frame_target,
project_type=self.project_type
)
return {'FINISHED'}
def invoke(self, context, _event):
scene = context.scene
self.frame_start = scene.frame_start
self.frame_end = scene.frame_end
self.frame_target = scene.frame_start
wm = context.window_manager
return wm.invoke_props_dialog(self)
classes = (
GPENCIL_OT_mesh_bake,
)