-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgradients.go
89 lines (67 loc) · 2.71 KB
/
gradients.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package main
type Gradients struct {
//col []Vec4
//colXStep, colYStep Vec4
texCoordX, texCoordY []float32
texCoordXXStep, texCoordXYStep float32
texCoordYXStep, texCoordYYStep float32
// perspective
oneOverZ []float32
oneOverZXStep, oneOverZYStep float32
// depth
depth []float32
depthXStep, depthYStep float32
}
func NewGradients( minY, midY, maxY Vertex ) Gradients {
ng := Gradients{}
//ng.col = make( []Vec4, 3 )
//ng.col[0] = minY.Col
//ng.col[1] = midY.Col
//ng.col[2] = maxY.Col
var oneOverDX float32 = 1.0 /
(((midY.Pos.X - maxY.Pos.X) * (minY.Pos.Y - maxY.Pos.Y)) -
((minY.Pos.X - maxY.Pos.X) * (midY.Pos.Y - maxY.Pos.Y)))
oneOverDY := -oneOverDX
// perspective
ng.oneOverZ = make( []float32, 3 )
ng.oneOverZ[0] = 1.0 / minY.Pos.W
ng.oneOverZ[1] = 1.0 / midY.Pos.W
ng.oneOverZ[2] = 1.0 / maxY.Pos.W
ng.oneOverZXStep = CalcXStep( ng.oneOverZ, minY, midY, maxY, oneOverDX )
ng.oneOverZYStep = CalcYStep( ng.oneOverZ, minY, midY, maxY, oneOverDY )
// texcoord
ng.texCoordX = make( []float32, 3 )
ng.texCoordY = make( []float32, 3 )
ng.texCoordX[0] = minY.TexCoord.X * ng.oneOverZ[0]
ng.texCoordX[1] = midY.TexCoord.X * ng.oneOverZ[1]
ng.texCoordX[2] = maxY.TexCoord.X * ng.oneOverZ[2]
ng.texCoordY[0] = minY.TexCoord.Y * ng.oneOverZ[0]
ng.texCoordY[1] = midY.TexCoord.Y * ng.oneOverZ[1]
ng.texCoordY[2] = maxY.TexCoord.Y * ng.oneOverZ[2]
ng.texCoordXXStep = CalcXStep( ng.texCoordX, minY, midY, maxY, oneOverDX )
ng.texCoordXYStep = CalcYStep( ng.texCoordX, minY, midY, maxY, oneOverDY )
ng.texCoordYXStep = CalcXStep( ng.texCoordY, minY, midY, maxY, oneOverDX )
ng.texCoordYYStep = CalcYStep( ng.texCoordY, minY, midY, maxY, oneOverDY )
// depth
ng.depth = make( []float32, 3 )
ng.depth[0] = minY.Pos.Z
ng.depth[1] = midY.Pos.Z
ng.depth[2] = maxY.Pos.Z
ng.depthXStep = CalcXStep( ng.depth, minY, midY, maxY, oneOverDX )
ng.depthYStep = CalcYStep( ng.depth, minY, midY, maxY, oneOverDY )
/*ng.colXStep = (((ng.col[1].Sub( ng.col[2] )).Mul(
(minY.Pos.Y - maxY.Pos.Y))).Sub( ((ng.col[0].Sub(
ng.col[2] )).Mul( (midY.Pos.Y - maxY.Pos.Y) )))).Mul( oneOverDX )
ng.colYStep = (((ng.col[1].Sub( ng.col[2] )).Mul(
(minY.Pos.X - maxY.Pos.X))).Sub( ((ng.col[0].Sub(
ng.col[2] )).Mul( (midY.Pos.X - maxY.Pos.X) )))).Mul( oneOverDY )*/
return ng
}
func CalcXStep( values []float32, minY, midY, maxY Vertex, oneOverDX float32 ) float32 {
return (((values[1] - values[2]) * (minY.Pos.Y - maxY.Pos.Y)) -
((values[0] - values[2]) * (midY.Pos.Y - maxY.Pos.Y))) * oneOverDX
}
func CalcYStep( values []float32, minY, midY, maxY Vertex, oneOverDY float32 ) float32 {
return (((values[1] - values[2]) * (minY.Pos.X - maxY.Pos.X)) -
((values[0] - values[2]) * (midY.Pos.X - maxY.Pos.X))) * oneOverDY
}