bloubworld: more tweaking, more pimping

This commit is contained in:
tTh 2024-01-29 05:25:08 +01:00
parent 329f054fff
commit 5030fda56f
10 changed files with 119 additions and 77 deletions

View File

@ -7,6 +7,7 @@ nbimg.inc
*.mp4
*.lst
*.wav
*.xyz
frames/*
log.*
@ -17,4 +18,5 @@ mergebloubs
listbloubs
essai
WS/*.data
core

View File

@ -62,7 +62,10 @@ ce qu'il faut pour les différents moteurs de rendu.
Bon, pour le moment, dans les formats il n'y a que POVray,
mais Gnuplot et/ou Rdata arriveront bien un de ces jours.[source](exportbloubs.f90)
Un exemple : l'idée est de générer un fichier `.inc` pour
Povray pour utiliser les données exportées dans une scène,
par exemple le barycentre des bloubs. Et c'est très facile
à faire avec un [script Awk](toinc.awk).
### mergebloubs

View File

@ -68,31 +68,37 @@ module bloubspace
end subroutine load_boundingbox
! ----------------------------------------------------------------
subroutine make_a_random_bloub(blb)
!-
! coefxyz :
! dispersion de la position autour de l'origine
!-
subroutine make_a_random_bloub(blb, coefxyz)
type(t_bloubs), intent (out) :: blb
real, intent(in) :: coefxyz
blb%px = 3.57 * (rand() - 0.50)
blb%py = 2.66 * (rand() - 0.50)
blb%pz = 3.57 * (rand() - 0.50)
! write(0, *) "coef xyz = ", coefxyz
blb%px = coefxyz * (rand() - 0.50)
blb%py = coefxyz * (rand() - 0.50)
blb%pz = coefxyz * (rand() - 0.50)
blb%vx = (rand()) / 2.500
blb%vx = (rand()) / 5.000
if (blb%px .LT. 0.0) blb%vx = -blb%vx
blb%vy = (rand()) / 4.000
if (blb%py .LT. 0.0) blb%vy = -blb%vx
blb%vy = 0.2 + (rand()) / 8.000
if (blb%py .LT. 0.0) blb%vy = -blb%vy
blb%vz = (rand()) / 2.500
blb%vz = (rand()) / 5.000
if (blb%pz .LT. 0.0) blb%vz = -blb%vz
blb%state = 0
blb%alive = .TRUE.
blb%age = 0
blb%agemax = 300
blb%agemax = 100
end subroutine
! ----------------------------------------------------------------
! Load a blbs file into an array of bloubs
subroutine spit_bloubs_to_file (fname, blbarray, towrite)
character(*), intent(in) :: fname
type(t_bloubs), dimension(:) :: blbarray
@ -125,7 +131,7 @@ module bloubspace
enddo
close(output)
write(0, '(1X, "spitted ", I6, " bloubs")') spitted
write(0, '(1X, "spitted ", I0, " bloubs.")') spitted
end subroutine spit_bloubs_to_file
! ----------------------------------------------------------------
@ -201,7 +207,9 @@ module bloubspace
end subroutine
! ----------------------------------------------------------------
!-
! Deplacement d'un bloub
!-
subroutine move_bloub (blb, coef)
type(t_bloubs), intent (inout) :: blb
real, intent (in) :: coef
@ -215,7 +223,9 @@ module bloubspace
! ----------------------------------------------------------------
!
! detection des collisions avec les parois de la boite
! laquelle boite gagnerais beaucoup a etre parametrable.
! laquelle boite gagnerais beaucoup a etre parametrable,
! ainsi qu'un éventuel coefficient de réduction de la
! vitesse. XXX
!
subroutine bound_a_bloub (blb)
type(t_bloubs), intent (inout) :: blb
@ -226,7 +236,7 @@ module bloubspace
! X axis
if ((blb%px + blb%radius) .GT. SH) then
blb%vx = -1.0 * blb%vx
blb%px = SH- blb%radius
blb%px = SH - blb%radius
blb%age = blb%age + 1
endif
if ((blb%px - blb%radius) .LT. -SH) then
@ -282,13 +292,13 @@ module bloubspace
subroutine green_soylent (blb)
type(t_bloubs), intent (inout) :: blb
if (blb%age .gt. 24) then
if (blb%age .gt. 240) then
blb%alive = .FALSE.
endif
! this is juste a molly-guard, don't worry
!
if (blb%radius .GT. 2.0) then
if (blb%radius .GT. 4.0) then
blb%alive = .FALSE.
endif
end subroutine

View File

@ -33,8 +33,8 @@ program genbloubs
bloub%nick = 'noname '
bloub%num = i + 41
call make_a_random_bloub(bloub)
bloub%radius = 0.035 + (0.03*rand())
call make_a_random_bloub(bloub, 8.25)
bloub%radius = 0.015 + (0.08*rand())
write(idu) bloub ! no error control ?

View File

@ -33,7 +33,7 @@ program mergebloubs
endif
call slurp_bloubs_file_in_array(trim(infile), bloubs, nbgot)
write(0, '(A,I6,1X,A)') " slurped ", nbgot, "bloubs"
write(0, '(A,I0,1X,A)') " slurped ", nbgot, "bloubs"
contacts = 0
do ia = 1, nbgot
@ -42,19 +42,26 @@ program mergebloubs
dist = distance_of_bloubs(bloubs(ia), bloubs(ib))
radd = bloubs(ia)%radius + bloubs(ib)%radius
if (dist .LT. radd) then
contacts = contacts + 1
call merge_two_bloubs(bloubs(ia), bloubs(ib), merged)
bloubs(ia) = merged
bloubs(ia)%nick = "marged"
bloubs(ia)%state = 1;
bloubs(ib)%alive = .FALSE.
write(0, *) " *** merged ", ia, " and ", ib, &
" new r = ", merged%radius
endif
enddo
enddo
call spit_bloubs_to_file (outfile, bloubs, nbgot)
! print *, contacts, "contacts pour ", nbgot, "bloubs"
if (contacts .GT. 0) then
write(0, '(A,I0,A,I0,A)') &
" merge: ", contacts, " contacts pour ", nbgot, " bloubs"
endif
! STOP 'mergebloubs [done]'
@ -77,8 +84,8 @@ contains
blr%vy = (bla%vy + blb%vy) / 2.0
blr%vz = (bla%vz + blb%vz) / 2.0
blr%radius = (bla%radius + blb%radius) / 2.222
blr%age = min(bla%age, blb%age)
blr%radius = (bla%radius + blb%radius)
blr%age = max(bla%age, blb%age)
! bring it to life !
blr%alive = .TRUE.

View File

@ -48,6 +48,9 @@ program movebloubs
compteur = 0
killed = 0
!-
! begin of bigloop
!-
do
read (unit=inu, iostat=errcode) bloub
if (0 .ne. errcode) then
@ -59,14 +62,14 @@ program movebloubs
call move_bloub (bloub, 0.185)
call bound_a_bloub (bloub)
if (bloub%radius .GT. 0.0238) then
bloub%radius = bloub%radius * 0.996
bloub%radius = bloub%radius * 0.999
endif
call green_soylent (bloub)
if (.NOT. bloub%alive) then
! write(0, '(A)') " KILL!"
killed = killed + 1
endif
! XXX call green_soylent (bloub)
! XXX if (.NOT. bloub%alive) then
! XXX ! write(0, '(A)') " KILL!"
! XXX killed = killed + 1
! XXX endif
! calcul du barycentre
bx = bx + dble(bloub%px)
@ -84,33 +87,18 @@ program movebloubs
enddo ! end of main loop
write(0, '(1X,I0,1X,A)') compteur, "bloubs processed"
! ok, we have read all the bloubs in the input file
! insert some fancy conditional here
if (compteur .LT. 200) then
call add_more_bloubs(outu, 4, 0.026)
endif
! insert some very fancy conditional here
if (compteur .LT. 800) then
rnd = rand()
! write (0, '(A,1X,F9.6)') "try to add bloubs, rnd is", rnd
if (rnd .LT. 0.0604) then
call add_more_bloubs(outu, 11, 0.019)
endif
endif
close(inu) ; close(outu)
if (killed .GT. 0) then
write (0, '(1X,I0,A)') killed, " bloubs killed"
endif
bx = bx / dble(compteur)
by = by / dble(compteur)
bz = bz / dble(compteur)
write (0, '(A,3(F12.6,3X))') "barycentre : ", bx, by, bz
! ok, we have read all the bloubs from the input file
! insert some fancy conditional here
if (compteur .LT. 200) then
call add_more_bloubs(outu, 5, 0.032)
endif
close(inu) ; close(outu)
! --------------------------------------------------------------
contains
@ -121,14 +109,14 @@ contains
type(t_bloubs) :: bloub
integer :: foo, count
count = nbre+mod(irand(), 6)
write(0, '(A,I4,1X,A)') "adding", count, "bloubs"
count = nbre+mod(irand(), 3)
write(0, '(A,I4,1X,A)') "movebloubs adding", count, "bloubs"
do foo=1, count
bloub%nick = 'newbie '
call make_a_random_bloub(bloub)
bloub%radius = rayon + (0.05*rand())
call make_a_random_bloub(bloub, 7.12)
bloub%radius = rayon + (0.09*rand())
bloub%age = 1
bloub%alive = .TRUE.
bloub%num = mod(irand(), 42)

5
BloubWorld/plotbary.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/bash
BARYDATAS="WS/log.barycentres"
wc -l $BARYDATAS

View File

@ -12,6 +12,9 @@ DDIR="frames/a"
LOGERR="log.error"
TXTCOLOR="#db2080"
BLOUBDATAS="WS/bloubs.data"
BARYDATAS="WS/log.barycentres"
# --- put the work file in ramdisk
BLBS_IN="/dev/shm/in.blbs"
BLBS_OUT="/dev/shm/out.blbs"
@ -31,16 +34,18 @@ printf "\n#declare NbImg = %d;\n" $NBIMG > WS/nbimg.inc
# first, we have to make a seminal buch of bloubs
# --> this function need to be parametrizable
#
./genbloubs ${BLBS_IN} 5
./genbloubs ${BLBS_IN} 97
for idx in $(seq 0 $((NBIMG-1)) )
do
echo "======== run passe $idx ========="
echo "============== run passe $idx ===================="
# make the bloubs's data readable by POVray
#
./exportbloubs ${BLBS_IN} | awk -f toinc.awk > $INCFILE
./exportbloubs ${BLBS_IN} > $BLOUBDATAS
awk -f toinc.awk < $BLOUBDATAS > $INCFILE
awk '{ print $1, $2, $3 }' < $BLOUBDATAS > $BARYDATAS
echo "### raytracing pass $idx"
@ -58,13 +63,13 @@ do
convert ${TMPPNG} \
-font Courier-Bold \
-pointsize 24 \
-pointsize 22 \
-fill "$TXTCOLOR" \
-gravity south-east \
-annotate +25+5 "$td" \
-gravity south-west \
-annotate +25+5 "$hi" \
-pointsize 32 \
-pointsize 28 \
-gravity north-east \
-annotate +45+5 "$count" \
-gravity north-west \
@ -78,7 +83,7 @@ do
# mv ${BLBS_OUT} ${BLBS_IN}
echo "### run done"
sleep 60
sleep 10
done

View File

@ -44,22 +44,43 @@ union {
}
}
plane { y, 0 pigment { color White } translate -4.20*y}
cylinder { 0, -y, 30 pigment { color White } translate -4.20*y}
sky_sphere {
pigment { color Gray20 }
emission rgb <0.1, 0.1, 0.1>
}
// object { cylinder { <0, 0, 0>, <10, 0, 0>, 0.05 pigment { color Cyan } } }
// ----------------------------------------------------------
#declare Croisillon = object
{
union {
cylinder { -1*x, 1*x, 0.04 }
cylinder { -1*y, 1*y, 0.04 }
cylinder { -1*z, 1*z, 0.04 }
}
texture {
pigment { color Gray50 }
}
}
object { Croisillon scale 0.80 translate <Bary_X, Bary_Y, Bary_Z> }
// ----------------------------------------------------------
#declare BH = 6; // H = taille en horizontal
#declare BV = 4; // V = taille en vertical
#declare BR = 0.034;
#declare BR = 0.056;
#declare Une_Borne = object
{
merge {
cylinder { <0, BV, 0>, <0, -BV, 0>, BR }
cylinder { <0, 0.018, 0>, <0, -0.018, 0>, BR*3 }
cylinder { <0, 0.036, 0>, <0, -0.036, 0>, BR*2 }
}
}
@ -113,21 +134,19 @@ union {
// ----------------------------------------------------------
light_source { <19, 12+NormClock, -17> color Gray80 }
light_source { <11, 10-NormClock, -29> color Gray60 }
light_source { <12, 10-NormClock, -29> color Gray70 }
#declare XCAM = 8 - ( 15 * NormClock);
#declare YCAM = -1.1 + (0.95 * NormClock);
#declare ZCAM = -13.10;
#declare XCAM = 5 - ( 10 * NormClock);
#declare YCAM = -1.1 + (1.15 * NormClock);
#declare ZCAM = -16.50;
#declare XLAT = Bary_X;
#declare YLAT = Bary_Y;
#declare ZLAT = Bary_Z;
// object { Repere scale 2.5 translate <XLAT, YLAT, ZLAT> }
#declare XLAT = 0;
#declare YLAT = 0;
#declare ZLAT = 0;
camera {
location <XCAM, YCAM, ZCAM>
look_at <XLAT, YLAT, ZLAT>
right x*image_width/image_height
angle 86
angle 64
}

View File

@ -9,6 +9,8 @@ BEGIN {
count = 0
bx = by = bz = 0.0
print "// GENERATED FILE, DON'T TOUCH IT !"
print "// --------------------------------"
print
print "#declare Bloubs = object\n{"
print "union\t{"
}
@ -18,10 +20,11 @@ BEGIN {
merged = $6
color = "Cyan"
if (age < 2) color = "Yellow"
if (age < 18) color = "Gray40"
if (age < 2) color = "Gray10"
if (merged) {
if (age > 120) color = "Orange"
else color = "Red"
else color = "Yellow"
}
else {
if (age > 120) color = "Black"