2
2
module Graphics.Bling.Primitive.TriangleMesh (
3
3
4
4
-- * Triangle
5
- TriVerts , TriUVs , triangleIntersects , triangleIntersect , triangleBounds ,
6
- triangleNoUVs ,
7
-
5
+ TriVerts , TriNorms , TriUVs , triangleIntersects , triangleIntersect ,
6
+ triangleShadingGeometry , triangleBounds , triangleDefaultUVs ,
7
+
8
8
-- * Triangle Mesh
9
9
10
10
mkTriangleMesh , triangulate
@@ -89,7 +89,7 @@ triNormals i m =
89
89
90
90
triUVs :: Int -> Mesh -> (Float , Float , Float , Float , Float , Float )
91
91
{-# INLINE triUVs #-}
92
- triUVs idx m = maybe triangleNoUVs go (muvs m) where
92
+ triUVs idx m = maybe triangleDefaultUVs go (muvs m) where
93
93
(o1, o2, o3) = triOffsets idx m
94
94
95
95
go uvs = (muv (2 * o1), muv (2 * o1 + 1 ),
@@ -110,25 +110,29 @@ mkTri mesh n
110
110
111
111
sg o2w dgg
112
112
| isNothing $ mns mesh = dgg
113
- | otherwise = dgg { dgN = ns, dgDPDU = ss, dgDPDV = ts }
114
- where
115
- (b1, b2) = fromJust $ dgtriB dgg
116
- b0 = 1 - b1 - b2
117
- (n0, n1, n2) = triNormals idx mesh
118
- ns = normalize $ transNormal o2w ns'
119
- ns' = (b0 *# n0) + (b1 *# n1) + (b2 *# n2)
120
- ss' = normalize $ dgDPDU dgg
121
- ts' = ss' `cross` ns
122
- (ss, ts) = if sqLen ts' > 0
123
- then (normalize ts' `cross` ns, normalize ts')
124
- else coordinateSystem'' ns
113
+ | otherwise = triangleShadingGeometry (triNormals idx mesh) o2w dgg
125
114
126
115
type TriVerts = (Point , Point , Point )
116
+ type TriNorms = (Normal , Normal , Normal )
127
117
type TriUVs = (Float , Float , Float , Float , Float , Float )
128
118
129
- triangleNoUVs :: TriUVs
130
- triangleNoUVs = (0 , 0 , 1 , 0 , 1 , 1 )
119
+ triangleDefaultUVs :: TriUVs
120
+ triangleDefaultUVs = (0 , 0 , 1 , 0 , 1 , 1 )
131
121
122
+ triangleShadingGeometry :: TriNorms -> Transform -> DifferentialGeometry -> DifferentialGeometry
123
+ {-# INLINE triangleShadingGeometry #-}
124
+ triangleShadingGeometry (n0, n1, n2) o2w dgg = dgg { dgN = ns, dgDPDU = ss, dgDPDV = ts }
125
+ where
126
+ (b1, b2) = fromJust $ dgtriB dgg
127
+ b0 = 1 - b1 - b2
128
+ ns = normalize $ transNormal o2w ns'
129
+ ns' = (b0 *# n0) + (b1 *# n1) + (b2 *# n2)
130
+ ss' = normalize $ dgDPDU dgg
131
+ ts' = ss' `cross` ns
132
+ (ss, ts) = if sqLen ts' > 0
133
+ then (normalize ts' `cross` ns, normalize ts')
134
+ else coordinateSystem'' ns
135
+
132
136
triangleBounds :: TriVerts -> AABB
133
137
{-# INLINE triangleBounds #-}
134
138
triangleBounds (p1, p2, p3) = foldl' extendAABBP emptyAABB [p1, p2, p3]
0 commit comments