Skip to content

Commit 5ecc78a

Browse files
committed
PSInput cleanups
1 parent 9956798 commit 5ecc78a

File tree

3 files changed

+68
-88
lines changed

3 files changed

+68
-88
lines changed

62_CAD/common.hlsl

Lines changed: 51 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -357,34 +357,55 @@ struct PSInput
357357
// Set functions used in vshader, get functions used in fshader
358358
// We have to do this because we don't have union in hlsl and this is the best way to alias
359359

360-
// data1 (w component reserved for later)
360+
/* SHARED: ALL ObjectTypes */
361361
ObjectType getObjType() { return (ObjectType) data1.x; }
362362
uint getMainObjectIdx() { return data1.y; }
363-
float getLineThickness() { return asfloat(data1.z); }
364-
float getPatternStretch() { return asfloat(data1.w); }
365363

366364
void setObjType(ObjectType objType) { data1.x = (uint) objType; }
367365
void setMainObjectIdx(uint mainObjIdx) { data1.y = mainObjIdx; }
366+
367+
/* SHARED: LINE + QUAD_BEZIER (Curve Outlines) */
368+
float getLineThickness() { return asfloat(data1.z); }
369+
float getPatternStretch() { return asfloat(data1.w); }
370+
368371
void setLineThickness(float lineThickness) { data1.z = asuint(lineThickness); }
369372
void setPatternStretch(float stretch) { data1.w = asuint(stretch); }
373+
374+
void setCurrentPhaseShift(float phaseShift) { interp_data5.x = phaseShift; }
375+
float getCurrentPhaseShift() { return interp_data5.x; }
376+
377+
void setCurrentWorldToScreenRatio(float worldToScreen) { interp_data5.y = worldToScreen; }
378+
float getCurrentWorldToScreenRatio() { return interp_data5.y; }
370379

371-
// data2
380+
/* LINE */
372381
float2 getLineStart() { return data2.xy; }
373382
float2 getLineEnd() { return data2.zw; }
374-
375383
void setLineStart(float2 lineStart) { data2.xy = lineStart; }
376384
void setLineEnd(float2 lineEnd) { data2.zw = lineEnd; }
377-
378-
// Texture glyph UVs
379-
// data2
380-
float2 getFontGlyphUv() { return interp_data5.xy; }
381-
uint32_t getFontGlyphTextureId() { return asuint(data2.x); }
382-
float getFontGlyphScreenPxRange() { return data2.y; }
383385

384-
void setFontGlyphUv(float2 uv) { interp_data5.xy = uv; }
385-
void setFontGlyphTextureId(uint32_t textureId) { data2.x = asfloat(textureId); }
386-
void setFontGlyphScreenPxRange(float glyphScreenPxRange) { data2.y = glyphScreenPxRange; }
386+
/* QUAD_BEZIER */
387+
nbl::hlsl::shapes::Quadratic<float> getQuadratic()
388+
{
389+
return nbl::hlsl::shapes::Quadratic<float>::construct(data2.xy, data2.zw, data3.xy);
390+
}
391+
void setQuadratic(nbl::hlsl::shapes::Quadratic<float> quadratic)
392+
{
393+
data2.xy = quadratic.A;
394+
data2.zw = quadratic.B;
395+
data3.xy = quadratic.C;
396+
}
387397

398+
void setQuadraticPrecomputedArcLenData(nbl::hlsl::shapes::Quadratic<float>::ArcLengthCalculator preCompData)
399+
{
400+
data3.zw = float2(preCompData.lenA2, preCompData.AdotB);
401+
data4 = float4(preCompData.a, preCompData.b, preCompData.c, preCompData.b_over_4a);
402+
}
403+
nbl::hlsl::shapes::Quadratic<float>::ArcLengthCalculator getQuadraticArcLengthCalculator()
404+
{
405+
return nbl::hlsl::shapes::Quadratic<float>::ArcLengthCalculator::construct(data3.z, data3.w, data4.x, data4.y, data4.z, data4.w);
406+
}
407+
408+
/* CURVE_BOX */
388409
// Curves are split in the vertex shader based on their tmin and tmax
389410
// Min curve is smaller in the minor coordinate (e.g. in the default of y top to bottom sweep,
390411
// curveMin = smaller x / left, curveMax = bigger x / right)
@@ -429,64 +450,15 @@ struct PSInput
429450
}
430451

431452
// Curve box value along minor & major axis
432-
float getMinorBBoxUv() { return interp_data5.x; };
433-
void setMinorBBoxUv(float minorBBoxUv) { interp_data5.x = minorBBoxUv; }
434-
float getMajorBBoxUv() { return interp_data5.y; };
435-
void setMajorBBoxUv(float majorBBoxUv) { interp_data5.y = majorBBoxUv; }
453+
float getMinorBBoxUV() { return interp_data5.x; };
454+
void setMinorBBoxUV(float minorBBoxUV) { interp_data5.x = minorBBoxUV; }
455+
float getMajorBBoxUV() { return interp_data5.y; };
456+
void setMajorBBoxUV(float majorBBoxUV) { interp_data5.y = majorBBoxUV; }
436457

437458
float2 getCurveBoxScreenSpaceSize() { return asfloat(data1.zw); }
438459
void setCurveBoxScreenSpaceSize(float2 aabbSize) { data1.zw = asuint(aabbSize); }
439-
440-
// data2 + data3.xy
441-
nbl::hlsl::shapes::Quadratic<float> getQuadratic()
442-
{
443-
return nbl::hlsl::shapes::Quadratic<float>::construct(data2.xy, data2.zw, data3.xy);
444-
}
445460

446-
void setQuadratic(nbl::hlsl::shapes::Quadratic<float> quadratic)
447-
{
448-
data2.xy = quadratic.A;
449-
data2.zw = quadratic.B;
450-
data3.xy = quadratic.C;
451-
}
452-
453-
// data3.zw + data4
454-
455-
void setQuadraticPrecomputedArcLenData(nbl::hlsl::shapes::Quadratic<float>::ArcLengthCalculator preCompData)
456-
{
457-
data3.zw = float2(preCompData.lenA2, preCompData.AdotB);
458-
data4 = float4(preCompData.a, preCompData.b, preCompData.c, preCompData.b_over_4a);
459-
}
460-
461-
nbl::hlsl::shapes::Quadratic<float>::ArcLengthCalculator getQuadraticArcLengthCalculator()
462-
{
463-
return nbl::hlsl::shapes::Quadratic<float>::ArcLengthCalculator::construct(data3.z, data3.w, data4.x, data4.y, data4.z, data4.w);
464-
}
465-
466-
// data5.x
467-
468-
void setCurrentPhaseShift(float phaseShift)
469-
{
470-
interp_data5.x = phaseShift;
471-
}
472-
473-
float getCurrentPhaseShift()
474-
{
475-
return interp_data5.x;
476-
}
477-
478-
// Use only for Lines and QuadBeziers, other objects use this slot of interp_data5.y
479-
void setCurrentWorldToScreenRatio(float worldToScreen)
480-
{
481-
interp_data5.y = worldToScreen;
482-
}
483-
484-
float getCurrentWorldToScreenRatio()
485-
{
486-
return interp_data5.y;
487-
}
488-
// POLYLINE_CONNECTOR data
489-
461+
/* POLYLINE_CONNECTOR */
490462
void setPolylineConnectorTrapezoidStart(float2 trapezoidStart) { data2.xy = trapezoidStart; }
491463
void setPolylineConnectorTrapezoidEnd(float2 trapezoidEnd) { data2.zw = trapezoidEnd; }
492464
void setPolylineConnectorTrapezoidShortBase(float shortBase) { data3.x = shortBase; }
@@ -499,7 +471,17 @@ struct PSInput
499471
float getPolylineConnectorTrapezoidLongBase() { return data3.y; }
500472
float2 getPolylineConnectorCircleCenter() { return data3.zw; }
501473

502-
// IMAGE object data
474+
/* FONT_GLYPH */
475+
float2 getFontGlyphUV() { return interp_data5.xy; }
476+
uint32_t getFontGlyphTextureId() { return asuint(data2.x); }
477+
float getFontGlyphScreenPxRange() { return data2.y; }
478+
479+
void setFontGlyphUV(float2 uv) { interp_data5.xy = uv; }
480+
void setFontGlyphTextureId(uint32_t textureId) { data2.x = asfloat(textureId); }
481+
void setFontGlyphScreenPxRange(float glyphScreenPxRange) { data2.y = glyphScreenPxRange; }
482+
483+
484+
/* IMAGE */
503485
float2 getImageUV() { return interp_data5.xy; }
504486
uint32_t getImageTextureId() { return asuint(data2.x); }
505487

62_CAD/fragment_shader.hlsl

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -463,26 +463,26 @@ float4 main(PSInput input) : SV_TARGET
463463
}
464464
else if (objType == ObjectType::CURVE_BOX)
465465
{
466-
const float minorBBoxUv = input.getMinorBBoxUv();
467-
const float majorBBoxUv = input.getMajorBBoxUv();
466+
const float minorBBoxUV = input.getMinorBBoxUV();
467+
const float majorBBoxUV = input.getMajorBBoxUV();
468468

469469
nbl::hlsl::math::equations::Quadratic<float> curveMinMinor = input.getCurveMinMinor();
470470
nbl::hlsl::math::equations::Quadratic<float> curveMinMajor = input.getCurveMinMajor();
471471
nbl::hlsl::math::equations::Quadratic<float> curveMaxMinor = input.getCurveMaxMinor();
472472
nbl::hlsl::math::equations::Quadratic<float> curveMaxMajor = input.getCurveMaxMajor();
473473

474-
// TODO(Optimization): Can we ignore this majorBBoxUv clamp and rely on the t clamp that happens next? then we can pass `PrecomputedRootFinder`s instead of computing the values per pixel.
475-
nbl::hlsl::math::equations::Quadratic<float> minCurveEquation = nbl::hlsl::math::equations::Quadratic<float>::construct(curveMinMajor.a, curveMinMajor.b, curveMinMajor.c - clamp(majorBBoxUv, 0.0, 1.0));
476-
nbl::hlsl::math::equations::Quadratic<float> maxCurveEquation = nbl::hlsl::math::equations::Quadratic<float>::construct(curveMaxMajor.a, curveMaxMajor.b, curveMaxMajor.c - clamp(majorBBoxUv, 0.0, 1.0));
474+
// TODO(Optimization): Can we ignore this majorBBoxUV clamp and rely on the t clamp that happens next? then we can pass `PrecomputedRootFinder`s instead of computing the values per pixel.
475+
nbl::hlsl::math::equations::Quadratic<float> minCurveEquation = nbl::hlsl::math::equations::Quadratic<float>::construct(curveMinMajor.a, curveMinMajor.b, curveMinMajor.c - clamp(majorBBoxUV, 0.0, 1.0));
476+
nbl::hlsl::math::equations::Quadratic<float> maxCurveEquation = nbl::hlsl::math::equations::Quadratic<float>::construct(curveMaxMajor.a, curveMaxMajor.b, curveMaxMajor.c - clamp(majorBBoxUV, 0.0, 1.0));
477477

478478
const float minT = clamp(PrecomputedRootFinder<float>::construct(minCurveEquation).computeRoots(), 0.0, 1.0);
479479
const float minEv = curveMinMinor.evaluate(minT);
480480

481481
const float maxT = clamp(PrecomputedRootFinder<float>::construct(maxCurveEquation).computeRoots(), 0.0, 1.0);
482482
const float maxEv = curveMaxMinor.evaluate(maxT);
483483

484-
const bool insideMajor = majorBBoxUv >= 0.0 && majorBBoxUv <= 1.0;
485-
const bool insideMinor = minorBBoxUv >= minEv && minorBBoxUv <= maxEv;
484+
const bool insideMajor = majorBBoxUV >= 0.0 && majorBBoxUV <= 1.0;
485+
const bool insideMinor = minorBBoxUV >= minEv && minorBBoxUV <= maxEv;
486486

487487
if (insideMinor && insideMajor)
488488
{
@@ -499,9 +499,9 @@ float4 main(PSInput input) : SV_TARGET
499499

500500

501501
float closestDistanceSquared = MAX_DISTANCE_SQUARED;
502-
const float2 pos = float2(minorBBoxUv, majorBBoxUv) * boxScreenSpaceSize;
502+
const float2 pos = float2(minorBBoxUV, majorBBoxUV) * boxScreenSpaceSize;
503503

504-
if (minorBBoxUv < minEv)
504+
if (minorBBoxUV < minEv)
505505
{
506506
// DO SDF of Min Curve
507507
nbl::hlsl::shapes::Quadratic<float> minCurve = nbl::hlsl::shapes::Quadratic<float>::construct(
@@ -520,7 +520,7 @@ float4 main(PSInput input) : SV_TARGET
520520
closestDistanceSquared = candidateDistanceSquared;
521521
}
522522
}
523-
else if (minorBBoxUv > maxEv)
523+
else if (minorBBoxUV > maxEv)
524524
{
525525
// Do SDF of Max Curve
526526
nbl::hlsl::shapes::Quadratic<float> maxCurve = nbl::hlsl::shapes::Quadratic<float>::construct(
@@ -543,7 +543,7 @@ float4 main(PSInput input) : SV_TARGET
543543
{
544544
const bool minLessThanMax = minEv < maxEv;
545545
float2 majorDistVector = float2(MAX_DISTANCE_SQUARED, MAX_DISTANCE_SQUARED);
546-
if (majorBBoxUv > 1.0)
546+
if (majorBBoxUV > 1.0)
547547
{
548548
const float2 minCurveEnd = float2(minEv, 1.0) * boxScreenSpaceSize;
549549
if (minLessThanMax)
@@ -581,7 +581,7 @@ float4 main(PSInput input) : SV_TARGET
581581
}
582582
else if (objType == ObjectType::FONT_GLYPH)
583583
{
584-
const float2 uv = input.getFontGlyphUv();
584+
const float2 uv = input.getFontGlyphUV();
585585
const uint32_t textureId = input.getFontGlyphTextureId();
586586

587587
if (textureId != InvalidTextureIdx)

62_CAD/vertex_shader.hlsl

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -423,8 +423,8 @@ PSInput main(uint vertexID : SV_VertexID)
423423
nbl::hlsl::shapes::Quadratic<float> curveMax = nbl::hlsl::shapes::Quadratic<float>::construct(
424424
curveBox.curveMax[0], curveBox.curveMax[1], curveBox.curveMax[2]);
425425

426-
outV.setMinorBBoxUv(maxCorner[minor]);
427-
outV.setMajorBBoxUv(maxCorner[major]);
426+
outV.setMinorBBoxUV(maxCorner[minor]);
427+
outV.setMajorBBoxUV(maxCorner[major]);
428428

429429
outV.setCurveMinMinor(nbl::hlsl::math::equations::Quadratic<float>::construct(
430430
curveMin.A[minor],
@@ -472,9 +472,7 @@ PSInput main(uint vertexID : SV_VertexID)
472472
const float2 screenDirV = (float2) transformVectorNdc(clipProjectionData.projectionToNDC, dirV);
473473

474474
float2 corner = float2(bool2(vertexIdx & 0x1u, vertexIdx >> 1));
475-
476-
const float2 ndcAxisMin = screenTopLeft;
477-
const float2 ndcAxisMax = screenTopLeft + screenDirU + screenDirV;
475+
478476
const float2 screenSpaceAabbExtents = float2(length(screenDirU), length(screenDirV)) * float2(globals.resolution);
479477

480478
const float pixelsToIncreaseOnEachSide = globals.antiAliasingFactor + 1.0;
@@ -489,15 +487,15 @@ PSInput main(uint vertexID : SV_VertexID)
489487
const float2 vy = screenDirV * dilateRate.y;
490488
const float2 offsetVec = vx * undilatedCornerNDC.x + vy * undilatedCornerNDC.y;
491489

492-
const float2 coord = screenTopLeft + corner * screenDirU + corner * screenDirV + offsetVec;
490+
const float2 coord = screenTopLeft + corner.x * screenDirU + corner.y * screenDirV + offsetVec;
493491

494492
const float2 maxUV = float2(1.0, 1.0) - minUV;
495493
const float2 uvs = minUV + corner * (maxUV - minUV);
496494

497495
const float screenPxRange = max(screenSpaceAabbExtents.x / ((maxUV.x - minUV.x) * MSDFSize), 1.0);
498496

499497
outV.position = float4(coord, 0.f, 1.f);
500-
outV.setFontGlyphUv(uvs);
498+
outV.setFontGlyphUV(uvs);
501499
outV.setFontGlyphTextureId(textureID);
502500
outV.setFontGlyphScreenPxRange(screenPxRange);
503501
}

0 commit comments

Comments
 (0)