UNPKG

bytev-charts

Version:

基于echarts和JavaScript及ES6封装的一个可以直接调用的图表组件库,内置主题设计,简单快捷,且支持用户自定义配置; npm 安装方式: npm install bytev-charts 若启动提示还需额外install插件,则运行 npm install @babel/runtime-corejs2 即可;

420 lines (363 loc) 14.9 kB
import _Object$keys from "@babel/runtime-corejs2/core-js/object/keys"; import _Object$values from "@babel/runtime-corejs2/core-js/object/values"; import _Array$isArray from "@babel/runtime-corejs2/core-js/array/is-array"; import _Map from "@babel/runtime-corejs2/core-js/map"; import "core-js/modules/es.function.name.js"; import "core-js/modules/es.array.index-of.js"; import "core-js/modules/es.array.iterator.js"; import "core-js/modules/es.array-buffer.slice.js"; import "core-js/modules/es.object.to-string.js"; import "core-js/modules/es.typed-array.float32-array.js"; import "core-js/modules/es.typed-array.copy-within.js"; import "core-js/modules/es.typed-array.every.js"; import "core-js/modules/es.typed-array.fill.js"; import "core-js/modules/es.typed-array.filter.js"; import "core-js/modules/es.typed-array.find.js"; import "core-js/modules/es.typed-array.find-index.js"; import "core-js/modules/es.typed-array.for-each.js"; import "core-js/modules/es.typed-array.includes.js"; import "core-js/modules/es.typed-array.index-of.js"; import "core-js/modules/es.typed-array.iterator.js"; import "core-js/modules/es.typed-array.join.js"; import "core-js/modules/es.typed-array.last-index-of.js"; import "core-js/modules/es.typed-array.map.js"; import "core-js/modules/es.typed-array.reduce.js"; import "core-js/modules/es.typed-array.reduce-right.js"; import "core-js/modules/es.typed-array.reverse.js"; import "core-js/modules/es.typed-array.set.js"; import "core-js/modules/es.typed-array.slice.js"; import "core-js/modules/es.typed-array.some.js"; import "core-js/modules/es.typed-array.sort.js"; import "core-js/modules/es.typed-array.subarray.js"; import "core-js/modules/es.typed-array.to-locale-string.js"; import "core-js/modules/es.typed-array.to-string.js"; import "core-js/modules/es.string.sub.js"; import "core-js/modules/es.promise.js"; import "core-js/modules/web.dom-collections.iterator.js"; import "core-js/modules/es.regexp.exec.js"; import "core-js/modules/es.array.map.js"; import "core-js/modules/es.function.bind.js"; console.warn("THREE.SkeletonUtils: As part of the transition to ES6 Modules, the files in 'examples/js' were deprecated in May 2020 (r117) and will be deleted in December 2020 (r124). You can find more information about developing using ES6 Modules in https://threejs.org/docs/#manual/en/introduction/Installation."); THREE.SkeletonUtils = { retarget: function () { var pos = new THREE.Vector3(), quat = new THREE.Quaternion(), scale = new THREE.Vector3(), bindBoneMatrix = new THREE.Matrix4(), relativeMatrix = new THREE.Matrix4(), globalMatrix = new THREE.Matrix4(); return function (target, source, options) { options = options || {}; options.preserveMatrix = options.preserveMatrix !== undefined ? options.preserveMatrix : true; options.preservePosition = options.preservePosition !== undefined ? options.preservePosition : true; options.preserveHipPosition = options.preserveHipPosition !== undefined ? options.preserveHipPosition : false; options.useTargetMatrix = options.useTargetMatrix !== undefined ? options.useTargetMatrix : false; options.hip = options.hip !== undefined ? options.hip : "hip"; options.names = options.names || {}; var sourceBones = source.isObject3D ? source.skeleton.bones : this.getBones(source), bones = target.isObject3D ? target.skeleton.bones : this.getBones(target), bindBones, bone, name, boneTo, bonesPosition, i; // reset bones if (target.isObject3D) { target.skeleton.pose(); } else { options.useTargetMatrix = true; options.preserveMatrix = false; } if (options.preservePosition) { bonesPosition = []; for (i = 0; i < bones.length; i++) { bonesPosition.push(bones[i].position.clone()); } } if (options.preserveMatrix) { // reset matrix target.updateMatrixWorld(); target.matrixWorld.identity(); // reset children matrix for (i = 0; i < target.children.length; ++i) { target.children[i].updateMatrixWorld(true); } } if (options.offsets) { bindBones = []; for (i = 0; i < bones.length; ++i) { bone = bones[i]; name = options.names[bone.name] || bone.name; if (options.offsets && options.offsets[name]) { bone.matrix.multiply(options.offsets[name]); bone.matrix.decompose(bone.position, bone.quaternion, bone.scale); bone.updateMatrixWorld(); } bindBones.push(bone.matrixWorld.clone()); } } for (i = 0; i < bones.length; ++i) { bone = bones[i]; name = options.names[bone.name] || bone.name; boneTo = this.getBoneByName(name, sourceBones); globalMatrix.copy(bone.matrixWorld); if (boneTo) { boneTo.updateMatrixWorld(); if (options.useTargetMatrix) { relativeMatrix.copy(boneTo.matrixWorld); } else { relativeMatrix.getInverse(target.matrixWorld); relativeMatrix.multiply(boneTo.matrixWorld); } // ignore scale to extract rotation scale.setFromMatrixScale(relativeMatrix); relativeMatrix.scale(scale.set(1 / scale.x, 1 / scale.y, 1 / scale.z)); // apply to global matrix globalMatrix.makeRotationFromQuaternion(quat.setFromRotationMatrix(relativeMatrix)); if (target.isObject3D) { var boneIndex = bones.indexOf(bone), wBindMatrix = bindBones ? bindBones[boneIndex] : bindBoneMatrix.getInverse(target.skeleton.boneInverses[boneIndex]); globalMatrix.multiply(wBindMatrix); } globalMatrix.copyPosition(relativeMatrix); } if (bone.parent && bone.parent.isBone) { bone.matrix.getInverse(bone.parent.matrixWorld); bone.matrix.multiply(globalMatrix); } else { bone.matrix.copy(globalMatrix); } if (options.preserveHipPosition && name === options.hip) { bone.matrix.setPosition(pos.set(0, bone.position.y, 0)); } bone.matrix.decompose(bone.position, bone.quaternion, bone.scale); bone.updateMatrixWorld(); } if (options.preservePosition) { for (i = 0; i < bones.length; ++i) { bone = bones[i]; name = options.names[bone.name] || bone.name; if (name !== options.hip) { bone.position.copy(bonesPosition[i]); } } } if (options.preserveMatrix) { // restore matrix target.updateMatrixWorld(true); } }; }(), retargetClip: function retargetClip(target, source, clip, options) { options = options || {}; options.useFirstFramePosition = options.useFirstFramePosition !== undefined ? options.useFirstFramePosition : false; options.fps = options.fps !== undefined ? options.fps : 30; options.names = options.names || []; if (!source.isObject3D) { source = this.getHelperFromSkeleton(source); } var numFrames = Math.round(clip.duration * (options.fps / 1000) * 1000), delta = 1 / options.fps, convertedTracks = [], mixer = new THREE.AnimationMixer(source), bones = this.getBones(target.skeleton), boneDatas = [], positionOffset, bone, boneTo, boneData, name, i, j; mixer.clipAction(clip).play(); mixer.update(0); source.updateMatrixWorld(); for (i = 0; i < numFrames; ++i) { var time = i * delta; this.retarget(target, source, options); for (j = 0; j < bones.length; ++j) { name = options.names[bones[j].name] || bones[j].name; boneTo = this.getBoneByName(name, source.skeleton); if (boneTo) { bone = bones[j]; boneData = boneDatas[j] = boneDatas[j] || { bone: bone }; if (options.hip === name) { if (!boneData.pos) { boneData.pos = { times: new Float32Array(numFrames), values: new Float32Array(numFrames * 3) }; } if (options.useFirstFramePosition) { if (i === 0) { positionOffset = bone.position.clone(); } bone.position.sub(positionOffset); } boneData.pos.times[i] = time; bone.position.toArray(boneData.pos.values, i * 3); } if (!boneData.quat) { boneData.quat = { times: new Float32Array(numFrames), values: new Float32Array(numFrames * 4) }; } boneData.quat.times[i] = time; bone.quaternion.toArray(boneData.quat.values, i * 4); } } mixer.update(delta); source.updateMatrixWorld(); } for (i = 0; i < boneDatas.length; ++i) { boneData = boneDatas[i]; if (boneData) { if (boneData.pos) { convertedTracks.push(new THREE.VectorKeyframeTrack(".bones[" + boneData.bone.name + "].position", boneData.pos.times, boneData.pos.values)); } convertedTracks.push(new THREE.QuaternionKeyframeTrack(".bones[" + boneData.bone.name + "].quaternion", boneData.quat.times, boneData.quat.values)); } } mixer.uncacheAction(clip); return new THREE.AnimationClip(clip.name, -1, convertedTracks); }, getHelperFromSkeleton: function getHelperFromSkeleton(skeleton) { var source = new THREE.SkeletonHelper(skeleton.bones[0]); source.skeleton = skeleton; return source; }, getSkeletonOffsets: function () { var targetParentPos = new THREE.Vector3(), targetPos = new THREE.Vector3(), sourceParentPos = new THREE.Vector3(), sourcePos = new THREE.Vector3(), targetDir = new THREE.Vector2(), sourceDir = new THREE.Vector2(); return function (target, source, options) { options = options || {}; options.hip = options.hip !== undefined ? options.hip : "hip"; options.names = options.names || {}; if (!source.isObject3D) { source = this.getHelperFromSkeleton(source); } var nameKeys = _Object$keys(options.names), nameValues = _Object$values(options.names), sourceBones = source.isObject3D ? source.skeleton.bones : this.getBones(source), bones = target.isObject3D ? target.skeleton.bones : this.getBones(target), offsets = [], bone, boneTo, name, i; target.skeleton.pose(); for (i = 0; i < bones.length; ++i) { bone = bones[i]; name = options.names[bone.name] || bone.name; boneTo = this.getBoneByName(name, sourceBones); if (boneTo && name !== options.hip) { var boneParent = this.getNearestBone(bone.parent, nameKeys), boneToParent = this.getNearestBone(boneTo.parent, nameValues); boneParent.updateMatrixWorld(); boneToParent.updateMatrixWorld(); targetParentPos.setFromMatrixPosition(boneParent.matrixWorld); targetPos.setFromMatrixPosition(bone.matrixWorld); sourceParentPos.setFromMatrixPosition(boneToParent.matrixWorld); sourcePos.setFromMatrixPosition(boneTo.matrixWorld); targetDir.subVectors(new THREE.Vector2(targetPos.x, targetPos.y), new THREE.Vector2(targetParentPos.x, targetParentPos.y)).normalize(); sourceDir.subVectors(new THREE.Vector2(sourcePos.x, sourcePos.y), new THREE.Vector2(sourceParentPos.x, sourceParentPos.y)).normalize(); var laterialAngle = targetDir.angle() - sourceDir.angle(); var offset = new THREE.Matrix4().makeRotationFromEuler(new THREE.Euler(0, 0, laterialAngle)); bone.matrix.multiply(offset); bone.matrix.decompose(bone.position, bone.quaternion, bone.scale); bone.updateMatrixWorld(); offsets[name] = offset; } } return offsets; }; }(), renameBones: function renameBones(skeleton, names) { var bones = this.getBones(skeleton); for (var i = 0; i < bones.length; ++i) { var bone = bones[i]; if (names[bone.name]) { bone.name = names[bone.name]; } } return this; }, getBones: function getBones(skeleton) { return _Array$isArray(skeleton) ? skeleton : skeleton.bones; }, getBoneByName: function getBoneByName(name, skeleton) { for (var i = 0, bones = this.getBones(skeleton); i < bones.length; i++) { if (name === bones[i].name) return bones[i]; } }, getNearestBone: function getNearestBone(bone, names) { while (bone.isBone) { if (names.indexOf(bone.name) !== -1) { return bone; } bone = bone.parent; } }, findBoneTrackData: function findBoneTrackData(name, tracks) { var regexp = /\[(.*)\]\.(.*)/, result = { name: name }; for (var i = 0; i < tracks.length; ++i) { // 1 is track name // 2 is track type var trackData = regexp.exec(tracks[i].name); if (trackData && name === trackData[1]) { result[trackData[2]] = i; } } return result; }, getEqualsBonesNames: function getEqualsBonesNames(skeleton, targetSkeleton) { var sourceBones = this.getBones(skeleton), targetBones = this.getBones(targetSkeleton), bones = []; search: for (var i = 0; i < sourceBones.length; i++) { var boneName = sourceBones[i].name; for (var j = 0; j < targetBones.length; j++) { if (boneName === targetBones[j].name) { bones.push(boneName); continue search; } } } return bones; }, clone: function clone(source) { var sourceLookup = new _Map(); var cloneLookup = new _Map(); var clone = source.clone(); parallelTraverse(source, clone, function (sourceNode, clonedNode) { sourceLookup.set(clonedNode, sourceNode); cloneLookup.set(sourceNode, clonedNode); }); clone.traverse(function (node) { if (!node.isSkinnedMesh) return; var clonedMesh = node; var sourceMesh = sourceLookup.get(node); var sourceBones = sourceMesh.skeleton.bones; clonedMesh.skeleton = sourceMesh.skeleton.clone(); clonedMesh.bindMatrix.copy(sourceMesh.bindMatrix); clonedMesh.skeleton.bones = sourceBones.map(function (bone) { return cloneLookup.get(bone); }); clonedMesh.bind(clonedMesh.skeleton, clonedMesh.bindMatrix); }); return clone; } }; function parallelTraverse(a, b, callback) { callback(a, b); for (var i = 0; i < a.children.length; i++) { parallelTraverse(a.children[i], b.children[i], callback); } }