-
Notifications
You must be signed in to change notification settings - Fork 1
/
Clouds.py
103 lines (75 loc) · 2.06 KB
/
Clouds.py
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
from math import cos, pi
from noise import SimplexNoiseGen
from threading import Thread
from Queue import Queue
from time import time
import Config
class ObjectManager(object):
def __init__(self, ObjectClass):
self.Object = {}
self.ObjectClass = ObjectClass
def GetObject(self, X):
if self.Object.has_key(X):
return self.Object[X]
Obj = self.ObjectClass(X, self)
self.Object[X] = Obj
return Obj
class CloudManager(ObjectManager):
def __init__(self, CloudClass = None):
self.Noise = SimplexNoiseGen(Config.Seed)
if CloudClass == None:
CloudClass = CloudChunk
super(CloudManager, self).__init__(CloudClass)
class CloudChunk(object):
def __init__(self, XPos, Generator):
self.X = XPos
self.Noise = Generator.Noise
self.Generator = Generator
self.Finished = False
T = Thread(target=self.Generate)
T.daemon = True
T.start()
def Generate(self):
print "Starting Generation at",self.X
start = time()
Points = []
Colours = []
Length = 0
PCMap = {}
#Generation stuff
PixelSize = Config.PixelSize
YOffset = Config.CloudHeight / 2.0
Noise = self.Noise
NoiseOffset = Config.NoiseOffset
for X in xrange(0, Config.CloudWidth - 1, PixelSize):
XOff = X+self.X
for Y in xrange(0, Config.CloudHeight, PixelSize):
Points.append(XOff)
Points.append(Y)
Colours.append(1)
Colours.append(1)
Colours.append(1)
#Get noise, round and clamp
NoiseGen = Noise.fBm(XOff, Y) + NoiseOffset
NoiseGen = max(0, min(1, NoiseGen))
# Fade around the edges - use cos to get better fading
Diff = abs(Y - YOffset) / YOffset
NoiseGen *= cos(Diff * pi / 2)
Colours.append(NoiseGen)
if NoiseGen > 0:
PCMap[(XOff, Y)] = (1, 1, 1, NoiseGen)
Length += 1
#Assign variables
self.Points = Points
self.Colours = Colours
self.Length = Length
self.PCMap = PCMap
print "Finished Generation at", self.X
print "\tTook",time() - start
self.Finished = True
def GenerateFinshed(self):
pass
def Draw(self, X):
if self.Finished:
self.Finished = False
self.GenerateFinshed()