diff options
author | Jiri Hnidek <jiri.hnidek@tul.cz> | 2006-08-20 19:22:56 +0400 |
---|---|---|
committer | Jiri Hnidek <jiri.hnidek@tul.cz> | 2006-08-20 19:22:56 +0400 |
commit | 2ee42ac01e6f4b154ac68976024af0615f7acb26 (patch) | |
tree | 9a2400a99bf7880a2f146c7a89bd2d8c0108374c /source/blender/src/verse_image.c | |
parent | ffe630b452f4abb28c105fca2b8eb9fdb6e72370 (diff) |
Huge commit: VERSE
- All code is in #ifdef ... #endif
- Only make build system is supported and you have to add:
export WITH_VERSE=true
to user-def.mk file
- Blender can share only mesh objects and bitmaps now
- More informations can be found at wiki:
http://mediawiki.blender.org/index.php/BlenderDev/VerseIntegrationToBlender
http://mediawiki.blender.org/index.php/BlenderDev/VerseIntegrationToBlenderUserDoc
I hope, that I didn't forget at anything
Diffstat (limited to 'source/blender/src/verse_image.c')
-rw-r--r-- | source/blender/src/verse_image.c | 345 |
1 files changed, 345 insertions, 0 deletions
diff --git a/source/blender/src/verse_image.c b/source/blender/src/verse_image.c new file mode 100644 index 00000000000..78da14220e8 --- /dev/null +++ b/source/blender/src/verse_image.c @@ -0,0 +1,345 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL 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. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * 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. + * + * Contributor(s): Jiri Hnidek. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#ifdef WITH_VERSE + +#include <string.h> + +#include "mydevice.h" + +#include "BKE_verse.h" + +#include "MEM_guardedalloc.h" + +#include "DNA_image_types.h" + +#include "IMB_imbuf_types.h" +#include "IMB_imbuf.h" + +#include "BDR_drawmesh.h" + +#include "BIF_verse.h" +#include "BIF_space.h" + +/* + * unsubscribe from verse bitmap + */ +void unsubscribe_from_bitmap_node(VNode *vnode) +{ + if(vnode->type != V_NT_BITMAP) return; + + /* TODO */ +} + +/* + * upload image to verse server + */ +void push_image_to_verse_server(VerseSession *session, Image *image) +{ + struct VNode *vnode; + + if(!session) return; + + if(!(session->flag & VERSE_CONNECTED)) return; + + /* create "my" new object VerseNode */ + vnode= create_verse_node(session->vsession, -1 , V_NT_BITMAP, VN_OWNER_MINE); + /* create object data */ + vnode->data = create_bitmap_data(); + + /* set up name of VerseNode */ + vnode->name = (char*)MEM_mallocN(sizeof(char*)*(strlen(image->id.name)-1), "object node name"); + vnode->name[0] = '\0'; + strcat(vnode->name, image->id.name+2); + + /* set up dimension of image */ + if(image->ibuf) { + ((VBitmapData*)vnode->data)->width = image->ibuf->x; + ((VBitmapData*)vnode->data)->height = image->ibuf->y; + } + else { + ((VBitmapData*)vnode->data)->width = 0; + ((VBitmapData*)vnode->data)->height = 0; + } + ((VBitmapData*)(vnode->data))->height = 1; + + /* set up pointers between Object and VerseNode */ + ((VBitmapData*)vnode->data)->image = (void*)image; + image->vnode = (void*)vnode; + + /* add node to sending queue */ + add_item_to_send_queue(&(session->queue), vnode, VERSE_NODE); +} + +/* + * synchronize blender image channel (R,G,B,A) with verse bitmap layer + */ +void sync_blender_image_channel_with_verse_layer(VNode *vnode, VBitmapLayer *vblayer) +{ + struct Image *image = (Image*)((VBitmapData*)(vnode->data))->image; + struct ImBuf *ibuf; + unsigned char *rect; + int x, y, height, t_width, i, channel=0; + + if(!image) return; + + ibuf = image->ibuf; + if(!ibuf) return; + + rect = (unsigned char*)ibuf->rect; + + /* select channel due to verse layer name */ + if(strcmp(vblayer->name,"col_r")==0) + channel = 0; + else if(strcmp(vblayer->name,"col_g")==0) + channel = 1; + else if(strcmp(vblayer->name, "col_b")==0) + channel = 2; + else if(strcmp(vblayer->name,"alpha")==0) + channel = 3; + +#ifdef VERSE_DEBUG_PRINT + printf(" %s:%d\n", vblayer->name, channel); +#endif + + height = ((VBitmapData*)(vnode->data))->height; + t_width = ((VBitmapData*)(vnode->data))->t_width; + + i = (height-1)*t_width; + +#ifdef VERSE_DEBUG_PRINT + printf("\ti:%d\n", i); +#endif + + if(vblayer->type==VN_B_LAYER_UINT8) { + unsigned char *vuint8 = (unsigned char*)vblayer->data; + for(y=height-1; y>=0; y--, i=y*t_width) + for(x=0; x<ibuf->x; x++, rect+=4, i++) + rect[channel] = (char)vuint8[i]; + } + + allqueue(REDRAWIMAGE, 0); + allqueue(REDRAWVIEW3D, 0); +} + +/* + * synchronize blender image with verse image + */ +void sync_blender_image_with_verse_bitmap_node(VNode *vnode) +{ + struct VBitmapLayer *vblayer; + + vblayer = ((VBitmapData*)(vnode->data))->layers.lb.first; + + while(vblayer) { +#ifdef VERSE_DEBUG_PRINT + printf("\tsyncing layer:"); +#endif + sync_blender_image_channel_with_verse_layer(vnode, vblayer); + vblayer = vblayer->next; + } +} + +/* + * This function is called, when some other verse client change dimension of image. + * It is neccesary to reallocate blender image too, when dimension of verse image + * is different from blender image. + */ +void post_bitmap_dimension_set(VNode *vnode) +{ + struct Image *image = (Image*)((VBitmapData*)(vnode->data))->image; + struct ImBuf *ibuf; + + if(!image) return; + + ibuf = image->ibuf; + if(!ibuf) return; + + if(vnode->owner_id == VN_OWNER_MINE) { + if( ((VBitmapData*)vnode->data)->layers.lb.first == NULL ) { + /* send all verse bitmap layers (RGBA) to verse server */ + printf("\tsending all bitmap layers to verse server\n"); + verse_send_b_layer_create(vnode->id, -1, "col_r", VN_B_LAYER_UINT8); + verse_send_b_layer_create(vnode->id, -1, "col_g", VN_B_LAYER_UINT8); + verse_send_b_layer_create(vnode->id, -1, "col_b", VN_B_LAYER_UINT8); + verse_send_b_layer_create(vnode->id, -1, "alpha", VN_B_LAYER_UINT8); + + return; + } + } + + if((ibuf->x!=((VBitmapData*)vnode->data)->width) || (ibuf->y!=((VBitmapData*)vnode->data)->height)) { + struct VBitmapLayer *vblayer; + struct ImBuf *new_ibuf; + + /* allocate new ibuf */ + new_ibuf= IMB_allocImBuf(((VBitmapData*)vnode->data)->width, + ((VBitmapData*)vnode->data)->height, 24, IB_rect, 0); + /* free old ibuf */ + IMB_freeImBuf(ibuf); + /* set up pointer at new ibuf */ + image->ibuf = new_ibuf; + + /* sync blender image with all verse layers */ + vblayer = ((VBitmapData*)(vnode->data))->layers.lb.first; + while(vblayer) { + sync_blender_image_channel_with_verse_layer(vnode, vblayer); + vblayer = vblayer->next; + } + } +} + +/* + * when blender tries to upload image to verse server, then it is neccessary + * to push coresponding channel data to verse server, when verse bitmap layer + * was created + */ +void post_bitmap_layer_create(VBitmapLayer *vblayer) +{ + struct VNode *vnode = vblayer->vnode; + struct Image *image = (Image*)((VBitmapData*)(vnode->data))->image; + struct ImBuf *ibuf; + unsigned char *rect; + short channel; +/* VNBTile tile[VN_B_TILE_SIZE*VN_B_TILE_SIZE]; + unsigned int width, t_width, height, t_height, x, y, i, j; */ + + /* if this application doesn't try to upload this image to verse + * server then do nothing */ + if(vnode->owner_id != VN_OWNER_MINE) return; + + if(!image) return; + + ibuf = image->ibuf; + if(!ibuf) return; + + rect = (unsigned char*)ibuf->rect; + + if(strncmp(vblayer->name, "col_r", 5)) + channel = 0; + else if(strncmp(vblayer->name, "col_g", 5)) + channel = 1; + else if(strncmp(vblayer->name, "col_b", 5)) + channel = 2; + else if(strncmp(vblayer->name, "alpha", 5)) + channel = 3; + + /* TODO: send all data of channel to verse server */ +} + +/* + * dummy function now + */ +void post_bitmap_layer_destroy(VBitmapLayer *vblayer) +{ +} + +/* + * this function is executed, when some image changed tile comes from verse server, + * it is neccessary to do some crazy transformation here, because blender uses + * different (very unstandard) image coordinate system (begining of coordinate + * system is in bottom left corner) ... all other programs (including verse) has + * begining of image coordinate system in left top corner + */ +void post_bitmap_tile_set(VBitmapLayer *vblayer, unsigned int xs, unsigned int ys) +{ + struct VNode *vnode = vblayer->vnode; + struct Image *image = (Image*)((VBitmapData*)(vnode->data))->image; + struct ImBuf *ibuf; + unsigned char *rect, *i_rect; + unsigned int x, y, t_width, t_height, height, m_ys, m_y, d, i, j, channel=0; + + if(!image) return; + + ibuf = image->ibuf; + if(!ibuf) return; + + /* select channel due to verse layer name */ + if(strcmp(vblayer->name,"col_r")==0) + channel = 0; + else if(strcmp(vblayer->name,"col_g")==0) + channel = 1; + else if(strcmp(vblayer->name, "col_b")==0) + channel = 2; + else if(strcmp(vblayer->name,"alpha")==0) + channel = 3; + + i_rect = rect = (unsigned char*)ibuf->rect; + + /* width of verse image including all tiles */ + t_width =((VBitmapData*)vnode->data)->t_width; + /* height of verse image including all tiles */ + t_height =((VBitmapData*)vnode->data)->t_height; + /* height of blender image */ + height = ((VBitmapData*)vnode->data)->height; + + /* if the bitmap's dimensions are not integer multiples of the tile + * side length, eight, then d will not be zero (height of "uncomplete + * tile") */ + d = VN_B_TILE_SIZE - (t_height - height); + /* mirrored coordination of received tile */ + m_ys = t_height - ys - VN_B_TILE_SIZE; + + /* ys and m_ys are y axis, where we will do some changes */ + if(ys + VN_B_TILE_SIZE > height) { + m_ys = 0; + ys = ys + d - 1; + } + else { + m_ys = m_ys - VN_B_TILE_SIZE + d; + ys = ys + VN_B_TILE_SIZE - 1; + } + + /* "index" of blender image */ + j = m_ys*ibuf->x + xs; + /* index of verse image */ + i = ys*t_width + xs; + + /* pointer at image data, that will be changed in following loop */ + rect = i_rect + 4*j; + + /* it seems hackish, but I didn't find better solution :-/ */ + if(vblayer->type==VN_B_LAYER_UINT8) { + unsigned char *vuint8 = (unsigned char*)vblayer->data; + for(y=ys, m_y = m_ys; + (m_y<m_ys+VN_B_TILE_SIZE) && (m_y<ibuf->y); + y--, m_y++, i=y*t_width+xs, j=m_y*ibuf->x+xs, rect=i_rect+4*j) + for(x=xs; (x<xs+VN_B_TILE_SIZE) && (x<ibuf->x); x++, rect+=4, i++, j++) + rect[channel] = (char)vuint8[i]; + } + + free_realtime_image(image); + + /* redraw preview of image ... uncommented, because rendering + * was computed too often */ +/* BIF_preview_changed(ID_TE); */ + allqueue(REDRAWIMAGE, 0); + allqueue(REDRAWVIEW3D, 0); +} + +#endif + |