File size: 10,682 Bytes
b6a38d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
local default_curve = PackCurveParams(point(0, 0), point(64000, 0), point(192000, 0), point(255000, 0), 10)

DefineClass.ParticleBehaviorResize = {
	__parents = { "ParticleBehavior" },
	
	EditorName = "Visual: Resize",
	EditorSubmenu = "Visual",
	
	properties = {
		{ id = "start_size_min", name = "Start size min (m)", editor = "number", scale = 1000, dynamic = true },
		{ id = "start_size_max", name = "Start size max (m)", editor = "number", scale = 1000, dynamic = true },
		{ id = "mid_size", name = "Middle size min (m)", editor = "number", scale = 1000, dynamic = true },
		{ id = "end_size", name = "End size min (m)", editor = "number", scale = 1000, dynamic = true },
		{ id = "mid_point", name = "Middle point", editor = "number", scale = 1000, help = "Specify negative number to disable" },
		{ id = "size_curve", name = "Size curve", editor = "packedcurve", display_scale_y = function(obj) return MulDivRound(255, 1000, obj.start_size_max) end, default = default_curve, max_amplitude = 1000, },
		{ id = "distance", name = "End Distance (m)", editor = "number", scale = 1000, help = "When the number is greater than 0, it enables distance-based resize. The values are interpolated based on the distance from the emitter and the borderline specified in this parameter." },
		{ id = "non_square_size", name = "Non-square size", editor = "bool" },
		{ id = "start_size2_min", name = "Start size min (m)", editor = "number", scale = 1000, dynamic = true },
		{ id = "start_size2_max", name = "Start size max (m)", editor = "number", scale = 1000, dynamic = true },
		{ id = "mid_size2", name = "Middle size min (m)", editor = "number", scale = 1000, dynamic = true },
		{ id = "end_size2", name = "End size min (m)", editor = "number", scale = 1000, dynamic = true },
		{ id = "mid_point2", name = "Middle point", editor = "number", scale = 1000, help = "Specify negative number to disable" },
		{ id = "size_curve2", name = "Size curve", editor = "packedcurve", display_scale_y = function(obj) return MulDivRound(255, 1000, obj.start_size2_max) end, default = default_curve, max_amplitude = 1000, },
		{ id = "distance2", name = "End Distance (m)", editor = "number", scale = 1000, help = "When the number is greater than 0, it enables distance-based resize. The values are interpolated based on the distance from the emitter and the borderline specified in this parameter." }
	},
	
	start_size_min = 500,
	start_size_max = 500,
	mid_size = 500,
	end_size = 500,
	mid_point = -1000,
	non_square_size = false,
	start_size2_min = 500,
	start_size2_max = 500,
	mid_size2 = 500,
	end_size2 = 500,
	mid_point2 = -1000,
	distance = -1000,
	distance2 = -1000
}


DefineClass.ParticleBehaviorResizeCurve = {
	__parents = { "ParticleBehavior" },
	
	EditorName = "Visual: Resize By Curve",
	EditorSubmenu = "Visual",
	
	properties = {
		{ id = "max_size", name = "Max size in graph(m)", editor = "number", scale = 1000, dynamic = true},
		{ id = "resize_type", name = "Resize Type", editor = "choice", items = {"lifetime_percent", "lifetime_absolute", "velocity"}},
		{ id = "max_velocity", editor = "number", scale = 1000, no_edit = function(o) return o.resize_type ~= "velocity" end },
		{ id = "max_time", editor = "number", scale = 1000, no_edit = function(o) return o.resize_type ~= "lifetime_absolute" end },
		{ id = "size_curve", name = function(obj) return obj.non_square_size and "Width curve" or "Size curve" end, editor = "curve4", max = 1000, scale = 1000, },
		{ id = "non_square_size", name = "Non-square size", editor = "bool" },
		{ id = "max_size_2", name = "Max size in graph(m)", editor = "number", scale = 1000, dynamic = true, no_edit = function(obj) return not obj.non_square_size end },
		{ id = "size_curve_2", name = "Height curve", editor = "curve4", max = 1000, scale = 1000, no_edit = function(obj) return not obj.non_square_size end },
	},
	resize_type = "lifetime_percent",
	max_velocity = 2000,
	max_time = 5000,
	max_size = 500,
	max_size_2 = 0,
	size_curve = MakeLine(0, 1000),
	non_square_size = false,
	size_curve_2 = MakeLine(0, 1000),
}

DefineClass.ParticleBehaviorColorize = {
	__parents = { "ParticleBehavior" },
	
	EditorName = "Visual: Colorize",
	EditorSubmenu = "Visual",

	start_color_min = RGB(0, 0, 0),
	start_color_max = RGB(0, 0, 0),
	mid_color = RGB(0, 0, 0),
	end_color = RGB(0, 0, 0),
	type = "Interpolate to end",
	middle_pos = 500,
}

function ParticleBehaviorColorize:ResolveColor(id, ged)
	local value = self[id]
	if type( value ) == "string" then
		local parsys = GetParentTableOfKind(self, "ParticleSystemPreset")
		local param = parsys:DynamicParams()[value]
		value = param and param.default_value
	end
	if type( value ) ~= "number" then
		value = RGB(255, 255, 255)
	end
	return value
end

ParticleBehaviorColorize.properties = {
	{ id = "start_color_min", name = function(self) return (not self:IsKindOf("ParticleBehaviorColorize") or self.type == "One of four") and "Color 1" or "Start color min" end, editor = "color", dynamic = true },
	{ id = "start_intensity_min", name = "Intensity", editor = "number", read_only = true, scale = 1000, help = "Min start color intensity multiplier", default = 1000, min = 1000, max = 20000, slider = true },
	{ id = "start_color_max", name = function(self) return (not self:IsKindOf("ParticleBehaviorColorize") or self.type == "One of four") and "Color 2" or "Start color max" end, editor = "color", dynamic = true },
	{ id = "start_intensity_max", name = "Intensity", editor = "number", read_only = true, scale = 1000, help = "Max start color intensity multiplier", default = 1000, min = 1000, max = 20000, slider = true },				
	{ id = "mid_color", name = function(self) return (not self:IsKindOf("ParticleBehaviorColorize") or self.type == "One of four") and "Color 3" or "Middle color" end, editor = "color", dynamic = true },
	{ id = "mid_intensity", name = "Intensity", editor = "number", read_only = true, scale = 1000, help = "Mid color intensity multiplier", default = 1000, min = 1000, max = 20000, slider = true },
	{ id = "end_color", name = function(self) return (not self:IsKindOf("ParticleBehaviorColorize") or self.type == "One of four") and "Color 4" or "End color" end, editor = "color", dynamic = true },
	{ id = "end_intensity", name = "Intensity", editor = "number", read_only = true, scale = 1000, help = "End color intensity multiplier", default = 1000, min = 1000, max = 20000, slider = true },
	{ id = "type", name = "Type", editor = "combo", items = { "Start color only", "Start color range", "Interpolate to end", "Interpolate through mid", "One of four", "InterpolateByCurve" }, },
	{ id = "middle_pos", name = "Middle pos", editor = "number", scale = 1000, help = "The middle point in the particle lifetime [0..1]", min = 0, max = 1000, slider = true },
	{ id = "color_curve", name = "Color curve", editor = "curve4", scale = 1000, max = 2000, default = MakeLine(0, 2000), color_args = function(obj)
		return { obj:ResolveColor("start_color_min"), obj:ResolveColor("mid_color"), obj:ResolveColor("end_color")}	
	end},
}

DefineClass.ParticleBehaviorEmissive = {
	__parents = { "ParticleBehavior" },
	
	EditorName = "Visual: Emissive",
	EditorSubmenu = "Visual",
	
	properties = {
		{ id = "emissive_curve", name = "Emissive Curve", editor = "curve4", max_x = 1000, scale = 1000, max = 1000, },
	},
	emissive_curve = MakeLine(0, 0)
}



DefineClass.ParticleBehaviorDissolve = {
	__parents = { "ParticleBehavior" },
	
	EditorName = "Visual: Dissolve",
	EditorSubmenu = "Visual",
	
	properties = {
		{ id = "start_alpha_test_min", name = function(self) return self.type == "One of four" and "Alpha test 1" or "Start alpha test min" end, editor = "number", min = 0, max = 100, slider = true, dynamic = true },
		{ id = "start_alpha_test_max", name = function(self) return self.type == "One of four" and "Alpha test 2" or "Start alpha test max" end, editor = "number", min = 0, max = 100, slider = true, dynamic = true },
		{ id = "mid_alpha_test", name = function(self) return self.type == "One of four" and "Alpha test 3" or "Middle alpha test" end, editor = "number", min = 0, max = 100, slider = true, dynamic = true },
		{ id = "end_alpha_test", name = function(self) return self.type == "One of four" and "Alpha test 4" or "End alpha test" end, editor = "number", min = 0, max = 100, slider = true, dynamic = true },
		{ id = "type", name = "Type", editor = "combo", items = { "Start color only", "Interpolate to end", "Interpolate through mid", "One of four" }, },
		{ id = "middle_pos", name = "Middle pos", editor = "number", scale = 1000, help = "The middle point in the particle lifetime [0..1]", min = 0, max = 1000, slider = true },
	},
	
	start_alpha_test_min = 0,
	start_alpha_test_max = 0,
	mid_alpha_test = 0,
	end_alpha_test = 0,
	type = "Interpolate to end",
	middle_pos = 500,
}


DefineClass.ParticleBehaviorFadeInOut = {
	__parents = { "ParticleBehavior" },
	
	EditorName = "Visual: Fade In/Out",
	EditorSubmenu = "Visual",

	properties = {
		{ id = "fade_curve", name = "Fade out alpha", editor = "curve4", default = MakeLine(1000), max_x = 1000, scale = 1000, max = 1000, },
	},
}

DefineClass.ParticleBehaviorRotate = {
	__parents = { "ParticleBehavior" },
	
	EditorName = "Visual: Rotate",
	EditorSubmenu = "Visual",

	properties = {
		{ id = "rpm_curve", name = "RPM", editor = "curve4", scale = 10, max_x = 1000, max = function(obj) return obj.rpm_curve_range.to end, min = function(obj) return obj.rpm_curve_range.from end, },
		{ id = "rpm_curve_range", name = "RPM Range", editor = "range", scale = 10, default = range(-1200, 1200), slider = true, min = -3000, max = 3000, },
	},

	rpm_curve = MakeLine(0, 0),
}

DefineClass.ParticleBehaviorPickFrame = {
	__parents = { "ParticleBehavior" },
	
	EditorName = "Texture: Pick frame",
	EditorSubmenu = "Visual",

	properties = {
		{ id = "anim_type", name = "Pick frame by", editor = "combo", items = { "Random", "Cycle", "Ping-Pong", "Fixed Frame" } },
		{ id = "fixed_frame", name = "Fixed frame", dynamic = true, editor = "point", no_edit = function(self) return self.anim_type ~= "Fixed Frame" end, default = point(1, 1) },
	},

	anim_type = "Random",
}

DefineClass.ParticleBehaviorAnimate = {
	__parents = { "ParticleBehavior" },
	
	EditorName = "Texture: Animation",
	EditorSubmenu = "Visual",

	properties = {
		{ id = "anim_type", name = "Pick frame by", editor = "combo", items = { "Random", "Cycle", "Cycle Once", "Ping-Pong" } },
		{ id = "fps", name = "Frames per second", editor = "number" },
		{ id = "sequence_time_remap", name = "Sequence time", editor = "curve4", scale = 1000, max = 1000, default = MakeLine(0, 1000), },
	},

	anim_type = "Random",
	fps = 5,
}