[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