96 lines
2.7 KiB
GDScript
96 lines
2.7 KiB
GDScript
extends Spatial
|
|
|
|
#export var textureset = ["9","13","16","21","22","23","28"]
|
|
|
|
var kobcount = 200
|
|
var kobolds = []
|
|
var skip = 1 # physics skip
|
|
var lskip = 4 # lighting skip
|
|
var sc = 0
|
|
var lsc = 0
|
|
var lights
|
|
|
|
var texsize = 128
|
|
|
|
var abusi
|
|
var abusc
|
|
var abuss
|
|
|
|
var bval2 = 0.0
|
|
var lbval2 = 0.0
|
|
var dbval2 = 0.0
|
|
var rms = 0.0
|
|
var arms = 0.0
|
|
var rpeak = 0.0
|
|
|
|
func _ready():
|
|
#for i in len(textureset):
|
|
# textureset[i] = load("res://textures/kobolds/%s.png" % textureset[i])
|
|
var ktex = load("res://textures/kobolds/atlas.png")
|
|
for i in kobcount:
|
|
var kobold = Sprite3D.new()
|
|
kobold.texture = ktex
|
|
kobold.pixel_size = 0.768/texsize #0.0015
|
|
kobold.billboard = 2
|
|
kobold.region_enabled = true
|
|
var texid = randi()%7
|
|
kobold.region_rect = Rect2(texid%4*texsize,floor(texid/4)*texsize,texsize,texsize)
|
|
add_child(kobold)
|
|
kobolds.append([Vector3(rand_range(-2,2),2,rand_range(-3,3)),Vector3.ZERO,kobold])
|
|
lights = get_parent().lights
|
|
abusi = AudioServer.get_bus_index("Input")
|
|
abusc = AudioServer.get_bus_effect(abusi,0)
|
|
abuss = AudioServer.get_bus_effect_instance(abusi,1)
|
|
abusc.buffer_length = 0.1
|
|
|
|
const bouncemin = 1
|
|
const bouncemax = 2
|
|
const hdeviation = 0.5
|
|
var bounceboost = 2
|
|
|
|
# real physics simulation was too expensive, so approximation will have to do :3
|
|
var velocity = Vector3.ZERO
|
|
|
|
func _physics_process(delta):
|
|
rms = 0
|
|
var adata = abusc.get_buffer(int(AudioServer.get_mix_rate()*delta)+1)
|
|
for v in adata:
|
|
rms += pow(v.x+v.y,2)
|
|
arms = arms*0.9 + rms*0.1
|
|
rpeak = clamp(rms/max(arms*2,1)-0.5,0,1)
|
|
#lbval2 = bval2
|
|
#bval2 = abuss.get_magnitude_for_frequency_range(18000,20000).length()*100
|
|
#dbval2 = (bval2-lbval2)*delta*1000
|
|
bounceboost = 1 + rpeak + clamp(rms/250,0,1)
|
|
$"/root/Spatial/DebugText".text = "%0.4f\n%0.4f\n%0.4f\n%d\n%d" % [rms,arms,rpeak,abusc.get_buffer_length_frames(),abusc.get_frames_available()]
|
|
#print(rms)
|
|
for i in range(sc,kobcount,skip):
|
|
var kobold = kobolds[i]
|
|
kobold[1].y -= 9.81*delta*skip
|
|
if kobold[0].y < 0:
|
|
kobold[1].y = 0
|
|
kobold[0].y = 0
|
|
kobold[1] += Vector3(rand_range(-hdeviation,hdeviation),rand_range(bouncemin,bouncemax),rand_range(-hdeviation,hdeviation))*bounceboost
|
|
if kobold[0].x < -2:
|
|
kobold[0].x = -2
|
|
kobold[1].x = 0
|
|
if kobold[0].x > 2:
|
|
kobold[0].x = 2
|
|
kobold[1].x = 0
|
|
if kobold[0].z < -3:
|
|
kobold[0].z = -3
|
|
kobold[1].z = 0
|
|
if kobold[0].z > 3:
|
|
kobold[0].z = 3
|
|
kobold[1].z = 0
|
|
kobold[0] += kobold[1] * delta*skip
|
|
kobold[2].position = kobold[0]+Vector3(0,0.25,0)
|
|
for i in range(lsc,kobcount,lskip):
|
|
var kobold = kobolds[i]
|
|
var lum = Vector3.ZERO
|
|
for light in lights:
|
|
lum += light[1]/max(light[0].distance_squared_to(to_global(kobold[0]))/2,1)
|
|
kobold[2].modulate = Color(lum.x,lum.y,lum.z)
|
|
sc = (sc + 1) % skip
|
|
lsc = (lsc + 1) % lskip
|