/usr/share/gravit/spawn/clouds.gravitspawn is in gravit-data 0.5.1+dfsg-2build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
| 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 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 | -- vim:syntax=lua tabstop=4
load("functions.lua")
load("constants.lua")
load("physics.lua")
function describe()
	log("some clouds of ligher particles with random velocities")	
end
-- this spawn script is "proper physics ready".
-- ----------------------------------------------------------------
-- ----------------------------------------------------------------
-- rotate vector: alpha around x axis, then beta around z axis
function rotvect_xz(pos, alpha, beta)
   local res1 = v(0,0,0)
   local res2 = v(0,0,0)
-- x-axis
   --y' = y*cos q - z*sin q
   --z' = y*sin q + z*cos q
   res1.y = pos.y * math.cos(alpha) - pos.z * math.sin(alpha)
   res1.z = pos.y * math.sin(alpha) + pos.z * math.cos(alpha)
   res1.x = pos.x
-- z-axis
   --x' = x*cos q - y*sin q
   --y' = x*sin q + y*cos q 
   res2.x = res1.x * math.cos(beta) - res1.y * math.sin(beta)
   res2.y = res1.x * math.sin(beta) + res1.y * math.cos(beta)
   res2.z = res1.z
   return res2
end
function rotvect_xz_inv(pos, alpha, beta)
   local res1 = v(0,0,0)
   local res2 = v(0,0,0)
-- z-axis
   --x' = x*cos q - y*sin q
   --y' = x*sin q + y*cos q 
   res1.x = pos.x * math.cos(beta) - pos.y * math.sin(beta)
   res1.y = pos.x * math.sin(beta) + pos.y * math.cos(beta)
   res1.z = pos.z
-- x-axis
   --y' = y*cos q - z*sin q
   --z' = y*sin q + z*cos q
   res2.y = res1.y * math.cos(alpha) - res1.z * math.sin(alpha)
   res2.z = res1.y * math.sin(alpha) + res1.z * math.cos(alpha)
   res2.x = res1.x
   return res2
end
-- make rotation around (y)-axis
function makerot(realpos, vel, strength, maxradius, avgspeed, alpha, beta)
   -- constants
   local angular_fraction = 24
   -- rotate postional vector
   --local pos = realpos
   local pos = rotvect_xz( realpos, alpha, beta)
   -- compute rotation vector around y-axis for pos
   local len=vlength(vel)
   local radius=vlength(v(pos.x, 0, pos.z))
   local radspeed=radius * 2*math.pi / angular_fraction
   local rotvector= v(-pos.z, 0, pos.x)
   --local rotvector= pos * 0.2 + v(-pos.z, 0, pos.x)
   rotvector = rotvector * (1.0/vlength(rotvector))
   rotvector = rotvector * radspeed
   -- to scale down rotvector: strength * agvspeed at maxradius
   local maxspeed=2* math.pi * maxradius / angular_fraction
   rotvector= rotvector * (strength * avgspeed / maxspeed)
   -- anti-rotate velocity vector
   rotvector=rotvect_xz_inv(rotvector, -alpha, -beta)
   -- vector add, then restore length
   -- local rotvel = rotvector
   local rotvel = vel + rotvector
   rotvel = rotvel * (1.0 / vlength(rotvel)) * len
   return rotvel
end
-- make random cloud
function makecloud(org, orgvel, radius, innermass, massmin, massmax, firstparticle, particles, docenter)
   local avg_mass   = (massmin+massmax)/2.0
   local total_mass = (avg_mass * particles)+innermass
   local avg_vel = math.sqrt(gravit_g * total_mass / radius)
   --local maxrad=radius * 0.75
   local maxrad=radius * 0.99
   local center_mode= docenter
   local rotalpha=randomfloat(-math.pi, math.pi)
   local rotbeta=randomfloat(-math.pi, math.pi)
   local strength=2^(randomfloat(-1,5))
   --local strength=2^3
   local mass_mixed_sign = 0
   -- if (randomint(0,7) > 6) then
   --    mass_mixed_sign = 1
   -- end
   if (firstparticle+particles >= spawnparticles) then
      rotalpha=-math.pi/2 + (randomint(0,1) * math.pi)
      rotbeta=0
   end
   if gravit_physics < PH_PROPER then
      avg_vel = orbit_velocity(total_mass /2 , radius / 2)
   end
	for i=firstparticle,firstparticle+particles-1 do
	   local len  = randomfloat(0.005, maxrad)
	   local pos  = randomshell(len)
	   --local mass = avg_mass
	   local mass = randomfloat(massmin, massmax)
	   local speed
	   local vel=v(0,0,0)
	   if (docenter>1) then
	      center_mode= randomint(0,1)
	   end
	   if ((center_mode < 1) and (len > (10.0 * radius / particles))) then
	      -- orbit velocity
	      speed = orbit_velocity((total_mass) * len / radius, len)
	      if gravit_physics == PH_CLASSIC then
		 speed = speed * math.sqrt(mass * 0.5)
	      end
	      -- velocity orthogonal to center
	      vel=randomortho(pos, speed)
	   else
	      -- average equlibrium speed
	      speed= avg_vel
	      if (center_mode < 1) then
		 vel=randomortho(pos, speed)
	      else
	      -- random velocity vector
		 vel  = randomshell(speed)
	      end
	   end
	   vel=makerot(pos, vel, strength, radius, avg_vel, rotalpha, rotbeta)
           if (mass_mixed_sign == 1) and (randomint(0,1) > 0) then
	      mass = mass * -1
           end
	   particle(i, org+pos, orgvel+vel, mass)
	end
	
end
--------- ==============================================
function do_the_cloud(center, mainvel, minrad, maxrad, fakminmass, fakmaxmass, centralorbit, onlyone, startp, parts)
	-- local onlyone = randomint(0,1)
	-- local onlyone = 1
	-- local centralorbit = randomint(0,2)
        -- local centralorbit=0
	-- local center = v(0,0,0)
	-- local mainvel =v(0,0,0)
	-- missing : rotation vector !!
        local mass_dev = randomfloat(0, 0.5)
        --local mass_dev = 0
   	local massiveparticles
	local bigmass
        local bigradius
	local radius=randomfloat(minrad, maxrad)
	local target_mass = randomfloat(radius*fakminmass, radius*fakmaxmass)
	if (onlyone > 0) then
	   massiveparticles = 0
	   bigmass = 0
	else
	   -- massiveparticles = randomint(1, 6)
	   massiveparticles = 2^(randomint(0, 9))
	   bigmass = randomfloat(0.01, 0.1) * target_mass
	   bigradius = randomfloat(0.1, 0.4) * radius
		
	   local bigmassmin=(bigmass/massiveparticles) * (1-mass_dev)
	   local bigmassmax=(bigmass/massiveparticles) * (1+mass_dev)
	   makecloud(center, mainvel, bigradius, 0, bigmassmin, bigmassmax, startp, massiveparticles, 0)	
	end
	local smallmass = (target_mass - bigmass) / spawnparticles
	local massmin=smallmass  * (1-mass_dev)
	local massmax=smallmass  * (1+mass_dev)
	local innermass = bigmass
	makecloud(center, mainvel, radius, innermass, massmin, massmax, startp + massiveparticles, parts-massiveparticles, centralorbit)
	return target_mass
end
--------- ==============================================
function place_object_cloud(num, center, vel, ratio, start, particles)
        -- local centralorbit=0
	local onlyone = 1
        --local onlyone = randomint(0,1)
	local centralorbit = randomint(0,2)
	local minrad=200
	local maxrad=400
	local fakminmass=7 * ratio
	local fakmaxmass=14 * ratio
	if gravit_physics < PH_PROPER then
	   fakminmass=fakminmass*12
	   fakmaxmass=fakmaxmass*16
	end
        if gravit_physics == PH_CLASSIC then
	   fakminmass=fakminmass*8
	   fakmaxmass=fakmaxmass*8
	   minrad=minrad * 2
	   maxrad=maxrad * 6
        end
   return do_the_cloud(center, vel, minrad, maxrad, fakminmass, fakmaxmass, centralorbit, onlyone, start, particles)
end
-- ----------------------------------------------------------------
-- ----------------------------------------------------------------
function spawn()
	local num_objects=randomint(1,6)
	local min_distance=1000
        if (gravit_physics == PH_CLASSIC) then
	    min_distance = min_distance * 6
	    if (randomint(0,3) > 2) then num_objects=randomint(1,15) end
        end
        -- first cloud
        local parts=math.floor(spawnparticles / num_objects)
	local pos = randomrange(400)
	local mainvel = v(0,0,0)
	local mass = place_object_cloud(0, pos, mainvel, 1, 0, parts)
	local center=pos
        -- spawn some more clouds
	local pstart=parts
	for i=1, num_objects-1 do
	   if i==(num_objects-1) then
	      parts = spawnparticles - pstart
	   end
	   
	   pos = center + randomshell(min_distance) + randomrange(min_distance/2.5)
	   local dist=distance(pos, center)
	   -- compute 2-body eliptic orbit velocity
	   local ratio=1.0/randomfloat(0.9,4)
	   local eccentricity = randomfloat(0.2, 0.8)
	   local smalldist    = dist * math.sqrt(1- eccentricity*eccentricity)
	   local orbitVel=math.sqrt(gravit_g * mass *(1+ratio) * ((2/dist) - (1/smalldist)))
	   if (gravit_physics < PH_PROPER) or (randomint(0,1)>0) then
	         orbitVel = orbit_velocity(mass, dist)
	   end
	   if gravit_physics == PH_MODIFIED then
	      orbitVel = orbitVel * 0.5 * math.sqrt(mass/2);
	   end
	   mainvel=randomortho(pos - center, orbitVel * randomfloat(0.5, 0.94))
	   -- create cloud
	   mass = place_object_cloud(i, pos, mainvel, ratio, pstart, parts)
	   center=pos
	   pstart=pstart+parts
	end 
end
 |