mirror of
https://github.com/OpenVGLab/OmniLottie.git
synced 2026-09-17 07:36:27 +00:00
Initial Commit
This commit is contained in:
@@ -0,0 +1,441 @@
|
||||
from .base import LottieObject, LottieProp, PseudoBool
|
||||
from .properties import Value, MultiDimensional, ColorValue
|
||||
from .nvector import NVector
|
||||
from .color import Color
|
||||
|
||||
|
||||
#5: EffectsManager,
|
||||
#11: MaskEffect,
|
||||
class EffectValue(LottieObject):
|
||||
"""!
|
||||
Value for an effect
|
||||
"""
|
||||
## %Effect value type.
|
||||
type = None
|
||||
_classses = {}
|
||||
|
||||
_props = [
|
||||
LottieProp("effect_index", "ix", int, False),
|
||||
#LottieProp("match_name", "mn", str, False),
|
||||
LottieProp("name", "nm", str, False),
|
||||
LottieProp("type", "ty", int, False),
|
||||
]
|
||||
|
||||
def __init__(self):
|
||||
## Effect Index. Used for expressions.
|
||||
self.effect_index = None
|
||||
## After Effect's Name. Used for expressions.
|
||||
self.name = None
|
||||
|
||||
"""
|
||||
## After Effect's Match Name. Used for expressions.
|
||||
self.match_name = ""
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def _load_get_class(cls, lottiedict):
|
||||
if not EffectValue._classses:
|
||||
EffectValue._classses = {
|
||||
sc.type: sc
|
||||
for sc in EffectValue.__subclasses__()
|
||||
}
|
||||
return EffectValue._classses[lottiedict["ty"]]
|
||||
|
||||
def __str__(self):
|
||||
return self.name or super().__str__()
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
class Effect(LottieObject):
|
||||
"""!
|
||||
Layer effect
|
||||
"""
|
||||
## %Effect type.
|
||||
type = None
|
||||
_classses = {}
|
||||
|
||||
_props = [
|
||||
LottieProp("effect_index", "ix", int, False),
|
||||
#LottieProp("match_name", "mn", str, False),
|
||||
LottieProp("name", "nm", str, False),
|
||||
LottieProp("type", "ty", int, False),
|
||||
LottieProp("effects", "ef", EffectValue, True),
|
||||
]
|
||||
_effects = []
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
## Effect Index. Used for expressions.
|
||||
self.effect_index = None
|
||||
## After Effect's Name. Used for expressions.
|
||||
self.name = None
|
||||
## Effect parameters
|
||||
self.effects = self._load_values(*args, **kwargs)
|
||||
|
||||
"""
|
||||
## After Effect's Match Name. Used for expressions.
|
||||
self.match_name = ""
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def _load_get_class(cls, lottiedict):
|
||||
if not Effect._classses:
|
||||
Effect._classses = {
|
||||
sc.type: sc
|
||||
for sc in Effect.__subclasses__()
|
||||
}
|
||||
type = lottiedict["ty"]
|
||||
|
||||
if type in Effect._classses:
|
||||
return Effect._classses[type]
|
||||
else:
|
||||
return Effect
|
||||
|
||||
def _load_values(self, *args, **kwargs):
|
||||
values = []
|
||||
for i, (name, type) in enumerate(self._effects):
|
||||
val = []
|
||||
if len(args) > i:
|
||||
val = [args[i]]
|
||||
if name in kwargs:
|
||||
val = [kwargs[name]]
|
||||
values.append(type(*val))
|
||||
return values
|
||||
|
||||
def __getattr__(self, key):
|
||||
for i, (name, type) in enumerate(self._effects):
|
||||
if name == key:
|
||||
return self.effects[i].value
|
||||
return super().__getattr__(key)
|
||||
|
||||
def __str__(self):
|
||||
return self.name or super().__str__()
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
## @ingroup LottieCheck
|
||||
class EffectNoValue(EffectValue):
|
||||
_props = []
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
class EffectValueSlider(EffectValue):
|
||||
_props = [
|
||||
LottieProp("value", "v", Value, False),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 0
|
||||
|
||||
def __init__(self, value=0):
|
||||
EffectValue.__init__(self)
|
||||
## Effect value.
|
||||
self.value = Value(value)
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
class EffectValueAngle(EffectValue):
|
||||
_props = [
|
||||
LottieProp("value", "v", Value, False),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 1
|
||||
|
||||
def __init__(self, angle=0):
|
||||
EffectValue.__init__(self)
|
||||
## Effect value.
|
||||
self.value = Value(angle)
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
class EffectValueColor(EffectValue):
|
||||
_props = [
|
||||
LottieProp("value", "v", ColorValue, False),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 2
|
||||
|
||||
def __init__(self, value=Color(0, 0, 0)):
|
||||
EffectValue.__init__(self)
|
||||
## Effect value.
|
||||
self.value = ColorValue(value)
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
class EffectValuePoint(EffectValue):
|
||||
_props = [
|
||||
LottieProp("value", "v", MultiDimensional, False),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 3
|
||||
|
||||
def __init__(self, value=NVector(0, 0)):
|
||||
EffectValue.__init__(self)
|
||||
## Effect value.
|
||||
self.value = MultiDimensional(value)
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
class EffectValueCheckbox(EffectValue):
|
||||
_props = [
|
||||
LottieProp("value", "v", Value, False),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 4
|
||||
|
||||
def __init__(self, value=0):
|
||||
EffectValue.__init__(self)
|
||||
## Effect value.
|
||||
self.value = Value(value)
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
## @ingroup LottieCheck
|
||||
## Lottie-web ignores these
|
||||
class IgnoredValue(EffectValue):
|
||||
_props = [
|
||||
LottieProp("value", "v", float, False),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 6
|
||||
|
||||
def __init__(self, value=0):
|
||||
EffectValue.__init__(self)
|
||||
## Effect value.
|
||||
self.value = value
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
## @ingroup LottieCheck
|
||||
class EffectValueDropDown(EffectValue):
|
||||
_props = [
|
||||
LottieProp("value", "v", Value, False),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 7
|
||||
|
||||
def __init__(self, value=0):
|
||||
EffectValue.__init__(self)
|
||||
## Effect value.
|
||||
self.value = Value(value)
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
## @ingroup LottieCheck
|
||||
class EffectValueLayer(EffectValue):
|
||||
_props = [
|
||||
LottieProp("value", "v", Value, False),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 10
|
||||
|
||||
def __init__(self):
|
||||
EffectValue.__init__(self)
|
||||
## Effect value.
|
||||
self.value = Value()
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
class FillEffect(Effect):
|
||||
"""!
|
||||
Replaces the whole layer with the given color
|
||||
@note Opacity is in [0, 1]
|
||||
"""
|
||||
_effects = [
|
||||
("00", EffectValuePoint),
|
||||
("01", EffectValueDropDown),
|
||||
("color", EffectValueColor),
|
||||
("03", EffectValueDropDown),
|
||||
("04", EffectValueSlider),
|
||||
("05", EffectValueSlider),
|
||||
("opacity", EffectValueSlider),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 21
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
class StrokeEffect(Effect):
|
||||
_effects = [
|
||||
("00", EffectValueColor),
|
||||
("01", EffectValueCheckbox),
|
||||
("02", EffectValueCheckbox),
|
||||
("color", EffectValueColor),
|
||||
("04", EffectValueSlider),
|
||||
("05", EffectValueSlider),
|
||||
("06", EffectValueSlider),
|
||||
("07", EffectValueSlider),
|
||||
("08", EffectValueSlider),
|
||||
("09", EffectValueDropDown),
|
||||
("type", EffectValueDropDown),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 22
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
class TritoneEffect(Effect):
|
||||
"""!
|
||||
Maps layers colors based on bright/mid/dark colors
|
||||
"""
|
||||
_effects = [
|
||||
("bright", EffectValueColor),
|
||||
("mid", EffectValueColor),
|
||||
("dark", EffectValueColor),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 23
|
||||
|
||||
|
||||
"""
|
||||
## @ingroup Lottie
|
||||
## @ingroup LottieCheck
|
||||
class GroupEffect(Effect):
|
||||
_props = [
|
||||
LottieProp("enabled", "en", PseudoBool, False),
|
||||
]
|
||||
|
||||
def __init__(self):
|
||||
Effect.__init__(self)
|
||||
## Enabled AE property value
|
||||
self.enabled = True
|
||||
"""
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
## @ingroup LottieCheck
|
||||
class ProLevelsEffect(Effect):
|
||||
_effects = [
|
||||
("00", EffectValueDropDown),
|
||||
("01", EffectNoValue),
|
||||
("02", EffectNoValue),
|
||||
("comp_inblack", EffectValueSlider),
|
||||
("comp_inwhite", EffectValueSlider),
|
||||
("comp_gamma", EffectValueSlider),
|
||||
("comp_outblack", EffectValueSlider),
|
||||
("comp_outwhite", EffectNoValue),
|
||||
("08", EffectNoValue),
|
||||
("09", EffectValueSlider),
|
||||
("r_inblack", EffectValueSlider),
|
||||
("r_inwhite", EffectValueSlider),
|
||||
("r_gamma", EffectValueSlider),
|
||||
("r_outblack", EffectValueSlider),
|
||||
("r_outwhite", EffectNoValue),
|
||||
("15", EffectValueSlider),
|
||||
("16", EffectValueSlider),
|
||||
("g_inblack", EffectValueSlider),
|
||||
("g_inwhite", EffectValueSlider),
|
||||
("g_gamma", EffectValueSlider),
|
||||
("g_outblack", EffectValueSlider),
|
||||
("g_outwhite", EffectNoValue),
|
||||
("22", EffectValueSlider),
|
||||
("b3", EffectValueSlider),
|
||||
("b_inblack", EffectValueSlider),
|
||||
("b_inwhite", EffectValueSlider),
|
||||
("b_gamma", EffectValueSlider),
|
||||
("b_outblack", EffectValueSlider),
|
||||
("b_outwhite", EffectNoValue),
|
||||
("29", EffectValueSlider),
|
||||
("a_inblack", EffectValueSlider),
|
||||
("a_inwhite", EffectValueSlider),
|
||||
("a_gamma", EffectValueSlider),
|
||||
("a_outblack", EffectValueSlider),
|
||||
("a_outwhite", EffectNoValue),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 24
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
class TintEffect(Effect):
|
||||
"""!
|
||||
Colorizes the layer
|
||||
@note Opacity is in [0, 100]
|
||||
"""
|
||||
_effects = [
|
||||
("color_black", EffectValueColor),
|
||||
("color_white", EffectValueColor),
|
||||
("opacity", EffectValueSlider),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 20
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
class DropShadowEffect(Effect):
|
||||
"""!
|
||||
Adds a shadow to the layer
|
||||
@note Opacity is in [0, 255]
|
||||
"""
|
||||
_effects = [
|
||||
("color", EffectValueColor),
|
||||
("opacity", EffectValueSlider),
|
||||
("angle", EffectValueAngle),
|
||||
("distance", EffectValueSlider),
|
||||
("blur", EffectValueSlider),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 25
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
## @ingroup LottieCheck
|
||||
class Matte3Effect(Effect):
|
||||
_effects = [
|
||||
("index", EffectValueSlider),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 28
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
class GaussianBlurEffect(Effect):
|
||||
"""!
|
||||
Gaussian blur
|
||||
"""
|
||||
_effects = [
|
||||
("sigma", EffectValueSlider),
|
||||
("dimensions", EffectValueSlider),
|
||||
("wrap", EffectValueCheckbox),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 29
|
||||
|
||||
|
||||
#class ChangeColorEffect(Effect):
|
||||
#"""!
|
||||
#Gaussian blur
|
||||
#"""
|
||||
#_effects = [
|
||||
#("view", EffectValueDropDown),
|
||||
#("hue", EffectValueSlider),
|
||||
#("lightness", EffectValueSlider),
|
||||
#("saturation", EffectValueSlider),
|
||||
#("color_to_change", EffectValueColor),
|
||||
#("tolerance", EffectValueSlider),
|
||||
#("softness", EffectValueSlider),
|
||||
#("match", EffectValueDropDown),
|
||||
#("invert_mask", EffectValueDropDown),
|
||||
#]
|
||||
### %Effect type.
|
||||
#type = 29
|
||||
|
||||
|
||||
## @ingroup Lottie
|
||||
class ChangeToColorEffect(Effect):
|
||||
"""!
|
||||
Change to color
|
||||
"""
|
||||
_effects = [
|
||||
("from_color", EffectValueColor),
|
||||
("to_color", EffectValueColor),
|
||||
("change", EffectValueDropDown),
|
||||
("change_by", EffectValueDropDown),
|
||||
("tolerance", IgnoredValue),
|
||||
("hue", EffectValueSlider),
|
||||
("lightness", EffectValueSlider),
|
||||
("saturation", EffectValueSlider),
|
||||
("saturation_", IgnoredValue),
|
||||
("softness", EffectValueSlider),
|
||||
("view_correction", EffectValueDropDown),
|
||||
]
|
||||
## %Effect type.
|
||||
type = 5
|
||||
Reference in New Issue
Block a user