@doegis/core
Version:
DOE GIS API
80 lines (67 loc) • 6.52 kB
JavaScript
import{MAX_ELEVATION_OFFSET as o}from"../../../collections/Component/Material/shader/ComponentData.glsl.js";import{DoublePrecision as e}from"../../../core/shaderLibrary/util/DoublePrecision.glsl.js";import{RgbaFloatEncoding as r}from"../../../core/shaderLibrary/util/RgbaFloatEncoding.glsl.js";import{textureSize as t,texelFetch as a}from"../../../core/shaderLibrary/util/WebGL2Utils.js";import{Float3DrawUniform as n}from"../../../core/shaderModules/Float3DrawUniform.js";import{Float3PassUniform as l}from"../../../core/shaderModules/Float3PassUniform.js";import{FloatPassUniform as d}from"../../../core/shaderModules/FloatPassUniform.js";import{glsl as s}from"../../../core/shaderModules/interfaces.js";import{Matrix3DrawUniform as m}from"../../../core/shaderModules/Matrix3DrawUniform.js";import{Matrix3PassUniform as i}from"../../../core/shaderModules/Matrix3PassUniform.js";import{Matrix4PassUniform as c}from"../../../core/shaderModules/Matrix4PassUniform.js";import{createTexture2DDrawSizeUniforms as f}from"../../../core/shaderModules/Texture2DDrawUniform.js";import{TextureSizeUniformType as u}from"../../../core/shaderModules/TextureSizeUniformType.js";import{VertexAttribute as v}from"../../../lib/VertexAttribute.js";function p(p,x){const F=p.vertex;F.include(r),F.uniforms.add(new d("distanceFalloffFactor",(o=>o.distanceFalloffFactor))),F.code.add(s`float distanceBasedPerspectiveFactor(float distance) {
return clamp(sqrt(distanceFalloffFactor / distance), 0.0, 1.0);
}`),F.uniforms.add(f("componentDataTex",(o=>o.componentDataTexture),x.hasWebGL2Context?u.None:u.InvSize)),p.attributes.add(v.COMPONENTINDEX,"float"),F.constants.add("componentColorFieldOffset","float",0),F.constants.add("componentOtherFieldOffset","float",1),F.constants.add("componentVerticalOffsetFieldOffset","float",2),F.constants.add("componentFieldCount","float",3),F.constants.add("lineWidthFractionFactor","float",8),F.constants.add("extensionLengthOffset","float",128),F.constants.add("verticalOffsetScale","float",2*o),F.code.add(s`
vec2 _componentTextureCoords(float componentIndex, float fieldOffset) {
float fieldIndex = componentFieldCount * componentIndex + fieldOffset;
vec2 textureSizeInverse = ${t(x,"componentDataTex",!0)};
float colIndex = mod(fieldIndex, 1.0 / textureSizeInverse.x);
float rowIndex = floor(fieldIndex * textureSizeInverse.x);
return vec2(colIndex, rowIndex) + 0.5;
}
struct ComponentData {
vec4 color;
float lineWidth;
float extensionLength;
float type;
float verticalOffset;
};
ComponentData readComponentData() {
vec2 colorIndex = _componentTextureCoords(componentIndex, componentColorFieldOffset);
vec2 otherIndex = _componentTextureCoords(componentIndex, componentOtherFieldOffset);
vec2 verticalOffsetIndex = _componentTextureCoords(componentIndex, componentVerticalOffsetFieldOffset);
vec4 colorValue = ${a(x,"componentDataTex","colorIndex")};
vec4 otherValue = ${a(x,"componentDataTex","otherIndex")};
float verticalOffset = (rgba2float(${a(x,"componentDataTex","verticalOffsetIndex")}) - 0.5) * verticalOffsetScale;
return ComponentData(
vec4(colorValue.rgb, colorValue.a * otherValue.w), // otherValue.w stores separate opacity
otherValue.x * (255.0 / lineWidthFractionFactor),
otherValue.y * 255.0 - extensionLengthOffset,
-(otherValue.z * 255.0) + 0.5, // SOLID (=0/255) needs to be > 0.0, SKETCHY (=1/255) needs to be <= 0;
verticalOffset
);
}
`),x.legacy?F.code.add(s`vec3 _modelToWorldNormal(vec3 normal) {
return (model * vec4(normal, 0.0)).xyz;
}
vec3 _modelToViewNormal(vec3 normal) {
return (localView * model * vec4(normal, 0.0)).xyz;
}`):(F.uniforms.add(new m("transformNormalGlobalFromModel",(o=>o.transformNormalGlobalFromModel))),F.code.add(s`vec3 _modelToWorldNormal(vec3 normal) {
return transformNormalGlobalFromModel * normal;
}`)),x.silhouette?(p.attributes.add(v.NORMALA,"vec3"),p.attributes.add(v.NORMALB,"vec3"),F.code.add(s`vec3 worldNormal() {
return _modelToWorldNormal(normalize(normalA + normalB));
}`)):(p.attributes.add(v.NORMAL,"vec3"),F.code.add(s`vec3 worldNormal() {
return _modelToWorldNormal(normal);
}`)),x.legacy?F.code.add(s`void worldAndViewFromModelPosition(vec3 modelPos, float verticalOffset, out vec3 worldPos, out vec3 viewPos) {
worldPos = (model * vec4(modelPos, 1.0)).xyz;
viewPos = (localView * vec4(worldPos, 1.0)).xyz;
}`):(F.include(e,x),F.include(e,x),F.uniforms.add([new i("transformViewFromCameraRelativeRS",(o=>o.transformViewFromCameraRelativeRS)),new m("transformWorldFromModelRS",(o=>o.transformWorldFromModelRS)),new n("transformWorldFromModelTL",(o=>o.transformWorldFromModelTL)),new n("transformWorldFromModelTH",(o=>o.transformWorldFromModelTH)),new l("transformWorldFromViewTL",(o=>o.transformWorldFromViewTL)),new l("transformWorldFromViewTH",(o=>o.transformWorldFromViewTH))]),F.code.add(s`
void worldAndViewFromModelPosition(vec3 modelPos, float verticalOffset, out vec3 worldPos, out vec3 viewPos) {
vec3 rotatedModelPosition = transformWorldFromModelRS * modelPos;
vec3 transformCameraRelativeFromModel = dpAdd(
transformWorldFromModelTL,
transformWorldFromModelTH,
-transformWorldFromViewTL,
-transformWorldFromViewTH
);
worldPos = transformCameraRelativeFromModel + rotatedModelPosition;
if (verticalOffset != 0.0) {
vec3 vUp = ${x.spherical?s`normalize(transformWorldFromModelTL + rotatedModelPosition);`:s`vec3(0.0, 0.0, 1.0);`}
worldPos += verticalOffset * vUp;
}
viewPos = transformViewFromCameraRelativeRS * worldPos;
}
`)),F.uniforms.add(new c("transformProjFromView",((o,e)=>e.camera.projectionMatrix))),F.code.add(s`vec4 projFromViewPosition(vec3 position) {
return transformProjFromView * vec4(position, 1.0);
}`),F.code.add(s`float calculateExtensionLength(float extensionLength, float lineLength) {
return extensionLength / (log2(max(1.0, 256.0 / lineLength)) * 0.2 + 1.0);
}`)}function x(o){return o.mode===w.SKETCH||o.mode===w.MIXED}function F(o){return o.mode===w.SOLID||o.mode===w.MIXED}var w,M;!function(o){o[o.SOLID=0]="SOLID",o[o.SKETCH=1]="SKETCH",o[o.MIXED=2]="MIXED",o[o.COUNT=3]="COUNT"}(w||(w={})),function(o){o[o.REGULAR=0]="REGULAR",o[o.SILHOUETTE=1]="SILHOUETTE"}(M||(M={}));export{M as EdgeSilhouette,p as EdgeUtil,w as EdgeUtilMode,x as usesSketchLogic,F as usesSolidLogic};