Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/src/previewrender.c')
-rw-r--r--source/blender/src/previewrender.c912
1 files changed, 0 insertions, 912 deletions
diff --git a/source/blender/src/previewrender.c b/source/blender/src/previewrender.c
deleted file mode 100644
index 2f7b4754d76..00000000000
--- a/source/blender/src/previewrender.c
+++ /dev/null
@@ -1,912 +0,0 @@
-/*
- * $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.
- *
- * 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/BL DUAL LICENSE BLOCK *****
- */
-
-/* global includes */
-
-#include <stdlib.h>
-#include <math.h>
-#include <string.h>
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifndef WIN32
-#include <unistd.h>
-#else
-#include <io.h>
-#endif
-#include "MEM_guardedalloc.h"
-
-#include "BLI_arithb.h"
-#include "BLI_blenlib.h"
-
-#include "MTC_matrixops.h"
-
-#include "DNA_texture_types.h"
-#include "DNA_world_types.h"
-#include "DNA_camera_types.h"
-#include "DNA_image_types.h"
-#include "DNA_material_types.h"
-#include "DNA_node_types.h"
-#include "DNA_object_types.h"
-#include "DNA_lamp_types.h"
-#include "DNA_space_types.h"
-#include "DNA_view3d_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
-
-#include "BKE_depsgraph.h"
-#include "BKE_global.h"
-#include "BKE_image.h"
-#include "BKE_icons.h"
-#include "BKE_library.h"
-#include "BKE_main.h"
-#include "BKE_texture.h"
-#include "BKE_material.h"
-#include "BKE_node.h"
-#include "BKE_world.h"
-#include "BKE_texture.h"
-#include "BKE_utildefines.h"
-
-#include "IMB_imbuf.h"
-#include "IMB_imbuf_types.h"
-
-#include "BSE_headerbuttons.h"
-#include "BSE_node.h"
-#include "BSE_view.h"
-
-#include "BIF_gl.h"
-#include "BIF_screen.h"
-#include "BIF_space.h" /* allqueue */
-#include "BIF_butspace.h"
-#include "BIF_mywindow.h"
-#include "BIF_interface.h"
-#include "BIF_glutil.h"
-
-#include "BIF_previewrender.h" /* include ourself for prototypes */
-
-#include "PIL_time.h"
-
-#include "RE_pipeline.h"
-#include "BLO_readfile.h"
-
-#include "blendef.h" /* CLAMP */
-#include "interface.h" /* ui_graphics_to_window(), SOLVE! (ton) */
-#include "mydevice.h"
-
-
-#define PR_XMIN 10
-#define PR_YMIN 5
-#define PR_XMAX 200
-#define PR_YMAX 195
-
-
-static void set_previewrect(RenderInfo *ri, int win)
-{
- rctf viewplane;
-
- BLI_init_rctf(&viewplane, PR_XMIN, PR_XMAX, PR_YMIN, PR_YMAX);
-
- ui_graphics_to_window_rct(win, &viewplane, &ri->disprect);
-
- /* correction for gla draw */
- BLI_translate_rcti(&ri->disprect, -curarea->winrct.xmin, -curarea->winrct.ymin);
-
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
-
- glaDefine2DArea(&curarea->winrct);
-
- ri->pr_rectx= (ri->disprect.xmax-ri->disprect.xmin);
- ri->pr_recty= (ri->disprect.ymax-ri->disprect.ymin);
-}
-
-static void end_previewrect(void)
-{
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
-
- // restore viewport / scissor which was set by glaDefine2DArea
- glViewport(curarea->winrct.xmin, curarea->winrct.ymin, curarea->winx, curarea->winy);
- glScissor(curarea->winrct.xmin, curarea->winrct.ymin, curarea->winx, curarea->winy);
-
-}
-
-/* unused now */
-void draw_tex_crop(Tex *tex)
-{
- rcti rct;
- int ret= 0;
-
- if(tex==0) return;
-
- if(tex->type==TEX_IMAGE) {
- if(tex->cropxmin==0.0f) ret++;
- if(tex->cropymin==0.0f) ret++;
- if(tex->cropxmax==1.0f) ret++;
- if(tex->cropymax==1.0f) ret++;
- if(ret==4) return;
-
- rct.xmin= PR_XMIN+2+tex->cropxmin*(PR_XMAX-PR_XMIN-4);
- rct.xmax= PR_XMIN+2+tex->cropxmax*(PR_XMAX-PR_XMIN-4);
- rct.ymin= PR_YMIN+2+tex->cropymin*(PR_YMAX-PR_YMIN-4);
- rct.ymax= PR_YMIN+2+tex->cropymax*(PR_YMAX-PR_YMIN-4);
-
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
-
- glColor3ub(0, 0, 0);
- glRecti(rct.xmin+1, rct.ymin-1, rct.xmax+1, rct.ymax-1);
-
- glColor3ub(255, 255, 255);
- glRecti(rct.xmin, rct.ymin, rct.xmax, rct.ymax);
-
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- }
-
-}
-
-/* temporal abuse; if id_code is -1 it only does texture.... solve! */
-void BIF_preview_changed(short id_code)
-{
- ScrArea *sa;
-
- for(sa= G.curscreen->areabase.first; sa; sa= sa->next) {
- if(sa->spacetype==SPACE_BUTS) {
- SpaceButs *sbuts= sa->spacedata.first;
- if(sbuts->mainb==CONTEXT_SHADING) {
- int tab= sbuts->tab[CONTEXT_SHADING];
- if(tab==TAB_SHADING_MAT && (id_code==ID_MA || id_code==ID_TE)) {
- if (sbuts->ri) sbuts->ri->curtile= 0;
- addafterqueue(sa->win, RENDERPREVIEW, 1);
- }
- else if(tab==TAB_SHADING_TEX && (id_code==ID_TE || id_code==-1)) {
- if (sbuts->ri) sbuts->ri->curtile= 0;
- addafterqueue(sa->win, RENDERPREVIEW, 1);
- }
- else if(tab==TAB_SHADING_LAMP && (id_code==ID_LA || id_code==ID_TE)) {
- if (sbuts->ri) sbuts->ri->curtile= 0;
- addafterqueue(sa->win, RENDERPREVIEW, 1);
- }
- else if(tab==TAB_SHADING_WORLD && (id_code==ID_WO || id_code==ID_TE)) {
- if (sbuts->ri) sbuts->ri->curtile= 0;
- addafterqueue(sa->win, RENDERPREVIEW, 1);
- }
- }
- else if (sbuts->ri)
- sbuts->ri->curtile= 0; /* ensure changes always result in re-render when context is restored */
- }
- else if(sa->spacetype==SPACE_NODE) {
- SpaceNode *snode= sa->spacedata.first;
- if(snode->treetype==NTREE_SHADER && (id_code==ID_MA || id_code==ID_TE)) {
- snode_tag_dirty(snode);
- }
- }
- else if(sa->spacetype==SPACE_VIEW3D) {
- View3D *vd= sa->spacedata.first;
- /* if is has a renderinfo, we consider that reason for signalling */
- if (vd->ri) {
- vd->ri->curtile= 0;
- addafterqueue(sa->win, RENDERPREVIEW, 1);
- }
- }
- }
-}
-
-/* *************************** Preview for buttons *********************** */
-
-static Main *pr_main= NULL;
-
-void BIF_preview_init_dbase(void)
-{
- BlendReadError bre;
- BlendFileData *bfd;
- extern int datatoc_preview_blend_size;
- extern char datatoc_preview_blend[];
-
- G.fileflags |= G_FILE_NO_UI;
- bfd= BLO_read_from_memory(datatoc_preview_blend, datatoc_preview_blend_size, &bre);
- if (bfd) {
- pr_main= bfd->main;
-
- MEM_freeN(bfd);
- }
- G.fileflags &= ~G_FILE_NO_UI;
-}
-
-void BIF_preview_free_dbase(void)
-{
- if(pr_main)
- free_main(pr_main);
-}
-
-/* call this with an ID pointer to initialize preview scene */
-/* call this with ID NULL to restore assigned ID pointers in preview scene */
-static Scene *preview_prepare_scene(RenderInfo *ri, int id_type, ID *id, int pr_method)
-{
- Scene *sce;
- Base *base;
-
- if(pr_main==NULL) return NULL;
-
- sce= pr_main->scene.first;
- if(sce) {
-
- // sce->r.mode |= G.scene->r.mode & R_THREADS;
- /* this flag tells render to not execute depsgraph or ipos etc */
- sce->r.scemode |= R_PREVIEWBUTS;
- /* set world always back, is used now */
- sce->world= pr_main->world.first;
-
- sce->r.cfra= G.scene->r.cfra;
-
- if(id_type==ID_MA) {
- Material *mat= (Material *)id;
-
- if(id) {
- init_render_material(mat, 0, NULL); /* call that retrieves mode_l */
- end_render_material(mat);
-
- /* turn on raytracing if needed */
- if(mat->mode_l & (MA_RAYTRANSP|MA_RAYMIRROR))
- sce->r.mode |= R_RAYTRACE;
- if(mat->sss_flag & MA_DIFF_SSS)
- sce->r.mode |= R_SSS;
-
- /* turn off fake shadows if needed */
- /* this only works in a specific case where the preview.blend contains
- * an object starting with 'c' which has a material linked to it (not the obdata)
- * and that material has a fake shadow texture in the active texture slot */
- for(base= sce->base.first; base; base= base->next) {
- if(base->object->id.name[2]=='c') {
- Material *shadmat= give_current_material(base->object, base->object->actcol);
- if(shadmat) {
- if (mat->mode & MA_SHADBUF) shadmat->septex = 0;
- else shadmat->septex |= 1;
- }
- }
- }
-
-
- if(pr_method==PR_ICON_RENDER) {
- if (mat->mode & MA_HALO) {
- sce->lay= 1<<MA_FLAT;
- }
- else {
- sce->lay= 1<<MA_SPHERE_A;
- }
- }
- else {
- sce->lay= 1<<mat->pr_type;
- if(mat->nodetree)
- ntreeInitPreview(mat->nodetree, ri->pr_rectx, ri->pr_recty);
- }
- }
- else {
- sce->r.mode &= ~(R_OSA|R_RAYTRACE|R_SSS);
- }
-
- for(base= sce->base.first; base; base= base->next) {
- if(base->object->id.name[2]=='p') {
- if(ELEM4(base->object->type, OB_MESH, OB_CURVE, OB_SURF, OB_MBALL))
- assign_material(base->object, mat, base->object->actcol);
- }
- }
- }
- else if(id_type==ID_TE) {
- Tex *tex= (Tex *)id;
-
- sce->lay= 1<<MA_TEXTURE;
-
- for(base= sce->base.first; base; base= base->next) {
- if(base->object->id.name[2]=='t') {
- Material *mat= give_current_material(base->object, base->object->actcol);
- if(mat && mat->mtex[0]) {
- mat->mtex[0]->tex= tex;
- /* show alpha in this case */
- if(tex==NULL || (tex->flag & TEX_PRV_ALPHA)) {
- mat->mtex[0]->mapto |= MAP_ALPHA;
- mat->alpha= 0.0f;
- }
- else {
- mat->mtex[0]->mapto &= ~MAP_ALPHA;
- mat->alpha= 1.0f;
- }
- }
- }
- }
- }
- else if(id_type==ID_LA) {
- Lamp *la= (Lamp *)id;
-
- sce->lay= 1<<MA_LAMP;
- sce->r.mode &= ~R_SHADOW;
-
- for(base= sce->base.first; base; base= base->next) {
- if(base->object->id.name[2]=='p') {
- if(base->object->type==OB_LAMP)
- base->object->data= la;
- }
- }
- }
- else if(id_type==ID_WO) {
- sce->lay= 1<<MA_SKY;
- sce->world= (World *)id;
- }
-
- return sce;
- }
-
- return NULL;
-}
-
-static void previewrender_progress(RenderResult *rr, volatile rcti *renrect)
-{
- RenderLayer *rl;
- RenderInfo *ri= G.buts->ri;
- float ofsx, ofsy;
-
- if(renrect) return;
-
- rl= rr->layers.first;
-
- ofsx= ri->disprect.xmin + rr->tilerect.xmin;
- ofsy= ri->disprect.ymin + rr->tilerect.ymin;
-
- glDrawBuffer(GL_FRONT);
- glaDrawPixelsSafe_to32(ofsx, ofsy, rr->rectx, rr->recty, rr->rectx, rl->rectf);
- bglFlush();
- glDrawBuffer(GL_BACK);
-}
-
-
-/* called by interface_icons.c, or by BIF_previewrender_buts or by nodes... */
-void BIF_previewrender(struct ID *id, struct RenderInfo *ri, struct ScrArea *area, int pr_method)
-{
- Render *re;
- RenderStats *rstats;
- Scene *sce;
- SpaceButs *sbuts= NULL;
- int oldx= ri->pr_rectx, oldy= ri->pr_recty;
- char name [32];
-
- if(ri->tottile && ri->curtile>=ri->tottile) return;
-
- /* check for return with a new event */
- if(pr_method!=PR_ICON_RENDER && qtest()) {
- if(area)
- addafterqueue(area->win, RENDERPREVIEW, 1);
- return;
- }
-
- /* get the stuff from the builtin preview dbase */
- sce= preview_prepare_scene(ri, GS(id->name), id, pr_method);
- if(sce==NULL) return;
-
- /* set drawing conditions OK */
- if(area) {
- sbuts= area->spacedata.first; /* needed for flag */
-
- set_previewrect(ri, area->win); // uses UImat
-
- /* because preview render size can differs */
- if(ri->rect && (oldx!=ri->pr_rectx || oldy!=ri->pr_recty)) {
- MEM_freeN(ri->rect);
- ri->rect= NULL;
- ri->curtile= 0;
- }
- }
-
- sprintf(name, "ButsPreview %d", area?area->win:0);
- re= RE_GetRender(name);
-
- /* full refreshed render from first tile */
- if(re==NULL || ri->curtile==0) {
-
- re= RE_NewRender(name);
-
- /* handle cases */
- if(pr_method==PR_DRAW_RENDER) {
- RE_display_draw_cb(re, previewrender_progress);
- RE_test_break_cb(re, qtest);
- sce->r.scemode |= R_NODE_PREVIEW;
- if(sbuts->flag & SB_PRV_OSA)
- sce->r.mode |= R_OSA;
- sce->r.scemode &= ~R_NO_IMAGE_LOAD;
- }
- else if(pr_method==PR_DO_RENDER) {
- RE_test_break_cb(re, qtest);
- sce->r.scemode |= R_NODE_PREVIEW;
- sce->r.scemode &= ~R_NO_IMAGE_LOAD;
- }
- else { /* PR_ICON_RENDER */
- sce->r.scemode &= ~R_NODE_PREVIEW;
- sce->r.scemode |= R_NO_IMAGE_LOAD;
- }
-
- /* allocates render result */
- RE_InitState(re, &sce->r, ri->pr_rectx, ri->pr_recty, NULL);
-
- /* enforce preview image clear */
- if(GS(id->name)==ID_MA) {
- Material *ma= (Material *)id;
- ntreeClearPreview(ma->nodetree);
- }
- }
- /* entire cycle for render engine */
- RE_SetCamera(re, sce->camera);
- RE_Database_FromScene(re, sce, 1);
- RE_TileProcessor(re, ri->curtile, 0); // actual render engine
- RE_Database_Free(re);
-
- /* handle results */
- if(pr_method==PR_ICON_RENDER) {
- if(ri->rect==NULL)
- ri->rect= MEM_mallocN(sizeof(int)*ri->pr_rectx*ri->pr_recty, "BIF_previewrender");
- RE_ResultGet32(re, ri->rect);
- }
- else {
- rstats= RE_GetStats(re);
-
- if(rstats->partsdone!=ri->curtile) {
- if(ri->rect==NULL)
- ri->rect= MEM_mallocN(sizeof(int)*ri->pr_rectx*ri->pr_recty, "BIF_previewrender");
- RE_ResultGet32(re, ri->rect);
- }
-
- if(rstats->totpart==rstats->partsdone && rstats->partsdone) {
- if(GS(id->name)==ID_MA && ((Material *)id)->use_nodes)
- allqueue(REDRAWNODE, 0);
- allqueue(REDRAWBUTSSHADING, 0);
- }
- else {
- if(pr_method==PR_DRAW_RENDER && qtest())
- addafterqueue(area->win, RENDERPREVIEW, 1);
- }
-
- ri->curtile= rstats->partsdone;
- ri->tottile= rstats->totpart;
- }
-
- /* unassign the pointers, reset vars */
- preview_prepare_scene(ri, GS(id->name), NULL, 0);
-
-}
-
-
-/* afterqueue call */
-void BIF_previewrender_buts(SpaceButs *sbuts)
-{
- uiBlock *block;
- struct ID* id = 0;
- struct ID* idfrom = 0;
- struct ID* idshow = 0;
- Object *ob;
-
- if (!sbuts->ri) return;
-
- /* we safely assume curarea has panel "preview" */
- /* quick hack for now, later on preview should become uiBlock itself */
-
- block= uiFindOpenPanelBlockName(&curarea->uiblocks, "Preview");
- if(block==NULL) return;
-
- ob= ((G.scene->basact)? (G.scene->basact)->object: 0);
-
- /* we cant trust this global lockpoin.. for example with headerless window */
- buttons_active_id(&id, &idfrom);
- G.buts->lockpoin= id;
-
- if(sbuts->mainb==CONTEXT_SHADING) {
- int tab= sbuts->tab[CONTEXT_SHADING];
-
- if(tab==TAB_SHADING_MAT)
- idshow = sbuts->lockpoin;
- else if(tab==TAB_SHADING_TEX)
- idshow = sbuts->lockpoin;
- else if(tab==TAB_SHADING_LAMP) {
- if(ob && ob->type==OB_LAMP) idshow= ob->data;
- }
- else if(tab==TAB_SHADING_WORLD)
- idshow = sbuts->lockpoin;
- }
- else if(sbuts->mainb==CONTEXT_OBJECT) {
- if(ob && ob->type==OB_LAMP) idshow = ob->data;
- }
-
- if (idshow) {
- BKE_icon_changed(BKE_icon_getid(idshow));
- uiPanelPush(block);
- BIF_previewrender(idshow, sbuts->ri, sbuts->area, PR_DRAW_RENDER);
- uiPanelPop(block);
- end_previewrect();
- }
- else {
- /* no active block to draw. But we do draw black if possible */
- if(sbuts->ri->rect) {
- memset(sbuts->ri->rect, 0, sizeof(int)*sbuts->ri->pr_rectx*sbuts->ri->pr_recty);
- sbuts->ri->tottile= 10000;
- addqueue(curarea->win, REDRAW, 1);
- }
- return;
- }
-}
-
-
-/* is panel callback, supposed to be called with correct panel offset matrix */
-void BIF_previewdraw(ScrArea *sa, uiBlock *block)
-{
- SpaceButs *sbuts= sa->spacedata.first;
- short id_code= 0;
-
- if(sbuts->lockpoin) {
- ID *id= sbuts->lockpoin;
- id_code= GS(id->name);
- }
-
- if (!sbuts->ri) {
- sbuts->ri= MEM_callocN(sizeof(RenderInfo), "butsrenderinfo");
- sbuts->ri->tottile = 10000;
- }
-
- if (sbuts->ri->rect==NULL) BIF_preview_changed(id_code);
- else {
- RenderInfo *ri= sbuts->ri;
- int oldx= ri->pr_rectx, oldy= ri->pr_recty;
-
- /* we now do scalable previews! */
- set_previewrect(ri, sa->win);
- if( ABS(oldx-ri->pr_rectx)<2 && ABS(oldy-ri->pr_recty)<2 ) {
- /* restore old values for drawing! */
- ri->pr_rectx= oldx;
- ri->pr_recty= oldy;
- glaDrawPixelsSafe(ri->disprect.xmin, ri->disprect.ymin, ri->pr_rectx, ri->pr_recty, ri->pr_rectx, GL_RGBA, GL_UNSIGNED_BYTE, ri->rect);
- }
- else {
- MEM_freeN(ri->rect);
- ri->rect= NULL;
- sbuts->ri->curtile= 0;
- }
- end_previewrect();
- }
- if(sbuts->ri->curtile==0) BIF_preview_changed(id_code);
-
-}
-
-/* *************************** Preview for 3d window *********************** */
-static void view3d_previewrender_stats(RenderStats *rs)
-{
-// if(rs->convertdone)
-// printf("rendered %d %.3f\n", rs->partsdone, rs->lastframetime);
-}
-
-static void view3d_previewrender_progress(RenderResult *rr, volatile rcti *renrect)
-{
- RenderLayer *rl;
- int ofsx, ofsy;
-
- if(renrect) return;
-
- rl= rr->layers.first;
-
- /* this case is when we render envmaps... */
- if(rr->rectx>G.vd->ri->pr_rectx || rr->recty>G.vd->ri->pr_recty)
- return;
-
- ofsx= G.vd->ri->disprect.xmin + rr->tilerect.xmin;
- ofsy= G.vd->ri->disprect.ymin + rr->tilerect.ymin;
-
- glDrawBuffer(GL_FRONT);
- glaDefine2DArea(&curarea->winrct);
- glaDrawPixelsSafe_to32(ofsx, ofsy, rr->rectx, rr->recty, rr->rectx, rl->rectf);
- bglFlush();
- glDrawBuffer(GL_BACK);
-
-}
-
-void BIF_view3d_previewrender_signal(ScrArea *sa, short signal)
-{
- View3D *v3d= sa->spacedata.first;
-
- /* this can be called from other window... solve! */
- if(sa->spacetype!=SPACE_VIEW3D)
- v3d= G.vd;
-
- if(v3d && v3d->ri) {
- RenderInfo *ri= v3d->ri;
- ri->status &= ~signal;
- ri->curtile= 0;
- //printf("preview signal %d\n", signal);
- if(ri->re && (signal & PR_DBASE))
- RE_Database_Free(ri->re);
-
- addafterqueue(sa->win, RENDERPREVIEW, 1);
- }
-}
-
-void BIF_view3d_previewrender_free(View3D *v3d)
-{
-
- if(v3d->ri) {
- RenderInfo *ri= v3d->ri;
- if(ri->re) {
-// printf("free render\n");
- RE_Database_Free(ri->re);
- RE_FreeRender(ri->re);
- ri->re= NULL;
- }
- if (v3d->ri->rect) MEM_freeN(v3d->ri->rect);
- MEM_freeN(v3d->ri);
- v3d->ri= NULL;
- }
-}
-
-/* returns 1 if OK, do not call while in panel space! */
-static int view3d_previewrender_get_rects(ScrArea *sa, rctf *viewplane, RenderInfo *ri, float *clipsta, float *clipend, int *ortho, float *pixsize)
-{
- int rectx, recty;
- uiBlock *block;
-
- block= uiFindOpenPanelBlockName(&curarea->uiblocks, "Preview");
- if(block==NULL) return 0;
-
- /* calculate preview rect size */
- BLI_init_rctf(viewplane, 15.0f, (block->maxx - block->minx)-15.0f, 15.0f, (block->maxy - block->miny)-15.0f);
- uiPanelPush(block);
- ui_graphics_to_window_rct(sa->win, viewplane, &ri->disprect);
- uiPanelPop(block);
-
- /* correction for gla draw */
- BLI_translate_rcti(&ri->disprect, -sa->winrct.xmin, -sa->winrct.ymin);
-
- *ortho= get_view3d_viewplane(sa->winx, sa->winy, viewplane, clipsta, clipend, pixsize);
-
- rectx= ri->disprect.xmax - ri->disprect.xmin;
- recty= ri->disprect.ymax - ri->disprect.ymin;
-
- if(rectx<4 || recty<4) return 0;
-
- if(ri->rect && (rectx!=ri->pr_rectx || recty!=ri->pr_recty)) {
- MEM_freeN(ri->rect);
- ri->rect= NULL;
- ri->curtile= 0;
- printf("changed size\n");
- }
- ri->pr_rectx= rectx;
- ri->pr_recty= recty;
-
- return 1;
-}
-
-/* called before a panel gets moved/scaled, makes sure we can see through */
-void BIF_view3d_previewrender_clear(ScrArea *sa)
-{
- View3D *v3d= sa->spacedata.first;
-
- if(v3d->ri) {
- RenderInfo *ri= v3d->ri;
- ri->curtile= 0;
- if(ri->rect)
- MEM_freeN(ri->rect);
- ri->rect= NULL;
- }
-}
-
-/* afterqueue call */
-void BIF_view3d_previewrender(ScrArea *sa)
-{
- View3D *v3d= sa->spacedata.first;
- Render *re;
- RenderInfo *ri; /* preview struct! */
- RenderStats *rstats;
- RenderData rdata;
- rctf viewplane;
- float clipsta, clipend, pixsize;
- int orth;
-
- /* first get the render info right */
- if (!v3d->ri) {
- ri= v3d->ri= MEM_callocN(sizeof(RenderInfo), "butsrenderinfo");
- ri->tottile= 10000;
- }
- ri= v3d->ri;
-
- if(0==view3d_previewrender_get_rects(sa, &viewplane, ri, &clipsta, &clipend, &orth, &pixsize))
- return;
-
- /* render is finished, so return */
- if(ri->tottile && ri->curtile>=ri->tottile) return;
-
- /* or return with a new event */
- if(qtest()) {
- addafterqueue(curarea->win, RENDERPREVIEW, 1);
- return;
- }
- //printf("Enter previewrender\n");
- /* ok, are we rendering all over? */
- if(ri->re==NULL) {
- char name[32];
-
- ri->status= 0;
-
- sprintf(name, "View3dPreview %d", sa->win);
- re= ri->re= RE_NewRender(name);
- RE_display_draw_cb(re, view3d_previewrender_progress);
- RE_stats_draw_cb(re, view3d_previewrender_stats);
- RE_test_break_cb(re, qtest);
-
- /* no osa, blur, seq, layers, etc for preview render */
- rdata= G.scene->r;
- rdata.mode &= ~(R_OSA|R_MBLUR);
- rdata.scemode &= ~(R_DOSEQ|R_DOCOMP|R_FREE_IMAGE);
- rdata.layers.first= rdata.layers.last= NULL;
- rdata.renderer= R_INTERN;
-
- RE_InitState(re, &rdata, sa->winx, sa->winy, &ri->disprect);
-
- if(orth)
- RE_SetOrtho(re, &viewplane, clipsta, clipend);
- else
- RE_SetWindow(re, &viewplane, clipsta, clipend);
- RE_SetPixelSize(re, pixsize);
-
- /* until here are no escapes */
- ri->status |= PR_DISPRECT;
- ri->curtile= 0;
- //printf("new render\n");
- }
-
- re= ri->re;
-
- PIL_sleep_ms(100); /* wait 0.1 second if theres really no event... */
- if(qtest()==0) {
-
- /* check status */
- if((ri->status & PR_DISPRECT)==0) {
- RE_SetDispRect(ri->re, &ri->disprect);
- if(orth)
- RE_SetOrtho(ri->re, &viewplane, clipsta, clipend);
- else
- RE_SetWindow(ri->re, &viewplane, clipsta, clipend);
- RE_SetPixelSize(re, pixsize);
- ri->status |= PR_DISPRECT;
- ri->curtile= 0;
- //printf("disprect update\n");
- }
- if((ri->status & PR_DBASE)==0) {
- unsigned int lay= G.scene->lay;
-
- RE_SetView(re, G.vd->viewmat);
-
- /* allow localview render for objects with lights in normal layers */
- if(v3d->lay & 0xFF000000)
- G.scene->lay |= v3d->lay;
- else G.scene->lay= v3d->lay;
-
- RE_Database_FromScene(re, G.scene, 0); // 0= dont use camera view
- G.scene->lay= lay;
-
- rstats= RE_GetStats(re);
- if(rstats->convertdone)
- ri->status |= PR_DBASE|PR_PROJECTED|PR_ROTATED;
- ri->curtile= 0;
-
- /* database can have created render-resol data... */
- if(rstats->convertdone)
- DAG_scene_update_flags(G.scene, screen_view3d_layers());
-
- //printf("dbase update\n");
- }
- if((ri->status & PR_PROJECTED)==0) {
- if(ri->status & PR_DBASE) {
- if(orth)
- RE_SetOrtho(ri->re, &viewplane, clipsta, clipend);
- else
- RE_SetWindow(ri->re, &viewplane, clipsta, clipend);
- RE_DataBase_ApplyWindow(re);
- ri->status |= PR_PROJECTED;
- }
- ri->curtile= 0;
- //printf("project update\n");
- }
-
- /* OK, can we enter render code? */
- if(ri->status==(PR_DISPRECT|PR_DBASE|PR_PROJECTED|PR_ROTATED)) {
- //printf("curtile %d tottile %d\n", ri->curtile, ri->tottile);
- RE_TileProcessor(ri->re, ri->curtile, 0);
-
- if(ri->rect==NULL)
- ri->rect= MEM_mallocN(sizeof(int)*ri->pr_rectx*ri->pr_recty, "preview view3d rect");
-
- RE_ResultGet32(ri->re, ri->rect);
- }
-
- rstats= RE_GetStats(ri->re);
- if(rstats->totpart==rstats->partsdone && rstats->partsdone)
- addqueue(sa->win, REDRAW, 1);
- else
- addafterqueue(curarea->win, RENDERPREVIEW, 1);
-
- ri->curtile= rstats->partsdone;
- ri->tottile= rstats->totpart;
- }
- else {
- addafterqueue(curarea->win, RENDERPREVIEW, 1);
- }
-
- //printf("\n");
-}
-
-/* in panel space! */
-static void view3d_previewdraw_rect(ScrArea *sa, uiBlock *block, RenderInfo *ri)
-{
- rctf dispf;
-
- if(ri->rect==NULL)
- return;
-
- BLI_init_rctf(&dispf, 15.0f, (block->maxx - block->minx)-15.0f, 15.0f, (block->maxy - block->miny)-15.0f);
- ui_graphics_to_window_rct(sa->win, &dispf, &ri->disprect);
-
- /* correction for gla draw */
- BLI_translate_rcti(&ri->disprect, -curarea->winrct.xmin, -curarea->winrct.ymin);
-
- /* when panel scale changed, free rect */
- if(ri->disprect.xmax-ri->disprect.xmin != ri->pr_rectx ||
- ri->disprect.ymax-ri->disprect.ymin != ri->pr_recty) {
- MEM_freeN(ri->rect);
- ri->rect= NULL;
- }
- else {
- glaDefine2DArea(&sa->winrct);
- glaDrawPixelsSafe(ri->disprect.xmin, ri->disprect.ymin, ri->pr_rectx, ri->pr_recty, ri->pr_rectx, GL_RGBA, GL_UNSIGNED_BYTE, ri->rect);
- }
-}
-
-/* is panel callback, supposed to be called with correct panel offset matrix */
-void BIF_view3d_previewdraw(struct ScrArea *sa, struct uiBlock *block)
-{
- View3D *v3d= sa->spacedata.first;
-
- if (v3d->ri==NULL || v3d->ri->rect==NULL)
- addafterqueue(sa->win, RENDERPREVIEW, 1);
- else {
- view3d_previewdraw_rect(sa, block, v3d->ri);
- if(v3d->ri->curtile==0)
- addafterqueue(sa->win, RENDERPREVIEW, 1);
- }
-}
-