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 *.mp4
*.lst *.lst
*.wav *.wav
*.xyz
frames/* frames/*
log.* log.*
@ -17,4 +18,5 @@ mergebloubs
listbloubs listbloubs
essai essai
WS/*.data
core 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, 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) 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 ### mergebloubs

View File

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

View File

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

View File

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

View File

@ -48,6 +48,9 @@ program movebloubs
compteur = 0 compteur = 0
killed = 0 killed = 0
!-
! begin of bigloop
!-
do do
read (unit=inu, iostat=errcode) bloub read (unit=inu, iostat=errcode) bloub
if (0 .ne. errcode) then if (0 .ne. errcode) then
@ -59,14 +62,14 @@ program movebloubs
call move_bloub (bloub, 0.185) call move_bloub (bloub, 0.185)
call bound_a_bloub (bloub) call bound_a_bloub (bloub)
if (bloub%radius .GT. 0.0238) then if (bloub%radius .GT. 0.0238) then
bloub%radius = bloub%radius * 0.996 bloub%radius = bloub%radius * 0.999
endif endif
call green_soylent (bloub) ! XXX call green_soylent (bloub)
if (.NOT. bloub%alive) then ! XXX if (.NOT. bloub%alive) then
! write(0, '(A)') " KILL!" ! XXX ! write(0, '(A)') " KILL!"
killed = killed + 1 ! XXX killed = killed + 1
endif ! XXX endif
! calcul du barycentre ! calcul du barycentre
bx = bx + dble(bloub%px) bx = bx + dble(bloub%px)
@ -84,33 +87,18 @@ program movebloubs
enddo ! end of main loop enddo ! end of main loop
write(0, '(1X,I0,1X,A)') compteur, "bloubs processed" 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 if (killed .GT. 0) then
write (0, '(1X,I0,A)') killed, " bloubs killed" write (0, '(1X,I0,A)') killed, " bloubs killed"
endif endif
bx = bx / dble(compteur) ! ok, we have read all the bloubs from the input file
by = by / dble(compteur)
bz = bz / dble(compteur) ! insert some fancy conditional here
write (0, '(A,3(F12.6,3X))') "barycentre : ", bx, by, bz if (compteur .LT. 200) then
call add_more_bloubs(outu, 5, 0.032)
endif
close(inu) ; close(outu)
! -------------------------------------------------------------- ! --------------------------------------------------------------
contains contains
@ -121,14 +109,14 @@ contains
type(t_bloubs) :: bloub type(t_bloubs) :: bloub
integer :: foo, count integer :: foo, count
count = nbre+mod(irand(), 6) count = nbre+mod(irand(), 3)
write(0, '(A,I4,1X,A)') "adding", count, "bloubs" write(0, '(A,I4,1X,A)') "movebloubs adding", count, "bloubs"
do foo=1, count do foo=1, count
bloub%nick = 'newbie ' bloub%nick = 'newbie '
call make_a_random_bloub(bloub) call make_a_random_bloub(bloub, 7.12)
bloub%radius = rayon + (0.05*rand()) bloub%radius = rayon + (0.09*rand())
bloub%age = 1 bloub%age = 1
bloub%alive = .TRUE. bloub%alive = .TRUE.
bloub%num = mod(irand(), 42) 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" LOGERR="log.error"
TXTCOLOR="#db2080" TXTCOLOR="#db2080"
BLOUBDATAS="WS/bloubs.data"
BARYDATAS="WS/log.barycentres"
# --- put the work file in ramdisk # --- put the work file in ramdisk
BLBS_IN="/dev/shm/in.blbs" BLBS_IN="/dev/shm/in.blbs"
BLBS_OUT="/dev/shm/out.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 # first, we have to make a seminal buch of bloubs
# --> this function need to be parametrizable # --> this function need to be parametrizable
# #
./genbloubs ${BLBS_IN} 5 ./genbloubs ${BLBS_IN} 97
for idx in $(seq 0 $((NBIMG-1)) ) for idx in $(seq 0 $((NBIMG-1)) )
do do
echo "======== run passe $idx =========" echo "============== run passe $idx ===================="
# make the bloubs's data readable by POVray # 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" echo "### raytracing pass $idx"
@ -58,13 +63,13 @@ do
convert ${TMPPNG} \ convert ${TMPPNG} \
-font Courier-Bold \ -font Courier-Bold \
-pointsize 24 \ -pointsize 22 \
-fill "$TXTCOLOR" \ -fill "$TXTCOLOR" \
-gravity south-east \ -gravity south-east \
-annotate +25+5 "$td" \ -annotate +25+5 "$td" \
-gravity south-west \ -gravity south-west \
-annotate +25+5 "$hi" \ -annotate +25+5 "$hi" \
-pointsize 32 \ -pointsize 28 \
-gravity north-east \ -gravity north-east \
-annotate +45+5 "$count" \ -annotate +45+5 "$count" \
-gravity north-west \ -gravity north-west \
@ -78,7 +83,7 @@ do
# mv ${BLBS_OUT} ${BLBS_IN} # mv ${BLBS_OUT} ${BLBS_IN}
echo "### run done" echo "### run done"
sleep 60 sleep 10
done 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 } } } // 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 BH = 6; // H = taille en horizontal
#declare BV = 4; // V = taille en vertical #declare BV = 4; // V = taille en vertical
#declare BR = 0.034; #declare BR = 0.056;
#declare Une_Borne = object #declare Une_Borne = object
{ {
merge { merge {
cylinder { <0, BV, 0>, <0, -BV, 0>, BR } 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 { <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 XCAM = 5 - ( 10 * NormClock);
#declare YCAM = -1.1 + (0.95 * NormClock); #declare YCAM = -1.1 + (1.15 * NormClock);
#declare ZCAM = -13.10; #declare ZCAM = -16.50;
#declare XLAT = Bary_X; #declare XLAT = 0;
#declare YLAT = Bary_Y; #declare YLAT = 0;
#declare ZLAT = Bary_Z; #declare ZLAT = 0;
// object { Repere scale 2.5 translate <XLAT, YLAT, ZLAT> }
camera { camera {
location <XCAM, YCAM, ZCAM> location <XCAM, YCAM, ZCAM>
look_at <XLAT, YLAT, ZLAT> look_at <XLAT, YLAT, ZLAT>
right x*image_width/image_height right x*image_width/image_height
angle 86 angle 64
} }

View File

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