diff options
Diffstat (limited to 'source/blender/render/intern/source/convertblender.c')
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 612 |
1 files changed, 306 insertions, 306 deletions
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 0b68802decc..8675ffec313 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -111,7 +111,7 @@ #endif /* ------------------------------------------------------------------------- */ -/* tool functions/defines for ad hoc simplification and possible future +/* tool functions/defines for ad hoc simplification and possible future * cleanup */ /* ------------------------------------------------------------------------- */ @@ -178,11 +178,11 @@ static void calc_edge_stress_add(float *accum, VertRen *v1, VertRen *v2) { float len= len_v3v3(v1->co, v2->co)/len_v3v3(v1->orco, v2->orco); float *acc; - + acc= accum + 2*v1->index; acc[0]+= len; acc[1]+= 1.0f; - + acc= accum + 2*v2->index; acc[0]+= len; acc[1]+= 1.0f; @@ -192,13 +192,13 @@ static void calc_edge_stress(Render *UNUSED(re), ObjectRen *obr, Mesh *me) { float loc[3], size[3], *accum, *acc, *accumoffs, *stress; int a; - + if (obr->totvert==0) return; - + BKE_mesh_texspace_get(me, loc, NULL, size); - + accum= MEM_callocN(2*sizeof(float)*obr->totvert, "temp accum for stress"); - + /* de-normalize orco */ for (a=0; a<obr->totvert; a++) { VertRen *ver= RE_findOrAddVert(obr, a); @@ -208,7 +208,7 @@ static void calc_edge_stress(Render *UNUSED(re), ObjectRen *obr, Mesh *me) ver->orco[2]= ver->orco[2]*size[2] +loc[2]; } } - + /* add stress values */ accumoffs= accum; /* so we can use vertex index */ for (a=0; a<obr->totvlak; a++) { @@ -225,7 +225,7 @@ static void calc_edge_stress(Render *UNUSED(re), ObjectRen *obr, Mesh *me) } } } - + for (a=0; a<obr->totvert; a++) { VertRen *ver= RE_findOrAddVert(obr, a); if (ver->orco) { @@ -235,14 +235,14 @@ static void calc_edge_stress(Render *UNUSED(re), ObjectRen *obr, Mesh *me) acc[0]/= acc[1]; stress= RE_vertren_get_stress(obr, ver, 1); *stress= *acc; - + /* restore orcos */ ver->orco[0] = (ver->orco[0]-loc[0])/size[0]; ver->orco[1] = (ver->orco[1]-loc[1])/size[1]; ver->orco[2] = (ver->orco[2]-loc[2])/size[2]; } } - + MEM_freeN(accum); } @@ -254,7 +254,7 @@ static void calc_tangent_vector(ObjectRen *obr, VlakRen *vlr, int do_tangent) float tang[3], *tav; float *uv1, *uv2, *uv3, *uv4; float uv[4][2]; - + if (tface) { uv1= tface->uv[0]; uv2= tface->uv[1]; @@ -272,7 +272,7 @@ static void calc_tangent_vector(ObjectRen *obr, VlakRen *vlr, int do_tangent) else return; tangent_from_uv_v3(uv1, uv2, uv3, v1->co, v2->co, v3->co, vlr->n, tang); - + if (do_tangent) { tav= RE_vertren_get_tangent(obr, v1, 1); add_v3_v3(tav, tang); @@ -281,10 +281,10 @@ static void calc_tangent_vector(ObjectRen *obr, VlakRen *vlr, int do_tangent) tav= RE_vertren_get_tangent(obr, v3, 1); add_v3_v3(tav, tang); } - + if (v4) { tangent_from_uv_v3(uv1, uv3, uv4, v1->co, v3->co, v4->co, vlr->n, tang); - + if (do_tangent) { tav= RE_vertren_get_tangent(obr, v1, 1); add_v3_v3(tav, tang); @@ -339,7 +339,7 @@ static void GetTextureCoordinate(const SMikkTSpaceContext *pContext, float r_uv[ VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num); MTFace *tface= RE_vlakren_get_tface(pMesh->obr, vlr, pMesh->mtface_index, NULL, 0); const float *coord; - + if (tface != NULL) { coord= tface->uv[vert_index]; copy_v2_v2(r_uv, coord); @@ -419,7 +419,7 @@ static void calc_vertexnormals(Render *UNUSED(re), ObjectRen *obr, bool do_verte if (vlr->v4 && is_zero_v3(vlr->v4->n)) copy_v3_v3(vlr->v4->n, vlr->n); } } - + /* normalize vertex normals */ for (a=0; a<obr->totvert; a++) { VertRen *ver= RE_findOrAddVert(obr, a); @@ -642,7 +642,7 @@ static void autosmooth(Render *UNUSED(re), ObjectRen *obr, float mat[4][4], shor if (vlr->v2 != vlr->v3) { if (vlr->v4) normal_quad_v3(vlr->n, vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co); - else + else normal_tri_v3(vlr->n, vlr->v3->co, vlr->v2->co, vlr->v1->co); } } @@ -665,11 +665,11 @@ static void set_object_orco(Render *re, void *ob, float *orco) { if (!re->orco_hash) re->orco_hash = BLI_ghash_ptr_new("set_object_orco gh"); - + BLI_ghash_insert(re->orco_hash, ob, orco); } -static void free_mesh_orco_hash(Render *re) +static void free_mesh_orco_hash(Render *re) { if (re->orco_hash) { BLI_ghash_free(re->orco_hash, NULL, MEM_freeN); @@ -681,11 +681,11 @@ static void check_material_mapto(Material *ma) { int a; ma->mapto_textured = 0; - + /* cache which inputs are actually textured. * this can avoid a bit of time spent iterating through all the texture slots, map inputs and map tos * every time a property which may or may not be textured is accessed */ - + for (a=0; a<MAX_MTEX; a++) { if (ma->mtex[a] && ma->mtex[a]->tex) { /* currently used only in volume render, so we'll check for those flags */ @@ -723,28 +723,28 @@ static Material *give_render_material(Render *re, Object *ob, short nr) { extern Material defmaterial; /* material.c */ Material *ma; - + ma= give_current_material(ob, nr); if (ma==NULL) ma= &defmaterial; - + if (re->r.mode & R_SPEED) ma->texco |= NEED_UV; - + if (ma->material_type == MA_TYPE_VOLUME) { ma->mode |= MA_TRANSP; ma->mode &= ~MA_SHADBUF; } if ((ma->mode & MA_TRANSP) && (ma->mode & MA_ZTRANSP)) re->flag |= R_ZTRA; - + /* for light groups and SSS */ ma->flag |= MA_IS_USED; if (ma->nodetree && ma->use_nodes) flag_render_node_material(re, ma->nodetree); - + check_material_mapto(ma); - + return ma; } @@ -768,7 +768,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par static float anor[3], avec[3]; int flag, i; static int second=0; - + sub_v3_v3v3(nor, vec, vec1); normalize_v3(nor); /* nor needed as tangent */ cross_v3_v3v3(cross, vec, nor); @@ -778,7 +778,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par dx= re->winx*cross[0]*re->winmat[0][0]; dy= re->winy*cross[1]*re->winmat[1][1]; w = sqrtf(dx * dx + dy * dy) / w; - + if (w!=0.0f) { float fac; if (ma->strand_ease!=0.0f) { @@ -807,16 +807,16 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par mul_v3_fl(cross, width); } - + if (ma->mode & MA_TANGENT_STR) flag= R_SMOOTH|R_TANGENT; else flag= R_SMOOTH; - + /* only 1 pixel wide strands filled in as quads now, otherwise zbuf errors */ if (ma->strand_sta==1.0f) flag |= R_STRAND; - + /* single face line */ if (sd->line) { vlr= RE_findOrAddVlak(obr, obr->totvlak++); @@ -825,13 +825,13 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par vlr->v2= RE_findOrAddVert(obr, obr->totvert++); vlr->v3= RE_findOrAddVert(obr, obr->totvert++); vlr->v4= RE_findOrAddVert(obr, obr->totvert++); - + copy_v3_v3(vlr->v1->co, vec); add_v3_v3(vlr->v1->co, cross); copy_v3_v3(vlr->v1->n, nor); vlr->v1->orco= sd->orco; vlr->v1->accum = -1.0f; /* accum abuse for strand texco */ - + copy_v3_v3(vlr->v2->co, vec); sub_v3_v3v3(vlr->v2->co, vlr->v2->co, cross); copy_v3_v3(vlr->v2->n, nor); @@ -851,7 +851,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par vlr->v3->accum= vlr->v4->accum; normal_quad_v3(vlr->n, vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co); - + vlr->mat= ma; vlr->ec= ME_V2V3; @@ -872,7 +872,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par if (sd->override_uv>=0) { MTFace *mtf; mtf=RE_vlakren_get_tface(obr, vlr, sd->override_uv, NULL, 0); - + mtf->uv[0][0]=mtf->uv[3][0]=0.0f; mtf->uv[1][0]=mtf->uv[2][0]=1.0f; @@ -899,13 +899,13 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par v1= RE_findOrAddVert(obr, obr->totvert++); v2= RE_findOrAddVert(obr, obr->totvert++); - + copy_v3_v3(v1->co, vec); add_v3_v3(v1->co, cross); copy_v3_v3(v1->n, nor); v1->orco= sd->orco; v1->accum = -1.0f; /* accum abuse for strand texco */ - + copy_v3_v3(v2->co, vec); sub_v3_v3v3(v2->co, v2->co, cross); copy_v3_v3(v2->n, nor); @@ -961,7 +961,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par vlr= RE_findOrAddVlak(obr, obr->totvlak-1); } } - + copy_v3_v3(vlr->v4->co, vec); add_v3_v3(vlr->v4->co, cross); copy_v3_v3(vlr->v4->n, nor); @@ -973,9 +973,9 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par copy_v3_v3(vlr->v3->n, nor); vlr->v3->orco= sd->orco; vlr->v3->accum= vlr->v4->accum; - + normal_quad_v3(vlr->n, vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co); - + vlr->mat= ma; vlr->ec= ME_V2V3; @@ -996,7 +996,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par if (sd->override_uv>=0) { MTFace *mtf; mtf=RE_vlakren_get_tface(obr, vlr, sd->override_uv, NULL, 0); - + mtf->uv[0][0]=mtf->uv[3][0]=0.0f; mtf->uv[1][0]=mtf->uv[2][0]=1.0f; @@ -1026,15 +1026,15 @@ static void static_particle_wire(ObjectRen *obr, Material *ma, const float vec[3 vlr->v2= RE_findOrAddVert(obr, obr->totvert++); vlr->v3= vlr->v2; vlr->v4= NULL; - + copy_v3_v3(vlr->v1->co, vec); copy_v3_v3(vlr->v2->co, vec1); - + sub_v3_v3v3(vlr->n, vec, vec1); normalize_v3(vlr->n); copy_v3_v3(vlr->v1->n, vlr->n); copy_v3_v3(vlr->v2->n, vlr->n); - + vlr->mat= ma; vlr->ec= ME_V1V2; @@ -1049,14 +1049,14 @@ static void static_particle_wire(ObjectRen *obr, Material *ma, const float vec[3 vlr->v2= RE_findOrAddVert(obr, obr->totvert++); vlr->v3= vlr->v2; vlr->v4= NULL; - + v1= vlr->v2; /* cycle */ copy_v3_v3(v1->co, vec); - + sub_v3_v3v3(vlr->n, vec, vec1); normalize_v3(vlr->n); copy_v3_v3(v1->n, vlr->n); - + vlr->mat= ma; vlr->ec= ME_V1V2; } @@ -1117,7 +1117,7 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Particl copy_v3_v3(vlr->v2->n, vlr->n); copy_v3_v3(vlr->v3->n, vlr->n); copy_v3_v3(vlr->v4->n, vlr->n); - + vlr->mat= ma; vlr->ec= ME_V2V3; @@ -1145,9 +1145,9 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Particl zvec[bb->align] = 0.0f; normalize_v3(zvec); } - + time = saacos(dot_v3v3(zvec, axis1)) / (float)M_PI; - + if (dot_v3v3(zvec, axis2) < 0.0f) time = 1.0f - time / 2.0f; else @@ -1206,7 +1206,7 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Particl static void particle_normal_ren(short ren_as, ParticleSettings *part, Render *re, ObjectRen *obr, DerivedMesh *dm, Material *ma, ParticleStrandData *sd, ParticleBillboardData *bb, ParticleKey *state, int seed, float hasize, float *pa_co) { float loc[3], loc0[3], loc1[3], vel[3]; - + copy_v3_v3(loc, state->co); if (ren_as != PART_DRAW_BB) @@ -1245,7 +1245,7 @@ static void particle_normal_ren(short ren_as, ParticleSettings *part, Render *re HaloRen *har = NULL; har = RE_inithalo_particle(re, obr, dm, ma, loc, NULL, sd->orco, sd->uvco, hasize, 0.0, seed, pa_co); - + if (har) har->lay= obr->ob->lay; break; @@ -1263,7 +1263,7 @@ static void get_particle_uvco_mcol(short from, DerivedMesh *dm, float *fuv, int MFace *mface = dm->getTessFaceData(dm, num, CD_MFACE); MTFace *mtface = (MTFace*)CustomData_get_layer_n(&dm->faceData, CD_MTFACE, i); mtface += num; - + psys_interpolate_uvs(mtface, mface->v4, fuv, sd->uvco + 2 * i); } else { @@ -1332,7 +1332,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem if (part==NULL || pars==NULL || !psys_check_enabled(ob, psys, G.is_rendering)) return 0; - + if (part->ren_as==PART_DRAW_OB || part->ren_as==PART_DRAW_GR || part->ren_as==PART_DRAW_NOT) return 1; @@ -1384,7 +1384,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem /* 2.1 setup material stff */ ma= give_render_material(re, ob, part->omat); - + #if 0 /* XXX old animation system */ if (ma->ipo) { calc_ipo(ma->ipo, cfra); @@ -1441,7 +1441,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem bb.totnum = totpart+totchild; bb.uv_split = part->bb_uv_split; } - + /* 2.5 setup matrices */ mul_m4_m4m4(mat, re->viewmat, ob->obmat); invert_m4_m4(ob->imat, mat); /* need to be that way, for imat texture */ @@ -1590,7 +1590,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem max_k = (int)cache->segments; } - + pa_time = psys_get_child_time(psys, cpa, cfra, &pa_birthtime, &pa_dietime); pa_size = psys_get_child_size(psys, cpa, cfra, &pa_time); @@ -1868,13 +1868,13 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem if (sd.uvco) MEM_freeN(sd.uvco); - + if (sd.mcol) MEM_freeN(sd.mcol); if (states) MEM_freeN(states); - + BLI_rng_free(rng); psys->flag &= ~PSYS_DRAWING; @@ -1948,7 +1948,7 @@ static int verghalo(const void *a1, const void *a2) { const HaloRen *har1= *(const HaloRen**)a1; const HaloRen *har2= *(const HaloRen**)a2; - + if (har1->zs < har2->zs) return 1; else if (har1->zs > har2->zs) return -1; return 0; @@ -1986,7 +1986,7 @@ static short test_for_displace(Render *re, Object *ob) /* return 1 when this object uses displacement textures. */ Material *ma; int i; - + for (i=1; i<=ob->totcol; i++) { ma=give_render_material(re, ob, i); /* ma->mapto is ORed total of all mapto channels */ @@ -2051,10 +2051,10 @@ static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, Ve } shi->displace[0]= shi->displace[1]= shi->displace[2]= 0.0; - + do_material_tex(shi, re); - - //printf("no=%f, %f, %f\nbefore co=%f, %f, %f\n", vr->n[0], vr->n[1], vr->n[2], + + //printf("no=%f, %f, %f\nbefore co=%f, %f, %f\n", vr->n[0], vr->n[1], vr->n[2], //vr->co[0], vr->co[1], vr->co[2]); displace[0]= shi->displace[0] * scale[0]; @@ -2062,22 +2062,22 @@ static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, Ve displace[2]= shi->displace[2] * scale[2]; /* 0.5 could become button once? */ - vr->co[0] += displace[0]; + vr->co[0] += displace[0]; vr->co[1] += displace[1]; vr->co[2] += displace[2]; - - //printf("after co=%f, %f, %f\n", vr->co[0], vr->co[1], vr->co[2]); - + + //printf("after co=%f, %f, %f\n", vr->co[0], vr->co[1], vr->co[2]); + /* we just don't do this vertex again, bad luck for other face using same vertex with * different material... */ vr->flag |= 1; - + /* Pass sample back so displace_face can decide which way to split the quad */ sample = shi->displace[0]*shi->displace[0]; sample += shi->displace[1]*shi->displace[1]; sample += shi->displace[2]*shi->displace[2]; - - vr->accum=sample; + + vr->accum=sample; /* Should be sqrt(sample), but I'm only looking for "bigger". Save the cycles. */ return; } @@ -2088,11 +2088,11 @@ static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, float /* Warning, This is not that nice, and possibly a bit slow, * however some variables were not initialized properly in, unless using shade_input_initialize(...), we need to do a memset */ - memset(&shi, 0, sizeof(ShadeInput)); + memset(&shi, 0, sizeof(ShadeInput)); /* end warning! - Campbell */ - + /* set up shadeinput struct for multitex() */ - + /* memset above means we don't need this */ /*shi.osatex= 0;*/ /* signal not to use dx[] and dy[] texture AA vectors */ @@ -2100,7 +2100,7 @@ static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, float shi.vlr= vlr; /* current render face */ shi.mat= vlr->mat; /* current input material */ shi.thread= 0; - + /* TODO, assign these, displacement with new bumpmap is skipped without - campbell */ #if 0 /* order is not known ? */ @@ -2112,7 +2112,7 @@ static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, float /* Displace the verts, flag is set when done */ if (!vlr->v1->flag) displace_render_vert(re, obr, &shi, vlr->v1, 0, scale); - + if (!vlr->v2->flag) displace_render_vert(re, obr, &shi, vlr->v2, 1, scale); @@ -2123,11 +2123,11 @@ static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, float if (!vlr->v4->flag) displace_render_vert(re, obr, &shi, vlr->v4, 3, scale); - /* closest in displace value. This will help smooth edges. */ + /* closest in displace value. This will help smooth edges. */ if (fabsf(vlr->v1->accum - vlr->v3->accum) > fabsf(vlr->v2->accum - vlr->v4->accum)) vlr->flag |= R_DIVIDE_24; else vlr->flag &= ~R_DIVIDE_24; } - + /* Recalculate the face normal - if flipped before, flip now */ if (vlr->v4) { normal_quad_v3(vlr->n, vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co); @@ -2145,7 +2145,7 @@ static void displace(Render *re, ObjectRen *obr) float scale[3]={1.0f, 1.0f, 1.0f}, temp[3];//, xn int i; //, texflag=0; Object *obt; - + /* Object Size with parenting */ obt=obr->ob; while (obt) { @@ -2153,7 +2153,7 @@ static void displace(Render *re, ObjectRen *obr) scale[0]*=temp[0]; scale[1]*=temp[1]; scale[2]*=temp[2]; obt=obt->parent; } - + /* Clear all flags */ for (i=0; i<obr->totvert; i++) { vr= RE_findOrAddVert(obr, i); @@ -2164,7 +2164,7 @@ static void displace(Render *re, ObjectRen *obr) vlr=RE_findOrAddVlak(obr, i); displace_render_face(re, obr, vlr, scale); } - + /* Recalc vertex normals */ calc_vertexnormals(re, obr, 1, 0, 0); } @@ -2232,7 +2232,7 @@ static void init_render_mball(Render *re, ObjectRen *obr) ver->n[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn; normalize_v3(ver->n); //if (ob->transflag & OB_NEG_SCALE) negate_v3(ver->n); - + if (need_orco) { ver->orco= orco; orco+=3; @@ -2290,10 +2290,10 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, int p1, p2, p3, p4, a; int sizeu, nsizeu, sizev, nsizev; int startvert, startvlak; - + startvert= obr->totvert; - nsizeu = sizeu = dl->parts; nsizev = sizev = dl->nr; - + nsizeu = sizeu = dl->parts; nsizev = sizev = dl->nr; + data= dl->verts; for (u = 0; u < sizeu; u++) { v1 = RE_findOrAddVert(obr, obr->totvert++); /* save this for possible V wrapping */ @@ -2302,7 +2302,7 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, v1->orco= orco; orco+= 3; orcoret++; } mul_m4_v3(mat, v1->co); - + for (v = 1; v < sizev; v++) { ver= RE_findOrAddVert(obr, obr->totvert++); copy_v3_v3(ver->co, data); data += 3; @@ -2320,11 +2320,11 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, } } } - + /* Done before next loop to get corner vert */ if (dl->flag & DL_CYCL_U) nsizev++; if (dl->flag & DL_CYCL_V) nsizeu++; - + /* if U cyclic, add extra row at end of column */ if (dl->flag & DL_CYCL_V) { for (v = 0; v < nsizev; v++) { @@ -2336,47 +2336,47 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, } } } - + sizeu = nsizeu; sizev = nsizev; - + startvlak= obr->totvlak; - + for (u = 0; u < sizeu - 1; u++) { p1 = startvert + u * sizev; /* walk through face list */ p2 = p1 + 1; p3 = p2 + sizev; p4 = p3 - 1; - + for (v = 0; v < sizev - 1; v++) { v1= RE_findOrAddVert(obr, p1); v2= RE_findOrAddVert(obr, p2); v3= RE_findOrAddVert(obr, p3); v4= RE_findOrAddVert(obr, p4); - + vlr= RE_findOrAddVlak(obr, obr->totvlak++); vlr->v1= v1; vlr->v2= v2; vlr->v3= v3; vlr->v4= v4; - + normal_quad_v3(n1, vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co); - + copy_v3_v3(vlr->n, n1); - + vlr->mat= matar[ dl->col]; vlr->ec= ME_V1V2+ME_V2V3; vlr->flag= dl->rt; - + add_v3_v3(v1->n, n1); add_v3_v3(v2->n, n1); add_v3_v3(v3->n, n1); add_v3_v3(v4->n, n1); - + p1++; p2++; p3++; p4++; } } /* fix normals for U resp. V cyclic faces */ sizeu--; sizev--; /* dec size for face array */ if (dl->flag & DL_CYCL_V) { - + for (v = 0; v < sizev; v++) { /* optimize! :*/ vlr= RE_findOrAddVlak(obr, UVTOINDEX(sizeu - 1, v)); @@ -2388,7 +2388,7 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, } } if (dl->flag & DL_CYCL_U) { - + for (u = 0; u < sizeu; u++) { /* optimize! :*/ vlr= RE_findOrAddVlak(obr, UVTOINDEX(u, 0)); @@ -2400,7 +2400,7 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, } } - /* last vertex is an extra case: + /* last vertex is an extra case: * * ^ ()----()----()----() * | | | || | @@ -2412,7 +2412,7 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, * | | || | * ()----()----()----() * v -> - * + * * vertex [] is no longer shared, therefore distribute * normals of the surrounding faces to all of the duplicates of [] */ @@ -2434,8 +2434,8 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, ver= RE_findOrAddVert(obr, a); normalize_v3(ver->n); } - - + + return orcoret; } @@ -2660,7 +2660,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) BKE_displist_make_curveTypes_forRender(re->scene, ob, &disp, &dm, false, true); dl= disp.first; if (dl==NULL) return; - + mul_m4_m4m4(mat, re->viewmat, ob->obmat); invert_m4_m4(ob->imat, mat); negative_scale = is_negative_m4(mat); @@ -3225,7 +3225,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) /* attempt to autsmooth on original mesh, only without subsurf */ if (do_autosmooth && me->totvert==totvert && me->totface==dm->getNumTessFaces(dm)) use_original_normals= true; - + ma= give_render_material(re, ob, 1); @@ -3273,7 +3273,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) *origindex = a; } } - + if (!timeoffset) { short (*lnp)[4][3] = NULL; #ifdef WITH_FREESTYLE @@ -3294,7 +3294,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) obr->tangent_mask = dm->tangent_mask; DM_generate_tangent_tessface_data(dm, need_nmap_tangent_concrete || need_tangent); } - + /* still to do for keys: the correct local texture coordinate */ /* faces in order of color blocks */ @@ -3320,7 +3320,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) } } } - + /* if wire material, and we got edges, don't do the faces */ if (ma->material_type == MA_TYPE_WIRE) { end= dm->getNumEdges(dm); @@ -3340,10 +3340,10 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) index_mp_to_orig= dm->getPolyDataArray(dm, CD_ORIGINDEX); ffa= CustomData_get_layer(&me->pdata, CD_FREESTYLE_FACE); #endif - + for (a=0; a<end; a++, mface++) { int v1, v2, v3, v4, flag; - + if ( mface->mat_nr==a1 ) { float len; bool reverse_verts = (negative_scale != 0 && do_autosmooth == false); @@ -3390,16 +3390,16 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) if (use_original_normals) { MFace *mf= me->mface+a; MVert *mv= me->mvert; - + if (vlr->v4) len= normal_quad_v3(vlr->n, mv[mf->v4].co, mv[mf->v3].co, mv[mf->v2].co, mv[mf->v1].co); - else + else len= normal_tri_v3(vlr->n, mv[mf->v3].co, mv[mf->v2].co, mv[mf->v1].co); } else { if (vlr->v4) len= normal_quad_v3(vlr->n, vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co); - else + else len= normal_tri_v3(vlr->n, vlr->v3->co, vlr->v2->co, vlr->v1->co); } @@ -3419,7 +3419,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) for (index=0; index<dm->faceData.totlayer; index++) { layer= &dm->faceData.layers[index]; name= layer->name; - + if (layer->type == CD_MTFACE && mtfn < MAX_MTFACE) { int t; mtf= RE_vlakren_get_tface(obr, vlr, mtfn++, &name, 1); @@ -3494,7 +3494,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) if (edge_hash) BLI_edgehash_free(edge_hash, NULL); #endif - + /* exception... we do edges for wire mode. potential conflict when faces exist... */ end= dm->getNumEdges(dm); mvert= dm->getVertArray(dm); @@ -3504,12 +3504,12 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) struct edgesort *edgetable; int totedge= 0; recalc_normals= 1; - + medge= dm->getEdgeArray(dm); - + /* we want edges to have UV and vcol too... */ edgetable= make_mesh_edge_lookup(dm, &totedge); - + for (a1=0; a1<end; a1++, medge++) { if (medge->flag&ME_EDGERENDER) { MVert *v0 = &mvert[medge->v1]; @@ -3520,10 +3520,10 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) vlr->v2= RE_findOrAddVert(obr, vertofs+medge->v2); vlr->v3= vlr->v2; vlr->v4= NULL; - + if (edgetable) use_mesh_edge_lookup(obr, dm, medge, vlr, edgetable, totedge); - + xn= -(v0->no[0]+v1->no[0]); yn= -(v0->no[1]+v1->no[1]); zn= -(v0->no[2]+v1->no[2]); @@ -3532,7 +3532,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) vlr->n[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn; vlr->n[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn; normalize_v3(vlr->n); - + vlr->mat= ma; vlr->flag= 0; vlr->ec= ME_V1V2; @@ -3543,7 +3543,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) } } } - + if (!timeoffset) { if (need_stress) calc_edge_stress(re, obr, me); @@ -3575,49 +3575,49 @@ static void initshadowbuf(Render *re, LampRen *lar, float mat[4][4]) { struct ShadBuf *shb; float viewinv[4][4]; - + /* if (la->spsi<16) return; */ - + /* memory alloc */ shb= (struct ShadBuf *)MEM_callocN(sizeof(struct ShadBuf), "initshadbuf"); lar->shb= shb; - + if (shb==NULL) return; - + VECCOPY(shb->co, lar->co); /* int copy */ - + /* percentage render: keep track of min and max */ shb->size= (lar->bufsize*re->r.size)/100; - + if (shb->size<512) shb->size= 512; else if (shb->size > lar->bufsize) shb->size= lar->bufsize; - + shb->size &= ~15; /* make sure its multiples of 16 */ - + shb->samp= lar->samp; shb->soft= lar->soft; shb->shadhalostep= lar->shadhalostep; - + normalize_m4(mat); invert_m4_m4(shb->winmat, mat); /* winmat is temp */ - + /* matrix: combination of inverse view and lampmat */ /* calculate again: the ortho-render has no correct viewinv */ invert_m4_m4(viewinv, re->viewmat); mul_m4_m4m4(shb->viewmat, shb->winmat, viewinv); - + /* projection */ shb->d= lar->clipsta; shb->clipend= lar->clipend; - + /* bias is percentage, made 2x larger because of correction for angle of incidence */ /* when a ray is closer to parallel of a face, bias value is increased during render */ shb->bias= (0.02f*lar->bias)*0x7FFFFFFF; - + /* halfway method (average of first and 2nd z) reduces bias issues */ if (ELEM(lar->buftype, LA_SHADBUF_HALFWAY, LA_SHADBUF_DEEP)) shb->bias= 0.1f*shb->bias; - + shb->compressthresh= lar->compressthresh; } @@ -3629,7 +3629,7 @@ void area_lamp_vectors(LampRen *lar) multifac= 1.0f/sqrtf((float)lar->ray_totsamp); xsize *= multifac; ysize *= multifac; - + /* corner vectors */ lar->area[0][0]= lar->co[0] - xsize*lar->mat[0][0] - ysize*lar->mat[1][0]; lar->area[0][1]= lar->co[1] - xsize*lar->mat[0][1] - ysize*lar->mat[1][1]; @@ -3665,14 +3665,14 @@ static GroupObject *add_render_lamp(Render *re, Object *ob) /* previewrender sets this to zero... prevent accidents */ if (la==NULL) return NULL; - + /* prevent only shadow from rendering light */ if (la->mode & LA_ONLYSHADOW) if ((re->r.mode & R_SHADOW)==0) return NULL; - + re->totlamp++; - + /* groups is used to unify support for lightgroups, this is the global lightgroup */ go= MEM_callocN(sizeof(GroupObject), "groupobject"); BLI_addtail(&re->lights, go); @@ -3699,7 +3699,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob) lar->shadhalostep = la->shadhalostep; lar->clipsta = la->clipsta; lar->clipend = la->clipend; - + lar->bias = la->bias; lar->compressthresh = la->compressthresh; @@ -3731,25 +3731,25 @@ static GroupObject *add_render_lamp(Render *re, Object *ob) lar->ray_samp= la->ray_samp; lar->ray_sampy= la->ray_sampy; lar->ray_sampz= la->ray_sampz; - + lar->area_size= la->area_size; lar->area_sizey= la->area_sizey; lar->area_sizez= la->area_sizez; lar->area_shape= la->area_shape; - + /* Annoying, lamp UI does this, but the UI might not have been used? - add here too. * make sure this matches buttons_shading.c's logic */ if (ELEM(la->type, LA_AREA, LA_SPOT, LA_SUN, LA_LOCAL) && (la->mode & LA_SHAD_RAY)) if (ELEM(la->type, LA_SPOT, LA_SUN, LA_LOCAL)) if (la->ray_samp_method == LA_SAMP_CONSTANT) la->ray_samp_method = LA_SAMP_HALTON; - + lar->ray_samp_method= la->ray_samp_method; lar->ray_samp_type= la->ray_samp_type; - + lar->adapt_thresh= la->adapt_thresh; lar->sunsky = NULL; - + if ( ELEM(lar->type, LA_SPOT, LA_LOCAL)) { lar->ray_totsamp= lar->ray_samp*lar->ray_samp; lar->area_shape = LA_AREA_SQUARE; @@ -3790,7 +3790,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob) { lar->sunsky = (struct SunSky*)MEM_callocN(sizeof(struct SunSky), "sunskyren"); lar->sunsky->effect_type = la->sun_effect_type; - + copy_v3_v3(vec, ob->obmat[2]); normalize_v3(vec); @@ -3804,7 +3804,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob) } } else lar->ray_totsamp= 0; - + lar->spotsi= la->spotsize; if (lar->mode & LA_HALO) { if (lar->spotsi > DEG2RADF(170.0f)) lar->spotsi = DEG2RADF(170.0f); @@ -3878,7 +3878,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob) for (c=0; c<MAX_MTEX; c++) { if (la->mtex[c] && la->mtex[c]->tex) { - if (la->mtex[c]->mapto & LAMAP_COL) + if (la->mtex[c]->mapto & LAMAP_COL) lar->mode |= LA_TEXTURE; if (la->mtex[c]->mapto & LAMAP_SHAD) lar->mode |= LA_SHAD_TEX; @@ -3898,10 +3898,10 @@ static GroupObject *add_render_lamp(Render *re, Object *ob) if ( (re->r.mode & R_RAYTRACE)==0) lar->mode &= ~LA_SHAD_RAY; } - + if (re->r.mode & R_SHADOW) { - + if (la->type==LA_AREA && (lar->mode & LA_SHAD_RAY) && (lar->ray_samp_method == LA_SAMP_CONSTANT)) { init_jitter_plane(lar); } @@ -3911,8 +3911,8 @@ static GroupObject *add_render_lamp(Render *re, Object *ob) copy_m4_m4(mat, ob->obmat); initshadowbuf(re, lar, mat); /* mat is altered */ } - - + + /* this is the way used all over to check for shadow */ if (lar->shb || (lar->mode & LA_SHAD_RAY)) { LampShadowSample *ls; @@ -3920,7 +3920,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob) int a, b; memset(re->shadowsamplenr, 0, sizeof(re->shadowsamplenr)); - + lar->shadsamp= MEM_mallocN(re->r.threads*sizeof(LampShadowSample), "lamp shadow sample"); ls= lar->shadsamp; @@ -3938,7 +3938,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob) } } } - + return go; } @@ -3954,7 +3954,7 @@ static bool is_object_hidden(Render *re, Object *ob) { if (is_object_restricted(re, ob)) return true; - + if (re->r.scemode & R_VIEWPORT_PREVIEW) { /* Mesh deform cages and so on mess up the preview. To avoid the problem, * viewport doesn't show mesh object if its draw type is bounding box or wireframe. @@ -3978,7 +3978,7 @@ static bool is_object_hidden(Render *re, Object *ob) static void add_lightgroup(Render *re, Group *group, int exclusive) { GroupObject *go, *gol; - + group->id.tag &= ~LIB_TAG_DOIT; /* it's a bit too many loops in loops... but will survive */ @@ -3988,7 +3988,7 @@ static void add_lightgroup(Render *re, Group *group, int exclusive) if (is_object_hidden(re, go->ob)) continue; - + if (go->ob->lay & re->lay) { if (go->ob && go->ob->type==OB_LAMP) { for (gol= re->lights.first; gol; gol= gol->next) { @@ -4012,14 +4012,14 @@ static void set_material_lightgroups(Render *re) { Group *group; Material *ma; - + /* not for preview render */ if (re->scene->r.scemode & (R_BUTS_PREVIEW|R_VIEWPORT_PREVIEW)) return; - + for (group= re->main->group.first; group; group=group->id.next) group->id.tag |= LIB_TAG_DOIT; - + /* it's a bit too many loops in loops... but will survive */ /* hola! materials not in use...? */ for (ma= re->main->mat.first; ma; ma=ma->id.next) { @@ -4031,7 +4031,7 @@ static void set_material_lightgroups(Render *re) static void set_renderlayer_lightgroups(Render *re, Scene *sce) { SceneRenderLayer *srl; - + for (srl= sce->r.layers.first; srl; srl= srl->next) { if (srl->light_override) add_lightgroup(re, srl->light_override, 0); @@ -4050,17 +4050,17 @@ void init_render_world(Render *re) }; int a; - + if (re->scene && re->scene->world) { re->wrld = *(re->scene->world); copy_v3_v3(re->grvec, re->viewmat[2]); normalize_v3(re->grvec); copy_m3_m4(re->imat, re->viewinv); - + for (a=0; a<MAX_MTEX; a++) if (re->wrld.mtex[a] && re->wrld.mtex[a]->tex) re->wrld.skytype |= WO_SKYTEX; - + /* AO samples should be OSA minimum */ if (re->osa) while (re->wrld.aosamp*re->wrld.aosamp < re->osa) @@ -4072,13 +4072,13 @@ void init_render_world(Render *re) memset(&re->wrld, 0, sizeof(World)); re->wrld.exp= 0.0f; re->wrld.range= 1.0f; - + /* for mist pass */ re->wrld.miststa= re->clipsta; re->wrld.mistdist= re->clipend-re->clipsta; re->wrld.misi= 1.0f; } - + re->wrld.linfac= 1.0f + powf((2.0f*re->wrld.exp + 0.5f), -10); re->wrld.logfac= logf((re->wrld.linfac-1.0f)/re->wrld.linfac) / re->wrld.range; @@ -4100,11 +4100,11 @@ static void set_phong_threshold(ObjectRen *obr) VlakRen *vlr; float thresh= 0.0, dot; int tot=0, i; - - /* Added check for 'pointy' situations, only dotproducts of 0.9 and larger + + /* Added check for 'pointy' situations, only dotproducts of 0.9 and larger * are taken into account. This threshold is meant to work on smooth geometry, not * for extreme cases (ton) */ - + for (i=0; i<obr->totvlak; i++) { vlr= RE_findOrAddVlak(obr, i); if ((vlr->flag & R_SMOOTH) && (vlr->flag & R_STRAND)==0) { @@ -4134,7 +4134,7 @@ static void set_phong_threshold(ObjectRen *obr) } } } - + if (tot) { thresh/= (float)tot; obr->ob->smoothresh= cosf(0.5f*(float)M_PI-saacos(thresh)); @@ -4150,14 +4150,14 @@ static void set_fullsample_trace_flag(Render *re, ObjectRen *obr) osa= re->osa; trace= re->r.mode & R_RAYTRACE; - + for (a=obr->totvlak-1; a>=0; a--) { vlr= RE_findOrAddVlak(obr, a); mode= vlr->mat->mode; if (trace && (mode & MA_TRACEBLE)) vlr->flag |= R_TRACEBLE; - + if (osa) { if (mode & MA_FULL_OSA) { vlr->flag |= R_FULL_OSA; @@ -4170,7 +4170,7 @@ static void set_fullsample_trace_flag(Render *re, ObjectRen *obr) /* pass */ } else if ((mode & MA_RAYMIRROR) || ((mode & MA_TRANSP) && (mode & MA_RAYTRANSP))) { - /* for blurry reflect/refract, better to take more samples + /* for blurry reflect/refract, better to take more samples * inside the raytrace than as OSA samples */ if ((vlr->mat->gloss_mir == 1.0f) && (vlr->mat->gloss_tra == 1.0f)) vlr->flag |= R_FULL_OSA; @@ -4183,22 +4183,22 @@ static void set_fullsample_trace_flag(Render *re, ObjectRen *obr) /* split quads for predictable baking * dir 1 == (0, 1, 2) (0, 2, 3), 2 == (1, 3, 0) (1, 2, 3) */ -static void split_quads(ObjectRen *obr, int dir) +static void split_quads(ObjectRen *obr, int dir) { VlakRen *vlr, *vlr1; int a; for (a=obr->totvlak-1; a>=0; a--) { vlr= RE_findOrAddVlak(obr, a); - + /* test if rendering as a quad or triangle, skip wire */ if ((vlr->flag & R_STRAND)==0 && (vlr->mat->material_type != MA_TYPE_WIRE)) { - + if (vlr->v4) { vlr1= RE_vlakren_copy(obr, vlr); vlr1->flag |= R_FACE_SPLIT; - + if ( dir==2 ) vlr->flag |= R_DIVIDE_24; else vlr->flag &= ~R_DIVIDE_24; @@ -4209,18 +4209,18 @@ static void split_quads(ObjectRen *obr, int dir) vlr1->v3= vlr->v4; vlr->v3 = vlr->v4; - + vlr1->flag |= R_DIVIDE_24; } else { vlr1->v1= vlr->v1; vlr1->v2= vlr->v3; vlr1->v3= vlr->v4; - + vlr1->flag &= ~R_DIVIDE_24; } vlr->v4 = vlr1->v4 = NULL; - + #ifdef WITH_FREESTYLE /* Freestyle edge marks */ if (vlr->flag & R_DIVIDE_24) { @@ -4260,10 +4260,10 @@ static void check_non_flat_quads(ObjectRen *obr) for (a=obr->totvlak-1; a>=0; a--) { vlr= RE_findOrAddVlak(obr, a); - + /* test if rendering as a quad or triangle, skip wire */ if (vlr->v4 && (vlr->flag & R_STRAND)==0 && (vlr->mat->material_type != MA_TYPE_WIRE)) { - + /* check if quad is actually triangle */ v1= vlr->v1; v2= vlr->v2; @@ -4298,20 +4298,20 @@ static void check_non_flat_quads(ObjectRen *obr) } } } - + if (vlr->v4) { - + /* Face is divided along edge with the least gradient */ /* Flagged with R_DIVIDE_24 if divide is from vert 2 to 4 */ /* 4---3 4---3 */ /* |\ 1| or |1 /| */ /* |0\ | |/ 0| */ /* 1---2 1---2 0 = orig face, 1 = new face */ - + /* render normals are inverted in render! we calculate normal of single tria here */ flen= normal_tri_v3(nor, vlr->v4->co, vlr->v3->co, vlr->v1->co); if (flen==0.0f) normal_tri_v3(nor, vlr->v4->co, vlr->v2->co, vlr->v1->co); - + xn = dot_v3v3(nor, vlr->n); if (ABS(xn) < 0.999995f ) { /* checked on noisy fractal grid */ @@ -4320,7 +4320,7 @@ static void check_non_flat_quads(ObjectRen *obr) vlr1= RE_vlakren_copy(obr, vlr); vlr1->flag |= R_FACE_SPLIT; - + /* split direction based on vnorms */ normal_tri_v3(nor, vlr->v1->co, vlr->v2->co, vlr->v3->co); d1 = dot_v3v3(nor, vlr->v1->n); @@ -4338,18 +4338,18 @@ static void check_non_flat_quads(ObjectRen *obr) vlr1->v3= vlr->v4; vlr->v3 = vlr->v4; - + vlr1->flag |= R_DIVIDE_24; } else { vlr1->v1= vlr->v1; vlr1->v2= vlr->v3; vlr1->v3= vlr->v4; - + vlr1->flag &= ~R_DIVIDE_24; } vlr->v4 = vlr1->v4 = NULL; - + /* new normals */ normal_tri_v3(vlr->n, vlr->v3->co, vlr->v2->co, vlr->v1->co); normal_tri_v3(vlr1->n, vlr1->v3->co, vlr1->v2->co, vlr1->v1->co); @@ -4391,19 +4391,19 @@ static void finalize_render_object(Render *re, ObjectRen *obr, int timeoffset) int a, b; if (obr->totvert || obr->totvlak || obr->tothalo || obr->totstrand) { - /* the exception below is because displace code now is in init_render_mesh call, + /* the exception below is because displace code now is in init_render_mesh call, * I will look at means to have autosmooth enabled for all object types * and have it as general postprocess, like displace */ if (ob->type!=OB_MESH && test_for_displace(re, ob)) displace(re, obr); - + if (!timeoffset) { /* phong normal interpolation can cause error in tracing * (terminator problem) */ ob->smoothresh= 0.0; if ((re->r.mode & R_RAYTRACE) && (re->r.mode & R_SHADOW)) set_phong_threshold(obr); - + if (re->flag & R_BAKING && re->r.bake_quad_split != 0) { /* Baking lets us define a quad split order */ split_quads(obr, re->r.bake_quad_split); @@ -4414,7 +4414,7 @@ static void finalize_render_object(Render *re, ObjectRen *obr, int timeoffset) if ((re->r.mode & R_SIMPLIFY && re->r.simplify_flag & R_SIMPLE_NO_TRIANGULATE) == 0) check_non_flat_quads(obr); } - + set_fullsample_trace_flag(re, obr); /* compute bounding boxes for clipping */ @@ -4428,17 +4428,17 @@ static void finalize_render_object(Render *re, ObjectRen *obr, int timeoffset) if (obr->strandbuf) { float width; - + /* compute average bounding box of strandpoint itself (width) */ if (obr->strandbuf->flag & R_STRAND_B_UNITS) obr->strandbuf->maxwidth = max_ff(obr->strandbuf->ma->strand_sta, obr->strandbuf->ma->strand_end); else obr->strandbuf->maxwidth= 0.0f; - + width= obr->strandbuf->maxwidth; sbound= obr->strandbuf->bound; for (b=0; b<obr->strandbuf->totbound; b++, sbound++) { - + INIT_MINMAX(smin, smax); for (a=sbound->start; a<sbound->end; a++) { @@ -4556,7 +4556,7 @@ static ObjectRen *find_dupligroup_dupli(Render *re, Object *ob, int psysindex) for (obr=re->objecttable.first; obr; obr=obr->next) if (obr->ob == ob && obr->psysindex == psysindex && (obr->flag & R_INSTANCEABLE)) return obr; - + return NULL; } @@ -4697,7 +4697,7 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject * } else find_dupli_instances(re, obr, dob); - + for (i=1; i<=ob->totcol; i++) { Material* ma = give_render_material(re, ob, i); if (ma && ma->material_type == MA_TYPE_VOLUME) @@ -4711,7 +4711,7 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject * for (psys=ob->particlesystem.first; psys; psys=psys->next, psysindex++) { if (!psys_check_enabled(ob, psys, G.is_rendering)) continue; - + obr= RE_addRenderObject(re, ob, par, index, psysindex, ob->lay); if ((dob && !dob->animated) || (ob->transflag & OB_RENDER_DUPLI)) { obr->flag |= R_INSTANCEABLE; @@ -4752,7 +4752,7 @@ static void init_render_object(Render *re, Object *ob, Object *par, DupliObject mul_m4_m4m4(mat, re->viewmat, ob->obmat); invert_m4_m4(ob->imat, mat); } - + time= PIL_check_seconds_timer(); if (time - lasttime > 1.0) { lasttime= time; @@ -4785,7 +4785,7 @@ void RE_Database_Free(Render *re) } /* FREE */ - + for (lar= re->lampren.first; lar; lar= lar->next) { freeshadowbuf(lar); if (lar->jitter) MEM_freeN(lar->jitter); @@ -4793,9 +4793,9 @@ void RE_Database_Free(Render *re) if (lar->sunsky) MEM_freeN(lar->sunsky); curvemapping_free(lar->curfalloff); } - + free_volume_precache(re); - + BLI_freelistN(&re->lampren); BLI_freelistN(&re->lights); @@ -4809,9 +4809,9 @@ void RE_Database_Free(Render *re) end_render_textures(re); free_pointdensities(re); } - + free_camera_inside_volumes(re); - + if (re->wrld.aosphere) { MEM_freeN(re->wrld.aosphere); re->wrld.aosphere= NULL; @@ -4826,13 +4826,13 @@ void RE_Database_Free(Render *re) } if (re->r.mode & R_RAYTRACE) free_render_qmcsampler(re); - + if (re->r.mode & R_RAYTRACE) freeraytree(re); free_sss(re); free_occ(re); free_strand_surface(re); - + re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0; re->i.convertdone = false; @@ -4860,17 +4860,17 @@ static int allow_render_object(Render *re, Object *ob, int nolamps, int onlysele return 0; } } - + /* don't add non-basic meta objects, ends up having renderobjects with no geometry */ if (ob->type == OB_MBALL && ob!=BKE_mball_basis_find(re->eval_ctx, re->scene, ob)) return 0; - + if (nolamps && (ob->type==OB_LAMP)) return 0; - + if (onlyselected && (ob!=actob && !(ob->flag & SELECT))) return 0; - + return 1; } @@ -4915,7 +4915,7 @@ static void dupli_render_particle_set(Render *re, Object *ob, int timeoffset, in if (level >= MAX_DUPLI_RECUR) return; - + if (ob->transflag & OB_DUPLIPARTS) { for (psys=ob->particlesystem.first; psys; psys=psys->next) { if (ELEM(psys->part->ren_as, PART_DRAW_OB, PART_DRAW_GR)) { @@ -5006,7 +5006,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp * See bug: [#28744] - campbell */ for (ob= re->main->object.first; ob; ob= ob->id.next) { float mat[4][4]; - + /* imat objects has to be done here, since displace can have texture using Object map-input */ mul_m4_m4m4(mat, re->viewmat, ob->obmat); invert_m4_m4(ob->imat_ren, mat); @@ -5134,7 +5134,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp if (obi==NULL) /* can't instance, just create the object */ init_render_object(re, obd, ob, dob, dob_extra->obmat, timeoffset); - + if (dob->type != OB_DUPLIGROUP) { obd->flag |= OB_DONE; obd->transflag |= OB_RENDER_DUPLI; @@ -5142,7 +5142,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp } else init_render_object(re, obd, ob, dob, dob_extra->obmat, timeoffset); - + if (re->test_break(re->tbh)) break; } @@ -5188,34 +5188,34 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l if (re->r.scemode & R_VIEWPORT_PREVIEW) re->scene_color_manage = BKE_scene_check_color_management_enabled(scene); - + /* scene needs to be set to get camera */ camera= RE_GetCamera(re); - + /* per second, per object, stats print this */ re->i.infostr= "Preparing Scene data"; re->i.cfra= scene->r.cfra; BLI_strncpy(re->i.scene_name, scene->id.name + 2, sizeof(re->i.scene_name)); - + /* XXX add test if dbase was filled already? */ - + re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "render db arena"); re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0; re->lights.first= re->lights.last= NULL; re->lampren.first= re->lampren.last= NULL; re->i.partsdone = false; /* signal now in use for previewrender */ - + /* in localview, lamps are using normal layers, objects only local bits */ if (re->lay & 0xFF000000) lay &= 0xFF000000; - + /* applies changes fully */ if ((re->r.scemode & (R_NO_FRAME_UPDATE|R_BUTS_PREVIEW|R_VIEWPORT_PREVIEW))==0) { BKE_scene_update_for_newframe(re->eval_ctx, re->main, re->scene, lay); render_update_anim_renderdata(re, &re->scene->r); } - + /* if no camera, viewmat should have been set! */ if (use_camera_view && camera) { /* called before but need to call again in case of lens animation from the @@ -5229,10 +5229,10 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l /* force correct matrix for scaled cameras */ DAG_id_tag_update_ex(re->main, &camera->id, OB_RECALC_OB); } - + /* store for incremental render, viewmat rotates dbase */ copy_m4_m4(re->viewmat_orig, re->viewmat); - + init_render_world(re); /* do first, because of ambient. also requires re->osa set correct */ if (re->r.mode & R_RAYTRACE) { init_render_qmcsampler(re); @@ -5241,7 +5241,7 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l if (re->wrld.ao_samp_method == WO_AOSAMP_CONSTANT) init_ao_sphere(re, &re->wrld); } - + /* still bad... doing all */ init_render_textures(re); copy_v3_v3(amb, &re->wrld.ambr); @@ -5250,12 +5250,12 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l /* MAKE RENDER DATA */ database_init_objects(re, lay, 0, 0, NULL, 0); - + if (!re->test_break(re->tbh)) { set_material_lightgroups(re); for (sce= re->scene; sce; sce= sce->set) set_renderlayer_lightgroups(re, sce); - + /* for now some clumsy copying still */ re->i.totvert= re->totvert; re->i.totface= re->totvlak; @@ -5273,9 +5273,9 @@ void RE_Database_Preprocess(Render *re) tothalo= re->tothalo; sort_halos(re, tothalo); - + init_camera_inside_volumes(re); - + re->i.infostr = IFACE_("Creating Shadowbuffers"); re->stats_draw(re->sdh, &re->i); @@ -5293,7 +5293,7 @@ void RE_Database_Preprocess(Render *re) /* ENVIRONMENT MAPS */ if (!re->test_break(re->tbh)) make_envmaps(re); - + /* point density texture */ if (!re->test_break(re->tbh)) make_pointdensities(re); @@ -5301,10 +5301,10 @@ void RE_Database_Preprocess(Render *re) if (!re->test_break(re->tbh)) make_voxeldata(re); } - + if (!re->test_break(re->tbh)) project_renderdata(re, projectverto, (re->r.mode & R_PANORAMA) != 0, 0, 1); - + /* Occlusion */ if ((re->wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)) && !re->test_break(re->tbh)) if (re->wrld.ao_gather_method == WO_AOGATHER_APPROX) @@ -5314,17 +5314,17 @@ void RE_Database_Preprocess(Render *re) /* SSS */ if ((re->r.mode & R_SSS) && !re->test_break(re->tbh)) make_sss_tree(re); - + if (!re->test_break(re->tbh)) if (re->r.mode & R_RAYTRACE) volume_precache(re); } - + re->i.convertdone = true; if (re->test_break(re->tbh)) RE_Database_Free(re); - + re->i.infostr = NULL; re->stats_draw(re->sdh, &re->i); } @@ -5339,15 +5339,15 @@ void RE_DataBase_ApplyWindow(Render *re) void RE_DataBase_IncrementalView(Render *re, float viewmat[4][4], int restore) { float oldviewinv[4][4], tmat[4][4]; - + invert_m4_m4(oldviewinv, re->viewmat_orig); - + /* we have to correct for the already rotated vertexcoords */ mul_m4_m4m4(tmat, viewmat, oldviewinv); - + copy_m4_m4(re->viewmat, viewmat); invert_m4_m4(re->viewinv, re->viewmat); - + init_camera_inside_volumes(re); env_rotate_scene(re, tmat, !restore); @@ -5371,25 +5371,25 @@ static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int la { Object *camera= RE_GetCamera(re); float mat[4][4]; - + re->scene= scene; re->lay= lay; - + /* XXX add test if dbase was filled already? */ - + re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "vector render db arena"); re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0; re->i.totface=re->i.totvert=re->i.totstrand=re->i.totlamp=re->i.tothalo= 0; re->lights.first= re->lights.last= NULL; - + /* in localview, lamps are using normal layers, objects only local bits */ if (re->lay & 0xFF000000) lay &= 0xFF000000; - + /* applies changes fully */ scene->r.cfra += timeoffset; BKE_scene_update_for_newframe(re->eval_ctx, re->main, re->scene, lay); - + /* if no camera, viewmat should have been set! */ if (camera) { RE_GetCameraModelMatrix(re, camera, mat); @@ -5397,10 +5397,10 @@ static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int la invert_m4(mat); RE_SetView(re, mat); } - + /* MAKE RENDER DATA */ database_init_objects(re, lay, 0, 0, NULL, timeoffset); - + if (!re->test_break(re->tbh)) project_renderdata(re, projectverto, (re->r.mode & R_PANORAMA) != 0, 0, 1); @@ -5414,11 +5414,11 @@ static void speedvector_project(Render *re, float zco[2], const float co[3], con 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 */ @@ -5427,21 +5427,21 @@ static void speedvector_project(Render *re, float zco[2], const float co[3], con psize = BLI_rctf_size_x(&re->viewplane) / (float)re->winx; /* x angle of a pixel */ pixelphix = atan(psize / re->clipsta); - + psize = BLI_rctf_size_y(&re->viewplane) / (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 (ho[3]<0.1f) div= 10.0f; else div= 1.0f/ho[3]; - + /* use cylinder projection */ if (pano) { float vec[3], ang; @@ -5451,10 +5451,10 @@ static void speedvector_project(Render *re, float zco[2], const float co[3], con ang= saacos(-vec[2]/sqrtf(vec[0]*vec[0] + vec[2]*vec[2])); if (vec[0]<0.0f) ang= -ang; zco[0]= ang/pixelphix + zmulx; - + ang= 0.5f*(float)M_PI - saacos(vec[1] / len_v3(vec)); zco[1]= ang/pixelphiy + zmuly; - + } else { zco[0]= zmulx*(1.0f+ho[0]*div); @@ -5467,16 +5467,16 @@ static void calculate_speedvector(const float vectors[2], int step, float winsq, float zco[2], len; speedvector_project(NULL, zco, co, ho); - + zco[0]= vectors[0] - zco[0]; zco[1]= vectors[1] - zco[1]; - + /* enable nice masks for hardly moving stuff or float inaccuracy */ if (zco[0]<0.1f && zco[0]>-0.1f && zco[1]<0.1f && zco[1]>-0.1f ) { zco[0]= 0.0f; zco[1]= 0.0f; } - + /* maximize speed for image width, otherwise it never looks good */ len= zco[0]*zco[0] + zco[1]*zco[1]; if (len > winsq) { @@ -5484,7 +5484,7 @@ static void calculate_speedvector(const float vectors[2], int step, float winsq, zco[0]*= len; zco[1]*= len; } - + /* note; in main vecblur loop speedvec is negated again */ if (step) { speed[2]= -zco[0]; @@ -5619,44 +5619,44 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float * FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifiers_findByType(fsob, eModifierType_Fluidsim); FluidsimSettings *fss; FluidVertexVelocity *velarray = NULL; - + /* only one step needed */ if (step) return 1; - + if (fluidmd) fss = fluidmd->fss; else return 0; - + copy_m4_m4(mat, re->viewmat); invert_m4_m4(imat, mat); /* set first vertex OK */ if (!fss->meshVelocities) return 0; - + if ( obr->totvert != fss->totvert) { //fprintf(stderr, "load_fluidsimspeedvectors - modified fluidsim mesh, not using speed vectors (%d,%d)...\n", obr->totvert, fsob->fluidsimSettings->meshSurface->totvert); // DEBUG return 0; } - + velarray = fss->meshVelocities; if (obi->flag & R_TRANSFORMED) mul_m4_m4m4(winmat, re->winmat, obi->mat); else copy_m4_m4(winmat, re->winmat); - + /* (bad) HACK calculate average velocity */ /* better solution would be fixing getVelocityAt() in intern/elbeem/intern/solver_util.cpp * so that also small drops/little water volumes return a velocity != 0. * But I had no luck in fixing that function - DG */ for (a=0; a<obr->totvert; a++) { for (j=0;j<3;j++) avgvel[j] += velarray[a].vel[j]; - + } for (j=0;j<3;j++) avgvel[j] /= (float)(obr->totvert); - - + + for (a=0; a<obr->totvert; a++, vectors+=2) { if ((a & 255)==0) ver= obr->vertnodes[a>>8].vert; @@ -5667,14 +5667,14 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float * fsvec[3] = 0.0f; //fsvec[0] = fsvec[1] = fsvec[2] = fsvec[3] = 0.0; fsvec[2] = 2.0f; // NT fixed test for (j=0;j<3;j++) fsvec[j] = velarray[a].vel[j]; - + /* (bad) HACK insert average velocity if none is there (see previous comment) */ if ((fsvec[0] == 0.0f) && (fsvec[1] == 0.0f) && (fsvec[2] == 0.0f)) { fsvec[0] = avgvel[0]; fsvec[1] = avgvel[1]; fsvec[2] = avgvel[2]; } - + /* transform (=rotate) to cam space */ camco[0] = dot_v3v3(imat[0], fsvec); camco[1] = dot_v3v3(imat[1], fsvec); @@ -5683,14 +5683,14 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float * /* get homogeneous coordinates */ projectvert(camco, winmat, hoco); projectvert(ver->co, winmat, ho); - + /* now map hocos to screenspace, uses very primitive clip still */ /* use ho[3] of original vertex, xy component of vel. direction */ if (ho[3]<0.1f) div= 10.0f; else div= 1.0f/ho[3]; zco[0]= zmulx*hoco[0]*div; zco[1]= zmuly*hoco[1]*div; - + /* maximize speed as usual */ len= zco[0]*zco[0] + zco[1]*zco[1]; if (len > winsq) { @@ -5738,7 +5738,7 @@ static void copy_dbase_object_vectors(Render *re, ListBase *lb) for (a=0; a<obr->totvert; a++, vec+=2) { if ((a & 255)==0) ver= obr->vertnodes[a>>8].vert; else ver++; - + projectvert(ver->co, winmat, ho); speedvector_project(NULL, vec, ver->co, ho); } @@ -5749,7 +5749,7 @@ static void copy_dbase_object_vectors(Render *re, ListBase *lb) static void free_dbase_object_vectors(ListBase *lb) { ObjectInstanceRen *obi; - + for (obi= lb->first; obi; obi= obi->next) if (obi->vectors) MEM_freeN(obi->vectors); @@ -5764,56 +5764,56 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned ListBase oldtable= {NULL, NULL}, newtable= {NULL, NULL}; ListBase strandsurface; int step; - + re->i.infostr = IFACE_("Calculating previous frame vectors"); re->r.mode |= R_SPEED; - + speedvector_project(re, NULL, NULL, NULL); /* initializes projection code */ - + /* creates entire dbase */ database_fromscene_vectors(re, sce, lay, -1); - + /* copy away vertex info */ copy_dbase_object_vectors(re, &oldtable); - + /* free dbase and make the future one */ strandsurface= re->strandsurface; memset(&re->strandsurface, 0, sizeof(ListBase)); re->i.convertdone = true; RE_Database_Free(re); re->strandsurface= strandsurface; - + if (!re->test_break(re->tbh)) { /* creates entire dbase */ re->i.infostr = IFACE_("Calculating next frame vectors"); - + database_fromscene_vectors(re, sce, lay, +1); } /* copy away vertex info */ copy_dbase_object_vectors(re, &newtable); - + /* free dbase and make the real one */ strandsurface= re->strandsurface; memset(&re->strandsurface, 0, sizeof(ListBase)); re->i.convertdone = true; RE_Database_Free(re); re->strandsurface= strandsurface; - + if (!re->test_break(re->tbh)) { RE_Database_FromScene(re, bmain, sce, lay, 1); RE_Database_Preprocess(re); } - + if (!re->test_break(re->tbh)) { int vectorlay= get_vector_renderlayers(re->scene); for (step= 0; step<2; step++) { - + if (step) table= &newtable; else table= &oldtable; - + oldobi= table->first; for (obi= re->instancetable.first; obi && oldobi; obi= obi->next) { int ok= 1; @@ -5859,7 +5859,7 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned } } } - + free_dbase_object_vectors(&oldtable); free_dbase_object_vectors(&newtable); @@ -5873,7 +5873,7 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned mesh->nextco= NULL; } } - + re->i.infostr = NULL; re->stats_draw(re->sdh, &re->i); } @@ -5911,7 +5911,7 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, render_copy_renderdata(&re->r, &scene->r); RE_init_threadcount(re); - + re->flag |= R_BAKING; re->excludeob= actob; if (actob) @@ -5927,14 +5927,14 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, re->r.mode &= ~R_SHADOW; re->r.mode &= ~R_RAYTRACE; } - + if (!actob && (type==RE_BAKE_SHADOW)) { re->r.mode |= R_SHADOW; } - + /* setup render stuff */ re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "bake db arena"); - + re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0; re->lights.first= re->lights.last= NULL; re->lampren.first= re->lampren.last= NULL; @@ -5942,9 +5942,9 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, /* in localview, lamps are using normal layers, objects only local bits */ if (re->lay & 0xFF000000) lay &= 0xFF000000; - + camera= RE_GetCamera(re); - + /* if no camera, set unit */ if (camera) { normalize_m4_m4(mat, camera->obmat); @@ -5967,25 +5967,25 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, init_render_world(re); /* do first, because of ambient. also requires re->osa set correct */ if (re->r.mode & R_RAYTRACE) { init_render_qmcsampler(re); - + if (re->wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)) if (re->wrld.ao_samp_method == WO_AOSAMP_CONSTANT) init_ao_sphere(re, &re->wrld); } - + /* still bad... doing all */ init_render_textures(re); - + copy_v3_v3(amb, &re->wrld.ambr); init_render_materials(re->main, re->r.mode, amb, true); - + set_node_shader_lamp_loop(shade_material_loop); - + /* MAKE RENDER DATA */ database_init_objects(re, lay, nolamps, onlyselected, actob, 0); set_material_lightgroups(re); - + /* SHADOW BUFFER */ if (type!=RE_BAKE_LIGHT) if (re->r.mode & R_SHADOW) @@ -5995,7 +5995,7 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, if (!re->test_break(re->tbh)) if (re->r.mode & R_RAYTRACE) makeraytree(re); - + /* point density texture */ if (!re->test_break(re->tbh)) make_pointdensities(re); |