HCameraElement.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import {
  2. degToRads,
  3. } from '../../utils/common';
  4. import {
  5. extendPrototype,
  6. } from '../../utils/functionExtensions';
  7. import PropertyFactory from '../../utils/PropertyFactory';
  8. import BaseElement from '../BaseElement';
  9. import HierarchyElement from '../helpers/HierarchyElement';
  10. import FrameElement from '../helpers/FrameElement';
  11. import Matrix from '../../3rd_party/transformation-matrix';
  12. function HCameraElement(data, globalData, comp) {
  13. this.initFrame();
  14. this.initBaseData(data, globalData, comp);
  15. this.initHierarchy();
  16. var getProp = PropertyFactory.getProp;
  17. this.pe = getProp(this, data.pe, 0, 0, this);
  18. if (data.ks.p.s) {
  19. this.px = getProp(this, data.ks.p.x, 1, 0, this);
  20. this.py = getProp(this, data.ks.p.y, 1, 0, this);
  21. this.pz = getProp(this, data.ks.p.z, 1, 0, this);
  22. } else {
  23. this.p = getProp(this, data.ks.p, 1, 0, this);
  24. }
  25. if (data.ks.a) {
  26. this.a = getProp(this, data.ks.a, 1, 0, this);
  27. }
  28. if (data.ks.or.k.length && data.ks.or.k[0].to) {
  29. var i;
  30. var len = data.ks.or.k.length;
  31. for (i = 0; i < len; i += 1) {
  32. data.ks.or.k[i].to = null;
  33. data.ks.or.k[i].ti = null;
  34. }
  35. }
  36. this.or = getProp(this, data.ks.or, 1, degToRads, this);
  37. this.or.sh = true;
  38. this.rx = getProp(this, data.ks.rx, 0, degToRads, this);
  39. this.ry = getProp(this, data.ks.ry, 0, degToRads, this);
  40. this.rz = getProp(this, data.ks.rz, 0, degToRads, this);
  41. this.mat = new Matrix();
  42. this._prevMat = new Matrix();
  43. this._isFirstFrame = true;
  44. // TODO: find a better way to make the HCamera element to be compatible with the LayerInterface and TransformInterface.
  45. this.finalTransform = {
  46. mProp: this,
  47. };
  48. }
  49. extendPrototype([BaseElement, FrameElement, HierarchyElement], HCameraElement);
  50. HCameraElement.prototype.setup = function () {
  51. var i;
  52. var len = this.comp.threeDElements.length;
  53. var comp;
  54. var perspectiveStyle;
  55. var containerStyle;
  56. for (i = 0; i < len; i += 1) {
  57. // [perspectiveElem,container]
  58. comp = this.comp.threeDElements[i];
  59. if (comp.type === '3d') {
  60. perspectiveStyle = comp.perspectiveElem.style;
  61. containerStyle = comp.container.style;
  62. var perspective = this.pe.v + 'px';
  63. var origin = '0px 0px 0px';
  64. var matrix = 'matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)';
  65. perspectiveStyle.perspective = perspective;
  66. perspectiveStyle.webkitPerspective = perspective;
  67. containerStyle.transformOrigin = origin;
  68. containerStyle.mozTransformOrigin = origin;
  69. containerStyle.webkitTransformOrigin = origin;
  70. perspectiveStyle.transform = matrix;
  71. perspectiveStyle.webkitTransform = matrix;
  72. }
  73. }
  74. };
  75. HCameraElement.prototype.createElements = function () {
  76. };
  77. HCameraElement.prototype.hide = function () {
  78. };
  79. HCameraElement.prototype.renderFrame = function () {
  80. var _mdf = this._isFirstFrame;
  81. var i;
  82. var len;
  83. if (this.hierarchy) {
  84. len = this.hierarchy.length;
  85. for (i = 0; i < len; i += 1) {
  86. _mdf = this.hierarchy[i].finalTransform.mProp._mdf || _mdf;
  87. }
  88. }
  89. if (_mdf || this.pe._mdf || (this.p && this.p._mdf) || (this.px && (this.px._mdf || this.py._mdf || this.pz._mdf)) || this.rx._mdf || this.ry._mdf || this.rz._mdf || this.or._mdf || (this.a && this.a._mdf)) {
  90. this.mat.reset();
  91. if (this.hierarchy) {
  92. len = this.hierarchy.length - 1;
  93. for (i = len; i >= 0; i -= 1) {
  94. var mTransf = this.hierarchy[i].finalTransform.mProp;
  95. this.mat.translate(-mTransf.p.v[0], -mTransf.p.v[1], mTransf.p.v[2]);
  96. this.mat.rotateX(-mTransf.or.v[0]).rotateY(-mTransf.or.v[1]).rotateZ(mTransf.or.v[2]);
  97. this.mat.rotateX(-mTransf.rx.v).rotateY(-mTransf.ry.v).rotateZ(mTransf.rz.v);
  98. this.mat.scale(1 / mTransf.s.v[0], 1 / mTransf.s.v[1], 1 / mTransf.s.v[2]);
  99. this.mat.translate(mTransf.a.v[0], mTransf.a.v[1], mTransf.a.v[2]);
  100. }
  101. }
  102. if (this.p) {
  103. this.mat.translate(-this.p.v[0], -this.p.v[1], this.p.v[2]);
  104. } else {
  105. this.mat.translate(-this.px.v, -this.py.v, this.pz.v);
  106. }
  107. if (this.a) {
  108. var diffVector;
  109. if (this.p) {
  110. diffVector = [this.p.v[0] - this.a.v[0], this.p.v[1] - this.a.v[1], this.p.v[2] - this.a.v[2]];
  111. } else {
  112. diffVector = [this.px.v - this.a.v[0], this.py.v - this.a.v[1], this.pz.v - this.a.v[2]];
  113. }
  114. var mag = Math.sqrt(Math.pow(diffVector[0], 2) + Math.pow(diffVector[1], 2) + Math.pow(diffVector[2], 2));
  115. // var lookDir = getNormalizedPoint(getDiffVector(this.a.v,this.p.v));
  116. var lookDir = [diffVector[0] / mag, diffVector[1] / mag, diffVector[2] / mag];
  117. var lookLengthOnXZ = Math.sqrt(lookDir[2] * lookDir[2] + lookDir[0] * lookDir[0]);
  118. var mRotationX = (Math.atan2(lookDir[1], lookLengthOnXZ));
  119. var mRotationY = (Math.atan2(lookDir[0], -lookDir[2]));
  120. this.mat.rotateY(mRotationY).rotateX(-mRotationX);
  121. }
  122. this.mat.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v);
  123. this.mat.rotateX(-this.or.v[0]).rotateY(-this.or.v[1]).rotateZ(this.or.v[2]);
  124. this.mat.translate(this.globalData.compSize.w / 2, this.globalData.compSize.h / 2, 0);
  125. this.mat.translate(0, 0, this.pe.v);
  126. var hasMatrixChanged = !this._prevMat.equals(this.mat);
  127. if ((hasMatrixChanged || this.pe._mdf) && this.comp.threeDElements) {
  128. len = this.comp.threeDElements.length;
  129. var comp;
  130. var perspectiveStyle;
  131. var containerStyle;
  132. for (i = 0; i < len; i += 1) {
  133. comp = this.comp.threeDElements[i];
  134. if (comp.type === '3d') {
  135. if (hasMatrixChanged) {
  136. var matValue = this.mat.toCSS();
  137. containerStyle = comp.container.style;
  138. containerStyle.transform = matValue;
  139. containerStyle.webkitTransform = matValue;
  140. }
  141. if (this.pe._mdf) {
  142. perspectiveStyle = comp.perspectiveElem.style;
  143. perspectiveStyle.perspective = this.pe.v + 'px';
  144. perspectiveStyle.webkitPerspective = this.pe.v + 'px';
  145. }
  146. }
  147. }
  148. this.mat.clone(this._prevMat);
  149. }
  150. }
  151. this._isFirstFrame = false;
  152. };
  153. HCameraElement.prototype.prepareFrame = function (num) {
  154. this.prepareProperties(num, true);
  155. };
  156. HCameraElement.prototype.destroy = function () {
  157. };
  158. HCameraElement.prototype.getBaseElement = function () { return null; };
  159. export default HCameraElement;