Parcourir la source

添加动画材质

tags/1.0.0
Caven il y a 5 ans
Parent
révision
e63d5fa3e5

+ 2
- 1
package.json Voir le fichier

@@ -45,6 +45,7 @@
"uglifyjs-webpack-plugin": "^2.1.2",
"url-loader": "^1.1.2",
"webpack": "^4.29.6",
"webpack-cli": "^3.3.0"
"webpack-cli": "^3.3.0",
"webpack-glsl-loader": "^1.0.1"
}
}

+ 4
- 2
src/core/const/index.js Voir le fichier

@@ -2,7 +2,7 @@
* @Author: Caven
* @Date: 2020-01-03 10:09:19
* @Last Modified by: Caven
* @Last Modified time: 2020-02-20 14:07:36
* @Last Modified time: 2020-02-24 16:10:30
*/
import Cesium from '@/namespace'

@@ -82,7 +82,9 @@ DC.OverlayState = {
DC.EffectType = {
RAIN: 'rain',
SNOW: 'snow',
BLOOM: 'bloom'
BLOOM: 'bloom',
CIRCLE_SCAN: 'circleScan',
RADAR_SCAN: 'radarScan'
}

DC.EffectEventType = {

+ 7
- 1
src/core/option/ViewerOption.js Voir le fichier

@@ -2,7 +2,7 @@
* @Author: Caven
* @Date: 2019-12-30 09:24:37
* @Last Modified by: Caven
* @Last Modified time: 2020-02-19 12:28:30
* @Last Modified time: 2020-02-24 16:03:49
*/

import Cesium from '@/namespace'
@@ -44,6 +44,12 @@ class ViewerOption {
options.moon,
true
)

this._viewer.delegate.scene.globe.depthTestAgainstTerrain = Cesium.defaultValue(
options.underground,
false
)

return this
}


+ 2
- 1
src/plugins/DC.Pulgins.Loader.js Voir le fichier

@@ -2,11 +2,12 @@
* @Author: Caven
* @Date: 2020-01-14 18:24:57
* @Last Modified by: Caven
* @Last Modified time: 2020-02-20 13:46:12
* @Last Modified time: 2020-02-24 13:29:09
*/
import './animation/DC.GlobeRotate'
import './roaming/DC.Roaming'
import './plot/DC.Plot'
import './material'
import './effects'
import './layer'
import './overlay'

+ 1
- 1
src/plugins/DC.Pulgins.js Voir le fichier

@@ -2,7 +2,7 @@
* @Author: Caven
* @Date: 2020-01-14 18:22:10
* @Last Modified by: Caven
* @Last Modified time: 2020-02-20 14:08:10
* @Last Modified time: 2020-02-24 13:29:05
*/
;(function() {
let initialized = false

+ 1
- 1
src/plugins/effects/DC.BloomEffect.js Voir le fichier

@@ -2,7 +2,7 @@
* @Author: Caven
* @Date: 2020-02-20 13:26:49
* @Last Modified by: Caven
* @Last Modified time: 2020-02-20 14:10:13
* @Last Modified time: 2020-02-24 16:33:50
*/
import Effect from './Effect'


+ 117
- 0
src/plugins/effects/DC.CircleScanEffect.js Voir le fichier

@@ -0,0 +1,117 @@
/*
* @Author: Caven
* @Date: 2020-02-24 14:11:22
* @Last Modified by: Caven
* @Last Modified time: 2020-02-24 16:33:44
*/

import Cesium from '@/namespace'
import Effect from './Effect'

let CircleScanShader = require('../shader/CircleScanMaterial.glsl')

DC.CircleScanEffect = class extends Effect {
constructor(id, position, radius, color, duration) {
if (!position || !(position instanceof DC.Position)) {
throw new Error('the position invalid')
}
super(id)
this._position = position
this._radius = radius || 0
this._color = Cesium.defaultValue(color, Cesium.Color.RED)
this._duration = Cesium.defaultValue(duration, 1e3)
this.type = DC.EffectType.CIRCLE_SCAN
}

/**
* 准备代理
*/
_prepareDelegate() {
let cartesian3Center = DC.T.transformWSG84ToCartesian(this._position)
let cartesian4Center = new Cesium.Cartesian4(
cartesian3Center.x,
cartesian3Center.y,
cartesian3Center.z,
1
)
let cartesian3Center1 = DC.T.transformWSG84ToCartesian(
new DC.Position(
this._position.lng,
this._position.lat,
this._position.alt + 500
)
)
let cartesian4Center1 = new Cesium.Cartesian4(
cartesian3Center1.x,
cartesian3Center1.y,
cartesian3Center1.z,
1
)

let _time = new Date().getTime()
this._delegate = new Cesium.PostProcessStage({
name: this._id,
fragmentShader: CircleScanShader,
uniforms: {
u_scanCenterEC: () => {
return Cesium.Matrix4.multiplyByVector(
this._viewer.delegate.camera._viewMatrix,
cartesian4Center,
new Cesium.Cartesian4()
)
},
u_scanPlaneNormalEC: () => {
let temp = Cesium.Matrix4.multiplyByVector(
this._viewer.delegate.camera._viewMatrix,
cartesian4Center,
new Cesium.Cartesian4()
)
let temp1 = Cesium.Matrix4.multiplyByVector(
this._viewer.delegate.camera._viewMatrix,
cartesian4Center1,
new Cesium.Cartesian4()
)
let _scratchCartesian3Normal = new Cesium.Cartesian3()
_scratchCartesian3Normal.x = temp1.x - temp.x
_scratchCartesian3Normal.y = temp1.y - temp.y
_scratchCartesian3Normal.z = temp1.z - temp.z
Cesium.Cartesian3.normalize(
_scratchCartesian3Normal,
_scratchCartesian3Normal
)
return _scratchCartesian3Normal
},
u_radius: () => {
return (
(this._radius * ((new Date().getTime() - _time) % this._duration)) /
this._duration
)
},
u_scanColor: this._color
}
})
}
/**
*
* @param {*} viewer
* 效果添加的回调函数,
*/
_addCallback(viewer) {
this._viewer = viewer
this._prepareDelegate()
if (this._delegate) {
this._viewer.delegate.scene.postProcessStages.add(this._delegate)
}
this._state = DC.EffectState.ADDED
}

/**
* 效果添加的回调函数
*/
_removeCallback() {
if ((this._viewer, this._delegate)) {
this._viewer.delegate.scene.postProcessStages.remove(this._delegate)
}
this._state = DC.EffectState.REMOVED
}
}

+ 181
- 0
src/plugins/effects/DC.RadarScanEffect.js Voir le fichier

@@ -0,0 +1,181 @@
/*
* @Author: Caven
* @Date: 2020-02-24 14:11:22
* @Last Modified by: Caven
* @Last Modified time: 2020-02-24 16:29:30
*/

import Cesium from '@/namespace'
import Effect from './Effect'

let RadarScanShader = require('../shader/RadarScanMaterial.glsl')

DC.RadarScanEffect = class extends Effect {
constructor(id, position, radius, color, duration) {
if (!position || !(position instanceof DC.Position)) {
throw new Error('the position invalid')
}
super(id)
this._position = position
this._radius = radius || 0
this._color = Cesium.defaultValue(color, Cesium.Color.RED)
this._duration = Cesium.defaultValue(duration, 1e3)
this.type = DC.EffectType.RADAR_SCAN
}

/**
* 准备代理
*/
_prepareDelegate() {
let cartesian3Center = DC.T.transformWSG84ToCartesian(this._position)
let cartesian4Center = new Cesium.Cartesian4(
cartesian3Center.x,
cartesian3Center.y,
cartesian3Center.z,
1
)
let cartesian3Center1 = DC.T.transformWSG84ToCartesian(
new DC.Position(
this._position.lng,
this._position.lat,
this._position.alt + 500
)
)
let cartesian4Center1 = new Cesium.Cartesian4(
cartesian3Center1.x,
cartesian3Center1.y,
cartesian3Center1.z,
1
)

let cartesian3Center2 = DC.T.transformWSG84ToCartesian(
new DC.Position(
this._position.lng + 0.001,
this._position.lat,
this._position.alt
)
)
let cartesian4Center2 = new Cesium.Cartesian4(
cartesian3Center2.x,
cartesian3Center2.y,
cartesian3Center2.z,
1
)
let _time = new Date().getTime()
let _RotateQ = new Cesium.Quaternion()
let _RotateM = new Cesium.Matrix3()
let _scratchCartesian4Center = new Cesium.Cartesian4()
let _scratchCartesian4Center1 = new Cesium.Cartesian4()
let _scratchCartesian4Center2 = new Cesium.Cartesian4()
let _scratchCartesian3Normal = new Cesium.Cartesian3()
let _scratchCartesian3Normal1 = new Cesium.Cartesian3()
this._delegate = new Cesium.PostProcessStage({
name: this._id,
fragmentShader: RadarScanShader,
uniforms: {
u_scanCenterEC: () => {
return Cesium.Matrix4.multiplyByVector(
this._viewer.delegate.camera._viewMatrix,
cartesian4Center,
_scratchCartesian4Center
)
},
u_scanPlaneNormalEC: () => {
let temp = Cesium.Matrix4.multiplyByVector(
this._viewer.delegate.camera._viewMatrix,
cartesian4Center,
_scratchCartesian4Center
)
let temp1 = Cesium.Matrix4.multiplyByVector(
this._viewer.delegate.camera._viewMatrix,
cartesian4Center1,
_scratchCartesian4Center1
)
_scratchCartesian3Normal.x = temp1.x - temp.x
_scratchCartesian3Normal.y = temp1.y - temp.y
_scratchCartesian3Normal.z = temp1.z - temp.z
Cesium.Cartesian3.normalize(
_scratchCartesian3Normal,
_scratchCartesian3Normal
)
return _scratchCartesian3Normal
},

u_scanLineNormalEC: () => {
let temp = Cesium.Matrix4.multiplyByVector(
this._viewer.delegate.camera._viewMatrix,
cartesian4Center,
_scratchCartesian4Center
)
let temp1 = Cesium.Matrix4.multiplyByVector(
this._viewer.delegate.camera._viewMatrix,
cartesian4Center1,
_scratchCartesian4Center1
)
let temp2 = Cesium.Matrix4.multiplyByVector(
viewer.camera._viewMatrix,
cartesian4Center2,
_scratchCartesian4Center2
)

_scratchCartesian3Normal.x = temp1.x - temp.x
_scratchCartesian3Normal.y = temp1.y - temp.y
_scratchCartesian3Normal.z = temp1.z - temp.z

Cesium.Cartesian3.normalize(
_scratchCartesian3Normal,
_scratchCartesian3Normal
)

_scratchCartesian3Normal1.x = temp2.x - temp.x
_scratchCartesian3Normal1.y = temp2.y - temp.y
_scratchCartesian3Normal1.z = temp2.z - temp.z

let tempTime =
((new Date().getTime() - _time) % this._duration) / this._duration
Cesium.Quaternion.fromAxisAngle(
_scratchCartesian3Normal,
tempTime * Cesium.Math.PI * 2,
_RotateQ
)
Cesium.Matrix3.fromQuaternion(_RotateQ, _RotateM)
Cesium.Matrix3.multiplyByVector(
_RotateM,
_scratchCartesian3Normal1,
_scratchCartesian3Normal1
)
Cesium.Cartesian3.normalize(
_scratchCartesian3Normal1,
_scratchCartesian3Normal1
)
return _scratchCartesian3Normal1
},
u_radius: this._radius,
u_scanColor: this._color
}
})
}
/**
*
* @param {*} viewer
* 效果添加的回调函数,
*/
_addCallback(viewer) {
this._viewer = viewer
this._prepareDelegate()
if (this._delegate) {
this._viewer.delegate.scene.postProcessStages.add(this._delegate)
}
this._state = DC.EffectState.ADDED
}

/**
* 效果添加的回调函数
*/
_removeCallback() {
if ((this._viewer, this._delegate)) {
this._viewer.delegate.scene.postProcessStages.remove(this._delegate)
}
this._state = DC.EffectState.REMOVED
}
}

+ 1
- 1
src/plugins/effects/DC.RainEffect.js Voir le fichier

@@ -2,5 +2,5 @@
* @Author: Caven
* @Date: 2020-01-15 20:23:42
* @Last Modified by: Caven
* @Last Modified time: 2020-01-18 18:12:00
* @Last Modified time: 2020-02-24 16:33:53
*/

+ 1
- 1
src/plugins/effects/DC.WaterEffect.js Voir le fichier

@@ -2,7 +2,7 @@
* @Author: Caven
* @Date: 2020-01-14 18:25:41
* @Last Modified by: Caven
* @Last Modified time: 2020-02-20 13:45:59
* @Last Modified time: 2020-02-24 16:54:24
*/
import Cesium from '@/namespace'
import Effect from './Effect'

+ 3
- 1
src/plugins/effects/index.js Voir le fichier

@@ -2,6 +2,8 @@
* @Author: Caven
* @Date: 2020-01-14 18:25:25
* @Last Modified by: Caven
* @Last Modified time: 2020-02-20 13:46:03
* @Last Modified time: 2020-02-24 16:24:23
*/
import './DC.BloomEffect'
import './DC.CircleScanEffect'
import './DC.RadarScanEffect'

+ 80
- 0
src/plugins/material/DC.PolylineFlowMaterialProperty.js Voir le fichier

@@ -0,0 +1,80 @@
/*
* @Author: Caven
* @Date: 2020-02-24 13:53:52
* @Last Modified by: Caven
* @Last Modified time: 2020-02-24 13:57:34
*/

import Cesium from '@/namespace'

let LineFlowShader = require('../shader/PolylineFlowMaterial.glsl')

DC.PolylineFlowMaterialProperty = class {
constructor(options) {
options = options || {}
this._definitionChanged = new Cesium.Event()
this._color = undefined
this._colorSubscription = undefined
this.color = Cesium.defaultValue(
options.color,
Cesium.Color.fromBytes(0, 255, 255, 255)
)
this._duration = undefined
this._durationSubscription = undefined
this.duration = Cesium.defaultValue(options.duration, 45)
}

get isConstant() {
return false
}

get definitionChanged() {
return this._definitionChanged
}

getType(time) {
return Cesium.Material.PolylineFlowType
}

getValue(time, result) {
if (!result) {
result = {}
}
result.color = Cesium.Property.getValueOrClonedDefault(
this._color,
time,
Cesium.Color.WHITE,
result.color
)
result.duration = this._duration
return result
}

equals(other) {
return (
this === other ||
(other instanceof DC.PolylineFlowMaterialProperty &&
Cesium.Property.equals(this._color, other._color))
)
}
}

Cesium.defineProperties(DC.PolylineFlowMaterialProperty.prototype, {
color: Cesium.createPropertyDescriptor('color'),
duration: Cesium.createPropertyDescriptor('duration')
})

Cesium.Material.PolylineFlowType = 'PolylineFlow'
Cesium.Material._materialCache.addMaterial(Cesium.Material.PolylineFlowType, {
fabric: {
type: Cesium.Material.PolylineFlowType,
uniforms: {
color: new Cesium.Color(1.0, 0.0, 0.0, 0.7),
duration: 45
},
source: LineFlowShader
},
translucent: function(material) {
return true
}
})

+ 84
- 0
src/plugins/material/DC.PolylineTrailMaterialProperty.js Voir le fichier

@@ -0,0 +1,84 @@
/*
* @Author: Caven
* @Date: 2020-02-24 13:09:09
* @Last Modified by: Caven
* @Last Modified time: 2020-02-24 14:07:45
*/

import Cesium from '@/namespace'

const IMG =
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAAgCAYAAABkS8DlAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAADSSURBVHja7NYxEoUgDEDBYM39z2qHtZViwMFxt1FJnF/98ZXWWkRE7LWWOOt5Lsm9q/vsbu9Zdtazs/J19O5bs1XPZrwze/6V31zxbOZs1n905Wt2p3f25GzE7ohv6q3nLQCA3xEAACAAAAABAAAIAABAAAAAAgAAEAAAgAAAAAQAACAAAAABAAAIAABAAAAAAgAAEAAAgAAAAAQAACAAAEAAAAACAAAQAACAAAAABAAAIAAAAAEAAAgAAEAAAAACAAAQAACAAAAA8g4AAAD//wMA4WEFTJOT5UIAAAAASUVORK5CYII='

let LineTrailShader = require('../shader/PolylineTrailMaterial.glsl')

DC.PolylineTrailMaterialProperty = class {
constructor(options) {
options = options || {}
this._definitionChanged = new Cesium.Event()
this._color = undefined
this._colorSubscription = undefined
this._duration = undefined
this._durationSubscription = undefined
this.color = Cesium.defaultValue(
options.color,
Cesium.Color.fromBytes(0, 255, 255, 255)
)
this.duration = Cesium.defaultValue(options.duration, 45)
}

get isConstant() {
return false
}

get definitionChanged() {
return this._definitionChanged
}

getType(time) {
return Cesium.Material.PolylineTrailType
}

getValue(time, result) {
if (!result) {
result = {}
}
result.color = Cesium.Property.getValueOrClonedDefault(
this._color,
time,
Cesium.Color.WHITE,
result.color
)
result.duration = this._duration
return result
}

equals(other) {
return (
this === other ||
(other instanceof DC.PolylineTrailMaterialProperty &&
Cesium.Property.equals(this._color, other._color))
)
}
}

Cesium.defineProperties(DC.PolylineTrailMaterialProperty.prototype, {
color: Cesium.createPropertyDescriptor('color'),
duration: Cesium.createPropertyDescriptor('duration')
})

Cesium.Material.PolylineTrailType = 'PolylineTrail'
Cesium.Material._materialCache.addMaterial(Cesium.Material.PolylineTrailType, {
fabric: {
type: Cesium.Material.PolylineTrailType,
uniforms: {
color: new Cesium.Color(1.0, 0.0, 0.0, 0.7),
image: IMG,
duration: 45
},
source: LineTrailShader
},
translucent: function(material) {
return true
}
})

+ 9
- 0
src/plugins/material/index.js Voir le fichier

@@ -0,0 +1,9 @@
/*
* @Author: Caven
* @Date: 2020-02-24 13:28:37
* @Last Modified by: Caven
* @Last Modified time: 2020-02-24 13:57:49
*/

import './DC.PolylineTrailMaterialProperty'
import './DC.PolylineFlowMaterialProperty'

+ 3
- 3
src/plugins/overlay/DC.CustomPolygon.js Voir le fichier

@@ -2,7 +2,7 @@
* @Author: Caven
* @Date: 2020-02-06 13:11:58
* @Last Modified by: Caven
* @Last Modified time: 2020-02-21 10:28:04
* @Last Modified time: 2020-02-24 17:24:48
*/
import Cesium from '@/namespace'
import '@/core/overlay/base/DC.Polygon'
@@ -109,7 +109,7 @@ DC.CustomPolygon = class extends DC.Polygon {
this._topOutline.show = Cesium.defaultValue(lineStyle.show, true)
delete lineStyle.show
if (!lineStyle || Object.keys(lineStyle).length === 0) {
return
return this
}
DC.Util.merge(this._topOutline.polyline, lineStyle)
}
@@ -125,7 +125,7 @@ DC.CustomPolygon = class extends DC.Polygon {
this._bottomOutline.show = Cesium.defaultValue(lineStyle.show, true)
delete lineStyle.show
if (!lineStyle || Object.keys(lineStyle).length === 0) {
return
return this
}
DC.Util.merge(this._bottomOutline.polyline, lineStyle)
}

+ 16
- 0
src/plugins/shader/CircleFadeMaterail.glsl Voir le fichier

@@ -0,0 +1,16 @@
uniform vec4 color;
uniform float time;

czm_material czm_getMaterial(czm_materialInput materialInput){
czm_material material = czm_getDefaultMaterial(materialInput);
material.diffuse = 1.5 * color.rgb;
vec2 st = materialInput.st;
float dis = distance(st, vec2(0.5, 0.5));
float per = fract(time);
if(dis > per * 0.5){
discard;
}else {
material.alpha = color.a * dis / per / 2.0;
}
return material;
}

+ 41
- 0
src/plugins/shader/CircleScanMaterial.glsl Voir le fichier

@@ -0,0 +1,41 @@
uniform sampler2D colorTexture;
uniform sampler2D depthTexture;
varying vec2 v_textureCoordinates;
uniform vec4 u_scanCenterEC;
uniform vec3 u_scanPlaneNormalEC;
uniform float u_radius;
uniform vec4 u_scanColor;

vec4 toEye(in vec2 uv, in float depth){
vec2 xy = vec2((uv.x * 2.0 - 1.0),(uv.y * 2.0 - 1.0));
vec4 posInCamera = czm_inverseProjection * vec4(xy, depth, 1.0);
posInCamera =posInCamera / posInCamera.w;
return posInCamera;
}

vec3 pointProjectOnPlane(in vec3 planeNormal, in vec3 planeOrigin, in vec3 point){
vec3 v01 = point - planeOrigin;
float d = dot(planeNormal, v01) ;
return (point - planeNormal * d);
}

float getDepth(in vec4 depth){
float z_window = czm_unpackDepth(depth);
z_window = czm_reverseLogDepth(z_window);
float n_range = czm_depthRange.near;
float f_range = czm_depthRange.far;
return (2.0 * z_window - n_range - f_range) / (f_range - n_range);
}

void main(){
gl_FragColor = texture2D(colorTexture, v_textureCoordinates);
float depth = getDepth(texture2D(depthTexture, v_textureCoordinates));
vec4 viewPos = toEye(v_textureCoordinates, depth);
vec3 prjOnPlane = pointProjectOnPlane(u_scanPlaneNormalEC.xyz, u_scanCenterEC.xyz, viewPos.xyz);
float dis = length(prjOnPlane.xyz - u_scanCenterEC.xyz);
if(dis < u_radius){
float f = 1.0 - abs(u_radius - dis) / u_radius;
f = pow(f, 4.0);
gl_FragColor = mix(gl_FragColor, u_scanColor, f);
}
}

+ 14
- 0
src/plugins/shader/PolylineFlowMaterial.glsl Voir le fichier

@@ -0,0 +1,14 @@
uniform vec4 color;
uniform float duration;

czm_material czm_getMaterial(czm_materialInput materialInput){
czm_material material = czm_getDefaultMaterial(materialInput);
vec2 st = materialInput.st;
float t = mod(czm_frameNumber, duration) / duration;
t *= 1.03;
float alpha = smoothstep(t- 0.03, t, st.s) * step(-t, -st.s);
alpha += 0.1;
material.diffuse = color.rgb;
material.alpha = alpha;
return material;
}

+ 13
- 0
src/plugins/shader/PolylineTrailMaterial.glsl Voir le fichier

@@ -0,0 +1,13 @@
uniform sampler2D image;
uniform float duration;
uniform vec4 color;

czm_material czm_getMaterial(czm_materialInput materialInput){
czm_material material = czm_getDefaultMaterial(materialInput);
vec2 st = materialInput.st;
float time = mod(czm_frameNumber, duration) / duration;
vec4 colorImage = texture2D(image, vec2(fract(st.s - time), st.t));
material.alpha = colorImage.a * color.a;
material.diffuse = (colorImage.rgb + color.rgb)/2.0;
return material;
}

+ 63
- 0
src/plugins/shader/RadarScanMaterial.glsl Voir le fichier

@@ -0,0 +1,63 @@
uniform sampler2D colorTexture;
uniform sampler2D depthTexture;
varying vec2 v_textureCoordinates;
uniform vec4 u_scanCenterEC;
uniform vec3 u_scanPlaneNormalEC;
uniform vec3 u_scanLineNormalEC;
uniform float u_radius;
uniform vec4 u_scanColor;

vec4 toEye(in vec2 uv, in float depth){
vec2 xy = vec2((uv.x * 2.0 - 1.0),(uv.y * 2.0 - 1.0));
vec4 posInCamera =czm_inverseProjection * vec4(xy, depth, 1.0);
posInCamera =posInCamera / posInCamera.w;
return posInCamera;
}

bool isPointOnLineRight(in vec3 ptOnLine, in vec3 lineNormal, in vec3 testPt){
vec3 v01 = testPt - ptOnLine;
normalize(v01);
vec3 temp = cross(v01, lineNormal);
float d = dot(temp, u_scanPlaneNormalEC);
return d > 0.5;
}

vec3 pointProjectOnPlane(in vec3 planeNormal, in vec3 planeOrigin, in vec3 point){
vec3 v01 = point -planeOrigin;
float d = dot(planeNormal, v01) ;
return (point - planeNormal * d);
}

float distancePointToLine(in vec3 ptOnLine, in vec3 lineNormal, in vec3 testPt){
vec3 tempPt = pointProjectOnPlane(lineNormal, ptOnLine, testPt);
return length(tempPt - ptOnLine);
}

float getDepth(in vec4 depth){
float z_window = czm_unpackDepth(depth);
z_window = czm_reverseLogDepth(z_window);
float n_range = czm_depthRange.near;
float f_range = czm_depthRange.far;
return (2.0 * z_window - n_range - f_range) / (f_range - n_range);
}

void main(){
gl_FragColor = texture2D(colorTexture, v_textureCoordinates);
float depth = getDepth( texture2D(depthTexture, v_textureCoordinates));
vec4 viewPos = toEye(v_textureCoordinates, depth);
vec3 prjOnPlane = pointProjectOnPlane(u_scanPlaneNormalEC.xyz, u_scanCenterEC.xyz, viewPos.xyz);
float dis = length(prjOnPlane.xyz - u_scanCenterEC.xyz);
float twou_radius = u_radius * 2.0;
if(dis < u_radius){
float f0 = 1.0 -abs(u_radius - dis) / u_radius;
f0 = pow(f0, 64.0);
vec3 lineEndPt = vec3(u_scanCenterEC.xyz) + u_scanLineNormalEC * u_radius;
float f = 0.0;
if(isPointOnLineRight(u_scanCenterEC.xyz, u_scanLineNormalEC.xyz, prjOnPlane.xyz)){
float dis1= length(prjOnPlane.xyz - lineEndPt);
f = abs(twou_radius -dis1) / twou_radius;
f = pow(f, 3.0);
}
gl_FragColor = mix(gl_FragColor, u_scanColor, f + f0);
}
}

+ 5
- 1
webpack.conf.js Voir le fichier

@@ -2,7 +2,7 @@
* @Author: Caven
* @Date: 2020-01-18 18:22:23
* @Last Modified by: Caven
* @Last Modified time: 2020-02-11 14:52:21
* @Last Modified time: 2020-02-24 13:30:25
*/

const path = require('path')
@@ -124,6 +124,10 @@ module.exports = env => {
options: {
limit: 20000
}
},
{
test: /\.glsl$/,
loader: 'webpack-glsl-loader'
}
]
},

+ 5
- 1
webpack.plugins.conf.js Voir le fichier

@@ -2,7 +2,7 @@
* @Author: Caven
* @Date: 2020-01-18 18:22:23
* @Last Modified by: Caven
* @Last Modified time: 2020-02-03 17:28:37
* @Last Modified time: 2020-02-24 13:30:31
*/

const path = require('path')
@@ -87,6 +87,10 @@ module.exports = env => {
options: {
limit: 20000
}
},
{
test: /\.glsl$/,
loader: 'webpack-glsl-loader'
}
]
},

+ 27
- 131
yarn.lock Voir le fichier

@@ -1983,13 +1983,6 @@ debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
dependencies:
ms "2.0.0"

debug@^3.2.6:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
dependencies:
ms "^2.1.1"

debug@^4.0.1, debug@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
@@ -2007,11 +2000,6 @@ decode-uri-component@^0.2.0:
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=

deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==

deep-is@~0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
@@ -2069,11 +2057,6 @@ detect-file@^1.0.0:
resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=

detect-libc@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=

diffie-hellman@^5.0.0:
version "5.0.3"
resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
@@ -2695,13 +2678,6 @@ from2@^2.1.0:
inherits "^2.0.1"
readable-stream "^2.0.0"

fs-minipass@^1.2.5:
version "1.2.7"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
dependencies:
minipass "^2.6.0"

fs-write-stream-atomic@^1.0.8:
version "1.0.10"
resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
@@ -2717,6 +2693,11 @@ fs.realpath@^1.0.0:
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=

fs@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.2.tgz#e1f244ef3933c1b2a64bd4799136060d0f5914f8"
integrity sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg=

fsevents@^1.2.7:
version "1.2.11"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3"
@@ -3041,7 +3022,7 @@ https-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=

iconv-lite@^0.4.24, iconv-lite@^0.4.4:
iconv-lite@^0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -3070,13 +3051,6 @@ iferr@^0.1.5:
resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=

ignore-walk@^3.0.1:
version "3.0.3"
resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37"
integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==
dependencies:
minimatch "^3.0.4"

ignore@^3.3.5:
version "3.3.10"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
@@ -3166,7 +3140,7 @@ inherits@2.0.3:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=

ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
ini@^1.3.4, ini@^1.3.5:
version "1.3.5"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
@@ -3901,21 +3875,6 @@ minimist@^1.1.3, minimist@^1.2.0:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=

minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
version "2.9.0"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
dependencies:
safe-buffer "^5.1.2"
yallist "^3.0.0"

minizlib@^1.2.1:
version "1.3.3"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
dependencies:
minipass "^2.9.0"

mississippi@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
@@ -4001,15 +3960,6 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=

needle@^2.2.1:
version "2.4.0"
resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c"
integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==
dependencies:
debug "^3.2.6"
iconv-lite "^0.4.4"
sax "^1.2.4"

neo-async@^2.5.0, neo-async@^2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
@@ -4067,22 +4017,6 @@ node-libs-browser@^2.2.1:
util "^0.11.0"
vm-browserify "^1.0.1"

node-pre-gyp@*:
version "0.14.0"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83"
integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==
dependencies:
detect-libc "^1.0.2"
mkdirp "^0.5.1"
needle "^2.2.1"
nopt "^4.0.1"
npm-packlist "^1.1.6"
npmlog "^4.0.2"
rc "^1.2.7"
rimraf "^2.6.1"
semver "^5.3.0"
tar "^4.4.2"

node-releases@^1.1.44:
version "1.1.45"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.45.tgz#4cf7e9175d71b1317f15ffd68ce63bce1d53e9f2"
@@ -4120,14 +4054,6 @@ node-sass@^4.12.0:
dependencies:
abbrev "1"

nopt@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
dependencies:
abbrev "1"
osenv "^0.1.4"

normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
@@ -4164,26 +4090,6 @@ normalize-url@^3.0.0:
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==

npm-bundled@^1.0.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b"
integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==
dependencies:
npm-normalize-package-bin "^1.0.1"

npm-normalize-package-bin@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==

npm-packlist@^1.1.6:
version "1.4.7"
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.7.tgz#9e954365a06b80b18111ea900945af4f88ed4848"
integrity sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==
dependencies:
ignore-walk "^3.0.1"
npm-bundled "^1.0.1"

npm-run-path@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
@@ -4191,7 +4097,7 @@ npm-run-path@^2.0.0:
dependencies:
path-key "^2.0.0"

"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
@@ -4349,7 +4255,7 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.2:
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=

osenv@0, osenv@^0.1.4:
osenv@0:
version "0.1.5"
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
@@ -4533,6 +4439,11 @@ path-type@^3.0.0:
dependencies:
pify "^3.0.0"

path@^0.11.14:
version "0.11.14"
resolved "https://registry.yarnpkg.com/path/-/path-0.11.14.tgz#cbc7569355cb3c83afeb4ace43ecff95231e5a7d"
integrity sha1-y8dWk1XLPIOv60rOQ+z/lSMeWn0=

pbkdf2@^3.0.3:
version "3.0.17"
resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
@@ -5074,16 +4985,6 @@ randomfill@^1.0.3:
randombytes "^2.0.5"
safe-buffer "^5.1.0"

rc@^1.2.7:
version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
dependencies:
deep-extend "^0.6.0"
ini "~1.3.0"
minimist "^1.2.0"
strip-json-comments "~2.0.1"

read-pkg-up@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
@@ -5332,7 +5233,7 @@ rgba-regex@^1.0.0:
resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=

rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3:
rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3:
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
@@ -5418,7 +5319,7 @@ sass-loader@^7.1.0:
pify "^4.0.1"
semver "^6.3.0"

sax@^1.2.4, sax@~1.2.4:
sax@~1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
@@ -5440,7 +5341,7 @@ scss-tokenizer@^0.2.3:
js-base64 "^2.1.8"
source-map "^0.4.2"

"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@@ -5844,7 +5745,7 @@ strip-indent@^1.0.1:
dependencies:
get-stdin "^4.0.1"

strip-json-comments@^2.0.1, strip-json-comments@~2.0.1:
strip-json-comments@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
@@ -5935,19 +5836,6 @@ tar@^2.0.0:
fstream "^1.0.12"
inherits "2"

tar@^4.4.2:
version "4.4.13"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
dependencies:
chownr "^1.1.1"
fs-minipass "^1.2.5"
minipass "^2.8.6"
minizlib "^1.2.1"
mkdirp "^0.5.0"
safe-buffer "^5.1.2"
yallist "^3.0.3"

terser-webpack-plugin@^1.4.3:
version "1.4.3"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c"
@@ -6322,6 +6210,14 @@ webpack-cli@^3.3.0:
v8-compile-cache "2.0.3"
yargs "13.2.4"

webpack-glsl-loader@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/webpack-glsl-loader/-/webpack-glsl-loader-1.0.1.tgz#72a0e30192bd57947d60d6d505c915be680d0acc"
integrity sha1-cqDjAZK9V5R9YNbVBckVvmgNCsw=
dependencies:
fs "0.0.2"
path "^0.11.14"

webpack-log@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f"
@@ -6452,7 +6348,7 @@ yallist@^2.1.2:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=

yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
yallist@^3.0.2:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==

Chargement…
Annuler
Enregistrer