Revision: 41473
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41473
Author:   blendix
Date:     2011-11-02 18:20:53 +0000 (Wed, 02 Nov 2011)
Log Message:
-----------
RenderEngine api: support for viewport rendering, details here:
http://wiki.blender.org/index.php/Dev:2.6/Source/Render/RenderEngineAPI

* This adds a Rendered draw type in the 3D view, only available when
  the render engine implements the view_draw callback.
* 3D view now stores a pointer to a RenderEngine.

* view_draw() callback will do OpenGL drawing instead of the viewport.
* view_update() callback is called after depsgraph updates.

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/include/ED_render.h
    trunk/blender/source/blender/editors/render/render_update.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/space_view3d/space_view3d.c
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
    trunk/blender/source/blender/makesdna/DNA_object_types.h
    trunk/blender/source/blender/makesdna/DNA_view3d_types.h
    trunk/blender/source/blender/makesrna/intern/rna_render.c
    trunk/blender/source/blender/makesrna/intern/rna_scene.c
    trunk/blender/source/blender/makesrna/intern/rna_space.c
    trunk/blender/source/blender/render/extern/include/RE_engine.h
    trunk/blender/source/blender/render/intern/source/external_engine.c
    trunk/blender/source/blender/windowmanager/intern/wm_draw.c
    trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
    trunk/blender/source/blenderplayer/bad_level_call_stubs/stubs.c

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c   2011-11-02 
16:19:57 UTC (rev 41472)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c   2011-11-02 
18:20:53 UTC (rev 41473)
@@ -140,6 +140,8 @@
 #include "BLO_readfile.h"
 #include "BLO_undofile.h"
 
+#include "RE_engine.h"
+
 #include "readfile.h"
 
 #include "PIL_time.h"
@@ -5089,6 +5091,7 @@
                                if(sl->spacetype==SPACE_VIEW3D) {
                                        View3D *v3d= (View3D*) sl;
                                        BGpic *bgpic;
+                                       ARegion *ar;
                                        
                                        if(v3d->scenelock)
                                                v3d->camera= NULL; /* always 
get from scene */
@@ -5124,6 +5127,15 @@
                                        /* not very nice, but could help */
                                        if((v3d->layact & v3d->lay)==0) 
v3d->layact= v3d->lay;
                                        
+                                       /* free render engines for now */
+                                       for(ar= sa->regionbase.first; ar; ar= 
ar->next) {
+                                               RegionView3D *rv3d= 
ar->regiondata;
+
+                                               if(rv3d && rv3d->render_engine) 
{
+                                                       
RE_engine_free(rv3d->render_engine);
+                                                       rv3d->render_engine= 
NULL;
+                                               }
+                                       }
                                }
                                else if(sl->spacetype==SPACE_IPO) {
                                        SpaceIpo *sipo= (SpaceIpo *)sl;
@@ -5262,6 +5274,7 @@
                        
                        rv3d->depths= NULL;
                        rv3d->ri= NULL;
+                       rv3d->render_engine= NULL;
                        rv3d->sms= NULL;
                        rv3d->smooth_timer= NULL;
                }
@@ -5403,6 +5416,10 @@
                                v3d->afterdraw_xray.first= 
v3d->afterdraw_xray.last= NULL;
                                v3d->afterdraw_xraytransp.first= 
v3d->afterdraw_xraytransp.last= NULL;
                                v3d->properties_storage= NULL;
+
+                               /* render can be quite heavy, set to wire on 
load */
+                               if(v3d->drawtype == OB_RENDER)
+                                       v3d->drawtype = OB_WIRE;
                                
                                view3d_split_250(v3d, &sl->regionbase);
                        }
@@ -10696,7 +10713,7 @@
                        Object *ob=main->object.first;
                        while (ob) {
                                /* shaded mode disabled for now */
-                               if (ob->dt == OB_SHADED) ob->dt = OB_TEXTURE;
+                               if (ob->dt == OB_MATERIAL) ob->dt = OB_TEXTURE;
                                ob=ob->id.next;
                        }
                }
@@ -10711,7 +10728,7 @@
                                        for(sl= sa->spacedata.first; sl; sl= 
sl->next) {
                                                if(sl->spacetype==SPACE_VIEW3D) 
{
                                                        View3D *v3d = (View3D 
*)sl;
-                                                       if (v3d->drawtype == 
OB_SHADED) v3d->drawtype = OB_SOLID;
+                                                       if (v3d->drawtype == 
OB_MATERIAL) v3d->drawtype = OB_SOLID;
                                                }
                                        }
                                }

Modified: trunk/blender/source/blender/editors/include/ED_render.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_render.h    2011-11-02 
16:19:57 UTC (rev 41472)
+++ trunk/blender/source/blender/editors/include/ED_render.h    2011-11-02 
18:20:53 UTC (rev 41473)
@@ -44,6 +44,8 @@
 /* render_shading.c */
 
 void ED_render_id_flush_update(struct Main *bmain, struct ID *id);
+void ED_render_engine_changed(struct Main *bmain);
+void ED_render_engine_update_tagged(struct bContext *C, struct Main *bmain);
 
 /* render_preview.c */
 

Modified: trunk/blender/source/blender/editors/render/render_update.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_update.c 2011-11-02 
16:19:57 UTC (rev 41472)
+++ trunk/blender/source/blender/editors/render/render_update.c 2011-11-02 
18:20:53 UTC (rev 41473)
@@ -56,11 +56,110 @@
 
 #include "GPU_material.h"
 
+#include "RE_engine.h"
+
 #include "ED_node.h"
 #include "ED_render.h"
 
 #include "render_intern.h"     // own include
 
+/***************************** Render Engines ********************************/
+
+void ED_render_engine_update_tagged(bContext *C, Main *bmain)
+{
+       /* viewport rendering update on data changes, happens after depsgraph
+        * updates if there was any change. context is set to the 3d view */
+       bScreen *sc, *prev_sc= CTX_wm_screen(C);
+       ScrArea *sa, *prev_sa= CTX_wm_area(C);
+       ARegion *ar, *prev_ar= CTX_wm_region(C);
+
+       for(sc=bmain->screen.first; sc; sc=sc->id.next) {
+               for(sa=sc->areabase.first; sa; sa=sa->next) {
+                       if(sa->spacetype != SPACE_VIEW3D)
+                               continue;
+
+                       for(ar=sa->regionbase.first; ar; ar=ar->next) {
+                               RegionView3D *rv3d;
+                               RenderEngine *engine;
+
+                               if(ar->regiontype != RGN_TYPE_WINDOW)
+                                       continue;
+
+                               rv3d= ar->regiondata;
+                               engine= rv3d->render_engine;
+
+                               if(engine && (engine->flag & 
RE_ENGINE_DO_UPDATE)) {
+                                       CTX_wm_screen_set(C, sc);
+                                       CTX_wm_area_set(C, sa);
+                                       CTX_wm_region_set(C, ar);
+
+                                       engine->flag &= ~RE_ENGINE_DO_UPDATE;
+                                       engine->type->view_update(engine, C);
+                               }
+                       }
+               }
+       }
+
+       CTX_wm_screen_set(C, prev_sc);
+       CTX_wm_area_set(C, prev_sa);
+       CTX_wm_region_set(C, prev_ar);
+}
+
+void ED_render_engine_changed(Main *bmain)
+{
+       /* on changing the render engine type, clear all running render engines 
*/
+       bScreen *sc;
+       ScrArea *sa;
+       ARegion *ar;
+
+       for(sc=bmain->screen.first; sc; sc=sc->id.next) {
+               for(sa=sc->areabase.first; sa; sa=sa->next) {
+                       if(sa->spacetype != SPACE_VIEW3D)
+                               continue;
+
+                       for(ar=sa->regionbase.first; ar; ar=ar->next) {
+                               RegionView3D *rv3d;
+
+                               if(ar->regiontype != RGN_TYPE_WINDOW)
+                                       continue;
+                               
+                               rv3d= ar->regiondata;
+
+                               if(rv3d->render_engine) {
+                                       RE_engine_free(rv3d->render_engine);
+                                       rv3d->render_engine= NULL;
+                               }
+                       }
+               }
+       }
+}
+
+static void tag_render_engines(Main *bmain)
+{
+       /* tag running render engines for update later on */
+       bScreen *sc;
+       ScrArea *sa;
+       ARegion *ar;
+
+       for(sc=bmain->screen.first; sc; sc=sc->id.next) {
+               for(sa=sc->areabase.first; sa; sa=sa->next) {
+                       if(sa->spacetype != SPACE_VIEW3D)
+                               continue;
+
+                       for(ar=sa->regionbase.first; ar; ar=ar->next) {
+                               RegionView3D *rv3d;
+
+                               if(ar->regiontype != RGN_TYPE_WINDOW)
+                                       continue;
+                               
+                               rv3d= ar->regiondata;
+                               if(rv3d->render_engine)
+                                       rv3d->render_engine->flag |= 
RE_ENGINE_DO_UPDATE;
+                       }
+               }
+       }
+}
+
 /***************************** Updates ***********************************
  * ED_render_id_flush_update gets called from DAG_id_tag_update, to do *
  * editor level updates when the ID changes. when these ID blocks are in *
@@ -220,8 +319,10 @@
 
 void ED_render_id_flush_update(Main *bmain, ID *id)
 {
-       if(!id)
+       if(!id) {
+               tag_render_engines(bmain);
                return;
+       }
 
        switch(GS(id->name)) {
                case ID_MA:

Modified: trunk/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawobject.c      
2011-11-02 16:19:57 UTC (rev 41472)
+++ trunk/blender/source/blender/editors/space_view3d/drawobject.c      
2011-11-02 18:20:53 UTC (rev 41473)
@@ -104,7 +104,7 @@
 
 /* this condition has been made more complex since editmode can draw textures 
*/
 #define CHECK_OB_DRAWTEXTURE(vd, dt) \
-((vd->drawtype==OB_TEXTURE && dt>OB_SOLID) || \
+       ((vd->drawtype==OB_TEXTURE && dt>OB_SOLID) || \
        (vd->drawtype==OB_SOLID && vd->flag2 & V3D_SOLID_TEX))
 
 static void draw_bounding_volume(Scene *scene, Object *ob);
@@ -2696,8 +2696,7 @@
        totface = dm->getNumFaces(dm);
        
        /* vertexpaint, faceselect wants this, but it doesnt work for shaded? */
-       if(dt!=OB_SHADED)
-               glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
+       glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
 
                // Unwanted combination.
        if (is_paint_sel) draw_wire = 0;
@@ -2814,7 +2813,7 @@
                                dm->drawLooseEdges(dm);
                }
        }
-       else if(dt==OB_SHADED) {
+       else if(dt==OB_PAINT) {
                if(ob==OBACT) {
                        if(ob && ob->mode & OB_MODE_WEIGHT_PAINT) {
                                /* enforce default material settings */
@@ -5955,7 +5954,9 @@
        }
 
        /* maximum drawtype */
-       dt= MIN2(v3d->drawtype, ob->dt);
+       dt= v3d->drawtype;
+       if(dt==OB_RENDER) dt= OB_SOLID;
+       dt= MIN2(dt, ob->dt);
        if(v3d->zbuf==0 && dt>OB_WIRE) dt= OB_WIRE;
        dtx= 0;
 
@@ -5970,7 +5971,7 @@
                                        dt= OB_SOLID;
                                }
                                else {
-                                       dt= OB_SHADED;
+                                       dt= OB_PAINT;
                                }
 
                                glEnable(GL_DEPTH_TEST);

Modified: trunk/blender/source/blender/editors/space_view3d/space_view3d.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/space_view3d.c    
2011-11-02 16:19:57 UTC (rev 41472)
+++ trunk/blender/source/blender/editors/space_view3d/space_view3d.c    
2011-11-02 18:20:53 UTC (rev 41473)
@@ -56,6 +56,7 @@
 #include "WM_api.h"
 #include "WM_types.h"
 
+#include "RE_engine.h"
 
 #include "RNA_access.h"
 
@@ -344,6 +345,9 @@
                v3do->lay= v3dn->localvd->lay;
                v3do->lay &= 0xFFFFFF;
        }
+
+       if(v3dn->drawtype == OB_RENDER)
+               v3dn->drawtype = OB_SOLID;
        
        /* copy or clear inside new stuff */
 
@@ -549,6 +553,9 @@
                if(rv3d->ri) { 
                        // XXX          BIF_view3d_previewrender_free(rv3d);
                }
+
+               if(rv3d->render_engine)
+                       RE_engine_free(rv3d->render_engine);
                
                if(rv3d->depths) {
                        if(rv3d->depths->depths) 
MEM_freeN(rv3d->depths->depths);
@@ -573,6 +580,7 @@
                
                new->depths= NULL;
                new->ri= NULL;
+               new->render_engine= NULL;
                new->gpd= NULL;
                new->sms= NULL;
                new->smooth_timer= NULL;

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c     
2011-11-02 16:19:57 UTC (rev 41472)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c     
2011-11-02 18:20:53 UTC (rev 41473)
@@ -62,6 +62,7 @@
 #include "BKE_screen.h"
 #include "BKE_unit.h"
 
+#include "RE_engine.h"
 #include "RE_pipeline.h"       // make_stars
 
 #include "IMB_imbuf_types.h"
@@ -2518,6 +2519,62 @@
        BLF_draw_default_ascii(22,  ar->winy-17, 0.0f, printable, 
sizeof(printable)-1);
 }
 
+static int view3d_main_area_draw_engine(const bContext *C, ARegion *ar)
+{
+       Scene *scene= CTX_data_scene(C);
+       View3D *v3d = CTX_wm_view3d(C);
+       RegionView3D *rv3d= CTX_wm_region_view3d(C);
+       RenderEngineType *type;
+
+       if(!rv3d->render_engine) {
+               type= RE_engines_find(scene->r.engine);
+
+               if(!(type->view_update && type->view_draw))
+                       return 0;
+
+               rv3d->render_engine= RE_engine_create(type);
+               type->view_update(rv3d->render_engine, C);
+       }
+
+       view3d_main_area_setup_view(scene, v3d, ar, NULL, NULL);
+
+       glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+       glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+       ED_region_pixelspace(ar);
+
+       type= rv3d->render_engine->type;
+       type->view_draw(rv3d->render_engine, C);
+
+       return 1;
+}
+
+static void view3d_main_area_draw_engine_info(RegionView3D *rv3d, ARegion *ar)
+{
+       rcti rect;
+       const int header_height = 18;
+
+       if(!rv3d->render_engine || !rv3d->render_engine->text)
+               return;
+       
+       /* background box */
+       rect= ar->winrct;
+       rect.xmin= 0;

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to