Revision: 16814
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16814
Author:   broken
Date:     2008-09-29 09:56:41 +0200 (Mon, 29 Sep 2008)

Log Message:
-----------
* New Point Density texture option: 'Object Vertices'

This works very similarly to particles, it just uses the object's renderable 
vertices as the points instead.

http://mke3.net/blender/devel/rendering/volumetrics/pd_objectvertices.png

Modified Paths:
--------------
    branches/sim_physics/source/blender/makesdna/DNA_texture_types.h
    branches/sim_physics/source/blender/render/intern/source/pointdensity.c
    branches/sim_physics/source/blender/src/buttons_shading.c

Modified: branches/sim_physics/source/blender/makesdna/DNA_texture_types.h
===================================================================
--- branches/sim_physics/source/blender/makesdna/DNA_texture_types.h    
2008-09-29 07:17:12 UTC (rev 16813)
+++ branches/sim_physics/source/blender/makesdna/DNA_texture_types.h    
2008-09-29 07:56:41 UTC (rev 16814)
@@ -136,12 +136,14 @@
        short source;
        short pdpad[3];
 
-       struct Object *object;  /* for 'Particle system' type - source object */
-       short psysindex;                /* and object's psys number */
-       short psys_cache_space; /* cache particles in worldspace, object space, 
... ? */
+       struct Object *object;  /* for 'Object' or 'Particle system' type - 
source object */
+       short psys_cache_space;         /* cache points in worldspace, object 
space, ... ? */
+       short psysindex;                /* for 'Particle system' type - 
object's psys number */
        
-       short pdpad2[2];
+       short ob_cache_space;           /* cache points in worldspace, object 
space, ... ? */
        
+       short pdpad2;
+       
        void *point_tree;               /* the kd-tree containing points */
 } PointDensity;
 
@@ -414,9 +416,9 @@
 #define TEX_PD_FILE                    2
 
 /* psys_cache_space */
-#define TEX_PD_PSYS_OBJECTLOC  0
-#define TEX_PD_PSYS_OBJECTSPACE        1
-#define TEX_PD_PSYS_WORLDSPACE 2
+#define TEX_PD_OBJECTLOC       0
+#define TEX_PD_OBJECTSPACE     1
+#define TEX_PD_WORLDSPACE      2
 
 #endif
 

Modified: 
branches/sim_physics/source/blender/render/intern/source/pointdensity.c
===================================================================
--- branches/sim_physics/source/blender/render/intern/source/pointdensity.c     
2008-09-29 07:17:12 UTC (rev 16813)
+++ branches/sim_physics/source/blender/render/intern/source/pointdensity.c     
2008-09-29 07:56:41 UTC (rev 16814)
@@ -39,6 +39,7 @@
 #include "DNA_particle_types.h"
 
 #include "render_types.h"
+#include "renderdatabase.h"
 #include "texture.h"
 
 
@@ -54,7 +55,6 @@
        /* init crap */
        if (!psys || !ob || !pd) return;
        
-       //Mat4CpyMat4(obview, ob->obmat);
        Mat4MulMat4(obview, re->viewinv, ob->obmat);
        
        /* Just to create a valid rendering context */
@@ -71,7 +71,6 @@
        /* in case ob->imat isn't up-to-date */
        Mat4Invert(ob->imat, ob->obmat);
        
-       /* finally do something */
        pd->point_tree = BLI_kdtree_new(psys->totpart+psys->totchild);
        
        if (psys->totchild > 0 && !(psys->part->draw & PART_DRAW_PARENT))
@@ -84,17 +83,17 @@
                        
                        VECCOPY(partco, state.co);
                        
-                       if (pd->psys_cache_space == TEX_PD_PSYS_OBJECTSPACE)
+                       if (pd->psys_cache_space == TEX_PD_OBJECTSPACE)
                                Mat4MulVecfl(ob->imat, partco);
-                       else if (pd->psys_cache_space == TEX_PD_PSYS_OBJECTLOC) 
{
+                       else if (pd->psys_cache_space == TEX_PD_OBJECTLOC) {
                                float obloc[3];
                                VECCOPY(obloc, ob->loc);
                                VecSubf(partco, partco, obloc);
                        } else {
-                               /* TEX_PD_PSYS_WORLDSPACE */
+                               /* TEX_PD_WORLDSPACE */
                        }
                        
-                       BLI_kdtree_insert(pd->point_tree, 0, partco, NULL);
+                       BLI_kdtree_insert(pd->point_tree, i, partco, NULL);
                }
        }
        
@@ -103,6 +102,38 @@
 }
 
 
+static void pointdensity_cache_object(Render *re, PointDensity *pd, ObjectRen 
*obr)
+{
+       int i;
+       
+       if (!obr || !pd) return;
+       if(!obr->vertnodes) return;
+       
+       /* in case ob->imat isn't up-to-date */
+       Mat4Invert(obr->ob->imat, obr->ob->obmat);
+       
+       pd->point_tree = BLI_kdtree_new(obr->totvert);
+       
+       for(i=0; i<obr->totvert; i++) {
+               float ver_co[3];
+               VertRen *ver= RE_findOrAddVert(obr, i);
+               
+               VECCOPY(ver_co, ver->co);
+               
+               if (pd->ob_cache_space == TEX_PD_OBJECTSPACE) {
+                       Mat4MulVecfl(re->viewinv, ver_co);
+                       Mat4MulVecfl(obr->ob->imat, ver_co);
+               } else {
+                       /* TEX_PD_WORLDSPACE */
+                       Mat4MulVecfl(re->viewinv, ver_co);
+               }
+               
+               BLI_kdtree_insert(pd->point_tree, i, ver_co, NULL);
+       }
+       
+       BLI_kdtree_balance(pd->point_tree);
+
+}
 static void cache_pointdensity(Render *re, Tex *tex)
 {
        PointDensity *pd = tex->pd;
@@ -124,6 +155,22 @@
                
                pointdensity_cache_psys(re, pd, ob, psys);
        }
+       else if (pd->source == TEX_PD_OBJECT) {
+               Object *ob = pd->object;
+               ObjectRen *obr;
+               int found=0;
+
+               /* find the obren that corresponds to the object */
+               for (obr=re->objecttable.first; obr; obr=obr->next) {
+                       if (obr->ob == ob) {
+                               found=1;
+                               break;
+                       }
+               }
+               if (!found) return;
+               
+               pointdensity_cache_object(re, pd, obr);
+       }
 }
 
 static void free_pointdensity(Render *re, Tex *tex)

Modified: branches/sim_physics/source/blender/src/buttons_shading.c
===================================================================
--- branches/sim_physics/source/blender/src/buttons_shading.c   2008-09-29 
07:17:12 UTC (rev 16813)
+++ branches/sim_physics/source/blender/src/buttons_shading.c   2008-09-29 
07:56:41 UTC (rev 16814)
@@ -763,7 +763,7 @@
                uiDefBut(block, LABEL, B_NOP, "Point data source:",
                                X2CLM2, yco-=BUTH, BUTW2, BUTH, 0, 0, 0, 0, 0, 
"");
                
-               uiDefButS(block, MENU, B_TEXREDR_PRV, "Particle System %x0",
+               uiDefButS(block, MENU, B_TEXREDR_PRV, "Particle System 
%x0|Object Vertices %x1",
                                X2CLM2, yco-=BUTH, BUTW2, BUTH, &pd->source, 
0.0, 0.0, 0, 0, "Source");
                
                yco -= YSPACE;
@@ -786,6 +786,17 @@
                        uiDefButS(block, MENU, B_TEXREDR_PRV, "Emit Object 
Location %x0|Emit Object Space %x1|Global Space %x2",
                                X2CLM2, yco-=BUTH, BUTW2, BUTH, 
&pd->psys_cache_space, 0.0, 0.0, 0, 0, "Co-ordinate system to cache particles 
in");
                }
+               else if (pd->source == TEX_PD_OBJECT) {
+                       uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_REDR, 
"Ob:",
+                               X2CLM2, yco-=BUTH, BUTW2, BUTH, &(pd->object), 
"Object to render as points");
+                       
+                       yco -= YSPACE;
+                       
+                       uiDefBut(block, LABEL, B_NOP, "Cache vertices in:",
+                               X2CLM2, yco-=BUTH, BUTW2, BUTH, 0, 0, 0, 0, 0, 
"");
+                       uiDefButS(block, MENU, B_TEXREDR_PRV, "Object Space 
%x1|Global Space %x2",
+                               X2CLM2, yco-=BUTH, BUTW2, BUTH, 
&pd->ob_cache_space, 0.0, 0.0, 0, 0, "Co-ordinate system to cache vertices in");
+               }
        }
 
 }
@@ -4310,8 +4321,6 @@
        uiBlockBeginAlign(block);
        uiDefButF(block, NUM, B_MATPRV, "Step Size: ",
                X2CLM1, yco-=BUTH, BUTW2, BUTH, &(ma->vol_stepsize), 0.001, 
100.0, 10, 2, "Ray marching step size");
-       uiDefButF(block, NUMSLI, B_MATPRV, "Density: ",
-               X2CLM1, yco-=BUTH, BUTW2, BUTH, &(ma->alpha), 0.0, 1.0, 0, 0, 
"Base opacity value");
        uiDefButS(block, NUM, B_MATPRV, "Layer Depth: ",
                X2CLM1, yco-=BUTH, BUTW2, BUTH, &(ma->vol_raydepth), 0.0, 
512.0, 10, 2, "Number of layered volume ray intersections allowed per pixel");
        uiBlockEndAlign(block);
@@ -4327,6 +4336,11 @@
        
        yco = PANEL_YMAX;
        
+       uiDefButF(block, NUMSLI, B_MATPRV, "Density: ",
+               X2CLM2, yco-=BUTH, BUTW2, BUTH, &(ma->alpha), 0.0, 1.0, 0, 0, 
"Base opacity value");
+       
+       yco -= YSPACE;
+       
        uiBlockBeginAlign(block);
        uiDefButF(block, NUM, B_MATPRV, "Absorption: ",
                X2CLM2, yco-=BUTH, BUTW2, BUTH, &(ma->vol_absorption), 0.0, 
10.0, 10, 0, "Multiplier for absorption");


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to