WIP commit, just to have a nice return from holidays :)

This commit is contained in:
Daniel Genrich 2007-12-21 01:24:09 +00:00
parent a8a5776160
commit 9e96ac11bb
4 changed files with 382 additions and 301 deletions

@ -70,7 +70,6 @@ extern void BKE_reset_undo(void);
extern char *BKE_undo_menu_string(void); extern char *BKE_undo_menu_string(void);
extern void BKE_undo_number(int nr); extern void BKE_undo_number(int nr);
extern void BKE_undo_save_quit(void); extern void BKE_undo_save_quit(void);
extern int BKE_undo_there(void);
#ifdef __cplusplus #ifdef __cplusplus
} }

@ -67,6 +67,12 @@ typedef struct fc
float *u, *u0; // velocity in x direction float *u, *u0; // velocity in x direction
float *v, *v0; // velocity in y direction float *v, *v0; // velocity in y direction
float *w, *w0; // velocity in z direction float *w, *w0; // velocity in z direction
unsigned char* _texture_data;
float _light_dir[3];
int _ray_templ[4096][3];
FILE* _fp;
int _cur_frame;
int _nframes;
} fc; } fc;
fc *f_init(void); fc *f_init(void);
void f_free(fc *m_fc); void f_free(fc *m_fc);

@ -498,308 +498,33 @@ static int cloth_read_cache(Object *ob, ClothModifierData *clmd, float framenr)
return ret; return ret;
} }
#define AMBIENT 50 int m_fc_open(ClothModifierData *clmd)
#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; Cloth *cloth = clmd->clothObject;
int offset; int _N;
fc *m_fc = NULL;
int l = 255; if(!cloth)
float d; return 0;
do { m_fc = cloth->m_fc;
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++; m_fc->_fp = fopen("/home/daniel/Desktop/f32rand.dat", "rb");
xx = x + _ray_templ[i][0]; if (!m_fc->_fp)
yy = y + _ray_templ[i][1]; return 0;
zz = z + _ray_templ[i][2];
} while ((xx>=0)&&(xx<n)&&(yy>=0)&&(yy<n)&&(zz>=0)&&(zz<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);
void cast_light(unsigned char* _texture_data, int _ray_templ[4096][3], float *_light_dir, int n /*edgelen*/) fread(&m_fc->_nframes, sizeof(int), 1, m_fc->_fp);
{ printf("Number of frames: %d\n", m_fc->_nframes);
int i,j; m_fc->_cur_frame = 0;
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); return 1;
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 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;
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;
}
}
}
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++;
}
} }
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 * 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); float current_time = bsystem_time(ob, (float)G.scene->r.cfra, 0.0);
ListBase *effectors = NULL; ListBase *effectors = NULL;
float deltaTime = current_time - clmd->sim_parms->sim_time; 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); 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(); cloth->m_fc = f_init();
// open file
m_fc_open(clmd);
switch (ob->type) switch (ob->type)
{ {
case OB_MESH: case OB_MESH:
@ -1895,8 +1620,7 @@ fc *f_init(void)
int i; int i;
int size; int size;
fc *m_fc = MEM_callocN(sizeof(fc), fc *m_fc = MEM_callocN(sizeof(fc), "f_c");
"f_c");
for (i=0; i<10; i++) for (i=0; i<10; i++)
clear_buffer(buffers[i]); clear_buffer(buffers[i]);
@ -1913,12 +1637,24 @@ fc *f_init(void)
for (i=0; i<size; i++) for (i=0; i<size; i++)
m_fc->v[i] = -0.5f; 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; return m_fc;
} }
void f_free(fc *m_fc) void f_free(fc *m_fc)
{ {
if(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); MEM_freeN(m_fc);
}
} }

@ -78,6 +78,7 @@
#include "BLI_rand.h" #include "BLI_rand.h"
#include "BKE_utildefines.h" #include "BKE_utildefines.h"
#include "BKE_cloth.h"
#include "BKE_curve.h" #include "BKE_curve.h"
#include "BKE_constraint.h" // for the get_constraint_target function #include "BKE_constraint.h" // for the get_constraint_target function
#include "BKE_DerivedMesh.h" #include "BKE_DerivedMesh.h"
@ -2174,6 +2175,345 @@ static void draw_em_fancy(Object *ob, EditMesh *em, DerivedMesh *cageDM, Derived
/* Mesh drawing routines */ /* Mesh drawing routines */
#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 i;
float t;
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;
float viewdir[3];
float d0;
float dd;
int n;
float d;
viewdir[0] = m[0][2];
viewdir[1] = m[1][2];
viewdir[2] = m[2][2];
Normalize(viewdir);
// 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
d0 = - ( viewdir[0]*cv[i][0] + viewdir[1]*cv[i][1] + viewdir[2]*cv[i][2] );
dd = 2*d0/64.0f;
n = 0;
for ( 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;
}
}
}
/*
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++;
}
}
void draw_fl(ClothModifierData *clmd)
{
int i;
float m[4][4];
Cloth *cloth = clmd->clothObject;
fc *m_fc = NULL;
if(!cloth)
return;
m_fc = cloth->m_fc;
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);
// build_rotmatrix(m, _quat);
glMultMatrixf(&m[0][0]);
// ----------------------------------------
// from ligth constructor
m_fc->_light_dir[0] = -1.0f;
m_fc->_light_dir[1] = 0.5f;
m_fc->_light_dir[2] = 0.0f;
gen_ray_templ(m_fc->_ray_templ, m_fc->_light_dir, 30 + 2);
cast_light(m_fc->_texture_data, m_fc->_ray_templ, m_fc->_light_dir, 30+2);
glActiveTextureARB(GL_TEXTURE0_ARB);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 30+2, 30+2, 30+2, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_fc->_texture_data);
// ----------------------------------------
draw_slices(m);
/*
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);
}
*/
}
static void draw_mesh_object_outline(Object *ob, DerivedMesh *dm) static void draw_mesh_object_outline(Object *ob, DerivedMesh *dm)
{ {