def test_boundingbox(self): sh = objects.Ellipse() sh.position.value = [30, 40] sh.size.value = [10, 20] bb = sh.bounding_box() c = bb.center() self.assertEqual(bb.x1, 30 - 5) self.assertEqual(bb.y1, 40 - 10) self.assertEqual(bb.x2, 30 + 5) self.assertEqual(bb.y2, 40 + 10) self.assertEqual(c[0], 30) self.assertEqual(c[1], 40)
def test_empty(self): sh = objects.Ellipse() self.assertDictEqual( sh.to_dict(), { "ty": "el", "d": 0, "p": { "a": 0, "k": [0, 0] }, "s": { "a": 0, "k": [0, 0] }, })
def test_circle(self): lot = objects.Animation() sl = lot.add_layer(objects.ShapeLayer()) ellipse = sl.add_shape(objects.Ellipse()) ellipse.position.value = NVector(256, 256) ellipse.size.value = NVector(512, 512) sl.add_shape(objects.Fill(Color(.25, .25, .25))) 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.RegionLayer) self.assertTrue(grp.active) rgl = grp.layers[0] self.assertEqual(len(rgl.bline.points), 4) self.assert_nvector_equal(rgl.origin.value, ellipse.position.value) self.assert_nvector_equal(rgl.color.value, sif.make_color(.25, .25, .25)) self.assertTrue(rgl.active) self.assert_nvector_equal(rgl.bline.points[0].point.value, NVector(0, 256)) self.assert_nvector_equal(rgl.bline.points[1].point.value, NVector(-256, 0)) self.assert_nvector_equal(rgl.bline.points[2].point.value, NVector(0, -256)) self.assert_nvector_equal(rgl.bline.points[3].point.value, NVector(256, 0)) self.assertNotAlmostEqual(rgl.bline.points[0].t1.value.x, 0) self.assertAlmostEqual(rgl.bline.points[0].t1.value.y, 0) self.assertNotAlmostEqual(rgl.bline.points[1].t1.value.y, 0) self.assertAlmostEqual(rgl.bline.points[1].t1.value.x, 0) self.assertNotAlmostEqual(rgl.bline.points[2].t1.value.x, 0) self.assertAlmostEqual(rgl.bline.points[2].t1.value.y, 0) self.assertNotAlmostEqual(rgl.bline.points[3].t1.value.y, 0) self.assertAlmostEqual(rgl.bline.points[3].t1.value.x, 0) for i in range(4): self.assert_nvector_equal(rgl.bline.points[i].t1.value, rgl.bline.points[i].t2.value)
def test_sized(self): sh = objects.Ellipse() sh.size.value = [10, 20] sh.position.value = [30, 40] sh.name = "foo" self.assertDictEqual( sh.to_dict(), { "ty": "el", "d": 0, "p": { "a": 0, "k": [30, 40] }, "s": { "a": 0, "k": [10, 20] }, "nm": "foo", })
def particle(): g = layer.add_shape(objects.Group()) b = g.add_shape(objects.Ellipse()) fill = objects.Fill() g.add_shape(fill) t = random.random() if t < 1/2: lf = t * 2 fill.color.add_keyframe(0, color1.lerp(color2, lf)) fill.color.add_keyframe(last_frame*t, color2) fill.color.add_keyframe((1 - t) * last_frame, color3, easing.Jump()) fill.color.add_keyframe((1 - t) * last_frame+1, color1) fill.color.add_keyframe(last_frame, color1.lerp(color2, lf)) else: lf = (t-0.5) * 2 tf = (1-lf)/2 fill.color.add_keyframe(0, color2.lerp(color3, lf)) fill.color.add_keyframe(last_frame*tf, color3, easing.Jump()) fill.color.add_keyframe(last_frame*tf+1, color1) fill.color.add_keyframe((.5 + tf) * last_frame, color2) fill.color.add_keyframe(last_frame, color2.lerp(color3, lf)) fill.opacity.add_keyframe(0, opacity_start + (opacity_end - opacity_start) * t) fill.opacity.add_keyframe((1 - t) * last_frame, opacity_end) fill.opacity.add_keyframe((1 - t) * last_frame+1, opacity_start) fill.opacity.add_keyframe(last_frame, opacity_start + (opacity_end - opacity_start) * t) bezier = objects.Bezier() outp = PolarVector(random.uniform(start_len_min, start_len_max), random.random() * math.pi) inp = Point(0, random.random() * (particle_end.y - particle_start.y) / 3) bezier.add_point(particle_start, outp=outp) bezier.add_point(particle_end, outp) b.size.value = particle_size anutils.follow_path(b.position, bezier, 0, last_frame, 10, start_t=t)
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 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.add_keyframe(0, Point(0, 256)) circle.position.add_keyframe(20, Point(256, 256)) circle.position.add_keyframe(40, Point(256, 0)) circle.position.add_keyframe(60, Point(0, 256)) fill = layer.add_shape(objects.Fill(Color(1, 1, 0))) fill.opacity.add_keyframe(0, 100) fill.opacity.add_keyframe(30, 10) fill.opacity.add_keyframe(60, 100) script.script_main(an)
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 Size, Point3D, Point, Color an = objects.Animation(120) layer = objects.ShapeLayer() an.add_layer(layer) g = layer.add_shape(objects.Group()) b = g.add_shape(objects.Ellipse()) b.size.value = Size(256, 256) b.position.value = Point(256, 256) g.add_shape(objects.Fill(Color(1, 1, 0))) g = layer.insert_shape(0, objects.Group()) eye1 = g.add_shape(objects.Ellipse()) eye1.size.value = Size(20, 20) eye1.position.value = Point3D(256 - 50, 256 - 50, -100) g.add_shape(objects.Fill(Color(0, 0, 0))) g = layer.insert_shape(0, objects.Group()) eye2 = g.add_shape(objects.Ellipse()) eye2.size.value = Size(20, 20) eye2.position.value = Point3D(256 + 50, 256 - 50, -100) g.add_shape(objects.Fill(Color(0, 0, 0)))
an = objects.Animation(120) layer = objects.ShapeLayer() an.add_layer(layer) # Build a sphere out of circles balls = [] axes = [ Point(1, 0), Point(0, 1), ] for i in range(20): a = i / 20 * math.pi * 2 for axis in axes: g = layer.add_shape(objects.Group()) b = g.add_shape(objects.Ellipse()) b.size.value = Size(20, 20) xz = axis * math.sin(a) * 128 pos = Point3D(256 + xz[0], 256 + math.cos(a) * 128, xz[1]) b.position.value = pos balls.append(b) g.add_shape(objects.Fill(Color(0, 1, 0))) # Animate the circles using depth rotation dr = anutils.DepthRotationDisplacer(Point3D(256, 256, 0), 0, 120, 10, Point3D(0, 2, -1)) for b in balls: dr.animate_point(b.position) script.script_main(an)
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.animation import follow_path from lottie import Point, Color an = objects.Animation(180) layer = objects.ShapeLayer() an.add_layer(layer) group = layer.add_shape(objects.Group()) ball = group.add_shape(objects.Ellipse()) ball.size.value = Point(10, 10) r1 = group.add_shape(objects.Rect()) r1.size.value = Point(50, 10) r2 = group.add_shape(objects.Group()) r2.add_shape(objects.Rect()).size.value = Point(50, 10) r2 = r2.transform group.add_shape(objects.Fill(Color(0, 1, 0))) 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_point(Point(256, 256), Point(-64, -64), Point(-64, 64))
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 Point, Color an = objects.Animation(60) layer = objects.ShapeLayer() an.add_layer(layer) shapes = layer.add_shape(objects.Group()) circle = shapes.add_shape(objects.Ellipse()) circle.size.add_keyframe(0, Point(100, 100)) circle.size.add_keyframe(30, Point(50, 120)) circle.size.add_keyframe(60, Point(100, 100)) circle.position.add_keyframe(0, Point(220, 110)) circle.position.add_keyframe(20, Point(180, 110)) circle.position.add_keyframe(40, Point(220, 110)) star = shapes.add_shape(objects.Star()) star.inner_radius.add_keyframe(0, 20) star.inner_radius.add_keyframe(30, 50) star.inner_radius.add_keyframe(60, 20) star.outer_radius.value = 50 #star.inner_roundness.value = 100 #star.outer_roundness.value = 40 star.rotation.value = 45
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 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())
rot_time = 45 an = objects.Animation(rot_time*4) layer = objects.ShapeLayer() an.add_layer(layer) def add_shape(shape, color, parent): g = parent.add_shape(objects.Group()) s = g.add_shape(shape) g.add_shape(objects.Fill(color)) return s face1 = add_shape(objects.Ellipse(), Color(1, 1, 0), layer) face2 = add_shape(objects.Ellipse(), Color(0, 1, 0), layer) side = layer.add_shape(objects.Group()) side1 = add_shape(objects.Ellipse(), Color(1, 0, 0), side) side2 = add_shape(objects.Ellipse(), Color(1, 0, 0), side) sider = add_shape(objects.Rect(), Color(1, 0, 0), side) width = 10 face1.size.add_keyframe(rot_time*0, Point(256, 256), easing.EaseIn()) face1.size.add_keyframe(rot_time*1, Point(0, 256)) face1.size.add_keyframe(rot_time*2, Point(0, 256)) face1.size.add_keyframe(rot_time*3, Point(0, 256), easing.EaseOut()) face1.size.add_keyframe(rot_time*4, Point(256, 256))
last_frame = 180 an = objects.Animation(last_frame) layer = objects.ShapeLayer() an.add_layer(layer) layer.auto_orient = True group = layer.add_shape(objects.Group()) star = objects.Star() star.inner_radius.value = 20 star.outer_radius.value = 50 star.position.value = Point(0, 0) group.add_shape(star) group.add_shape(objects.Ellipse(NVector(0, 35), NVector(16, 16))) layer.add_shape(objects.Fill(Color(1, 1, 0))) tl = 120 layer.transform.position.add_keyframe(last_frame / 4 * 0, Point(+50, 256), out_tan=NVector(0, -tl), in_tan=NVector(-tl, 0)) layer.transform.position.add_keyframe(last_frame / 4 * 1, Point(256, +50), out_tan=NVector(+tl, 0), in_tan=NVector(0, -tl)) layer.transform.position.add_keyframe(last_frame / 4 * 2, Point(462, 256), out_tan=NVector(0, +tl),