[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41473] trunk/blender/source: RenderEngine api: support for viewport rendering, details here:

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Nov 2 19:20:54 CET 2011


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. @@



More information about the Bf-blender-cvs mailing list