[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17817] branches/sim_physics/source/ blender: * Volume Rendering: Voxel data
bill nieuwendorp
slow67 at gmail.com
Sat Dec 13 07:18:28 CET 2008
"there's potential for making a more full-featured 'Blender voxel file
format', and also for supporting other formats too."
those video's of the exported voxels resemble brickmaps from
renderman type renderers, that could be a nice addon if the octree was
adaptive/multiresolution.
On Fri, Dec 12, 2008 at 9:41 PM, Matt Ebb <matt at mke3.net> wrote:
> Revision: 17817
> http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17817
> Author: broken
> Date: 2008-12-13 06:41:34 +0100 (Sat, 13 Dec 2008)
>
> Log Message:
> -----------
> * Volume Rendering: Voxel data
>
> This commit introduces a new texture ('Voxel Data'), used to load up saved voxel
> data sets for rendering, contributed by Rau?\204?\129l 'farsthary' Ferna?\204?\129ndez Herna?\204?\129ndez
> with some additional tweaks. Thanks, Rau?\204?\129l!
>
> The texture works similar to the existing point density texture, currently it
> only provides intensity information, which can then be mapped (for example) to
> density in a volume material. This is an early version, intended to read the
> voxel format saved by Rau?\204?\129l's command line simulators, in future revisions
> there's potential for making a more full-featured 'Blender voxel file format',
> and also for supporting other formats too.
>
> Note: Due to some subtleties in Rau?\204?\129l's existing released simulators, in order
> to load them correctly the voxel data texture, you'll need to raise the
> 'resolution' value by 2. So if you baked out the simulation at resolution 50,
> enter 52 for the resolution in the texture panel. This can possibly be fixed in
> the simulator later on.
>
> Right now, the way the texture is mapped is just in the space 0,0,0 <-> 1,1,1
> and it can appear rotated 90 degrees incorrectly. This will be tackled, for now,
> probably the easiest way to map it is with and empty, using Map Input -> Object.
>
> Smoke test: http://www.vimeo.com/2449270
>
> One more note, trilinear interpolation seems a bit slow at the moment, we'll
> look into this.
>
> For curiosity, while testing/debugging this, I made a script that exports a mesh
> to voxel data. Here's a test of grogan (www.kajimba.com) converted to voxels,
> rendered as a volume: http://www.vimeo.com/2512028
>
> The script is available here: http://mke3.net/projects/bpython/export_object_voxeldata.py
>
> * Another smaller thing, brought back early ray termination (was disabled
> previously for debugging) and made it user configurable. It now appears as a new
> value in the volume material: 'Depth Cutoff'. For some background info on what
> this does, check:
> http://farsthary.wordpress.com/2008/12/11/cutting-down-render-times/
>
> * Also some disabled work-in-progess code for light cache
>
> Modified Paths:
> --------------
> branches/sim_physics/source/blender/blenkernel/BKE_texture.h
> branches/sim_physics/source/blender/blenkernel/intern/texture.c
> branches/sim_physics/source/blender/blenloader/intern/readfile.c
> branches/sim_physics/source/blender/blenloader/intern/writefile.c
> branches/sim_physics/source/blender/include/butspace.h
> branches/sim_physics/source/blender/makesdna/DNA_material_types.h
> branches/sim_physics/source/blender/makesdna/DNA_texture_types.h
> branches/sim_physics/source/blender/render/intern/include/render_types.h
> branches/sim_physics/source/blender/render/intern/include/volume_precache.h
> branches/sim_physics/source/blender/render/intern/source/convertblender.c
> branches/sim_physics/source/blender/render/intern/source/texture.c
> branches/sim_physics/source/blender/render/intern/source/volume_precache.c
> branches/sim_physics/source/blender/render/intern/source/volumetric.c
> branches/sim_physics/source/blender/src/butspace.c
> branches/sim_physics/source/blender/src/buttons_shading.c
>
> Modified: branches/sim_physics/source/blender/blenkernel/BKE_texture.h
> ===================================================================
> --- branches/sim_physics/source/blender/blenkernel/BKE_texture.h 2008-12-12 23:30:23 UTC (rev 17816)
> +++ branches/sim_physics/source/blender/blenkernel/BKE_texture.h 2008-12-13 05:41:34 UTC (rev 17817)
> @@ -40,6 +40,7 @@
> struct TexMapping;
> struct EnvMap;
> struct PointDensity;
> +struct VoxelData;
>
> /* in ColorBand struct */
> #define MAXCOLORBAND 32
> @@ -80,6 +81,11 @@
> struct PointDensity *BKE_add_pointdensity(void);
> struct PointDensity *BKE_copy_pointdensity(struct PointDensity *pd);
>
> +void BKE_free_voxeldatadata(struct VoxelData *vd);
> +void BKE_free_voxeldata(struct VoxelData *vd);
> +struct VoxelData *BKE_add_voxeldata(void);
> +struct VoxelData *BKE_copy_voxeldata(struct VoxelData *vd);
> +
> int BKE_texture_dependsOnTime(const struct Tex *texture);
>
> #endif
>
> Modified: branches/sim_physics/source/blender/blenkernel/intern/texture.c
> ===================================================================
> --- branches/sim_physics/source/blender/blenkernel/intern/texture.c 2008-12-12 23:30:23 UTC (rev 17816)
> +++ branches/sim_physics/source/blender/blenkernel/intern/texture.c 2008-12-13 05:41:34 UTC (rev 17817)
> @@ -420,6 +420,7 @@
> if(tex->coba) MEM_freeN(tex->coba);
> if(tex->env) BKE_free_envmap(tex->env);
> if(tex->pd) BKE_free_pointdensity(tex->pd);
> + if(tex->vd) BKE_free_voxeldata(tex->vd);
> BKE_previewimg_free(&tex->preview);
> BKE_icon_delete((struct ID*)tex);
> tex->id.icon_id = 0;
> @@ -490,6 +491,11 @@
> tex->pd->radius = 0.3f;
> tex->pd->falloff_type = TEX_PD_FALLOFF_STD;
> }
> +
> + if (tex->vd) {
> + tex->vd->resolX=50;
> + tex->vd->interp_type=0;
> + }
>
> pit = tex->plugin;
> if (pit) {
> @@ -588,6 +594,7 @@
> if(texn->coba) texn->coba= MEM_dupallocN(texn->coba);
> if(texn->env) texn->env= BKE_copy_envmap(texn->env);
> if(texn->pd) texn->pd= BKE_copy_pointdensity(texn->pd);
> + if(texn->vd) texn->vd=BKE_copy_voxeldata(texn->vd);
>
> if(tex->preview) texn->preview = BKE_previewimg_copy(tex->preview);
>
> @@ -945,6 +952,48 @@
> MEM_freeN(pd);
> }
>
> +
> +void BKE_free_voxeldatadata(struct VoxelData *vd)
> +{
> + if (vd->dataset) {
> + MEM_freeN(vd->dataset);
> + vd->dataset = NULL;
> + }
> +
> +}
> +
> +void BKE_free_voxeldata(struct VoxelData *vd)
> +{
> + BKE_free_voxeldatadata(vd);
> + MEM_freeN(vd);
> +}
> +
> +struct VoxelData *BKE_add_voxeldata(void)
> +{
> + VoxelData *vd;
> +
> + vd= MEM_callocN(sizeof(struct VoxelData), "voxeldata");
> + vd->dataset = NULL;
> + vd->resolX = 1;
> + vd->resolY = 1;
> + vd->resolZ = 1;
> + vd->interp_type= TEX_VD_NEARESTNEIGHBOR;
> + vd->int_multiplier = 1.0;
> +
> + return vd;
> + }
> +
> +struct VoxelData *BKE_copy_voxeldata(struct VoxelData *vd)
> +{
> + VoxelData *vdn;
> +
> + vdn= MEM_dupallocN(vd);
> + vdn->dataset = NULL;
> +
> + return vdn;
> +}
> +
> +
> /* ------------------------------------------------------------------------- */
> int BKE_texture_dependsOnTime(const struct Tex *texture)
> {
>
> Modified: branches/sim_physics/source/blender/blenloader/intern/readfile.c
> ===================================================================
> --- branches/sim_physics/source/blender/blenloader/intern/readfile.c 2008-12-12 23:30:23 UTC (rev 17816)
> +++ branches/sim_physics/source/blender/blenloader/intern/readfile.c 2008-12-13 05:41:34 UTC (rev 17817)
> @@ -2535,6 +2535,11 @@
> tex->pd->coba= newdataadr(fd, tex->pd->coba);
> }
>
> + tex->vd= newdataadr(fd, tex->vd);
> + if(tex->vd) {
> + tex->vd->dataset = NULL;
> + }
> +
> tex->nodetree= newdataadr(fd, tex->nodetree);
> if(tex->nodetree)
> direct_link_nodetree(fd, tex->nodetree);
> @@ -7939,6 +7944,8 @@
> ma->vol_density_scale = 1.0f;
> if (ma->vol_precache_resolution == 0)
> ma->vol_precache_resolution = 50;
> + if (ma->vol_depth_cutoff < 0.0001)
> + ma->vol_depth_cutoff = 0.05;
> }
>
> for(tex=main->tex.first; tex; tex= tex->id.next) {
> @@ -7956,6 +7963,17 @@
> tex->pd->coba = add_colorband(1);
> tex->pd->speed_scale = 1.0f;
> }
> +
> + if (tex->vd == NULL) {
> + tex->vd = BKE_add_voxeldata();
> + } else if (tex->vd->resolX == 0) {
> + tex->vd->dataset = NULL;
> + tex->vd->resolX = 1;
> + tex->vd->resolY = 1;
> + tex->vd->resolZ = 1;
> + tex->vd->interp_type= TEX_VD_NEARESTNEIGHBOR;
> + tex->vd->int_multiplier = 1.0;
> + }
> }
>
> }
>
> Modified: branches/sim_physics/source/blender/blenloader/intern/writefile.c
> ===================================================================
> --- branches/sim_physics/source/blender/blenloader/intern/writefile.c 2008-12-12 23:30:23 UTC (rev 17816)
> +++ branches/sim_physics/source/blender/blenloader/intern/writefile.c 2008-12-13 05:41:34 UTC (rev 17817)
> @@ -1339,6 +1339,7 @@
> writestruct(wd, DATA, "PointDensity", 1, tex->pd);
> if(tex->pd->coba) writestruct(wd, DATA, "ColorBand", 1, tex->pd->coba);
> }
> + if(tex->vd) writestruct(wd, DATA, "VoxelData", 1, tex->vd);
>
> /* nodetree is integral part of texture, no libdata */
> if(tex->nodetree) {
>
> Modified: branches/sim_physics/source/blender/include/butspace.h
> ===================================================================
> --- branches/sim_physics/source/blender/include/butspace.h 2008-12-12 23:30:23 UTC (rev 17816)
> +++ branches/sim_physics/source/blender/include/butspace.h 2008-12-13 05:41:34 UTC (rev 17817)
> @@ -260,7 +260,9 @@
> #define B_ENV_FREE_ALL 1357
> #define B_TEX_USENODES 1358
>
> +#define B_VOXELDATA_LOAD 1359
>
> +
> /* **************** animbuts = object buttons ******* */
> #define B_ANIMBUTS 1500
>
>
> Modified: branches/sim_physics/source/blender/makesdna/DNA_material_types.h
> ===================================================================
> --- branches/sim_physics/source/blender/makesdna/DNA_material_types.h 2008-12-12 23:30:23 UTC (rev 17816)
> +++ branches/sim_physics/source/blender/makesdna/DNA_material_types.h 2008-12-13 05:41:34 UTC (rev 17817)
> @@ -69,6 +69,8 @@
> short vol_stepsize_type;
> short vol_precache_resolution;
> float vol_stepsize, vol_shade_stepsize;
> + float vol_depth_cutoff;
> + float vpad;
> float vol_density_scale;
> float vol_absorption, vol_scattering;
> float vol_absorption_col[3];
>
> Modified: branches/sim_physics/source/blender/makesdna/DNA_texture_types.h
> ===================================================================
> --- branches/sim_physics/source/blender/makesdna/DNA_texture_types.h 2008-12-12 23:30:23 UTC (rev 17816)
> +++ branches/sim_physics/source/blender/makesdna/DNA_texture_types.h 2008-12-13 05:41:34 UTC (rev 17817)
> @@ -154,7 +154,7 @@
> short noise_depth;
> short noise_influence;
> short noise_basis;
> - short pdpad3[3];
> + short pdpad3[3];
> float noise_fac;
>
> float speed_scale;
> @@ -162,6 +162,18 @@
>
> } PointDensity;
>
> +typedef struct VoxelData {
> + int resolX, resolY, resolZ;
> + int interp_type;
> +
> + float int_multiplier;
> + float vxpad;
> +
> + char source_path[240];
> + float *dataset;
> +
> +} VoxelData;
> +
> typedef struct Tex {
> ID id;
>
> @@ -209,6 +221,7 @@
> struct EnvMap *env;
> struct PreviewImage * preview;
> struct PointDensity *pd;
> + struct VoxelData *vd;
>
> char use_nodes;
> char pad[7];
> @@ -250,6 +263,7 @@
> #define TEX_DISTNOISE 13
> /* predicting ocean texture for 14 */
> #define TEX_POINTDENSITY 15
> +#define TEX_VOXELDATA 16
>
> /* musgrave stype */
> #define TEX_MFRACTAL 0
> @@ -465,5 +479,13 @@
> #define POINT_DATA_VEL 1
> #define POINT_DATA_LIFE 2
>
> +/******************** Voxel Data *****************************/
> +#define TEX_VD_CUBIC 0
> +#define TEX_VD_PARALLELOGRAM 1
> +
> +#define TEX_VD_NEARESTNEIGHBOR 0
> +#define TEX_VD_LINEAR 1
> +#define TEX_VD_TRICUBIC 2
> +
> #endif
>
>
> Modified: branches/sim_physics/source/blender/render/intern/include/render_types.h
> ===================================================================
> --- branches/sim_physics/source/blender/render/intern/include/render_types.h 2008-12-12 23:30:23 UTC (rev 17816)
> +++ branches/sim_physics/source/blender/render/intern/include/render_types.h 2008-12-13 05:41:34 UTC (rev 17817)
> @@ -203,6 +203,8 @@
> struct Object *excludeob;
>
> ListBase vol_precache_obs;
> + ListBase render_volumes_inside;
> + ListBase volumes;
>
> /* arena for allocating data for use during render, for
> * example dynamic TFaces to go in the VlakRen structure.
> @@ -409,6 +411,18 @@
> struct ObjectRen *obr;
> } VolPrecache;
>
> +typedef struct VolumeOb
> +{
> + struct VolumeOb *next, *prev;
> + struct Material *ma;
> + struct ObjectRen *obr;
> +} VolumeOb;
> +
> +typedef struct MatInside {
> + struct MatInside *next, *prev;
> + struct Material *ma;
> +} MatInside;
> +
> /* ------------------------------------------------------------------------- */
>
> struct LampRen;
>
> Modified: branches/sim_physics/source/blender/render/intern/include/volume_precache.h
> ===================================================================
> --- branches/sim_physics/source/blender/render/intern/include/volume_precache.h 2008-12-12 23:30:23 UTC (rev 17816)
> +++ branches/sim_physics/source/blender/render/intern/include/volume_precache.h 2008-12-13 05:41:34 UTC (rev 17817)
> @@ -27,4 +27,5 @@
> */
>
> void volume_precache(Render *re);
> -void free_volume_precache(Render *re);
> \ No newline at end of file
> +void free_volume_precache(Render *re);
> +int point_inside_volume_objectinstance(ObjectInstanceRen *obi, float *co);
> \ No newline at end of file
>
> Modified: branches/sim_physics/source/blender/render/intern/source/convertblender.c
> ===================================================================
> --- branches/sim_physics/source/blender/render/intern/source/convertblender.c 2008-12-12 23:30:23 UTC (rev 17816)
> +++ branches/sim_physics/source/blender/render/intern/source/convertblender.c 2008-12-13 05:41:34 UTC (rev 17817)
> @@ -104,6 +104,7 @@
> #include "multires.h"
> #include "occlusion.h"
> #include "pointdensity.h"
> +#include "voxeldata.h"
> #include "render_types.h"
> #include "rendercore.h"
> #include "renderdatabase.h"
> @@ -3028,16 +3029,51 @@
> }
> }
>
> -static void add_vol_precache(Render *re, ObjectRen *obr, Material *ma)
> +static void free_camera_inside_volumes(Render *re)
> {
> - struct VolPrecache *vp;
> + BLI_freelistN(&re->render_volumes_inside);
> +}
> +
> +static void init_camera_inside_volumes(Render *re)
> +{
> + ObjectInstanceRen *obi;
> + VolumeOb *vo;
> + float co[3] = {0.f, 0.f, 0.f};
> +
> + for(vo= re->volumes.first; vo; vo= vo->next) {
> + for(obi= re->instancetable.first; obi; obi= obi->next) {
> + if (obi->obr == vo->obr) {
> + if (point_inside_volume_objectinstance(obi, co)) {
> + MatInside *mi;
> +
> + mi = MEM_mallocN(sizeof(MatInside), "camera inside material");
> + mi->ma = vo->ma;
> +
> + BLI_addtail(&(re->render_volumes_inside), mi);
> + }
> + }
> + }
> + }
>
>
> @@ Diff output truncated at 10240 characters. @@
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
More information about the Bf-committers
mailing list