Revision: 48274
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48274
Author:   miikah
Date:     2012-06-25 16:32:26 +0000 (Mon, 25 Jun 2012)
Log Message:
-----------
* Added "map to bounds" option also for "Object" coordinates.
* Fix: smoke viewport shading and force fields now work properly for 
rotated/moved domains again.
* Fix: first frame was initialized with maximum resolution even when using 
adaptive domain.
* Some code cleanup.

Modified Paths:
--------------
    
branches/soc-2012-fried_chicken/release/scripts/startup/bl_ui/properties_texture.py
    branches/soc-2012-fried_chicken/source/blender/blenkernel/intern/smoke.c
    branches/soc-2012-fried_chicken/source/blender/makesdna/DNA_smoke_types.h
    
branches/soc-2012-fried_chicken/source/blender/render/intern/source/render_texture.c

Modified: 
branches/soc-2012-fried_chicken/release/scripts/startup/bl_ui/properties_texture.py
===================================================================
--- 
branches/soc-2012-fried_chicken/release/scripts/startup/bl_ui/properties_texture.py
 2012-06-25 14:38:19 UTC (rev 48273)
+++ 
branches/soc-2012-fried_chicken/release/scripts/startup/bl_ui/properties_texture.py
 2012-06-25 16:32:26 UTC (rev 48274)
@@ -874,6 +874,8 @@
                         col.prop(tex, "use_map_to_bounds")
                 elif tex.texture_coords == 'OBJECT':
                     col.prop(tex, "use_from_original")
+                    if (idblock.type == 'VOLUME'):
+                        col.prop(tex, "use_map_to_bounds")
                 else:
                     col.label()
 

Modified: 
branches/soc-2012-fried_chicken/source/blender/blenkernel/intern/smoke.c
===================================================================
--- branches/soc-2012-fried_chicken/source/blender/blenkernel/intern/smoke.c    
2012-06-25 14:38:19 UTC (rev 48273)
+++ branches/soc-2012-fried_chicken/source/blender/blenkernel/intern/smoke.c    
2012-06-25 16:32:26 UTC (rev 48274)
@@ -139,10 +139,6 @@
 #define ADD_IF_LOWER_NEG(a,b) (MAX2((a)+(b), MIN2((a),(b))))
 #define ADD_IF_LOWER(a,b) 
(((b)>0)?ADD_IF_LOWER_POS((a),(b)):ADD_IF_LOWER_NEG((a),(b)))
 
-/* forward declerations */
-static void get_cell(float *p0, int res[3], float dx, float *pos, int *cell, 
int correct);
-static void get_cell_global(float p0[3], float imat[4][4], int res[3], float 
cell_size[3], float pos[3], int *cell, int correct);
-
 #else /* WITH_SMOKE */
 
 /* Stubs to use when smoke is disabled */
@@ -272,6 +268,7 @@
        if((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain && 
!smd->domain->fluid)
        {
                SmokeDomainSettings *sds = smd->domain;
+               int res[3];
                /* set domain dimensions from derivedmesh */
                smoke_set_domain_from_derivedmesh(sds, ob, dm);
                /* reset domain values */
@@ -282,10 +279,16 @@
                mul_m4_v3(ob->obmat, sds->prev_loc);
 
                /* set resolutions */
-               VECCOPY(sds->res, sds->base_res);
+               if (smd->domain->flags & MOD_SMOKE_ADAPTIVE_DOMAIN) {
+                       res[0] = res[1] = res[2] = 1; /* use minimum res for 
adaptive init */
+               }
+               else {
+                       VECCOPY(res, sds->base_res);
+               }
+               VECCOPY(sds->res, res);
                sds->total_cells = sds->res[0]*sds->res[1]*sds->res[2];
                sds->res_min[0] = sds->res_min[1] = sds->res_min[2] = 0;
-               VECCOPY(sds->res_max, sds->base_res);
+               VECCOPY(sds->res_max, res);
 
                /* allocate fluid */
                smoke_reallocate_fluid(sds, sds->dx, sds->res, 0);
@@ -355,14 +358,6 @@
 {
        if(smd->flow)
        {
-/*
-               if(smd->flow->bvh)
-               {
-                       free_bvhtree_from_mesh(smd->flow->bvh);
-                       MEM_freeN(smd->flow->bvh);
-               }
-               smd->flow->bvh = NULL;
-*/
                if (smd->flow->dm) smd->flow->dm->release(smd->flow->dm);
                if (smd->flow->verts_old) MEM_freeN(smd->flow->verts_old);
                MEM_freeN(smd->flow);
@@ -423,19 +418,9 @@
 
                        smd->time = -1;
                        smd->domain->total_cells = 0;
-
-                       // printf("reset domain end\n");
                }
                else if(smd->flow)
                {
-                       /*
-                       if(smd->flow->bvh)
-                       {
-                               free_bvhtree_from_mesh(smd->flow->bvh);
-                               MEM_freeN(smd->flow->bvh);
-                       }
-                       smd->flow->bvh = NULL;
-                       */
                }
                else if(smd->coll)
                {
@@ -613,7 +598,7 @@
 #ifdef WITH_SMOKE
 
 // forward decleration
-static void smoke_calc_transparency(float *result, float *input, float *p0, 
float *p1, int res[3], float dx, float *light, bresenham_callback cb, float 
correct);
+static void smoke_calc_transparency(SmokeDomainSettings *sds, Scene *scene);
 static float calc_voxel_transp(float *result, float *input, int res[3], int 
*pixel, float *tRay, float correct);
 
 static int get_lamp(Scene *scene, float *light)
@@ -1285,8 +1270,6 @@
        /* calculate new bounds based on these values */
        clampBoundsInDomain(sds, min, max, min_vel, max_vel, 
sds->adapt_margin+1, dt);
 
-       printf("content boundaries : (%i,%i) (%i,%i) (%i,%i)\n new shift : 
(%i,%i,%i)", min[0], max[0], min[1], max[1], min[2], max[2], new_shift[0], 
new_shift[1], new_shift[2]);
-
        for (i=0; i<3; i++) {
                /* calculate new resolution */
                res[i] = max[i] - min[i];
@@ -1412,8 +1395,6 @@
                VECCOPY(sds->res_max, max);
                VECCOPY(sds->res, res);
                sds->total_cells = total_cells;
-
-               printf("domain res changed to %i, %i, %i\n", res[0], res[1], 
res[2]);
        }
 }
 
@@ -1482,18 +1463,13 @@
                        else {
                                emit_from_derivedmesh(collob, sds, sfs, em, dt);
                        }
-               } // end emission
+               }
        }
 
-       tstart();
-
        /* Adjust domain size if needed */
        if (sds->flags & MOD_SMOKE_ADAPTIVE_DOMAIN)
                adjustDomainResolution(sds, new_shift, emaps, numflowobj, dt);
 
-       tend();
-       //printf ("Domain scaling time: %f\n\n", ( float ) tval());
-
        /* Apply emission data */
        if (sds->fluid) {
                for(flowIndex = 0; flowIndex < numflowobj; flowIndex++)
@@ -1688,7 +1664,6 @@
                                                                                
        }
                                                                                
} // hires loop
                                                        }  // bigdensity
-
                                                } // low res loop
 
                                // free emission maps
@@ -1726,6 +1701,7 @@
                                for(z = 0; z < sds->res[2]; z++)
                {       
                        EffectedPoint epoint;
+                       float mag;
                        float voxelCenter[3] = {0,0,0}, vel[3] = {0,0,0}, 
retvel[3] = {0,0,0};
                        unsigned int index = smoke_get_index(x, sds->res[0], y, 
sds->res[1], z);
 
@@ -1736,13 +1712,26 @@
                        vel[1] = velocity_y[index];
                        vel[2] = velocity_z[index];
 
-                       voxelCenter[0] = sds->p0[0] + sds->dx * sds->scale * x 
+ sds->dx * sds->scale * 0.5;
-                       voxelCenter[1] = sds->p0[1] + sds->dx * sds->scale * y 
+ sds->dx * sds->scale * 0.5;
-                       voxelCenter[2] = sds->p0[2] + sds->dx * sds->scale * z 
+ sds->dx * sds->scale * 0.5;
+                       /* convert vel to global space */
+                       mag = len_v3(vel);
+                       mul_mat3_m4_v3(sds->obmat, vel);
+                       normalize_v3(vel);
+                       mul_v3_fl(vel, mag);
 
+                       voxelCenter[0] = sds->p0[0] + sds->cell_size[0] * 
((float)x + 0.5f);
+                       voxelCenter[1] = sds->p0[1] + sds->cell_size[1] * 
((float)y + 0.5f);
+                       voxelCenter[2] = sds->p0[2] + sds->cell_size[2] * 
((float)z + 0.5f);
+                       mul_m4_v3(sds->obmat, voxelCenter);
+
                        pd_point_from_loc(scene, voxelCenter, vel, index, 
&epoint);
                        pdDoEffectors(effectors, NULL, sds->effector_weights, 
&epoint, retvel, NULL);
 
+                       /* convert retvel to local space */
+                       mag = len_v3(retvel);
+                       mul_mat3_m4_v3(sds->imat, retvel);
+                       normalize_v3(retvel);
+                       mul_v3_fl(retvel, mag);
+
                        // TODO dg - do in force!
                        force_x[index] = MIN2(MAX2(-1.0, retvel[0] * 0.2), 
1.0); 
                        force_y[index] = MIN2(MAX2(-1.0, retvel[1] * 0.2), 
1.0); 
@@ -1898,7 +1887,8 @@
                mp = &mpolys[5]; ml = &mloops[5 * 4]; mp->loopstart = 5 * 4; 
mp->totloop = 4;
                ml[0].v = 1; ml[1].v = 0; ml[2].v = 4; ml[3].v = 5;
 
-               /* calculate shift */
+               /* calculate required shift to match domain's global position
+               *  where it was originally simulated (if object moves without 
smoke step) */
                invert_m4_m4(ob->imat, ob->obmat);
                mul_m4_v3(ob->obmat, ob_loc);
                mul_m4_v3(sds->obmat, ob_cache_loc);
@@ -1929,14 +1919,7 @@
 
                if(scene->r.cfra > smd->time)
                {
-                       // XXX TODO
                        smd->time = scene->r.cfra;
-
-                       // rigid movement support
-                       /*
-                       copy_m4_m4(smd->flow->mat_old, smd->flow->mat);
-                       copy_m4_m4(smd->flow->mat, ob->obmat);
-                       */
                }
                else if(scene->r.cfra < smd->time)
                {
@@ -1967,7 +1950,6 @@
        else if(smd->type & MOD_SMOKE_TYPE_DOMAIN)
        {
                SmokeDomainSettings *sds = smd->domain;
-               float light[3]; 
                PointCache *cache = NULL;
                PTCacheID pid;
                int startframe, endframe, framenr;
@@ -2026,8 +2008,7 @@
                /* if on second frame, write cache for first frame */
                if((int)smd->time == startframe && (cache->flag & 
PTCACHE_OUTDATED || cache->last_exact==0)) {
                        // create shadows straight after domain initialization 
so we get nice shadows for startframe, too
-                       if(get_lamp(scene, light))
-                               smoke_calc_transparency(sds->shadow, 
smoke_get_density(sds->fluid), sds->p0, sds->p1, sds->res, sds->dx, light, 
calc_voxel_transp, -7.0*sds->dx);
+                       smoke_calc_transparency(sds, scene);
 
                        if(sds->wt && sds->total_cells>1)
                        {
@@ -2057,8 +2038,7 @@
                }
 
                // create shadows before writing cache so they get stored
-               if(get_lamp(scene, light))
-                       smoke_calc_transparency(sds->shadow, 
smoke_get_density(sds->fluid), sds->p0, sds->p1, sds->res, sds->dx, light, 
calc_voxel_transp, -7.0*sds->dx);
+               smoke_calc_transparency(sds, scene);
 
                if(sds->wt)
                {
@@ -2205,100 +2185,75 @@
        cb(result, input, res, pixel, tRay, correct);
 }
 
-static void get_cell_global(float p0[3], float imat[4][4], int res[3], float 
cell_size[3], float pos[3], int *cell, int correct)
+static void smoke_calc_transparency(SmokeDomainSettings *sds, Scene *scene)
 {
-       float tmp[3];
+       float bv[6] = {0};
+       float light[3];
+       int a, z, slabsize=sds->res[0]*sds->res[1], size= 
sds->res[0]*sds->res[1]*sds->res[2];
+       float *density = smoke_get_density(sds->fluid);
+       float correct = -7.0*sds->dx;
 
-       mul_v3_m4v3(tmp, imat, pos);
-       sub_v3_v3(tmp, p0);
-       tmp[0] *= 1.0f/cell_size[0];
-       tmp[1] *= 1.0f/cell_size[1];
-       tmp[2] *= 1.0f/cell_size[2];
+       if (!get_lamp(scene, light)) return;
 
-       if (correct) {
-               cell[0] = MIN2(res[0] - 1, MAX2(0, (int)floor(tmp[0])));
-               cell[1] = MIN2(res[1] - 1, MAX2(0, (int)floor(tmp[1])));
-               cell[2] = MIN2(res[2] - 1, MAX2(0, (int)floor(tmp[2])));
-       }
-       else {
-               cell[0] = (int)floor(tmp[0]);
-               cell[1] = (int)floor(tmp[1]);
-               cell[2] = (int)floor(tmp[2]);
-       }
-}
+       /* convert light pos to sim cell space */
+       mul_m4_v3(sds->imat, light);
+       light[0] = (light[0] - sds->p0[0]) / sds->cell_size[0] - 0.5f;
+       light[1] = (light[1] - sds->p0[1]) / sds->cell_size[1] - 0.5f;
+       light[2] = (light[2] - sds->p0[2]) / sds->cell_size[2] - 0.5f;
 
-static void get_cell(float *p0, int res[3], float dx, float *pos, int *cell, 
int correct)
-{
-       float tmp[3];
-
-       sub_v3_v3v3(tmp, pos, p0);
-       mul_v3_fl(tmp, 1.0 / dx);
-
-       if (correct) {
-               cell[0] = MIN2(res[0] - 1, MAX2(0, (int)floor(tmp[0])));
-               cell[1] = MIN2(res[1] - 1, MAX2(0, (int)floor(tmp[1])));
-               cell[2] = MIN2(res[2] - 1, MAX2(0, (int)floor(tmp[2])));
-       }
-       else {
-               cell[0] = (int)floor(tmp[0]);
-               cell[1] = (int)floor(tmp[1]);
-               cell[2] = (int)floor(tmp[2]);
-       }
-}
-
-static void smoke_calc_transparency(float *result, float *input, float *p0, 
float *p1, int res[3], float dx, float *light, bresenham_callback cb, float 
correct)
-{
-       float bv[6];
-       int a, z, slabsize=res[0]*res[1], size= res[0]*res[1]*res[2];
-
        for(a=0; a<size; a++)
-               result[a]= -1.0f;
+               sds->shadow[a]= -1.0f;
 
-       bv[0] = p0[0];
-       bv[1] = p1[0];
-       // y
-       bv[2] = p0[1];
-       bv[3] = p1[1];
-       // z
-       bv[4] = p0[2];
-       bv[5] = p1[2];
+       /* calculate domain bounds in sim cell space */
+       // 0,2,4 = 0.0f

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to