Smoke:
authorDaniel Genrich <daniel.genrich@gmx.net>
Sun, 13 Sep 2009 12:32:57 +0000 (12:32 +0000)
committerDaniel Genrich <daniel.genrich@gmx.net>
Sun, 13 Sep 2009 12:32:57 +0000 (12:32 +0000)
* Bugfix for drawing issues when having the domain transformed (editmode + object mode, both were buggy)

source/blender/editors/space_view3d/drawobject.c
source/blender/editors/space_view3d/drawvolume.c
source/blender/editors/space_view3d/view3d_intern.h

index e886bbbd5f290285edd9159d6afdd9a814d6d27c..c02d45ca798b5afbae4d6a8f540fef7cb2a05247 100644 (file)
@@ -5362,14 +5362,14 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
                        {
                                smd->domain->tex = NULL;
                                GPU_create_smoke(smd, 0);
-                               draw_volume(scene, ar, v3d, base, smd->domain->tex, smd->domain->res, smd->domain->dx, smd->domain->tex_shadow);
+                               draw_volume(scene, ar, v3d, base, smd->domain->tex, smd->domain->p0, smd->domain->p1, smd->domain->res, smd->domain->dx, smd->domain->tex_shadow);
                                GPU_free_smoke(smd);
                        }
                        else if(smd->domain->wt || (smd->domain->viewsettings & MOD_SMOKE_VIEW_SHOWBIG))
                        {
                                smd->domain->tex = NULL;
                                GPU_create_smoke(smd, 1);
-                               draw_volume(scene, ar, v3d, base, smd->domain->tex, smd->domain->res_wt, smd->domain->dx_wt, smd->domain->tex_shadow);
+                               draw_volume(scene, ar, v3d, base, smd->domain->tex, smd->domain->p0, smd->domain->p1, smd->domain->res_wt, smd->domain->dx_wt, smd->domain->tex_shadow);
                                GPU_free_smoke(smd);
                        }
                }
index c8eda10566c60e82414618e49dd3829081975661..2c2ab2cbdecd938ccf9eb761ebf241b96ab2b159 100644 (file)
@@ -129,20 +129,20 @@ static float cv[][3] = {
 
 // edges have the form edges[n][0][xyz] + t*edges[n][1][xyz]
 static float edges[12][2][3] = {
-       {{1.0f, 1.0f, -1.0f}, {0.0f, 0.0f, 1.0f}},
-       {{-1.0f, 1.0f, -1.0f}, {0.0f, 0.0f, 1.0f}},
-       {{-1.0f, -1.0f, -1.0f}, {0.0f, 0.0f, 1.0f}},
-       {{1.0f, -1.0f, -1.0f}, {0.0f, 0.0f, 1.0f}},
-
-       {{1.0f, -1.0f, 1.0f}, {0.0f, 1.0f, 0.0f}},
-       {{-1.0f, -1.0f, 1.0f}, {0.0f, 1.0f, 0.0f}},
-       {{-1.0f, -1.0f, -1.0f}, {0.0f, 1.0f, 0.0f}},
-       {{1.0f, -1.0f, -1.0f}, {0.0f, 1.0f, 0.0f}},
-
-       {{-1.0f, 1.0f, 1.0f}, {1.0f, 0.0f, 0.0f}},
-       {{-1.0f, -1.0f, 1.0f}, {1.0f, 0.0f, 0.0f}},
-       {{-1.0f, -1.0f, -1.0f}, {1.0f, 0.0f, 0.0f}},
-       {{-1.0f, 1.0f, -1.0f}, {1.0f, 0.0f, 0.0f}}
+       {{1.0f, 1.0f, -1.0f}, {0.0f, 0.0f, 2.0f}},
+       {{-1.0f, 1.0f, -1.0f}, {0.0f, 0.0f, 2.0f}},
+       {{-1.0f, -1.0f, -1.0f}, {0.0f, 0.0f, 2.0f}},
+       {{1.0f, -1.0f, -1.0f}, {0.0f, 0.0f, 2.0f}},
+
+       {{1.0f, -1.0f, 1.0f}, {0.0f, 2.0f, 0.0f}},
+       {{-1.0f, -1.0f, 1.0f}, {0.0f, 2.0f, 0.0f}},
+       {{-1.0f, -1.0f, -1.0f}, {0.0f, 2.0f, 0.0f}},
+       {{1.0f, -1.0f, -1.0f}, {0.0f, 2.0f, 0.0f}},
+
+       {{-1.0f, 1.0f, 1.0f}, {2.0f, 0.0f, 0.0f}},
+       {{-1.0f, -1.0f, 1.0f}, {2.0f, 0.0f, 0.0f}},
+       {{-1.0f, -1.0f, -1.0f}, {2.0f, 0.0f, 0.0f}},
+       {{-1.0f, 1.0f, -1.0f}, {2.0f, 0.0f, 0.0f}}
 };
 
 int intersect_edges(float *points, float a, float b, float c, float d)
@@ -154,7 +154,7 @@ int intersect_edges(float *points, float a, float b, float c, float d)
        for (i=0; i<12; i++) {
                t = -(a*edges[i][0][0] + b*edges[i][0][1] + c*edges[i][0][2] + d)
                        / (a*edges[i][1][0] + b*edges[i][1][1] + c*edges[i][1][2]);
-               if ((t>0)&&(t<2)) {
+               if ((t>0)&&(t<1)) {
                        points[numpoints * 3 + 0] = edges[i][0][0] + edges[i][1][0]*t;
                        points[numpoints * 3 + 1] = edges[i][0][1] + edges[i][1][1]*t;
                        points[numpoints * 3 + 2] = edges[i][0][2] + edges[i][1][2]*t;
@@ -191,7 +191,7 @@ static int larger_pow2(int n)
        return n*2;
 }
 
-void draw_volume(Scene *scene, ARegion *ar, View3D *v3d, Base *base, GPUTexture *tex, int res[3], float dx, GPUTexture *tex_shadow)
+void draw_volume(Scene *scene, ARegion *ar, View3D *v3d, Base *base, GPUTexture *tex, float *min, float *max, int res[3], float dx, GPUTexture *tex_shadow)
 {
        Object *ob = base->object;
        RegionView3D *rv3d= ar->regiondata;
@@ -225,11 +225,82 @@ void draw_volume(Scene *scene, ARegion *ar, View3D *v3d, Base *base, GPUTexture
                                        "END\n";
        unsigned int prog;
 
+       
+       float size[3];
+
+       VECSUB(size, max, min);
+
+       // maxx, maxy, maxz
+       cv[0][0] = max[0];
+       cv[0][1] = max[1];
+       cv[0][2] = max[2];
+       // minx, maxy, maxz
+       cv[1][0] = min[0];
+       cv[1][1] = max[1];
+       cv[1][2] = max[2];
+       // minx, miny, maxz
+       cv[2][0] = min[0];
+       cv[2][1] = min[1];
+       cv[2][2] = max[2];
+       // maxx, miny, maxz
+       cv[3][0] = max[0];
+       cv[3][1] = min[1];
+       cv[3][2] = max[2];
+
+       // maxx, maxy, minz
+       cv[4][0] = max[0];
+       cv[4][1] = max[1];
+       cv[4][2] = min[2];
+       // minx, maxy, minz
+       cv[5][0] = min[0];
+       cv[5][1] = max[1];
+       cv[5][2] = min[2];
+       // minx, miny, minz
+       cv[6][0] = min[0];
+       cv[6][1] = min[1];
+       cv[6][2] = min[2];
+       // maxx, miny, minz
+       cv[7][0] = max[0];
+       cv[7][1] = min[1];
+       cv[7][2] = min[2];
+
+       VECCOPY(edges[0][0], cv[4]); // maxx, maxy, minz
+       VECCOPY(edges[1][0], cv[5]); // minx, maxy, minz
+       VECCOPY(edges[2][0], cv[6]); // minx, miny, minz
+       VECCOPY(edges[3][0], cv[7]); // maxx, miny, minz
+
+       VECCOPY(edges[4][0], cv[3]); // maxx, miny, maxz
+       VECCOPY(edges[5][0], cv[2]); // minx, miny, maxz
+       VECCOPY(edges[6][0], cv[6]); // minx, miny, minz
+       VECCOPY(edges[7][0], cv[7]); // maxx, miny, minz
+
+       VECCOPY(edges[8][0], cv[1]); // minx, maxy, maxz
+       VECCOPY(edges[9][0], cv[2]); // minx, miny, maxz
+       VECCOPY(edges[10][0], cv[6]); // minx, miny, minz
+       VECCOPY(edges[11][0], cv[5]); // minx, maxy, minz
+
+       // printf("size x: %f, y: %f, z: %f\n", size[0], size[1], size[2]);
+
+       edges[0][1][2] = size[2];
+       edges[1][1][2] = size[2];
+       edges[2][1][2] = size[2];
+       edges[3][1][2] = size[2];
+
+       edges[4][1][1] = size[1];
+       edges[5][1][1] = size[1];
+       edges[6][1][1] = size[1];
+       edges[7][1][1] = size[1];
+
+       edges[8][1][0] = size[0];
+       edges[9][1][0] = size[0];
+       edges[10][1][0] = size[0];
+       edges[11][1][0] = size[0];
+
        glGetBooleanv(GL_BLEND, (GLboolean *)&gl_blend);
        glGetBooleanv(GL_DEPTH_TEST, (GLboolean *)&gl_depth);
 
        wmLoadMatrix(rv3d->viewmat);
-       wmMultMatrix(ob->obmat);        
+       // wmMultMatrix(ob->obmat);     
 
        glDepthMask(GL_FALSE);
        glDisable(GL_DEPTH_TEST);
@@ -248,13 +319,15 @@ void draw_volume(Scene *scene, ARegion *ar, View3D *v3d, Base *base, GPUTexture
                y = cv[i][1] + viewnormal[1];
                z = cv[i][2] + viewnormal[2];
 
-               if ((x>=-1.0f)&&(x<=1.0f)
-                       &&(y>=-1.0f)&&(y<=1.0f)
-                       &&(z>=-1.0f)&&(z<=1.0f)) {
+               if ((x>=min[0])&&(x<=max[0])
+                       &&(y>=min[1])&&(y<=max[1])
+                       &&(z>=min[2])&&(z<=max[2])) {
                        break;
                }
        }
 
+       // printf("i: %d\n", i);
+
        if(GLEW_ARB_fragment_program)
        {
                glGenProgramsARB(1, &prog);
@@ -318,7 +391,7 @@ void draw_volume(Scene *scene, ARegion *ar, View3D *v3d, Base *base, GPUTexture
                        glBegin(GL_POLYGON);
                        for (i = 0; i < numpoints; i++) {
                                glColor3f(1.0, 1.0, 1.0);
-                               glTexCoord3d((points[i * 3 + 0] + 1.0)*cor[0]/2.0, (points[i * 3 + 1] + 1)*cor[1]/2.0, (points[i * 3 + 2] + 1.0)*cor[2]/2.0);
+                               glTexCoord3d((points[i * 3 + 0] - min[0] )*cor[0]/size[0], (points[i * 3 + 1] - min[1])*cor[1]/size[1], (points[i * 3 + 2] - min[2])*cor[2]/size[2]);
                                glVertex3f(points[i * 3 + 0], points[i * 3 + 1], points[i * 3 + 2]);
                        }
                        glEnd();
index 00b0b5c4fd134ca127be7067728a5f6d91c9dfb5..7dbea44b68b3189d63594a8cb50496c0cb971036 100644 (file)
@@ -157,7 +157,7 @@ ARegion *view3d_has_buttons_region(ScrArea *sa);
 ARegion *view3d_has_tools_region(ScrArea *sa);
 
 /* draw_volume.c */
-void draw_volume(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, struct Base *base, struct GPUTexture *tex, int res[3], float dx, struct GPUTexture *tex_shadow);
+void draw_volume(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, struct Base *base, struct GPUTexture *tex, float *min, float *max, int res[3], float dx, struct GPUTexture *tex_shadow);
 
 
 #endif /* ED_VIEW3D_INTERN_H */