-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstars3d.go
66 lines (48 loc) · 1.38 KB
/
stars3d.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
package main
import (
"math"
"math/rand"
)
type Stars3D struct {
spread float32
speed float32
starX []float32
starY []float32
starZ []float32
}
func NewStars3D( num int, spread, speed float32 ) *Stars3D {
ns := &Stars3D{}
ns.spread = spread
ns.speed = speed
ns.starX = make( []float32, num )
ns.starY = make( []float32, num )
ns.starZ = make( []float32, num )
for i := 0; i < num; i++ {
ns.InitStar( i )
}
return ns
}
func (self *Stars3D) InitStar( ix int ) {
self.starX[ix] = (rand.Float32() - 0.5) * 2.0 * self.spread
self.starY[ix] = (rand.Float32() - 0.5) * 2.0 * self.spread
self.starZ[ix] = (rand.Float32() + 0.00001) * self.spread
}
func (self *Stars3D) UpdateAndRender( ctx *RenderContext, dt float32 ) {
//target.Clear( 0x10 )
tanHalfFOV := float32(math.Tan( math.Pi / 180.0 * 66.0 / 2.0 ))
halfW := float32(ctx.Bm.Width / 2.0)
halfH := float32(ctx.Bm.Height / 2.0)
var tv [3]Vertex
for i := 0; i < len(self.starX); i++ {
self.starZ[i] -= dt * self.speed
if self.starZ[i] <= 0 { self.InitStar( i ) }
x := (self.starX[i] / (self.starZ[i] * tanHalfFOV)) * halfW + halfW
y := (self.starY[i] / (self.starZ[i] * tanHalfFOV)) * halfH + halfH
if x < 0 || x >= float32(ctx.Bm.Width) || y < 0 || y >= float32(ctx.Bm.Height) {
self.InitStar( i )
} else {
tv[i].Pos = Vec4{x,y,0,1}
}
}
ctx.FillTriangle( tv[0], tv[1], tv[2], NewBitmap(1,1) )
}