Compare commits
No commits in common. "cfc8ea6b63c0bfcef96a4f48fae3af95c5de1968" and "355d61df23ff45b0f7046bf026af15c82eefea4f" have entirely different histories.
cfc8ea6b63
...
355d61df23
3
BloubWorld/.gitignore
vendored
3
BloubWorld/.gitignore
vendored
@ -5,7 +5,6 @@ nbimg.inc
|
||||
*.gif
|
||||
*.blbs
|
||||
*.mp4
|
||||
*.lst
|
||||
frames/*
|
||||
log.*
|
||||
|
||||
@ -13,6 +12,4 @@ exportbloubs
|
||||
genbloubs
|
||||
movebloubs
|
||||
mergebloubs
|
||||
essai
|
||||
|
||||
core
|
||||
|
@ -2,34 +2,25 @@
|
||||
|
||||
all: genbloubs movebloubs exportbloubs mergebloubs
|
||||
|
||||
# ------------------------------------------------------------
|
||||
|
||||
GFOPT = -Wall -Wextra -g -time
|
||||
OBJS = bloubspace.o povstuff.o mathstuff.o
|
||||
|
||||
# ------------------------------------------------------------
|
||||
|
||||
essai: essai.f90 Makefile mathstuff.o
|
||||
gfortran $(GFOPT) $< mathstuff.o -o $@
|
||||
|
||||
# ------------------------------------------------------------
|
||||
|
||||
initial.blbs: genbloubs Makefile
|
||||
./genbloubs $@ 1000
|
||||
|
||||
in.blbs: genbloubs Makefile
|
||||
./genbloubs $@ 30000
|
||||
./genbloubs $@ 300
|
||||
|
||||
out.blbs: in.blbs mergebloubs Makefile
|
||||
./mergebloubs $< $@
|
||||
|
||||
out.lst: out.blbs exportbloubs Makefile
|
||||
./exportbloubs $< > $@
|
||||
|
||||
# ------------------------------------------------------------
|
||||
|
||||
bloubspace.o: bloubspace.f90 Makefile
|
||||
gfortran $(GFOPT) -pg -c $<
|
||||
gfortran $(GFOPT) -c $<
|
||||
|
||||
povstuff.o: povstuff.f90 Makefile
|
||||
gfortran $(GFOPT) -c $<
|
||||
|
@ -5,7 +5,7 @@ C'est quoi ?
|
||||
Le BloubWorld (que l'on appelle aussi BloubSpace) est un espace borné
|
||||
dans lequel se déplacent des **bloubs**, lesquels sont
|
||||
des sortes de particule
|
||||
munie de certaines propriétés (age, grosseur, vitesses, etc...).
|
||||
munie de certaines propriétés.
|
||||
Lesquelles évoluent en fonction du temps.
|
||||
|
||||
## Description d'un bloub
|
||||
@ -18,60 +18,17 @@ Lesquelles évoluent en fonction du temps.
|
||||
real :: px, py, pz
|
||||
real :: vx, vy, vz
|
||||
real :: radius
|
||||
integer :: age
|
||||
integer :: seq
|
||||
end type t_bloubs
|
||||
```
|
||||
|
||||
C'est simple, en fait. Le plus compliqué, c'est de savoir quoi en faire.
|
||||
|
||||
On peut en fabriquer des gazillions, et ensuite
|
||||
les lacher dans un espace clôt, avec des parois
|
||||
rebondissantes. Chaque choc va un peu les user, et au bout d'un moment,
|
||||
ils vont mourir. C'est comme ça.
|
||||
|
||||
## Comment ça fonctionne ?
|
||||
|
||||
Pas trop mal pour un premier jet. Il suffit de lire
|
||||
le script `runme.sh` pour avoir une idée de l'enchainement
|
||||
des opérations. Lequel enchainement est décrit plus bas.
|
||||
|
||||
## Les logiciels
|
||||
|
||||
Pour le moment, l'ensemble des opérations est gérée par un script shell
|
||||
qui enchaine des opérations plus élémentaires. Oui, je sais, ce n'est
|
||||
pas optimal, mais c'est un cadre idéal pour les bricolages hasardeux.
|
||||
|
||||
Ces opérations agissent sur des fichiers de type `.blsb` qui sont,
|
||||
vu du fortran, des dumps séquentiels du type t_bloubs. Un format
|
||||
de fichier qui va être modifié assez souvent, ne gardez pas d'archives.
|
||||
|
||||
### genbloubs
|
||||
|
||||
Fabrication d'une population de bloubs plus ou moins aléatoires.
|
||||
Deux paramètres : le nom du fichier et le nombre de bloubs.
|
||||
Les règles de génération devraient être paramétrables.
|
||||
|
||||
### movebloubs
|
||||
|
||||
Le cœur actif du système : c'est lui qui, à chaque tick, va déplacer
|
||||
les bloubs, gérer les rebonds avec la boudary-box, éliminer les
|
||||
bloubs usés par les chocs, et faire naitre de nouveaux bloubs
|
||||
si le besoin s'en fait sentir.
|
||||
|
||||
Seul problème, il n'a pas de notion directe du temps, parce qu'il est
|
||||
juste de passage dans un pipeline.
|
||||
|
||||
### exportbloubs
|
||||
|
||||
Sortie sur `stdout` de certaines propriétes des bloubs, qui seront
|
||||
reprise par un (ou des) scripts écrits en `awk`, afin de générer
|
||||
ce qu'il faut pour les différents moteurs de rendu.
|
||||
|
||||
Bon, pour le moment, il n'y a que POVray :)
|
||||
|
||||
### mergebloubs
|
||||
|
||||
Alors, celui-ci, il n'est pas vraiment au point.
|
||||
des opérations.
|
||||
|
||||
## TODO
|
||||
|
||||
|
@ -88,10 +88,10 @@ module bloubspace
|
||||
blb%py = 0.0
|
||||
blb%age = blb%age + 1
|
||||
endif
|
||||
if (4.99 .lt. blb%py) then !!
|
||||
if (5.0 .lt. blb%py) then
|
||||
blb%vy = -1.0 * blb%vy
|
||||
blb%age = blb%age + 1
|
||||
blb%py = 4.99 !!
|
||||
blb%py = 5.0
|
||||
endif
|
||||
|
||||
if (5.0 .lt. blb%pz) then
|
||||
|
@ -1,19 +0,0 @@
|
||||
program essai
|
||||
|
||||
use mathstuff
|
||||
implicit none
|
||||
|
||||
integer :: foo
|
||||
real :: quux
|
||||
double precision :: somme
|
||||
|
||||
call init_random_seed()
|
||||
somme = 0.0
|
||||
|
||||
do foo=1, 200000
|
||||
quux = rand()
|
||||
somme = somme + quux
|
||||
print *, foo, quux, somme/foo
|
||||
enddo
|
||||
|
||||
end program
|
@ -32,7 +32,7 @@ program genbloubs
|
||||
if (0 .ne. errcode) then
|
||||
exit
|
||||
endif
|
||||
print *, bloub%px, bloub%py, bloub%pz, bloub%radius, bloub%age
|
||||
print *, bloub%px, bloub%py, bloub%pz, bloub%radius
|
||||
compte = compte + 1
|
||||
enddo
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
module mathstuff
|
||||
|
||||
implicit none
|
||||
|
||||
contains
|
||||
|
||||
! ----------------------------------------------------------------
|
||||
@ -12,8 +13,8 @@ module mathstuff
|
||||
integer t3
|
||||
|
||||
call itime(tarray)
|
||||
t3 = 3600*tarray(1) + 60*tarray(2) + tarray(3)
|
||||
write(0, '(A,3I3,A,I6)') "sranding: ", tarray, " --> ", t3
|
||||
t3 = 200*tarray(1) + 20*tarray(2) + tarray(3)
|
||||
print *, tarray, ' --> ', t3
|
||||
call srand(t3)
|
||||
|
||||
end subroutine
|
||||
|
@ -70,11 +70,6 @@ program mergebloubs
|
||||
do ! infinite loop
|
||||
|
||||
print *, "============ PASS ", idx
|
||||
if (idx .EQ. NB_MAX_BLOUBS) then
|
||||
write(0, '(I8, A)') idx, " max number of bloubs reached"
|
||||
exit
|
||||
endif
|
||||
|
||||
! read the next bloub from input file
|
||||
read (unit=inu, iostat=errcode) bloub
|
||||
if (0 .ne. errcode) then
|
||||
@ -94,7 +89,9 @@ program mergebloubs
|
||||
! call display_bloub(les_bloubs(i), "DEAD ? WTF ?")
|
||||
cycle
|
||||
endif
|
||||
|
||||
rval = distance_of_bloubs(les_bloubs(i), bloub)
|
||||
|
||||
if (rval .LT. (les_bloubs(i)%radius + bloub%radius)) then
|
||||
print *, "contact : ", i, idx, rval
|
||||
call merge_two_bloubs(les_bloubs(i), bloub, newbloub)
|
||||
@ -102,21 +99,16 @@ program mergebloubs
|
||||
nbr_merge = nbr_merge + 1
|
||||
merged = .TRUE.
|
||||
endif
|
||||
enddo
|
||||
|
||||
enddo
|
||||
if (merged) then
|
||||
! put new bloub in the list
|
||||
les_bloubs(idx) = newbloub
|
||||
bloub = newbloub
|
||||
else
|
||||
! put old bloub in the list
|
||||
les_bloubs(idx) = bloub
|
||||
endif
|
||||
|
||||
write(outu, iostat=errcode) bloub ! no error control ?
|
||||
if (0 .ne. errcode) then
|
||||
STOP " : WRITE ERROR TO " // trim(outfile)
|
||||
endif
|
||||
|
||||
idx = idx + 1
|
||||
|
||||
! print *, "idx = ", idx
|
||||
|
@ -54,7 +54,7 @@ program movebloubs
|
||||
endif
|
||||
|
||||
! moving and boundingboxing
|
||||
call move_bloub (bloub, 0.14)
|
||||
call move_bloub (bloub, 0.15)
|
||||
call bound_a_blob (bloub)
|
||||
call green_soylent (bloub)
|
||||
if (.NOT. bloub%alive) then
|
||||
@ -78,10 +78,10 @@ program movebloubs
|
||||
! ok, we have read all the bloubs in the input file
|
||||
|
||||
! insert some fancy conditional here
|
||||
if (compteur .LT. 1600) then
|
||||
if (rand() .LT. 0.05) then
|
||||
call add_more_bloubs(outu, 8, 0.052)
|
||||
endif
|
||||
if (compteur .LT. 1500) then
|
||||
|
||||
call add_more_bloubs(outu, 8, 0.075)
|
||||
|
||||
endif
|
||||
|
||||
close(inu) ; close(outu)
|
||||
@ -104,15 +104,13 @@ contains
|
||||
type(t_bloubs) :: bloub
|
||||
integer :: foo
|
||||
|
||||
write(0, '(A,I4,1X,A)') "adding", nbre, "bloubs"
|
||||
|
||||
do foo=1, nbre
|
||||
|
||||
bloub%nick = 'newbie '
|
||||
bloub%alive = .TRUE.
|
||||
call random_pv(bloub)
|
||||
bloub%radius = wtf
|
||||
bloub%age = 1
|
||||
bloub%alive = .TRUE.
|
||||
bloub%age = foo
|
||||
! call display_bloub (bloub, "new bloub")
|
||||
write(un) bloub ! no error control ?
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
INCFILE="bloubs.inc"
|
||||
TMPPNG="/dev/shm/bloubs7.png"
|
||||
POVOPT="+Q9 +a -v -d -W960 -H640 -WT2"
|
||||
POVOPT="+Q5 -a -v -d -W920 -H600 -WT2"
|
||||
DDIR="frames"
|
||||
LOGERR="log.error"
|
||||
|
||||
@ -15,7 +15,7 @@ LOGERR="log.error"
|
||||
BLBS_IN="/dev/shm/in.blbs"
|
||||
BLBS_OUT="/dev/shm/out.blbs"
|
||||
|
||||
NBIMG=1200
|
||||
NBIMG=600
|
||||
|
||||
make all
|
||||
err=$?
|
||||
@ -67,7 +67,7 @@ do
|
||||
mv ${BLBS_OUT} ${BLBS_IN}
|
||||
echo
|
||||
|
||||
sleep 9
|
||||
sleep 33
|
||||
|
||||
done
|
||||
|
||||
|
@ -21,7 +21,10 @@ global_settings {
|
||||
|
||||
object {
|
||||
Bloubs
|
||||
finish { phong 0.33 specular 0.95 }
|
||||
texture {
|
||||
pigment { color Gray60 }
|
||||
finish { phong 0.58 specular 0.45 }
|
||||
}
|
||||
}
|
||||
|
||||
plane {
|
||||
@ -36,7 +39,7 @@ plane {
|
||||
|
||||
#declare BH = 5; // H = taille en horizontal
|
||||
#declare BV = 5; // V = taille en vertical
|
||||
#declare BR = 0.035;
|
||||
#declare BR = 0.028;
|
||||
|
||||
#declare Une_Borne = object
|
||||
{
|
||||
@ -46,24 +49,21 @@ merge {
|
||||
}
|
||||
}
|
||||
|
||||
#declare Un_Cadre = object
|
||||
#declare Cadre_Haut = object
|
||||
{
|
||||
merge {
|
||||
#local Ruc = BR * 0.78;
|
||||
cylinder { <-BH, 0, -BH>, <-BH, 0, BH>, Ruc }
|
||||
cylinder { <-BH, 0, -BH>, <-BH, 0, BH>, BR }
|
||||
cylinder { < BH, 0, -BH>, < BH, 0, BH>, BR }
|
||||
cylinder { < BH, 0, -BH>, <-BH, 0, -BH>, BR }
|
||||
cylinder { < BH, 0, BH>, <-BH, 0, BH>, Ruc }
|
||||
cylinder { < BH, 0, BH>, <-BH, 0, BH>, BR }
|
||||
}
|
||||
pigment { color Gray40 }
|
||||
pigment { color Gray50 }
|
||||
}
|
||||
|
||||
#declare Les_Bornes = object
|
||||
{
|
||||
union {
|
||||
#local E = 0.02;
|
||||
object { Un_Cadre translate y*(BV-E) }
|
||||
object { Un_Cadre translate y*E }
|
||||
object { Cadre_Haut translate y*(BV-0.05) }
|
||||
|
||||
object { Une_Borne translate <-BH, 0, -BH> pigment { color Blue } }
|
||||
object { Une_Borne translate < BH, 0, -BH> pigment { color Green } }
|
||||
@ -75,41 +75,19 @@ union {
|
||||
object { Les_Bornes }
|
||||
|
||||
// ----------------------------------------------------------
|
||||
#local D = 0.016;
|
||||
|
||||
#declare Fleche = object
|
||||
{
|
||||
merge {
|
||||
sphere { <-0.05, 0, 0>, D }
|
||||
cylinder { <1, 0, 0>, <-0.05, 0, 0>, D }
|
||||
cone { <1, 0, 0>, D*3.1, <1.10, 0, 0>, 0.0001 }
|
||||
}
|
||||
}
|
||||
#declare Repere = object
|
||||
{
|
||||
union {
|
||||
object { Fleche pigment { color Red }}
|
||||
object { Fleche rotate z*90 pigment { color Green }}
|
||||
object { Fleche rotate y*270 pigment { color Blue }}
|
||||
}
|
||||
}
|
||||
// ----------------------------------------------------------
|
||||
|
||||
// object { Repere scale 2+(1.9*NormClock) translate y*2.5 }
|
||||
|
||||
light_source { <9, 22, -17> color Gray80 }
|
||||
light_source { <11, 19, 9> color Gray60 }
|
||||
|
||||
#declare XCAM = 8 -( NormClock*3 );
|
||||
#declare YCAM = 5 + (11 * NormClock);
|
||||
#declare HCAM = 5 + (11 * NormClock);
|
||||
|
||||
#fopen LC "log.camera" append
|
||||
#write (LC, clock, " ", NormClock, " ", YCAM, "\n")
|
||||
#write (LC, clock, " ", NormClock, " ", HCAM, "\n")
|
||||
#fclose LC
|
||||
|
||||
camera {
|
||||
location <XCAM, YCAM, -16>
|
||||
location <7, HCAM, -16>
|
||||
look_at <0, 1, 0>
|
||||
right x*image_width/image_height
|
||||
angle 48
|
||||
angle 50
|
||||
}
|
||||
|
@ -11,12 +11,8 @@ BEGIN {
|
||||
}
|
||||
|
||||
{
|
||||
if ($5 > 4) color = "Magenta"
|
||||
else color = "Cyan"
|
||||
|
||||
pigment = "pigment { color " color " }"
|
||||
printf "\t\tsphere { <%f, %f, %f>, %f %s }\n", \
|
||||
$1, $2, $3, $4, pigment
|
||||
printf "\t\tsphere { <%f, %f, %f>, %f }\n", \
|
||||
$1, $2, $3, $4
|
||||
count++
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user