void lemuria_tentacle_init(lemuria_tentacle_t * t, int num_points, float length, float frequency, float wavelength, float phase, float amplitude) { t->segment_length = length / (float)(num_points - 1); t->num_points = num_points; t->frequency = frequency; t->wavelength = wavelength; t->phase = phase; t->points = malloc(num_points * sizeof(*(t->points))); t->amplitude = amplitude, t->points[0].coords[0] = 0.0; t->points[0].coords[1] = 0.0; calc_coords(t); #if 0 for(i = 1; i < t->num_points; i++) { t->points[i].coords[0] = t->points[i-1].coords[0] + t->segment_length; t->points[i].coords[1] = 0.0; } #endif calc_normals(t); }
void vlst_normal_4f(t_vlst *dst,t_vlst *vertex,t_vlst *face) { int i; int pos=0; int _pos=0; float *v=(float *)vertex->data; float *d=(float *)dst->data; for(i=0;i<face->count;i++) { float v1[3]={v[pos],v[pos+1],v[pos+2]}; float v2[3]={v[pos+3],v[pos+4],v[pos+5]}; float v3[3]={v[pos+6],v[pos+7],v[pos+8]}; float result[3]; calc_normals(v1,v2,v3,result); int k; for(k=0;k<4;k++) { d[_pos+0]=result[0]; d[_pos+1]=result[1]; d[_pos+2]=result[2]; _pos+=3; } pos+=12; // 4 vertices } }
void lemuria_tentacle_update(lemuria_tentacle_t * t) { t->phase += t->frequency; if(t->phase > 2.0 * M_PI) t->phase -= 2.0 * M_PI; calc_coords(t); calc_normals(t); }
void vlst_normal_4f_direct(t_vlst *dst,t_vlst *vertex,t_vlst *quads) { int i,n,j; float vectors[3*4]; int *q=quads->data; float *v=vertex->data; float *normal=dst->data; // calc normals j=0; for(i=0;i<quads->count;i++) { for(n=0;n<4;n++) { vectors[(n*3)+0]=v[(q[j]*3)]; vectors[(n*3)+1]=v[(q[j]*3)+1]; vectors[(n*3)+2]=v[(q[j]*3)+2]; j++; } calc_normals(vectors,vectors+3,vectors+6,normal+(i*3)); } }