var PrimitiveWaterFace = (
|
function () {
|
var degreesArrayHeights;
|
var fragmentShader;
|
var normalMapUrl;
|
var geometry;
|
var appearance;
|
var viewer;
|
function _(options) {
|
viewer = options.viewer;
|
fragmentShader = FSWaterFace();
|
normalMapUrl = options.normalMapUrl;
|
if (options.DegreesArrayHeights && options.DegreesArrayHeights.length >= 3) {
|
degreesArrayHeights = options.DegreesArrayHeights;
|
|
} else {
|
degreesArrayHeights = [116.04437, 30.10932, -100,
|
116.04537, 30.10932, -120,
|
116.04537, 30.11032, -100,
|
116.04437, 30.11032, -120,
|
116.04437, 30.10932, -100];
|
}
|
if (options.extrudedHeight) {
|
geometry = CreateGeometry(degreesArrayHeights, options.extrudedHeight);
|
} else {
|
geometry = CreateGeometry(degreesArrayHeights);
|
}
|
|
appearance = CreateAppearence(fragmentShader, normalMapUrl);
|
|
this.primitive = viewer.scene.primitives.add(new Cesium.Primitive({
|
allowPicking: false,
|
geometryInstances: new Cesium.GeometryInstance({
|
geometry: geometry
|
}),
|
appearance: appearance,
|
asynchronous: false
|
}));
|
}
|
//_degreesArrayHeights是一个组成多边形顶点数组[lon,lat,alt]
|
function CreateGeometry(_degreesArrayHeights, _extrudedHeight) {
|
return new Cesium.PolygonGeometry({
|
polygonHierarchy: new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArrayHeights(_degreesArrayHeights)),
|
extrudedHeight: _extrudedHeight?_extrudedHeight:0,
|
perPositionHeight: true
|
});
|
}
|
|
function CreateAppearence(fs, url) {
|
return new Cesium.EllipsoidSurfaceAppearance({
|
material: new Cesium.Material({
|
fabric: {
|
type: 'Water',
|
uniforms: {
|
//水波动的法线纹理贴图
|
normalMap: url,
|
//波的数量
|
frequency: 1000.0,
|
//水震动的速度
|
animationSpeed: 0.05,
|
//振幅大小
|
amplitude: 2
|
}
|
}
|
}),
|
fragmentShaderSource: fs
|
});
|
}
|
|
function FSWaterFace() {
|
return 'varying vec3 v_positionMC;\n\
|
varying vec3 v_positionEC;\n\
|
varying vec2 v_st;\n\
|
\n\
|
void main()\n\
|
{\n\
|
czm_materialInput materialInput;\n\
|
vec3 normalEC = normalize(czm_normal3D * czm_geodeticSurfaceNormal(v_positionMC, vec3(0.0), vec3(1.0)));\n\
|
#ifdef FACE_FORWARD\n\
|
normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC);\n\
|
#endif\n\
|
materialInput.s = v_st.s;\n\
|
materialInput.st = v_st;\n\
|
materialInput.str = vec3(v_st, 0.0);\n\
|
materialInput.normalEC = normalEC;\n\
|
materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(v_positionMC, materialInput.normalEC);\n\
|
vec3 positionToEyeEC = -v_positionEC;\n\
|
materialInput.positionToEyeEC = positionToEyeEC;\n\
|
czm_material material = czm_getMaterial(materialInput);\n\
|
#ifdef FLAT\n\
|
gl_FragColor = vec4(material.diffuse + material.emission, material.alpha);\n\
|
#else\n\
|
gl_FragColor = czm_phong(normalize(positionToEyeEC), material,czm_lightDirectionEC);\n\
|
gl_FragColor.a = 0.5;\n\
|
#endif\n\
|
}\n\
|
';
|
}
|
|
_.prototype.remove = function () {
|
if (this.primitive != null) {
|
viewer.scene.primitives.remove(this.primitive);
|
this.primitive = null;
|
}
|
}
|
_.prototype.updateDegreesPosition = function (_degreesArrayHeights, _extrudedHeight) {
|
if (this.primitive != null) {
|
viewer.scene.primitives.remove(this.primitive);
|
if (_degreesArrayHeights && _degreesArrayHeights.length < 3) { return; }
|
geometry = CreateGeometry(_degreesArrayHeights, _extrudedHeight?_extrudedHeight:0);
|
|
this.primitive = viewer.scene.primitives.add(new Cesium.Primitive({
|
allowPicking: false,
|
geometryInstances: new Cesium.GeometryInstance({
|
geometry: geometry
|
}),
|
appearance: appearance,
|
asynchronous: false
|
}));
|
} else { return; }
|
}
|
return _;
|
})();
|