diff --git a/__init__.py b/__init__.py index 88c9685..28c6c3a 100644 --- a/__init__.py +++ b/__init__.py @@ -435,7 +435,9 @@ class FONT3D_OT_TestFont(bpy.types.Operator): ob = bpy.data.objects.new(f"{glyph_id}", glyph.data) - if selected.type == "CURVE": + distribution_type = 'CALCULATE' + + if selected.type == "CURVE" and distribution_type == 'FOLLOW_PATH': distribution_type = "FOLLOW_PATH" curve_length = butils.get_curve_length(selected) @@ -446,9 +448,25 @@ class FONT3D_OT_TestFont(bpy.types.Operator): ob.constraints["Follow Path"].use_curve_follow = True ob.constraints["Follow Path"].forward_axis = "FORWARD_X" ob.constraints["Follow Path"].up_axis = "UP_Y" - # samplecurve = nodes.new(type="GeometryNodeSampleCurve") # butils.ShowMessageBox("WHAT","INFO","I don't really know what you mean, lsaidry") + elif selected.type == "CURVE" and distribution_type == 'CALCULATE': + location, tangent = butils.calc_point_on_bezier_curve(selected, advance, True) + ob.location = selected.matrix_world @ location + mask = [0] + input_rotations = [mathutils.Vector((0.0, 0.0, 0.0))] + vectors = [tangent] + factors = [1.0] + local_main_axis = mathutils.Vector((1.0, 0.0, 0.0)) + motor = butils.align_rotations_auto_pivot(mask, + input_rotations, + vectors, + factors, + local_main_axis) + + ob.rotation_quaternion = (selected.matrix_world @ motor[0]).to_quaternion() + print("what") + else: offset.x = advance ob.location = selected.location + offset @@ -553,7 +571,7 @@ class FONT3D_OT_SaveFontToFile(bpy.types.Operator): # get save data selected_font = font3d_data.available_fonts[font3d_data.active_font_index] - print(selected_font.font_name) + # print(selected_font.font_name) self.report({'INFO'}, f"{bl_info['name']}: {selected_font.font_name}") preferences = getPreferences(context) print(f"assets folder: {preferences.assets_dir}") @@ -673,6 +691,35 @@ class FONT3D_OT_CreateFontFromObjects(bpy.types.Operator): return {'FINISHED'} +class HelloWorldPanel(bpy.types.Panel): + """Creates a Panel in the Object properties window""" + bl_label = "Hello World Panel" + bl_idname = "OBJECT_PT_hello" + bl_space_type = 'PROPERTIES' + bl_region_type = 'WINDOW' + bl_context = "object" + + def draw(self, context): + layout = self.layout + scene = context.scene + font3d = scene.font3d + font3d_data = scene.font3d_data + + obj = context.active_object + + row = layout.row() + row.label(text="Hello world!", icon='WORLD_DATA') + + row = layout.row() + row.label(text="Active object is: " + obj.name) + row = layout.row() + row.prop(obj, "location") + + row = layout.row() + row.operator("mesh.primitive_cube_add") + + + classes = ( FONT3D_addonPreferences, FONT3D_OT_Font3D, @@ -691,6 +738,7 @@ classes = ( FONT3D_OT_ToggleFont3DCollection, FONT3D_OT_SaveFontToFile, FONT3D_OT_CreateFontFromObjects, + HelloWorldPanel, ) def register(): diff --git a/butils.py b/butils.py index c3daade..9fb4f91 100644 --- a/butils.py +++ b/butils.py @@ -30,14 +30,14 @@ def get_parent_collection_names(collection, parent_names): # Ensure it's a curve object # TODO: no raising, please -def get_curve_length(curve_obj, num_samples = 100): +def get_curve_length(curve_obj, resolution = -1): total_length = 0 curve = curve_obj.data # Loop through all splines in the curve for spline in curve.splines: - total_length = total_length + spline.calc_length() + total_length = total_length + spline.calc_length(resolution=resolution) return total_length @@ -74,8 +74,8 @@ def align_rotations_auto_pivot(mask, input_rotations, vectors, factors, local_ma old_rotation = input_rotation.to_matrix() old_axis = (old_rotation @ local_main_axis).normalized() new_axis = vector - # rotation_axis = (-(old_axis) + new_axis).normalized() - rotation_axis = old_axis.cross(new_axis).normalized() + rotation_axis = (-(old_axis) + new_axis).normalized() + # rotation_axis = old_axis.cross(new_axis).normalized() if rotation_axis.length < 1e-6: # Vectors are linearly dependent, fallback to another axis @@ -163,7 +163,7 @@ def calc_point_on_bezier_spline(bezier_spline_obj, if iterated_distance + lengths[i] > distance: distance_on_bezier = (distance - iterated_distance) d = distance_on_bezier / lengths[i] - print(f"i: {i}, d: {d}, distance_on_bezier: {distance_on_bezier}, distance: {distance}") + # print(f"i: {i}, d: {d}, distance_on_bezier: {distance_on_bezier}, distance: {distance}") location = calc_point_on_bezier(beziers[i][0], beziers[i][1], d) @@ -386,13 +386,31 @@ def set_text_on_curve(text_properties): ob = bpy.data.objects.new(f"{glyph_id}", glyph.data) - ob.constraints.new(type='FOLLOW_PATH') - ob.constraints["Follow Path"].target = mom - ob.constraints["Follow Path"].use_fixed_location = True - ob.constraints["Follow Path"].offset_factor = advance / curve_length - ob.constraints["Follow Path"].use_curve_follow = True - ob.constraints["Follow Path"].forward_axis = "FORWARD_X" - ob.constraints["Follow Path"].up_axis = "UP_Y" + distribution_type = 'CALCULATE' + if distribution_type == 'FOLLOW_PATH': + ob.constraints.new(type='FOLLOW_PATH') + ob.constraints["Follow Path"].target = mom + ob.constraints["Follow Path"].use_fixed_location = True + ob.constraints["Follow Path"].offset_factor = advance / curve_length + ob.constraints["Follow Path"].use_curve_follow = True + ob.constraints["Follow Path"].forward_axis = "FORWARD_X" + ob.constraints["Follow Path"].up_axis = "UP_Y" + elif distribution_type == 'CALCULATE': + location, tangent = calc_point_on_bezier_curve(mom, advance, True) + ob.location = mom.matrix_world @ location + mask = [0] + input_rotations = [mathutils.Vector((radians(90.0), 0.0, 0.0))] + vectors = [tangent] + factors = [1.0] + local_main_axis = mathutils.Vector((1.0, 0.0, 0.0)) + motor = align_rotations_auto_pivot(mask, + input_rotations, + vectors, + factors, + local_main_axis) + if ob.rotation_mode != 'QUATERNION': + ob.rotation_mode = 'QUATERNION' + ob.rotation_quaternion = (mom.matrix_world @ motor[0]).to_quaternion() scalor = 0.001 diff --git a/common/Font.py b/common/Font.py index 5a9ca17..7a96998 100644 --- a/common/Font.py +++ b/common/Font.py @@ -97,7 +97,7 @@ def get_glyph(font_name, face_name, glyph_id): :return: returns the glyph object, or ``None`` if it does not exist :rtype: `Object` """ - print(fonts) + # print(fonts) if not fonts.keys().__contains__(font_name): print(f"FONT3D::get_glyph: font name({font_name}) not found") print(fonts.keys())