Faster and better batch reproject
2.4.0 - changed: Batch reproject consider camera movement and is almost 8x faster - added: Batch reproject have "Current" mode (using current tool setting)
This commit is contained in:
@@ -263,10 +263,12 @@ def remapping(value, leftMin, leftMax, rightMin, rightMax):
|
||||
### GP funcs
|
||||
# -----------------
|
||||
|
||||
def get_gp_draw_plane(context, obj=None):
|
||||
""" V1
|
||||
def get_gp_draw_plane(obj=None):
|
||||
''' return tuple with plane coordinate and normal
|
||||
of the curent drawing accordign to geometry'''
|
||||
|
||||
context = bpy.context
|
||||
settings = context.scene.tool_settings
|
||||
orient = settings.gpencil_sculpt.lock_axis #'VIEW', 'AXIS_Y', 'AXIS_X', 'AXIS_Z', 'CURSOR'
|
||||
loc = settings.gpencil_stroke_placement_view3d #'ORIGIN', 'CURSOR', 'SURFACE', 'STROKE'
|
||||
@@ -307,6 +309,46 @@ def get_gp_draw_plane(context, obj=None):
|
||||
plane_no.rotate(context.scene.cursor.matrix)
|
||||
|
||||
return plane_co, plane_no
|
||||
"""
|
||||
|
||||
## V2
|
||||
def get_gp_draw_plane(obj=None, orient=None):
|
||||
''' return tuple with plane coordinate and normal
|
||||
of the curent drawing according to geometry'''
|
||||
|
||||
if obj is None:
|
||||
obj = bpy.context.object
|
||||
|
||||
settings = bpy.context.scene.tool_settings
|
||||
if orient is None:
|
||||
orient = settings.gpencil_sculpt.lock_axis #'VIEW', 'AXIS_Y', 'AXIS_X', 'AXIS_Z', 'CURSOR'
|
||||
loc = settings.gpencil_stroke_placement_view3d #'ORIGIN', 'CURSOR', 'SURFACE', 'STROKE'
|
||||
|
||||
mat = obj.matrix_world
|
||||
plane_no = Vector((0.0, 0.0, 1.0))
|
||||
plane_co = mat.to_translation()
|
||||
|
||||
# -> orientation
|
||||
if orient == 'VIEW':
|
||||
mat = bpy.context.scene.camera.matrix_world
|
||||
# -> placement
|
||||
if loc == "CURSOR":
|
||||
plane_co = bpy.context.scene.cursor.location
|
||||
mat = bpy.context.scene.cursor.matrix
|
||||
|
||||
elif orient == 'AXIS_Y':#front (X-Z)
|
||||
plane_no = Vector((0,1,0))
|
||||
|
||||
elif orient == 'AXIS_X':#side (Y-Z)
|
||||
plane_no = Vector((1,0,0))
|
||||
|
||||
elif orient == 'AXIS_Z':#top (X-Y)
|
||||
plane_no = Vector((0,0,1))
|
||||
|
||||
plane_no.rotate(mat)
|
||||
|
||||
return plane_co, plane_no
|
||||
|
||||
|
||||
def check_angle_from_view(obj=None, plane_no=None, context=None):
|
||||
'''Return angle to obj according to chosen drawing axis'''
|
||||
@@ -317,7 +359,7 @@ def check_angle_from_view(obj=None, plane_no=None, context=None):
|
||||
context = bpy.context
|
||||
|
||||
if not plane_no:
|
||||
_plane_co, plane_no = get_gp_draw_plane(context, obj=obj)
|
||||
_plane_co, plane_no = get_gp_draw_plane(obj=obj)
|
||||
view_direction = view3d_utils.region_2d_to_vector_3d(context.region, context.region_data, (context.region.width/2.0, context.region.height/2.0))
|
||||
|
||||
angle = math.degrees(view_direction.angle(plane_no))
|
||||
@@ -498,6 +540,10 @@ from mathutils import Vector
|
||||
### Vector utils 3d
|
||||
# -----------------
|
||||
|
||||
def matrix_transform(coords, matrix):
|
||||
coords_4d = np.column_stack((coords, np.ones(len(coords), dtype='float64')))
|
||||
return np.einsum('ij,aj->ai', matrix, coords_4d)[:, :-1]
|
||||
|
||||
def single_vector_length(v):
|
||||
return sqrt((v[0] * v[0]) + (v[1] * v[1]) + (v[2] * v[2]))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user