Back to Home

ESO Lua File v101044

libraries/zo_particles/zo_particlevaluegenerators.lua

[◄ back to folders ]
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
local lerp = zo_lerp
local cos = math.cos
--Particle Value Generator
ZO_ParticleValueGenerator = ZO_Object:Subclass()
function ZO_ParticleValueGenerator:New(...)
    local obj = ZO_Object.New(self)
    obj:Initialize(...)
    return obj
end
function ZO_ParticleValueGenerator:Initialize()
end
function ZO_ParticleValueGenerator:Generate()
    --For multi-value generators you can generate all of them together here
end
function ZO_ParticleValueGenerator:GetValue(i)
    --Return one or more values
    assert(false)
end
--Uniform Random Generator
ZO_UniformRangeGenerator = ZO_ParticleValueGenerator:Subclass()
function ZO_UniformRangeGenerator:New(...)
    return ZO_ParticleValueGenerator.New(self, ...)
end
--where ... is a set of pairs that we interpolate between by the random value
function ZO_UniformRangeGenerator:Initialize(...)
    for i = 1, select("#", ...) do
        self[i] = select(i, ...)
    end
end
function ZO_UniformRangeGenerator:Generate()
    self.randomValue = zo_random()
end
function ZO_UniformRangeGenerator:GetValue(i)
    return lerp(self[i * 2 - 1], self[i * 2], self.randomValue)
end
--Random Choice Generator
ZO_WeightedChoiceGenerator = ZO_ParticleValueGenerator:Subclass()
function ZO_WeightedChoiceGenerator:New(...)
    return ZO_ParticleValueGenerator.New(self, ...)
end
--where ... is a set of pairs containing a choice and its weight
function ZO_WeightedChoiceGenerator:Initialize(...)
    self.choices = {}
    self.weights = {}
    self.totalWeights = 0 
    for i = 1, select("#", ...), 2 do
        local choice = select(i, ...)
        local weight = select(i + 1, ...)
        table.insert(self.choices, choice)
        table.insert(self.weights, weight)
        self.totalWeights = self.totalWeights + weight
    end
end
function ZO_WeightedChoiceGenerator:Generate()
    self.randomValue = zo_random() * self.totalWeights
end
function ZO_WeightedChoiceGenerator:GetValue(i)
    local currentWeightTotal = 0
    local choiceIndex = 0
    local numChoices = #self.choices
    while currentWeightTotal <= self.randomValue and choiceIndex < numChoices do
        choiceIndex = choiceIndex + 1
        currentWeightTotal = currentWeightTotal + self.weights[choiceIndex]
    end
    local choice = self.choices[choiceIndex]
    if type(choice) == "table" then
        return choice[i]
    else
        return choice
    end
end
--Smooth Cycle Generator
ZO_SmoothCycleGenerator = ZO_ParticleValueGenerator:Subclass()
function ZO_SmoothCycleGenerator:New(...)
    return ZO_ParticleValueGenerator.New(self, ...)
end
--where ... is a set of pairs that we cycle between
function ZO_SmoothCycleGenerator:Initialize(...)
    self.cycleDurationS = 1
    for i = 1, select("#", ...) do
        self[i] = select(i, ...)
    end
end
function ZO_SmoothCycleGenerator:SetCycleDurationS(cycleDurationS)
    self.cycleDurationS = cycleDurationS
end
function ZO_SmoothCycleGenerator:Generate()
    local progress = zo_mod(GetGameTimeSeconds(), self.cycleDurationS) / self.cycleDurationS
    self.lerpValue = (cos(progress * ZO_TWO_PI) + 1) / 2
end
function ZO_SmoothCycleGenerator:GetValue(i)
    return lerp(self[i * 2 - 1], self[i * 2], self.lerpValue)
end