Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Genrich <daniel.genrich@gmx.net>2007-12-21 04:24:09 +0300
committerDaniel Genrich <daniel.genrich@gmx.net>2007-12-21 04:24:09 +0300
commit9e96ac11bbe0212d031e59df461d3ae887e07d03 (patch)
tree9d050371291bde1bc8a90b4edce96f4d10945383 /source/blender/blenkernel/intern/cloth.c
parenta8a5776160eb405da1653be3ae7f2d6d51fd677c (diff)
WIP commit, just to have a nice return from holidays :)
Diffstat (limited to 'source/blender/blenkernel/intern/cloth.c')
-rw-r--r--source/blender/blenkernel/intern/cloth.c338
1 files changed, 37 insertions, 301 deletions
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index 95d487b2ec7..318d6eac410 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -498,308 +498,33 @@ static int cloth_read_cache(Object *ob, ClothModifierData *clmd, float framenr)
return ret;
}
-#define AMBIENT 50
-#define DECAY 0.04f
-#define ALMOST_EQUAL(a, b) ((fabs(a-b)<0.00001f)?1:0)
-
- // cube vertices
-GLfloat cv[][3] = {
- {1.0f, 1.0f, 1.0f}, {-1.0f, 1.0f, 1.0f}, {-1.0f, -1.0f, 1.0f}, {1.0f, -1.0f, 1.0f},
- {1.0f, 1.0f, -1.0f}, {-1.0f, 1.0f, -1.0f}, {-1.0f, -1.0f, -1.0f}, {1.0f, -1.0f, -1.0f}
-};
-
- // edges have the form edges[n][0][xyz] + t*edges[n][1][xyz]
-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}}
-};
-
-void light_ray(unsigned char* _texture_data, int _ray_templ[4096][3], int x, int y, int z, int n, float decay)
-{
- int xx = x, yy = y, zz = z, i = 0;
- int offset;
-
- int l = 255;
- float d;
-
- do {
- offset = ((((zz*n) + yy)*n + xx) << 2);
- if (_texture_data[offset + 2] > 0)
- _texture_data[offset + 2] = (unsigned char) ((_texture_data[offset + 2] + l)*0.5f);
- else
- _texture_data[offset + 2] = (unsigned char) l;
- d = _texture_data[offset+1];
- if (l > AMBIENT) {
- l -= d*decay;
- if (l < AMBIENT)
- l = AMBIENT;
- }
-
- i++;
- xx = x + _ray_templ[i][0];
- yy = y + _ray_templ[i][1];
- zz = z + _ray_templ[i][2];
-
- } while ((xx>=0)&&(xx<n)&&(yy>=0)&&(yy<n)&&(zz>=0)&&(zz<n));
-}
-
-void cast_light(unsigned char* _texture_data, int _ray_templ[4096][3], float *_light_dir, int n /*edgelen*/)
-{
- int i,j;
- int sx = (_light_dir[0]>0) ? 0 : n-1;
- int sy = (_light_dir[1]>0) ? 0 : n-1;
- int sz = (_light_dir[2]>0) ? 0 : n-1;
-
- float decay = 1.0f/(n*DECAY);
-
- for (i=0; i<n; i++)
- for (j=0; j<n; j++) {
- if (!ALMOST_EQUAL(_light_dir[0], 0))
- light_ray(_texture_data, _ray_templ, sx,i,j,n,decay);
- if (!ALMOST_EQUAL(_light_dir[1], 0))
- light_ray(_texture_data, _ray_templ, i,sy,j,n,decay);
- if (!ALMOST_EQUAL(_light_dir[2], 0))
- light_ray(_texture_data, _ray_templ, i,j,sz,n,decay);
- }
-}
-
-void gen_ray_templ(int _ray_templ[4096][3], float *_light_dir, int edgelen)
-{
- float fx = 0.0f, fy = 0.0f, fz = 0.0f;
- int x = 0, y = 0, z = 0;
- float lx = _light_dir[0] + 0.000001f, ly = _light_dir[1] + 0.000001f, lz = _light_dir[2] + 0.000001f;
- int xinc = (lx > 0) ? 1 : -1;
- int yinc = (ly > 0) ? 1 : -1;
- int zinc = (lz > 0) ? 1 : -1;
- float tx, ty, tz;
- int i = 1;
- int len = 0;
- int maxlen = 3*edgelen*edgelen;
- _ray_templ[0][0] = _ray_templ[0][2] = _ray_templ[0][2] = 0;
-
- while (len <= maxlen)
- {
- // fx + t*lx = (x+1) -> t = (x+1-fx)/lx
- tx = (x+xinc-fx)/lx;
- ty = (y+yinc-fy)/ly;
- tz = (z+zinc-fz)/lz;
-
- if ((tx<=ty)&&(tx<=tz)) {
- _ray_templ[i][0] = _ray_templ[i-1][0] + xinc;
- x =+ xinc;
- fx = x;
-
- if (ALMOST_EQUAL(ty,tx)) {
- _ray_templ[i][1] = _ray_templ[i-1][1] + yinc;
- y += yinc;
- fy = y;
- } else {
- _ray_templ[i][1] = _ray_templ[i-1][1];
- fy += tx*ly;
- }
-
- if (ALMOST_EQUAL(tz,tx)) {
- _ray_templ[i][2] = _ray_templ[i-1][2] + zinc;
- z += zinc;
- fz = z;
- } else {
- _ray_templ[i][2] = _ray_templ[i-1][2];
- fz += tx*lz;
- }
- } else if ((ty<tx)&&(ty<=tz)) {
- _ray_templ[i][0] = _ray_templ[i-1][0];
- fx += ty*lx;
-
- _ray_templ[i][1] = _ray_templ[i-1][1] + yinc;
- y += yinc;
- fy = y;
-
- if (ALMOST_EQUAL(tz,ty)) {
- _ray_templ[i][2] = _ray_templ[i-1][2] + zinc;
- z += zinc;
- fz = z;
- } else {
- _ray_templ[i][2] = _ray_templ[i-1][2];
- fz += ty*lz;
- }
- } else {
- // assert((tz<tx)&&(tz<ty));
- if((tz<tx)&&(tz<ty))
- break;
-
- _ray_templ[i][0] = _ray_templ[i-1][0];
- fx += tz*lx;
- _ray_templ[i][1] = _ray_templ[i-1][1];
- fy += tz*ly;
- _ray_templ[i][2] = _ray_templ[i-1][2] + zinc;
- z += zinc;
- fz = z;
- }
-
- len = _ray_templ[i][0]*_ray_templ[i][0]
- + _ray_templ[i][1]*_ray_templ[i][1]
- + _ray_templ[i][2]*_ray_templ[i][2];
- i++;
- }
-}
-/*
-int intersect_edges(float ret[12][3], float a, float b, float c, float d)
+int m_fc_open(ClothModifierData *clmd)
{
- int i;
- float t;
- Vec3 p;
- int num = 0;
-
- 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)) {
- ret[num][0] = edges[i][0][0] + edges[i][1][0]*t;
- ret[num][1] = edges[i][0][1] + edges[i][1][1]*t;
- ret[num][2] = edges[i][0][2] + edges[i][1][2]*t;
- num++;
- }
- }
-
- return num;
-}
-
-void draw_slices(float m[][4])
-{
- int i;
+ Cloth *cloth = clmd->clothObject;
+ int _N;
+ fc *m_fc = NULL;
+
+ if(!cloth)
+ return 0;
+
+ m_fc = cloth->m_fc;
- Vec3 viewdir(m[0][2], m[1][2], m[2][2]);
- viewdir.Normalize();
- // find cube vertex that is closest to the viewer
- for (i=0; i<8; i++) {
- float x = cv[i][0] + viewdir[0];
- float y = cv[i][1] + viewdir[1];
- float z = cv[i][2] + viewdir[2];
- if ((x>=-1.0f)&&(x<=1.0f)
- &&(y>=-1.0f)&&(y<=1.0f)
- &&(z>=-1.0f)&&(z<=1.0f))
- {
- break;
- }
- }
- if(i != 8) return;
-
- glBlendFunc(GL_SRC_ALPHA, GL_ONE);
- glDisable(GL_DEPTH_TEST);
- // our slices are defined by the plane equation a*x + b*y +c*z + d = 0
- // (a,b,c), the plane normal, are given by viewdir
- // d is the parameter along the view direction. the first d is given by
- // inserting previously found vertex into the plane equation
- float d0 = -(viewdir[0]*cv[i][0] + viewdir[1]*cv[i][1] + viewdir[2]*cv[i][2]);
- float dd = 2*d0/64.0f;
- int n = 0;
- for (float d = -d0; d < d0; d += dd) {
- // intersect_edges returns the intersection points of all cube edges with
- // the given plane that lie within the cube
- float pt[12][3];
- int num = intersect_edges(pt, viewdir[0], viewdir[1], viewdir[2], d);
-
- if (num > 2) {
- // sort points to get a convex polygon
- // std::sort(pt.begin()+1, pt.end(), Convexcomp(pt[0], viewdir));
- int shuffled = 1;
-
- while(shuffled)
- {
- int j;
- shuffled = 0;
-
- for(j = 0; j < num-1; j++)
- {
- // Vec3 va = a-p0, vb = b-p0;
- // return dot(up, cross(va, vb)) >= 0;
- float va[3], vb[3], vc[3];
-
- VECSUB(va, pt[j], pt[0]);
- VECSUB(vb, pt[j+1], pt[0]);
- Crossf(vc, va, vb);
-
- if(INPR(viewdir, vc)>= 0)
- {
- float temp[3];
-
- VECCOPY(temp, pt[j]);
- VECCOPY(pt[j], pt[j+1]);
- VECCOPY(pt[j+1], temp);
-
- shuffled = 1;
- }
- }
- }
+ m_fc->_fp = fopen("/home/daniel/Desktop/f32rand.dat", "rb");
+ if (!m_fc->_fp)
+ return 0;
- glEnable(GL_TEXTURE_3D);
- glEnable(GL_FRAGMENT_PROGRAM_ARB);
- glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, _prog[0]);
- glActiveTextureARB(GL_TEXTURE0_ARB);
- glBindTexture(GL_TEXTURE_3D, _txt[0]);
- glBegin(GL_POLYGON);
- for (i=0; i<num; i++){
- glColor3f(1.0, 1.0, 1.0);
- glTexCoord3d((pt[i][0]+1.0)/2.0, (-pt[i][1]+1)/2.0, (pt[i][2]+1.0)/2.0);
- glVertex3f(pt[i][0], pt[i][1], pt[i][2]);
- }
- glEnd();
- }
- n++;
- }
+ fread(&_N, sizeof(int), 1, m_fc->_fp);
+ fread(&_N, sizeof(int), 1, m_fc->_fp);
+ printf("Resolution: %dx%dx%d\n", _N, _N, _N);
+
+ fread(&m_fc->_nframes, sizeof(int), 1, m_fc->_fp);
+ printf("Number of frames: %d\n", m_fc->_nframes);
+ m_fc->_cur_frame = 0;
+
+ return 1;
}
-void draw(void)
-{
- int i;
-
- glClearColor(0, 0, 0, 0);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt(0, 0, -_dist, 0, 0, 0, 0, 1, 0);
-
- float m[4][4];
- build_rotmatrix(m, _quat);
-
- glMultMatrixf(&m[0][0]);
-
- if (_draw_cube)
- draw_cube();
- draw_slices(m, _draw_slice_outline);
-
- if (_dispstring != NULL) {
- glMatrixMode(GL_PROJECTION);
- glLoadMatrixd(_ortho_m);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- glDisable(GL_TEXTURE_3D);
- glDisable(GL_FRAGMENT_PROGRAM_ARB);
- glColor4f(1.0, 1.0, 1.0, 1.0);
- glRasterPos2i(-_sx/2 + 10, _sy/2 - 15);
-
- print_string(_dispstring);
-
- glMatrixMode(GL_PROJECTION);
- glLoadMatrixd(_persp_m);
- glMatrixMode(GL_MODELVIEW);
- }
-}*/
/************************************************
* clothModifier_do - main simulation function
@@ -819,9 +544,6 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd,Object *ob, DerivedMesh *d
float current_time = bsystem_time(ob, (float)G.scene->r.cfra, 0.0);
ListBase *effectors = NULL;
float deltaTime = current_time - clmd->sim_parms->sim_time;
- unsigned char* _texture_data=NULL;
- float _light_dir[3];
- int _ray_templ[4096][3];
clmd->sim_parms->dt = 1.0f / (clmd->sim_parms->stepsPerFrame * G.scene->r.frs_sec);
@@ -1216,6 +938,9 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *d
cloth->m_fc = f_init();
+ // open file
+ m_fc_open(clmd);
+
switch (ob->type)
{
case OB_MESH:
@@ -1895,8 +1620,7 @@ fc *f_init(void)
int i;
int size;
- fc *m_fc = MEM_callocN(sizeof(fc),
- "f_c");
+ fc *m_fc = MEM_callocN(sizeof(fc), "f_c");
for (i=0; i<10; i++)
clear_buffer(buffers[i]);
@@ -1913,12 +1637,24 @@ fc *f_init(void)
for (i=0; i<size; i++)
m_fc->v[i] = -0.5f;
+ m_fc->_texture_data = (unsigned char*) MEM_callocN((30+2)*(30+2)*(30+2)*4, "fc_texture_data");
+
+ m_fc->_fp = 0;
+
return m_fc;
}
void f_free(fc *m_fc)
{
if(m_fc)
+ {
+ if(m_fc->_texture_data)
+ MEM_freeN(m_fc->_texture_data);
+
+ if(m_fc->_fp)
+ fclose(m_fc->_fp);
+
MEM_freeN(m_fc);
+ }
}