[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27385] branches/render25/source/blender/ render/intern: Render Branch: move particle conversion into own file.
Brecht Van Lommel
brecht at blender.org
Wed Mar 10 15:02:32 CET 2010
Revision: 27385
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27385
Author: blendix
Date: 2010-03-10 15:02:31 +0100 (Wed, 10 Mar 2010)
Log Message:
-----------
Render Branch: move particle conversion into own file.
Modified Paths:
--------------
branches/render25/source/blender/render/intern/include/object_mesh.h
branches/render25/source/blender/render/intern/source/object_mesh.c
Added Paths:
-----------
branches/render25/source/blender/render/intern/source/object_particle.c
Modified: branches/render25/source/blender/render/intern/include/object_mesh.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object_mesh.h 2010-03-10 13:35:07 UTC (rev 27384)
+++ branches/render25/source/blender/render/intern/include/object_mesh.h 2010-03-10 14:02:31 UTC (rev 27385)
@@ -31,6 +31,7 @@
struct Material;
struct ObjectInstanceRen;
struct ObjectRen;
+struct ParticleSystem;
struct VertRen;
struct VlakRen;
@@ -62,7 +63,10 @@
/* Conversion */
void init_render_object_data(struct Render *re, struct ObjectRen *obr, int timeoffset);
+void init_render_particle_system(struct Render *re, struct ObjectRen *obr, struct ParticleSystem *psys, int timeoffset);
void finalize_render_object(struct Render *re, struct ObjectRen *obr, int timeoffset);
+void render_object_calc_vnormals(struct Render *re, struct ObjectRen *obr, int do_tangent, int do_nmap_tangent);
+void set_object_orco(struct Render *re, void *ob, float *orco);
/* Structs */
Modified: branches/render25/source/blender/render/intern/source/object_mesh.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_mesh.c 2010-03-10 13:35:07 UTC (rev 27384)
+++ branches/render25/source/blender/render/intern/source/object_mesh.c 2010-03-10 14:02:31 UTC (rev 27385)
@@ -511,7 +511,7 @@
return orco;
}
-static void set_object_orco(Render *re, void *ob, float *orco)
+void set_object_orco(Render *re, void *ob, float *orco)
{
if (!re->db.orco_hash)
re->db.orco_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
@@ -723,7 +723,7 @@
}
-static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int do_nmap_tangent)
+void render_object_calc_vnormals(Render *re, ObjectRen *obr, int do_tangent, int do_nmap_tangent)
{
MemArena *arena= NULL;
VertexTangent **vtangents= NULL;
@@ -1064,1109 +1064,6 @@
/* ------------------------------------------------------------------------- */
-/* Particles */
-/* ------------------------------------------------------------------------- */
-typedef struct ParticleStrandData
-{
- struct MCol *mcol;
- float *orco, *uvco, *surfnor;
- float time, adapt_angle, adapt_pix, size;
- int totuv, totcol;
- int first, line, adapt, override_uv;
-}
-ParticleStrandData;
-/* future thread problem... */
-static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, ParticleStrandData *sd, float *vec, float *vec1)
-{
- static VertRen *v1= NULL, *v2= NULL;
- VlakRen *vlr= NULL;
- float nor[3], cross[3], crosslen, w, dx, dy, width;
- 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);
-
- /* turn cross in pixelsize */
- w= vec[2]*re->cam.winmat[2][3] + re->cam.winmat[3][3];
- dx= re->cam.winx*cross[0]*re->cam.winmat[0][0];
- dy= re->cam.winy*cross[1]*re->cam.winmat[1][1];
- w= sqrt(dx*dx + dy*dy)/w;
-
- if(w!=0.0f) {
- float fac;
- if(ma->strand_ease!=0.0f) {
- if(ma->strand_ease<0.0f)
- fac= pow(sd->time, 1.0+ma->strand_ease);
- else
- fac= pow(sd->time, 1.0/(1.0f-ma->strand_ease));
- }
- else fac= sd->time;
-
- width= ((1.0f-fac)*ma->strand_sta + (fac)*ma->strand_end);
-
- /* use actual Blender units for strand width and fall back to minimum width */
- if(ma->mode & MA_STR_B_UNITS){
- crosslen= len_v3(cross);
- w= 2.0f*crosslen*ma->strand_min/w;
-
- if(width < w)
- width= w;
-
- /*cross is the radius of the strand so we want it to be half of full width */
- mul_v3_fl(cross,0.5/crosslen);
- }
- else
- width/=w;
-
- mul_v3_fl(cross, width);
- }
- else width= 1.0f;
-
- if(ma->mode & MA_TANGENT_STR)
- flag= R_SMOOTH|R_NOPUNOFLIP|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= render_object_vlak_get(obr, obr->totvlak++);
- vlr->flag= flag;
- vlr->v1= render_object_vert_get(obr, obr->totvert++);
- vlr->v2= render_object_vert_get(obr, obr->totvert++);
- vlr->v3= render_object_vert_get(obr, obr->totvert++);
- vlr->v4= render_object_vert_get(obr, obr->totvert++);
-
- copy_v3_v3(vlr->v1->co, vec);
- add_v3_v3v3(vlr->v1->co, 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);
- vlr->v2->orco= sd->orco;
- vlr->v2->accum= vlr->v1->accum;
-
- copy_v3_v3(vlr->v4->co, vec1);
- add_v3_v3v3(vlr->v4->co, vlr->v4->co, cross);
- copy_v3_v3(vlr->v4->n, nor);
- vlr->v4->orco= sd->orco;
- vlr->v4->accum= 1.0f; // accum abuse for strand texco
-
- copy_v3_v3(vlr->v3->co, vec1);
- sub_v3_v3v3(vlr->v3->co, vlr->v3->co, cross);
- 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;
-
- if(sd->surfnor) {
- float *snor= render_vlak_get_surfnor(obr, vlr, 1);
- copy_v3_v3(snor, sd->surfnor);
- }
-
- if(sd->uvco){
- for(i=0; i<sd->totuv; i++){
- MTFace *mtf;
- mtf=render_vlak_get_tface(obr,vlr,i,NULL,1);
- mtf->uv[0][0]=mtf->uv[1][0]=
- mtf->uv[2][0]=mtf->uv[3][0]=(sd->uvco+2*i)[0];
- mtf->uv[0][1]=mtf->uv[1][1]=
- mtf->uv[2][1]=mtf->uv[3][1]=(sd->uvco+2*i)[1];
- }
- if(sd->override_uv>=0){
- MTFace *mtf;
- mtf=render_vlak_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;
-
- mtf->uv[0][1]=mtf->uv[1][1]=0.0f;
- mtf->uv[2][1]=mtf->uv[3][1]=1.0f;
- }
- }
- if(sd->mcol){
- for(i=0; i<sd->totcol; i++){
- MCol *mc;
- mc=render_vlak_get_mcol(obr,vlr,i,NULL,1);
- mc[0]=mc[1]=mc[2]=mc[3]=sd->mcol[i];
- mc[0]=mc[1]=mc[2]=mc[3]=sd->mcol[i];
- }
- }
- }
- /* first two vertices of a strand */
- else if(sd->first) {
- if(sd->adapt){
- copy_v3_v3(anor, nor);
- copy_v3_v3(avec, vec);
- second=1;
- }
-
- v1= render_object_vert_get(obr, obr->totvert++);
- v2= render_object_vert_get(obr, obr->totvert++);
-
- copy_v3_v3(v1->co, vec);
- add_v3_v3v3(v1->co, 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);
- v2->orco= sd->orco;
- v2->accum= v1->accum;
- }
- /* more vertices & faces to strand */
- else {
- if(sd->adapt==0 || second){
- vlr= render_object_vlak_get(obr, obr->totvlak++);
- vlr->flag= flag;
- vlr->v1= v1;
- vlr->v2= v2;
- vlr->v3= render_object_vert_get(obr, obr->totvert++);
- vlr->v4= render_object_vert_get(obr, obr->totvert++);
-
- v1= vlr->v4; // cycle
- v2= vlr->v3; // cycle
-
-
- if(sd->adapt){
- second=0;
- copy_v3_v3(anor,nor);
- copy_v3_v3(avec,vec);
- }
-
- }
- else if(sd->adapt){
- float dvec[3],pvec[3];
- sub_v3_v3v3(dvec,avec,vec);
- project_v3_v3v3(pvec,dvec,vec);
- sub_v3_v3v3(dvec,dvec,pvec);
-
- w= vec[2]*re->cam.winmat[2][3] + re->cam.winmat[3][3];
- dx= re->cam.winx*dvec[0]*re->cam.winmat[0][0]/w;
- dy= re->cam.winy*dvec[1]*re->cam.winmat[1][1]/w;
- w= sqrt(dx*dx + dy*dy);
- if(dot_v3v3(anor,nor)<sd->adapt_angle && w>sd->adapt_pix){
- vlr= render_object_vlak_get(obr, obr->totvlak++);
- vlr->flag= flag;
- vlr->v1= v1;
- vlr->v2= v2;
- vlr->v3= render_object_vert_get(obr, obr->totvert++);
- vlr->v4= render_object_vert_get(obr, obr->totvert++);
-
- v1= vlr->v4; // cycle
- v2= vlr->v3; // cycle
-
- copy_v3_v3(anor,nor);
- copy_v3_v3(avec,vec);
- }
- else{
- vlr= render_object_vlak_get(obr, obr->totvlak-1);
- }
- }
-
- copy_v3_v3(vlr->v4->co, vec);
- add_v3_v3v3(vlr->v4->co, vlr->v4->co, cross);
- copy_v3_v3(vlr->v4->n, nor);
- vlr->v4->orco= sd->orco;
- vlr->v4->accum= -1.0f + 2.0f*sd->time; // accum abuse for strand texco
-
- copy_v3_v3(vlr->v3->co, vec);
- sub_v3_v3v3(vlr->v3->co, vlr->v3->co, cross);
- 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;
-
- if(sd->surfnor) {
- float *snor= render_vlak_get_surfnor(obr, vlr, 1);
- copy_v3_v3(snor, sd->surfnor);
- }
-
- if(sd->uvco){
- for(i=0; i<sd->totuv; i++){
- MTFace *mtf;
- mtf=render_vlak_get_tface(obr,vlr,i,NULL,1);
- mtf->uv[0][0]=mtf->uv[1][0]=
- mtf->uv[2][0]=mtf->uv[3][0]=(sd->uvco+2*i)[0];
- mtf->uv[0][1]=mtf->uv[1][1]=
- mtf->uv[2][1]=mtf->uv[3][1]=(sd->uvco+2*i)[1];
- }
- if(sd->override_uv>=0){
- MTFace *mtf;
- mtf=render_vlak_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;
-
- mtf->uv[0][1]=mtf->uv[1][1]=(vlr->v1->accum+1.0f)/2.0f;
- mtf->uv[2][1]=mtf->uv[3][1]=(vlr->v3->accum+1.0f)/2.0f;
- }
- }
- if(sd->mcol){
- for(i=0; i<sd->totcol; i++){
- MCol *mc;
- mc=render_vlak_get_mcol(obr,vlr,i,NULL,1);
- mc[0]=mc[1]=mc[2]=mc[3]=sd->mcol[i];
- mc[0]=mc[1]=mc[2]=mc[3]=sd->mcol[i];
- }
- }
- }
-}
-
-static void static_particle_wire(ObjectRen *obr, Material *ma, float *vec, float *vec1, int first, int line)
-{
- VlakRen *vlr;
- static VertRen *v1;
-
- if(line) {
- vlr= render_object_vlak_get(obr, obr->totvlak++);
- vlr->v1= render_object_vert_get(obr, obr->totvert++);
- vlr->v2= render_object_vert_get(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;
-
- }
- else if(first) {
- v1= render_object_vert_get(obr, obr->totvert++);
- copy_v3_v3(v1->co, vec);
- }
- else {
- vlr= render_object_vlak_get(obr, obr->totvlak++);
- vlr->v1= v1;
- vlr->v2= render_object_vert_get(obr, obr->totvert++);
- vlr->v3= vlr->v2;
- vlr->v4= NULL;
-
- v1= vlr->v2; // cycle
- copy_v3_v3(v1->co, vec);
-
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list