Move some static math functions out of paint_image.c into arithb.c
authorCampbell Barton <ideasman42@gmail.com>
Fri, 18 Sep 2009 16:39:45 +0000 (16:39 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 18 Sep 2009 16:39:45 +0000 (16:39 +0000)
* VecLerp3f and Vec2Lerp3f - interpolate 3 2d/3d vectors from 3 weights
* AngleToLength(angle) - useful for making even width shell/walls based on the angles of the surrounding geometry from each point. (same method used in 2.4x python solidify script).

also quiet some warnings.

source/blender/blenkernel/intern/particle.c
source/blender/blenkernel/intern/particle_system.c
source/blender/blenlib/BLI_arithb.h
source/blender/blenlib/intern/arithb.c
source/blender/editors/sculpt_paint/paint_image.c
source/blender/makesrna/intern/rna_particle.c
source/blender/render/intern/source/convertblender.c

index 0dc041bfc6a7efb6f8f863c9452f7d02175cdcb0..e18e7f54e4981d06c9aa4db602280d701b5f5250 100644 (file)
@@ -2193,7 +2193,7 @@ static void get_strand_normal(Material *ma, float *surfnor, float surfdist, floa
 static int psys_threads_init_path(ParticleThread *threads, Scene *scene, float cfra, int editupdate)
 {
        ParticleThreadContext *ctx= threads[0].ctx;
-       Object *ob= ctx->sim.ob;
+/*     Object *ob= ctx->sim.ob; */
        ParticleSystem *psys= ctx->sim.psys;
        ParticleSettings *part = psys->part;
        ParticleEditSettings *pset = &scene->toolsettings->particle;
@@ -3868,7 +3868,7 @@ int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *sta
        ParticleData *pa = NULL;
        ChildParticle *cpa = NULL;
        float cfra;
-       int totpart = psys->totpart, between = 0;
+       int totpart = psys->totpart;
 
        /* negative time means "use current time" */
        cfra = state->time > 0 ? state->time : bsystem_time(sim->scene, 0, (float)sim->scene->r.cfra, 0.0);
index 9cd897e4bcdd4cca9d4457c9565ece446aa9e48c..1b6d56e6459280155dde9b5b0639cbc93ea189e4 100644 (file)
@@ -614,7 +614,7 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData
        Object *ob= ctx->sim.ob;
        DerivedMesh *dm= ctx->dm;
        ParticleData *tpa;
-       ParticleSettings *part= ctx->sim.psys->part;
+/*     ParticleSettings *part= ctx->sim.psys->part; */
        float *v1, *v2, *v3, *v4, nor[3], orco1[3], co1[3], co2[3], nor1[3], ornor1[3];
        float cur_d, min_d, randu, randv;
        int from= ctx->from;
@@ -2451,7 +2451,7 @@ void psys_end_effectors(ParticleSystem *psys)
 }
 
 /* precalcs effectors and returns 1 if there were any collision object 
-/* so collision checks can be avoided as quickly as possible */
+ * so collision checks can be avoided as quickly as possible */
 static int precalc_effectors(ParticleSimulationData *sim, float cfra)
 {
        ParticleSystem *psys = sim->psys;
@@ -3561,7 +3561,7 @@ static void do_hair_dynamics(ParticleSimulationData *sim)
 static void hair_step(ParticleSimulationData *sim, float cfra)
 {
        ParticleSystem *psys = sim->psys;
-       ParticleSettings *part = psys->part;
+/*     ParticleSettings *part = psys->part; */
        PARTICLE_P;
        float disp = (float)get_current_display_percentage(psys)/100.0f;
 
@@ -3649,7 +3649,7 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
        ParticleSettings *part=psys->part;
        KDTree *tree=0;
        IpoCurve *icu_esize= NULL; //=find_ipocurve(part->ipo,PART_EMIT_SIZE); // XXX old animation system
-       Material *ma=give_current_material(sim->ob, part->omat);
+/*     Material *ma=give_current_material(sim->ob, part->omat); */
        BoidBrainData bbd;
        PARTICLE_P;
        float timestep;
@@ -3851,7 +3851,7 @@ static void cached_step(ParticleSimulationData *sim, float cfra)
        ParticleSystem *psys = sim->psys;
        ParticleSettings *part = psys->part;
        IpoCurve *icu_esize = NULL; //=find_ipocurve(part->ipo,PART_EMIT_SIZE); // XXX old animation system
-       Material *ma = give_current_material(sim->ob,part->omat);
+/*     Material *ma = give_current_material(sim->ob,part->omat); */
        PARTICLE_P;
        float disp, birthtime, dietime, *vg_size= NULL; // XXX ipotime=cfra
 
index 623a9afeb7389420a04731e3177dbaf4e005ec9f..793dab12b83dfccf8be791648c80653aa37ac916 100644 (file)
@@ -364,7 +364,8 @@ void printvec4f(char *str, float v[4]);
 void VecAddf(float *v, float *v1, float *v2);
 void VecSubf(float *v, float *v1, float *v2);
 void VecMulVecf(float *v, float *v1, float *v2);
-void VecLerpf(float *target, float *a, float *b, float t);
+void VecLerpf(float *target, const float *a, const float *b, const float t);
+void VecLerp3f(float p[3], const float v1[3], const float v2[3], const float v3[3], const float w[3]);
 void VecMidf(float *v, float *v1, float *v2);
 
 void VecOrthoBasisf(float *v, float *v1, float *v2);
@@ -375,7 +376,8 @@ void Vec2Mulf(float *v1, float f);
 void Vec2Addf(float *v, float *v1, float *v2);
 void Vec2Subf(float *v, float *v1, float *v2);
 void Vec2Copyf(float *v1, float *v2);
-void Vec2Lerpf(float *target, float *a, float *b, float t);
+void Vec2Lerpf(float *target, const float *a, const float *b, const float t);
+void Vec2Lerp3f(float p[2], const float v1[2], const float v2[2], const float v3[2], const float w[3]);
 
 void AxisAngleToQuat(float q[4], float axis[3], float angle);
 void QuatToAxisAngle(float q[4], float axis[3], float *angle);
@@ -527,6 +529,8 @@ int point_in_tri_prism(float p[3], float v1[3], float v2[3], float v3[3]);
 
 float lambda_cp_line_ex(float p[3], float l1[3], float l2[3], float cp[3]);
 
+float AngleToLength(const float angle);
+
 typedef struct DualQuat {
        float quat[4];
        float trans[4];
index b10051b056a39bcd1f9a92e53776eb0034d916ee..ac79894d827009f56bf0607a6f2cbf5b926c8dd9 100644 (file)
@@ -2187,23 +2187,40 @@ void VecMulVecf(float *v, float *v1, float *v2)
        v[2] = v1[2] * v2[2];
 }
 
-void VecLerpf(float *target, float *a, float *b, float t)
+void VecLerpf(float *target, const float *a, const float *b, const float t)
 {
-       float s = 1.0f-t;
+       const float s = 1.0f-t;
 
        target[0]= s*a[0] + t*b[0];
        target[1]= s*a[1] + t*b[1];
        target[2]= s*a[2] + t*b[2];
 }
 
-void Vec2Lerpf(float *target, float *a, float *b, float t)
+void Vec2Lerpf(float *target, const float *a, const float *b, const float t)
 {
-       float s = 1.0f-t;
+       const float s = 1.0f-t;
 
        target[0]= s*a[0] + t*b[0];
        target[1]= s*a[1] + t*b[1];
 }
 
+/* weight 3 vectors, (VecWeightf in 2.4x)
+ * 'w' must be unit length but is not a vector, just 3 weights */
+void VecLerp3f(float p[3], const float v1[3], const float v2[3], const float v3[3], const float w[3])
+{
+       p[0] = v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2];
+       p[1] = v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2];
+       p[2] = v1[2]*w[0] + v2[2]*w[1] + v3[2]*w[2];
+}
+
+/* weight 3 2D vectors, (Vec2Weightf in 2.4x)
+ * 'w' must be unit length but is not a vector, just 3 weights */
+void Vec2Lerp3f(float p[2], const float v1[2], const float v2[2], const float v3[2], const float w[3])
+{
+       p[0] = v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2];
+       p[1] = v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2];
+}
+
 void VecMidf(float *v, float *v1, float *v2)
 {
        v[0]= 0.5f*(v1[0]+ v2[0]);
@@ -4823,6 +4840,15 @@ static float lambda_cp_line(float p[3], float l1[3], float l2[3])
 }
 #endif
 
+/* useful to calculate an even width shell, by taking the angle between 2 planes.
+ * The return value is a scale on the offset.
+ * no angle between planes is 1.0, as the angle between the 2 planes approches 180d
+ * the distance gets very hight, 180d would be inf, but this case isnt valid */
+float AngleToLength(const float angle)
+{
+       return (angle < SMALL_NUMBER) ? 1.0f : fabsf(1.0f / cosf(angle * (M_PI/180.0f)));
+}
+
 /* Similar to LineIntersectsTriangleUV, except it operates on a quad and in 2d, assumes point is in quad */
 void PointInQuad2DUV(float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv)
 {
index b42566732ec13338ff978c55391f309a0c7cd2f4..91ee2fa55d1c93bc2da3d3ce7798f159fc6220dd 100644 (file)
@@ -625,19 +625,6 @@ static void BarycentricWeightsPersp2f(float pt[2], float v1[4], float v2[4], flo
        w[0] = w[1] = w[2] = 1.0f/3.0f;
 }
 
-static void VecWeightf(float p[3], const float v1[3], const float v2[3], const float v3[3], const float w[3])
-{
-       p[0] = v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2];
-       p[1] = v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2];
-       p[2] = v1[2]*w[0] + v2[2]*w[1] + v3[2]*w[2];
-}
-
-static void Vec2Weightf(float p[2], const float v1[2], const float v2[2], const float v3[2], const float w[3])
-{
-       p[0] = v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2];
-       p[1] = v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2];
-}
-
 static float VecZDepthOrtho(float pt[2], float v1[3], float v2[3], float v3[3], float w[3])
 {
        BarycentricWeights2f(pt, v1, v2, v3, w);
@@ -746,10 +733,10 @@ static int project_paint_PickColor(const ProjPaintState *ps, float pt[2], float
        tf = ps->dm_mtface + face_index;
        
        if (side == 0) {
-               Vec2Weightf(uv, tf->uv[0], tf->uv[1], tf->uv[2], w);
+               Vec2Lerp3f(uv, tf->uv[0], tf->uv[1], tf->uv[2], w);
        }
        else { /* QUAD */
-               Vec2Weightf(uv, tf->uv[0], tf->uv[2], tf->uv[3], w);
+               Vec2Lerp3f(uv, tf->uv[0], tf->uv[2], tf->uv[3], w);
        }
        
        ibuf = tf->tpage->ibufs.first; /* we must have got the imbuf before getting here */
@@ -870,8 +857,8 @@ static int project_paint_occlude_ptv_clip(
        }
 
        /* Test if we're in the clipped area, */
-       if (side)       VecWeightf(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v3].co, ps->dm_mvert[mf->v4].co, w);
-       else            VecWeightf(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v2].co, ps->dm_mvert[mf->v3].co, w);
+       if (side)       VecLerp3f(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v3].co, ps->dm_mvert[mf->v4].co, w);
+       else            VecLerp3f(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v2].co, ps->dm_mvert[mf->v3].co, w);
        
        Mat4MulVecfl(ps->ob->obmat, wco);
        if(!view3d_test_clipping(ps->rv3d, wco)) {
@@ -1146,19 +1133,6 @@ static int check_seam(const ProjPaintState *ps, const int orig_face, const int o
        return 1;
 }
 
-/* TODO - move to arithb.c */
-/* Converts an angle to a length that can be used for maintaining an even margin around UV's */
-static float angleToLength(float angle)
-{
-       // already accounted for
-       if (angle < 0.000001f) {
-               return 1.0f;
-       }
-       else {
-               return fabsf(1.0f / cosf(angle * (M_PI/180.0f)));
-       }
-}
-
 /* Calculate outset UV's, this is not the same as simply scaling the UVs,
  * since the outset coords are a margin that keep an even distance from the original UV's,
  * note that the image aspect is taken into account */
@@ -1204,15 +1178,15 @@ static void uv_image_outset(float (*orig_uv)[2], float (*outset_uv)[2], const fl
        }
        
        if (is_quad) {
-               a1 = angleToLength(NormalizedVecAngle2_2D(dir4, dir1));
-               a2 = angleToLength(NormalizedVecAngle2_2D(dir1, dir2));
-               a3 = angleToLength(NormalizedVecAngle2_2D(dir2, dir3));
-               a4 = angleToLength(NormalizedVecAngle2_2D(dir3, dir4));
+               a1 = AngleToLength(NormalizedVecAngle2_2D(dir4, dir1));
+               a2 = AngleToLength(NormalizedVecAngle2_2D(dir1, dir2));
+               a3 = AngleToLength(NormalizedVecAngle2_2D(dir2, dir3));
+               a4 = AngleToLength(NormalizedVecAngle2_2D(dir3, dir4));
        }
        else {
-               a1 = angleToLength(NormalizedVecAngle2_2D(dir3, dir1));
-               a2 = angleToLength(NormalizedVecAngle2_2D(dir1, dir2));
-               a3 = angleToLength(NormalizedVecAngle2_2D(dir2, dir3));
+               a1 = AngleToLength(NormalizedVecAngle2_2D(dir3, dir1));
+               a2 = AngleToLength(NormalizedVecAngle2_2D(dir1, dir2));
+               a3 = AngleToLength(NormalizedVecAngle2_2D(dir2, dir3));
        }
        
        if (is_quad) {
@@ -1329,7 +1303,7 @@ static void screen_px_from_ortho(
                float w[3])
 {
        BarycentricWeights2f(uv, uv1co, uv2co, uv3co, w);
-       VecWeightf(pixelScreenCo, v1co, v2co, v3co, w);
+       VecLerp3f(pixelScreenCo, v1co, v2co, v3co, w);
 }
 
 /* same as screen_px_from_ortho except we need to take into account
@@ -1363,7 +1337,7 @@ static void screen_px_from_persp(
        }
        /* done re-weighting */
        
-       VecWeightf(pixelScreenCo, v1co, v2co, v3co, w);
+       VecLerp3f(pixelScreenCo, v1co, v2co, v3co, w);
 }
 
 static void project_face_pixel(const MTFace *tf_other, ImBuf *ibuf_other, const float w[3], int side, unsigned char rgba_ub[4], float rgba_f[4])
@@ -1381,7 +1355,7 @@ static void project_face_pixel(const MTFace *tf_other, ImBuf *ibuf_other, const
                uvCo3 =  (float *)tf_other->uv[2];
        }
        
-       Vec2Weightf(uv_other, uvCo1, uvCo2, uvCo3, w);
+       Vec2Lerp3f(uv_other, uvCo1, uvCo2, uvCo3, w);
        
        /* use */
        uvco_to_wrapped_pxco(uv_other, ibuf_other->x, ibuf_other->y, &x, &y);
@@ -1916,22 +1890,22 @@ static void rect_to_uvspace_ortho(
        uv[0] = bucket_bounds->xmax;
        uv[1] = bucket_bounds->ymin;
        BarycentricWeights2f(uv, v1coSS, v2coSS, v3coSS, w);
-       Vec2Weightf(bucket_bounds_uv[flip?3:0], uv1co, uv2co, uv3co, w);
+       Vec2Lerp3f(bucket_bounds_uv[flip?3:0], uv1co, uv2co, uv3co, w);
 
        //uv[0] = bucket_bounds->xmax; // set above
        uv[1] = bucket_bounds->ymax;
        BarycentricWeights2f(uv, v1coSS, v2coSS, v3coSS, w);
-       Vec2Weightf(bucket_bounds_uv[flip?2:1], uv1co, uv2co, uv3co, w);
+       Vec2Lerp3f(bucket_bounds_uv[flip?2:1], uv1co, uv2co, uv3co, w);
 
        uv[0] = bucket_bounds->xmin;
        //uv[1] = bucket_bounds->ymax; // set above
        BarycentricWeights2f(uv, v1coSS, v2coSS, v3coSS, w);
-       Vec2Weightf(bucket_bounds_uv[flip?1:2], uv1co, uv2co, uv3co, w);
+       Vec2Lerp3f(bucket_bounds_uv[flip?1:2], uv1co, uv2co, uv3co, w);
 
        //uv[0] = bucket_bounds->xmin; // set above
        uv[1] = bucket_bounds->ymin;
        BarycentricWeights2f(uv, v1coSS, v2coSS, v3coSS, w);
-       Vec2Weightf(bucket_bounds_uv[flip?0:3], uv1co, uv2co, uv3co, w);
+       Vec2Lerp3f(bucket_bounds_uv[flip?0:3], uv1co, uv2co, uv3co, w);
 }
 
 /* same as above but use BarycentricWeightsPersp2f */
@@ -1950,22 +1924,22 @@ static void rect_to_uvspace_persp(
        uv[0] = bucket_bounds->xmax;
        uv[1] = bucket_bounds->ymin;
        BarycentricWeightsPersp2f(uv, v1coSS, v2coSS, v3coSS, w);
-       Vec2Weightf(bucket_bounds_uv[flip?3:0], uv1co, uv2co, uv3co, w);
+       Vec2Lerp3f(bucket_bounds_uv[flip?3:0], uv1co, uv2co, uv3co, w);
 
        //uv[0] = bucket_bounds->xmax; // set above
        uv[1] = bucket_bounds->ymax;
        BarycentricWeightsPersp2f(uv, v1coSS, v2coSS, v3coSS, w);
-       Vec2Weightf(bucket_bounds_uv[flip?2:1], uv1co, uv2co, uv3co, w);
+       Vec2Lerp3f(bucket_bounds_uv[flip?2:1], uv1co, uv2co, uv3co, w);
 
        uv[0] = bucket_bounds->xmin;
        //uv[1] = bucket_bounds->ymax; // set above
        BarycentricWeightsPersp2f(uv, v1coSS, v2coSS, v3coSS, w);
-       Vec2Weightf(bucket_bounds_uv[flip?1:2], uv1co, uv2co, uv3co, w);
+       Vec2Lerp3f(bucket_bounds_uv[flip?1:2], uv1co, uv2co, uv3co, w);
 
        //uv[0] = bucket_bounds->xmin; // set above
        uv[1] = bucket_bounds->ymin;
        BarycentricWeightsPersp2f(uv, v1coSS, v2coSS, v3coSS, w);
-       Vec2Weightf(bucket_bounds_uv[flip?0:3], uv1co, uv2co, uv3co, w);
+       Vec2Lerp3f(bucket_bounds_uv[flip?0:3], uv1co, uv2co, uv3co, w);
 }
 
 /* This works as we need it to but we can save a few steps and not use it */
@@ -2209,13 +2183,13 @@ static void project_bucket_clip_face(
                if (is_ortho) {
                        for(i=0; i<(*tot); i++) {
                                BarycentricWeights2f(isectVCosSS[i], v1coSS, v2coSS, v3coSS, w);
-                               Vec2Weightf(bucket_bounds_uv[i], uv1co, uv2co, uv3co, w);
+                               Vec2Lerp3f(bucket_bounds_uv[i], uv1co, uv2co, uv3co, w);
                        }
                }
                else {
                        for(i=0; i<(*tot); i++) {
                                BarycentricWeightsPersp2f(isectVCosSS[i], v1coSS, v2coSS, v3coSS, w);
-                               Vec2Weightf(bucket_bounds_uv[i], uv1co, uv2co, uv3co, w);
+                               Vec2Lerp3f(bucket_bounds_uv[i], uv1co, uv2co, uv3co, w);
                        }
                }
        }
@@ -2470,7 +2444,7 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i
                                                
                                                /* a pitty we need to get the worldspace pixel location here */
                                                if(ps->rv3d->rflag & RV3D_CLIPPING) {
-                                                       VecWeightf(wco, ps->dm_mvert[ (*(&mf->v1 + i1)) ].co, ps->dm_mvert[ (*(&mf->v1 + i2)) ].co, ps->dm_mvert[ (*(&mf->v1 + i3)) ].co, w);
+                                                       VecLerp3f(wco, ps->dm_mvert[ (*(&mf->v1 + i1)) ].co, ps->dm_mvert[ (*(&mf->v1 + i2)) ].co, ps->dm_mvert[ (*(&mf->v1 + i3)) ].co, w);
                                                        Mat4MulVecfl(ps->ob->obmat, wco);
                                                        if(view3d_test_clipping(ps->rv3d, wco)) {
                                                                continue; /* Watch out that no code below this needs to run */
@@ -2686,8 +2660,8 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i
                                                                                        
                                                                                        /* a pitty we need to get the worldspace pixel location here */
                                                                                        if(ps->rv3d->rflag & RV3D_CLIPPING) {
-                                                                                               if (side)       VecWeightf(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v3].co, ps->dm_mvert[mf->v4].co, w);
-                                                                                               else            VecWeightf(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v2].co, ps->dm_mvert[mf->v3].co, w);
+                                                                                               if (side)       VecLerp3f(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v3].co, ps->dm_mvert[mf->v4].co, w);
+                                                                                               else            VecLerp3f(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v2].co, ps->dm_mvert[mf->v3].co, w);
                                                                                                
                                                                                                Mat4MulVecfl(ps->ob->obmat, wco);
                                                                                                if(view3d_test_clipping(ps->rv3d, wco)) {
index 5821d30bc3bb9882d54ece3980f61f9b2452766c..04b4b1142be984e5d0a357e71c8775940d4e319d 100644 (file)
@@ -507,7 +507,7 @@ EnumPropertyItem reactor_from_items[] = {
 
 static EnumPropertyItem *rna_Particle_from_itemf(bContext *C, PointerRNA *ptr, int *free)
 {
-       ParticleSettings *part = ptr->id.data;
+       /* ParticleSettings *part = ptr->id.data; */
 
        if(C==NULL) {
                EnumPropertyItem *item= NULL;
index 0c56841b70dba2a716236c43ad4f6757d5a32a4d..48a7c003c9f86362d38ba026fcda1c8a503aadef 100644 (file)
@@ -1474,7 +1474,7 @@ static void get_particle_uvco_mcol(short from, DerivedMesh *dm, float *fuv, int
 static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem *psys, int timeoffset)
 {
        Object *ob= obr->ob;
-       Object *tob=0;
+//     Object *tob=0;
        Material *ma=0;
        ParticleSystemModifierData *psmd;
        ParticleSystem *tpsys=0;