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
path: root/source
diff options
context:
space:
mode:
authorDaniel Genrich <daniel.genrich@gmx.net>2009-10-08 14:18:14 +0400
committerDaniel Genrich <daniel.genrich@gmx.net>2009-10-08 14:18:14 +0400
commit14f62c132136ba8696cf204fb421ba4f10414a6a (patch)
tree9d9755adabded42deb5156e73ac9881c50a1e68a /source
parent8f154364f28d53c58b9a0022f8c36ab787477492 (diff)
Smoke:
* Enable external forces like e.g. wind
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/smoke.c58
-rw-r--r--source/blender/blenloader/intern/readfile.c7
-rw-r--r--source/blender/blenloader/intern/writefile.c3
-rw-r--r--source/blender/makesdna/DNA_smoke_types.h3
-rw-r--r--source/blender/makesrna/intern/rna_smoke.c5
5 files changed, 65 insertions, 11 deletions
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index f1fae4fa678..c1e79651c59 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -53,6 +53,7 @@
#include "BKE_cdderivedmesh.h"
#include "BKE_customdata.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_effect.h"
#include "BKE_modifier.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
@@ -547,6 +548,10 @@ static void smokeModifier_freeDomain(SmokeModifierData *smd)
if(smd->domain->wt)
smoke_turbulence_free(smd->domain->wt);
+ if(smd->domain->effector_weights)
+ MEM_freeN(smd->domain->effector_weights);
+ smd->domain->effector_weights = NULL;
+
BKE_ptcache_free_list(&(smd->domain->ptcaches[0]));
smd->domain->point_cache[0] = NULL;
BKE_ptcache_free_list(&(smd->domain->ptcaches[1]));
@@ -714,6 +719,7 @@ void smokeModifier_createType(struct SmokeModifierData *smd)
smd->domain->diss_speed = 5;
// init 3dview buffer
smd->domain->viewsettings = 0;
+ smd->domain->effector_weights = BKE_add_effector_weights(NULL);
}
else if(smd->type & MOD_SMOKE_TYPE_FLOW)
{
@@ -938,21 +944,53 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
}
// do effectors
- /*
- if(sds->eff_group)
{
- for(go = sds->eff_group->gobject.first; go; go = go->next)
+ ListBase *effectors = pdInitEffectors(scene, ob, NULL, sds->effector_weights);
+
+ if(effectors)
{
- if(go->ob)
- {
- if(ob->pd)
- {
-
- }
+ float *density = smoke_get_density(sds->fluid);
+ float *force_x = smoke_get_force_x(sds->fluid);
+ float *force_y = smoke_get_force_y(sds->fluid);
+ float *force_z = smoke_get_force_z(sds->fluid);
+ float *velocity_x = smoke_get_velocity_x(sds->fluid);
+ float *velocity_y = smoke_get_velocity_y(sds->fluid);
+ float *velocity_z = smoke_get_velocity_z(sds->fluid);
+ int x, y, z;
+
+ // precalculate wind forces
+ for(x = 0; x < sds->res[0]; x++)
+ for(y = 0; y < sds->res[1]; y++)
+ for(z = 0; z < sds->res[2]; z++)
+ {
+ EffectedPoint epoint;
+ float voxelCenter[3], vel[3], retvel[3];
+
+ unsigned int index = smoke_get_index(x, sds->res[0], y, sds->res[1], z);
+
+ if(density[index] < FLT_EPSILON)
+ continue;
+
+ vel[0] = velocity_x[index];
+ vel[1] = velocity_y[index];
+ vel[2] = velocity_z[index];
+
+ voxelCenter[0] = sds->p0[0] + sds->dx * x + sds->dx * 0.5;
+ voxelCenter[1] = sds->p0[1] + sds->dx * y + sds->dx * 0.5;
+ voxelCenter[2] = sds->p0[2] + sds->dx * z + sds->dx * 0.5;
+
+ pd_point_from_loc(scene, voxelCenter, vel, index, &epoint);
+ pdDoEffectors(effectors, NULL, sds->effector_weights, &epoint, retvel, NULL);
+
+ // TODO dg - do in force!
+ force_x[index] += MIN2(MAX2(-1.0, retvel[0] * 0.002), 1.0);
+ force_y[index] += MIN2(MAX2(-1.0, retvel[1] * 0.002), 1.0);
+ force_z[index] += MIN2(MAX2(-1.0, retvel[2] * 0.002), 1.0);
}
}
+
+ pdEndEffectors(&effectors);
}
- */
// do collisions
if(1)
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 989e2b3fa9e..a832cae161b 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3655,6 +3655,8 @@ static void lib_link_object(FileData *fd, Main *main)
smd->domain->coll_group = newlibadr_us(fd, ob->id.lib, smd->domain->coll_group);
smd->domain->eff_group = newlibadr_us(fd, ob->id.lib, smd->domain->eff_group);
smd->domain->fluid_group = newlibadr_us(fd, ob->id.lib, smd->domain->fluid_group);
+
+ smd->domain->effector_weights->group = newlibadr(fd, ob->id.lib, smd->domain->effector_weights->group);
}
}
@@ -3784,6 +3786,11 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
smd->domain->tex_shadow = NULL;
smd->domain->tex_wt = NULL;
+ if(smd->domain->effector_weights)
+ smd->domain->effector_weights = newdataadr(fd, smd->domain->effector_weights);
+ else
+ smd->domain->effector_weights = BKE_add_effector_weights(NULL);
+
direct_link_pointcache_list(fd, &(smd->domain->ptcaches[0]), &(smd->domain->point_cache[0]));
direct_link_pointcache_list(fd, &(smd->domain->ptcaches[1]), &(smd->domain->point_cache[1]));
}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index c92c0909d3b..25cbd4b65e7 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1153,7 +1153,10 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
SmokeModifierData *smd = (SmokeModifierData*) md;
if(smd->type & MOD_SMOKE_TYPE_DOMAIN)
+ {
writestruct(wd, DATA, "SmokeDomainSettings", 1, smd->domain);
+ writestruct(wd, DATA, "EffectorWeights", 1, smd->domain->effector_weights);
+ }
else if(smd->type & MOD_SMOKE_TYPE_FLOW)
writestruct(wd, DATA, "SmokeFlowSettings", 1, smd->flow);
else if(smd->type & MOD_SMOKE_TYPE_COLL)
diff --git a/source/blender/makesdna/DNA_smoke_types.h b/source/blender/makesdna/DNA_smoke_types.h
index 4e4714cdaa1..6cf308aa0ad 100644
--- a/source/blender/makesdna/DNA_smoke_types.h
+++ b/source/blender/makesdna/DNA_smoke_types.h
@@ -45,7 +45,7 @@ typedef struct SmokeDomainSettings {
struct SmokeModifierData *smd; /* for fast RNA access */
struct FLUID_3D *fluid;
struct Group *fluid_group;
- struct Group *eff_group; // effector group for e.g. wind force
+ struct Group *eff_group; // UNUSED
struct Group *coll_group; // collision objects group
struct WTURBULENCE *wt; // WTURBULENCE object, if active
struct GPUTexture *tex;
@@ -75,6 +75,7 @@ typedef struct SmokeDomainSettings {
int v3dnum;
struct PointCache *point_cache[2]; /* definition is in DNA_object_force.h */
struct ListBase ptcaches[2];
+ struct EffectorWeights *effector_weights;
} SmokeDomainSettings;
diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c
index 7bccd685c1d..c8193bb4005 100644
--- a/source/blender/makesrna/intern/rna_smoke.c
+++ b/source/blender/makesrna/intern/rna_smoke.c
@@ -220,6 +220,11 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "point_cache[1]");
RNA_def_property_ui_text(prop, "Point Cache", "");
+
+ prop= RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "EffectorWeights");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Effector Weights", "");
}
static void rna_def_smoke_flow_settings(BlenderRNA *brna)