1 vector PointInBrush_vec;
2 float PointInBrush_Recurse()
8 traceline(PointInBrush_vec, PointInBrush_vec, 0, world);
17 f = PointInBrush_Recurse();
22 float PointInBrush(entity brush, vector point)
26 if not(self.modelindex)
30 self.solid = SOLID_BSP;
31 PointInBrush_vec = point;
32 f = PointInBrush_Recurse();
38 .float cnt; // effect number
39 .vector velocity; // particle velocity
40 .float waterlevel; // direction jitter
41 .float count; // count multiplier
42 .float glow_color; // palette color
43 .float impulse; // density
44 .string noise; // sound
47 void Draw_PointParticles()
54 sz = self.maxs - self.mins;
55 n = self.impulse * drawframetime;
57 for(i = random(); i <= n && fail <= 64*n; ++i)
60 p_x += random() * sz_x;
61 p_y += random() * sz_y;
62 p_z += random() * sz_z;
63 if(PointInBrush(self, p))
65 pointparticles(self.cnt, p, self.velocity + randomvec() * self.waterlevel, self.count, self.glow_color);
69 sound(self, CHAN_AUTO, self.noise, 1, ATTN_NORM);
72 else if(self.absolute)
81 void Ent_PointParticles()
83 self.modelindex = ReadShort();
84 self.origin_x = ReadCoord();
85 self.origin_y = ReadCoord();
86 self.origin_z = ReadCoord();
87 self.maxs_x = ReadCoord();
88 self.maxs_y = ReadCoord();
89 self.maxs_z = ReadCoord();
90 self.cnt = ReadShort(); // effect number
91 self.impulse = ReadCoord(); // density (<0: point, >0: volume)
93 self.impulse = 1; // one per sec
94 self.velocity_x = ReadCoord();
95 self.velocity_y = ReadCoord();
96 self.velocity_z = ReadCoord();
97 self.waterlevel = ReadCoord();
98 self.count = ReadCoord();
99 self.glow_color = ReadByte();
101 strunzone(self.noise);
102 self.noise = strzone(ReadString());
104 self.absolute = (self.impulse >= 0);
106 self.impulse *= -self.maxs_x * self.maxs_y * self.maxs_z / 262144; // relative: particles per 64^3 cube
108 self.mins = -0.5 * self.maxs;
109 self.maxs = 0.5 * self.maxs;
110 self.origin = self.origin - self.mins;
112 setorigin(self, self.origin);
113 setsize(self, self.mins, self.maxs);
114 self.solid = SOLID_NOT;
115 self.draw = Draw_PointParticles;