101 lines · 3.4 KB · Text
RawDownload
<@include gpu/Config.slh@><$VERSION_HEADER$>//  Generated on <$_SCRIBE_DATE$>////  drawWorkloadView.vert//  vertex shader////  Created by Sam Gateau on 6/29/2015.//  Copyright 2015 High Fidelity, Inc.//  Copyright 2024 Overte e.V.////  Distributed under the Apache License, Version 2.0.//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html// <@include gpu/Transform.slh@><$declareStandardTransform()$> <@include WorkloadResource.slh@><$declareWorkloadViews()$> OUTPUT(0, vec4, varColor);OUTPUT(1, vec3, varTexcoord);OUTPUT(2, vec3, varEyePos);OUTPUT(3, vec4, _prevPositionCS); const int NUM_VERTICES_PER_SEGMENT = 2;const int NUM_SEGMENT_PER_VIEW_REGION = 65;const int NUM_VERTICES_PER_VIEW_REGION = NUM_SEGMENT_PER_VIEW_REGION * NUM_VERTICES_PER_SEGMENT;const int NUM_REGIONS_PER_VIEW = 3;const int NUM_VERTICES_PER_VIEW = NUM_VERTICES_PER_VIEW_REGION * NUM_REGIONS_PER_VIEW; struct DrawMesh {    vec4 verts[NUM_SEGMENT_PER_VIEW_REGION];}; UNIFORM_BUFFER(0, DrawMeshBuffer) {    DrawMesh _drawMeshBuffer;}; vec4 getPosition(int regionID, int segmentVertexID, vec4 posEye, vec3 tanEye) {    vec3 lateralDir = normalize(cross(vec3(0.0, 0.0, 1.0), normalize(tanEye)));    posEye.xyz += (0.005 * abs(posEye.z) * float(regionID + 1)) * (-1.0 + 2.0 * float(segmentVertexID)) * lateralDir;    return posEye;} void main(void) {    int viewID = gl_VertexID / NUM_VERTICES_PER_VIEW;    int viewVertexID = gl_VertexID - viewID * NUM_VERTICES_PER_VIEW;     int regionID = viewVertexID / NUM_VERTICES_PER_VIEW_REGION;    int regionVertexID = viewVertexID - regionID * NUM_VERTICES_PER_VIEW_REGION;     int segmentID = regionVertexID / NUM_VERTICES_PER_SEGMENT;    int segmentVertexID = regionVertexID - segmentID * NUM_VERTICES_PER_SEGMENT;     vec4 segment = _drawMeshBuffer.verts[segmentID];     vec4 spriteVert = vec4(segment.y, 0.0, segment.x, 1.0);    vec3 spriteTan = vec3(segment.x, 0.0, -segment.y);     WorkloadView view = getWorkloadView(viewID);    vec4 region = view.regions[regionID];    vec4 proxyPosWorld = vec4(region.xyz, 1.0);    float regionRadius = region.w;     // Define the sprite space    vec3 dirZ = -normalize(view.direction_far.xyz);    vec3 dirY = vec3(0.0, 1.0, 0.0);    vec3 dirX = normalize(cross(dirY, dirZ));    dirY = normalize(cross(dirZ, dirX));     spriteVert.xyz *= regionRadius;     vec3 originSpaceVert = (dirX * spriteVert.x + dirY * spriteVert.y + dirZ * spriteVert.z);    vec4 pos = vec4(proxyPosWorld.xyz + originSpaceVert, 1.0);     vec3 originSpaceTan = normalize(dirX * spriteTan.x + dirY * spriteTan.y + dirZ * spriteTan.z);     // standard transform, bring pos in view space    TransformCamera cam = getTransformCamera();    TransformObject obj = getTransformObject();    vec4 posEye;    vec4 prevPosEye;    <$transformModelToEyePosAndPrevEyePos(cam, obj, pos, posEye, prevPosEye)$>    vec3 tanEye;    vec3 prevTanEye;    <$transformModelToEyeDir(cam, obj, originSpaceTan, tanEye)$>    <$transformModelToPrevEyeDir(cam, obj, originSpaceTan, prevTanEye)$>     posEye = getPosition(regionID, segmentVertexID, posEye, tanEye);    prevPosEye = getPosition(regionID, segmentVertexID, prevPosEye, prevTanEye);    varEyePos = posEye.xyz;     <$transformEyeToClipPos(cam, posEye, gl_Position)$>    <$transformPrevEyeToPrevClipPos(cam, prevPosEye, _prevPositionCS)$>;     varTexcoord = spriteVert.xyz;     // Convert region to color    varColor = vec4(REGION_COLOR[regionID].xyz, -1.0);}