diff options
author | Ton Roosendaal <ton@blender.org> | 2006-03-12 00:46:19 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2006-03-12 00:46:19 +0300 |
commit | bad09bd2f91f07cc00bed5e59132efe038261fd0 (patch) | |
tree | 16a0fa7a8ab10541dc71e3ff5e96f55a7e012b7e /source | |
parent | 58daa8a370ed92fb52643a31b3bb17315c4f3cda (diff) |
And now the studio is rendering panoramas... finding out that vectorblur
also could use correction for it.
The current perspective projected blur would look in 180 degree view like
this:
http://www.blender.org/bf/p2.jpg
(circle of planes rotating around camera)
After some fight with my rusty highschool gonio I got it fixed; nice
cylindrical projected speedvectors:
http://www.blender.org/bf/p1.jpg
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 77 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 2 |
2 files changed, 62 insertions, 17 deletions
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 756a12ccbda..724d78c2709 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -2149,7 +2149,7 @@ static int dl_surf_to_renderdata(Render *re, Object *ob, DispList *dl, Material VertRen *v1, *v2, *v3, *v4, *ver; VlakRen *vlr, *vlr1, *vlr2, *vlr3; Curve *cu= ob->data; - float *data, n1[3], *orcobase= orco, flen; + float *data, n1[3], flen; int u, v, orcoret= 0; int p1, p2, p3, p4, a; int sizeu, nsizeu, sizev, nsizev; @@ -3239,11 +3239,63 @@ static void database_fromscene_vectors(Render *re, Scene *scene, int timeoffset) G.scene->r.cfra-=timeoffset; } +/* choose to use static, to prevent giving too many args to this call */ +static void speedvector_project(Render *re, float *zco, VertRen *ver) +{ + static float pixelphix=0.0f, pixelphiy=0.0f, zmulx=0.0f, zmuly=0.0f; + static int pano= 0; + float div; + + /* initialize */ + if(re) { + pano= re->r.mode & R_PANORAMA; + + /* precalculate amount of radians 1 pixel rotates */ + if(pano) { + /* size of 1 pixel mapped to viewplane coords */ + float psize= (re->viewplane.xmax-re->viewplane.xmin)/(float)re->winx; + /* x angle of a pixel */ + pixelphix= atan(psize/re->clipsta); + + psize= (re->viewplane.ymax-re->viewplane.ymin)/(float)re->winy; + /* y angle of a pixel */ + pixelphiy= atan(psize/re->clipsta); + } + zmulx= re->winx/2; + zmuly= re->winy/2; + + return; + } + + /* now map hocos to screenspace, uses very primitive clip still */ + if(ver->ho[3]<0.1f) div= 10.0f; + else div= 1.0f/ver->ho[3]; + + /* use cylinder projection */ + if(pano) { + float vec[3], ang; + /* angle between (0,0,-1) and (ver->co) */ + VECCOPY(vec, ver->co); + + ang= saacos(-vec[2]/sqrt(vec[0]*vec[0] + vec[2]*vec[2])); + if(vec[0]<0.0f) ang= -ang; + zco[0]= ang/pixelphix + zmulx; + + ang= 0.5f*M_PI - saacos(vec[1]/sqrt(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2])); + zco[1]= ang/pixelphiy + zmuly; + + } + else { + zco[0]= zmulx*(1.0f+ver->ho[0]*div); + zco[1]= zmuly*(1.0f+ver->ho[1]*div); + } +} + static void calculate_speedvectors(Render *re, float *vectors, int startvert, int endvert, int step) { VertRen *ver= NULL; - float *speed, div, zco[2]; - float zmulx= re->winx/2, zmuly= re->winy/2, len; + float *speed, zco[2]; + float len; float winsq= re->winx*re->winy, winroot= sqrt(winsq); int a; @@ -3257,11 +3309,7 @@ static void calculate_speedvectors(Render *re, float *vectors, int startvert, in else ver++; - /* now map hocos to screenspace, uses very primitive clip still */ - if(ver->ho[3]<0.1f) div= 10.0f; - else div= 1.0f/ver->ho[3]; - zco[0]= zmulx*(1.0f+ver->ho[0]*div); - zco[1]= zmuly*(1.0f+ver->ho[1]*div); + speedvector_project(NULL, zco, ver); zco[0]= vectors[0] - zco[0]; zco[1]= vectors[1] - zco[1]; @@ -3373,8 +3421,7 @@ static void copy_dbase_object_vectors(Render *re, ListBase *lb) { ObjectRen *obren, *obrenlb; VertRen *ver; - float zmulx= re->winx/2, zmuly= re->winy/2; - float div, *vec; + float *vec; int a; for(obren= re->objecttable.first; obren; obren= obren->next) { @@ -3393,11 +3440,7 @@ static void copy_dbase_object_vectors(Render *re, ListBase *lb) else ver++; - if(ver->ho[3]<0.1f) div= 10.0f; - else div= 1.0f/ver->ho[3]; - vec[0]= zmulx*(1.0f+ver->ho[0]*div); - vec[1]= zmuly*(1.0f+ver->ho[1]*div); - + speedvector_project(NULL, vec, ver); } } } @@ -3422,7 +3465,9 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce) re->i.infostr= "Calculating previous vectors"; re->r.mode |= R_SPEED; - + + speedvector_project(re, NULL, NULL); /* initializes projection code */ + /* creates entire dbase */ database_fromscene_vectors(re, sce, -1); diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index bb5aa13e36f..3dbca3bcc96 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -935,7 +935,7 @@ static void render_tile_processor(Render *re, int firsttile) /* calculus for how much 1 pixel rendered should rotate the 3d geometry */ /* is not that simple, needs to be corrected for errors of larger viewplane sizes */ -/* called in initrender.c, initparts() */ +/* called in initrender.c, initparts() and convertblender.c, for speedvectors */ float panorama_pixel_rot(Render *re) { float psize, phi, xfac; |