public bool targetsAreEqual(AMMaterialTrack.ValueType valueType, AMMaterialKey nextKey) { if (nextKey) { if (valueType == AMMaterialTrack.ValueType.Float || valueType == AMMaterialTrack.ValueType.Range) { return(val == nextKey.val); } if (valueType == AMMaterialTrack.ValueType.Vector) { return(vector == nextKey.vector); } if (valueType == AMMaterialTrack.ValueType.Color) { return(color == nextKey.color); } if (valueType == AMMaterialTrack.ValueType.TexOfs) { return(texOfs == nextKey.texOfs); } if (valueType == AMMaterialTrack.ValueType.TexScale) { return(texScale == nextKey.texScale); } } return(true); }
public override void updateCache(AMITarget target) { base.updateCache(target); for (int i = 0; i < keys.Count; i++) { AMMaterialKey key = keys[i] as AMMaterialKey; if (key.version > 0 && key.version != version) { //TODO: ... } key.version = version; if (keys.Count > (i + 1)) { key.endFrame = keys[i + 1].frame; } else { if (!canTween || (i > 0 && !keys[i - 1].canTween)) { key.interp = (int)AMKey.Interpolation.None; } key.endFrame = -1; } } }
public override void CopyTo(AMKey key) { base.CopyTo(key); AMMaterialKey a = key as AMMaterialKey; a.texture = texture; a._val4 = _val4; }
public string getValueString(AMMaterialTrack.ValueType valueType, AMMaterialKey nextKey, bool brief) { System.Text.StringBuilder s = new System.Text.StringBuilder(); switch (valueType) { case AMMaterialTrack.ValueType.Float: case AMMaterialTrack.ValueType.Range: s.Append(formatNumeric(val)); if (!brief && nextKey) { s.Append(" -> "); s.Append(formatNumeric(nextKey.val)); } break; case AMMaterialTrack.ValueType.Vector: s.Append(_val4.ToString()); if (!brief && nextKey) { s.Append(" -> "); s.Append(nextKey._val4.ToString()); } break; case AMMaterialTrack.ValueType.Color: s.Append(color.ToString()); if (!brief && nextKey) { s.Append(" -> "); s.Append(nextKey.color.ToString()); } break; case AMMaterialTrack.ValueType.TexEnv: s.Append(texture ? texture.name : "None"); break; case AMMaterialTrack.ValueType.TexOfs: s.Append(texOfs.ToString()); if (!brief && nextKey) { s.Append(" -> "); s.Append(nextKey.texOfs.ToString()); } break; case AMMaterialTrack.ValueType.TexScale: s.Append(texScale.ToString()); if (!brief && nextKey) { s.Append(" -> "); s.Append(nextKey.texScale.ToString()); } break; } return(s.ToString()); }
public override void CopyTo(AMKey key) { AMMaterialKey a = key as AMMaterialKey; a.enabled = false; a.frame = frame; a.texture = texture; a._val4 = _val4; a.easeType = easeType; a.customEase = new List <float>(customEase); }
public static void ApplyValueLerp(AMMaterialTrack.ValueType valueType, string prop, int propId, Material mat, AMMaterialKey fromKey, AMMaterialKey toKey, float t) { switch (valueType) { case AMMaterialTrack.ValueType.Float: case AMMaterialTrack.ValueType.Range: mat.SetFloat(propId, Mathf.Lerp(fromKey.val, toKey.val, t)); break; case AMMaterialTrack.ValueType.Vector: mat.SetVector(propId, Vector4.Lerp(fromKey.vector, toKey.vector, t)); break; case AMMaterialTrack.ValueType.Color: mat.SetColor(propId, Color.Lerp(fromKey.color, toKey.color, t)); break; case AMMaterialTrack.ValueType.TexOfs: mat.SetTextureOffset(prop, Vector2.Lerp(fromKey.texOfs, toKey.texOfs, t)); break; case AMMaterialTrack.ValueType.TexScale: mat.SetTextureScale(prop, Vector2.Lerp(fromKey.texScale, toKey.texScale, t)); break; } }
public override void build(AMSequence seq, AMTrack track, int index, UnityEngine.Object target) { AMMaterialTrack matTrack = track as AMMaterialTrack; AMMaterialTrack.ValueType propType = matTrack.propertyType; Material matInst = matTrack.materialInstance; string prop = matTrack.property; int propId = Shader.PropertyToID(prop); int frameRate = seq.take.frameRate; Tweener tween = null; int keyCount = track.keys.Count; AMMaterialKey endKey = index + 1 < keyCount ? track.keys[index + 1] as AMMaterialKey : null; float frameCount = endKey != null ? endKey.frame - frame + 1 : 1f; switch (propType) { case AMMaterialTrack.ValueType.Float: case AMMaterialTrack.ValueType.Range: if (!canTween || keyCount == 1) //allow one key { var setTween = DOTween.To(new AMPlugValueSet <float>(), () => val, (x) => matInst.SetFloat(propId, x), val, frameCount / frameRate); setTween.plugOptions.SetSequence(seq); seq.Insert(this, setTween); } else { if (targetsAreEqual(propType, endKey)) { return; } tween = DOTween.To(new FloatPlugin(), () => matInst.GetFloat(propId), (x) => matInst.SetFloat(propId, x), endKey.val, getTime(frameRate)); } break; case AMMaterialTrack.ValueType.Vector: if (!canTween || keyCount == 1) //allow one key { var setTween = DOTween.To(new AMPlugValueSet <Vector4>(), () => vector, (x) => matInst.SetVector(propId, x), vector, frameCount / frameRate); setTween.plugOptions.SetSequence(seq); seq.Insert(this, setTween); } else { if (targetsAreEqual(propType, endKey)) { return; } tween = DOTween.To(AMPluginFactory.CreateVector4(), () => matInst.GetVector(propId), (x) => matInst.SetVector(propId, x), endKey.vector, getTime(frameRate)); } break; case AMMaterialTrack.ValueType.Color: if (!canTween || keyCount == 1) //allow one key { var val = color; var setTween = DOTween.To(new AMPlugValueSet <Color>(), () => val, (x) => matInst.SetColor(propId, x), val, frameCount / frameRate); setTween.plugOptions.SetSequence(seq); seq.Insert(this, setTween); } else { if (targetsAreEqual(propType, endKey)) { return; } tween = DOTween.To(AMPluginFactory.CreateColor(), () => matInst.GetColor(propId), (x) => matInst.SetColor(propId, x), endKey.color, getTime(frameRate)); } break; case AMMaterialTrack.ValueType.TexOfs: if (!canTween || keyCount == 1) //allow one key { var val = texOfs; var setTween = DOTween.To(new AMPlugValueSet <Vector2>(), () => val, (x) => matInst.SetTextureOffset(prop, x), val, frameCount / frameRate); setTween.plugOptions.SetSequence(seq); seq.Insert(this, setTween); } else { if (targetsAreEqual(propType, endKey)) { return; } tween = DOTween.To(AMPluginFactory.CreateVector2(), () => matInst.GetTextureOffset(prop), (x) => matInst.SetTextureOffset(prop, x), endKey.texOfs, getTime(frameRate)); } break; case AMMaterialTrack.ValueType.TexScale: if (!canTween || keyCount == 1) //allow one key { var val = texScale; var setTween = DOTween.To(new AMPlugValueSet <Vector2>(), () => val, (x) => matInst.SetTextureScale(prop, x), val, frameCount / frameRate); setTween.plugOptions.SetSequence(seq); seq.Insert(this, setTween); } else { if (targetsAreEqual(propType, endKey)) { return; } tween = DOTween.To(AMPluginFactory.CreateVector2(), () => matInst.GetTextureScale(prop), (x) => matInst.SetTextureScale(prop, x), endKey.texScale, getTime(frameRate)); } break; case AMMaterialTrack.ValueType.TexEnv: var texEnvTween = DOTween.To(new AMPlugValueSet <Texture>(), () => texture, (x) => matInst.SetTexture(propId, x), texture, frameCount / frameRate); texEnvTween.plugOptions.SetSequence(seq); seq.Insert(this, texEnvTween); break; } if (tween != null) { if (hasCustomEase()) { tween.SetEase(easeCurve); } else { tween.SetEase((Ease)easeType, amplitude, period); } seq.Insert(this, tween); } }
public override void previewFrame(AMITarget target, float frame, int frameRate, bool play, float playSpeed) { if (keys == null || keys.Count <= 0) { return; } //TODO: figure out how to preview frame during edit if (Application.isPlaying) { if (!mIsInit) { Init(target); } // if before or equal to first frame, or is the only frame AMMaterialKey firstKey = keys[0] as AMMaterialKey; if (firstKey.endFrame == -1 || (frame <= (float)firstKey.frame && !firstKey.canTween)) { firstKey.ApplyValue(_propertyType, _property, mPropId, mMatInstance); return; } // if lies on property action for (int i = 0; i < keys.Count; i++) { AMMaterialKey key = keys[i] as AMMaterialKey; AMMaterialKey keyNext = i + 1 < keys.Count ? keys[i + 1] as AMMaterialKey : null; if (frame >= (float)key.endFrame && keyNext != null && (!keyNext.canTween || keyNext.endFrame != -1)) { continue; } // if no ease if (!key.canTween || keyNext == null) { key.ApplyValue(_propertyType, _property, mPropId, mMatInstance); return; } // else find value using easing function float numFrames = (float)key.getNumberOfFrames(frameRate); float framePositionInAction = Mathf.Clamp(frame - (float)key.frame, 0f, numFrames); float t; if (key.hasCustomEase()) { t = Utility.EaseCustom(0.0f, 1.0f, framePositionInAction / key.getNumberOfFrames(frameRate), key.easeCurve); } else { var ease = Utility.GetEasingFunction((Ease)key.easeType); t = ease(framePositionInAction, key.getNumberOfFrames(frameRate), key.amplitude, key.period); } AMMaterialKey.ApplyValueLerp(_propertyType, _property, mPropId, mMatInstance, key, keyNext, t); return; } } }
public AMMaterialKey addKey(AMITarget target, OnAddKey addCall, int _frame) { Material mat = GetMaterial(target); //mat.get // AMMaterialKey k = null; foreach (AMMaterialKey key in keys) { // if key exists on frame, update key if (key.frame == _frame) { k = key; } } if (k == null) { k = addCall(gameObject, typeof(AMMaterialKey)) as AMMaterialKey; k.frame = _frame; k.interp = (int)AMKey.Interpolation.Linear; // add a new key keys.Add(k); } //set value if (!string.IsNullOrEmpty(property)) { switch (_propertyType) { case ValueType.Float: case ValueType.Range: k.val = mat.GetFloat(property); break; case ValueType.Vector: k.vector = mat.GetVector(property); break; case ValueType.Color: k.color = mat.GetColor(property); break; case ValueType.TexEnv: k.texture = mat.GetTexture(property); break; case ValueType.TexOfs: k.texOfs = mat.GetTextureOffset(property); break; case ValueType.TexScale: k.texScale = mat.GetTextureScale(property); break; } } else { Debug.LogWarning("Property is not set in: " + name); } updateCache(target); return(k); }