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
path: root/source
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2006-03-12 00:46:19 +0300
committerTon Roosendaal <ton@blender.org>2006-03-12 00:46:19 +0300
commitbad09bd2f91f07cc00bed5e59132efe038261fd0 (patch)
tree16a0fa7a8ab10541dc71e3ff5e96f55a7e012b7e /source
parent58daa8a370ed92fb52643a31b3bb17315c4f3cda (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.c77
-rw-r--r--source/blender/render/intern/source/pipeline.c2
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;