Revision: 16201 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16201 Author: joeedh Date: 2008-08-21 09:59:18 +0200 (Thu, 21 Aug 2008)
Log Message: ----------- Commit of an experimental tile-based disk-backed image library I felt like writing. It does nothing at the moment. Also, added some UI for soft shadows (which of course don't work yet, still need to code a good PCF implementation, as it seems not only is the more physically-correct method my nonworking code is using a lot slower, but it's also not worth it if your rendering fur). Modified Paths: -------------- branches/soc-2007-joeedh/source/blender/blenkernel/intern/tcs_bucketbuffer.c branches/soc-2007-joeedh/source/blender/blenkernel/intern/tcs_cache.c branches/soc-2007-joeedh/source/blender/blenkernel/intern/tcs_image.c branches/soc-2007-joeedh/source/blender/makesdna/DNA_lamp_types.h branches/soc-2007-joeedh/source/blender/render/intern/include/render_types.h branches/soc-2007-joeedh/source/blender/render/intern/source/convertblender.c branches/soc-2007-joeedh/source/blender/render/intern/source/dsm_func.c branches/soc-2007-joeedh/source/blender/render/intern/source/dsm_soft.c branches/soc-2007-joeedh/source/blender/src/buttons_shading.c Added Paths: ----------- branches/soc-2007-joeedh/source/blender/blenkernel/BKE_imagebuffer.h Added: branches/soc-2007-joeedh/source/blender/blenkernel/BKE_imagebuffer.h =================================================================== --- branches/soc-2007-joeedh/source/blender/blenkernel/BKE_imagebuffer.h (rev 0) +++ branches/soc-2007-joeedh/source/blender/blenkernel/BKE_imagebuffer.h 2008-08-21 07:59:18 UTC (rev 16201) @@ -0,0 +1,119 @@ +/** + * blenlib/BKE_imagebuffer.h + * + * $Id: BKE_imagebuffer.h 15647 2008-07-20 04:39:35Z joeedh $ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ +#ifndef BKE_IMAGEBUFFER_H +#define BKE_IMAGEBUFFER_H + +#define USEIMAGEBUFFER 0 + +#if USEIMAGEBUFFER + +#include "BKE_tile.h" + +typedef struct TCS_ImageTile { + TCS_Tile tile; + union { + char *c; + float *f; + } data; + int sizex, sizey; + int x, y, type, totchannels; +} TCS_ImageTile; + +typedef struct TCS_Image { + TCS_TileBuffer buffer; + int sizex, sizey; + int tilex, tiley; + + short flags, type; + int totchannels; + + TCS_ImageTile *tilerect; +} TCS_Image; + +/*image types*/ +#define IMAGE_FLOAT 0 +#define IMAGE_BYTE 1 + +#define TCSIMAGE_MAX_TILESIZE 64 +#define TCSIMAGE_MAX_TOTCHANNELS 4 +#define TCSIMAGE_MAXMEM 75*1024*1024 + +/*note: initcolor is allowed to be NuLL*/ +TCS_Image *TCSImage_newImage(int sizex, int sizey, int type, int totchannels, + void *initcolor); + +void TCSImage_getPixelf(TCS_Image *img, int x, int y, float *dst_pixel); +void TCSImage_getPixelub(TCS_Image *img, int x, int y, char *dst_pixel); + +void TCSImage_setPixelf(TCS_Image *img, int x, int y, float *src_pixel); +void TCSImage_setPixelub(TCS_Image *img, int x, int y, char *src_pixel); + +/*note, this can't (by it's nature) lock the tile automatically the way the previous + two functions can (there's no point) */ +void *TCSImage_getPixel(TCS_Image *img, int x, int y); + +/*ok, as much as possible try to use the pixel processor functions, which + loops over every pixel in an image and calls a function on these, + since they'll automatically do float<->byte conversions for you. + + also, the processor functions themselves always work in floats*/ + +/*x and y are pixel positions in normalized 0.0 ... 1.0 space. + note that fac is always provided. + + in is the input pixel, out is the output. note that out is *not* + zeroed, so it may have garbage in it. totchannels is the number of + channels this pixel has.*/ +typedef void (*PixelProc)(float *in, float *out, float *fac, float x, float y, int totchannels); + +/*note: fac can be NULL, in which case defaultfac is passed in. otherwise, defaultfac has + no meaning.*/ +void TCSImage_Pixel_Processor(TCS_Image *image, TCS_Image *fac, float defaultfac, + PixelProc proc, int totchannels); + +void TCSImage_Scale(TCS_Image *image, int newwidth, int newheight, int scalemode); +#define SCALEMODE_NORMAL 0 +#define SCALEMODE_FAST 1 + +void TCSImage_Mix(TCS_Image *dst, TCS_Image *src, TCS_Image *fac, + float facscale, int mode); +void TCSImage_AlphaOver(TCS_Image *dst, TCS_Image *src, TCS_Image *fac, + float facscale, int convertpremul); + +/*converts the image stored in *img to the desired type and number of totchannels, + if necassary, initializing alpha to defaultalpha as necassary.*/ +void TCSImage_Convert(TCS_Image *img, int type, int totchannels, float defaultalpha); + +/*makes a copy of an image*/ +TCS_Image *TCSImage_Copy(TCS_Image *img); + +#endif /* BKE_IMAGEBUFFER_H */ +#endif Modified: branches/soc-2007-joeedh/source/blender/blenkernel/intern/tcs_bucketbuffer.c =================================================================== --- branches/soc-2007-joeedh/source/blender/blenkernel/intern/tcs_bucketbuffer.c 2008-08-20 21:34:49 UTC (rev 16200) +++ branches/soc-2007-joeedh/source/blender/blenkernel/intern/tcs_bucketbuffer.c 2008-08-21 07:59:18 UTC (rev 16201) @@ -273,6 +273,7 @@ TCS_AddToPool(pool, tile); } + TCS_RunCacher(pool); } return (TCS_TileBuffer*) buf; Modified: branches/soc-2007-joeedh/source/blender/blenkernel/intern/tcs_cache.c =================================================================== --- branches/soc-2007-joeedh/source/blender/blenkernel/intern/tcs_cache.c 2008-08-20 21:34:49 UTC (rev 16200) +++ branches/soc-2007-joeedh/source/blender/blenkernel/intern/tcs_cache.c 2008-08-21 07:59:18 UTC (rev 16201) @@ -104,7 +104,7 @@ tile->pool->memused -= tile->struct_overhead; - /*add tile's file position to tile if in fixed tilesize mode.*/ + /*add tile's file position to the pool if in fixed tilesize mode.*/ if (tile->pool->flag & TCS_POOL_TSIZEFIXED) { TCS_FileTileRef *ref = MEM_callocN(sizeof(TCS_POOL_TSIZEFIXED), "TCS_POOL_TSIZEFIXED"); ref->file = tile->file; @@ -554,8 +554,8 @@ TCS_fwrite(&tile->compressed_memfile->length, sizeof(unsigned long), 1, tile->file); TCS_fwrite(tile->compressed_memfile->ptr, tile->compressed_memfile->length, 1, tile->file); - /*if TCS_POOL_TSIZEFIXED is set, then we have to ensure the entire uncompressed - tile region on the disk is reserved, even if it's not used.*/ + /*if TCS_POOL_TSIZEFIXED is set, then we have to ensure all the diskspace up to + pool->tilesize (the maxumum tile size in bytes) is in use.*/ if (pool->flag & TCS_POOL_TSIZEFIXED) { int diff = pool->tilesize - tile->compressed_memfile->length; int i, zero=0; Modified: branches/soc-2007-joeedh/source/blender/blenkernel/intern/tcs_image.c =================================================================== --- branches/soc-2007-joeedh/source/blender/blenkernel/intern/tcs_image.c 2008-08-20 21:34:49 UTC (rev 16200) +++ branches/soc-2007-joeedh/source/blender/blenkernel/intern/tcs_image.c 2008-08-21 07:59:18 UTC (rev 16201) @@ -24,6 +24,352 @@ * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ +#include "BKE_imagebuffer.h" +#include "MEM_guardedalloc.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> + +#if USEIMAGEBUFFER + +static TCS_TilePool *img_float_pool = NULL; +static TCS_TilePool *img_byte_pool = NULL; + +static void tcsimage_pools_check(void) +{ + if (img_float_pool == NULL) + img_float_pool = TCS_MakeFixedPool(TCSIMAGE_MAXMEM, "float_image_cache", + TCSIMAGE_MAX_TILESIZE*TCSIMAGE_MAX_TILESIZE*sizeof(float)*TCSIMAGE_MAX_TOTCHANNELS); + + if (img_byte_pool == NULL) + img_byte_pool = TCS_MakeFixedPool(TCSIMAGE_MAXMEM, "byte_image_cache", + TCSIMAGE_MAX_TILESIZE*TCSIMAGE_MAX_TILESIZE*TCSIMAGE_MAX_TOTCHANNELS); +} + +static int tilesize_table[2] = {sizeof(float), 1}; + +static void tcs_imagetile_loadfromcache(TCS_Tile *self, TCS_File *file) { + TCS_ImageTile *tile = (TCS_ImageTile*) self; + tile->data.c = MEM_mallocN(tilesize_table[tile->type]*tile->sizex*tile->sizey*tile->totchannels, "image tile"); + TCS_fread(tile->data.c, tilesize_table[tile->type], tile->sizex*tile->sizey*tile->totchannels, file); +} + +static unsigned int tcs_imagetile_savetocache(TCS_Tile *self, TCS_File *file, unsigned long current_position) +{ + TCS_ImageTile *tile = (TCS_ImageTile*) self; + TCS_fwrite(tile->data.c, tilesize_table[tile->type], tile->sizex*tile->sizey*tile->totchannels, file); + return tilesize_table[tile->type]*tile->sizex*tile->sizey*tile->totchannels; +} + +static void tcs_imagetile_freedata(TCS_Tile *self) +{ + TCS_ImageTile *tile = (TCS_ImageTile*) self; + MEM_freeN(tile->data.c); + tile->data.c = NULL; +} + +static unsigned int tcs_imagetile_getlen(TCS_Tile *self) +{ + TCS_ImageTile *tile = (TCS_ImageTile*) self; + return tilesize_table[tile->type]*tile->sizex*tile->sizey*tile->totchannels; +} + +TCS_TileType imagetile_type = { + tcs_imagetile_loadfromcache, + tcs_imagetile_savetocache, + tcs_imagetile_freedata, + tcs_imagetile_getlen +}; + +/*only frees direct data*/ +static void tcsimage_freebuffer(TCS_TileBuffer *self) +{ + TCS_Image *img = (TCS_Image*) self; + int x, y; + + for (x=0; x<img->tilex; x++) { + for (y=0; y<img->tiley; y++) { + TCS_UnlinkTile(&img->tilerect[y*img->tilex+x]); + MEM_freeN(img->tilerect[y*img->tilex+x].data.c); + } + } + MEM_freeN(img->tilerect); +} + +static void *tcsimage_get_tile(TCS_TileBuffer *self, int x, int y, int z) +{ + TCS_Image *img = (TCS_Image*) self; + + return &img->tilerect[y*img->tilex+x]; +} + +static int tcsimage_get_tile_size(TCS_TileBuffer *self) +{ + return TCSIMAGE_MAX_TILESIZE; +} + +static int tcsimage_get_sizex(TCS_TileBuffer *self) +{ + TCS_Image *img = (TCS_Image*) self; + + return img->sizex; +} + +static int tcsimage_get_sizey(TCS_TileBuffer *self) +{ + TCS_Image *img = (TCS_Image*) self; + + return img->sizey; +} + +TCS_TileBuffer TCSImageBufferType = { + NULL, NULL, + NULL, + tcsimage_freebuffer, + tcsimage_get_tile, + tcsimage_get_tile_size, + tcsimage_get_tile_size, + tcsimage_get_sizex, + tcsimage_get_sizey, + 0, + NULL +}; + +TCS_TilePool **pools_table[2] = {&img_float_pool, &img_byte_pool}; + +/*note: initcolor is allowed to be NuLL*/ +TCS_Image *TCSImage_newImage(int sizex, int sizey, int type, int totchannels, void *initcolor) +{ + TCS_Image *img = MEM_callocN(sizeof(TCS_Image), "TCS_Image"); + TCS_ImageTile *tile; + float fac; + int x, y, a; + + img->sizex = sizex; + img->sizey = sizey; + img->tilex = sizex / TCSIMAGE_MAX_TILESIZE; + img->tiley = sizey / TCSIMAGE_MAX_TILESIZE; + img->type = type; + img->totchannels = totchannels; + TCS_InitBuffer(&TCSImageBufferType, img); + + tcsimage_pools_check(); + img->buffer.pool = *pools_table[type]; + + if (totchannels > TCSIMAGE_MAX_TOTCHANNELS) { @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs