Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Genrich <daniel.genrich@gmx.net>2008-07-07 18:36:33 +0400
committerDaniel Genrich <daniel.genrich@gmx.net>2008-07-07 18:36:33 +0400
commite409c2463d448fa79b86250b03ed7e07d09b067e (patch)
tree9c64080648af5de503e2ce9a313b6404d280f31a /source/blender
parentd3745d70a507bef4dfeadec2d8bd8947e5f3d6c4 (diff)
WIP commit to introduce channels
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/intern/ipo.c4
-rw-r--r--source/blender/makesdna/DNA_ipo_types.h9
-rw-r--r--source/blender/src/editipo.c33
-rw-r--r--source/blender/src/editipo_lib.c2
-rw-r--r--source/blender/src/fluidsim.c64
5 files changed, 95 insertions, 17 deletions
diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c
index 59eb3837aab..f4a500da9a3 100644
--- a/source/blender/blenkernel/intern/ipo.c
+++ b/source/blender/blenkernel/intern/ipo.c
@@ -175,7 +175,9 @@ int fluidsim_ar[FLUIDSIM_TOTIPO]= {
FLUIDSIM_VISC, FLUIDSIM_TIME,
FLUIDSIM_GRAV_X , FLUIDSIM_GRAV_Y , FLUIDSIM_GRAV_Z ,
FLUIDSIM_VEL_X , FLUIDSIM_VEL_Y , FLUIDSIM_VEL_Z ,
- FLUIDSIM_ACTIVE
+ FLUIDSIM_ACTIVE,
+ FLUIDSIM_ATTR_FORCE_STR, FLUIDSIM_ATTR_FORCE_RADIUS,
+ FLUIDSIM_VEL_FORCE_STR, FLUIDSIM_VEL_FORCE_RADIUS,
};
int part_ar[PART_TOTIPO]= {
diff --git a/source/blender/makesdna/DNA_ipo_types.h b/source/blender/makesdna/DNA_ipo_types.h
index 3954a500dc7..09f4509df80 100644
--- a/source/blender/makesdna/DNA_ipo_types.h
+++ b/source/blender/makesdna/DNA_ipo_types.h
@@ -336,8 +336,8 @@ typedef short IPO_Channel;
/* ******************** */
/* fluidsim ipos NT */
-#define FLUIDSIM_TOTIPO 9
-#define FLUIDSIM_TOTNAM 9
+#define FLUIDSIM_TOTIPO 13
+#define FLUIDSIM_TOTNAM 13
#define FLUIDSIM_VISC 1
#define FLUIDSIM_TIME 2
@@ -352,6 +352,11 @@ typedef short IPO_Channel;
#define FLUIDSIM_ACTIVE 9
+#define FLUIDSIM_ATTR_FORCE_STR 10
+#define FLUIDSIM_ATTR_FORCE_RADIUS 11
+#define FLUIDSIM_VEL_FORCE_STR 12
+#define FLUIDSIM_VEL_FORCE_RADIUS 13
+
/* ******************** */
/* particle ipos */
#define PART_TOTIPO 19
diff --git a/source/blender/src/editipo.c b/source/blender/src/editipo.c
index c5dd41e16d5..22bcad06424 100644
--- a/source/blender/src/editipo.c
+++ b/source/blender/src/editipo.c
@@ -489,19 +489,40 @@ static void make_part_editipo(SpaceIpo *si)
}
// copied from make_seq_editipo
-static void make_fluidsim_editipo(SpaceIpo *si) // NT
+static void make_fluidsim_editipo(SpaceIpo *si, Object *ob) // NT
{
EditIpo *ei;
int a;
char *name;
- ei= si->editipo= MEM_callocN(FLUIDSIM_TOTIPO*sizeof(EditIpo), "fluidsim_editipo");
- si->totipo = FLUIDSIM_TOTIPO;
- for(a=0; a<FLUIDSIM_TOTIPO; a++) {
+ FluidsimSettings *fss= ob->fluidsimSettings;
+ int numipos = FLUIDSIM_TOTIPO;
+ int ipo_start_index = 0;
+
+ // we don't need all fluid ipos for all types! - dg
+ if(fss->type == OB_FLUIDSIM_CONTROL)
+ {
+ numipos = 4; // there are 4 fluid control ipos
+ ipo_start_index = 9;
+
+ }
+ else if(fss->type == OB_FLUIDSIM_DOMAIN)
+ {
+ numipos = 5; // there are 5 ipos for fluid domains
+ }
+ else
+ {
+ numipos = 4; // there are 4 for the rest
+ ipo_start_index = 5;
+ }
+
+ ei= si->editipo= MEM_callocN(numipos*sizeof(EditIpo), "fluidsim_editipo");
+ si->totipo = numipos;
+ for(a=ipo_start_index; a<numipos; a++) {
//fprintf(stderr,"FSINAME %d %d \n",a,fluidsim_ar[a], (int)(getname_fluidsim_ei(fluidsim_ar[a])) );
name = getname_fluidsim_ei(fluidsim_ar[a]);
strcpy(ei->name, name);
ei->adrcode= fluidsim_ar[a];
- ei->col= ipo_rainbow(a, FLUIDSIM_TOTIPO);
+ ei->col= ipo_rainbow(a, numipos);
ei->icu= find_ipocurve(si->ipo, ei->adrcode);
if(ei->icu) {
ei->flag = ei->icu->flag;
@@ -962,7 +983,7 @@ static void make_editipo(void)
else if(G.sipo->blocktype==ID_FLUIDSIM) {
if (ob) { // NT
ob->ipowin= ID_FLUIDSIM;
- make_fluidsim_editipo(G.sipo);
+ make_fluidsim_editipo(G.sipo, ob);
}
}
else if(G.sipo->blocktype==ID_PA) {
diff --git a/source/blender/src/editipo_lib.c b/source/blender/src/editipo_lib.c
index 41044ad13d7..042a59c3446 100644
--- a/source/blender/src/editipo_lib.c
+++ b/source/blender/src/editipo_lib.c
@@ -100,7 +100,7 @@ char *snd_ic_names[SND_TOTNAM] = { "Vol", "Pitch", "Pan", "Atten" };
char *ac_ic_names[AC_TOTNAM] = {"LocX", "LocY", "LocZ", "ScaleX", "ScaleY",
"ScaleZ", "QuatW", "QuatX", "QuatY", "QuatZ"};
char *ic_name_empty[1] ={ "" };
-char *fluidsim_ic_names[FLUIDSIM_TOTNAM] = { "Fac-Visc", "Fac-Time", "GravX","GravY","GravZ", "VelX","VelY","VelZ", "Active" };
+char *fluidsim_ic_names[FLUIDSIM_TOTNAM] = { "Fac-Visc", "Fac-Time", "GravX","GravY","GravZ", "VelX","VelY","VelZ", "Active", "AttrForceStr", "AttrForceRad", "VelForceStr", "VelForceRad" };
char *part_ic_names[PART_TOTNAM] = { "E_Freq", "E_Life", "E_Speed", "E_Angular", "E_Size",
"Angular", "Size", "Drag", "Brown", "Damp", "Length", "Clump",
"GravX", "GravY", "GravZ", "KinkAmp", "KinkFreq", "KinkShape", "BBTilt"};
diff --git a/source/blender/src/fluidsim.c b/source/blender/src/fluidsim.c
index 7298c767e45..3bc1ac42a33 100644
--- a/source/blender/src/fluidsim.c
+++ b/source/blender/src/fluidsim.c
@@ -314,6 +314,10 @@ void fluidsimGetGeometryObjFilename(struct Object *ob, char *dst) { //, char *sr
FS_FREE_ONECHANNEL(channelObjMove[i][2],"channelObjMove2"); \
FS_FREE_ONECHANNEL(channelObjInivel[i],"channelObjInivel"); \
FS_FREE_ONECHANNEL(channelObjActive[i],"channelObjActive"); \
+ FS_FREE_ONECHANNEL(channelAttractforceStrength[i],"channelAttractforceStrength"); \
+ FS_FREE_ONECHANNEL(channelAttractforceRadius[i],"channelAttractforceRadius"); \
+ FS_FREE_ONECHANNEL(channelVelocityforceStrength[i],"channelVelocityforceStrength"); \
+ FS_FREE_ONECHANNEL(channelVelocityforceRadius[i],"channelVelocityforceRadius"); \
} \
} // end FS FREE CHANNELS
@@ -532,6 +536,12 @@ void fluidsimBake(struct Object *ob)
float *channelObjInivel[256]; // initial velocities
float *channelObjActive[256]; // obj active channel
+ /* fluid control channels */
+ float *channelAttractforceStrength[256];
+ float *channelAttractforceRadius[256];
+ float *channelVelocityforceStrength[256];
+ float *channelVelocityforceRadius[256];
+
if(getenv(strEnvName)) {
int dlevel = atoi(getenv(strEnvName));
elbeemSetDebugLevel(dlevel);
@@ -716,6 +726,10 @@ void fluidsimBake(struct Object *ob)
channelObjMove[i][0] = channelObjMove[i][1] = channelObjMove[i][2] = NULL;
channelObjInivel[i] = NULL;
channelObjActive[i] = NULL;
+ channelAttractforceStrength[i] = NULL;
+ channelAttractforceRadius[i] = NULL;
+ channelVelocityforceStrength[i] = NULL;
+ channelVelocityforceRadius[i] = NULL;
}
allchannelSize = G.scene->r.efra; // always use till last frame
aniFrameTime = (domainSettings->animEnd - domainSettings->animStart)/(double)noFrames;
@@ -880,9 +894,32 @@ void fluidsimBake(struct Object *ob)
channelObjMove[o][j][(i-1)*4 + 3] = timeAtFrame[i];
}
}
-
+
+ {
+ int attrFSIcu[1] = { FLUIDSIM_ATTR_FORCE_STR };
+ int attrFRIcu[1] = { FLUIDSIM_ATTR_FORCE_RADIUS };
+ int velFSIcu[1] = { FLUIDSIM_VEL_FORCE_STR };
+ int velFRIcu[1] = { FLUIDSIM_VEL_FORCE_RADIUS };
+
+ float attrFSDefs[1];
+ float attrFRDefs[1];
+ float velFSDefs[1];
+ float velFRDefs[1];
+
+ attrFSDefs[0] = obit->fluidsimSettings->attractforceStrength;
+ attrFRDefs[0] = obit->fluidsimSettings->attractforceRadius;
+ velFSDefs[0] = obit->fluidsimSettings->velocityforceStrength;
+ velFRDefs[0] = obit->fluidsimSettings->velocityforceRadius;
+
+ fluidsimInitChannel( &channelAttractforceStrength[o], allchannelSize, timeAtFrame, attrFSIcu,attrFSDefs, obit->fluidsimSettings->ipo, CHANNEL_FLOAT );
+ fluidsimInitChannel( &channelAttractforceRadius[o], allchannelSize, timeAtFrame, attrFRIcu,attrFRDefs, obit->fluidsimSettings->ipo, CHANNEL_FLOAT );
+ fluidsimInitChannel( &channelVelocityforceStrength[o], allchannelSize, timeAtFrame, velFSIcu,velFSDefs, obit->fluidsimSettings->ipo, CHANNEL_FLOAT );
+ fluidsimInitChannel( &channelVelocityforceRadius[o], allchannelSize, timeAtFrame, velFRIcu,velFRDefs, obit->fluidsimSettings->ipo, CHANNEL_FLOAT );
+ }
+
fluidsimInitChannel( &channelObjInivel[o], allchannelSize, timeAtFrame, inivelIcu,inivelDefs, obit->fluidsimSettings->ipo, CHANNEL_VEC );
fluidsimInitChannel( &channelObjActive[o], allchannelSize, timeAtFrame, activeIcu,activeDefs, obit->fluidsimSettings->ipo, CHANNEL_FLOAT );
+
channelObjCount++;
@@ -1028,7 +1065,7 @@ void fluidsimBake(struct Object *ob)
fsmesh.obstaclePartslip = obit->fluidsimSettings->partSlipValue;
fsmesh.volumeInitType = obit->fluidsimSettings->volumeInitType;
fsmesh.obstacleImpactFactor = obit->fluidsimSettings->surfaceSmoothing; // misused value
- /*
+
if(fsmesh.type == OB_FLUIDSIM_CONTROL)
{
// control fluids will get exported as whole
@@ -1037,11 +1074,24 @@ void fluidsimBake(struct Object *ob)
fsmesh.cpsTimeStart = obit->fluidsimSettings->cpsTimeStart;
fsmesh.cpsTimeEnd = obit->fluidsimSettings->cpsTimeEnd;
- fsmesh.attractforceStrength = obit->fluidsimSettings->attractforceStrength;
- fsmesh.attractforceRadius = obit->fluidsimSettings->attractforceRadius;
- fsmesh.velocityforceStrength = obit->fluidsimSettings->velocityforceStrength;
- fsmesh.velocityforceRadius = obit->fluidsimSettings->velocityforceRadius;
- }*/
+ fsmesh.channelSizeAttractforceRadius =
+ fsmesh.channelSizeVelocityforceStrength =
+ fsmesh.channelSizeVelocityforceRadius =
+ fsmesh.channelSizeAttractforceStrength = allchannelSize;
+
+ fsmesh.channelAttractforceRadius = channelAttractforceStrength[o];
+ fsmesh.channelAttractforceRadius = channelAttractforceRadius[o];
+ fsmesh.channelVelocityforceStrength = channelVelocityforceStrength[o];
+ fsmesh.channelVelocityforceRadius = channelVelocityforceRadius[o];
+ }
+ else
+ {
+ // set channels to 0
+ fsmesh.channelAttractforceStrength =
+ fsmesh.channelAttractforceRadius =
+ fsmesh.channelVelocityforceStrength =
+ fsmesh.channelVelocityforceRadius = NULL;
+ }
// animated meshes
if(deform) {