OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2010, Google Inc. | 2 * Copyright 2010, Google Inc. |
3 * All rights reserved. | 3 * All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
7 * met: | 7 * met: |
8 * | 8 * |
9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 return this.sample_rate_; | 422 return this.sample_rate_; |
423 }); | 423 }); |
424 | 424 |
425 o3d.Curve.prototype.__defineSetter__("sampleRate", function(rate) { | 425 o3d.Curve.prototype.__defineSetter__("sampleRate", function(rate) { |
426 if (rate < o3d.Curve.kMinimumSampleRate) { | 426 if (rate < o3d.Curve.kMinimumSampleRate) { |
427 rate = o3d.Curve.kMinimumSampleRate; | 427 rate = o3d.Curve.kMinimumSampleRate; |
428 this.gl.client.error_callback( | 428 this.gl.client.error_callback( |
429 "attempt to set sample rate to " + rate + | 429 "attempt to set sample rate to " + rate + |
430 " which is lower than the minimum of " + o3d.Curve.kMinimumSampleRate); | 430 " which is lower than the minimum of " + o3d.Curve.kMinimumSampleRate); |
431 } else if (rate != this.sample_rate_) { | 431 } else if (rate != this.sample_rate_) { |
432 this.sample_rate_ = new_sample_rate; | 432 this.sample_rate_ = rate; |
433 this.invalidateCache_(); | 433 this.invalidateCache_(); |
434 } | 434 } |
435 }); | 435 }); |
436 | 436 |
437 /** | 437 /** |
438 * @type {number} | 438 * @type {number} |
439 */ | 439 */ |
440 o3d.Curve.Infinity = goog.typedef; | 440 o3d.Curve.Infinity = goog.typedef; |
441 | 441 |
442 /** | 442 /** |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
519 * Length must be a multiple of 2 | 519 * Length must be a multiple of 2 |
520 */ | 520 */ |
521 o3d.Curve.prototype.addLinearKeys = function(values) { | 521 o3d.Curve.prototype.addLinearKeys = function(values) { |
522 var kNumLinearKeyValues = 2; | 522 var kNumLinearKeyValues = 2; |
523 if (values.length % kNumLinearKeyValues != 0) { | 523 if (values.length % kNumLinearKeyValues != 0) { |
524 this.gl.client.error_callback( | 524 this.gl.client.error_callback( |
525 "addLinearKeys: expected multiple of 2 values got "+values.size()); | 525 "addLinearKeys: expected multiple of 2 values got "+values.size()); |
526 return; | 526 return; |
527 } | 527 } |
528 for (var i = 0; i < values.length; i += kNumLinearKeyValues) { | 528 for (var i = 0; i < values.length; i += kNumLinearKeyValues) { |
529 var newKey = this.createKey("LinearKey"); | 529 var newKey = this.createKey("LinearCurveKey"); |
530 newKey.input = values[i]; | 530 newKey.input = values[i]; |
531 newKey.output = values[i+1]; | 531 newKey.output = values[i+1]; |
532 } | 532 } |
533 this.sorted_ = false; | 533 this.sorted_ = false; |
534 }; | 534 }; |
535 | 535 |
536 /** | 536 /** |
537 * Adds 1 or more StepKeys to this Curve. | 537 * Adds 1 or more StepKeys to this Curve. |
538 * | 538 * |
539 * Example: | 539 * Example: |
540 * <pre> | 540 * <pre> |
541 * // Creates 2 keys. | 541 * // Creates 2 keys. |
542 * // 1 key at 0 with an output of 10 | 542 * // 1 key at 0 with an output of 10 |
543 * // 1 key at 20 with an output of 30 | 543 * // 1 key at 20 with an output of 30 |
544 * curve.addStepKeys([0,10,20,30]); | 544 * curve.addStepKeys([0,10,20,30]); |
545 * </pre>. | 545 * </pre>. |
546 * | 546 * |
547 * @param {!Array.<number>} values Array of input, output pairs. | 547 * @param {!Array.<number>} values Array of input, output pairs. |
548 * Length must be a multiple of 2 | 548 * Length must be a multiple of 2 |
549 */ | 549 */ |
550 o3d.Curve.prototype.addStepKeys = function(values) { | 550 o3d.Curve.prototype.addStepKeys = function(values) { |
551 var kNumStepKeyValues = 2; | 551 var kNumStepKeyValues = 2; |
552 if (values.length % kNumStepKeyValues != 0) { | 552 if (values.length % kNumStepKeyValues != 0) { |
553 this.gl.client.error_callback( | 553 this.gl.client.error_callback( |
554 "addStepKeys: expected multiple of 2 values got "+values.size()); | 554 "addStepKeys: expected multiple of 2 values got "+values.size()); |
555 return; | 555 return; |
556 } | 556 } |
557 for (var i = 0; i < values.length; i += kNumStepKeyValues) { | 557 for (var i = 0; i < values.length; i += kNumStepKeyValues) { |
558 var newKey = this.createKey("StepKey"); | 558 var newKey = this.createKey("StepCurveKey"); |
559 newKey.input = values[i]; | 559 newKey.input = values[i]; |
560 newKey.output = values[i+1]; | 560 newKey.output = values[i+1]; |
561 } | 561 } |
562 this.sorted_ = false; | 562 this.sorted_ = false; |
563 }; | 563 }; |
564 | 564 |
565 /** | 565 /** |
566 * Adds 1 or more BezierKeys to this Curve. | 566 * Adds 1 or more BezierKeys to this Curve. |
567 * | 567 * |
568 * Example: | 568 * Example: |
569 * <pre> | 569 * <pre> |
570 * // Creates 2 keys. | 570 * // Creates 2 keys. |
571 * // 1 key at 0 with an output of 10, in tangent of 1,9, out tangent 9,0.5 | 571 * // 1 key at 0 with an output of 10, in tangent of 1,9, out tangent 9,0.5 |
572 * // 1 key at 20 with an output of 30, in tangent of 30, 3, out tangent 4, 28 | 572 * // 1 key at 20 with an output of 30, in tangent of 30, 3, out tangent 4, 28 |
573 * curve.addBezierKeys([0,10,1,9,9,0.5,2,30,3,4,28]); | 573 * curve.addBezierKeys([0,10,1,9,9,0.5,2,30,3,4,28]); |
574 * </pre>. | 574 * </pre>. |
575 * | 575 * |
576 * @param {!Array.<number>} values Array of tuples of the form (input, output, | 576 * @param {!Array.<number>} values Array of tuples of the form (input, output, |
577 * inTangent[0], inTangent[1], outTangent[0], outTangent[1]). | 577 * inTangent[0], inTangent[1], outTangent[0], outTangent[1]). |
578 * Length must be a multiple of 6. | 578 * Length must be a multiple of 6. |
579 */ | 579 */ |
580 o3d.Curve.prototype.addBezierKeys = function(values) { | 580 o3d.Curve.prototype.addBezierKeys = function(values) { |
581 var kNumBezierKeyValues = 6; | 581 var kNumBezierKeyValues = 6; |
582 if (values.length % kNumBezierKeyValues != 0) { | 582 if (values.length % kNumBezierKeyValues != 0) { |
583 this.gl.client.error_callback( | 583 this.gl.client.error_callback( |
584 "addBezierKeys: expected multiple of 6 values got "+values.size()); | 584 "addBezierKeys: expected multiple of 6 values got "+values.size()); |
585 return; | 585 return; |
586 } | 586 } |
587 for (var ii = 0; ii < values.length; ii += kNumBezierKeyValues) { | 587 for (var ii = 0; ii < values.length; ii += kNumBezierKeyValues) { |
588 var newKey = this.createKey("BezierKey"); | 588 var newKey = this.createKey("BezierCurveKey"); |
589 newKey.input = values[i]; | 589 newKey.input = values[i]; |
590 newKey.output = values[i+1]; | 590 newKey.output = values[i+1]; |
591 newKey.inTangent[0] = values[i+2]; | 591 newKey.inTangent[0] = values[i+2]; |
592 newKey.inTangent[1] = values[i+3]; | 592 newKey.inTangent[1] = values[i+3]; |
593 newKey.outTangent[0] = values[i+4]; | 593 newKey.outTangent[0] = values[i+4]; |
594 newKey.outTangent[1] = values[i+5]; | 594 newKey.outTangent[1] = values[i+5]; |
595 } | 595 } |
596 this.sorted_ = false; | 596 this.sorted_ = false; |
597 }; | 597 }; |
598 | 598 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
718 } | 718 } |
719 } | 719 } |
720 } | 720 } |
721 | 721 |
722 if (!found) { | 722 if (!found) { |
723 // TODO: If we assume the most common case is sampled keys and | 723 // TODO: If we assume the most common case is sampled keys and |
724 // constant intervals we can make a quick guess where that key is. | 724 // constant intervals we can make a quick guess where that key is. |
725 | 725 |
726 // Find the current the keys that cover our input. | 726 // Find the current the keys that cover our input. |
727 while (start <= end) { | 727 while (start <= end) { |
728 var mid = (start + end) / 2; | 728 var mid = Math.floor((start + end)/2); |
729 if (input > keys[mid].input) { | 729 if (input > keys[mid].input) { |
730 start = mid + 1; | 730 start = mid + 1; |
731 } else { | 731 } else { |
732 if (mid == 0) { | 732 if (mid == 0) { |
733 break; | 733 break; |
734 } | 734 } |
735 end = mid - 1; | 735 end = mid - 1; |
736 } | 736 } |
737 } | 737 } |
738 | 738 |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
893 // interpolate end_input to anything past it. | 893 // interpolate end_input to anything past it. |
894 if (input >= end_input) { | 894 if (input >= end_input) { |
895 return end_output + output_offset; | 895 return end_output + output_offset; |
896 } | 896 } |
897 | 897 |
898 // TODO(pathorn): Implement curve cache in javascript. | 898 // TODO(pathorn): Implement curve cache in javascript. |
899 // See 'void Curve::CreateCache' in o3d/core/cross/curve.cc | 899 // See 'void Curve::CreateCache' in o3d/core/cross/curve.cc |
900 | 900 |
901 return this.getOutputInSpan_(input, context) + output_offset; | 901 return this.getOutputInSpan_(input, context) + output_offset; |
902 }; | 902 }; |
OLD | NEW |