From 5030fda56f3c1d83a492db5a7cc0cb28a2f43174 Mon Sep 17 00:00:00 2001 From: tTh Date: Mon, 29 Jan 2024 05:25:08 +0100 Subject: [PATCH] bloubworld: more tweaking, more pimping --- BloubWorld/.gitignore | 2 ++ BloubWorld/README.md | 5 +++- BloubWorld/bloubspace.f90 | 42 ++++++++++++++++++----------- BloubWorld/genbloubs.f90 | 4 +-- BloubWorld/mergebloubs.f90 | 15 ++++++++--- BloubWorld/movebloubs.f90 | 54 +++++++++++++++----------------------- BloubWorld/plotbary.sh | 5 ++++ BloubWorld/runme.sh | 17 +++++++----- BloubWorld/scene.pov | 45 ++++++++++++++++++++++--------- BloubWorld/toinc.awk | 7 +++-- 10 files changed, 119 insertions(+), 77 deletions(-) create mode 100755 BloubWorld/plotbary.sh diff --git a/BloubWorld/.gitignore b/BloubWorld/.gitignore index c1991ca..ae66520 100644 --- a/BloubWorld/.gitignore +++ b/BloubWorld/.gitignore @@ -7,6 +7,7 @@ nbimg.inc *.mp4 *.lst *.wav +*.xyz frames/* log.* @@ -17,4 +18,5 @@ mergebloubs listbloubs essai +WS/*.data core diff --git a/BloubWorld/README.md b/BloubWorld/README.md index 8c4758d..a4c123f 100644 --- a/BloubWorld/README.md +++ b/BloubWorld/README.md @@ -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 diff --git a/BloubWorld/bloubspace.f90 b/BloubWorld/bloubspace.f90 index 7249e2d..0e39606 100644 --- a/BloubWorld/bloubspace.f90 +++ b/BloubWorld/bloubspace.f90 @@ -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 diff --git a/BloubWorld/genbloubs.f90 b/BloubWorld/genbloubs.f90 index c50885d..00656c1 100644 --- a/BloubWorld/genbloubs.f90 +++ b/BloubWorld/genbloubs.f90 @@ -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 ? diff --git a/BloubWorld/mergebloubs.f90 b/BloubWorld/mergebloubs.f90 index f5fc3f5..4a63fa7 100644 --- a/BloubWorld/mergebloubs.f90 +++ b/BloubWorld/mergebloubs.f90 @@ -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. diff --git a/BloubWorld/movebloubs.f90 b/BloubWorld/movebloubs.f90 index 7b50c68..f92ea44 100644 --- a/BloubWorld/movebloubs.f90 +++ b/BloubWorld/movebloubs.f90 @@ -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) diff --git a/BloubWorld/plotbary.sh b/BloubWorld/plotbary.sh new file mode 100755 index 0000000..728634b --- /dev/null +++ b/BloubWorld/plotbary.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +BARYDATAS="WS/log.barycentres" + +wc -l $BARYDATAS \ No newline at end of file diff --git a/BloubWorld/runme.sh b/BloubWorld/runme.sh index aded1af..2c28f4c 100755 --- a/BloubWorld/runme.sh +++ b/BloubWorld/runme.sh @@ -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 diff --git a/BloubWorld/scene.pov b/BloubWorld/scene.pov index e0e6866..fc870da 100644 --- a/BloubWorld/scene.pov +++ b/BloubWorld/scene.pov @@ -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 } + +// ---------------------------------------------------------- + #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 } +#declare XLAT = 0; +#declare YLAT = 0; +#declare ZLAT = 0; camera { location look_at right x*image_width/image_height - angle 86 + angle 64 } diff --git a/BloubWorld/toinc.awk b/BloubWorld/toinc.awk index a4c0ef1..2dea367 100644 --- a/BloubWorld/toinc.awk +++ b/BloubWorld/toinc.awk @@ -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"