def test_star_outline(self): lot = objects.Animation() sl = lot.add_layer(objects.ShapeLayer()) star = sl.add_shape(objects.Star()) star.name = "Star" star.rotation.value = 20 star.inner_radius.value = 64 star.outer_radius.value = 128 star.position.value = NVector(256, 256) sl.add_shape(objects.Stroke(Color(1, 1, 0), 10)) sif = builder.to_sif(lot) self.assertEqual(len(sif.layers), 1) self.assertIsInstance(sif.layers[0], api.GroupLayer) grp = sif.layers[0] self.assertEqual(len(grp.layers), 1) self.assertIsInstance(grp.layers[0], api.OutlineLayer) self.assertTrue(grp.active) rgl = grp.layers[0] self.assertEqual(rgl.desc, "Star") self.assertEqual(len(rgl.bline.points), 10) self.assert_nvector_equal(rgl.origin.value, star.position.value) self.assert_nvector_equal(rgl.color.value, sif.make_color(1, 1, 0, 1)) self.assertTrue(rgl.active) self.assertTrue(rgl.bline.loop) self.assertEqual(rgl.width.value, 5)
def test_repeater(self): lot = objects.Animation() sl = lot.add_layer(objects.ShapeLayer()) group = sl.add_shape(objects.Group()) star = group.add_shape(objects.Star()) star.inner_radius.value = 16 star.outer_radius.value = 32 star.position.value = NVector(256, 40) group.add_shape(objects.Fill(Color(1, 1, 0))) group.add_shape(objects.Stroke(Color(0, 0, 0), 3)) group.name = "Star" rep = sl.add_shape(objects.Repeater(4)) rep.name = "Repeater" rep.transform.position.value = NVector(20, 80) rep.transform.end_opacity.value = 20 sif = builder.to_sif(lot) self.assertEqual(len(sif.layers), 1) self.assertIsInstance(sif.layers[0], api.GroupLayer) self.assertEqual(len(sif.layers[0].layers), 1) self.assertIsInstance(sif.layers[0].layers[0], api.GroupLayer) self.assertEqual(sif.layers[0].layers[0].desc, "Repeater") self.assertEqual(len(sif.layers[0].layers[0].layers), 2) duplicate_lay = sif.layers[0].layers[0].layers[1] self.assertIsInstance(duplicate_lay, api.DuplicateLayer) self.assertEqual(duplicate_lay.desc, "Repeater") duplicate = sif.get_object(duplicate_lay.index.id) self.assertIsInstance(duplicate, api.Duplicate) self.assertEqual(duplicate.from_.value, 3) self.assertEqual(duplicate.to.value, 0) self.assertEqual(duplicate.step.value, -1) dup_trans = sif.layers[0].layers[0].layers[0] self.assertIsInstance(dup_trans, api.GroupLayer) self.assertEqual(dup_trans.desc, "Transformation for Repeater") dup_origin = sif.get_object(dup_trans.origin.id) self.assert_nvector_equal(dup_origin.value.value, NVector(0, 0)) trans = dup_trans.transformation self.assertIsInstance(trans.offset, ast.SifAdd) self.assertEqual(trans.offset.rhs.value.id, dup_origin.id) self.assertIsInstance(trans.offset.lhs, ast.SifScale) self.assert_nvector_equal(trans.offset.lhs.link.value, NVector(20, 80)) self.assertEqual(trans.offset.lhs.scalar.value.id, duplicate.id) self.assertIsInstance(trans.angle, ast.SifScale) self.assertEqual(trans.angle.link.value, 0) self.assertEqual(trans.angle.scalar.value.id, duplicate.id) self.assertIsInstance(dup_trans.amount, ast.SifSubtract) self.assertEqual(dup_trans.amount.lhs.value, 1) self.assertIsInstance(dup_trans.amount.rhs, ast.SifScale) self.assertAlmostEqual(dup_trans.amount.rhs.link.value, 0.266666666) self.assertEqual(dup_trans.amount.rhs.scalar.value.id, duplicate.id) self.assertEqual(len(dup_trans.layers), 1) self.assertEqual(dup_trans.layers[0].desc, "Star")
eye2.position.value = Point3D(256 + 50, 256 - 50, -100) g.add_shape(objects.Fill(Color(0, 0, 0))) g = layer.insert_shape(0, objects.Group()) nose = g.add_shape(objects.Ellipse()) nose.size.value = Size(64, 64) nose.position.value = Point3D(256, 256 + 10, -150) g.add_shape(objects.Fill(Color(1, 0, 0))) g = layer.insert_shape(0, objects.Group()) mouth = g.add_shape(objects.Path()) bez = mouth.shape.value bez.add_smooth_point(Point3D(256 - 80, 256 + 30, -80), Point3D(0, 0, 0)) bez.add_smooth_point(Point3D(256, 256 + 70, -100), -Point3D(50, 0, 0)) bez.add_smooth_point(Point3D(256 + 80, 256 + 30, -80), Point3D(0, 0, 0)) g.add_shape(objects.Stroke(Color(1, 0, 0), 2)) # Animate the circles using depth rotation dr = anutils.DepthRotationDisplacer(Point3D(256, 256, 0), 0, 30, 10, Point3D(0, 4, 1), 0, 30) dr.animate_point(eye1.position) dr.animate_point(eye2.position) dr.animate_point(nose.position) dr.animate_bezier(mouth.shape) dr = anutils.DepthRotationDisplacer(Point3D(256, 256, 0), 30, 90, 10, Point3D(0, 4, 1), 0, -60) dr.animate_point(eye1.position) dr.animate_point(eye2.position) dr.animate_point(nose.position) dr.animate_bezier(mouth.shape)
#!/usr/bin/env python3 import sys import os sys.path.insert( 0, os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "lib")) from lottie.utils import script from lottie import objects from lottie import Color, Point from lottie.utils.font import FontStyle an = objects.Animation(120) layer = objects.ShapeLayer() an.add_layer(layer) # The font name "Ubuntu" here, can be detected among the system fonts if fontconfig is available # Otherwise you can use the full path to the font file # `emoji_svg` needs to point to a directory with the supported emoji as svg style = FontStyle("Ubuntu", 128, emoji_svg="twemoji/assets/svg/") t = layer.add_shape(style.render("Hello\nWorld\nF\U0001F600O\nE🇪🇺U")) t.transform.position.value.y += t.line_height layer.add_shape(objects.Fill(Color(0, 0, 0))) layer.add_shape(objects.Stroke(Color(1, 1, 1), 2)) script.script_main(an)
from lottie import objects from lottie import Point, Color an = objects.Animation(59) layer = objects.ShapeLayer() an.add_layer(layer) circle = layer.add_shape(objects.Ellipse()) circle.size.value = Point(100, 100) circle.position.value = Point(220, 110) star = layer.add_shape(objects.Star()) star.inner_radius.value = 20 star.outer_radius.value = 50 star.position.value = Point(330, 110) rect = layer.add_shape(objects.Rect()) rect.size.value = Point(100, 100) rect.position.value = Point(110, 110) rrect = layer.add_shape(objects.Rect()) rrect.size.value = Point(100, 100) rrect.position.value = Point(110, 220) rrect.rounded.value = 30 fill = layer.add_shape(objects.Fill(Color(1, 1, 0))) stroke = layer.add_shape(objects.Stroke(Color(0, 0, 0), 25)) script.script_main(an)
import sys import os sys.path.insert( 0, os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "lib")) from lottie.utils import script from lottie import objects from lottie.utils import animation as anutils from lottie import Point, Color an = objects.Animation(180) layer = objects.ShapeLayer() an.add_layer(layer) group = layer.add_shape(objects.Group()) bez = group.add_shape(objects.Path()) bez.shape.value.add_point(Point(256, 128), Point(0, 0), Point(64, 64)) bez.shape.value.add_smooth_point(Point(256, 256 + 120), Point(32, -32)) bez.shape.value.add_point(Point(256, 256), Point(-64, -64), Point(-64, 64)) bez.shape.value.add_point(Point(128, 256 + 120), Point(64, 64), Point(0, 0)) group.add_shape(objects.Stroke(Color(1, 0, 0), 10)) group = layer.add_shape(objects.Group()) sh = anutils.generate_path_segment(bez.shape.value, 0, 180, 60, 180, 60, True) group.add_shape(sh) group.add_shape(objects.Stroke(Color(0, 1, 0), 20)) script.script_main(an)
p2 = Point( math.sin(2 * t * math.pi * 2) / 2 + 1, -math.cos(t * math.pi * 2) / 2 + 1) * 256 b2.position.add_keyframe(i, p2) def chain_bezier(chain): b = objects.Bezier() for seg in chain.joints: b.add_point(seg) return b g = layer.add_shape(objects.Group()) s = g.add_shape(objects.Path()) g.add_shape(objects.Stroke(Color(1, 0, 0), 5)) chain = ik.Chain(Point(0, 0)) chain.add_joint(Point(50, 0)) chain.add_joint(Point(150, 0)) chain.add_joint(Point(350, 0)) chain.add_joint(Point(400, 0)) #chain.add_joint(Point(500, 0)) octmaster = ik.Chain(Point(512, 512), True) octmaster.add_joint(Point(450, 450)) octmaster.add_joint(Point(400, 400)) octmaster.add_joint(Point(450, 450)) octmaster.add_joint(Point(512, 512)) oct = ik.Octopus(octmaster)
star = objects.Star() star.inner_radius.value = 40 star.outer_radius.value = 100 star.position.value = Point(256, 256) star.name = "big start" group.add_shape(star) star = objects.Star() star.inner_radius.value = 20 star.outer_radius.value = 50 star.position.value = Point(256, 256) star.name = "small start" group.add_shape(star) obj = objects.Path() obj.shape.value.add_point(Point(10, 10)) obj.shape.value.add_point(Point(500, 10)) group.add_shape(obj) trim = layer.add_shape(objects.Trim()) #trim.offset.value = 350 trim.offset.add_keyframe(0, 0) trim.offset.add_keyframe(last_frame, 360) trim.start.value = 0 trim.end.value = 50 #trim.multiple = objects.TrimMultipleShapes.Individually stroke = group.add_shape(objects.Stroke(Color(1, 1, 0), 10)) script.script_main(an)
rect = shapes.add_shape(objects.Rect()) rect.size.add_keyframe(0, Point(100, 100)) rect.size.add_keyframe(30, Point(50, 120)) rect.size.add_keyframe(60, Point(100, 100)) rect.position.add_keyframe(0, Point(110, 110)) rect.position.add_keyframe(20, Point(80, 110)) rect.position.add_keyframe(40, Point(110, 110)) rrect = shapes.add_shape(objects.Rect()) rrect.size.value = Point(100, 100) rrect.position.value = Point(440, 110) rrect.rounded.add_keyframe(0, 0) rrect.rounded.add_keyframe(30, 30) rrect.rounded.add_keyframe(60, 0) fill = shapes.add_shape(objects.Fill(Color(1, 1, 0))) stroke = shapes.add_shape(objects.Stroke(Color(0, 0, 0), 5)) beziers = layer.add_shape(objects.Group()) beziers.transform.position.value = Point(0, 130) beziers.add_shape(rect.to_bezier()) beziers.add_shape(rrect.to_bezier()) beziers.add_shape(circle.to_bezier()) beziers.add_shape(star.to_bezier()) fill = beziers.add_shape(objects.Fill(Color(0, 0, 1))) stroke = beziers.add_shape(objects.Stroke(Color(1, 1, 1), 5)) script.script_main(an)
(easing.Sigmoid(1 / 10), Color(0, 0, 1 / 10)), ] height = 512 / len(easings) width = height for i in range(len(easings)): group = layer.add_shape(objects.Group()) rectgroup = group.add_shape(objects.Group()) rect = rectgroup.add_shape(objects.Rect()) rect.size.value = Size(width, height) y = i * height + height / 2 group.transform.position.add_keyframe(0, Point(width / 2, y), easings[i][0]) group.transform.position.add_keyframe(90, Point(512 - width / 2, y), easings[i][0]) group.transform.position.add_keyframe(180, Point(width / 2, y), easings[i][0]) rectgroup.add_shape(objects.Fill(easings[i][1])) bezgroup = group.insert_shape(0, objects.Group()) bez = group.transform.position.keyframes[0].bezier() bezgroup.transform.scale.value = Size(100 * width, -100 * height) bezgroup.transform.position.value = Point(-width / 2, width / 2) bezgroup.add_shape(objects.Path()).shape.value = bez sc = Color(0, 0, 0) if easings[i][1].length == math.sqrt(3) else Color( 1, 1, 1) bezgroup.add_shape(objects.Stroke(sc, 0.1)) script.script_main(an)
from lottie.utils import script from lottie import objects from lottie import Point, Color an = objects.Animation(59) layer = objects.ShapeLayer() an.add_layer(layer) g1 = layer.add_shape(objects.Group()) circle = g1.add_shape(objects.Ellipse()) circle.size.value = Point(100, 100) circle.position.value = Point(200, 100) g1.add_shape(objects.Fill(Color(1, 0, 0))) g1.add_shape(objects.Stroke(Color(0, 0, 0), 5)) g2 = layer.add_shape(objects.Group()) star = g2.add_shape(objects.Star()) star.inner_radius.value = 20 star.outer_radius.value = 50 star.position.value = Point(300, 100) g2.add_shape(objects.Fill(Color(0, 1, 0))) g2.add_shape(objects.Stroke(Color(0, 0, 0), 5)) g3 = layer.add_shape(objects.Group()) rect = g3.add_shape(objects.Rect()) rect.size.value = Point(100, 100) rect.position.value = Point(100, 100) g3.add_shape(objects.Fill(Color(0, 0, 1))) g3.add_shape(objects.Stroke(Color(1, 1, 1), 5))
base = an.add_layer(objects.NullLayer()) base.transform.anchor_point.value = base.transform.position.value = Point(256, 256) base.transform.rotation.add_keyframe(0, 0) base.transform.rotation.add_keyframe(last_frame, 360) star_layer = objects.ShapeLayer() base.add_child(star_layer) star = star_layer.add_shape(objects.Star()) star.inner_radius.value = 20 star.outer_radius.value = 50 star.position.value = Point(50, 50) star_layer.add_shape(objects.Fill(Color(1, 1, 0))) star_layer.add_shape(objects.Stroke(Color(0, 0, 0), 5)) star_layer.transform.anchor_point = star.position star_layer.transform.position.value = Point(50, 256) star_layer.transform.rotation.add_keyframe(0, 0) star_layer.transform.rotation.add_keyframe(last_frame, -360) circle_layer = objects.ShapeLayer() an.add_layer(circle_layer) circle_layer.parent = base circle = circle_layer.add_shape(objects.Ellipse()) circle.size.value = NVector(100, 100) circle_layer.add_shape(objects.Fill(Color(1, 0, 0))) circle_layer.add_shape(objects.Stroke(Color(0, 0, 0), 5)) circle_layer.transform.position.add_keyframe(0, Point(256, 512-50)) circle_layer.transform.position.add_keyframe(last_frame/2, Point(256, 50))
in_tan=NVector(0, -tl)) layer.transform.position.add_keyframe(last_frame / 4 * 2, Point(462, 256), out_tan=NVector(0, +tl), in_tan=NVector(+tl, 0)) layer.transform.position.add_keyframe(last_frame / 4 * 3, Point(256, 462), out_tan=NVector(-tl, 0), in_tan=NVector(0, +tl)) layer.transform.position.add_keyframe(last_frame / 4 * 4, Point(+50, 256), out_tan=NVector(0, -tl), in_tan=NVector(-tl, 0)) layer1 = objects.ShapeLayer() an.add_layer(layer1) layer1.add_shape(group) layer1.add_shape(objects.Fill(Color(1, 0, 0))) layer1.transform = layer.transform bg = an.add_layer(objects.ShapeLayer()) track = bg.add_shape(objects.Path()).shape.value track.closed = True track.add_point(Point(+50, 256), NVector(0, +tl), NVector(0, -tl)) track.add_point(Point(256, +50), NVector(-tl, 0), NVector(+tl, 0)) track.add_point(Point(462, 256), NVector(0, -tl), NVector(0, +tl)) track.add_point(Point(256, 462), NVector(+tl, 0), NVector(-tl, 0)) bg.add_shape(objects.Stroke(Color(0, 0, 1), 50)) script.script_main(an)