<@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);}
<@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);
}