1 /* 2 * Copyright (c) 2011, 2015, Oracle and/or its affiliates. 3 * All rights reserved. Use is subject to license terms. 4 * 5 * This file is available and licensed under the following license: 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * - Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * - Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the distribution. 16 * - Neither the name of Oracle Corporation nor the names of its 17 * contributors may be used to endorse or promote products derived 18 * from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 package com.javafx.experiments.utils3d.animation; 34 35 import javafx.animation.Interpolator; 36 import javafx.util.Duration; 37 38 public class NumberTangentInterpolator extends Interpolator { 39 40 private final double inValue, outValue; 41 private final long inTicks, outTicks; 42 43 public double getInValue() { return inValue; } 44 45 public double getOutValue() { return outValue; } 46 47 public double getInTicks() { return inTicks; } 48 49 public double getOutTicks() { return outTicks; } 50 51 public NumberTangentInterpolator(Duration inDuration, double inValue, Duration outDuration, double outValue) { 52 this.inTicks = TickCalculation.fromDuration(inDuration); 53 this.inValue = inValue; 54 this.outTicks = TickCalculation.fromDuration(outDuration); 55 this.outValue = outValue; 56 } 57 58 public NumberTangentInterpolator(Duration duration, double value) { 59 this.outTicks = this.inTicks = TickCalculation.fromDuration(duration); 60 this.inValue = this.outValue = value; 61 } 62 63 @Override 64 public String toString() { 65 return "NumberTangentInterpolator [inValue=" + inValue 66 + ", inDuration=" + TickCalculation.toDuration(inTicks) + ", outValue=" 67 + outValue + ", outDuration=" + TickCalculation.toDuration(outTicks) + "]"; 68 } 69 70 @Override 71 public int hashCode() { 72 int hash = 7; 73 hash = 59 * hash + (int) (Double.doubleToLongBits(this.inValue) ^ (Double.doubleToLongBits(this.inValue) >>> 32)); 74 hash = 59 * hash + (int) (Double.doubleToLongBits(this.outValue) ^ (Double.doubleToLongBits(this.outValue) >>> 32)); 75 hash = 59 * hash + (int) (this.inTicks ^ (this.inTicks >>> 32)); 76 hash = 59 * hash + (int) (this.outTicks ^ (this.outTicks >>> 32)); 77 return hash; 78 } 79 80 @Override 81 public boolean equals(Object obj) { 82 if (obj == null) { 83 return false; 84 } 85 if (getClass() != obj.getClass()) { 86 return false; 87 } 88 final NumberTangentInterpolator other = (NumberTangentInterpolator) obj; 89 if (Double.doubleToLongBits(this.inValue) != Double.doubleToLongBits(other.inValue)) { 90 return false; 91 } 92 if (Double.doubleToLongBits(this.outValue) != Double.doubleToLongBits(other.outValue)) { 93 return false; 94 } 95 if (this.inTicks != other.inTicks) { 96 return false; 97 } 98 if (this.outTicks != other.outTicks) { 99 return false; 100 } 101 return true; 102 } 103 104 @Override 105 protected double curve(double t) { 106 // Fallback: If NumberTangentInterpolator is used with a target, that is 107 // not a number, 108 // it behaves like linear interpolation. 109 return t; 110 } 111 } 112