-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathalgorithms.txt
More file actions
70 lines (52 loc) · 3.05 KB
/
Copy pathalgorithms.txt
File metadata and controls
70 lines (52 loc) · 3.05 KB
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
func (tile *Tile) SweepLine(triangle *ProcessedTriangle) {
var invSlope1 float32 = (triangle.Triangle.Vertices[1][X] - triangle.Triangle.Vertices[0][X]) /
(triangle.Triangle.Vertices[1][Y] - triangle.Triangle.Vertices[0][Y])
var invSlope2 float32 = (triangle.Split - triangle.Triangle.Vertices[0][X]) /
(triangle.Triangle.Vertices[1][Y] - triangle.Triangle.Vertices[0][Y])
var clampedUp float32 = Clamp(triangle.Triangle.Vertices[0][Y], tile.Y, tile.Y+TileYSize)
var clampedMiddle float32 = Clamp(triangle.Triangle.Vertices[1][Y], tile.Y, tile.Y+TileYSize)
var clampedDown float32 = Clamp(triangle.Triangle.Vertices[2][Y], tile.Y, tile.Y+TileYSize)
var difference float32 = clampedUp - triangle.Triangle.Vertices[0][Y]
var curX1, curX2 float32 = triangle.Triangle.Vertices[0][X] + invSlope1*difference,
triangle.Triangle.Vertices[0][X] + invSlope2*difference
for y := int(clampedUp); y < int(clampedMiddle); y++ {
var clampedLeft, clampedRight int = int(Clamp(curX1, tile.X, tile.X+TileXSize)),
int(Clamp(curX2, tile.X, tile.X+TileXSize))
for x := clampedLeft; x < clampedRight; x++ {
//var w, s, t float32 = triangle.Barycentric(x, y)
}
curX1 += invSlope1
curX2 += invSlope2
}
invSlope1 = (triangle.Triangle.Vertices[2][X] - triangle.Triangle.Vertices[1][X]) /
(triangle.Triangle.Vertices[2][Y] - triangle.Triangle.Vertices[1][Y])
invSlope2 = (triangle.Triangle.Vertices[2][X] - triangle.Split) /
(triangle.Triangle.Vertices[2][Y] - triangle.Triangle.Vertices[1][Y])
difference = triangle.Triangle.Vertices[2][Y] - clampedDown
curX1, curX2 = triangle.Triangle.Vertices[2][X]-invSlope1*difference, triangle.Triangle.Vertices[2][X]-invSlope2*difference
for y := int(clampedDown) - 1; y > int(clampedMiddle)-1; y-- {
var clampedLeft, clampedRight int = int(Clamp(curX1, tile.X, tile.X+TileXSize)),
int(Clamp(curX2, tile.X, tile.X+TileXSize))
for x := clampedLeft; x < clampedRight; x++ {
var w, s, t float32 = triangle.Barycentric(x, y)
var depth float32 = w*triangle.Triangle.Vertices[0][Z] + s*triangle.Triangle.Vertices[1][Z] + t*triangle.Triangle.Vertices[2][Z]
if position := tile.ConvertPosition(x, y); depth < tile.Depth[position] {
if triangle.Triangle.Texture == nil {
//var r, g, b float32 = triangle.Triangle.Shader(triangle.Triangle.Interpolate(w, s, t))
//tile.Set(position, byte(r*255), byte(g*255), byte(b*255), depth)
} else {
var wt float32 = 1 / (w*triangle.Triangle.UV[0][Z] + s*triangle.Triangle.UV[1][Z] + t*triangle.Triangle.UV[2][Z])
var uv Vertex = Vertex{
(w*triangle.Triangle.UV[0][X] + s*triangle.Triangle.UV[1][X] + t*triangle.Triangle.UV[2][X]) * wt,
(w*triangle.Triangle.UV[0][Y] + s*triangle.Triangle.UV[1][Y] + t*triangle.Triangle.UV[2][Y]) * wt,
}
var r, g, b float32 = triangle.Triangle.Interpolate(w, s, t)
triangle.Triangle.Shader.Fragment(&r, &g, &b, &uv, &Brick)
tile.Set(position, byte(r*255), byte(g*255), byte(b*255), depth)
}
}
}
curX1 -= invSlope1
curX2 -= invSlope2
}
}