(splatToView: SplatTransformer)
| 16 | } from "../dyno"; |
| 17 | |
| 18 | export function makeNormalColorModifier(splatToView: SplatTransformer) { |
| 19 | return dynoBlock({ gsplat: Gsplat }, { gsplat: Gsplat }, ({ gsplat }) => { |
| 20 | if (!gsplat) { |
| 21 | throw new Error("No gsplat input"); |
| 22 | } |
| 23 | let normal = gsplatNormal(gsplat); |
| 24 | |
| 25 | const viewGsplat = splatToView.applyGsplat(gsplat); |
| 26 | const viewCenter = splitGsplat(viewGsplat).outputs.center; |
| 27 | const viewNormal = gsplatNormal(viewGsplat); |
| 28 | const splatDot = dot(viewCenter, viewNormal); |
| 29 | |
| 30 | const sameDir = greaterThanEqual(splatDot, dynoConst("float", 0)); |
| 31 | normal = select(sameDir, neg(normal), normal); |
| 32 | const rgb = add( |
| 33 | mul(normal, dynoConst("float", 0.5)), |
| 34 | dynoConst("float", 0.5), |
| 35 | ); |
| 36 | |
| 37 | gsplat = combineGsplat({ gsplat, rgb }); |
| 38 | return { gsplat }; |
| 39 | }); |
| 40 | } |
| 41 | |
| 42 | export function setWorldNormalColor(splats: SplatMesh) { |
| 43 | splats.enableWorldToView = true; |
no test coverage detected